{"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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAqB;AACrB,0BAAoB;AAUpB,MAAM,QAAQ;AAAA,EAWV,YAAY,SAAa;AAVzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGI,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,SAAK,kBAAkB,QAAQ,mBAAmB;AAClD,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,OAAO,oBAAAA,QAAQ,IAAI,QAAQ;AAChC,SAAK,iBAAiB,oBAAAA,QAAQ,IAAI,mBAAmB,UAAU;AAC/D,SAAK,uBAAuB;AAC5B,SAAK,cAAc,oBAAAA;AACnB,SAAK,YAAY,CAAC;AAAA,EACtB;AAAA,EAGO,MAAO,cAAuB;AAAA,IACjC;AAAA,IAAgB;AAAA,IAAgB;AAAA,IAAsB;AAAA,EAC1D,IAAkB,CAAC,GAAE;AACjB,SAAK,IAAI,0BAA0B,YAAY;AAC/C,SAAK,IAAI,mBAAmB,cAAc,EAAE;AAC5C,SAAK,IAAI,kCAAkC,KAAK,qBAAqB,CAAC;AACtE,QAAG,mBAAmB,OAAW,kBAAiB;AAClD,SAAK,uBAAuB,wBAAwB;AAGpD,QAAG,KAAK,qBAAqB,KAAK,eAAgB,kBAAiB;AAAA,QAC9D,kBAAiB;AACtB,SAAK,IAAI,qCAAqC,cAAc;AAE5D,QAAG,KAAK,wBAAwB,MAAM,MAAO;AAC7C,QAAI;AACJ,aAAS,IAAI,GAAG,IAAI,gBAAgB,KAAI;AACpC,uBAAa;AAAA,QACT,oBAAAA,QAAQ,KAAK,CAAC;AAAA,QAAG,CAAC;AAAA,QAAG;AAAA,UACjB,KAAK;AAAA,YACD,UAAU;AAAA,YACV,MAAM;AAAA,YACN,gBAAgB,GAAG,cAAc;AAAA,YACjC,UAAU,KAAK,UAAU,QAAQ;AAAA,UACrC;AAAA,QACJ;AAAA,MACJ;AACA,WAAK,UAAU,KAAK,UAAU;AAAA,IAClC;AAAA,EACJ;AAAA,EAGQ,0BAAyB;AAC7B,QAAG,KAAK,wBAAwB,KAAK,gBAAgB;AACjD,aAAO;AACX,QAAG,KAAK,qBAAqB,GAAE;AAC3B,WAAK,IAAI,mDAAmD;AAC5D,aAAO;AAAA,IACX,MAAM,MAAK,IAAI,oCAAoC;AACnD,QAAG,KAAK,gBAAe;AACnB,WAAK,IAAI,2CAA2C;AACpD,aAAO;AAAA,IACX,MAAM,MAAK,IAAI,+CAA+C;AAC9D,WAAO;AAAA,EACX;AAAA,EAGA,mBAAmB;AACf,WAAO,KAAK;AAAA,EAChB;AAAA,EAGA,gBAAgB;AACZ,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,GAAG,cAAsB;AAC5B,SAAK,IAAI,0BAA0B,YAAY,EAAE;AACjD,QAAG,iBAAiB,UAAW,QAAO,KAAK,qBAAqB;AAChE,WAAO,oBAAAA,QAAQ,IAAI,SAAS;AAAA,EAChC;AAAA,EAEQ,uBAAuB;AAC3B,QAAI,KAAK,YAAY,IAAI,aAAa;AAClC,aAAO;AACX,QAAG,KAAK,YAAY,IAAI,aAAa;AACjC,aAAO;AACX,QAAI,KAAK,YAAY,IAAI,aAAa;AAClC,aAAO;AACX,WAAO;AAAA,EACX;AAAA,EAEO,YAAY;AACf,WAAO,KAAK,qBAAqB;AAAA,EACrC;AAAA,EAEQ,kBAAkB;AACtB,WAAO,oBAAAA,QAAQ,IAAI,aAAa;AAAA,EACpC;AAAA,EAEQ,IAAI,SAAiB;AACzB,SAAK,aAAa,QAAQ,IAAI,IAAI,oBAAAA,QAAQ,GAAG,KAAK,KAAK,IAAI,KAAK,OAAO,EAAE;AAAA,EAC7E;AAAA,EAEO,cAAc;AACjB,WAAO,oBAAAA,QAAQ,IAAI;AAAA,EACvB;AAEJ;AAEA,IAAO,yBAAQ;","names":["process"]}