isotropic-cluster 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cluster-primary.js +2 -0
- package/lib/cluster-worker.js +2 -2
- package/package.json +16 -94
- package/lib/cluster-master.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import _cluster from"node:cluster";import _Error from"isotropic-error";import _Initializable from"isotropic-initializable";import _logger from"isotropic-logger";import _make from"isotropic-make";import _path from"node:path";import _process from"node:process";const _moduleLogger=_logger.child({module:_path.basename(import.meta.filename,_path.extname(import.meta.filename))},!0);export default _make(_Initializable,{fork({workerCount:a=1}={}){return this._active?this._publish("fork",{workerCount:a}):this},roundRobin({tag:a=""}={}){let b,c=1/0,d=this._workerTimeByWorkerWeakMapByTag[a];d||(d=new WeakMap,this._workerTimeByWorkerWeakMapByTag[a]=d);for(const e of this._workers){const a=d.get(e);if(a)a<c&&(b=e,c=a);else{b=e;break}}return d.set(b,Date.now()),b},send({message:a,to:b=this._workers}){return Array.isArray(b)||(b=[b]),Promise.all(b.map(b=>new Promise((c,d)=>{const e="number"==typeof b?this._workerById[b]:b;e&&e.send?e.send(a,b=>{b?d(_Error({details:{message:a,workerId:e.id},error:b,message:"Error sending message to worker"})):c()}):d(_Error({details:{message:a,to:b},message:"Invalid message destination"}))})))},shutDown(){return this._publish("shutDown")},get workerById(){return this._workerById},get workers(){return this._workers},_addWorker({worker:a}){return this._publish("addWorker",{worker:a})},_destroy(...a){return this._active?(this._onceAfter("shutDownComplete","_destroy"),void this.shutDown()):void(this._active=void 0,Object.keys(this._clusterListenerByEventName).forEach(a=>{_cluster.removeListener(a,this._clusterListenerByEventName[a])}),this._clusterListenerByEventName=void 0,this._workerTimeByWorkerWeakMapByTag=void 0,Reflect.apply(_Initializable.prototype._destroy,this,a))},_eventAddWorker({data:{worker:a}}){this._workerById[a.id]=a,this._workers=Object.values(this._workerById)},_eventFork({data:{workerCount:a}}){for(;0<a;)_moduleLogger.info("Starting a new worker"),_cluster.fork(),a-=1},_eventRemoveWorker({data:{worker:a}}){delete this._workerById[a.id],this._workers=Object.values(this._workerById)},_eventShutDown(){return _moduleLogger.info("Shutting down workers"),this._active=!1,_cluster.disconnect(()=>{this._publish("shutDownComplete")}),this},_eventShutDownComplete(){_moduleLogger.info("Worker shut down complete")},_eventWorkerDisconnect({data:{worker:a}}){_moduleLogger.info({workerId:a.id},"Worker disconnected"),this._removeWorker({worker:a})},_eventWorkerError({data:{error:a,worker:b}}){_moduleLogger.fatal({error:_Error({details:{workerId:b.id},error:a,message:"Worker error"}),workerId:b.id},"Worker error"),this._removeWorker({worker:b})},_eventWorkerExit({data:{code:a,signal:b,worker:c}}){c.exitedAfterDisconnect?_moduleLogger.info({code:a,signal:b,workerId:c.id},"Worker exited voluntarily"):a?_moduleLogger.fatal({code:a,signal:b,workerId:c.id},"Worker died unexpectedly"):_moduleLogger.error({code:a,signal:b,workerId:c.id},"Worker died"),this._removeWorker({worker:c}),this._active&&(_moduleLogger.info("Replacing dead worker"),this.fork())},_eventWorkerFork({data:{worker:a}}){_moduleLogger.info({workerId:a.id},"Starting new worker"),a.on("error",b=>{this._publish("workerError",{error:_Error({details:{worker:a},error:b,message:"Error in worker"}),worker:a})})},_eventWorkerListening({data:{address:a,worker:b}}){_moduleLogger.info({address:a.address,port:a.port,workerId:b.id},"Worker is listening")},_eventWorkerMessage(a){if(a.data.message&&a.data.message.type){const b=this[`_eventWorkerMessage_${a.data.message.type}`];"function"==typeof b&&Reflect.apply(b,this,[a])}},_eventWorkerOnline({data:{worker:a}}){_moduleLogger.info({workerId:a.id},"Worker is now online");const b=c=>{"ready"===c&&(a.removeListener("message",b),this._publish("workerReady",{worker:a}))};a.on("message",b)},_eventWorkerReady({data:{worker:a}}){_moduleLogger.info({workerId:a.id},"Worker is ready to work"),this._addWorker({worker:a})},_init(...a){return this._active=!0,this._clusterListenerByEventName={disconnect:a=>{this._publish("workerDisconnect",{worker:a})},exit:(a,b,c)=>{this._publish("workerExit",{code:b,signal:c,worker:a})},fork:a=>{this._publish("workerFork",{worker:a})},listening:(a,b)=>{this._publish("workerListening",{address:b,worker:a})},message:(a,b,c)=>{this._publish("workerMessage",{handle:c,message:b,worker:a})},online:a=>{this._publish("workerOnline",{worker:a})}},this._workerById=Object.create(null),this._workers=[],this._workerTimeByWorkerWeakMapByTag=Object.create(null),Reflect.apply(_Initializable.prototype._init,this,a)},_initialize(...a){_moduleLogger.info("Initializing primary");const[{workerArgs:b,workerScript:c,workerSilent:d,workerStdio:e}={}]=a;_cluster.setupPrimary({args:"undefined"==typeof b?_process.argv.slice(2):b,exec:"undefined"==typeof c?_process.argv[1]:c,silent:"undefined"!=typeof d&&d,stdio:e}),Object.keys(this._clusterListenerByEventName).forEach(a=>{_cluster.on(a,this._clusterListenerByEventName[a])})},_removeWorker({worker:a}){return a.id in this._workerById&&this._publish("removeWorker",{worker:a}),this}},{_pubsub:{addWorker:{allowPublicPublish:!1,defaultFunction:"_eventAddWorker"},fork:{allowPublicPublish:!1,defaultFunction:"_eventFork"},removeWorker:{allowPublicPublish:!1,defaultFunction:"_eventRemoveWorker"},shutDown:{allowPublicPublish:!1,completeOnce:!0,defaultFunction:"_eventShutDown"},shutDownComplete:{allowPublicPublish:!1,defaultFunction:"_eventShutDownComplete",publishOnce:!0},workerDisconnect:{allowPublicPublish:!1,defaultFunction:"_eventWorkerDisconnect"},workerError:{allowPublicPublish:!1,defaultFunction:"_eventWorkerError"},workerExit:{allowPublicPublish:!1,defaultFunction:"_eventWorkerExit"},workerFork:{allowPublicPublish:!1,defaultFunction:"_eventWorkerFork"},workerListening:{allowPublicPublish:!1,defaultFunction:"_eventWorkerListening"},workerMessage:{allowPublicPublish:!1,defaultFunction:"_eventWorkerMessage"},workerOnline:{allowPublicPublish:!1,defaultFunction:"_eventWorkerOnline"},workerReady:{allowPublicPublish:!1,defaultFunction:"_eventWorkerReady"}}});
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2x1c3RlciIsIl9FcnJvciIsIl9Jbml0aWFsaXphYmxlIiwiX2xvZ2dlciIsIl9tYWtlIiwiX3BhdGgiLCJfcHJvY2VzcyIsIl9tb2R1bGVMb2dnZXIiLCJjaGlsZCIsIm1vZHVsZSIsImJhc2VuYW1lIiwiaW1wb3J0IiwibWV0YSIsImZpbGVuYW1lIiwiZXh0bmFtZSIsImZvcmsiLCJ3b3JrZXJDb3VudCIsIl9hY3RpdmUiLCJfcHVibGlzaCIsInJvdW5kUm9iaW4iLCJ0YWciLCJvbGRlc3RXb3JrZXIiLCJvbGRlc3RXb3JrZXJUaW1lIiwid29ya2VyVGltZUJ5V29ya2VyV2Vha01hcCIsIl93b3JrZXJUaW1lQnlXb3JrZXJXZWFrTWFwQnlUYWciLCJXZWFrTWFwIiwid29ya2VyIiwiX3dvcmtlcnMiLCJ3b3JrZXJUaW1lIiwiZ2V0Iiwic2V0IiwiRGF0ZSIsIm5vdyIsInNlbmQiLCJtZXNzYWdlIiwidG8iLCJBcnJheSIsImlzQXJyYXkiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicmVzb2x2ZSIsInJlamVjdCIsIl93b3JrZXJCeUlkIiwiZXJyb3IiLCJkZXRhaWxzIiwid29ya2VySWQiLCJpZCIsInNodXREb3duIiwid29ya2VyQnlJZCIsIndvcmtlcnMiLCJfYWRkV29ya2VyIiwiX2Rlc3Ryb3kiLCJhcmdzIiwiX29uY2VBZnRlciIsIk9iamVjdCIsImtleXMiLCJfY2x1c3Rlckxpc3RlbmVyQnlFdmVudE5hbWUiLCJmb3JFYWNoIiwiZXZlbnROYW1lIiwicmVtb3ZlTGlzdGVuZXIiLCJSZWZsZWN0IiwiYXBwbHkiLCJwcm90b3R5cGUiLCJfZXZlbnRBZGRXb3JrZXIiLCJkYXRhIiwidmFsdWVzIiwiX2V2ZW50Rm9yayIsImluZm8iLCJfZXZlbnRSZW1vdmVXb3JrZXIiLCJfZXZlbnRTaHV0RG93biIsImRpc2Nvbm5lY3QiLCJfZXZlbnRTaHV0RG93bkNvbXBsZXRlIiwiX2V2ZW50V29ya2VyRGlzY29ubmVjdCIsIl9yZW1vdmVXb3JrZXIiLCJfZXZlbnRXb3JrZXJFcnJvciIsImZhdGFsIiwiX2V2ZW50V29ya2VyRXhpdCIsImNvZGUiLCJzaWduYWwiLCJleGl0ZWRBZnRlckRpc2Nvbm5lY3QiLCJfZXZlbnRXb3JrZXJGb3JrIiwib24iLCJfZXZlbnRXb3JrZXJMaXN0ZW5pbmciLCJhZGRyZXNzIiwicG9ydCIsIl9ldmVudFdvcmtlck1lc3NhZ2UiLCJldmVudCIsInR5cGUiLCJtZXRob2QiLCJfZXZlbnRXb3JrZXJPbmxpbmUiLCJsaXN0ZW5lciIsIl9ldmVudFdvcmtlclJlYWR5IiwiX2luaXQiLCJleGl0IiwibGlzdGVuaW5nIiwiaGFuZGxlIiwib25saW5lIiwiY3JlYXRlIiwiX2luaXRpYWxpemUiLCJ3b3JrZXJBcmdzIiwid29ya2VyU2NyaXB0Iiwid29ya2VyU2lsZW50Iiwid29ya2VyU3RkaW8iLCJzZXR1cFByaW1hcnkiLCJhcmd2Iiwic2xpY2UiLCJleGVjIiwic2lsZW50Iiwic3RkaW8iLCJfcHVic3ViIiwiYWRkV29ya2VyIiwiYWxsb3dQdWJsaWNQdWJsaXNoIiwiZGVmYXVsdEZ1bmN0aW9uIiwicmVtb3ZlV29ya2VyIiwiY29tcGxldGVPbmNlIiwic2h1dERvd25Db21wbGV0ZSIsInB1Ymxpc2hPbmNlIiwid29ya2VyRGlzY29ubmVjdCIsIndvcmtlckVycm9yIiwid29ya2VyRXhpdCIsIndvcmtlckZvcmsiLCJ3b3JrZXJMaXN0ZW5pbmciLCJ3b3JrZXJNZXNzYWdlIiwid29ya2VyT25saW5lIiwid29ya2VyUmVhZHkiXSwic291cmNlcyI6WyIuLi9qcy9jbHVzdGVyLXByaW1hcnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9jbHVzdGVyIGZyb20gJ25vZGU6Y2x1c3Rlcic7XG5pbXBvcnQgX0Vycm9yIGZyb20gJ2lzb3Ryb3BpYy1lcnJvcic7XG5pbXBvcnQgX0luaXRpYWxpemFibGUgZnJvbSAnaXNvdHJvcGljLWluaXRpYWxpemFibGUnO1xuaW1wb3J0IF9sb2dnZXIgZnJvbSAnaXNvdHJvcGljLWxvZ2dlcic7XG5pbXBvcnQgX21ha2UgZnJvbSAnaXNvdHJvcGljLW1ha2UnO1xuaW1wb3J0IF9wYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgX3Byb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuY29uc3QgX21vZHVsZUxvZ2dlciA9IF9sb2dnZXIuY2hpbGQoe1xuICAgIG1vZHVsZTogX3BhdGguYmFzZW5hbWUoaW1wb3J0Lm1ldGEuZmlsZW5hbWUsIF9wYXRoLmV4dG5hbWUoaW1wb3J0Lm1ldGEuZmlsZW5hbWUpKVxufSwgdHJ1ZSk7XG5cbmV4cG9ydCBkZWZhdWx0IF9tYWtlKF9Jbml0aWFsaXphYmxlLCB7XG4gICAgZm9yayAoe1xuICAgICAgICB3b3JrZXJDb3VudCA9IDFcbiAgICB9ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZSA/XG4gICAgICAgICAgICB0aGlzLl9wdWJsaXNoKCdmb3JrJywge1xuICAgICAgICAgICAgICAgIHdvcmtlckNvdW50XG4gICAgICAgICAgICB9KSA6XG4gICAgICAgICAgICB0aGlzO1xuICAgIH0sXG4gICAgcm91bmRSb2JpbiAoe1xuICAgICAgICB0YWcgPSAnJ1xuICAgIH0gPSB7fSkge1xuICAgICAgICBsZXQgb2xkZXN0V29ya2VyLFxuICAgICAgICAgICAgb2xkZXN0V29ya2VyVGltZSA9IEluZmluaXR5LFxuICAgICAgICAgICAgd29ya2VyVGltZUJ5V29ya2VyV2Vha01hcCA9IHRoaXMuX3dvcmtlclRpbWVCeVdvcmtlcldlYWtNYXBCeVRhZ1t0YWddO1xuXG4gICAgICAgIGlmICghd29ya2VyVGltZUJ5V29ya2VyV2Vha01hcCkge1xuICAgICAgICAgICAgd29ya2VyVGltZUJ5V29ya2VyV2Vha01hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXJUaW1lQnlXb3JrZXJXZWFrTWFwQnlUYWdbdGFnXSA9IHdvcmtlclRpbWVCeVdvcmtlcldlYWtNYXA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB0aGlzLl93b3JrZXJzKSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJUaW1lID0gd29ya2VyVGltZUJ5V29ya2VyV2Vha01hcC5nZXQod29ya2VyKTtcblxuICAgICAgICAgICAgaWYgKHdvcmtlclRpbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAod29ya2VyVGltZSA8IG9sZGVzdFdvcmtlclRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkZXN0V29ya2VyID0gd29ya2VyO1xuICAgICAgICAgICAgICAgICAgICBvbGRlc3RXb3JrZXJUaW1lID0gd29ya2VyVGltZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9sZGVzdFdvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdvcmtlclRpbWVCeVdvcmtlcldlYWtNYXAuc2V0KG9sZGVzdFdvcmtlciwgRGF0ZS5ub3coKSk7XG4gICAgICAgIHJldHVybiBvbGRlc3RXb3JrZXI7XG4gICAgfSxcbiAgICBzZW5kICh7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHRvID0gdGhpcy5fd29ya2Vyc1xuICAgIH0pIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRvKSkge1xuICAgICAgICAgICAgdG8gPSBbXG4gICAgICAgICAgICAgICAgdG9cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodG8ubWFwKHRvID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IHR5cGVvZiB0byA9PT0gJ251bWJlcicgP1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtlckJ5SWRbdG9dIDpcbiAgICAgICAgICAgICAgICB0bztcblxuICAgICAgICAgICAgaWYgKHdvcmtlciAmJiB3b3JrZXIuc2VuZCkge1xuICAgICAgICAgICAgICAgIHdvcmtlci5zZW5kKG1lc3NhZ2UsIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoX0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcklkOiB3b3JrZXIuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFcnJvciBzZW5kaW5nIG1lc3NhZ2UgdG8gd29ya2VyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChfRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgbWVzc2FnZSBkZXN0aW5hdGlvbidcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKSk7XG4gICAgfSxcbiAgICBzaHV0RG93biAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdWJsaXNoKCdzaHV0RG93bicpO1xuICAgIH0sXG4gICAgZ2V0IHdvcmtlckJ5SWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2VyQnlJZDtcbiAgICB9LFxuICAgIGdldCB3b3JrZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtlcnM7XG4gICAgfSxcbiAgICBfYWRkV29ya2VyICh7XG4gICAgICAgIHdvcmtlclxuICAgIH0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1Ymxpc2goJ2FkZFdvcmtlcicsIHtcbiAgICAgICAgICAgIHdvcmtlclxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIF9kZXN0cm95ICguLi5hcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX29uY2VBZnRlcignc2h1dERvd25Db21wbGV0ZScsICdfZGVzdHJveScpO1xuICAgICAgICAgICAgdGhpcy5zaHV0RG93bigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdm9pZCBudWxsO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX2NsdXN0ZXJMaXN0ZW5lckJ5RXZlbnROYW1lKS5mb3JFYWNoKGV2ZW50TmFtZSA9PiB7XG4gICAgICAgICAgICBfY2x1c3Rlci5yZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIHRoaXMuX2NsdXN0ZXJMaXN0ZW5lckJ5RXZlbnROYW1lW2V2ZW50TmFtZV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jbHVzdGVyTGlzdGVuZXJCeUV2ZW50TmFtZSA9IHZvaWQgbnVsbDtcblxuICAgICAgICB0aGlzLl93b3JrZXJUaW1lQnlXb3JrZXJXZWFrTWFwQnlUYWcgPSB2b2lkIG51bGw7XG5cbiAgICAgICAgUmVmbGVjdC5hcHBseShfSW5pdGlhbGl6YWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3ksIHRoaXMsIGFyZ3MpO1xuICAgIH0sXG4gICAgX2V2ZW50QWRkV29ya2VyICh7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHdvcmtlclxuICAgICAgICB9XG4gICAgfSkge1xuICAgICAgICB0aGlzLl93b3JrZXJCeUlkW3dvcmtlci5pZF0gPSB3b3JrZXI7XG4gICAgICAgIHRoaXMuX3dvcmtlcnMgPSBPYmplY3QudmFsdWVzKHRoaXMuX3dvcmtlckJ5SWQpO1xuICAgIH0sXG4gICAgX2V2ZW50Rm9yayAoe1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB3b3JrZXJDb3VudFxuICAgICAgICB9XG4gICAgfSkge1xuICAgICAgICB3aGlsZSAod29ya2VyQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBfbW9kdWxlTG9nZ2VyLmluZm8oJ1N0YXJ0aW5nIGEgbmV3IHdvcmtlcicpO1xuXG4gICAgICAgICAgICBfY2x1c3Rlci5mb3JrKCk7XG4gICAgICAgICAgICB3b3JrZXJDb3VudCAtPSAxO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBfZXZlbnRSZW1vdmVXb3JrZXIgKHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH1cbiAgICB9KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl93b3JrZXJCeUlkW3dvcmtlci5pZF07XG4gICAgICAgIHRoaXMuX3dvcmtlcnMgPSBPYmplY3QudmFsdWVzKHRoaXMuX3dvcmtlckJ5SWQpO1xuICAgIH0sXG4gICAgX2V2ZW50U2h1dERvd24gKCkge1xuICAgICAgICBfbW9kdWxlTG9nZ2VyLmluZm8oJ1NodXR0aW5nIGRvd24gd29ya2VycycpO1xuXG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIF9jbHVzdGVyLmRpc2Nvbm5lY3QoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcHVibGlzaCgnc2h1dERvd25Db21wbGV0ZScpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIF9ldmVudFNodXREb3duQ29tcGxldGUgKCkge1xuICAgICAgICBfbW9kdWxlTG9nZ2VyLmluZm8oJ1dvcmtlciBzaHV0IGRvd24gY29tcGxldGUnKTtcbiAgICB9LFxuICAgIF9ldmVudFdvcmtlckRpc2Nvbm5lY3QgKHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH1cbiAgICB9KSB7XG4gICAgICAgIF9tb2R1bGVMb2dnZXIuaW5mbyh7XG4gICAgICAgICAgICB3b3JrZXJJZDogd29ya2VyLmlkXG4gICAgICAgIH0sICdXb3JrZXIgZGlzY29ubmVjdGVkJyk7XG5cbiAgICAgICAgdGhpcy5fcmVtb3ZlV29ya2VyKHtcbiAgICAgICAgICAgIHdvcmtlclxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIF9ldmVudFdvcmtlckVycm9yICh7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH1cbiAgICB9KSB7XG4gICAgICAgIF9tb2R1bGVMb2dnZXIuZmF0YWwoe1xuICAgICAgICAgICAgZXJyb3I6IF9FcnJvcih7XG4gICAgICAgICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXJJZDogd29ya2VyLmlkXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnV29ya2VyIGVycm9yJ1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB3b3JrZXJJZDogd29ya2VyLmlkXG4gICAgICAgIH0sICdXb3JrZXIgZXJyb3InKTtcblxuICAgICAgICB0aGlzLl9yZW1vdmVXb3JrZXIoe1xuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgX2V2ZW50V29ya2VyRXhpdCAoe1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH1cbiAgICB9KSB7XG4gICAgICAgIGlmICh3b3JrZXIuZXhpdGVkQWZ0ZXJEaXNjb25uZWN0KSB7XG4gICAgICAgICAgICBfbW9kdWxlTG9nZ2VyLmluZm8oe1xuICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgICAgIHdvcmtlcklkOiB3b3JrZXIuaWRcbiAgICAgICAgICAgIH0sICdXb3JrZXIgZXhpdGVkIHZvbHVudGFyaWx5Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSkge1xuICAgICAgICAgICAgX21vZHVsZUxvZ2dlci5mYXRhbCh7XG4gICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgICAgICAgd29ya2VySWQ6IHdvcmtlci5pZFxuICAgICAgICAgICAgfSwgJ1dvcmtlciBkaWVkIHVuZXhwZWN0ZWRseScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX21vZHVsZUxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgICAgICAgd29ya2VySWQ6IHdvcmtlci5pZFxuICAgICAgICAgICAgfSwgJ1dvcmtlciBkaWVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZW1vdmVXb3JrZXIoe1xuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgICAgIF9tb2R1bGVMb2dnZXIuaW5mbygnUmVwbGFjaW5nIGRlYWQgd29ya2VyJyk7XG5cbiAgICAgICAgICAgIHRoaXMuZm9yaygpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBfZXZlbnRXb3JrZXJGb3JrICh7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHdvcmtlclxuICAgICAgICB9XG4gICAgfSkge1xuICAgICAgICBfbW9kdWxlTG9nZ2VyLmluZm8oe1xuICAgICAgICAgICAgd29ya2VySWQ6IHdvcmtlci5pZFxuICAgICAgICB9LCAnU3RhcnRpbmcgbmV3IHdvcmtlcicpO1xuXG4gICAgICAgIHdvcmtlci5vbignZXJyb3InLCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9wdWJsaXNoKCd3b3JrZXJFcnJvcicsIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogX0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRXJyb3IgaW4gd29ya2VyJ1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHdvcmtlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgX2V2ZW50V29ya2VyTGlzdGVuaW5nICh7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICB3b3JrZXJcbiAgICAgICAgfVxuICAgIH0pIHtcbiAgICAgICAgX21vZHVsZUxvZ2dlci5pbmZvKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3MuYWRkcmVzcyxcbiAgICAgICAgICAgIHBvcnQ6IGFkZHJlc3MucG9ydCxcbiAgICAgICAgICAgIHdvcmtlcklkOiB3b3JrZXIuaWRcbiAgICAgICAgfSwgJ1dvcmtlciBpcyBsaXN0ZW5pbmcnKTtcbiAgICB9LFxuICAgIF9ldmVudFdvcmtlck1lc3NhZ2UgKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5kYXRhLm1lc3NhZ2UgJiYgZXZlbnQuZGF0YS5tZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IHRoaXNbYF9ldmVudFdvcmtlck1lc3NhZ2VfJHtldmVudC5kYXRhLm1lc3NhZ2UudHlwZX1gXTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBSZWZsZWN0LmFwcGx5KG1ldGhvZCwgdGhpcywgW1xuICAgICAgICAgICAgICAgICAgICBldmVudFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBfZXZlbnRXb3JrZXJPbmxpbmUgKHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH1cbiAgICB9KSB7XG4gICAgICAgIF9tb2R1bGVMb2dnZXIuaW5mbyh7XG4gICAgICAgICAgICB3b3JrZXJJZDogd29ya2VyLmlkXG4gICAgICAgIH0sICdXb3JrZXIgaXMgbm93IG9ubGluZScpO1xuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gbWVzc2FnZSA9PiB7XG4gICAgICAgICAgICBpZiAobWVzc2FnZSA9PT0gJ3JlYWR5Jykge1xuICAgICAgICAgICAgICAgIHdvcmtlci5yZW1vdmVMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2goJ3dvcmtlclJlYWR5Jywge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB3b3JrZXIub24oJ21lc3NhZ2UnLCBsaXN0ZW5lcik7XG4gICAgfSxcbiAgICBfZXZlbnRXb3JrZXJSZWFkeSAoe1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB3b3JrZXJcbiAgICAgICAgfVxuICAgIH0pIHtcbiAgICAgICAgX21vZHVsZUxvZ2dlci5pbmZvKHtcbiAgICAgICAgICAgIHdvcmtlcklkOiB3b3JrZXIuaWRcbiAgICAgICAgfSwgJ1dvcmtlciBpcyByZWFkeSB0byB3b3JrJyk7XG5cbiAgICAgICAgdGhpcy5fYWRkV29ya2VyKHtcbiAgICAgICAgICAgIHdvcmtlclxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIF9pbml0ICguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fY2x1c3Rlckxpc3RlbmVyQnlFdmVudE5hbWUgPSB7XG4gICAgICAgICAgICBkaXNjb25uZWN0OiB3b3JrZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2goJ3dvcmtlckRpc2Nvbm5lY3QnLCB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4aXQ6ICh3b3JrZXIsIGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2goJ3dvcmtlckV4aXQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9yazogd29ya2VyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wdWJsaXNoKCd3b3JrZXJGb3JrJywge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsaXN0ZW5pbmc6ICh3b3JrZXIsIGFkZHJlc3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wdWJsaXNoKCd3b3JrZXJMaXN0ZW5pbmcnLCB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICh3b3JrZXIsIG1lc3NhZ2UsIGhhbmRsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2goJ3dvcmtlck1lc3NhZ2UnLCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25saW5lOiB3b3JrZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2goJ3dvcmtlck9ubGluZScsIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fd29ya2VyQnlJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgdGhpcy5fd29ya2VycyA9IFtdO1xuXG4gICAgICAgIHRoaXMuX3dvcmtlclRpbWVCeVdvcmtlcldlYWtNYXBCeVRhZyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoX0luaXRpYWxpemFibGUucHJvdG90eXBlLl9pbml0LCB0aGlzLCBhcmdzKTtcbiAgICB9LFxuICAgIF9pbml0aWFsaXplICguLi5hcmdzKSB7XG4gICAgICAgIF9tb2R1bGVMb2dnZXIuaW5mbygnSW5pdGlhbGl6aW5nIHByaW1hcnknKTtcblxuICAgICAgICBjb25zdCBbe1xuICAgICAgICAgICAgd29ya2VyQXJncyxcbiAgICAgICAgICAgIHdvcmtlclNjcmlwdCxcbiAgICAgICAgICAgIHdvcmtlclNpbGVudCxcbiAgICAgICAgICAgIHdvcmtlclN0ZGlvXG4gICAgICAgIH0gPSB7fV0gPSBhcmdzO1xuXG4gICAgICAgIF9jbHVzdGVyLnNldHVwUHJpbWFyeSh7XG4gICAgICAgICAgICBhcmdzOiB0eXBlb2Ygd29ya2VyQXJncyA9PT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgICAgIF9wcm9jZXNzLmFyZ3Yuc2xpY2UoMikgOlxuICAgICAgICAgICAgICAgIHdvcmtlckFyZ3MsXG4gICAgICAgICAgICBleGVjOiB0eXBlb2Ygd29ya2VyU2NyaXB0ID09PSAndW5kZWZpbmVkJyA/XG4gICAgICAgICAgICAgICAgX3Byb2Nlc3MuYXJndlsxXSA6XG4gICAgICAgICAgICAgICAgd29ya2VyU2NyaXB0LFxuICAgICAgICAgICAgc2lsZW50OiB0eXBlb2Ygd29ya2VyU2lsZW50ID09PSAndW5kZWZpbmVkJyA/XG4gICAgICAgICAgICAgICAgZmFsc2UgOlxuICAgICAgICAgICAgICAgIHdvcmtlclNpbGVudCxcbiAgICAgICAgICAgIHN0ZGlvOiB3b3JrZXJTdGRpb1xuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9jbHVzdGVyTGlzdGVuZXJCeUV2ZW50TmFtZSkuZm9yRWFjaChldmVudE5hbWUgPT4ge1xuICAgICAgICAgICAgX2NsdXN0ZXIub24oZXZlbnROYW1lLCB0aGlzLl9jbHVzdGVyTGlzdGVuZXJCeUV2ZW50TmFtZVtldmVudE5hbWVdKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBfcmVtb3ZlV29ya2VyICh7XG4gICAgICAgIHdvcmtlclxuICAgIH0pIHtcbiAgICAgICAgaWYgKHdvcmtlci5pZCBpbiB0aGlzLl93b3JrZXJCeUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9wdWJsaXNoKCdyZW1vdmVXb3JrZXInLCB7XG4gICAgICAgICAgICAgICAgd29ya2VyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn0sIHtcbiAgICBfcHVic3ViOiB7XG4gICAgICAgIGFkZFdvcmtlcjoge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNQdWJsaXNoOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbjogJ19ldmVudEFkZFdvcmtlcidcbiAgICAgICAgfSxcbiAgICAgICAgZm9yazoge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNQdWJsaXNoOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbjogJ19ldmVudEZvcmsnXG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZVdvcmtlcjoge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNQdWJsaXNoOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbjogJ19ldmVudFJlbW92ZVdvcmtlcidcbiAgICAgICAgfSxcbiAgICAgICAgc2h1dERvd246IHtcbiAgICAgICAgICAgIGFsbG93UHVibGljUHVibGlzaDogZmFsc2UsXG4gICAgICAgICAgICBjb21wbGV0ZU9uY2U6IHRydWUsXG4gICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb246ICdfZXZlbnRTaHV0RG93bidcbiAgICAgICAgfSxcbiAgICAgICAgc2h1dERvd25Db21wbGV0ZToge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNQdWJsaXNoOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbjogJ19ldmVudFNodXREb3duQ29tcGxldGUnLFxuICAgICAgICAgICAgcHVibGlzaE9uY2U6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgd29ya2VyRGlzY29ubmVjdDoge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNQdWJsaXNoOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbjogJ19ldmVudFdvcmtlckRpc2Nvbm5lY3QnXG4gICAgICAgIH0sXG4gICAgICAgIHdvcmtlckVycm9yOiB7XG4gICAgICAgICAgICBhbGxvd1B1YmxpY1B1Ymxpc2g6IGZhbHNlLFxuICAgICAgICAgICAgZGVmYXVsdEZ1bmN0aW9uOiAnX2V2ZW50V29ya2VyRXJyb3InXG4gICAgICAgIH0sXG4gICAgICAgIHdvcmtlckV4aXQ6IHtcbiAgICAgICAgICAgIGFsbG93UHVibGljUHVibGlzaDogZmFsc2UsXG4gICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb246ICdfZXZlbnRXb3JrZXJFeGl0J1xuICAgICAgICB9LFxuICAgICAgICB3b3JrZXJGb3JrOiB7XG4gICAgICAgICAgICBhbGxvd1B1YmxpY1B1Ymxpc2g6IGZhbHNlLFxuICAgICAgICAgICAgZGVmYXVsdEZ1bmN0aW9uOiAnX2V2ZW50V29ya2VyRm9yaydcbiAgICAgICAgfSxcbiAgICAgICAgd29ya2VyTGlzdGVuaW5nOiB7XG4gICAgICAgICAgICBhbGxvd1B1YmxpY1B1Ymxpc2g6IGZhbHNlLFxuICAgICAgICAgICAgZGVmYXVsdEZ1bmN0aW9uOiAnX2V2ZW50V29ya2VyTGlzdGVuaW5nJ1xuICAgICAgICB9LFxuICAgICAgICB3b3JrZXJNZXNzYWdlOiB7XG4gICAgICAgICAgICBhbGxvd1B1YmxpY1B1Ymxpc2g6IGZhbHNlLFxuICAgICAgICAgICAgZGVmYXVsdEZ1bmN0aW9uOiAnX2V2ZW50V29ya2VyTWVzc2FnZSdcbiAgICAgICAgfSxcbiAgICAgICAgd29ya2VyT25saW5lOiB7XG4gICAgICAgICAgICBhbGxvd1B1YmxpY1B1Ymxpc2g6IGZhbHNlLFxuICAgICAgICAgICAgZGVmYXVsdEZ1bmN0aW9uOiAnX2V2ZW50V29ya2VyT25saW5lJ1xuICAgICAgICB9LFxuICAgICAgICB3b3JrZXJSZWFkeToge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNQdWJsaXNoOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbjogJ19ldmVudFdvcmtlclJlYWR5J1xuICAgICAgICB9XG4gICAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBLE1BQU8sQ0FBQUEsUUFBUSxLQUFNLGNBQWMsQ0FDbkMsTUFBTyxDQUFBQyxNQUFNLEtBQU0saUJBQWlCLENBQ3BDLE1BQU8sQ0FBQUMsY0FBYyxLQUFNLHlCQUF5QixDQUNwRCxNQUFPLENBQUFDLE9BQU8sS0FBTSxrQkFBa0IsQ0FDdEMsTUFBTyxD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
|
package/lib/cluster-worker.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
1
|
+
import _cluster from"node:cluster";import _Error from"isotropic-error";import _Initializable from"isotropic-initializable";import _later from"isotropic-later";import _logger from"isotropic-logger";import _make from"isotropic-make";import _path from"node:path";import _process from"node:process";const _workerId=_cluster.worker&&_cluster.worker.id,_moduleLogger=_logger.child({module:_path.basename(import.meta.filename,_path.extname(import.meta.filename)),workerId:_workerId});export default _make(_Initializable,{send({message:a}){return new Promise((b,c)=>{_process.send(a,d=>{d?c(_Error({details:{message:a},error:d,message:"Error sending message to primary"})):b()})})},_destroy(...a){Object.keys(this._processEvents).forEach(a=>{_process.removeListener(a,this._processEvents[a])}),this._processEvents=void 0,Reflect.apply(_Initializable.prototype._destroy,this,a)},_destroyComplete({timeout:a=6765}={}){_cluster.worker&&(_cluster.worker.disconnect(),_later(a,()=>{_cluster.worker.kill()}))},_eventPrimaryDisconnect(){_moduleLogger.info("Primary disconnected")},_eventPrimaryMessage(a){if(a.data.message&&a.data.message.type){const b=this[`_eventPrimaryMessage_${a.data.message.type}`];"function"==typeof b&&Reflect.apply(b,this,[a])}},_init(...a){return this._processEvents={disconnect:()=>{this._publish("primaryDisconnect")},message:(a,b)=>{this._publish("primaryMessage",{handle:b,message:a})}},Reflect.apply(_Initializable.prototype._init,this,a)},_initialize(){if(_cluster.isWorker)_moduleLogger.info("Initializing worker"),Object.keys(this._processEvents).forEach(a=>{_process.on(a,this._processEvents[a])});else throw _Error({message:"Cluster worker can not initialize in non-worker process"})},_initializeComplete(){_process.send("ready")}},{get worker(){return _cluster.worker},get workerId(){return _workerId},_pubsub:{primaryDisconnect:{allowPublicPublish:!1,defaultFunction:"_eventPrimaryDisconnect"},primaryMessage:{allowPublicPublish:!1,defaultFunction:"_eventPrimaryMessage"}}});
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2x1c3RlciIsIl9FcnJvciIsIl9Jbml0aWFsaXphYmxlIiwiX2xhdGVyIiwiX2xvZ2dlciIsIl9tYWtlIiwiX3BhdGgiLCJfcHJvY2VzcyIsIl93b3JrZXJJZCIsIndvcmtlciIsImlkIiwiX21vZHVsZUxvZ2dlciIsImNoaWxkIiwibW9kdWxlIiwiYmFzZW5hbWUiLCJpbXBvcnQiLCJtZXRhIiwiZmlsZW5hbWUiLCJleHRuYW1lIiwid29ya2VySWQiLCJzZW5kIiwibWVzc2FnZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZXJyb3IiLCJkZXRhaWxzIiwiX2Rlc3Ryb3kiLCJhcmdzIiwiT2JqZWN0Iiwia2V5cyIsIl9wcm9jZXNzRXZlbnRzIiwiZm9yRWFjaCIsImV2ZW50TmFtZSIsInJlbW92ZUxpc3RlbmVyIiwiUmVmbGVjdCIsImFwcGx5IiwicHJvdG90eXBlIiwiX2Rlc3Ryb3lDb21wbGV0ZSIsInRpbWVvdXQiLCJkaXNjb25uZWN0Iiwia2lsbCIsIl9ldmVudFByaW1hcnlEaXNjb25uZWN0IiwiaW5mbyIsIl9ldmVudFByaW1hcnlNZXNzYWdlIiwiZXZlbnQiLCJkYXRhIiwidHlwZSIsIm1ldGhvZCIsIl9pbml0IiwiX3B1Ymxpc2giLCJoYW5kbGUiLCJfaW5pdGlhbGl6ZSIsImlzV29ya2VyIiwib24iLCJfaW5pdGlhbGl6ZUNvbXBsZXRlIiwiX3B1YnN1YiIsInByaW1hcnlEaXNjb25uZWN0IiwiYWxsb3dQdWJsaWNQdWJsaXNoIiwiZGVmYXVsdEZ1bmN0aW9uIiwicHJpbWFyeU1lc3NhZ2UiXSwic291cmNlcyI6WyIuLi9qcy9jbHVzdGVyLXdvcmtlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2NsdXN0ZXIgZnJvbSAnbm9kZTpjbHVzdGVyJztcbmltcG9ydCBfRXJyb3IgZnJvbSAnaXNvdHJvcGljLWVycm9yJztcbmltcG9ydCBfSW5pdGlhbGl6YWJsZSBmcm9tICdpc290cm9waWMtaW5pdGlhbGl6YWJsZSc7XG5pbXBvcnQgX2xhdGVyIGZyb20gJ2lzb3Ryb3BpYy1sYXRlcic7XG5pbXBvcnQgX2xvZ2dlciBmcm9tICdpc290cm9waWMtbG9nZ2VyJztcbmltcG9ydCBfbWFrZSBmcm9tICdpc290cm9waWMtbWFrZSc7XG5pbXBvcnQgX3BhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBfcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5jb25zdCBfd29ya2VySWQgPSBfY2x1c3Rlci53b3JrZXIgJiYgX2NsdXN0ZXIud29ya2VyLmlkLFxuXG4gICAgX21vZHVsZUxvZ2dlciA9IF9sb2dnZXIuY2hpbGQoe1xuICAgICAgICBtb2R1bGU6IF9wYXRoLmJhc2VuYW1lKGltcG9ydC5tZXRhLmZpbGVuYW1lLCBfcGF0aC5leHRuYW1lKGltcG9ydC5tZXRhLmZpbGVuYW1lKSksXG4gICAgICAgIHdvcmtlcklkOiBfd29ya2VySWRcbiAgICB9KTtcblxuZXhwb3J0IGRlZmF1bHQgX21ha2UoX0luaXRpYWxpemFibGUsIHtcbiAgICBzZW5kICh7XG4gICAgICAgIG1lc3NhZ2VcbiAgICB9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBfcHJvY2Vzcy5zZW5kKG1lc3NhZ2UsIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KF9FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Vycm9yIHNlbmRpbmcgbWVzc2FnZSB0byBwcmltYXJ5J1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9LFxuICAgIF9kZXN0cm95ICguLi5hcmdzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3Byb2Nlc3NFdmVudHMpLmZvckVhY2goZXZlbnROYW1lID0+IHtcbiAgICAgICAgICAgIF9wcm9jZXNzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgdGhpcy5fcHJvY2Vzc0V2ZW50c1tldmVudE5hbWVdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fcHJvY2Vzc0V2ZW50cyA9IHZvaWQgbnVsbDtcblxuICAgICAgICBSZWZsZWN0LmFwcGx5KF9Jbml0aWFsaXphYmxlLnByb3RvdHlwZS5fZGVzdHJveSwgdGhpcywgYXJncyk7XG4gICAgfSxcbiAgICBfZGVzdHJveUNvbXBsZXRlICh7XG4gICAgICAgIHRpbWVvdXQgPSA2NzY1XG4gICAgfSA9IHt9KSB7XG4gICAgICAgIGlmIChfY2x1c3Rlci53b3JrZXIpIHtcbiAgICAgICAgICAgIF9jbHVzdGVyLndvcmtlci5kaXNjb25uZWN0KCk7XG5cbiAgICAgICAgICAgIF9sYXRlcih0aW1lb3V0LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgX2NsdXN0ZXIud29ya2VyLmtpbGwoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBfZXZlbnRQcmltYXJ5RGlzY29ubmVjdCAoKSB7XG4gICAgICAgIF9tb2R1bGVMb2dnZXIuaW5mbygnUHJpbWFyeSBkaXNjb25uZWN0ZWQnKTtcbiAgICB9LFxuICAgIF9ldmVudFByaW1hcnlNZXNzYWdlIChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuZGF0YS5tZXNzYWdlICYmIGV2ZW50LmRhdGEubWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRob2QgPSB0aGlzW2BfZXZlbnRQcmltYXJ5TWVzc2FnZV8ke2V2ZW50LmRhdGEubWVzc2FnZS50eXBlfWBdO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkobWV0aG9kLCB0aGlzLCBbXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50XG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIF9pbml0ICguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NFdmVudHMgPSB7XG4gICAgICAgICAgICBkaXNjb25uZWN0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHVibGlzaCgncHJpbWFyeURpc2Nvbm5lY3QnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXNzYWdlOiAobWVzc2FnZSwgaGFuZGxlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHVibGlzaCgncHJpbWFyeU1lc3NhZ2UnLCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KF9Jbml0aWFsaXphYmxlLnByb3RvdHlwZS5faW5pdCwgdGhpcywgYXJncyk7XG4gICAgfSxcbiAgICBfaW5pdGlhbGl6ZSAoKSB7XG4gICAgICAgIGlmIChfY2x1c3Rlci5pc1dvcmtlcikge1xuICAgICAgICAgICAgX21vZHVsZUxvZ2dlci5pbmZvKCdJbml0aWFsaXppbmcgd29ya2VyJyk7XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3Byb2Nlc3NFdmVudHMpLmZvckVhY2goZXZlbnROYW1lID0+IHtcbiAgICAgICAgICAgICAgICBfcHJvY2Vzcy5vbihldmVudE5hbWUsIHRoaXMuX3Byb2Nlc3NFdmVudHNbZXZlbnROYW1lXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IF9FcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ0NsdXN0ZXIgd29ya2VyIGNhbiBub3QgaW5pdGlhbGl6ZSBpbiBub24td29ya2VyIHByb2Nlc3MnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgX2luaXRpYWxpemVDb21wbGV0ZSAoKSB7XG4gICAgICAgIF9wcm9jZXNzLnNlbmQoJ3JlYWR5Jyk7XG4gICAgfVxufSwge1xuICAgIGdldCB3b3JrZXIgKCkge1xuICAgICAgICByZXR1cm4gX2NsdXN0ZXIud29ya2VyO1xuICAgIH0sXG4gICAgZ2V0IHdvcmtlcklkICgpIHtcbiAgICAgICAgcmV0dXJuIF93b3JrZXJJZDtcbiAgICB9LFxuICAgIF9wdWJzdWI6IHtcbiAgICAgICAgcHJpbWFyeURpc2Nvbm5lY3Q6IHtcbiAgICAgICAgICAgIGFsbG93UHVibGljUHVibGlzaDogZmFsc2UsXG4gICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb246ICdfZXZlbnRQcmltYXJ5RGlzY29ubmVjdCdcbiAgICAgICAgfSxcbiAgICAgICAgcHJpbWFyeU1lc3NhZ2U6IHtcbiAgICAgICAgICAgIGFsbG93UHVibGljUHVibGlzaDogZmFsc2UsXG4gICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb246ICdfZXZlbnRQcmltYXJ5TWVzc2FnZSdcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxNQUFPLENBQUFBLFFBQVEsS0FBTSxjQUFjLENBQ25DLE1BQU8sQ0FBQUMsTUFBTSxLQUFNLGlCQUFpQixDQUNwQyxNQUFPLENBQUFDLGNBQWMsS0FBTSx5QkFBeUIsQ0FDcEQsTUFBTyxDQUFBQyxNQUFNLEtBQU0saUJBQWlCLENBQ3BDLE1BQU8sQ0FBQUMsT0FBTyxLQUFNLGtCQUFrQixDQUN0QyxNQUFPLENB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
|
package/package.json
CHANGED
|
@@ -1,84 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"author": "Steven Olmsted <steven.olmsted@ibigroup.com>",
|
|
3
|
-
"babel": {
|
|
4
|
-
"env": {
|
|
5
|
-
"build": {
|
|
6
|
-
"presets": [
|
|
7
|
-
"babel-preset-minify"
|
|
8
|
-
]
|
|
9
|
-
},
|
|
10
|
-
"test": {
|
|
11
|
-
"plugins": [
|
|
12
|
-
"babel-plugin-istanbul"
|
|
13
|
-
]
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
"plugins": [
|
|
17
|
-
"babel-plugin-transform-line"
|
|
18
|
-
],
|
|
19
|
-
"presets": [
|
|
20
|
-
[
|
|
21
|
-
"@babel/preset-env",
|
|
22
|
-
{
|
|
23
|
-
"targets": {
|
|
24
|
-
"node": "current"
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
]
|
|
28
|
-
],
|
|
29
|
-
"sourceMaps": "inline"
|
|
30
|
-
},
|
|
31
3
|
"bugs": "https://github.com/ibi-group/isotropic-cluster/issues",
|
|
32
|
-
"contributors": [
|
|
33
|
-
"Duane Sibilly <duane.sibilly@ibigroup.com>"
|
|
34
|
-
],
|
|
35
4
|
"dependencies": {
|
|
36
|
-
"isotropic-error": "~0.
|
|
37
|
-
"isotropic-initializable": "~0.
|
|
38
|
-
"isotropic-later": "~0.
|
|
39
|
-
"isotropic-logger": "~0.
|
|
40
|
-
"isotropic-make": "~0.
|
|
5
|
+
"isotropic-error": "~0.13.0",
|
|
6
|
+
"isotropic-initializable": "~0.10.0",
|
|
7
|
+
"isotropic-later": "~0.13.0",
|
|
8
|
+
"isotropic-logger": "~0.3.0",
|
|
9
|
+
"isotropic-make": "~0.13.0"
|
|
41
10
|
},
|
|
42
11
|
"description": "A reusable and extendable platform to manage local process clusters",
|
|
43
12
|
"devDependencies": {
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"babel-plugin-istanbul": "~6.0.0",
|
|
47
|
-
"babel-plugin-transform-line": "~0.9.0",
|
|
48
|
-
"@babel/preset-env": "~7.10.4",
|
|
49
|
-
"babel-preset-minify": "~0.5.1",
|
|
50
|
-
"@babel/register": "~7.10.5",
|
|
51
|
-
"bunyan-stream-isotropic": "~0.1.0",
|
|
52
|
-
"chai": "~4.2.0",
|
|
53
|
-
"cross-env": "~7.0.2",
|
|
54
|
-
"eslint": "~7.5.0",
|
|
55
|
-
"eslint-plugin-isotropic": "~0.6.0",
|
|
56
|
-
"mocha": "~8.0.1",
|
|
57
|
-
"nyc": "~15.1.0"
|
|
13
|
+
"bunyan-stream-isotropic": "~0.3.0",
|
|
14
|
+
"isotropic-dev-dependencies": "~0.3.0"
|
|
58
15
|
},
|
|
59
16
|
"engines": {
|
|
60
|
-
"node": "^
|
|
61
|
-
"npm": "^
|
|
62
|
-
},
|
|
63
|
-
"eslintConfig": {
|
|
64
|
-
"env": {
|
|
65
|
-
"es6": true,
|
|
66
|
-
"node": true
|
|
67
|
-
},
|
|
68
|
-
"extends": "plugin:isotropic/isotropic",
|
|
69
|
-
"parserOptions": {
|
|
70
|
-
"ecmaFeatures": {
|
|
71
|
-
"globalReturn": false,
|
|
72
|
-
"impliedStrict": true,
|
|
73
|
-
"jsx": false
|
|
74
|
-
},
|
|
75
|
-
"ecmaVersion": 2020,
|
|
76
|
-
"sourceType": "module"
|
|
77
|
-
},
|
|
78
|
-
"plugins": [
|
|
79
|
-
"isotropic"
|
|
80
|
-
],
|
|
81
|
-
"root": true
|
|
17
|
+
"node": "^22.5.1",
|
|
18
|
+
"npm": "^10.8.2"
|
|
82
19
|
},
|
|
83
20
|
"files": [
|
|
84
21
|
"lib"
|
|
@@ -89,32 +26,17 @@
|
|
|
89
26
|
],
|
|
90
27
|
"license": "BSD-3-Clause",
|
|
91
28
|
"name": "isotropic-cluster",
|
|
92
|
-
"
|
|
93
|
-
"branches": 100,
|
|
94
|
-
"check-coverage": false,
|
|
95
|
-
"functions": 100,
|
|
96
|
-
"instrument": false,
|
|
97
|
-
"lines": 100,
|
|
98
|
-
"per-file": false,
|
|
99
|
-
"reporter": [
|
|
100
|
-
"lcov",
|
|
101
|
-
"text-summary"
|
|
102
|
-
],
|
|
103
|
-
"require": [
|
|
104
|
-
"@babel/register"
|
|
105
|
-
],
|
|
106
|
-
"sourceMap": false,
|
|
107
|
-
"statements": 100
|
|
108
|
-
},
|
|
109
|
-
"repository": "ibi-group/isotropic-cluster",
|
|
29
|
+
"repository": "github:ibi-group/isotropic-cluster",
|
|
110
30
|
"scripts": {
|
|
111
|
-
"build": "cross-env BABEL_ENV=
|
|
31
|
+
"build": "cross-env BABEL_ENV=node-minify babel --config-file ./node_modules/isotropic-dev-dependencies/config/babel.json js -d lib --delete-dir-on-start",
|
|
112
32
|
"lint": "eslint js test",
|
|
113
|
-
"
|
|
33
|
+
"postprepare": "node ./node_modules/isotropic-dev-dependencies/lib/install-git-hooks.js",
|
|
34
|
+
"posttest": "[ -z \"$npm_config_coverage\" ] || c8 -c ./node_modules/isotropic-dev-dependencies/config/c8.json check-coverage",
|
|
114
35
|
"prepare": "npm run build",
|
|
115
36
|
"prepublishOnly": "npm test --coverage",
|
|
116
37
|
"pretest": "npm run lint",
|
|
117
|
-
"test": "cross-env BABEL_ENV=test
|
|
38
|
+
"test": "cross-env BABEL_ENV=test c8 -c ./node_modules/isotropic-dev-dependencies/config/c8.json mocha --import=isotropic-dev-dependencies/lib/register-babel-loader.js"
|
|
118
39
|
},
|
|
119
|
-
"
|
|
40
|
+
"type": "module",
|
|
41
|
+
"version": "0.3.0"
|
|
120
42
|
}
|
package/lib/cluster-master.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _cluster2=_interopRequireDefault(require("cluster")),_isotropicError=_interopRequireDefault(require("isotropic-error")),_isotropicInitializable=_interopRequireDefault(require("isotropic-initializable")),_isotropicLogger=_interopRequireDefault(require("isotropic-logger")),_isotropicMake=_interopRequireDefault(require("isotropic-make")),_path2=_interopRequireDefault(require("path")),_process2=_interopRequireDefault(require("process"));function _interopRequireDefault(a){return a&&a.__esModule?a:{default:a}}const _moduleLogger=_isotropicLogger.default.child({module:_path2.default.basename(__filename,_path2.default.extname(__filename))},!0);var _default=(0,_isotropicMake.default)(_isotropicInitializable.default,{fork({workerCount:a=1}={}){return this._active?this._publish("fork",{workerCount:a}):this},roundRobin({tag:a=""}={}){let b,c=1/0,d=this._workerTimeByWorkerWeakMapByTag[a];d||(d=new WeakMap,this._workerTimeByWorkerWeakMapByTag[a]=d);for(const e of this._workers){const a=d.get(e);if(a)a<c&&(b=e,c=a);else{b=e;break}}return d.set(b,Date.now()),b},send({message:a,to:b=this._workers}){return Array.isArray(b)||(b=[b]),Promise.all(b.map(b=>new Promise((c,d)=>{const e="number"==typeof b?this._workerById[b]:b;e&&e.send?e.send(a,b=>{b?d((0,_isotropicError.default)({details:{message:a,workerId:e.id},error:b,message:"Error sending message to worker"})):c()}):d((0,_isotropicError.default)({details:{message:a,to:b},message:"Invalid message destination"}))})))},shutDown(){return this._publish("shutDown")},get workerById(){return this._workerById},get workers(){return this._workers},_addWorker({worker:a}){return this._publish("addWorker",{worker:a})},_destroy(...a){return this._active?(this._onceAfter("shutDownComplete","_destroy"),void this.shutDown()):void(this._active=void 0,Object.keys(this._clusterListenerByEventName).forEach(a=>{_cluster2.default.removeListener(a,this._clusterListenerByEventName[a])}),this._clusterListenerByEventName=void 0,this._workerTimeByWorkerWeakMapByTag=void 0,Reflect.apply(_isotropicInitializable.default.prototype._destroy,this,a))},_eventAddWorker({data:{worker:a}}){this._workerById[a.id]=a,this._workers=Object.values(this._workerById)},_eventFork({data:{workerCount:a}}){for(;0<a;)_moduleLogger.info("Starting a new worker"),_cluster2.default.fork(),a-=1},_eventRemoveWorker({data:{worker:a}}){delete this._workerById[a.id],this._workers=Object.values(this._workerById)},_eventShutDown(){return _moduleLogger.info("Shutting down workers"),this._active=!1,_cluster2.default.disconnect(()=>{this._publish("shutDownComplete")}),this},_eventShutDownComplete(){_moduleLogger.info("Worker shut down complete")},_eventWorkerDisconnect({data:{worker:a}}){_moduleLogger.info({workerId:a.id},"Worker disconnected"),this._removeWorker({worker:a})},_eventWorkerError({data:{error:a,worker:b}}){_moduleLogger.fatal({error:(0,_isotropicError.default)({details:{workerId:b.id},error:a,message:"Worker error"}),workerId:b.id},"Worker error"),this._removeWorker({worker:b})},_eventWorkerExit({data:{code:a,signal:b,worker:c}}){c.exitedAfterDisconnect?_moduleLogger.info({code:a,signal:b,workerId:c.id},"Worker exited voluntarily"):a?_moduleLogger.fatal({code:a,signal:b,workerId:c.id},"Worker died unexpectedly"):_moduleLogger.error({code:a,signal:b,workerId:c.id},"Worker died"),this._removeWorker({worker:c}),this._active&&(_moduleLogger.info("Replacing dead worker"),this.fork())},_eventWorkerFork({data:{worker:a}}){_moduleLogger.info({workerId:a.id},"Starting new worker"),a.on("error",b=>{this._publish("workerError",{error:(0,_isotropicError.default)({details:{worker:a},error:b,message:"Error in worker"}),worker:a})})},_eventWorkerListening({data:{address:a,worker:b}}){_moduleLogger.info({address:a.address,port:a.port,workerId:b.id},"Worker is listening")},_eventWorkerMessage(a){if(a.data.message&&a.data.message.type){const b=this[`_eventWorkerMessage_${a.data.message.type}`];"function"==typeof b&&Reflect.apply(b,this,[a])}},_eventWorkerOnline({data:{worker:a}}){_moduleLogger.info({workerId:a.id},"Worker is now online");const b=c=>{"ready"===c&&(a.removeListener("message",b),this._publish("workerReady",{worker:a}))};a.on("message",b)},_eventWorkerReady({data:{worker:a}}){_moduleLogger.info({workerId:a.id},"Worker is ready to work"),this._addWorker({worker:a})},_init(...a){return this._active=!0,this._clusterListenerByEventName={disconnect:a=>{this._publish("workerDisconnect",{worker:a})},exit:(a,b,c)=>{this._publish("workerExit",{code:b,signal:c,worker:a})},fork:a=>{this._publish("workerFork",{worker:a})},listening:(a,b)=>{this._publish("workerListening",{address:b,worker:a})},message:(a,b,c)=>{this._publish("workerMessage",{handle:c,message:b,worker:a})},online:a=>{this._publish("workerOnline",{worker:a})}},this._workerById=Object.create(null),this._workers=[],this._workerTimeByWorkerWeakMapByTag=Object.create(null),Reflect.apply(_isotropicInitializable.default.prototype._init,this,a)},_initialize(...a){_moduleLogger.info("Initializing master");const[{workerArgs:b,workerScript:c,workerSilent:d,workerStdio:e}={}]=a;_cluster2.default.setupMaster({args:"undefined"==typeof b?_process2.default.argv.slice(2):b,exec:"undefined"==typeof c?_process2.default.argv[1]:c,silent:"undefined"!=typeof d&&d,stdio:e}),Object.keys(this._clusterListenerByEventName).forEach(a=>{_cluster2.default.on(a,this._clusterListenerByEventName[a])})},_removeWorker({worker:a}){return a.id in this._workerById&&this._publish("removeWorker",{worker:a}),this}},{_events:{addWorker:{allowPublicPublish:!1,defaultFunction:"_eventAddWorker"},fork:{allowPublicPublish:!1,defaultFunction:"_eventFork"},removeWorker:{allowPublicPublish:!1,defaultFunction:"_eventRemoveWorker"},shutDown:{allowPublicPublish:!1,completeOnce:!0,defaultFunction:"_eventShutDown"},shutDownComplete:{allowPublicPublish:!1,defaultFunction:"_eventShutDownComplete",publishOnce:!0},workerDisconnect:{allowPublicPublish:!1,defaultFunction:"_eventWorkerDisconnect"},workerError:{allowPublicPublish:!1,defaultFunction:"_eventWorkerError"},workerExit:{allowPublicPublish:!1,defaultFunction:"_eventWorkerExit"},workerFork:{allowPublicPublish:!1,defaultFunction:"_eventWorkerFork"},workerListening:{allowPublicPublish:!1,defaultFunction:"_eventWorkerListening"},workerMessage:{allowPublicPublish:!1,defaultFunction:"_eventWorkerMessage"},workerOnline:{allowPublicPublish:!1,defaultFunction:"_eventWorkerOnline"},workerReady:{allowPublicPublish:!1,defaultFunction:"_eventWorkerReady"}}});exports.default=_default;
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL2NsdXN0ZXItbWFzdGVyLmpzIl0sIm5hbWVzIjpbIl9tb2R1bGVMb2dnZXIiLCJfbG9nZ2VyIiwiY2hpbGQiLCJtb2R1bGUiLCJfcGF0aCIsImJhc2VuYW1lIiwiX19maWxlbmFtZSIsImV4dG5hbWUiLCJfSW5pdGlhbGl6YWJsZSIsImZvcmsiLCJ3b3JrZXJDb3VudCIsIl9hY3RpdmUiLCJfcHVibGlzaCIsInJvdW5kUm9iaW4iLCJ0YWciLCJvbGRlc3RXb3JrZXIiLCJvbGRlc3RXb3JrZXJUaW1lIiwid29ya2VyVGltZUJ5V29ya2VyV2Vha01hcCIsIl93b3JrZXJUaW1lQnlXb3JrZXJXZWFrTWFwQnlUYWciLCJXZWFrTWFwIiwid29ya2VyIiwiX3dvcmtlcnMiLCJ3b3JrZXJUaW1lIiwiZ2V0Iiwic2V0IiwiRGF0ZSIsIm5vdyIsInNlbmQiLCJtZXNzYWdlIiwidG8iLCJBcnJheSIsImlzQXJyYXkiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicmVzb2x2ZSIsInJlamVjdCIsIl93b3JrZXJCeUlkIiwiZXJyb3IiLCJkZXRhaWxzIiwid29ya2VySWQiLCJpZCIsInNodXREb3duIiwid29ya2VyQnlJZCIsIndvcmtlcnMiLCJfYWRkV29ya2VyIiwiX2Rlc3Ryb3kiLCJhcmdzIiwiX29uY2VBZnRlciIsIk9iamVjdCIsImtleXMiLCJfY2x1c3Rlckxpc3RlbmVyQnlFdmVudE5hbWUiLCJmb3JFYWNoIiwiZXZlbnROYW1lIiwiX2NsdXN0ZXIiLCJyZW1vdmVMaXN0ZW5lciIsIlJlZmxlY3QiLCJhcHBseSIsInByb3RvdHlwZSIsIl9ldmVudEFkZFdvcmtlciIsImRhdGEiLCJ2YWx1ZXMiLCJfZXZlbnRGb3JrIiwiaW5mbyIsIl9ldmVudFJlbW92ZVdvcmtlciIsIl9ldmVudFNodXREb3duIiwiZGlzY29ubmVjdCIsIl9ldmVudFNodXREb3duQ29tcGxldGUiLCJfZXZlbnRXb3JrZXJEaXNjb25uZWN0IiwiX3JlbW92ZVdvcmtlciIsIl9ldmVudFdvcmtlckVycm9yIiwiZmF0YWwiLCJfZXZlbnRXb3JrZXJFeGl0IiwiY29kZSIsInNpZ25hbCIsImV4aXRlZEFmdGVyRGlzY29ubmVjdCIsIl9ldmVudFdvcmtlckZvcmsiLCJvbiIsIl9ldmVudFdvcmtlckxpc3RlbmluZyIsImFkZHJlc3MiLCJwb3J0IiwiX2V2ZW50V29ya2VyTWVzc2FnZSIsImV2ZW50IiwidHlwZSIsIm1ldGhvZCIsIl9ldmVudFdvcmtlck9ubGluZSIsImxpc3RlbmVyIiwiX2V2ZW50V29ya2VyUmVhZHkiLCJfaW5pdCIsImV4aXQiLCJsaXN0ZW5pbmciLCJoYW5kbGUiLCJvbmxpbmUiLCJjcmVhdGUiLCJfaW5pdGlhbGl6ZSIsIndvcmtlckFyZ3MiLCJ3b3JrZXJTY3JpcHQiLCJ3b3JrZXJTaWxlbnQiLCJ3b3JrZXJTdGRpbyIsInNldHVwTWFzdGVyIiwiX3Byb2Nlc3MiLCJhcmd2Iiwic2xpY2UiLCJleGVjIiwic2lsZW50Iiwic3RkaW8iLCJfZXZlbnRzIiwiYWRkV29ya2VyIiwiYWxsb3dQdWJsaWNQdWJsaXNoIiwiZGVmYXVsdEZ1bmN0aW9uIiwicmVtb3ZlV29ya2VyIiwiY29tcGxldGVPbmNlIiwic2h1dERvd25Db21wbGV0ZSIsInB1Ymxpc2hPbmNlIiwid29ya2VyRGlzY29ubmVjdCIsIndvcmtlckVycm9yIiwid29ya2VyRXhpdCIsIndvcmtlckZvcmsiLCJ3b3JrZXJMaXN0ZW5pbmciLCJ3b3JrZXJNZXNzYWdlIiwid29ya2VyT25saW5lIiwid29ya2VyUmVhZHkiXSwibWFwcGluZ3MiOiI0bEJBUUEsS0FBTUEsQ0FBQUEsYUFBYSxDQUFHQyx5QkFBUUMsS0FBUixDQUFjLENBQ2hDQyxNQUFNLENBQUVDLGVBQU1DLFFBQU4sQ0FBZUMsVUFBZixDQUEyQkYsZUFBTUcsT0FBTixDQUFjRCxVQUFkLENBQTNCLENBRHdCLENBQWQsSUFBdEIsQyxhQUllLDJCQUFNRSwrQkFBTixDQUFzQixDQUNqQ0MsSUFBSSxDQUFFLENBQ0ZDLFdBQVcsQ0FBWEEsQ0FBVyxDQUFHLENB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LGtCQUFrQixHQURULENBRVRDLGVBQWUsQ0FBRSxtQkFGUixDQW5EUixDQURWLENBMVlZLEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2NsdXN0ZXIgZnJvbSAnY2x1c3Rlcic7XG5pbXBvcnQgX0Vycm9yIGZyb20gJ2lzb3Ryb3BpYy1lcnJvcic7XG5pbXBvcnQgX0luaXRpYWxpemFibGUgZnJvbSAnaXNvdHJvcGljLWluaXRpYWxpemFibGUnO1xuaW1wb3J0IF9sb2dnZXIgZnJvbSAnaXNvdHJvcGljLWxvZ2dlcic7XG5pbXBvcnQgX21ha2UgZnJvbSAnaXNvdHJvcGljLW1ha2UnO1xuaW1wb3J0IF9wYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IF9wcm9jZXNzIGZyb20gJ3Byb2Nlc3MnO1xuXG5jb25zdCBfbW9kdWxlTG9nZ2VyID0gX2xvZ2dlci5jaGlsZCh7XG4gICAgbW9kdWxlOiBfcGF0aC5iYXNlbmFtZShfX2ZpbGVuYW1lLCBfcGF0aC5leHRuYW1lKF9fZmlsZW5hbWUpKVxufSwgdHJ1ZSk7XG5cbmV4cG9ydCBkZWZhdWx0IF9tYWtlKF9Jbml0aWFsaXphYmxlLCB7XG4gICAgZm9yayAoe1xuICAgICAgICB3b3JrZXJDb3VudCA9IDFcbiAgICB9ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZSA/XG4gICAgICAgICAgICB0aGlzLl9wdWJsaXNoKCdmb3JrJywge1xuICAgICAgICAgICAgICAgIHdvcmtlckNvdW50XG4gICAgICAgICAgICB9KSA6XG4gICAgICAgICAgICB0aGlzO1xuICAgIH0sXG4gICAgcm91bmRSb2JpbiAoe1xuICAgICAgICB0YWcgPSAnJ1xuICAgIH0gPSB7fSkge1xuICAgICAgICBsZXQgb2xkZXN0V29ya2VyLFxuICAgICAgICAgICAgb2xkZXN0V29ya2VyVGltZSA9IEluZmluaXR5LFxuICAgICAgICAgICAgd29ya2VyVGltZUJ5V29ya2VyV2Vha01hcCA9IHRoaXMuX3dvcmtlclRpbWVCeVdvcmtlcldlYWtNYXBCeVRhZ1t0YWddO1xuXG4gICAgICAgIGlmICghd29ya2VyVGltZUJ5V29ya2VyV2Vha01hcCkge1xuICAgICAgICAgICAgd29ya2VyVGltZUJ5V29ya2VyV2Vha01hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXJUaW1lQnlXb3JrZXJXZWFrTWFwQnlUYWdbdGFnXSA9IHdvcmtlclRpbWVCeVdvcmtlcldlYWtNYXA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB0aGlzLl93b3JrZXJzKSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJUaW1lID0gd29ya2VyVGltZUJ5V29ya2VyV2Vha01hcC5nZXQod29ya2VyKTtcblxuICAgICAgICAgICAgaWYgKHdvcmtlclRpbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAod29ya2VyVGltZSA8IG9sZGVzdFdvcmtlclRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkZXN0V29ya2VyID0gd29ya2VyO1xuICAgICAgICAgICAgICAgICAgICBvbGRlc3RXb3JrZXJUaW1lID0gd29ya2VyVGltZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9sZGVzdFdvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHdvcmtlclRpbWVCeVdvcmtlcldlYWtNYXAuc2V0KG9sZGVzdFdvcmtlciwgRGF0ZS5ub3coKSk7XG4gICAgICAgIHJldHVybiBvbGRlc3RXb3JrZXI7XG4gICAgfSxcbiAgICBzZW5kICh7XG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHRvID0gdGhpcy5fd29ya2Vyc1xuICAgIH0pIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRvKSkge1xuICAgICAgICAgICAgdG8gPSBbXG4gICAgICAgICAgICAgICAgdG9cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodG8ubWFwKHRvID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IHR5cGVvZiB0byA9PT0gJ251bWJlcicgP1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtlckJ5SWRbdG9dIDpcbiAgICAgICAgICAgICAgICB0bztcblxuICAgICAgICAgICAgaWYgKHdvcmtlciAmJiB3b3JrZXIuc2VuZCkge1xuICAgICAgICAgICAgICAgIHdvcmtlci5zZW5kKG1lc3NhZ2UsIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoX0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcklkOiB3b3JrZXIuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdFcnJvciBzZW5kaW5nIG1lc3NhZ2UgdG8gd29ya2VyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChfRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgbWVzc2FnZSBkZXN0aW5hdGlvbidcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKSk7XG4gICAgfSxcbiAgICBzaHV0RG93biAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdWJsaXNoKCdzaHV0RG93bicpO1xuICAgIH0sXG4gICAgZ2V0IHdvcmtlckJ5SWQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2VyQnlJZDtcbiAgICB9LFxuICAgIGdldCB3b3JrZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtlcnM7XG4gICAgfSxcbiAgICBfYWRkV29ya2VyICh7XG4gICAgICAgIHdvcmtlclxuICAgIH0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1Ymxpc2goJ2FkZFdvcmtlcicsIHtcbiAgICAgICAgICAgIHdvcmtlclxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIF9kZXN0cm95ICguLi5hcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX29uY2VBZnRlcignc2h1dERvd25Db21wbGV0ZScsICdfZGVzdHJveScpO1xuICAgICAgICAgICAgdGhpcy5zaHV0RG93bigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdm9pZCBudWxsO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX2NsdXN0ZXJMaXN0ZW5lckJ5RXZlbnROYW1lKS5mb3JFYWNoKGV2ZW50TmFtZSA9PiB7XG4gICAgICAgICAgICBfY2x1c3Rlci5yZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIHRoaXMuX2NsdXN0ZXJMaXN0ZW5lckJ5RXZlbnROYW1lW2V2ZW50TmFtZV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jbHVzdGVyTGlzdGVuZXJCeUV2ZW50TmFtZSA9IHZvaWQgbnVsbDtcblxuICAgICAgICB0aGlzLl93b3JrZXJUaW1lQnlXb3JrZXJXZWFrTWFwQnlUYWcgPSB2b2lkIG51bGw7XG5cbiAgICAgICAgUmVmbGVjdC5hcHBseShfSW5pdGlhbGl6YWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3ksIHRoaXMsIGFyZ3MpO1xuICAgIH0sXG4gICAgX2V2ZW50QWRkV29ya2VyICh7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHdvcmtlclxuICAgICAgICB9XG4gICAgfSkge1xuICAgICAgICB0aGlzLl93b3JrZXJCeUlkW3dvcmtlci5pZF0gPSB3b3JrZXI7XG4gICAgICAgIHRoaXMuX3dvcmtlcnMgPSBPYmplY3QudmFsdWVzKHRoaXMuX3dvcmtlckJ5SWQpO1xuICAgIH0sXG4gICAgX2V2ZW50Rm9yayAoe1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB3b3JrZXJDb3VudFxuICAgICAgICB9XG4gICAgfSkge1xuICAgICAgICB3aGlsZSAod29ya2VyQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBfbW9kdWxlTG9nZ2VyLmluZm8oJ1N0YXJ0aW5nIGEgbmV3IHdvcmtlcicpO1xuXG4gICAgICAgICAgICBfY2x1c3Rlci5mb3JrKCk7XG4gICAgICAgICAgICB3b3JrZXJDb3VudCAtPSAxO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBfZXZlbnRSZW1vdmVXb3JrZXIgKHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH1cbiAgICB9KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl93b3JrZXJCeUlkW3dvcmtlci5pZF07XG4gICAgICAgIHRoaXMuX3dvcmtlcnMgPSBPYmplY3QudmFsdWVzKHRoaXMuX3dvcmtlckJ5SWQpO1xuICAgIH0sXG4gICAgX2V2ZW50U2h1dERvd24gKCkge1xuICAgICAgICBfbW9kdWxlTG9nZ2VyLmluZm8oJ1NodXR0aW5nIGRvd24gd29ya2VycycpO1xuXG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIF9jbHVzdGVyLmRpc2Nvbm5lY3QoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcHVibGlzaCgnc2h1dERvd25Db21wbGV0ZScpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIF9ldmVudFNodXREb3duQ29tcGxldGUgKCkge1xuICAgICAgICBfbW9kdWxlTG9nZ2VyLmluZm8oJ1dvcmtlciBzaHV0IGRvd24gY29tcGxldGUnKTtcbiAgICB9LFxuICAgIF9ldmVudFdvcmtlckRpc2Nvbm5lY3QgKHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH1cbiAgICB9KSB7XG4gICAgICAgIF9tb2R1bGVMb2dnZXIuaW5mbyh7XG4gICAgICAgICAgICB3b3JrZXJJZDogd29ya2VyLmlkXG4gICAgICAgIH0sICdXb3JrZXIgZGlzY29ubmVjdGVkJyk7XG5cbiAgICAgICAgdGhpcy5fcmVtb3ZlV29ya2VyKHtcbiAgICAgICAgICAgIHdvcmtlclxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIF9ldmVudFdvcmtlckVycm9yICh7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH1cbiAgICB9KSB7XG4gICAgICAgIF9tb2R1bGVMb2dnZXIuZmF0YWwoe1xuICAgICAgICAgICAgZXJyb3I6IF9FcnJvcih7XG4gICAgICAgICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXJJZDogd29ya2VyLmlkXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnV29ya2VyIGVycm9yJ1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB3b3JrZXJJZDogd29ya2VyLmlkXG4gICAgICAgIH0sICdXb3JrZXIgZXJyb3InKTtcblxuICAgICAgICB0aGlzLl9yZW1vdmVXb3JrZXIoe1xuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgX2V2ZW50V29ya2VyRXhpdCAoe1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH1cbiAgICB9KSB7XG4gICAgICAgIGlmICh3b3JrZXIuZXhpdGVkQWZ0ZXJEaXNjb25uZWN0KSB7XG4gICAgICAgICAgICBfbW9kdWxlTG9nZ2VyLmluZm8oe1xuICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgICAgIHdvcmtlcklkOiB3b3JrZXIuaWRcbiAgICAgICAgICAgIH0sICdXb3JrZXIgZXhpdGVkIHZvbHVudGFyaWx5Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSkge1xuICAgICAgICAgICAgX21vZHVsZUxvZ2dlci5mYXRhbCh7XG4gICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgICAgICAgd29ya2VySWQ6IHdvcmtlci5pZFxuICAgICAgICAgICAgfSwgJ1dvcmtlciBkaWVkIHVuZXhwZWN0ZWRseScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX21vZHVsZUxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgICAgICAgd29ya2VySWQ6IHdvcmtlci5pZFxuICAgICAgICAgICAgfSwgJ1dvcmtlciBkaWVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZW1vdmVXb3JrZXIoe1xuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgICAgIF9tb2R1bGVMb2dnZXIuaW5mbygnUmVwbGFjaW5nIGRlYWQgd29ya2VyJyk7XG5cbiAgICAgICAgICAgIHRoaXMuZm9yaygpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBfZXZlbnRXb3JrZXJGb3JrICh7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHdvcmtlclxuICAgICAgICB9XG4gICAgfSkge1xuICAgICAgICBfbW9kdWxlTG9nZ2VyLmluZm8oe1xuICAgICAgICAgICAgd29ya2VySWQ6IHdvcmtlci5pZFxuICAgICAgICB9LCAnU3RhcnRpbmcgbmV3IHdvcmtlcicpO1xuXG4gICAgICAgIHdvcmtlci5vbignZXJyb3InLCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9wdWJsaXNoKCd3b3JrZXJFcnJvcicsIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogX0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRXJyb3IgaW4gd29ya2VyJ1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHdvcmtlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgX2V2ZW50V29ya2VyTGlzdGVuaW5nICh7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICB3b3JrZXJcbiAgICAgICAgfVxuICAgIH0pIHtcbiAgICAgICAgX21vZHVsZUxvZ2dlci5pbmZvKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3MuYWRkcmVzcyxcbiAgICAgICAgICAgIHBvcnQ6IGFkZHJlc3MucG9ydCxcbiAgICAgICAgICAgIHdvcmtlcklkOiB3b3JrZXIuaWRcbiAgICAgICAgfSwgJ1dvcmtlciBpcyBsaXN0ZW5pbmcnKTtcbiAgICB9LFxuICAgIF9ldmVudFdvcmtlck1lc3NhZ2UgKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5kYXRhLm1lc3NhZ2UgJiYgZXZlbnQuZGF0YS5tZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IHRoaXNbYF9ldmVudFdvcmtlck1lc3NhZ2VfJHtldmVudC5kYXRhLm1lc3NhZ2UudHlwZX1gXTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBSZWZsZWN0LmFwcGx5KG1ldGhvZCwgdGhpcywgW1xuICAgICAgICAgICAgICAgICAgICBldmVudFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBfZXZlbnRXb3JrZXJPbmxpbmUgKHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgd29ya2VyXG4gICAgICAgIH1cbiAgICB9KSB7XG4gICAgICAgIF9tb2R1bGVMb2dnZXIuaW5mbyh7XG4gICAgICAgICAgICB3b3JrZXJJZDogd29ya2VyLmlkXG4gICAgICAgIH0sICdXb3JrZXIgaXMgbm93IG9ubGluZScpO1xuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gbWVzc2FnZSA9PiB7XG4gICAgICAgICAgICBpZiAobWVzc2FnZSA9PT0gJ3JlYWR5Jykge1xuICAgICAgICAgICAgICAgIHdvcmtlci5yZW1vdmVMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2goJ3dvcmtlclJlYWR5Jywge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB3b3JrZXIub24oJ21lc3NhZ2UnLCBsaXN0ZW5lcik7XG4gICAgfSxcbiAgICBfZXZlbnRXb3JrZXJSZWFkeSAoe1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB3b3JrZXJcbiAgICAgICAgfVxuICAgIH0pIHtcbiAgICAgICAgX21vZHVsZUxvZ2dlci5pbmZvKHtcbiAgICAgICAgICAgIHdvcmtlcklkOiB3b3JrZXIuaWRcbiAgICAgICAgfSwgJ1dvcmtlciBpcyByZWFkeSB0byB3b3JrJyk7XG5cbiAgICAgICAgdGhpcy5fYWRkV29ya2VyKHtcbiAgICAgICAgICAgIHdvcmtlclxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIF9pbml0ICguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fY2x1c3Rlckxpc3RlbmVyQnlFdmVudE5hbWUgPSB7XG4gICAgICAgICAgICBkaXNjb25uZWN0OiB3b3JrZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2goJ3dvcmtlckRpc2Nvbm5lY3QnLCB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4aXQ6ICh3b3JrZXIsIGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2goJ3dvcmtlckV4aXQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9yazogd29ya2VyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wdWJsaXNoKCd3b3JrZXJGb3JrJywge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsaXN0ZW5pbmc6ICh3b3JrZXIsIGFkZHJlc3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wdWJsaXNoKCd3b3JrZXJMaXN0ZW5pbmcnLCB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICh3b3JrZXIsIG1lc3NhZ2UsIGhhbmRsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2goJ3dvcmtlck1lc3NhZ2UnLCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25saW5lOiB3b3JrZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2goJ3dvcmtlck9ubGluZScsIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fd29ya2VyQnlJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgdGhpcy5fd29ya2VycyA9IFtdO1xuXG4gICAgICAgIHRoaXMuX3dvcmtlclRpbWVCeVdvcmtlcldlYWtNYXBCeVRhZyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoX0luaXRpYWxpemFibGUucHJvdG90eXBlLl9pbml0LCB0aGlzLCBhcmdzKTtcbiAgICB9LFxuICAgIF9pbml0aWFsaXplICguLi5hcmdzKSB7XG4gICAgICAgIF9tb2R1bGVMb2dnZXIuaW5mbygnSW5pdGlhbGl6aW5nIG1hc3RlcicpO1xuXG4gICAgICAgIGNvbnN0IFt7XG4gICAgICAgICAgICB3b3JrZXJBcmdzLFxuICAgICAgICAgICAgd29ya2VyU2NyaXB0LFxuICAgICAgICAgICAgd29ya2VyU2lsZW50LFxuICAgICAgICAgICAgd29ya2VyU3RkaW9cbiAgICAgICAgfSA9IHt9XSA9IGFyZ3M7XG5cbiAgICAgICAgX2NsdXN0ZXIuc2V0dXBNYXN0ZXIoe1xuICAgICAgICAgICAgYXJnczogdHlwZW9mIHdvcmtlckFyZ3MgPT09ICd1bmRlZmluZWQnID9cbiAgICAgICAgICAgICAgICBfcHJvY2Vzcy5hcmd2LnNsaWNlKDIpIDpcbiAgICAgICAgICAgICAgICB3b3JrZXJBcmdzLFxuICAgICAgICAgICAgZXhlYzogdHlwZW9mIHdvcmtlclNjcmlwdCA9PT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgICAgIF9wcm9jZXNzLmFyZ3ZbMV0gOlxuICAgICAgICAgICAgICAgIHdvcmtlclNjcmlwdCxcbiAgICAgICAgICAgIHNpbGVudDogdHlwZW9mIHdvcmtlclNpbGVudCA9PT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgICAgIGZhbHNlIDpcbiAgICAgICAgICAgICAgICB3b3JrZXJTaWxlbnQsXG4gICAgICAgICAgICBzdGRpbzogd29ya2VyU3RkaW9cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5fY2x1c3Rlckxpc3RlbmVyQnlFdmVudE5hbWUpLmZvckVhY2goZXZlbnROYW1lID0+IHtcbiAgICAgICAgICAgIF9jbHVzdGVyLm9uKGV2ZW50TmFtZSwgdGhpcy5fY2x1c3Rlckxpc3RlbmVyQnlFdmVudE5hbWVbZXZlbnROYW1lXSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgX3JlbW92ZVdvcmtlciAoe1xuICAgICAgICB3b3JrZXJcbiAgICB9KSB7XG4gICAgICAgIGlmICh3b3JrZXIuaWQgaW4gdGhpcy5fd29ya2VyQnlJZCkge1xuICAgICAgICAgICAgdGhpcy5fcHVibGlzaCgncmVtb3ZlV29ya2VyJywge1xuICAgICAgICAgICAgICAgIHdvcmtlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59LCB7XG4gICAgX2V2ZW50czoge1xuICAgICAgICBhZGRXb3JrZXI6IHtcbiAgICAgICAgICAgIGFsbG93UHVibGljUHVibGlzaDogZmFsc2UsXG4gICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb246ICdfZXZlbnRBZGRXb3JrZXInXG4gICAgICAgIH0sXG4gICAgICAgIGZvcms6IHtcbiAgICAgICAgICAgIGFsbG93UHVibGljUHVibGlzaDogZmFsc2UsXG4gICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb246ICdfZXZlbnRGb3JrJ1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVXb3JrZXI6IHtcbiAgICAgICAgICAgIGFsbG93UHVibGljUHVibGlzaDogZmFsc2UsXG4gICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb246ICdfZXZlbnRSZW1vdmVXb3JrZXInXG4gICAgICAgIH0sXG4gICAgICAgIHNodXREb3duOiB7XG4gICAgICAgICAgICBhbGxvd1B1YmxpY1B1Ymxpc2g6IGZhbHNlLFxuICAgICAgICAgICAgY29tcGxldGVPbmNlOiB0cnVlLFxuICAgICAgICAgICAgZGVmYXVsdEZ1bmN0aW9uOiAnX2V2ZW50U2h1dERvd24nXG4gICAgICAgIH0sXG4gICAgICAgIHNodXREb3duQ29tcGxldGU6IHtcbiAgICAgICAgICAgIGFsbG93UHVibGljUHVibGlzaDogZmFsc2UsXG4gICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb246ICdfZXZlbnRTaHV0RG93bkNvbXBsZXRlJyxcbiAgICAgICAgICAgIHB1Ymxpc2hPbmNlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHdvcmtlckRpc2Nvbm5lY3Q6IHtcbiAgICAgICAgICAgIGFsbG93UHVibGljUHVibGlzaDogZmFsc2UsXG4gICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb246ICdfZXZlbnRXb3JrZXJEaXNjb25uZWN0J1xuICAgICAgICB9LFxuICAgICAgICB3b3JrZXJFcnJvcjoge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNQdWJsaXNoOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbjogJ19ldmVudFdvcmtlckVycm9yJ1xuICAgICAgICB9LFxuICAgICAgICB3b3JrZXJFeGl0OiB7XG4gICAgICAgICAgICBhbGxvd1B1YmxpY1B1Ymxpc2g6IGZhbHNlLFxuICAgICAgICAgICAgZGVmYXVsdEZ1bmN0aW9uOiAnX2V2ZW50V29ya2VyRXhpdCdcbiAgICAgICAgfSxcbiAgICAgICAgd29ya2VyRm9yazoge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNQdWJsaXNoOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbjogJ19ldmVudFdvcmtlckZvcmsnXG4gICAgICAgIH0sXG4gICAgICAgIHdvcmtlckxpc3RlbmluZzoge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNQdWJsaXNoOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbjogJ19ldmVudFdvcmtlckxpc3RlbmluZydcbiAgICAgICAgfSxcbiAgICAgICAgd29ya2VyTWVzc2FnZToge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNQdWJsaXNoOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbjogJ19ldmVudFdvcmtlck1lc3NhZ2UnXG4gICAgICAgIH0sXG4gICAgICAgIHdvcmtlck9ubGluZToge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNQdWJsaXNoOiBmYWxzZSxcbiAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbjogJ19ldmVudFdvcmtlck9ubGluZSdcbiAgICAgICAgfSxcbiAgICAgICAgd29ya2VyUmVhZHk6IHtcbiAgICAgICAgICAgIGFsbG93UHVibGljUHVibGlzaDogZmFsc2UsXG4gICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb246ICdfZXZlbnRXb3JrZXJSZWFkeSdcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl19
|