Web-UDP ist eine Bibliothek, mit der unzuverlässige Datenkanäle in Knoten-/Browser-Umgebungen festgelegt werden. Das wichtigste Ziel dieses Projekts, eine kleine, stabile API bereitzustellen, mit der jeder mit Echtzeitdaten im Web arbeiten kann.
Die Bibliothek wird derzeit als Abstraktion über nicht ordnungsgemäße und unzuverlässige RTCDatachannels implementiert. Da WEBRTC eine Abhängigkeit ist, ist ein WebSocket -basierter Signalserver mit dem Paket enthalten, um Verbindungen zwischen Clients zu erleichtern. Client/Server -Verbindungen sind mit Hilfe des WRTC -Pakets verfügbar.
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/serverUnten finden Sie ein einfaches Beispiel für einen Pingserver:
// 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 ) Die metadata in Client.connect wird verwendet, um willkürliche Handshake -Daten unmittelbar nach der Erstellung einer Verbindung zu senden. Wenn eine neue Verbindung hergestellt wird, kann der Remote -Client auf diese Daten auf der metadata des Verbindungsobjekts zugreifen, ohne die Nachrichten des Remote -Clients abonnieren zu müssen. Handshake -Metadaten werden über ein sicheres RTCDataChannel übertragen, was es zu einem guten Kandidaten für sensible Daten wie Passwörter macht.
Im folgenden Beispiel übernimmt ein Server die Authentifizierung, bevor er die Nachrichten des Clients abonniert:
// 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 unterstützt auch die Peer-to-Peer-Kommunikation. Das folgende Beispiel zeigt zwei Clients, die auf der gleichen Browser -Registerkarte verbunden sind:
<!-- 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 nimmt optional die Optionen RTCDatachannel maxPacketLifeTime und maxRetransmits ein. Diese Optionen können verwendet werden, um einen ungeordneten und zuverlässigen Datenkanal zu ermöglichen.
Websockets werden als Signaltransport verwendet. Dieser Socket wird geöffnet, nachdem der Data-ANDEL festgelegt wurde, um das enge Ereignis (z. B. wenn eine Browser-Registerkarte geschlossen ist) weiterzuleiten, um hängende web-udp -Verbindungen zu beenden. Ein Keepalive -Signal wird regelmäßig gesendet, um den Socket bei Hosts mit Verbindungszeitüberschreitungen offen zu halten. Der Zeitraum, in dem das Keepalive -Signal gesendet wird, kann über die Option keepAlivePeriod des Servers konfiguriert werden.
Copyright 2023 Eric McDaniel
Die Erlaubnis wird hiermit einer Person, die eine Kopie dieser Software und zugehörigen Dokumentationsdateien (der "Software") erhält, kostenlos erteilt, um die Software ohne Einschränkung zu behandeln, einschließlich ohne Einschränkung der Rechte, zu verwenden, zu kopieren, zu modifizieren, zusammenzufassen, zu veröffentlichen, zu veröffentlichen, zu verteilen, zu verteilt, und/oder Kopien der Software zu ermöglichen, um Personen zu beanstanden, an denen die Software zugänglich ist, um die folgenden Bedingungen zu beantragen.
Die oben genannte Copyright -Mitteilung und diese Erlaubnisbekanntmachung müssen in alle Kopien oder wesentlichen Teile der Software enthalten sein.
Die Software wird "wie es ist" ohne Garantie jeglicher Art, ausdrücklich oder stillschweigend bereitgestellt, einschließlich, aber nicht beschränkt auf die Gewährleistung der Handelsfähigkeit, die Eignung für einen bestimmten Zweck und die Nichtverletzung. In keinem Fall sind die Autoren oder Urheberrechtsinhaber für Ansprüche, Schäden oder andere Haftungen haftbar, sei es in einer Vertragsklage, unerbittlich oder auf andere Weise, die sich aus oder im Zusammenhang mit der Software oder anderen Geschäften in der Software ergeben.