デスクトップ IPC トランスポート
このモードを使うとき
見出しへのリンクデスクトップ IPC トランスポートは、ホストとリモートのランタイムが異なるプロセスや webview に存在する Electron / Tauri 系アーキテクチャ向けです。
典型的な適用先:
- デスクトップ拡張プラットフォーム。
- メイン UI プロセスから分離されたプラグインランタイム。
- 明示的な IPC ポリシーを持つネイティブシェルのオーケストレーション。
基本モデル
見出しへのリンク@omnicajs/vue-remote はここでも同じチャネル契約を必要とします。
IPC はあくまで配送手段にすぎません。
Host Renderer (Desktop UI) -> createReceiver() -> createEndpoint(fromDesktopIpc(...)) -> call.run(receiver.receive, hostBridge)
Desktop Main Process / IPC Layer -> routes messages between host and remote peers -> applies policy, auth/capability checks, and lifecycle rules
Remote Runtime (isolated renderer/webview/process) -> createEndpoint(fromDesktopIpc(...)) -> expose run/release最小 endpoint ラッパーパターン
見出しへのリンクデスクトップ IPC ブリッジの上に MessageEndpoint アダプタを構築します:
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 フローを使います:
const endpoint = createEndpoint<RemoteApi>(fromDesktopIpc(window.desktopBridge))await endpoint.call.run(receiver.receive, hostBridge)Electron と Tauri の注意点
見出しへのリンクElectron:
- preload (
contextBridge) から狭い IPC API を公開する。 contextIsolation: trueを維持する。- メインプロセスから無制限なオブジェクトを渡さない。
Tauri:
- command / event チャネルを制約付きブリッジとして使う。
- capabilities 内で allowlist を明示的に保つ。
- 信頼できないプラグインに対して広いワイルドカード event pipe を避ける。
本番運用上の注意
見出しへのリンク- IPC チャネルを特権境界として扱う。
- プロトコルにバージョンを付け、互換性チェックを強制する。
- 拡張セッションごとに capability ベースのルーティングを追加する。
- teardown 時にチャネルを閉じ、retained 参照を解放する。