Jalankan Server Web di Browser Web melalui WebRTC
Asap memungkinkan Browser menjalankan Server Web mikro melalui 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 adalah jaringan browser eksperimental dan kerangka penyimpanan yang menyediakan emulasi Http, Tcp dan WebSocket melalui WebRTC dan penyimpanan file besar melalui IndexedDB. Ini dibangun sebagai landasan untuk mengembangkan layanan web peer to peer di browser dengan setiap browser dapat diakses melalui jaringan virtual yang dikontrol aplikasi.
Smoke membentuk ulang WebRTC menjadi antarmuka yang kompatibel dengan WinterCG yang memungkinkan aplikasi server web tradisional dibuat portabel antara lingkungan server dan browser. Ini dikembangkan untuk mendukung arsitektur perangkat lunak alternatif di mana layanan yang berpusat pada pengguna dapat dipindahkan dari cloud dan dijalankan secara peer to peer di browser.
Lisensi MIT
API jaringan asap disediakan melalui objek Jaringan. Objek Jaringan mewakili koneksi aktif ke Hub sinyal bersama dan memperlihatkan fungsionalitas Http, Net, dan Media yang digunakan untuk berkomunikasi dengan objek Jaringan lain yang terhubung ke Hub yang sama.
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.
Hub Pribadi adalah relai dalam memori yang meneruskan pesan ICE WebRTC melalui API BroadcastChannel browser. Hub pribadi hanya dapat menyampaikan pesan ke halaman dan tab lain yang berjalan dalam proses browser yang sama. Karena hub pribadi tidak dapat memfasilitasi koneksi yang dibuat di luar halaman saat ini, maka dianggap pribadi. Hub ini adalah defaultnya.
import { Network , Hubs } from '@sinclair/smoke'
const { Http } = new Network ( { hub : new Hubs . Private ( ) } )
Implementasi hub ini masih tertunda.
import { Network , Hubs } from '@sinclair/smoke'
const { Http } = new Network ( { hub : new Hubs . Public ( 'ws://server/hub' ) } )
Http API mendukung Http mendengarkan dan mengambil melalui WebRTC. Ini juga menyediakan emulasi WebSocket.
const { Http } = new Network ( )
Gunakan fungsi mendengarkan untuk menerima permintaan Http dari rekan jarak jauh.
Http . listen ( { port : 5000 } , request => new Response ( 'hello' ) )
Gunakan fungsi ambil untuk membuat permintaan Http ke rekan jarak jauh.
const response = await Http . fetch ( 'http://localhost:5000' )
const message = await response . text ( )
Gunakan fungsi pemutakhiran untuk mengubah permintaan Http menjadi WebSocket
Http . listen ( { port : 5000 } , request => Http . upgrade ( request , ( socket ) => socket . send ( 'hello' ) ) )
Gunakan fungsi koneksi untuk menyambung ke server WebSocket jarak jauh.
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 menyediakan emulasi Tcp melalui RTCDataChannel
const { Net } = new Network ( )
Gunakan fungsi mendengarkan untuk menerima soket masuk.
Net . listen ( { port : 5000 } , async socket => {
const data = await socket . read ( )
await socket . write ( data )
await socket . close ( )
} )
Gunakan fungsi koneksi untuk membuat koneksi Net ke pendengar jarak jauh.
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
Media API menyediakan fungsionalitas untuk mengirim dan menerima objek MediaStream melalui WebRTC.
const { Media } = new Network ( )
Gunakan fungsi mendengarkan untuk mendengarkan objek MediaStream yang masuk
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 ) )
} )
Gunakan fungsi kirim untuk mengirim MediaStream ke pendengar
const sender = await Media . send ( { hostname : 'localhost' , port : 6000 } , new MediaStream ( [ ... ] ) )
sender . close ( ) // stop sending live media
Gunakan fungsi audio untuk membuat AudioSource yang dapat dialirkan.
const audio = Media . audio ( { src : './audio.mp3' } )
const sender = Media . send ( { hostname : 'localhost' , port : 6000 } , audio . mediastream )
Gunakan fungsi video untuk membuat VideoSource yang dapat dialirkan.
const video = Media . video ( { src : './video.mp4' } )
const sender = Media . send ( { hostname : 'localhost' , port : 6000 } , video . mediastream )
Gunakan fungsi pola untuk menghasilkan pola pengujian MediaStream. Fungsi ini berguna untuk menguji streaming media langsung tanpa kamera web atau sumber media lainnya.
const pattern = Media . pattern ( )
const sender = Media . send ( { port : 5000 } , pattern . mediastream )
Smoke menyediakan sistem file hierarki yang mampu menyimpan file besar di dalam browser. Sistem file didukung oleh IndexedDB dan memiliki dukungan untuk streaming baca dan tulis, enumerasi direktori, salin, pindahkan, ganti nama serta acara pengamatan file dan direktori. Ini dirancang untuk bertindak sebagai penyimpanan file statis untuk layanan jaringan tetapi dapat digunakan sebagai sistem file tujuan umum untuk aplikasi yang perlu menyimpan file besar di browser.
Gunakan fungsi buka untuk membuka sistem file dengan nama database yang diberikan. Jika database tidak ada maka database akan dibuat.
import { FileSystem } from '@sinclair/smoke'
const Fs = await FileSystem . open ( '<database-name>' )
Gunakan fungsi stat untuk mengembalikan informasi tentang file atau direktori.
const stat = await Fs . write ( '/path/file.txt' )
Gunakan fungsi yang ada untuk memeriksa keberadaan jalur.
const exists = await Fs . exists ( '/path/file.txt' )
Gunakan fungsi mkdir untuk membuat direktori.
await Fs . mkdir ( '/media/videos' )
Gunakan fungsi readdir untuk mengembalikan objek stat untuk jalur direktori tertentu.
const stats = await Fs . readdir ( '/media/videos' )
Gunakan fungsi blob untuk mengembalikan objek Blob ke jalur file.
const blob = await Fs . readdir ( '/video.mp4' )
const url = URL . createObjectUrl ( blob )
Gunakan fungsi write dan writeText untuk menulis konten file.
await Fs . write ( '/path/file.dat' , new Uint8Array ( [ 1 , 2 , 3 , 4 ] ) )
await Fs . writeText ( '/path/file.txt' , 'hello world' )
Gunakan fungsi read dan readText akan membaca konten dari file.
const buffer = await fs . read ( '/path/file.dat' )
const content = await Fs . readText ( '/path/file.txt' )
Gunakan fungsi hapus untuk menghapus file atau direktori.
await Fs . delete ( '/path/file.txt' )
Gunakan fungsi rename untuk mengganti nama file atau direktori.
await Fs . writeText ( '/path/fileA.txt' , '...' )
await Fs . rename ( '/path/fileA.txt' , 'fileB.txt' )
Gunakan fungsi salin untuk menyalin file atau direktori ke direktori target.
await Fs . writeText ( '/path/fileA.txt' , '...' )
await Fs . copy ( '/path/fileA.txt' , '/backup' )
Gunakan fungsi pindah untuk memindahkan file atau direktori ke direktori target.
await Fs . writeText ( '/path/fileA.txt' , '...' )
await Fs . move ( '/path/fileA.txt' , '/backup' )
Gunakan fungsi jam tangan untuk melihat acara file dan direktori.
Fs . watch ( '/dir' , event => console . log ( event ) )
Asap terbuka untuk kontribusi masyarakat. Harap pastikan Anda mengirimkan masalah terbuka sebelum mengirimkan permintaan penarikan Anda. Proyek Smoke lebih memilih diskusi komunitas terbuka sebelum menerima fitur baru.