Web-UDP adalah perpustakaan yang digunakan untuk membuat saluran data yang tidak dapat diandalkan di lingkungan simpul/browser. Tujuan utama dari proyek ini untuk menyediakan API kecil yang stabil yang dapat digunakan siapa pun untuk bekerja dengan data real-time di web.
Perpustakaan saat ini diimplementasikan sebagai abstraksi di atas RTCDataChannels yang tidak berurutan dan tidak dapat diandalkan. Karena WEBRTC adalah ketergantungan, server pensinyalan berbasis WebSocket disertakan dengan paket untuk memfasilitasi koneksi antara klien. Koneksi klien/server tersedia dengan bantuan paket 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/serverDi bawah ini adalah contoh sederhana dari 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 ) Opsi metadata di Client.connect digunakan untuk mengirim data jabat tangan sewenang -wenang segera setelah membuat koneksi. Ketika koneksi baru dibuat, klien jarak jauh dapat mengakses data ini pada properti metadata objek koneksi tanpa harus berlangganan pesan klien jarak jauh. Metadata Handshake ditransmisikan melalui RTCDataChannel yang aman, menjadikannya kandidat yang baik untuk data sensitif seperti kata sandi.
Dalam contoh di bawah ini, server menangani otentikasi sebelum berlangganan pesan klien:
// 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 juga mendukung komunikasi peer-to-peer. Contoh di bawah ini menunjukkan dua klien yang terhubung di tab browser yang sama:
<!-- 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 secara opsional mengambil opsi RTCDataChannel maxPacketLifeTime dan maxRetransmits . Opsi -opsi ini dapat digunakan untuk mengaktifkan saluran data yang tidak teratur dan andal.
Websockets digunakan sebagai transportasi pensinyalan. Soket ini tetap terbuka setelah Datachannel didirikan untuk meneruskan acara dekatnya (misalnya ketika tab browser ditutup) untuk mengakhiri koneksi web-udp yang menggantung. Sinyal Keepalive dikirim secara berkala untuk menjaga soket terbuka dalam kasus host dengan batas waktu koneksi. Periode di mana sinyal KeepAlive dikirim dapat dikonfigurasi melalui opsi keepAlivePeriod server.
Hak Cipta 2023 Eric McDaniel
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus dimasukkan dalam semua salinan atau bagian substansial dari perangkat lunak.
Perangkat lunak ini disediakan "sebagaimana adanya", tanpa jaminan apa pun, tersurat maupun tersirat, termasuk tetapi tidak terbatas pada jaminan dapat diperjualbelikan, kebugaran untuk tujuan tertentu dan nonpringement. Dalam hal apa pun penulis atau pemegang hak cipta tidak akan bertanggung jawab atas klaim, kerusakan atau tanggung jawab lainnya, baik dalam tindakan kontrak, gugatan atau sebaliknya, timbul dari, di luar atau sehubungan dengan perangkat lunak atau penggunaan atau transaksi lain dalam perangkat lunak.