Web-UDP-это библиотека, используемая для создания ненадежных каналов данных в средах узлов/браузеров. Ключевая цель этого проекта по предоставлению небольшого стабильного API, который каждый может использовать для работы с данными в реальном времени в Интернете.
Библиотека в настоящее время реализована как абстракция на вершине неупорядоченных и ненадежных RTCDatachannels. Поскольку WEBRTC является зависимостью, в пакет включен сервер сигнализации на основе WebSocket, чтобы облегчить соединения между клиентами. Подключения клиента/сервера доступны с помощью пакета WRTC.
Signal < T > . subscribe ( subscriber : T => any )
Signal < T > . unsubscribe ( subscriber : T => any )
Client ( options ?: { url ?: string } )
Client . connect ( to ?: string = "__MASTER__" , options ?: {
binaryType ?: "arraybuffer" | "blob" ,
maxRetransmits ?: number ,
maxPacketLifeTime ?: number ,
metadata ?: any ,
UNSAFE_ordered ?: boolean
} ) : Promise < Connection >
Client . route ( ) : Promise < string >
Client . connections : Signal < Connection >
Connection . send ( message : any ) : void
Connection . close ( ) : void
Connection . closed : Signal
Connection . errors : Signal < { err : string } >
Connection . messages : Signal < any >
Connection . metadata : any
// Node
Server ( { server : http . Server , keepAlivePeriod ?: number = 30000 } )
Server . client ( ) : Client
Server . connections : Signal < Connection > npm i @web-udp/client
npm i @web-udp/serverНиже приведен простой пример сервера пинга:
// client.js
import { Client } from "@web-udp/client"
async function main ( ) {
const udp = new Client ( )
const connection = await udp . connect ( )
connection . send ( "ping" )
connection . messages . subscribe ( console . log )
} // server.js
const server = require ( "http" ) . createServer ( )
const { Server } = require ( "@web-udp/server" )
const udp = new Server ( { server } )
udp . connections . subscribe ( connection => {
connection . messages . subscribe ( message => {
if ( message === "ping" ) {
connection . send ( "pong" )
}
} )
connection . closed . subscribe ( ( ) => console . log ( "A connection closed." ) )
connection . errors . subscribe ( err => console . log ( err ) )
} )
server . listen ( 8000 ) Опция metadata в Client.connect используется для отправки произвольных данных рукопожатия сразу после установления соединения. Когда установлено новое соединение, удаленный клиент может получить доступ к этим данным на свойстве metadata объекта соединения без необходимости подписываться на сообщения удаленного клиента. Метаданные рукопожатия передаются через безопасный RTCDataChannel , что делает его хорошим кандидатом для конфиденциальных данных, таких как пароли.
В приведенном ниже примере сервер обрабатывает аутентификацию перед подпиской на сообщения клиента:
// client.js
const connection = await udp . connect ( {
metadata : {
credentials : {
username : "foo" ,
password : "bar" ,
} ,
} ,
} ) // server.js
udp . connections . subscribe ( connection => {
let user
try {
user = await fakeAuth . login ( connection . metadata . credentials )
} catch ( err ) {
// Authentication failed, close connection immediately.
connection . send ( fakeProtocol . loginFailure ( ) )
connection . close ( )
return
}
// The user authenticated successfully.
connection . send ( fakeProtocol . loginSuccess ( user ) )
connection . messages . subscribe ( ... )
} ) web-udp также поддерживает одноранговую связь. Пример ниже демонстрирует двух клиентов, подключенных на одной и той же вкладке браузера:
<!-- index.html -->
< script src =" /node_modules/@web-udp/client/dist/index.js " > </ script >
< script src =" client.js " > </ script > // client.js
async function main ( ) {
const left = new Udp . Client ( )
const right = new Udp . Client ( )
const route = await left . route ( )
const connection = await right . connect ( route )
left . connections . subscribe ( connection =>
connection . messages . subscribe ( console . log ) ,
)
connection . send ( "HELLO" )
} // server.js
const server = require ( "http" ) . createServer ( )
const { Server } = require ( "@web-udp/server" )
Server ( { server } )
server . listen ( 8000 ) Client.connect необязательно принимает варианты rtcdatachannel maxPacketLifeTime и maxRetransmits . Эти параметры можно использовать для включения неупорядоченного и надежного канала данных.
Веб -питания используются в качестве сигнального транспорта. Этот сокет остается открытым после установки DataChancel для пересылки его события Close (например, когда вкладка браузера закрыта), чтобы прекратить подвесные подключения web-udp . Сигнал Keepalive периодически отправляется для того, чтобы поддерживать разъяснение в случае хостов с тайм -аутами подключения. Период, в который отправляется сигнал KeepAlive, может быть настроен с помощью опции сервера keepAlivePeriod .
Copyright 2023 Эрик МакДэниел
Настоящим дается разрешение, бесплатно, любому лицу, получающему копию этого программного обеспечения и связанные с ними файлы документации («Программное обеспечение»), чтобы иметь дело в программном обеспечении без ограничений, включая, без ограничения, права на использование, копирование, изменение, объединение, публикацию, распределение, сублиценность и/или продавать копии программного обеспечения и разрешения лиц, на которые программное обеспечение подходит для того, чтобы поступить так, чтобы поступить на следующие условия: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: к следующим условиям: на следующие условия: к следующим условиям: на следующие условия: на следующие условия.
Вышеуказанное уведомление об авторском праве и это уведомление о разрешении должно быть включено во все копии или существенные части программного обеспечения.
Программное обеспечение предоставляется «как есть», без гарантии любого рода, явного или подразумеваемого, включая, помимо прочего, гарантии товарной пригодности, пригодности для определенной цели и несоответствия. Ни в коем случае авторы или владельцы авторских прав не будут нести ответственность за любые претензии, убытки или другую ответственность, будь то в действии контракта, деликт или иным образом, возникающие из или в связи с программным обеспечением или использованием или другими сделками в программном обеспечении.