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

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

Ссылка на заголовок
  1. Рассматривайте IPC-каналы как привилегированные границы.
  2. Версионируйте протокол и проверяйте совместимость.
  3. Добавляйте capability-based routing для каждой extension-сессии.
  4. Следите, чтобы teardown закрывал каналы и освобождал retained-ссылки.

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

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