UNPKG

flexbiz-server

Version:

Flexible Server

6 lines (5 loc) 1.82 kB
const worker_threads=require("worker_threads"),fs=require("fs"),_=require("lodash"); module.exports=class{constructor($filename$$,$max_queue$$=0){if(!fs.existsSync($filename$$))throw"Worker file is not exists";this.filename=$filename$$;this._queue=[];this.createWorker=this.createWorker.bind(this);this.runTask=this.runTask.bind(this);this.exec=this.exec.bind(this);this.busy=this.busy.bind(this);this.max_queue=$max_queue$$}createWorker($filename$$){function $onExit$$(){$worker$$.removeListener("error",$onExit$$);$worker$$.removeListener("exit",$onExit$$);$worker$$.removeListener("message", $onMessage$$);delete $self$$.worker;let $task$$=$self$$._queue.shift();$task$$&&$self$$.runTask($task$$)}function $onMessage$$($message$$){setImmediate(()=>{if($self$$.current_cb&&typeof $self$$.current_cb=="function"){try{$self$$.current_cb($message$$)}catch($e$$){Logger.error("can't call calback function",$self$$.current_cb,$e$$)}delete $self$$.current_cb}$self$$._queue.shift();$self$$._queue.length>0&&$self$$.runTask($self$$._queue[0])})}const $self$$=this,$worker$$=$self$$.worker=new worker_threads.Worker($filename$$); $worker$$.once("error",$onExit$$);$worker$$.once("exit",$onExit$$);$worker$$.on("message",$onMessage$$)}runTask($task$$){const $self$$=this;setImmediate(()=>{$self$$.worker||$self$$.createWorker($self$$.filename);$task$$.params&&_.isObject($task$$.params)&&($task$$.params=JSON.stringify($task$$.params));try{$self$$.worker.postMessage($task$$.params),$self$$.current_cb=$task$$.callback}catch($e$$){Logger.error("run task",$e$$,$task$$.params)}})}exec($params$$,$callback$$=()=>{}){this._queue.push({params:$params$$, callback:$callback$$});this._queue.length===1&&this.runTask(this._queue[0])}busy(){return this._queue.length>this.max_queue}destroy(){this.worker&&this.worker.terminate()}};