Pokemon_server / dist /lib /process-manager.js.map
Jofthomas's picture
Jofthomas HF staff
Upload 4781 files
5c2ed06 verified
{
"version": 3,
"sources": ["../../lib/process-manager.ts"],
"sourcesContent": ["/**\n * Process Manager\n * Pokemon Showdown - http://pokemonshowdown.com/\n *\n * This file abstract out multiprocess logic involved in several tasks.\n *\n * Child processes can be queried.\n *\n * @license MIT\n */\n\nimport * as child_process from 'child_process';\nimport * as cluster from 'cluster';\nimport * as path from 'path';\nimport * as Streams from './streams';\nimport { FS } from './fs';\n\ntype ChildProcess = child_process.ChildProcess;\ntype Worker = cluster.Worker;\n\nexport const processManagers: ProcessManager[] = [];\n\nexport function exec(\n\targs: string, execOptions?: child_process.ExecOptions\n): Promise<{ stderr: string, stdout: string }>;\nexport function exec(\n\targs: [string, ...string[]], execOptions?: child_process.ExecFileOptions\n): Promise<{ stderr: string, stdout: string }>;\nexport function exec(args: string | string[], execOptions?: AnyObject) {\n\tif (Array.isArray(args)) {\n\t\tconst cmd = args.shift();\n\t\tif (!cmd) throw new Error(`You must pass a command to ProcessManager.exec.`);\n\t\treturn new Promise<{ stderr: string, stdout: string }>((resolve, reject) => {\n\t\t\tchild_process.execFile(cmd, args, execOptions, (err, stdout, stderr) => {\n\t\t\t\tif (err) reject(err);\n\t\t\t\tif (typeof stdout !== 'string') stdout = stdout.toString();\n\t\t\t\tif (typeof stderr !== 'string') stderr = stderr.toString();\n\t\t\t\tresolve({ stdout, stderr });\n\t\t\t});\n\t\t});\n\t} else {\n\t\treturn new Promise<string>((resolve, reject) => {\n\t\t\tchild_process.exec(args, execOptions, (error, stdout, stderr) => {\n\t\t\t\tif (error) reject(error);\n\t\t\t\tif (typeof stdout !== 'string') stdout = stdout.toString();\n\t\t\t\tresolve(stdout);\n\t\t\t});\n\t\t});\n\t}\n}\n\nclass SubprocessStream extends Streams.ObjectReadWriteStream<string> {\n\tprocess: StreamProcessWrapper;\n\ttaskId: number;\n\tconstructor(process: StreamProcessWrapper, taskId: number) {\n\t\tsuper();\n\t\tthis.process = process;\n\t\tthis.taskId = taskId;\n\t\tthis.process.process.send(`${taskId}\\nNEW`);\n\t}\n\t_write(message: string) {\n\t\tif (!this.process.process.connected) {\n\t\t\tthis.pushError(new Error(`Process disconnected (possibly crashed?)`));\n\t\t\treturn;\n\t\t}\n\t\tthis.process.process.send(`${this.taskId}\\nWRITE\\n${message}`);\n\t\t// responses are handled in ProcessWrapper\n\t}\n\t_writeEnd() {\n\t\tthis.process.process.send(`${this.taskId}\\nWRITEEND`);\n\t}\n\t_destroy() {\n\t\tif (!this.process.process.connected) return;\n\t\tthis.process.process.send(`${this.taskId}\\nDESTROY`);\n\t\tthis.process.deleteStream(this.taskId);\n\t\tthis.process = null!;\n\t}\n}\n\nclass RawSubprocessStream extends Streams.ObjectReadWriteStream<string> {\n\tprocess: RawProcessWrapper;\n\tconstructor(process: RawProcessWrapper) {\n\t\tsuper();\n\t\tthis.process = process;\n\t}\n\t_write(message: string) {\n\t\tif (!this.process.getProcess().connected) {\n\t\t\t// no error because the crash handler should already have shown an error, and\n\t\t\t// sometimes harmless messages are sent during cleanup\n\t\t\treturn;\n\t\t}\n\t\tthis.process.process.send(message);\n\t\t// responses are handled in ProcessWrapper\n\t}\n}\n\nexport interface ProcessWrapper {\n\tgetLoad: () => number;\n\tprocess: ChildProcess | Worker;\n\trelease: () => Promise<void>;\n\tgetProcess: () => ChildProcess;\n}\n\n/** Wraps the process object in the PARENT process. */\nexport class QueryProcessWrapper<T, U> implements ProcessWrapper {\n\tprocess: ChildProcess;\n\ttaskId: number;\n\tpendingTasks: Map<number, (resp: U) => void>;\n\tmessageCallback: ((message: string) => any) | null;\n\tpendingRelease: Promise<void> | null;\n\tresolveRelease: (() => void) | null;\n\tdebug?: string;\n\tfile: string;\n\n\tconstructor(file: string, messageCallback?: (message: string) => any) {\n\t\tthis.process = child_process.fork(file, [], { cwd: FS.ROOT_PATH });\n\t\tthis.taskId = 0;\n\t\tthis.file = file;\n\t\tthis.pendingTasks = new Map();\n\t\tthis.pendingRelease = null;\n\t\tthis.resolveRelease = null;\n\t\tthis.messageCallback = messageCallback || null;\n\n\t\tthis.process.on('message', (message: string) => {\n\t\t\tif (message.startsWith('THROW\\n')) {\n\t\t\t\tconst error = new Error();\n\t\t\t\terror.stack = message.slice(6);\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tif (message.startsWith('DEBUG\\n')) {\n\t\t\t\tthis.debug = message.slice(6);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.messageCallback && message.startsWith(`CALLBACK\\n`)) {\n\t\t\t\tthis.messageCallback(message.slice(9));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nlLoc = message.indexOf('\\n');\n\t\t\tif (nlLoc <= 0) throw new Error(`Invalid response ${message}`);\n\t\t\tconst taskId = parseInt(message.slice(0, nlLoc));\n\t\t\tconst resolve = this.pendingTasks.get(taskId);\n\t\t\tif (!resolve) throw new Error(`Invalid taskId ${message.slice(0, nlLoc)}`);\n\t\t\tthis.pendingTasks.delete(taskId);\n\t\t\tconst resp = this.safeJSON(message.slice(nlLoc + 1));\n\t\t\tresolve(resp);\n\n\t\t\tif (this.resolveRelease && !this.getLoad()) this.destroy();\n\t\t});\n\t}\n\tsafeJSON(obj: string): any {\n\t\t// special cases? undefined should strictly be fine\n\t\t// so let's just return it since we can't parse it\n\t\tif (obj === \"undefined\") {\n\t\t\treturn undefined;\n\t\t}\n\t\ttry {\n\t\t\treturn JSON.parse(obj);\n\t\t} catch (e: any) {\n\t\t\t// this is in the parent, so it should usually exist, but it's possible\n\t\t\t// it's also futureproofing in case other external modfules require this\n\t\t\t// we also specifically do not throw here because this json might be sensitive,\n\t\t\t// so we only want it to go to emails\n\t\t\t(global as any).Monitor?.crashlog?.(e, `a ${path.basename(this.file)} process`, { result: obj });\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tgetProcess() {\n\t\treturn this.process;\n\t}\n\n\tgetLoad() {\n\t\treturn this.pendingTasks.size;\n\t}\n\n\tquery(input: T): Promise<U> {\n\t\tthis.taskId++;\n\t\tconst taskId = this.taskId;\n\t\tthis.process.send(`${taskId}\\n${JSON.stringify(input)}`);\n\t\treturn new Promise(resolve => {\n\t\t\tthis.pendingTasks.set(taskId, resolve);\n\t\t});\n\t}\n\n\trelease(): Promise<void> {\n\t\tif (this.pendingRelease) return this.pendingRelease;\n\t\tif (!this.getLoad()) {\n\t\t\tthis.destroy();\n\t\t} else {\n\t\t\tthis.pendingRelease = new Promise(resolve => {\n\t\t\t\tthis.resolveRelease = resolve;\n\t\t\t});\n\t\t}\n\t\treturn this.pendingRelease!;\n\t}\n\n\tdestroy() {\n\t\tif (this.pendingRelease && !this.resolveRelease) {\n\t\t\t// already destroyed\n\t\t\treturn;\n\t\t}\n\t\tthis.process.disconnect();\n\t\tfor (const resolver of this.pendingTasks.values()) {\n\t\t\t// maybe we should track reject functions too...\n\t\t\tresolver('' as any);\n\t\t}\n\t\tthis.pendingTasks.clear();\n\t\tif (this.resolveRelease) {\n\t\t\tthis.resolveRelease();\n\t\t\tthis.resolveRelease = null;\n\t\t} else if (!this.pendingRelease) {\n\t\t\tthis.pendingRelease = Promise.resolve();\n\t\t}\n\t}\n}\n\n/** Wraps the process object in the PARENT process. */\nexport class StreamProcessWrapper implements ProcessWrapper {\n\tprocess: ChildProcess;\n\ttaskId = 0;\n\tactiveStreams = new Map<number, SubprocessStream>();\n\tpendingRelease: Promise<void> | null = null;\n\tresolveRelease: (() => void) | null = null;\n\tdebug?: string;\n\n\tsetDebug(message: string) {\n\t\tthis.debug = (this.debug || '').slice(-32768) + '\\n=====\\n' + message;\n\t}\n\tmessageCallback?: (message: string) => any;\n\n\tconstructor(file: string, messageCallback?: (message: string) => any) {\n\t\tthis.process = child_process.fork(file, [], { cwd: FS.ROOT_PATH });\n\t\tthis.messageCallback = messageCallback;\n\n\t\tthis.process.on('message', (message: string) => {\n\t\t\tif (message.startsWith('THROW\\n')) {\n\t\t\t\tconst error = new Error();\n\t\t\t\terror.stack = message.slice(6);\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tif (this.messageCallback && message.startsWith(`CALLBACK\\n`)) {\n\t\t\t\tthis.messageCallback(message.slice(9));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (message.startsWith('DEBUG\\n')) {\n\t\t\t\tthis.setDebug(message.slice(6));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet nlLoc = message.indexOf('\\n');\n\t\t\tif (nlLoc <= 0) throw new Error(`Invalid response ${message}`);\n\t\t\tconst taskId = parseInt(message.slice(0, nlLoc));\n\t\t\tconst stream = this.activeStreams.get(taskId);\n\t\t\tif (!stream) return; // stream already destroyed\n\n\t\t\tmessage = message.slice(nlLoc + 1);\n\t\t\tnlLoc = message.indexOf('\\n');\n\t\t\tif (nlLoc < 0) nlLoc = message.length;\n\t\t\tconst messageType = message.slice(0, nlLoc);\n\t\t\tmessage = message.slice(nlLoc + 1);\n\n\t\t\tif (messageType === 'END') {\n\t\t\t\tstream.pushEnd();\n\t\t\t\tthis.deleteStream(taskId);\n\t\t\t} else if (messageType === 'PUSH') {\n\t\t\t\tstream.push(message);\n\t\t\t} else if (messageType === 'THROW') {\n\t\t\t\tconst error = new Error();\n\t\t\t\terror.stack = message;\n\t\t\t\tstream.pushError(error, true);\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Unrecognized messageType ${messageType}`);\n\t\t\t}\n\t\t});\n\t}\n\n\tgetLoad() {\n\t\treturn this.activeStreams.size;\n\t}\n\n\tgetProcess() {\n\t\treturn this.process;\n\t}\n\n\tdeleteStream(taskId: number) {\n\t\tthis.activeStreams.delete(taskId);\n\t\t// try to release\n\t\tif (this.resolveRelease && !this.getLoad()) void this.destroy();\n\t}\n\n\tcreateStream(): SubprocessStream {\n\t\tthis.taskId++;\n\t\tconst taskId = this.taskId;\n\t\tconst stream = new SubprocessStream(this, taskId);\n\t\tthis.activeStreams.set(taskId, stream);\n\t\treturn stream;\n\t}\n\n\trelease(): Promise<void> {\n\t\tif (this.pendingRelease) return this.pendingRelease;\n\t\tif (!this.getLoad()) {\n\t\t\tvoid this.destroy();\n\t\t} else {\n\t\t\tthis.pendingRelease = new Promise(resolve => {\n\t\t\t\tthis.resolveRelease = resolve;\n\t\t\t});\n\t\t}\n\t\treturn this.pendingRelease!;\n\t}\n\n\tdestroy() {\n\t\tif (this.pendingRelease && !this.resolveRelease) {\n\t\t\t// already destroyed\n\t\t\treturn;\n\t\t}\n\t\tthis.process.disconnect();\n\t\tconst destroyed = [];\n\t\tfor (const stream of this.activeStreams.values()) {\n\t\t\tdestroyed.push(stream.destroy());\n\t\t}\n\t\tthis.activeStreams.clear();\n\t\tif (this.resolveRelease) {\n\t\t\tthis.resolveRelease();\n\t\t\tthis.resolveRelease = null;\n\t\t} else if (!this.pendingRelease) {\n\t\t\tthis.pendingRelease = Promise.resolve();\n\t\t}\n\t\treturn Promise.all(destroyed);\n\t}\n}\n\n/**\n * A container for a RawProcessManager stream. This is usually the\n * RawProcessWrapper, but it can also be a fake RawProcessWrapper if the PM is\n * told to spawn 0 worker processes.\n */\nexport class StreamWorker {\n\tload = 0;\n\tworkerid = 0;\n\tstream: Streams.ObjectReadWriteStream<string>;\n\tconstructor(stream: Streams.ObjectReadWriteStream<string>) {\n\t\tthis.stream = stream;\n\t}\n}\n\n/** Wraps the process object in the PARENT process. */\nexport class RawProcessWrapper implements ProcessWrapper, StreamWorker {\n\tprocess: ChildProcess & { process: undefined } | Worker;\n\ttaskId = 0;\n\tstream: RawSubprocessStream;\n\tpendingRelease: Promise<void> | null = null;\n\tresolveRelease: (() => void) | null = null;\n\tdebug?: string;\n\tworkerid = 0;\n\n\t/** Not managed by RawProcessWrapper itself */\n\tload = 0;\n\n\tsetDebug(message: string) {\n\t\tthis.debug = (this.debug || '').slice(-32768) + '\\n=====\\n' + message;\n\t}\n\n\tconstructor(file: string, isCluster?: boolean, env?: AnyObject) {\n\t\tif (isCluster) {\n\t\t\tthis.process = cluster.fork(env);\n\t\t\tthis.workerid = this.process.id;\n\t\t} else {\n\t\t\tthis.process = child_process.fork(file, [], { cwd: FS.ROOT_PATH, env }) as any;\n\t\t}\n\n\t\tthis.process.on('message', (message: string) => {\n\t\t\tthis.stream.push(message);\n\t\t});\n\n\t\tthis.stream = new RawSubprocessStream(this);\n\t}\n\n\tgetLoad() {\n\t\treturn this.load;\n\t}\n\tgetProcess() {\n\t\treturn this.process.process ? this.process.process : this.process;\n\t}\n\n\trelease(): Promise<void> {\n\t\tif (this.pendingRelease) return this.pendingRelease;\n\t\tif (!this.getLoad()) {\n\t\t\tvoid this.destroy();\n\t\t} else {\n\t\t\tthis.pendingRelease = new Promise(resolve => {\n\t\t\t\tthis.resolveRelease = resolve;\n\t\t\t});\n\t\t}\n\t\treturn this.pendingRelease!;\n\t}\n\n\tdestroy() {\n\t\tif (this.pendingRelease && !this.resolveRelease) {\n\t\t\t// already destroyed\n\t\t\treturn;\n\t\t}\n\t\tvoid this.stream.destroy();\n\t\tthis.process.disconnect();\n\t}\n}\n\n/**\n * A ProcessManager wraps a query function: A function that takes a\n * string and returns a string or Promise<string>.\n */\nexport abstract class ProcessManager<T extends ProcessWrapper = ProcessWrapper> {\n\tstatic disabled = false;\n\tprocesses: T[] = [];\n\treleasingProcesses: T[] = [];\n\tcrashedProcesses: T[] = [];\n\treadonly filename: string;\n\treadonly basename: string;\n\treadonly isParentProcess: boolean;\n\tcrashTime = 0;\n\tcrashRespawnCount = 0;\n\n\tconstructor(module: NodeJS.Module) {\n\t\tthis.filename = module.filename;\n\t\tthis.basename = path.basename(module.filename);\n\t\tthis.isParentProcess = (process.mainModule !== module || !process.send);\n\n\t\tthis.listen();\n\t}\n\tacquire() {\n\t\tif (!this.processes.length) {\n\t\t\treturn null;\n\t\t}\n\t\tlet lowestLoad = this.processes[0];\n\t\tfor (const process of this.processes) {\n\t\t\tif (process.getLoad() < lowestLoad.getLoad()) {\n\t\t\t\tlowestLoad = process;\n\t\t\t}\n\t\t}\n\t\treturn lowestLoad;\n\t}\n\treleaseCrashed(process: T) {\n\t\tconst index = this.processes.indexOf(process);\n\n\t\t// The process was shut down sanely, not crashed\n\t\tif (index < 0) return;\n\n\t\tthis.processes.splice(index, 1);\n\n\t\tthis.destroyProcess(process);\n\t\tvoid process.release().then(() => {\n\t\t\tconst releasingIndex = this.releasingProcesses.indexOf(process);\n\t\t\tif (releasingIndex >= 0) {\n\t\t\t\tthis.releasingProcesses.splice(releasingIndex, 1);\n\t\t\t}\n\t\t});\n\n\t\tconst now = Date.now();\n\t\tif (this.crashTime && now - this.crashTime > 30 * 60 * 1000) {\n\t\t\tthis.crashTime = 0;\n\t\t\tthis.crashRespawnCount = 0;\n\t\t}\n\t\tif (!this.crashTime) this.crashTime = now;\n\t\tthis.crashRespawnCount += 1;\n\t\t// Notify any global crash logger\n\t\tvoid Promise.reject(\n\t\t\tnew Error(`Process ${this.basename} ${process.getProcess().pid} crashed and had to be restarted`)\n\t\t);\n\t\tthis.releasingProcesses.push(process);\n\t\tthis.crashedProcesses.push(process);\n\n\t\t// only respawn processes if there have been fewer than 5 crashes in 30 minutes\n\t\tif (this.crashRespawnCount <= 5) {\n\t\t\tthis.spawn(this.processes.length + 1);\n\t\t}\n\t}\n\tunspawn() {\n\t\treturn Promise.all([...this.processes].map(\n\t\t\tprocess => this.unspawnOne(process)\n\t\t));\n\t}\n\tasync unspawnOne(process: T | null) {\n\t\tif (!process) return;\n\t\tthis.destroyProcess(process);\n\t\tconst processIndex = this.processes.indexOf(process);\n\t\tif (processIndex < 0) throw new Error('Process inactive');\n\t\tthis.processes.splice(this.processes.indexOf(process), 1);\n\t\tthis.releasingProcesses.push(process);\n\n\t\tawait process.release();\n\n\t\tconst index = this.releasingProcesses.indexOf(process);\n\t\tif (index < 0) return; // can happen if process crashed while releasing\n\t\tthis.releasingProcesses.splice(index, 1);\n\t}\n\tspawn(count = 1, force?: boolean) {\n\t\tif (!this.isParentProcess) return;\n\t\tif (ProcessManager.disabled && !force) return;\n\t\tconst spawnCount = count - this.processes.length;\n\t\tfor (let i = 0; i < spawnCount; i++) {\n\t\t\tthis.spawnOne(force);\n\t\t}\n\t}\n\tspawnOne(force?: boolean) {\n\t\tif (!this.isParentProcess) throw new Error('Must use in parent process');\n\t\tif (ProcessManager.disabled && !force) return null;\n\t\tconst process = this.createProcess();\n\t\tprocess.process.on('disconnect', () => this.releaseCrashed(process));\n\t\tthis.processes.push(process);\n\t\treturn process;\n\t}\n\trespawn(count: number | null = null) {\n\t\tif (count === null) count = this.processes.length;\n\t\tconst unspawned = this.unspawn();\n\t\tthis.spawn(count);\n\t\treturn unspawned;\n\t}\n\tabstract listen(): void;\n\tabstract createProcess(...args: any): T;\n\tdestroyProcess(process: T) {}\n\tdestroy() {\n\t\tconst index = processManagers.indexOf(this);\n\t\tif (index >= 0) processManagers.splice(index, 1);\n\t\treturn this.unspawn();\n\t}\n}\n\nexport class QueryProcessManager<T = string, U = string> extends ProcessManager<QueryProcessWrapper<T, U>> {\n\t_query: (input: T) => U | Promise<U>;\n\tmessageCallback?: (message: string) => any;\n\ttimeout: number;\n\n\t/**\n\t * @param timeout The number of milliseconds to wait before terminating a query. Defaults to 900000 ms (15 minutes).\n\t */\n\tconstructor(\n\t\tmodule: NodeJS.Module, query: (input: T) => U | Promise<U>,\n\t\ttimeout = 15 * 60 * 1000, debugCallback?: (message: string) => any\n\t) {\n\t\tsuper(module);\n\t\tthis._query = query;\n\t\tthis.timeout = timeout;\n\t\tthis.messageCallback = debugCallback;\n\n\t\tprocessManagers.push(this);\n\t}\n\tasync query(input: T, process = this.acquire()) {\n\t\tif (!process) return this._query(input);\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tconst debugInfo = process.debug || \"No debug information found.\";\n\t\t\tprocess.destroy();\n\t\t\tthis.spawnOne();\n\t\t\tthrow new Error(\n\t\t\t\t`A query originating in ${this.basename} took too long to complete; the process has been respawned.\\n${debugInfo}`\n\t\t\t);\n\t\t}, this.timeout);\n\n\t\tconst result = await process.query(input);\n\n\t\tclearTimeout(timeout);\n\t\treturn result;\n\t}\n\tqueryTemporaryProcess(input: T, force?: boolean) {\n\t\tconst process = this.spawnOne(force);\n\t\tconst result = this.query(input, process);\n\t\tvoid this.unspawnOne(process);\n\t\treturn result;\n\t}\n\tcreateProcess() {\n\t\treturn new QueryProcessWrapper<T, U>(this.filename, this.messageCallback);\n\t}\n\tlisten() {\n\t\tif (this.isParentProcess) return;\n\t\t// child process\n\t\tprocess.on('message', (message: string) => {\n\t\t\tconst nlLoc = message.indexOf('\\n');\n\t\t\tif (nlLoc <= 0) throw new Error(`Invalid response ${message}`);\n\t\t\tconst taskId = message.slice(0, nlLoc);\n\t\t\tmessage = message.slice(nlLoc + 1);\n\n\t\t\tif (taskId.startsWith('EVAL')) {\n\t\t\t\t// eslint-disable-next-line no-eval\n\t\t\t\tprocess.send!(`${taskId}\\n` + eval(message));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid Promise.resolve(this._query(JSON.parse(message))).then(\n\t\t\t\tresponse => process.send!(`${taskId}\\n${JSON.stringify(response)}`)\n\t\t\t);\n\t\t});\n\t\tprocess.on('disconnect', () => {\n\t\t\tprocess.exit();\n\t\t});\n\t}\n}\n\nexport class StreamProcessManager extends ProcessManager<StreamProcessWrapper> {\n\t/* taskid: stream used only in child process */\n\tactiveStreams: Map<string, Streams.ObjectReadWriteStream<string>>;\n\t_createStream: () => Streams.ObjectReadWriteStream<string>;\n\tmessageCallback?: (message: string) => any;\n\n\tconstructor(\n\t\tmodule: NodeJS.Module,\n\t\tcreateStream: () => Streams.ObjectReadWriteStream<string>,\n\t\tmessageCallback?: (message: string) => any\n\t) {\n\t\tsuper(module);\n\t\tthis.activeStreams = new Map();\n\t\tthis._createStream = createStream;\n\t\tthis.messageCallback = messageCallback;\n\n\t\tprocessManagers.push(this);\n\t}\n\tcreateStream() {\n\t\tconst process = this.acquire();\n\t\tif (!process) return this._createStream();\n\t\treturn process.createStream();\n\t}\n\tcreateProcess() {\n\t\treturn new StreamProcessWrapper(this.filename, this.messageCallback);\n\t}\n\tasync pipeStream(taskId: string, stream: Streams.ObjectReadStream<string>) {\n\t\tlet done = false;\n\t\twhile (!done) {\n\t\t\ttry {\n\t\t\t\tlet value;\n\t\t\t\t({ value, done } = await stream.next());\n\t\t\t\tprocess.send!(`${taskId}\\nPUSH\\n${value}`);\n\t\t\t} catch (err: any) {\n\t\t\t\tprocess.send!(`${taskId}\\nTHROW\\n${err.stack}`);\n\t\t\t}\n\t\t}\n\t\tif (!this.activeStreams.has(taskId)) {\n\t\t\t// stream.destroy() was called, don't send an END message\n\t\t\treturn;\n\t\t}\n\t\tprocess.send!(`${taskId}\\nEND`);\n\t\tthis.activeStreams.delete(taskId);\n\t}\n\tlisten() {\n\t\tif (this.isParentProcess) return;\n\t\t// child process\n\t\tprocess.on('message', (message: string) => {\n\t\t\tlet nlLoc = message.indexOf('\\n');\n\t\t\tif (nlLoc <= 0) throw new Error(`Invalid request ${message}`);\n\t\t\tconst taskId = message.slice(0, nlLoc);\n\t\t\tconst stream = this.activeStreams.get(taskId);\n\n\t\t\tmessage = message.slice(nlLoc + 1);\n\t\t\tnlLoc = message.indexOf('\\n');\n\t\t\tif (nlLoc < 0) nlLoc = message.length;\n\t\t\tconst messageType = message.slice(0, nlLoc);\n\t\t\tmessage = message.slice(nlLoc + 1);\n\n\t\t\tif (taskId.startsWith('EVAL')) {\n\t\t\t\t// eslint-disable-next-line no-eval\n\t\t\t\tprocess.send!(`${taskId}\\n` + eval(message));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (messageType === 'NEW') {\n\t\t\t\tif (stream) throw new Error(`NEW: taskId ${taskId} already exists`);\n\t\t\t\tconst newStream = this._createStream();\n\t\t\t\tthis.activeStreams.set(taskId, newStream);\n\t\t\t\tvoid this.pipeStream(taskId, newStream);\n\t\t\t} else if (messageType === 'DESTROY') {\n\t\t\t\tif (!stream) throw new Error(`DESTROY: Invalid taskId ${taskId}`);\n\t\t\t\tvoid stream.destroy();\n\t\t\t\tthis.activeStreams.delete(taskId);\n\t\t\t} else if (messageType === 'WRITE') {\n\t\t\t\tif (!stream) throw new Error(`WRITE: Invalid taskId ${taskId}`);\n\t\t\t\tvoid stream.write(message);\n\t\t\t} else if (messageType === 'WRITEEND') {\n\t\t\t\tif (!stream) throw new Error(`WRITEEND: Invalid taskId ${taskId}`);\n\t\t\t\tvoid stream.writeEnd();\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Unrecognized messageType ${messageType}`);\n\t\t\t}\n\t\t});\n\t\tprocess.on('disconnect', () => {\n\t\t\tprocess.exit();\n\t\t});\n\t}\n}\n\nexport class RawProcessManager extends ProcessManager<RawProcessWrapper> {\n\t/** full list of processes - parent process only */\n\tworkers: StreamWorker[] = [];\n\t/** if spawning 0 worker processes, the worker is instead stored here in the parent process */\n\tmasterWorker: StreamWorker | null = null;\n\t/** stream used only in the child process */\n\tactiveStream: Streams.ObjectReadWriteStream<string> | null = null;\n\tisCluster: boolean;\n\tspawnSubscription: ((worker: StreamWorker) => void) | null = null;\n\tunspawnSubscription: ((worker: StreamWorker) => void) | null = null;\n\t_setupChild: () => Streams.ObjectReadWriteStream<string>;\n\t/** worker ID of cluster worker - cluster child process only (0 otherwise) */\n\treadonly workerid = cluster.worker?.id || 0;\n\tenv: AnyObject | undefined;\n\n\tconstructor(options: {\n\t\tmodule: NodeJS.Module,\n\t\tsetupChild: () => Streams.ObjectReadWriteStream<string>,\n\t\tisCluster?: boolean,\n\t\tenv?: AnyObject,\n\t}) {\n\t\tsuper(options.module);\n\t\tthis.isCluster = !!options.isCluster;\n\t\tthis._setupChild = options.setupChild;\n\t\tthis.env = options.env;\n\n\t\tif (this.isCluster && this.isParentProcess) {\n\t\t\tcluster.setupMaster({\n\t\t\t\texec: this.filename,\n\t\t\t\tcwd: FS.ROOT_PATH,\n\t\t\t});\n\t\t}\n\n\t\tprocessManagers.push(this);\n\t}\n\tsubscribeSpawn(callback: (worker: StreamWorker) => void) {\n\t\tthis.spawnSubscription = callback;\n\t}\n\tsubscribeUnspawn(callback: (worker: StreamWorker) => void) {\n\t\tthis.unspawnSubscription = callback;\n\t}\n\tspawn(count?: number) {\n\t\tsuper.spawn(count);\n\t\tif (!this.workers.length) {\n\t\t\tthis.masterWorker = new StreamWorker(this._setupChild());\n\t\t\tthis.workers.push(this.masterWorker);\n\t\t\tthis.spawnSubscription?.(this.masterWorker);\n\t\t}\n\t}\n\tcreateProcess() {\n\t\tconst process = new RawProcessWrapper(this.filename, this.isCluster, this.env);\n\t\tthis.workers.push(process);\n\t\tthis.spawnSubscription?.(process);\n\t\treturn process;\n\t}\n\tdestroyProcess(process: RawProcessWrapper) {\n\t\tconst index = this.workers.indexOf(process);\n\t\tif (index >= 0) this.workers.splice(index, 1);\n\n\t\tthis.unspawnSubscription?.(process);\n\t}\n\tasync pipeStream(stream: Streams.ObjectReadStream<string>) {\n\t\tlet done = false;\n\t\twhile (!done) {\n\t\t\ttry {\n\t\t\t\tlet value;\n\t\t\t\t({ value, done } = await stream.next());\n\t\t\t\tprocess.send!(value);\n\t\t\t} catch (err: any) {\n\t\t\t\tprocess.send!(`THROW\\n${err.stack}`);\n\t\t\t}\n\t\t}\n\t}\n\tlisten() {\n\t\tif (this.isParentProcess) return;\n\n\t\tsetImmediate(() => {\n\t\t\tthis.activeStream = this._setupChild();\n\t\t\tvoid this.pipeStream(this.activeStream);\n\t\t});\n\n\t\t// child process\n\t\tprocess.on('message', (message: string) => {\n\t\t\tvoid this.activeStream!.write(message);\n\t\t});\n\t\tprocess.on('disconnect', () => {\n\t\t\tprocess.exit();\n\t\t});\n\t}\n}\n"],
"mappings": "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",
"names": ["process", "taskId", "message", "nlLoc", "stream", "messageType", "module"]
}