{"version":3,"sources":["jsdelivr-header.js","/npm/@nelts/nelts@1.1.34/dist/index.js"],"names":[],"mappings":"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","file":"/npm/@nelts/nelts@1.1.34/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@nelts/nelts@1.1.34/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\nfunction __export(m) {\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst os = require(\"os\");\nconst fs = require(\"fs\");\nconst net = require(\"net\");\nconst path = require(\"path\");\nconst sticky_blalance_1 = require(\"./helper/sticky-blalance\");\nconst process_1 = require(\"@nelts/process\");\nconst messager_1 = require(\"./messager\");\n__export(require(\"./export\"));\nconst workScriptFilename = path.resolve(__dirname, './worker/index');\nconst agentScriptFilename = path.resolve(__dirname, './agent/index');\nclass Master extends process_1.Component {\n    constructor(processer, args) {\n        super(processer, args);\n        this._sticky = 'sticky:balance';\n        const base = args.base ? path.resolve(args.base || '.') : args.cwd;\n        const max = Number(args.max || os.cpus().length);\n        if (!fs.existsSync(base))\n            throw new Error('base cwd is not exists.');\n        this._base = base;\n        this._port = Number(args.port || 8080);\n        this._config = args.config;\n        this._socket = !!args.socket;\n        this._max = max;\n        this._messager = new messager_1.default(this, args.mpid);\n    }\n    get messager() {\n        return this._messager;\n    }\n    get logger() {\n        return this.processer.logger;\n    }\n    async health() {\n        const agents = Object.keys(this.processer.agents);\n        const datas = await Promise.all(agents.map(agent => this._messager.asyncSend('health', null, agent)));\n        const result = {};\n        datas.forEach((data, index) => {\n            result[agents[index]] = data || {};\n            result[agents[index]].pid = this.processer.agents[agents[index]].pid;\n        });\n        return result;\n    }\n    notice(data) {\n        const workers = this.processer.workers;\n        workers.forEach(worker => {\n            const pid = worker.pid;\n            this.messager.send('__master:notice__', data, {\n                to: pid\n            });\n            this.logger.info('[master] send', '__master:notice__', 'commander to worker', pid);\n        });\n    }\n    async componentWillCreate() {\n        if (this._socket)\n            await this.createSocketInterceptor();\n        this._forker = this.createWorkerForker(workScriptFilename, {\n            base: this._base,\n            config: this._config,\n            port: this._port,\n            socket: this._socket,\n            sticky: this._sticky,\n        });\n    }\n    async componentDidCreated() {\n        for (let i = 0; i < this._max; i++) {\n            this.logger.info('forking worker...');\n            const worker = await this._forker();\n            this.logger.info(`worker [pid:${worker.pid}] forked.\\n\\n`);\n        }\n        const firstWorker = this.processer.workers[0];\n        firstWorker.send({\n            id: -1,\n            to: firstWorker.pid,\n            from: process.pid,\n            method: '__master:done__',\n        });\n    }\n    componentCatchError(err) {\n        this.logger.error(err);\n    }\n    componentReceiveMessage(message, socket) {\n        const to = message.to;\n        switch (to) {\n            case this.messager.mpid:\n                this.masterMessageConvert(message, socket);\n                break;\n            default:\n                if (typeof to === 'string') {\n                    if (!this.processer.agents[to])\n                        throw new Error('cannot find the agent name of ' + to);\n                    this.processer.agents[to].send(message, socket);\n                }\n                else if (typeof to === 'number') {\n                    if (!this.processer.pids[to])\n                        throw new Error('cannot find the process pid of ' + to);\n                    this.processer.pids[to].send(message, socket);\n                }\n                else {\n                    throw new Error('message.to is invaild type, only can be string or number.');\n                }\n        }\n    }\n    masterMessageConvert(message, socket) {\n        if (!message.method)\n            return this.messager.parse(message.id, message.code, message.data);\n        const reply = this.createReply(message, socket);\n        switch (message.method) {\n            case 'newAgent':\n                if (this.processer.agents[message.data.name]) {\n                    reply({ code: 0, time: 0, data: this.processer.agents[message.data.name].pid });\n                }\n                else {\n                    const startCreateAgentTime = Date.now();\n                    this.createAgent(message.data.name, agentScriptFilename, Object.assign(message.data.args || {}, {\n                        base: this._base,\n                        config: this._config,\n                        file: message.data.file,\n                        name: message.data.name,\n                        mpid: this.messager.mpid,\n                    }))\n                        .then((node) => reply({ code: 0, time: Date.now() - startCreateAgentTime, data: node.pid }))\n                        .catch(e => reply({\n                        code: 1,\n                        message: (e && e.message) || `Agnet[${message.data.name}] start catch error on runtime, please see logs.`,\n                        time: Date.now() - startCreateAgentTime\n                    }));\n                }\n                break;\n            case 'health':\n                this.health().then(data => reply({ code: 0, data })).catch(e => reply({ code: 1, message: e.message }));\n                break;\n            case 'notice':\n                this.logger.info('[master] receive notice message');\n                this.notice(message.data);\n                break;\n            default: throw new Error('cannot find the master.message.convert:' + message.method);\n        }\n    }\n    createReply(message, socket) {\n        const from = this.processer.pids[message.from];\n        if (!from)\n            throw new Error('cannot find the process of ' + message.from);\n        return (data) => {\n            from.send({\n                id: message.id,\n                to: message.from,\n                from: process.pid,\n                data: data.data || data.message,\n                code: data.code,\n            }, socket);\n        };\n    }\n    createSocketInterceptor() {\n        return new Promise((resolve, reject) => {\n            const server = net.createServer({ pauseOnConnect: true }, (socket) => {\n                if (!socket.remoteAddress)\n                    return socket.destroy();\n                const hash = sticky_blalance_1.default(socket.remoteAddress);\n                const worker = this.processer.workers[hash % this.processer.workers.length];\n                if (!worker)\n                    return socket.destroy();\n                worker.send(this._sticky, socket);\n            });\n            server.listen(this._port, (err) => {\n                if (err)\n                    return reject(err);\n                this.logger.info('[master] start socket server interceptor on', this._port);\n                resolve();\n            });\n        });\n    }\n}\nexports.default = Master;\n"]}