Перейти к основному содержимому

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

Ссылка на заголовок
  1. Аутентифицируйте каждую сессию до вызова run(...).
  2. Версионируйте протокол и отклоняйте несовместимых клиентов.
  3. Обеспечьте ordering/correlation IDs на уровне gateway.
  4. Добавьте reconnect-политику с явными правилами resume.
  5. Ограничивайте размер payload и редактируйте чувствительные поля.

Где применять

Ссылка на заголовок
  • Хорошо подходит для продвинутых extension-platform и remote-debugging.
  • Избыточно для базовых single-page host + extension сценариев.

Для browser-local сценариев сначала рассмотрите Web Worker Runtime или iframe transport.

Связанные разделы

Ссылка на заголовок