{"version":3,"file":"cluster.cjs","sources":["../../../../packages/engine-server/src/cluster.ts"],"sourcesContent":["import cluster, { Worker } from 'node:cluster'\nimport { timeout } from './utils'\n\nexport const getClusterProcessType = (isClusterMode: boolean): ProcessType =>\n\t!isClusterMode ? 'singleNode' : cluster.isMaster ? 'clusterMaster' : 'clusterWorker'\n\nexport type ProcessType =\n\t| 'singleNode'\n\t| 'clusterMaster'\n\t| 'clusterWorker'\n\nconst MSG_WORKER_STARTED = 'msg_worker_started'\n\nexport const waitForWorker = (worker: Worker, timeoutMs: number) => {\n\tlet ok = false\n\treturn Promise.race([\n\t\tnew Promise(async resolve => {\n\t\t\tconst listener = (message: any) => {\n\t\t\t\tif ('type' in message && message.type === MSG_WORKER_STARTED) {\n\t\t\t\t\tok = true\n\t\t\t\t\tresolve(null)\n\t\t\t\t\tworker.removeListener('message', listener)\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait worker.on('message', listener)\n\t\t}),\n\t\ttimeout(timeoutMs).then(() => {\n\t\t\tif (!ok) {\n\t\t\t\tthrow new Error('Worker start timed out')\n\t\t\t}\n\t\t\treturn true\n\t\t}),\n\t])\n}\n\nexport const notifyWorkerStarted = () =>\n\tprocess.send?.({\n\t\ttype: MSG_WORKER_STARTED,\n\t})\n\nexport class WorkerManager {\n\n\tprivate isTerminating = false\n\n\tprivate workers: Set<Worker> = new Set()\n\n\tpublic async start({ workerCount, env }: { workerCount: number; env?: any }): Promise<void> {\n\t\tif (this.isTerminating) {\n\t\t\tthrow new Error(`Worker manager is terminating`)\n\t\t}\n\t\tfor (let i = 0; i < workerCount; i++) {\n\t\t\tawait this.startWorker(env)\n\t\t\tif (this.isTerminating) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async startWorker(env?: any) {\n\t\tconst worker = cluster.fork(env)\n\t\tworker.on('exit', async (code, signal) => {\n\t\t\tthis.workers.delete(worker)\n\t\t\tif (!this.isTerminating) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log(`Worker ${worker.process.pid} died with signal ${signal}, restarting`)\n\t\t\t\tawait timeout(2000)\n\t\t\t\tawait this.startWorker(env)\n\t\t\t}\n\t\t})\n\t\tthis.workers.add(worker)\n\t\tawait waitForWorker(worker, 15000)\n\t}\n\n\tpublic async terminate(signal: NodeJS.Signals): Promise<void> {\n\t\tif (this.isTerminating) {\n\t\t\tthrow new Error(`Worker manager is terminating`)\n\t\t}\n\t\tthis.isTerminating = true\n\t\tawait Promise.allSettled(Array.from(this.workers).map(async it => {\n\t\t\tif (!it) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log(`Terminating worker ${it.process.pid}`)\n\t\t\tconst disconnectPromise = new Promise(resolve => it.once('disconnect', resolve))\n\t\t\tit.disconnect()\n\t\t\tawait disconnectPromise\n\t\t\tconst killPromise = new Promise(resolve => it.once('exit', resolve))\n\t\t\tit.kill(signal)\n\t\t\tawait killPromise\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log(`Worker ${it.process.pid} terminated`)\n\t\t}))\n\t}\n}\n"],"names":["timeout"],"mappings":";;;;;;;AAGa,MAAA,wBAAwB,CAAC,kBACrC,CAAC,gBAAgB,eAAe,QAAQ,WAAW,kBAAkB;AAOtE,MAAM,qBAAqB;AAEd,MAAA,gBAAgB,CAAC,QAAgB,cAAsB;AACnE,MAAI,KAAK;AACT,SAAO,QAAQ,KAAK;AAAA,IACnB,IAAI,QAAQ,OAAM,YAAW;AACtB,YAAA,WAAW,CAAC,YAAiB;AAClC,YAAI,UAAU,WAAW,QAAQ,SAAS,oBAAoB;AACxD,eAAA;AACL,kBAAQ,IAAI;AACL,iBAAA,eAAe,WAAW,QAAQ;AAAA,QAAA;AAAA,MAE3C;AACM,YAAA,OAAO,GAAG,WAAW,QAAQ;AAAA,IAAA,CACnC;AAAA,IACDA,cAAQ,SAAS,EAAE,KAAK,MAAM;AAC7B,UAAI,CAAC,IAAI;AACF,cAAA,IAAI,MAAM,wBAAwB;AAAA,MAAA;AAElC,aAAA;AAAA,IACP,CAAA;AAAA,EAAA,CACD;AACF;AAEa,MAAA,sBAAsB,MAClC,QAAQ,OAAO;AAAA,EACd,MAAM;AACP,CAAC;AAEK,MAAM,cAAc;AAAA,EAApB,cAAA;AAEN,kBAAA,MAAQ,iBAAgB,KAAA;AAEhB,kBAAA,MAAA,+BAA2B,IAAI,CAAA;AAAA,EAAA;AAAA,EAEvC,MAAa,MAAM,EAAE,aAAa,OAA0D;AAC3F,QAAI,KAAK,eAAe;AACjB,YAAA,IAAI,MAAM,+BAA+B;AAAA,IAAA;AAEhD,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AAC/B,YAAA,KAAK,YAAY,GAAG;AAC1B,UAAI,KAAK,eAAe;AACvB;AAAA,MAAA;AAAA,IACD;AAAA,EACD;AAAA,EAGD,MAAc,YAAY,KAAW;AAC9B,UAAA,SAAS,QAAQ,KAAK,GAAG;AAC/B,WAAO,GAAG,QAAQ,OAAO,MAAM,WAAW;AACpC,WAAA,QAAQ,OAAO,MAAM;AACtB,UAAA,CAAC,KAAK,eAAe;AAExB,gBAAQ,IAAI,UAAU,OAAO,QAAQ,GAAG,qBAAqB,MAAM,cAAc;AACjF,cAAMA,MAAAA,QAAQ,GAAI;AACZ,cAAA,KAAK,YAAY,GAAG;AAAA,MAAA;AAAA,IAC3B,CACA;AACI,SAAA,QAAQ,IAAI,MAAM;AACjB,UAAA,cAAc,QAAQ,IAAK;AAAA,EAAA;AAAA,EAGlC,MAAa,UAAU,QAAuC;AAC7D,QAAI,KAAK,eAAe;AACjB,YAAA,IAAI,MAAM,+BAA+B;AAAA,IAAA;AAEhD,SAAK,gBAAgB;AACf,UAAA,QAAQ,WAAW,MAAM,KAAK,KAAK,OAAO,EAAE,IAAI,OAAM,OAAM;AACjE,UAAI,CAAC,IAAI;AACR;AAAA,MAAA;AAGD,cAAQ,IAAI,sBAAsB,GAAG,QAAQ,GAAG,EAAE;AAC5C,YAAA,oBAAoB,IAAI,QAAQ,CAAA,YAAW,GAAG,KAAK,cAAc,OAAO,CAAC;AAC/E,SAAG,WAAW;AACR,YAAA;AACA,YAAA,cAAc,IAAI,QAAQ,CAAA,YAAW,GAAG,KAAK,QAAQ,OAAO,CAAC;AACnE,SAAG,KAAK,MAAM;AACR,YAAA;AAEN,cAAQ,IAAI,UAAU,GAAG,QAAQ,GAAG,aAAa;AAAA,IAAA,CACjD,CAAC;AAAA,EAAA;AAEJ;;;;;"}