UNPKG

slavery-js

Version:

A simple clustering app that allows you to scale an application on multiple thread, containers or machines

1 lines 6.34 kB
{"version":3,"sources":["../../src/cluster/ProcessCluster.ts"],"sourcesContent":["import { fork } from 'child_process';\nimport process from 'node:process';\n\n\ntype SpawnOptions = {\n numberOfSpawns?: number;\n allowedToSpawn?: boolean;\n spawnOnlyFromPrimary?: boolean;\n metadata?: any;\n}\n\nclass Cluster {\n numberOfProcesses: number;\n process_timeout: number;\n crash_on_error: boolean;\n thisProcess: any;\n type: string;\n processes: any[];\n allowedToSpawn: boolean;\n spawnOnlyFromPrimary: boolean;\n debugging: boolean;\n\n constructor(options:any) {\n this.numberOfProcesses = options.numberOfProcesses || null;\n this.process_timeout = options.process_timeout || null;\n this.crash_on_error = options.crash_on_error || false;\n this.debugging = options.debugging || false;\n this.type = process.env.type || 'primary';\n this.allowedToSpawn = process.env.allowedToSpawn === 'true' || false;\n this.spawnOnlyFromPrimary = false;\n this.thisProcess = process;\n this.processes = [];\n }\n\n\n public spawn( process_type: string , {\n numberOfSpawns, allowedToSpawn, spawnOnlyFromPrimary, metadata \n }: SpawnOptions = {}){\n this.log('Spawning new process ' + process_type);\n this.log(`allowedToSpawn: ${allowedToSpawn}`);\n this.log('this.amIThePrimaryProcess(): ' + this.amIThePrimaryProcess());\n if(numberOfSpawns === undefined) numberOfSpawns = 1;\n this.spawnOnlyFromPrimary = spawnOnlyFromPrimary || false;\n // this makes it so that only the primary process can pass the ability to spawn new processes\n // to another process, otherwise there will be an infinite loop\n if(this.amIThePrimaryProcess() && allowedToSpawn) allowedToSpawn = true;\n else allowedToSpawn = false;\n this.log('final passing on allowedToSpawn ' + allowedToSpawn)\n // check if the process is allowed to spawn new processes\n if(this.isProcessAllowedToSpawn() === false) return;\n let curProcess;\n for (let i = 0; i < numberOfSpawns; i++){\n curProcess = fork(\n process.argv[1], [], {\n env: {\n is_child: 'true',\n type: process_type,\n allowedToSpawn: `${allowedToSpawn}`,\n metadata: JSON.stringify(metadata)\n }\n }\n )\n this.processes.push(curProcess);\n }\n }\n\n\n private isProcessAllowedToSpawn(){\n if(this.spawnOnlyFromPrimary && this.amIChildProcess()) \n return false;\n if(this.amIThePrimaryProcess()){\n this.log('Primary process is allowed to spawn new processes');\n return true;\n }else this.log('Process is not the primary process');\n if(this.allowedToSpawn){\n this.log('Process is allowed to spawn new processes');\n return true;\n }else this.log('Process is not allowed to spawn new processes');\n return false;\n }\n\n\n get_this_process() {\n return this.thisProcess;\n }\n\n\n get_processes() {\n return this.processes;\n }\n\n public is(process_type: string) {\n this.log(`checking if is process ${process_type}`);\n if(process_type === 'primary') return this.amIThePrimaryProcess();\n return process.env.type === process_type;\n }\n\n private amIThePrimaryProcess() {\n if (this.thisProcess.env.is_child === undefined)\n return true;\n if(this.thisProcess.env.is_child === null)\n return true;\n if (this.thisProcess.env.is_child === 'false')\n return true;\n return false;\n }\n\n public isPrimary() {\n return this.amIThePrimaryProcess();\n }\n\n private amIChildProcess() {\n return process.env.is_child === 'true';\n }\n\n private log(message: string) {\n this.debugging && console.log(`[${process.pid}][${this.type}] ${message}`);\n }\n\n public getMetadata() {\n return process.env.metadata;\n }\n\n}\n\nexport default Cluster;\n"],"mappings":"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","names":["process"]}