تشغيل خوادم الويب في متصفحات الويب عبر WebRTC
يمكّن Smoke المتصفحات من تشغيل خوادم الويب الصغيرة عبر WebRTC
import { Network } from '@sinclair/smoke'
// ------------------------------------------------------------------
//
// Create a Virtual Network
//
// ------------------------------------------------------------------
const { Http } = new Network ( )
// ------------------------------------------------------------------
//
// Create a Http Listener on a Virtual Port
//
// ------------------------------------------------------------------
Http . listen ( { port : 5000 } , request => new Response ( 'hello webrtc' ) )
// ------------------------------------------------------------------
//
// Fetch data over WebRTC
//
// ------------------------------------------------------------------
const text = Http . fetch ( 'http://localhost:5000' ) . then ( r => r . text ( ) )
$ npm install @sinclair/smoke
Smoke عبارة عن إطار عمل تجريبي لشبكات المتصفح والتخزين يوفر محاكاة Http وTcp وWebSocket عبر WebRTC وتخزين الملفات الكبيرة عبر IndexedDB. تم تصميمه كأساس لتطوير خدمات الويب من نظير إلى نظير في المتصفح مع إمكانية الوصول إلى كل متصفح عبر شبكة افتراضية يتم التحكم فيها بواسطة التطبيق.
يعيد Smoke تشكيل WebRTC إلى واجهات متوافقة مع WinterCG، مما يتيح جعل تطبيقات خادم الويب التقليدية قابلة للنقل بين بيئات الخادم والمتصفح. تم تطويره لدعم بنيات البرامج البديلة حيث يمكن نقل الخدمات التي تركز على المستخدم بعيدًا عن السحابة وتشغيلها من نظير إلى نظير في المتصفح.
ترخيص معهد ماساتشوستس للتكنولوجيا
يتم توفير واجهات برمجة تطبيقات شبكة الدخان عن طريق كائنات الشبكة. يمثل كائن الشبكة اتصالاً نشطًا بمركز الإشارات المشترك ويكشف عن وظائف Http وNet وMedia المستخدمة للتواصل مع كائنات الشبكة الأخرى المتصلة بنفس Hub.
import { Network , Hubs } from '@sinclair/smoke'
const { Http , Net , Media , Hub } = new Network ( { hub : new Hubs . Private ( ) } )
const address = await Hub . address ( ) // The address of this Network object.
المحور الخاص عبارة عن مرحل في الذاكرة يقوم بإعادة توجيه رسائل WebRTC ICE عن طريق واجهة برمجة تطبيقات BroadcastChannel الخاصة بالمتصفح. يمكن للمركز الخاص فقط ترحيل الرسائل إلى الصفحة وعلامات التبويب الأخرى التي تعمل ضمن عملية المتصفح نفسها. ونظرًا لأن المحاور الخاصة لا يمكنها تسهيل الاتصالات التي تتم خارج الصفحة الحالية، فإنها تعتبر خاصة. هذا المحور هو الافتراضي.
import { Network , Hubs } from '@sinclair/smoke'
const { Http } = new Network ( { hub : new Hubs . Private ( ) } )
تنفيذ هذا المركز معلق حاليًا.
import { Network , Hubs } from '@sinclair/smoke'
const { Http } = new Network ( { hub : new Hubs . Public ( 'ws://server/hub' ) } )
تدعم واجهة برمجة تطبيقات Http الاستماع والجلب عبر WebRTC. كما يوفر مضاهاة WebSocket.
const { Http } = new Network ( )
استخدم وظيفة الاستماع لتلقي طلبات Http من أقرانهم البعيدين.
Http . listen ( { port : 5000 } , request => new Response ( 'hello' ) )
استخدم وظيفة الجلب لتقديم طلب Http إلى أقرانهم البعيدين.
const response = await Http . fetch ( 'http://localhost:5000' )
const message = await response . text ( )
استخدم وظيفة الترقية لتحويل طلب Http إلى WebSocket
Http . listen ( { port : 5000 } , request => Http . upgrade ( request , ( socket ) => socket . send ( 'hello' ) ) )
استخدم وظيفة الاتصال للاتصال بخادم WebSocket البعيد.
const socket = await Http . connect ( 'ws://localhost:5000' )
socket . on ( 'message' , ( event ) => console . log ( event . data ) )
socket . on ( 'error' , ( event ) => console . log ( event ) )
socket . on ( 'close' , ( event ) => console . log ( event ) )
يوفر Net API محاكاة Tcp عبر RTCDataChannel
const { Net } = new Network ( )
استخدم وظيفة الاستماع لقبول مأخذ توصيل وارد.
Net . listen ( { port : 5000 } , async socket => {
const data = await socket . read ( )
await socket . write ( data )
await socket . close ( )
} )
استخدم وظيفة الاتصال لتأسيس اتصال Net بمستمع بعيد.
const socket = await Net . connect ( { hostname : 'localhost' , port : 5000 } )
await socket . write ( new Uint8Array ( 1000 ) )
const data = await socket . read ( ) // Uint8Array()
const end = await socket . read ( ) // null
توفر واجهة برمجة تطبيقات الوسائط وظيفة لإرسال واستقبال كائنات MediaStream عبر WebRTC.
const { Media } = new Network ( )
استخدم وظيفة الاستماع للاستماع إلى كائنات MediaStream الواردة
Media . listen ( { port : 6000 } , ( receiver ) => {
const video = document . createElement ( 'video' )
video . srcObject = receiver . mediastream
video . play ( )
document . body . appendChild ( video )
receiver . on ( 'close' , ( ) => document . removeChild ( video ) )
} )
استخدم وظيفة الإرسال لإرسال MediaStream إلى المستمع
const sender = await Media . send ( { hostname : 'localhost' , port : 6000 } , new MediaStream ( [ ... ] ) )
sender . close ( ) // stop sending live media
استخدم وظيفة الصوت لإنشاء مصدر صوتي قابل للبث.
const audio = Media . audio ( { src : './audio.mp3' } )
const sender = Media . send ( { hostname : 'localhost' , port : 6000 } , audio . mediastream )
استخدم وظيفة الفيديو لإنشاء VideoSource قابل للبث.
const video = Media . video ( { src : './video.mp4' } )
const sender = Media . send ( { hostname : 'localhost' , port : 6000 } , video . mediastream )
استخدم وظيفة النمط لإنشاء نمط اختبار MediaStream. يمكن أن تكون هذه الوظيفة مفيدة لاختبار البث المباشر للوسائط بدون كاميرات الويب أو مصادر الوسائط الأخرى.
const pattern = Media . pattern ( )
const sender = Media . send ( { port : 5000 } , pattern . mediastream )
يوفر Smoke نظام ملفات هرميًا قادرًا على تخزين الملفات الكبيرة داخل المتصفح. يتم دعم نظام الملفات بواسطة IndexedDB ويدعم تدفق القراءة والكتابة وتعداد الدليل والنسخ والنقل وإعادة التسمية بالإضافة إلى أحداث مراقبة الملفات والدليل. لقد تم تصميمه ليكون بمثابة مخزن ملفات ثابت لخدمات الشبكة ولكن يمكن استخدامه كنظام ملفات للأغراض العامة للتطبيقات التي تحتاج إلى تخزين ملفات كبيرة في المتصفح.
استخدم الوظيفة المفتوحة لفتح نظام ملفات باسم قاعدة البيانات المحدد. إذا كانت قاعدة البيانات غير موجودة يتم إنشاؤها.
import { FileSystem } from '@sinclair/smoke'
const Fs = await FileSystem . open ( '<database-name>' )
استخدم الدالة stat لإرجاع معلومات حول ملف أو دليل.
const stat = await Fs . write ( '/path/file.txt' )
استخدم الدالة الموجودة للتحقق من وجود المسار.
const exists = await Fs . exists ( '/path/file.txt' )
استخدم الدالة mkdir لإنشاء دليل.
await Fs . mkdir ( '/media/videos' )
استخدم الدالة readdir لإرجاع كائنات stat لمسار الدليل المحدد.
const stats = await Fs . readdir ( '/media/videos' )
استخدم الدالة blob لإرجاع كائن Blob إلى مسار الملف.
const blob = await Fs . readdir ( '/video.mp4' )
const url = URL . createObjectUrl ( blob )
استخدم وظائف الكتابة والكتابة النصية لكتابة محتوى الملف.
await Fs . write ( '/path/file.dat' , new Uint8Array ( [ 1 , 2 , 3 , 4 ] ) )
await Fs . writeText ( '/path/file.txt' , 'hello world' )
استخدم وظائف القراءة وقراءة النص لقراءة المحتوى من الملف.
const buffer = await fs . read ( '/path/file.dat' )
const content = await Fs . readText ( '/path/file.txt' )
استخدم وظيفة الحذف لحذف ملف أو دليل.
await Fs . delete ( '/path/file.txt' )
استخدم وظيفة إعادة التسمية لإعادة تسمية ملف أو دليل.
await Fs . writeText ( '/path/fileA.txt' , '...' )
await Fs . rename ( '/path/fileA.txt' , 'fileB.txt' )
استخدم وظيفة النسخ لنسخ ملف أو دليل إلى الدليل الهدف.
await Fs . writeText ( '/path/fileA.txt' , '...' )
await Fs . copy ( '/path/fileA.txt' , '/backup' )
استخدم وظيفة النقل لنقل ملف أو دليل إلى الدليل الهدف.
await Fs . writeText ( '/path/fileA.txt' , '...' )
await Fs . move ( '/path/fileA.txt' , '/backup' )
استخدم وظيفة المراقبة لمشاهدة أحداث الملف والدليل.
Fs . watch ( '/dir' , event => console . log ( event ) )
الدخان مفتوح لمساهمة المجتمع. يرجى التأكد من إرسال مشكلة مفتوحة قبل تقديم طلب السحب الخاص بك. يفضل مشروع Smoke مناقشة المجتمع المفتوحة قبل قبول الميزات الجديدة.