A simple API for running child-processes and comunicating with them via DBus.
// worker.js export function calculatePi(digits) { // some calculations return result; }// main.js const server = await startServer("org.my.app"); const client = await server.createClient("./worker.js"); // note: path to the worker must be relative to the current working directory or absolute const pi = await client.invoke.calculatePi(1000); console.log(pi); client.terminate(); server.close();Main process can expose methods to the client by passing an object to the createClient function.
// main.js const mainProcessApi = { // Pass a log message to the Logger class in the main process log: (message) => Logger.info(message), }; const client = await server.createClient("./worker.js", mainProcessApi);// worker.js export function doWork(message) { try { // ... } catch (error) { Subprocess.invoke.log(error.message); } }If you are using TypeScript you will want to have the client and Subprocess fully typed. That cannot be done automatically, since it's impossible atm to infer type definitions from a filepath. But you can fairly easily provide those typings manually:
// worker.ts export function calculatePi(digits: number): string { // some calculations return result; } export function reverse(str: string): string { return str.split("").reverse().join(""); }import type * as Worker from "./worker"; const server = await startServer("org.my.app"); const client = await server.createClient<typeof Worker>("./worker.ts");In case of the main process exported methods, those must be declared on a interface in the global scope called MainProcessApi.
// main.ts const mainProcessApi = { // Pass a log message to the Logger class in the main process log: (message: string) => Logger.info(message), }; const client = await server.createClient("./worker.ts", mainProcessApi);// worker.ts declare global { // Methods in this interface should match the methods provided by the main process interface MainProcessApi { log(message: string): void; } } Subprocess.invoke.log("Hello from the worker!");