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ด้านล่างเป็นตัวอย่างง่ายๆของเซิร์ฟเวอร์ 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 ) ตัวเลือก metadata ใน Client.connect ใช้เพื่อส่งข้อมูลการจับมือกันโดยพลการทันทีหลังจากสร้างการเชื่อมต่อ เมื่อมีการสร้างการเชื่อมต่อใหม่ไคลเอนต์ระยะไกลสามารถเข้าถึงข้อมูลนี้ในคุณสมบัติ metadata ของวัตถุการเชื่อมต่อโดยไม่ต้องสมัครสมาชิกข้อความของไคลเอนต์ระยะไกล ข้อมูลเมตาของ Handshake ถูกส่งผ่าน 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 ยังรองรับการสื่อสารแบบ peer-to-peer ตัวอย่างด้านล่างแสดงให้เห็นถึงไคลเอนต์สองตัวที่เชื่อมต่อในแท็บเบราว์เซอร์เดียวกัน:
<!-- 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 สามารถกำหนดค่าได้ผ่านตัวเลือกของ Server keepAlivePeriod
ลิขสิทธิ์ 2023 Eric McDaniel
ได้รับอนุญาตโดยไม่ต้องเสียค่าใช้จ่ายสำหรับบุคคลใด ๆ ที่ได้รับสำเนาซอฟต์แวร์นี้และไฟล์เอกสารที่เกี่ยวข้อง ("ซอฟต์แวร์") เพื่อจัดการในซอฟต์แวร์โดยไม่มีการ จำกัด รวมถึง แต่ไม่ จำกัด เฉพาะสิทธิ์ในการใช้สำเนาดัดแปลงผสานเผยแพร่เผยแพร่
ประกาศลิขสิทธิ์ข้างต้นและประกาศการอนุญาตนี้จะรวมอยู่ในสำเนาทั้งหมดหรือส่วนสำคัญของซอฟต์แวร์
ซอฟต์แวร์มีให้ "ตามสภาพ" โดยไม่มีการรับประกันใด ๆ ไม่ว่าโดยชัดแจ้งหรือโดยนัยรวมถึง แต่ไม่ จำกัด เฉพาะการรับประกันความสามารถในการค้าการออกกำลังกายสำหรับวัตถุประสงค์เฉพาะและการไม่เข้าร่วม ไม่ว่าในกรณีใดผู้เขียนหรือผู้ถือลิขสิทธิ์จะต้องรับผิดชอบต่อการเรียกร้องความเสียหายหรือความรับผิดอื่น ๆ ไม่ว่าจะเป็นการกระทำของสัญญาการละเมิดหรืออื่น ๆ ที่เกิดขึ้นจากหรือเกี่ยวข้องกับซอฟต์แวร์หรือการใช้งานหรือการติดต่ออื่น ๆ ในซอฟต์แวร์