Desktop IPC Transport
Когда использовать этот режим
Ссылка на заголовокDesktop IPC transport нужен для архитектур Electron/Tauri, где host и remote работают в разных процессах/webview.
Типичные сценарии:
- desktop extension-platform;
- plugin runtime с изоляцией от основного UI-процесса;
- native shell orchestration с явными IPC-политиками.
Базовая модель
Ссылка на заголовок@omnicajs/vue-remote использует тот же channel-контракт.
IPC это только способ доставки.
Host Renderer (Desktop UI) -> createReceiver() -> createEndpoint(fromDesktopIpc(...)) -> call.run(receiver.receive, hostBridge)
Desktop Main Process / IPC Layer -> маршрутизирует сообщения между host и remote peer -> применяет policy, auth/capability checks и lifecycle-правила
Remote Runtime (isolated renderer/webview/process) -> createEndpoint(fromDesktopIpc(...)) -> expose run/releaseМинимальный паттерн endpoint wrapper
Ссылка на заголовокСоберите MessageEndpoint адаптер поверх desktop IPC bridge:
import type { MessageEndpoint } from '@remote-ui/rpc'
type DesktopBridge = { send(channel: string, payload: unknown): void; on(channel: string, listener: (payload: unknown) => void): void; off(channel: string, listener: (payload: unknown) => void): void; close?(): void;}
export function fromDesktopIpc( bridge: DesktopBridge, channel = 'vue-remote:rpc'): MessageEndpoint { const listeners = new Set<(event: MessageEvent) => void>()
const onPayload = (payload: unknown) => { const event = { data: payload } as MessageEvent for (const listener of listeners) { listener(event) } }
bridge.on(channel, onPayload)
return { postMessage(message: any) { bridge.send(channel, message) }, addEventListener(event, listener) { if (event === 'message') listeners.add(listener) }, removeEventListener(event, listener) { if (event === 'message') listeners.delete(listener) }, terminate() { bridge.off(channel, onPayload) bridge.close?.() }, }}Дальше используйте стандартный endpoint flow:
const endpoint = createEndpoint<RemoteApi>(fromDesktopIpc(window.desktopBridge))await endpoint.call.run(receiver.receive, hostBridge)Заметки для Electron и Tauri
Ссылка на заголовокElectron:
- экспортируйте узкий IPC API через preload (
contextBridge); - держите
contextIsolation: true; - не передавайте неограниченные объекты из main process.
Tauri:
- используйте command/event каналы как ограниченный bridge;
- явно задавайте allowlist в capabilities;
- избегайте широких wildcard event-pipe для недоверенных плагинов.
Рекомендации для production
Ссылка на заголовок- Рассматривайте IPC-каналы как привилегированные границы.
- Версионируйте протокол и проверяйте совместимость.
- Добавляйте capability-based routing для каждой extension-сессии.
- Следите, чтобы teardown закрывал каналы и освобождал retained-ссылки.