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 ) Client.connect 의 metadata 옵션은 연결을 설정 한 직후 임의의 핸드 셰이크 데이터를 보내는 데 사용됩니다. 새 연결이 설정되면 원격 클라이언트는 원격 클라이언트의 메시지를 구독하지 않고 연결 객체의 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 옵션을 가져옵니다. 이러한 옵션은 변하지 않고 안정적인 데이터 채널을 활성화하는 데 사용될 수 있습니다.
Websockets는 신호 전달로 사용됩니다. 이 소켓은 Datachannel이 설정된 후 개방 된 상태로 유지됩니다. web-udp 연결을 종료하기 위해 닫기 이벤트 (예 : 브라우저 탭이 닫히는 경우). 연결 타임 아웃이있는 호스트의 경우 소켓을 열어두기 위해 keepalive 신호가 주기적으로 전송됩니다. KeepAlive 신호가 전송되는 기간은 서버의 keepAlivePeriod 옵션을 통해 구성 할 수 있습니다.
저작권 2023 Eric McDaniel
이에 따라이 소프트웨어 및 관련 문서 파일 ( "소프트웨어")의 사본을 얻는 사람에게는 허가가 부여됩니다. 소프트웨어의 사용, 복사, 수정, 합병, 배포, 배포, 숭고 및/또는 소프트웨어의 사본을 판매 할 권한을 포함하여 제한없이 소프트웨어를 처리 할 수 있도록 소프트웨어를 제공 할 권한이 없습니다.
위의 저작권 통지 및이 권한 통지는 소프트웨어의 모든 사본 또는 실질적인 부분에 포함되어야합니다.
이 소프트웨어는 상업성, 특정 목적에 대한 적합성 및 비 침해에 대한 보증을 포함하여 명시 적 또는 묵시적 보증없이 "그대로"제공됩니다. 어떠한 경우에도 저자 또는 저작권 보유자는 계약, 불법 행위 또는 기타, 소프트웨어 또는 소프트웨어의 사용 또는 기타 거래에서 발생하는 계약, 불법 행위 또는 기타의 행동에 관계없이 청구, 손해 또는 기타 책임에 대해 책임을지지 않습니다.