Web-ODP هي مكتبة تستخدم لإنشاء قنوات بيانات غير موثوقة في بيئات العقدة/المتصفح. الهدف الرئيسي لهذا المشروع لتوفير واجهة برمجة تطبيقات صغيرة ومستقرة يمكن لأي شخص استخدامها للعمل مع بيانات في الوقت الفعلي على الويب.
يتم تنفيذ المكتبة حاليًا باعتبارها تجريدًا على قناة 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 لكائن الاتصال دون الاضطرار إلى الاشتراك في رسائل العميل عن بُعد. يتم نقل بيانات تعريف المصافحة عبر 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 إريك ماكدانييل
يتم منح الإذن بموجب هذا ، مجانًا ، لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة به ("البرنامج") ، للتعامل في البرنامج دون تقييد ، بما في ذلك على سبيل المثال لا الحصر حقوق استخدام الأشخاص ونسخها ودمجها ودمجها وتوزيعها وتوزيعها على ما يلي:
يجب إدراج إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو" ، دون أي ضمان من أي نوع ، صريح أو ضمني ، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق واللياقة لغرض معين وعدم الانفجار. لا يجوز بأي حال من الأحوال أن يكون المؤلفون أو حاملي حقوق الطبع والنشر مسؤولاً عن أي مطالبة أو أضرار أو مسؤولية أخرى ، سواء في إجراء عقد أو ضرر أو غير ذلك ، ناشئة عن أو خارج البرنامج أو الاستخدام أو غيرها من المعاملات في البرنامج.