The CMD service lets you command child processes in Node.js (using the graphscript-node
dist). It's a pretty straightforward process,
you provide routes with commands and arguments as they fit into normal child process callbacks.
See services/cmd/childproces.js
for a boilerplate node process you can run that sets up a CMDService to enable cross-process message passing by listening to process.stdin the same way other message passing services listen, including all of the helpful utilities like running functions or subscribing across processes.
type CMDRoute = {
command:string|ChildProcess,
args?:string[],
options?:{shell:true, stdio:'inherit',[key:string]:any},
env?:any,
cwd?:any,
signal?:any,
stdout?:(data:any)=>void,
onerror?:(error:Error)=>void,
onclose?:(code: number | null, signal: NodeJS.Signals | null)=>void
} & GraphNodeProperties
type CMDInfo = {
process:ChildProcess,
_id:string,
controller:AbortController,
send:(data:Serializable)=>boolean,
request:(message:ServiceMessage|any, method?:string) => Promise<any>,
post:(route:string, args:any, method?:string) => boolean,
run:(route:any, args?:any, method?:string) => Promise<any>,
subscribe:(route:any, callback?:((res:any)=>void)|string) => number,
unsubscribe:(route:any, sub:number) => Promise<boolean>
} & CMDRoute
import { CMDService } from "./CMD.node";
import { unsafeRoutes } from '../unsafe/Unsafe.service';
const service = new CMDService({
routes:[unsafeRoutes]
}); //now we can send/receive messages
console.log("Child process listening...")
//....
Then create childprocess.js in your root (for this example)
import { CMDService } from "./CMD.node";
import { unsafeRoutes } from '../unsafe/Unsafe.service';
const service = new CMDService({
routes:[unsafeRoutes]
}); //now we can send/receive messages
console.log("Child process listening...")
and from your main program, add the following after instantiating a CMDService
//....
const p = service.createProcess({
command:'node',
args:['childprocess.js']
});
and now you can interact with it nodes across child processes!