invoke-handle
v0.0.1
Published
A simple, type-safe IPC layer for Node.js child_process, replicating Electron’s ipcMain.handle and ipcRenderer.invoke.
Readme
invoke-handle
A simple, type-safe IPC layer for Node.js child_process, replicating Electron’s ipcMain.handle and ipcRenderer.invoke.
Installation
npm install invoke-handleUsage
Define the channel types for the main process and child processes
// channels.ts
export interface MainChannels {
sum: (a: number, b: number) => number
}
export interface ChildChannels {
hello: (name: string) => string
}Define the main process handler
// main.ts
import { fork } from 'node:child_process'
import path from 'node:path'
import { createIpc } from './ipc'
import type { ChildChannels, MainChannels } from './channels'
const child = fork(path.join(__dirname, 'child.js'))
// 主进程的 ipc,可以调用子进程方法(ChildChannels)
const ipcMain = createIpc<ChildChannels>(child)
// 注册主进程方法(MainChannels)
const mainHandlers = createIpc<MainChannels>(child)
mainHandlers.handle('sum', (a, b) => a + b)
;(async () => {
const greeting = await ipcMain.invoke('hello', 'Alice')
console.log('Main got:', greeting) // Hello, Alice!
})()Define the child process handler
// child.ts
import { createIpc } from './ipc'
import type { ChildChannels, MainChannels } from './channels'
// 子进程的 ipc,可以调用主进程方法(MainChannels)
const ipcRenderer = createIpc<MainChannels>(process)
// 注册子进程方法(ChildChannels)
const childHandlers = createIpc<ChildChannels>(process)
childHandlers.handle('hello', name => `Hello, ${name}!`)
;(async () => {
const result = await ipcRenderer.invoke('sum', 5, 7)
console.log('Child got:', result) // 12
})()