oRPC Message Port
Using oRPC with Message Ports for internal communication between processes.
Files2
View on GitHubSKILL.mdskills/orpc-message-port/SKILL.md
GitHubMessage 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
transferreturns an array, messages use structured clone algorithm, which doesn't support all data types like Event Iterator metadata. Only enable when needed.
transferruns after RPC JSON Serializer so you can combine them.