BroadcastChannel Transport
Экспериментальный статус
Ссылка на заголовокЭтот режим считается экспериментальным для @omnicajs/vue-remote.
Он может работать в browser-local сценариях, но полноценная поддержка и долгосрочные гарантии пока не заявлены.
Где применим
Ссылка на заголовок- multi-tab / multi-window диагностика;
- локальные observer/debugger клиенты;
- легкая browser-оркестрация, где не нужна жесткая point-to-point модель.
Ключевое ограничение
Ссылка на заголовокBroadcastChannel это pub/sub, а не point-to-point по умолчанию.
Скоуп сессии и корреляцию сообщений нужно реализовывать в адаптере.
Минимальный эскиз адаптера
Ссылка на заголовокimport type { MessageEndpoint } from '@remote-ui/rpc'
type Envelope = { sessionId: string; sender: string; payload: unknown;}
export function fromBroadcastChannel( channelName: string, sessionId: string, sender: string): MessageEndpoint { const channel = new BroadcastChannel(channelName) const listeners = new Set<(event: MessageEvent) => void>()
const onMessage = (event: MessageEvent<Envelope>) => { const data = event.data if (!data) return if (data.sessionId !== sessionId) return if (data.sender === sender) return const wrapped = { data: data.payload } as MessageEvent for (const listener of listeners) listener(wrapped) }
channel.addEventListener('message', onMessage as EventListener)
return { postMessage(message: any) { channel.postMessage({ sessionId, sender, payload: message } satisfies Envelope) }, addEventListener(event, listener) { if (event === 'message') listeners.add(listener) }, removeEventListener(event, listener) { if (event === 'message') listeners.delete(listener) }, terminate() { channel.removeEventListener('message', onMessage as EventListener) channel.close() }, }}Практические рекомендации
Ссылка на заголовок- Явно выделяйте границы
sessionId. - Предотвращайте self-echo через sender identity.
- Не рассматривайте BroadcastChannel как security boundary.
- Для production-критичных extension-сессий предпочитайте базовые транспорты.