Запуск веб-серверов в веб-браузерах через 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, позволяя сделать традиционные приложения веб-сервера переносимыми между серверной и браузерной средами. Он разработан для поддержки альтернативных архитектур программного обеспечения, в которых ориентированные на пользователя сервисы могут быть перенесены из облака и запущены в одноранговом режиме в браузере.
Лицензия МТИ
API-интерфейсы Smoke Network предоставляются в виде сетевых объектов. Объект Network представляет собой активное соединение с общим концентратором сигнализации и предоставляет функциональные возможности Http, Net и Media, используемые для связи с другими сетевыми объектами, подключенными к тому же концентратору.
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 через API 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 API поддерживает прослушивание и выборку 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 ( )
} )
Используйте функцию подключения, чтобы установить сетевое соединение с удаленным прослушивателем.
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 предоставляет функциональные возможности для отправки и получения объектов 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
Используйте функцию audio для создания потокового AudioSource.
const audio = Media . audio ( { src : './audio.mp3' } )
const sender = Media . send ( { hostname : 'localhost' , port : 6000 } , audio . mediastream )
Используйте функцию видео для создания потокового источника видео.
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 и поддерживает потоковое чтение и запись, перечисление каталогов, копирование, перемещение, переименование, а также события наблюдения за файлами и каталогами. Он предназначен для хранения статических файлов для сетевых служб, но может использоваться как файловая система общего назначения для приложений, которым необходимо хранить большие файлы в браузере.
Используйте функцию open, чтобы открыть файловую систему с заданным именем базы данных. Если база данных не существует, она создается.
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 для возврата объектов статистики для заданного пути к каталогу.
const stats = await Fs . readdir ( '/media/videos' )
Используйте функцию blob, чтобы вернуть объект Blob по пути к файлу.
const blob = await Fs . readdir ( '/video.mp4' )
const url = URL . createObjectUrl ( blob )
Используйте функции write и writeText для записи содержимого файла.
await Fs . write ( '/path/file.dat' , new Uint8Array ( [ 1 , 2 , 3 , 4 ] ) )
await Fs . writeText ( '/path/file.txt' , 'hello world' )
Используйте функции read и readText для чтения содержимого из файла.
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 предпочитает открытое обсуждение в сообществе, прежде чем принимать новые функции.