Socket Transport
Когда использовать socket transport
Ссылка на заголовокSocket transport нужен, когда host и remote находятся не в одном browser context и вам нужна сетевая граница:
- remote runtime работает в другом процессе или на другой машине;
- нужны live-сессии для разработки расширений;
- debugger/observer клиенты должны подключаться независимо.
Позиционирование
Ссылка на заголовок@omnicajs/vue-remote оставляет синхронизацию рендера на уровне channel-контракта.
Socket transport это выбор реализации доставки этого контракта по сети.
По сравнению с iframe/worker этот режим добавляет эксплуатационные задачи:
- lifecycle сессии при reconnect;
- auth и capability checks;
- ordering сообщений и идемпотентность;
- лимиты payload и redaction-политики.
Топология верхнего уровня
Ссылка на заголовокHost Runtime -> createReceiver() -> createEndpoint(fromSocket(...)) -> call.run(receiver.receive, hostBridge)
Socket Gateway -> session routing (host <-> remote) -> auth + protocol version checks
Remote Runtime -> createEndpoint(fromSocket(...)) -> expose run/releaseМинимальный MessageEndpoint wrapper для WebSocket
Ссылка на заголовок@remote-ui/rpc работает с объектами, реализующими MessageEndpoint.
WebSocket можно адаптировать к этой форме:
import type { MessageEndpoint } from '@remote-ui/rpc'
export function fromSocket(socket: WebSocket): MessageEndpoint { const listeners = new Set<(event: MessageEvent) => void>()
socket.addEventListener('message', (event) => { const message = JSON.parse(event.data as string) const wrapped = { data: message } as MessageEvent for (const listener of listeners) { listener(wrapped) } })
return { postMessage(message: any) { socket.send(JSON.stringify(message)) }, addEventListener(event, listener) { if (event === 'message') { listeners.add(listener) } }, removeEventListener(event, listener) { if (event === 'message') { listeners.delete(listener) } }, terminate() { socket.close() }, }}Дальше endpoint подключается так же, как и в других transport-режимах:
const socket = new WebSocket('wss://runtime.example.com/remote-session?sessionId=abc')const endpoint = createEndpoint<RemoteApi>(fromSocket(socket))
await endpoint.call.run(receiver.receive, hostBridge)Важные замечания для production
Ссылка на заголовок- Аутентифицируйте каждую сессию до вызова
run(...). - Версионируйте протокол и отклоняйте несовместимых клиентов.
- Обеспечьте ordering/correlation IDs на уровне gateway.
- Добавьте reconnect-политику с явными правилами resume.
- Ограничивайте размер payload и редактируйте чувствительные поля.
Где применять
Ссылка на заголовок- Хорошо подходит для продвинутых extension-platform и remote-debugging.
- Избыточно для базовых single-page host + extension сценариев.
Для browser-local сценариев сначала рассмотрите Web Worker Runtime или iframe transport.