oRPC Message Port

Using oRPC with Message Ports for internal communication between processes.

SKILL.md

GitHub

Message Port

oRPC offers built-in support for common Message Port implementations, enabling easy internal communication between processes.

Environment Documentation
Electron Message Port Adapter Guide
Browser (extension, window-to-window) Adapter Guide
Node.js Worker Threads Port Adapter Guide

Basic Usage

Bridge:

const channel = new MessageChannel()
const serverPort = channel.port1
const clientPort = channel.port2

Server:

import { RPCHandler } from '@orpc/server/message-port'
import { onError } from '@orpc/server'

const handler = new RPCHandler(router, {
  interceptors: [onError(e => console.error(e))],
})

handler.upgrade(serverPort, { context: {} })

serverPort.start()

Client:

import { RPCLink } from '@orpc/client/message-port'

const link = new RPCLink({ port: clientPort })

clientPort.start()

Transfer

By default, oRPC serializes messages to string/binary. Use transfer to leverage MessagePort.postMessage for transferring ownership or unserializable objects:

Handler:

const handler = new RPCHandler(router, {
  experimental_transfer: (message, port) => {
    const transfer = deepFindTransferableObjects(message)
    return transfer.length ? transfer : null
  }
})

Link:

const link = new RPCLink({
  port: clientPort,
  experimental_transfer: (message) => {
    const transfer = deepFindTransferableObjects(message)
    return transfer.length ? transfer : null
  }
})

When transfer returns an array, messages use structured clone algorithm, which doesn't support all data types like Event Iterator metadata. Only enable when needed.

transfer runs after RPC JSON Serializer so you can combine them.