comty/packages/server/gateway/utils/spawnService.js
2025-03-28 22:05:13 +00:00

59 lines
1.3 KiB
JavaScript

import ChildProcess from "node:child_process"
import createServiceLogTransformer from "./createServiceLogTransformer"
import Vars from "../vars"
export default async ({ id, service, cwd, onClose, onError, onIPCData }) => {
const instanceEnv = {
...process.env,
lb_service: {
id: service.id,
index: service.index,
},
}
let instance = ChildProcess.fork(Vars.bootloaderBin, [service], {
detached: false,
silent: true,
cwd: cwd,
env: instanceEnv,
killSignal: "SIGTERM",
})
instance.logs = {
stdout: createServiceLogTransformer({ id }),
stderr: createServiceLogTransformer({ id, color: "bgRed" }),
attach: () => {
instance.logs.stdout.pipe(process.stdout)
instance.logs.stderr.pipe(process.stderr)
},
detach: () => {
instance.logs.stdout.unpipe(process.stdout)
instance.logs.stderr.unpipe(process.stderr)
},
}
instance.logs.stdout.history = []
instance.logs.stderr.history = []
// push to buffer history
instance.stdout.pipe(instance.logs.stdout)
instance.stderr.pipe(instance.logs.stderr)
instance.on("message", (data) => {
return onIPCData(id, data)
})
instance.on("error", (err) => {
return onError(id, err)
})
instance.on("close", (code) => {
return onClose(id, code)
})
global.ipcRouter.register({ id, instance })
return instance
}