O Web-AUDP é uma biblioteca usada para estabelecer canais de dados não confiáveis em ambientes de nó/navegador. O objetivo principal deste projeto para fornecer uma API pequena e estável que qualquer um pode usar para trabalhar com dados em tempo real na Web.
Atualmente, a biblioteca é implementada como uma abstração, além de rtcdatachannels não ordenados e não confiáveis. Como o WebRTC é uma dependência, um servidor de sinalização baseado no WebSocket está incluído no pacote para facilitar as conexões entre os clientes. As conexões do cliente/servidor estão disponíveis com a ajuda do pacote 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/serverAbaixo está um exemplo simples de um servidor de ping:
// 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 ) A opção metadata em Client.connect é usada para enviar dados arbitrários de handshake imediatamente após o estabelecimento de uma conexão. Quando uma nova conexão é estabelecida, o cliente remoto pode acessar esses dados na propriedade de metadata do objeto de conexão sem precisar se inscrever nas mensagens do cliente remoto. Os metadados do handshake são transmitidos por um RTCDataChannel seguro, tornando -o um bom candidato a dados confidenciais, como senhas.
No exemplo abaixo, um servidor lida com a autenticação antes de assinar as mensagens do cliente:
// 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 também suporta a comunicação ponto a ponto. O exemplo abaixo demonstra dois clientes conectados na mesma guia do navegador:
<!-- 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 toma opcionalmente as opções rtcdatachannel maxPacketLifeTime e maxRetransmits . Essas opções podem ser usadas para ativar um canal de dados não ordenado e confiável.
Os websockets são usados como transporte de sinalização. Este soquete é mantido aberto após o estabelecimento do datachannel para encaminhar seu evento próximo (por exemplo, quando uma guia Browser é fechada) para encerrar as conexões suspensas web-udp . Um sinal de manutenção é enviado periodicamente para manter o soquete aberto no caso de hosts com tempo limite de conexão. O período em que o sinal Keepalive é enviado pode ser configurado através da opção keepAlivePeriod do servidor.
Copyright 2023 Eric McDaniel
A permissão é concedida, gratuita, a qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o "software"), para lidar com o software sem restrição, inclusive sem limitação os direitos de usar, copiar, modificar, mesclar, publicar, distribuir, mobilizar o software e/ou vender cópias do software e permitir que as pessoas a quem
O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou em partes substanciais do software.
O software é fornecido "como está", sem garantia de qualquer tipo, expresso ou implícito, incluindo, entre outros, as garantias de comercialização, aptidão para uma finalidade específica e não innoculação. Em nenhum caso os autores ou detentores de direitos autorais serão responsáveis por qualquer reclamação, danos ou outro passivo, seja em uma ação de contrato, delito ou não, decorrente de, fora ou em conexão com o software ou o uso ou outras negociações no software.