@resolveio/server-lib 20.7.53 → 20.7.56

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.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WorkerDispatcherManager=void 0;var common_1=require("../util/common"),WorkerDispatcherManager=function(){function WorkerDispatcherManager(){this._workers=[],this._taskQueue=[],this._clientRequests={},this._pendingTasks=new Map,this.MAX_CONCURRENCY=4}return WorkerDispatcherManager.create=function(e,t){var r=new WorkerDispatcherManager;return r.initialize(e,t),r},WorkerDispatcherManager.prototype.initialize=function(e,t){this._websocketManager=e,this._methodManager=t},WorkerDispatcherManager.prototype.isSafeShutdown=function(){return!this._taskQueue.length&&!this._pendingTasks.size},WorkerDispatcherManager.prototype.addWorker=function(e){this._workers.push({id:e.id_worker,ws:e,activeTasks:[]})},WorkerDispatcherManager.prototype.disconnectWorker=function(t){this._workers=this._workers.filter(function(e){return e.id!==t})},WorkerDispatcherManager.prototype.sendClientTask=function(e,t,r,s){var a="task-"+(0,common_1.objectIdHexString)();this._taskQueue.push({type:"task",taskId:a,messageId:e,method:t,params:r,userContext:s}),s&&s.id_ws&&(console.log(new Date,"Send Client Task",s,a),this._clientRequests[a]=s.id_ws),this.dispatchQueue()},WorkerDispatcherManager.prototype.sendInternalTask=function(e,t){void 0===t&&(t=[]),Array.isArray(t)||(t=[t]);var r="task-"+(0,common_1.objectIdHexString)();this._taskQueue.push({type:"task",taskId:r,method:e,params:t,messageId:0,userContext:{user:"Internal System"}}),this.dispatchQueue()},WorkerDispatcherManager.prototype.dispatchQueue=function(){var e=this;if(this._taskQueue.length)for(;0<this._taskQueue.length;){var t=this.findAvailableWorker();if(!t)return void setTimeout(function(){e.dispatchQueue()},25);var r=this._taskQueue.shift();this.assignTaskToWorker(t,r)}},WorkerDispatcherManager.prototype.findAvailableWorker=function(){var t=this,e=this._workers.filter(function(e){return e.activeTasks.length<t.MAX_CONCURRENCY});return e.length?(e.sort(function(e,t){return e.activeTasks.map(function(e){return e.weight}).reduce(function(e,t){return e+t},0)-t.activeTasks.map(function(e){return e.weight}).reduce(function(e,t){return e+t},0)}),console.log("Best Candidate",JSON.stringify(e[0],null,2)),e[0]):null},WorkerDispatcherManager.prototype.assignTaskToWorker=function(r,s){var a=this,e=this._methodManager.getMethod(s.method);if(e){r.activeTasks.push({taskId:s.taskId,weight:e&&e.workerTaskWeight?e.workerTaskWeight:1});var e={type:"task",taskId:s.taskId,messageId:s.messageId,method:s.method,params:s.params,userContext:s.userContext||{}},t=setTimeout(function(){var e,t;a._pendingTasks.has(s.taskId)&&a._pendingTasks.delete(s.taskId),console.log(new Date,"TIMEOUT HIT","task",s.taskId,s.messageId,s.method,JSON.stringify(a._workers)),r.activeTasks=r.activeTasks.filter(function(e){return e.taskId!==s.taskId}),s.userContext&&s.userContext.id_ws&&(e={messageId:s.messageId,hasError:!0,data:"Task timed out after 30s in WorkerDispatcherManager for method: "+s.method},t=a._websocketManager.getWebSocket(s.userContext.id_ws))&&a._websocketManager.send(t,e)},3e4);this._pendingTasks.set(s.taskId,{timeout:t}),console.log(new Date,"Sending Worker Msg","task",process.env.NODE_APP_INSTANCE,s.taskId,s.messageId,s.method,JSON.stringify(this._workers.map(function(e){return e.activeTasks})));try{this.sendWorkerPayload(r.ws,e)}catch(e){console.error("Failed to send task to worker:",e),clearTimeout(t),r.activeTasks=r.activeTasks.filter(function(e){return e.taskId!==s.taskId}),this._taskQueue.unshift(s)}}else console.error("Failed to send task to worker - Could not find method:",s.method)},WorkerDispatcherManager.prototype.handleWorkerMessage=function(t,r){var s,e,a,o;try{e=JSON.parse(r,common_1.dateReviver)}catch(e){return void console.error("Failed to parse worker message:",r)}console.log("Recv Worker Msg",e.type,e.taskId,e.messageId,e.error),"taskComplete"===e.type&&((r=this._workers.find(function(e){return e.id===t}))?(s=e.taskId,a=e.messageId,o=e.error,e=e.result,console.log(new Date,"Handle Worker Msg","taskComplete",process.env.NODE_APP_INSTANCE,s,JSON.stringify(this._workers.map(function(e){return e.activeTasks}))),r.activeTasks=r.activeTasks.filter(function(e){return e.taskId!==s}),(r=this._pendingTasks.get(s))&&(clearTimeout(r.timeout),this._pendingTasks.delete(s)),(r=this._clientRequests[s])&&(a={messageId:a,hasError:!1,data:e},o&&(a.hasError=!0,a.data=e),o=this._websocketManager.getWebSocket(r),console.log(new Date,"Found Client?",!!o),this._websocketManager.send(o,a),this._clientRequests[s])&&delete this._clientRequests[s],this.dispatchQueue()):console.error("Unknown worker for taskComplete:",t))},WorkerDispatcherManager.prototype.sendWorkerPayload=function(e,t){if("string"!=typeof t&&(t=JSON.stringify(t)),e&&e.readyState===e.OPEN)try{e.send(t)}catch(e){console.error("Failed to send worker response:",e)}else e&&e.close()},WorkerDispatcherManager}();exports.WorkerDispatcherManager=WorkerDispatcherManager;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WorkerDispatcherManager=void 0;var common_1=require("../util/common"),WorkerDispatcherManager=function(){function WorkerDispatcherManager(){this._workers=[],this._taskQueue=[],this._clientRequests={},this._pendingTasks=new Map,this.MAX_CONCURRENCY=4}return WorkerDispatcherManager.create=function(e,t){var r=new WorkerDispatcherManager;return r.initialize(e,t),r},WorkerDispatcherManager.prototype.initialize=function(e,t){this._websocketManager=e,this._methodManager=t},WorkerDispatcherManager.prototype.isSafeShutdown=function(){return!this._taskQueue.length&&!this._pendingTasks.size},WorkerDispatcherManager.prototype.addWorker=function(e){this._workers.push({id:e.id_worker,ws:e,activeTasks:[]})},WorkerDispatcherManager.prototype.disconnectWorker=function(t){this._workers=this._workers.filter(function(e){return e.id!==t})},WorkerDispatcherManager.prototype.sendClientTask=function(e,t,r,s){var a="task-"+(0,common_1.objectIdHexString)();this._taskQueue.push({type:"task",taskId:a,messageId:e,method:t,params:r,userContext:s}),s&&s.id_ws&&(this._clientRequests[a]=s.id_ws),this.dispatchQueue()},WorkerDispatcherManager.prototype.sendInternalTask=function(e,t){void 0===t&&(t=[]),Array.isArray(t)||(t=[t]);var r="task-"+(0,common_1.objectIdHexString)();this._taskQueue.push({type:"task",taskId:r,method:e,params:t,messageId:0,userContext:{user:"Internal System"}}),this.dispatchQueue()},WorkerDispatcherManager.prototype.dispatchQueue=function(){var e=this;if(this._taskQueue.length)for(;0<this._taskQueue.length;){var t=this.findAvailableWorker();if(!t)return void setTimeout(function(){e.dispatchQueue()},25);var r=this._taskQueue.shift();this.assignTaskToWorker(t,r)}},WorkerDispatcherManager.prototype.findAvailableWorker=function(){var t=this,e=this._workers.filter(function(e){return e.activeTasks.length<t.MAX_CONCURRENCY});return e.length?(e.sort(function(e,t){return e.activeTasks.map(function(e){return e.weight}).reduce(function(e,t){return e+t},0)-t.activeTasks.map(function(e){return e.weight}).reduce(function(e,t){return e+t},0)}),e[0]):null},WorkerDispatcherManager.prototype.assignTaskToWorker=function(r,s){var a=this,e=this._methodManager.getMethod(s.method);if(e){r.activeTasks.push({taskId:s.taskId,weight:e&&e.workerTaskWeight?e.workerTaskWeight:1});var e={type:"task",taskId:s.taskId,messageId:s.messageId,method:s.method,params:s.params,userContext:s.userContext||{}},t=setTimeout(function(){var e,t;a._pendingTasks.has(s.taskId)&&a._pendingTasks.delete(s.taskId),console.log(new Date,"TIMEOUT HIT","task",s.taskId,s.messageId,s.method,JSON.stringify(a._workers)),r.activeTasks=r.activeTasks.filter(function(e){return e.taskId!==s.taskId}),s.userContext&&s.userContext.id_ws&&(e={messageId:s.messageId,hasError:!0,data:"Task timed out after 30s in WorkerDispatcherManager for method: "+s.method},t=a._websocketManager.getWebSocket(s.userContext.id_ws))&&a._websocketManager.send(t,e)},12e4);this._pendingTasks.set(s.taskId,{timeout:t});try{this.sendWorkerPayload(r.ws,e)}catch(e){console.error("Failed to send task to worker:",e),clearTimeout(t),r.activeTasks=r.activeTasks.filter(function(e){return e.taskId!==s.taskId}),this._taskQueue.unshift(s)}}else console.error("Failed to send task to worker - Could not find method:",s.method)},WorkerDispatcherManager.prototype.handleWorkerMessage=function(t,r){var s,e,a,o;try{e=JSON.parse(r,common_1.dateReviver)}catch(e){return void console.error("Failed to parse worker message:",r)}"taskComplete"===e.type&&((r=this._workers.find(function(e){return e.id===t}))?(s=e.taskId,a=e.messageId,o=e.error,e=e.result,r.activeTasks=r.activeTasks.filter(function(e){return e.taskId!==s}),(r=this._pendingTasks.get(s))&&(clearTimeout(r.timeout),this._pendingTasks.delete(s)),(r=this._clientRequests[s])&&(a={messageId:a,hasError:!1,data:e},o&&(a.hasError=!0,a.data=e),o=this._websocketManager.getWebSocket(r),this._websocketManager.send(o,a),this._clientRequests[s])&&delete this._clientRequests[s],this.dispatchQueue()):console.error("Unknown worker for taskComplete:",t))},WorkerDispatcherManager.prototype.sendWorkerPayload=function(e,t){if("string"!=typeof t&&(t=JSON.stringify(t)),e&&e.readyState===e.OPEN)try{e.send(t)}catch(e){console.error("Failed to send worker response:",e)}else e&&e.close()},WorkerDispatcherManager}();exports.WorkerDispatcherManager=WorkerDispatcherManager;
2
2
  //# sourceMappingURL=worker-dispatcher.manager.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/worker-dispatcher.manager.ts"],"names":["common_1","require","WorkerDispatcherManager","this","_workers","_taskQueue","_clientRequests","_pendingTasks","Map","MAX_CONCURRENCY","create","websocketManager","methodManager","workerDispatcherManager","initialize","prototype","_websocketManager","_methodManager","isSafeShutdown","length","size","addWorker","ws","push","id","activeTasks","disconnectWorker","workerId","filter","w","sendClientTask","messageId","method","params","userContext","taskId","objectIdHexString","type","id_ws","console","log","Date","dispatchQueue","sendInternalTask","Array","isArray","user","_this","worker","findAvailableWorker","setTimeout","task","shift","assignTaskToWorker","candidates","x","sort","y","map","a","weight","reduce","b","JSON","stringify","getMethod","workerTaskWeight","payload","timeoutHandle","timeoutRes","clientWS","has","delete","hasError","data","getWebSocket","send","set","timeout","process","env","NODE_APP_INSTANCE","sendWorkerPayload","err","error","clearTimeout","unshift","handleWorkerMessage","messageStr","taskId_1","result","res","clientReqWS","parse","dateReviver","_a","find","pendingTask","get","clientReqId","readyState","OPEN","close","exports"],"mappings":"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","file":"worker-dispatcher.manager.js","sourcesContent":["import * as WebSocket from 'ws';\nimport { ServerResponseModel, TaskPayload, TaskResponse } from '../models/server-message.model';\nimport { dateReviver, objectIdHexString } from '../util/common';\nimport { MethodManager } from './method.manager';\nimport { WebSocketManager } from './websocket.manager';\n\nexport interface WorkerConnection {\n id: string;\n ws: WebSocket.WebSocket;\n activeTasks: { taskId: string, weight: number }[];\n}\n\nexport class WorkerDispatcherManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _methodManager: MethodManager;\n private _workers: WorkerConnection[] = [];\n\tprivate _taskQueue: TaskPayload[] = [];\n private _clientRequests: { [taskId: string]: string } = {};\n\tprivate _pendingTasks: Map<string, {\n\t\ttimeout: NodeJS.Timeout;\n\t}> = new Map();\n\n private MAX_CONCURRENCY = 4;\n\n constructor() {}\n \n static create(websocketManager: WebSocketManager, methodManager: MethodManager) {\n const workerDispatcherManager = new WorkerDispatcherManager();\n workerDispatcherManager.initialize(websocketManager, methodManager);\n return workerDispatcherManager;\n }\n\n public initialize(websocketManager: WebSocketManager, methodManager: MethodManager) {\n\t\tthis._websocketManager = websocketManager;\n\t\tthis._methodManager = methodManager;\n }\n\n\tpublic isSafeShutdown() {\n\t\treturn !this._taskQueue.length && !this._pendingTasks.size;\n\t}\n\n public addWorker(ws: WebSocket.WebSocket) {\n this._workers.push({\n\t\t\tid: ws['id_worker'],\n\t\t\tws: ws,\n\t\t\tactiveTasks: []\n\t\t});\n }\n\n\tpublic disconnectWorker(workerId: string) {\n\t\tthis._workers = this._workers.filter(w => w.id !== workerId);\n\t}\n\n /**\n\t * Add a new task to our in-memory queue and try to dispatch.\n\t */\n\tpublic sendClientTask(messageId: number, method: string, params: any[], userContext?: { id_user?: string; user?: string; id_ws?: string }) {\n\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmessageId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tuserContext\n\t\t});\n\n\t\tif (userContext && userContext.id_ws) {\n\t\t\tconsole.log(new Date(), 'Send Client Task', userContext, taskId);\n\t\t\tthis._clientRequests[taskId] = userContext.id_ws;\n\t\t}\n\n\t\tthis.dispatchQueue();\n\t}\n\n\tpublic sendInternalTask(method: string, params = []) {\n\t\tif (!Array.isArray(params)) {\n\t\t\tparams = [params];\n\t\t}\n\n\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tmessageId: 0,\n\t\t\tuserContext: {\n\t\t\t\tuser: 'Internal System'\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * The main loop that assigns tasks from _taskQueue to any worker that has capacity.\n\t */\n\tprivate dispatchQueue() {\n\t\tif (!this._taskQueue.length) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this._taskQueue.length > 0) {\n\t\t\tlet worker = this.findAvailableWorker();\n\n\t\t\tif (!worker) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.dispatchQueue();\n\t\t\t\t}, 25);\n\t\t\t\t\n\t\t\t\treturn; // no worker can take more tasks\n\t\t\t}\n\n\t\t\t// Remove from queue\n\t\t\tlet task = this._taskQueue.shift();\n\t\t\tthis.assignTaskToWorker(worker, task);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the worker with the fewest activeTasks that is under maxConcurrency. Or null if none.\n\t */\n\tprivate findAvailableWorker(): WorkerConnection | null {\n\t\tlet candidates = this._workers.filter(x => x.activeTasks.length < this.MAX_CONCURRENCY);\n\t\tif (!candidates.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Sort by how busy they are\n\t\tcandidates.sort((x, y) => x.activeTasks.map(a => a.weight).reduce((a, b) => a + b, 0) - y.activeTasks.map(a => a.weight).reduce((a, b) => a + b, 0));\n\t\tconsole.log('Best Candidate', JSON.stringify(candidates[0], null, 2));\n\t\treturn candidates[0];\n\t}\n\n\tprivate assignTaskToWorker(worker: WorkerConnection, task: TaskPayload) {\n\t\tlet method = this._methodManager.getMethod(task.method);\n\n\t\tif (!method) {\n\t\t\tconsole.error('Failed to send task to worker - Could not find method:', task.method);\n\t\t\treturn;\n\t\t}\n\n\t\tworker.activeTasks.push({\n\t\t\ttaskId: task.taskId,\n\t\t\tweight: method && method.workerTaskWeight ? method.workerTaskWeight : 1\n\t\t});\n\n\t\tlet payload: TaskPayload = {\n\t\t\ttype: 'task',\n\t\t\ttaskId: task.taskId,\n\t\t\tmessageId: task.messageId,\n\t\t\tmethod: task.method,\n\t\t\tparams: task.params,\n\t\t\tuserContext: task.userContext || {}\n\t\t};\n\n\t\tlet timeoutHandle = setTimeout(() => {\n\t\t\tif (this._pendingTasks.has(task.taskId)) {\n\t\t\t\tthis._pendingTasks.delete(task.taskId);\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'TIMEOUT HIT', 'task', task.taskId, task.messageId, task.method, JSON.stringify(this._workers));\n\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\n\t\t\tif (task.userContext && task.userContext.id_ws) {\n\t\t\t\tlet timeoutRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: task.messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: 'Task timed out after 30s in WorkerDispatcherManager for method: ' + task.method\n\t\t\t\t};\n\n\t\t\t\tlet clientWS = this._websocketManager.getWebSocket(task.userContext.id_ws);\n\n\t\t\t\tif (clientWS) {\n\t\t\t\t\tthis._websocketManager.send(clientWS, timeoutRes);\n\t\t\t\t}\n\t\t\t}\n\t\t}, 30000);\n\n\t\tthis._pendingTasks.set(task.taskId, {\n\t\t\ttimeout: timeoutHandle\n\t\t});\n\n\t\tconsole.log(new Date(), 'Sending Worker Msg', 'task', process.env.NODE_APP_INSTANCE, task.taskId, task.messageId, task.method, JSON.stringify(this._workers.map(a => a.activeTasks)));\n\n\t\ttry {\n\t\t\tthis.sendWorkerPayload(worker.ws, payload);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to send task to worker:', err);\n\n\t\t\tclearTimeout(timeoutHandle);\n\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\n\t\t\t// Put task back at front\n\t\t\tthis._taskQueue.unshift(task);\n\t\t}\n\t}\n\n\t/**\n\t * Handle messages coming back from a worker (like 'taskComplete').\n\t */\n\tpublic handleWorkerMessage(workerId: string, messageStr: string) {\n\t\tlet data: TaskResponse;\n\t\t\n\t\ttry {\n\t\t\tdata = JSON.parse(messageStr, dateReviver);\n\t\t}\n\t\tcatch {\n\t\t\tconsole.error('Failed to parse worker message:', messageStr);\n\t\t\treturn;\n\t\t}\n\n\t\tconsole.log('Recv Worker Msg', data.type, data.taskId, data.messageId, data.error);\n\n\t\tif (data.type === 'taskComplete') {\n\t\t\tlet worker = this._workers.find(x => x.id === workerId);\n\t\t\tif (!worker) {\n\t\t\t\tconsole.error('Unknown worker for taskComplete:', workerId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet { taskId, messageId, error, result } = data;\n\n\t\t\tconsole.log(new Date(), 'Handle Worker Msg', 'taskComplete', process.env.NODE_APP_INSTANCE, taskId, JSON.stringify(this._workers.map(a => a.activeTasks)));\n\t\t\t\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== taskId);\n\n\t\t\tlet pendingTask = this._pendingTasks.get(taskId);\n\t\t\tif (pendingTask) {\n\t\t\t\tclearTimeout(pendingTask.timeout);\n\t\t\t\tthis._pendingTasks.delete(taskId);\n\t\t\t}\n\n\t\t\t// Look up original request\n\t\t\tlet clientReqId = this._clientRequests[taskId];\n\t\t\t\n\t\t\tif (clientReqId) {\n\t\t\t\t// Send the final response to the client\n\t\t\t\tlet res: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: result\n\t\t\t\t};\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.hasError = true;\n\t\t\t\t\tres.data = result;\n\t\t\t\t}\n\n\t\t\t\tlet clientReqWS = this._websocketManager.getWebSocket(clientReqId);\n\n\t\t\t\tconsole.log(new Date(), 'Found Client?', !!clientReqWS);\n\n\t\t\t\tthis._websocketManager.send(clientReqWS, res);\n\n\t\t\t\tif (this._clientRequests[taskId]) {\n\t\t\t\t\tdelete this._clientRequests[taskId];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to dispatch more from the queue\n\t\t\tthis.dispatchQueue();\n\t\t}\n\t}\n\n\tpublic sendWorkerPayload(ws: WebSocket.WebSocket, payload: TaskPayload | string) {\n if (typeof payload !== 'string') {\n payload = JSON.stringify(payload);\n }\n\n\t\t// console.log('Sending', payload);\n\n if (ws && ws.readyState === ws.OPEN) {\n try {\n ws.send(payload);\n }\n catch (err) {\n console.error('Failed to send worker response:', err);\n }\n }\n else if (ws) {\n ws.close();\n }\n }\n}"]}
1
+ {"version":3,"sources":["../../src/managers/worker-dispatcher.manager.ts"],"names":["common_1","require","WorkerDispatcherManager","this","_workers","_taskQueue","_clientRequests","_pendingTasks","Map","MAX_CONCURRENCY","create","websocketManager","methodManager","workerDispatcherManager","initialize","prototype","_websocketManager","_methodManager","isSafeShutdown","length","size","addWorker","ws","push","id","activeTasks","disconnectWorker","workerId","filter","w","sendClientTask","messageId","method","params","userContext","taskId","objectIdHexString","type","id_ws","dispatchQueue","sendInternalTask","Array","isArray","user","_this","worker","findAvailableWorker","setTimeout","task","shift","assignTaskToWorker","candidates","x","sort","y","map","a","weight","reduce","b","getMethod","workerTaskWeight","payload","timeoutHandle","timeoutRes","clientWS","has","delete","console","log","Date","JSON","stringify","hasError","data","getWebSocket","send","set","timeout","sendWorkerPayload","err","error","clearTimeout","unshift","handleWorkerMessage","messageStr","taskId_1","result","res","clientReqWS","parse","dateReviver","_a","find","pendingTask","get","clientReqId","readyState","OPEN","close","exports"],"mappings":"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","file":"worker-dispatcher.manager.js","sourcesContent":["import * as WebSocket from 'ws';\nimport { ServerResponseModel, TaskPayload, TaskResponse } from '../models/server-message.model';\nimport { dateReviver, objectIdHexString } from '../util/common';\nimport { MethodManager } from './method.manager';\nimport { WebSocketManager } from './websocket.manager';\n\nexport interface WorkerConnection {\n id: string;\n ws: WebSocket.WebSocket;\n activeTasks: { taskId: string, weight: number }[];\n}\n\nexport class WorkerDispatcherManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _methodManager: MethodManager;\n private _workers: WorkerConnection[] = [];\n\tprivate _taskQueue: TaskPayload[] = [];\n private _clientRequests: { [taskId: string]: string } = {};\n\tprivate _pendingTasks: Map<string, {\n\t\ttimeout: NodeJS.Timeout;\n\t}> = new Map();\n\n private MAX_CONCURRENCY = 4;\n\n constructor() {}\n \n static create(websocketManager: WebSocketManager, methodManager: MethodManager) {\n const workerDispatcherManager = new WorkerDispatcherManager();\n workerDispatcherManager.initialize(websocketManager, methodManager);\n return workerDispatcherManager;\n }\n\n public initialize(websocketManager: WebSocketManager, methodManager: MethodManager) {\n\t\tthis._websocketManager = websocketManager;\n\t\tthis._methodManager = methodManager;\n }\n\n\tpublic isSafeShutdown() {\n\t\treturn !this._taskQueue.length && !this._pendingTasks.size;\n\t}\n\n public addWorker(ws: WebSocket.WebSocket) {\n this._workers.push({\n\t\t\tid: ws['id_worker'],\n\t\t\tws: ws,\n\t\t\tactiveTasks: []\n\t\t});\n }\n\n\tpublic disconnectWorker(workerId: string) {\n\t\tthis._workers = this._workers.filter(w => w.id !== workerId);\n\t}\n\n /**\n\t * Add a new task to our in-memory queue and try to dispatch.\n\t */\n\tpublic sendClientTask(messageId: number, method: string, params: any[], userContext?: { id_user?: string; user?: string; id_ws?: string }) {\n\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmessageId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tuserContext\n\t\t});\n\n\t\tif (userContext && userContext.id_ws) {\n\t\t\t// console.log(new Date(), 'Send Client Task', userContext, taskId);\n\t\t\tthis._clientRequests[taskId] = userContext.id_ws;\n\t\t}\n\n\t\tthis.dispatchQueue();\n\t}\n\n\tpublic sendInternalTask(method: string, params = []) {\n\t\tif (!Array.isArray(params)) {\n\t\t\tparams = [params];\n\t\t}\n\n\t\tlet taskId = 'task-' + objectIdHexString();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tmessageId: 0,\n\t\t\tuserContext: {\n\t\t\t\tuser: 'Internal System'\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * The main loop that assigns tasks from _taskQueue to any worker that has capacity.\n\t */\n\tprivate dispatchQueue() {\n\t\tif (!this._taskQueue.length) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this._taskQueue.length > 0) {\n\t\t\tlet worker = this.findAvailableWorker();\n\n\t\t\tif (!worker) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.dispatchQueue();\n\t\t\t\t}, 25);\n\t\t\t\t\n\t\t\t\treturn; // no worker can take more tasks\n\t\t\t}\n\n\t\t\t// Remove from queue\n\t\t\tlet task = this._taskQueue.shift();\n\t\t\tthis.assignTaskToWorker(worker, task);\n\t\t}\n\t}\n\n\t/**\n\t * Returns the worker with the fewest activeTasks that is under maxConcurrency. Or null if none.\n\t */\n\tprivate findAvailableWorker(): WorkerConnection | null {\n\t\tlet candidates = this._workers.filter(x => x.activeTasks.length < this.MAX_CONCURRENCY);\n\t\tif (!candidates.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Sort by how busy they are\n\t\tcandidates.sort((x, y) => x.activeTasks.map(a => a.weight).reduce((a, b) => a + b, 0) - y.activeTasks.map(a => a.weight).reduce((a, b) => a + b, 0));\n\t\t// console.log('Best Candidate', JSON.stringify(candidates[0], null, 2));\n\t\treturn candidates[0];\n\t}\n\n\tprivate assignTaskToWorker(worker: WorkerConnection, task: TaskPayload) {\n\t\tlet method = this._methodManager.getMethod(task.method);\n\n\t\tif (!method) {\n\t\t\tconsole.error('Failed to send task to worker - Could not find method:', task.method);\n\t\t\treturn;\n\t\t}\n\n\t\tworker.activeTasks.push({\n\t\t\ttaskId: task.taskId,\n\t\t\tweight: method && method.workerTaskWeight ? method.workerTaskWeight : 1\n\t\t});\n\n\t\tlet payload: TaskPayload = {\n\t\t\ttype: 'task',\n\t\t\ttaskId: task.taskId,\n\t\t\tmessageId: task.messageId,\n\t\t\tmethod: task.method,\n\t\t\tparams: task.params,\n\t\t\tuserContext: task.userContext || {}\n\t\t};\n\n\t\tlet timeoutHandle = setTimeout(() => {\n\t\t\tif (this._pendingTasks.has(task.taskId)) {\n\t\t\t\tthis._pendingTasks.delete(task.taskId);\n\t\t\t}\n\n\t\t\tconsole.log(new Date(), 'TIMEOUT HIT', 'task', task.taskId, task.messageId, task.method, JSON.stringify(this._workers));\n\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\n\t\t\tif (task.userContext && task.userContext.id_ws) {\n\t\t\t\tlet timeoutRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: task.messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: 'Task timed out after 30s in WorkerDispatcherManager for method: ' + task.method\n\t\t\t\t};\n\n\t\t\t\tlet clientWS = this._websocketManager.getWebSocket(task.userContext.id_ws);\n\n\t\t\t\tif (clientWS) {\n\t\t\t\t\tthis._websocketManager.send(clientWS, timeoutRes);\n\t\t\t\t}\n\t\t\t}\n\t\t}, 120000);\n\n\t\tthis._pendingTasks.set(task.taskId, {\n\t\t\ttimeout: timeoutHandle\n\t\t});\n\n\t\t// console.log(new Date(), 'Sending Worker Msg', 'task', process.env.NODE_APP_INSTANCE, task.taskId, task.messageId, task.method, JSON.stringify(this._workers.map(a => a.activeTasks)));\n\n\t\ttry {\n\t\t\tthis.sendWorkerPayload(worker.ws, payload);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to send task to worker:', err);\n\n\t\t\tclearTimeout(timeoutHandle);\n\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\n\t\t\t// Put task back at front\n\t\t\tthis._taskQueue.unshift(task);\n\t\t}\n\t}\n\n\t/**\n\t * Handle messages coming back from a worker (like 'taskComplete').\n\t */\n\tpublic handleWorkerMessage(workerId: string, messageStr: string) {\n\t\tlet data: TaskResponse;\n\t\t\n\t\ttry {\n\t\t\tdata = JSON.parse(messageStr, dateReviver);\n\t\t}\n\t\tcatch {\n\t\t\tconsole.error('Failed to parse worker message:', messageStr);\n\t\t\treturn;\n\t\t}\n\n\t\t// console.log('Recv Worker Msg', data.type, data.taskId, data.messageId, data.error);\n\n\t\tif (data.type === 'taskComplete') {\n\t\t\tlet worker = this._workers.find(x => x.id === workerId);\n\t\t\tif (!worker) {\n\t\t\t\tconsole.error('Unknown worker for taskComplete:', workerId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tlet { taskId, messageId, error, result } = data;\n\n\t\t\t// console.log(new Date(), 'Handle Worker Msg', 'taskComplete', process.env.NODE_APP_INSTANCE, taskId, JSON.stringify(this._workers.map(a => a.activeTasks)));\n\t\t\t\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== taskId);\n\n\t\t\tlet pendingTask = this._pendingTasks.get(taskId);\n\t\t\tif (pendingTask) {\n\t\t\t\tclearTimeout(pendingTask.timeout);\n\t\t\t\tthis._pendingTasks.delete(taskId);\n\t\t\t}\n\n\t\t\t// Look up original request\n\t\t\tlet clientReqId = this._clientRequests[taskId];\n\t\t\t\n\t\t\tif (clientReqId) {\n\t\t\t\t// Send the final response to the client\n\t\t\t\tlet res: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: result\n\t\t\t\t};\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.hasError = true;\n\t\t\t\t\tres.data = result;\n\t\t\t\t}\n\n\t\t\t\tlet clientReqWS = this._websocketManager.getWebSocket(clientReqId);\n\n\t\t\t\tthis._websocketManager.send(clientReqWS, res);\n\n\t\t\t\tif (this._clientRequests[taskId]) {\n\t\t\t\t\tdelete this._clientRequests[taskId];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to dispatch more from the queue\n\t\t\tthis.dispatchQueue();\n\t\t}\n\t}\n\n\tpublic sendWorkerPayload(ws: WebSocket.WebSocket, payload: TaskPayload | string) {\n if (typeof payload !== 'string') {\n payload = JSON.stringify(payload);\n }\n\n\t\t// console.log('Sending', payload);\n\n if (ws && ws.readyState === ws.OPEN) {\n try {\n ws.send(payload);\n }\n catch (err) {\n console.error('Failed to send worker response:', err);\n }\n }\n else if (ws) {\n ws.close();\n }\n }\n}"]}
@@ -1,2 +1,2 @@
1
- "use strict";var __awaiter=this&&this.__awaiter||function(e,t,o,s){return new(o=o||Promise)(function(n,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?n(e.value):((r=e.value)instanceof o?r:new o(function(e){e(r)})).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())})},__generator=this&&this.__generator||function(t,o){var s,a,i,c={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},l={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function verb(n){return function(e){var r=[n,e];if(s)throw new TypeError("Generator is already executing.");for(;c=l&&r[l=0]?0:c;)try{if(s=1,a&&(i=2&r[0]?a.return:r[0]?a.throw||((i=a.return)&&i.call(a),0):a.next)&&!(i=i.call(a,r[1])).done)return i;switch(a=0,(r=i?[2&r[0],i.value]:r)[0]){case 0:case 1:i=r;break;case 4:return c.label++,{value:r[1],done:!1};case 5:c.label++,a=r[1],r=[0];continue;case 7:r=c.ops.pop(),c.trys.pop();continue;default:if(!(i=0<(i=c.trys).length&&i[i.length-1])&&(6===r[0]||2===r[0])){c=0;continue}if(3===r[0]&&(!i||r[1]>i[0]&&r[1]<i[3]))c.label=r[1];else if(6===r[0]&&c.label<i[1])c.label=i[1],i=r;else{if(!(i&&c.label<i[2])){i[2]&&c.ops.pop(),c.trys.pop();continue}c.label=i[2],c.ops.push(r)}}r=o.call(t,c)}catch(e){r=[6,e],a=0}finally{s=i=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},__read=this&&this.__read||function(e,r){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var t,o,s=n.call(e),a=[];try{for(;(void 0===r||0<r--)&&!(t=s.next()).done;)a.push(t.value)}catch(e){o={error:e}}finally{try{t&&!t.done&&(n=s.return)&&n.call(s)}finally{if(o)throw o.error}}return a},__spreadArray=this&&this.__spreadArray||function(e,r,n){if(n||2===arguments.length)for(var t,o=0,s=r.length;o<s;o++)!t&&o in r||((t=t||Array.prototype.slice.call(r,0,o))[o]=r[o]);return e.concat(t||Array.prototype.slice.call(r))},WebSocket=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.WorkerServerManager=void 0,require("ws")),common_1=require("../util/common"),method_manager_1=require("./method.manager"),WorkerServerManager=function(){function WorkerServerManager(){this._runningTasks=[]}return WorkerServerManager.create=function(e,r){var n=new WorkerServerManager;return n.initialize(e,r),n},WorkerServerManager.prototype.initialize=function(e,r){this._methodManager=e,this._serverConfig=r,this.startWorkerInstance()},WorkerServerManager.prototype.startWorkerInstance=function(){var e=this,r=(console.log(new Date,"Worker instance started, connecting to main server via WebSocket..."),this._serverConfig.SERVER_URL+"/websocket?workerToken="+this._serverConfig.WORKER_TOKEN),t=new WebSocket(r),o=null,n=null;t.on("open",function(){console.log(new Date,"Connected to main server as worker",process.env.WORKER_INDEX,process.env.NODE_APP_INSTANCE),e.sendWorkerResponse(t,"ping"),n=setInterval(function(){o?(o=null,e.sendWorkerResponse(t,"ping")):t.close()},15e3)}),t.on("message",function(n){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return"ping"!==(n="string"!=typeof n?n.toString():n)?[3,1]:(this.sendWorkerResponse(t,"pong"),[3,4]);case 1:return"pong"!==n?[3,2]:(o=new Date,[3,4]);case 2:r=void 0;try{r=JSON.parse(n,common_1.dateReviver)}catch(e){return console.error("Worker parse error",e),[2]}return"task"!==r.type?[3,4]:[4,this.handleIncomingTask(t,r)];case 3:e.sent(),e.label=4;case 4:return[2]}})})}),t.on("close",function(){console.log(new Date,"Disconnected from main server. Reconnecting in 5s..."),setTimeout(function(){console.log("Reconnecting to Main Server"),e.startWorkerInstance()},5e3),n&&clearInterval(n)}),t.on("error",function(e){console.error(new Date,"Worker WS error:",e),t.close()})},WorkerServerManager.prototype.handleIncomingTask=function(d,h){return __awaiter(this,void 0,void 0,function(){var r,n,t,o,s,a,i,c,l,u=this;return __generator(this,function(e){switch(e.label){case 0:if(r=h.taskId,n=h.messageId,t=h.method,o=h.params,s=h.userContext,this._runningTasks.push(r),!r||!t)return console.log("Invalid task message received",h),this.sendWorkerResponse(d,{type:"taskComplete",taskId:r,messageId:n,error:!0,result:"Invalid task"}),[2];a=!1,i=setTimeout(function(){return __awaiter(u,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return a=!0,console.error(new Date,"Worker timed out on task:",r,"Method:",t),console.error(new Date,"Error in Method: ".concat(t," - ").concat(JSON.stringify(h,null,2))),this.sendWorkerResponse(d,{type:"taskComplete",taskId:r,messageId:n,error:!0,result:"Task timed out"}),[4,this._methodManager.callMethod("insertErrorLog","Timeout in Method: ".concat(t," - ").concat(JSON.stringify(h,null,2)))];case 1:return e.sent(),[2]}})})},12e4),e.label=1;case 1:return e.trys.push([1,3,,5]),c=Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:(null==s?void 0:s.id_user)||"",user:(null==s?void 0:s.user)||"",id_ws:(null==s?void 0:s.id_ws)||""}),console.log(new Date,"Running method",t),[4,(l=this._methodManager.callMethod).call.apply(l,__spreadArray([c,t],__read(o),!1))];case 2:return l=e.sent(),console.log(new Date,"Finished method",t),a||(clearTimeout(i),this.sendWorkerResponse(d,{type:"taskComplete",taskId:r,messageId:n,error:!1,result:l})),this._runningTasks=this._runningTasks.filter(function(e){return e!==r}),console.log(new Date,"Done with Task",JSON.stringify(this._runningTasks,null,2)),[3,5];case 3:if(c=e.sent(),a)return console.error(new Date,"Error in Method: ".concat(t," - ").concat(JSON.stringify(h,null,2))),[4,this._methodManager.callMethod("insertErrorLog","Error in Method: ".concat(t," - ").concat(JSON.stringify(h,null,2)))];throw clearTimeout(i),console.error("Worker failed task:",r,"Method:",t,c),c.message="Worker failed task:"+r+" Method:"+t+" - "+c.message,this.sendWorkerResponse(d,{type:"taskComplete",taskId:r,messageId:n,error:!0,result:c||"Unknown error"}),c;case 4:return e.sent(),this._runningTasks=this._runningTasks.filter(function(e){return e!==r}),[3,5];case 5:return[2]}})})},WorkerServerManager.prototype.sendWorkerResponse=function(e,r){if("string"!=typeof r&&(r=JSON.stringify(r)),e&&e.readyState===e.OPEN)try{e.send(r)}catch(e){console.error("Failed to send worker response:",e)}else e&&e.close()},WorkerServerManager}();exports.WorkerServerManager=WorkerServerManager;
1
+ "use strict";var __awaiter=this&&this.__awaiter||function(e,t,o,s){return new(o=o||Promise)(function(n,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?n(e.value):((r=e.value)instanceof o?r:new o(function(e){e(r)})).then(fulfilled,rejected)}step((s=s.apply(e,t||[])).next())})},__generator=this&&this.__generator||function(t,o){var s,a,i,c={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},l={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function verb(n){return function(e){var r=[n,e];if(s)throw new TypeError("Generator is already executing.");for(;c=l&&r[l=0]?0:c;)try{if(s=1,a&&(i=2&r[0]?a.return:r[0]?a.throw||((i=a.return)&&i.call(a),0):a.next)&&!(i=i.call(a,r[1])).done)return i;switch(a=0,(r=i?[2&r[0],i.value]:r)[0]){case 0:case 1:i=r;break;case 4:return c.label++,{value:r[1],done:!1};case 5:c.label++,a=r[1],r=[0];continue;case 7:r=c.ops.pop(),c.trys.pop();continue;default:if(!(i=0<(i=c.trys).length&&i[i.length-1])&&(6===r[0]||2===r[0])){c=0;continue}if(3===r[0]&&(!i||r[1]>i[0]&&r[1]<i[3]))c.label=r[1];else if(6===r[0]&&c.label<i[1])c.label=i[1],i=r;else{if(!(i&&c.label<i[2])){i[2]&&c.ops.pop(),c.trys.pop();continue}c.label=i[2],c.ops.push(r)}}r=o.call(t,c)}catch(e){r=[6,e],a=0}finally{s=i=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},__read=this&&this.__read||function(e,r){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var t,o,s=n.call(e),a=[];try{for(;(void 0===r||0<r--)&&!(t=s.next()).done;)a.push(t.value)}catch(e){o={error:e}}finally{try{t&&!t.done&&(n=s.return)&&n.call(s)}finally{if(o)throw o.error}}return a},__spreadArray=this&&this.__spreadArray||function(e,r,n){if(n||2===arguments.length)for(var t,o=0,s=r.length;o<s;o++)!t&&o in r||((t=t||Array.prototype.slice.call(r,0,o))[o]=r[o]);return e.concat(t||Array.prototype.slice.call(r))},WebSocket=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.WorkerServerManager=void 0,require("ws")),common_1=require("../util/common"),method_manager_1=require("./method.manager"),WorkerServerManager=function(){function WorkerServerManager(){this._runningTasks=[]}return WorkerServerManager.create=function(e,r){var n=new WorkerServerManager;return n.initialize(e,r),n},WorkerServerManager.prototype.initialize=function(e,r){this._methodManager=e,this._serverConfig=r,this.startWorkerInstance()},WorkerServerManager.prototype.startWorkerInstance=function(){var e=this,r=(console.log(new Date,"Worker instance started, connecting to main server via WebSocket..."),this._serverConfig.SERVER_URL+"/websocket?workerToken="+this._serverConfig.WORKER_TOKEN),t=new WebSocket(r),o=null,n=null;t.on("open",function(){console.log(new Date,"Connected to main server as worker",process.env.WORKER_INDEX,process.env.NODE_APP_INSTANCE),e.sendWorkerResponse(t,"ping"),n=setInterval(function(){o?(o=null,e.sendWorkerResponse(t,"ping")):t.close()},15e3)}),t.on("message",function(n){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return"ping"!==(n="string"!=typeof n?n.toString():n)?[3,1]:(this.sendWorkerResponse(t,"pong"),[3,4]);case 1:return"pong"!==n?[3,2]:(o=new Date,[3,4]);case 2:r=void 0;try{r=JSON.parse(n,common_1.dateReviver)}catch(e){return console.error("Worker parse error",e),[2]}return"task"!==r.type?[3,4]:[4,this.handleIncomingTask(t,r)];case 3:e.sent(),e.label=4;case 4:return[2]}})})}),t.on("close",function(){console.log(new Date,"Disconnected from main server. Reconnecting in 5s..."),setTimeout(function(){e.startWorkerInstance()},5e3),n&&clearInterval(n)}),t.on("error",function(e){console.error(new Date,"Worker WS error:",e),t.close()})},WorkerServerManager.prototype.handleIncomingTask=function(d,h){return __awaiter(this,void 0,void 0,function(){var r,n,t,o,s,a,i,c,l,u=this;return __generator(this,function(e){switch(e.label){case 0:if(r=h.taskId,n=h.messageId,t=h.method,o=h.params,s=h.userContext,this._runningTasks.push(r),!r||!t)return this.sendWorkerResponse(d,{type:"taskComplete",taskId:r,messageId:n,error:!0,result:"Invalid task"}),[2];a=!1,i=setTimeout(function(){return __awaiter(u,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return a=!0,console.error(new Date,"Worker timed out on task:",r,"Method:",t),console.error(new Date,"Error in Method: ".concat(t," - ").concat(JSON.stringify(h,null,2))),this.sendWorkerResponse(d,{type:"taskComplete",taskId:r,messageId:n,error:!0,result:"Task timed out"}),[4,this._methodManager.callMethod("insertErrorLog","Timeout in Method: ".concat(t," - ").concat(JSON.stringify(h,null,2)))];case 1:return e.sent(),[2]}})})},12e4),e.label=1;case 1:return e.trys.push([1,3,,5]),c=Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:(null==s?void 0:s.id_user)||"",user:(null==s?void 0:s.user)||"",id_ws:(null==s?void 0:s.id_ws)||""}),console.log(new Date,"Running method",t),[4,(l=this._methodManager.callMethod).call.apply(l,__spreadArray([c,t],__read(o),!1))];case 2:return l=e.sent(),console.log(new Date,"Finished method",t),a||(clearTimeout(i),this.sendWorkerResponse(d,{type:"taskComplete",taskId:r,messageId:n,error:!1,result:l})),this._runningTasks=this._runningTasks.filter(function(e){return e!==r}),console.log(new Date,"Done with Task",JSON.stringify(this._runningTasks,null,2)),[3,5];case 3:if(c=e.sent(),a)return console.error(new Date,"Error in Method: ".concat(t," - ").concat(JSON.stringify(h,null,2))),[4,this._methodManager.callMethod("insertErrorLog","Error in Method: ".concat(t," - ").concat(JSON.stringify(h,null,2)))];throw clearTimeout(i),console.error("Worker failed task:",r,"Method:",t,c),c.message="Worker failed task:"+r+" Method:"+t+" - "+c.message,this.sendWorkerResponse(d,{type:"taskComplete",taskId:r,messageId:n,error:!0,result:c||"Unknown error"}),c;case 4:return e.sent(),this._runningTasks=this._runningTasks.filter(function(e){return e!==r}),[3,5];case 5:return[2]}})})},WorkerServerManager.prototype.sendWorkerResponse=function(e,r){if("string"!=typeof r&&(r=JSON.stringify(r)),e&&e.readyState===e.OPEN)try{e.send(r)}catch(e){console.error("Failed to send worker response:",e)}else e&&e.close()},WorkerServerManager}();exports.WorkerServerManager=WorkerServerManager;
2
2
  //# sourceMappingURL=worker-server.manager.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/worker-server.manager.ts"],"names":["WebSocket","require","common_1","method_manager_1","WorkerServerManager","this","_runningTasks","create","methodManager","serverConfig","workerServerManager","initialize","prototype","_methodManager","_serverConfig","startWorkerInstance","_this","wsUrl","console","log","Date","ws","lastComm","interval","on","process","env","WORKER_INDEX","NODE_APP_INSTANCE","sendWorkerResponse","setInterval","close","rawData","__awaiter","toString","msg","JSON","parse","dateReviver","e","error","type","handleIncomingTask","_a","sent","setTimeout","clearInterval","err","data","taskId","messageId","method","params","userContext","push","result","timedOut","timeoutHandle","concat","stringify","callMethod","managerThis","Object","assign","MethodManager","id_user","user","id_ws","call","apply","__spreadArray","__read","_b","clearTimeout","filter","a","err_1","message","payload","readyState","OPEN","send","exports"],"mappings":"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","file":"worker-server.manager.js","sourcesContent":["import * as WebSocket from 'ws';\nimport { TaskPayload, TaskResponse } from '../models/server-message.model';\nimport { dateReviver } from '../util/common';\nimport { MethodManager } from './method.manager';\n\nexport class WorkerServerManager {\n private _methodManager;\n private _serverConfig;\n private _runningTasks = [];\n\n constructor() {}\n \n static create(methodManager: MethodManager, serverConfig) {\n const workerServerManager = new WorkerServerManager();\n workerServerManager.initialize(methodManager, serverConfig);\n return workerServerManager;\n }\n\n public initialize(methodManager: MethodManager, serverConfig) {\n this._methodManager = methodManager;\n this._serverConfig = serverConfig;\n this.startWorkerInstance();\n }\n\n private startWorkerInstance() {\n console.log(new Date(), 'Worker instance started, connecting to main server via WebSocket...');\n\n let wsUrl = this._serverConfig['SERVER_URL'] + '/websocket?workerToken=' + this._serverConfig['WORKER_TOKEN'];\n\n const ws = new WebSocket(wsUrl);\n\n let lastComm = null;\n let interval = null;\n\n ws.on('open', () => {\n console.log(new Date(), 'Connected to main server as worker', process.env.WORKER_INDEX, process.env.NODE_APP_INSTANCE);\n this.sendWorkerResponse(ws, 'ping');\n\n interval = setInterval(() => {\n if (!lastComm) {\n ws.close();\n }\n else {\n lastComm = null;\n this.sendWorkerResponse(ws, 'ping');\n }\n }, 15000);\n });\n\n ws.on('message', async (rawData: any) => {\n // console.log(new Date(), 'Message Recv', rawData);\n\n if (typeof rawData !== 'string') {\n rawData = rawData.toString();\n }\n\n // console.log(new Date(), 'Message Recv From Main Server', rawData);\n\n if (rawData === 'ping') {\n // console.log(new Date(), 'Recv Ping, Sending Pong');\n this.sendWorkerResponse(ws, 'pong');\n }\n else if (rawData === 'pong') {\n // console.log(new Date(), 'Recv Ping, Sending Pong');\n lastComm = new Date();\n }\n else {\n let msg: any;\n try {\n msg = JSON.parse(rawData, dateReviver);\n }\n catch (e) {\n console.error('Worker parse error', e);\n return;\n }\n\n // We expect: { type: 'task', taskId, method, params, userContext? }\n if (msg.type === 'task') {\n await this.handleIncomingTask(ws, msg);\n }\n }\n });\n\n ws.on('close', () => {\n console.log(new Date(), 'Disconnected from main server. Reconnecting in 5s...');\n setTimeout(() => {\n console.log('Reconnecting to Main Server');\n this.startWorkerInstance();\n }, 5000);\n\n if (interval) {\n clearInterval(interval);\n }\n });\n\n ws.on('error', (err) => {\n console.error(new Date(), 'Worker WS error:', err);\n ws.close();\n });\n }\n\n private async handleIncomingTask(ws: WebSocket.WebSocket, data: TaskPayload) {\n let { taskId, messageId, method, params, userContext } = data;\n this._runningTasks.push(taskId);\n if (!taskId || !method) {\n console.log('Invalid task message received', data);\n this.sendWorkerResponse(ws, {\n type: 'taskComplete',\n taskId,\n messageId,\n error: true,\n result: 'Invalid task'\n });\n\n return;\n }\n\n let timedOut = false;\n let timeoutHandle = setTimeout(async () => {\n timedOut = true;\n console.error(new Date(), 'Worker timed out on task:', taskId, 'Method:', method);\n\n console.error(new Date(), `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\n this.sendWorkerResponse(ws, {\n type: 'taskComplete',\n taskId,\n messageId,\n error: true,\n result: 'Task timed out'\n });\n\n await this._methodManager.callMethod('insertErrorLog', `Timeout in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n }, 120000);\n\n try {\n let managerThis = Object.assign({}, this._methodManager, MethodManager.prototype, {\n id_user: userContext?.id_user || '',\n user: userContext?.user || '',\n id_ws: userContext?.id_ws || ''\n });\n\n console.log(new Date(), 'Running method', method);\n\n let result = await this._methodManager.callMethod.call(managerThis, method, ...params);\n\n console.log(new Date(), 'Finished method', method);\n\n if (!timedOut) {\n clearTimeout(timeoutHandle);\n this.sendWorkerResponse(ws, {\n type: 'taskComplete',\n taskId,\n messageId,\n error: false,\n result\n });\n }\n\n this._runningTasks = this._runningTasks.filter(a => a !== taskId);\n \n console.log(new Date(), 'Done with Task', JSON.stringify(this._runningTasks, null, 2));\n }\n catch (err) {\n if (!timedOut) {\n clearTimeout(timeoutHandle);\n console.error('Worker failed task:', taskId, 'Method:', method, err);\n err.message = 'Worker failed task:' + taskId + ' Method:' + method + ' - ' + err.message;\n this.sendWorkerResponse(ws, {\n type: 'taskComplete',\n taskId,\n messageId,\n error: true,\n result: err || 'Unknown error'\n });\n throw err;\n }\n\n console.error(new Date(), `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n \n await this._methodManager.callMethod('insertErrorLog', `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n \n this._runningTasks = this._runningTasks.filter(a => a !== taskId);\n }\n }\n\n public sendWorkerResponse(ws, payload: TaskResponse | string) {\n if (typeof payload !== 'string') {\n payload = JSON.stringify(payload);\n }\n\n // console.log(new Date(), 'Sending', payload);\n\n if (ws && ws.readyState === ws.OPEN) {\n try {\n ws.send(payload);\n }\n catch (err) {\n console.error('Failed to send worker response:', err);\n }\n }\n else if (ws) {\n ws.close();\n }\n }\n}"]}
1
+ {"version":3,"sources":["../../src/managers/worker-server.manager.ts"],"names":["WebSocket","require","common_1","method_manager_1","WorkerServerManager","this","_runningTasks","create","methodManager","serverConfig","workerServerManager","initialize","prototype","_methodManager","_serverConfig","startWorkerInstance","_this","wsUrl","console","log","Date","ws","lastComm","interval","on","process","env","WORKER_INDEX","NODE_APP_INSTANCE","sendWorkerResponse","setInterval","close","rawData","__awaiter","toString","msg","JSON","parse","dateReviver","e","error","type","handleIncomingTask","_a","sent","setTimeout","clearInterval","err","data","taskId","messageId","method","params","userContext","push","result","timedOut","timeoutHandle","concat","stringify","callMethod","managerThis","Object","assign","MethodManager","id_user","user","id_ws","call","apply","__spreadArray","__read","_b","clearTimeout","filter","a","err_1","message","payload","readyState","OPEN","send","exports"],"mappings":"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","file":"worker-server.manager.js","sourcesContent":["import * as WebSocket from 'ws';\nimport { TaskPayload, TaskResponse } from '../models/server-message.model';\nimport { dateReviver } from '../util/common';\nimport { MethodManager } from './method.manager';\n\nexport class WorkerServerManager {\n private _methodManager;\n private _serverConfig;\n private _runningTasks = [];\n\n constructor() {}\n \n static create(methodManager: MethodManager, serverConfig) {\n const workerServerManager = new WorkerServerManager();\n workerServerManager.initialize(methodManager, serverConfig);\n return workerServerManager;\n }\n\n public initialize(methodManager: MethodManager, serverConfig) {\n this._methodManager = methodManager;\n this._serverConfig = serverConfig;\n this.startWorkerInstance();\n }\n\n private startWorkerInstance() {\n console.log(new Date(), 'Worker instance started, connecting to main server via WebSocket...');\n\n let wsUrl = this._serverConfig['SERVER_URL'] + '/websocket?workerToken=' + this._serverConfig['WORKER_TOKEN'];\n\n const ws = new WebSocket(wsUrl);\n\n let lastComm = null;\n let interval = null;\n\n ws.on('open', () => {\n console.log(new Date(), 'Connected to main server as worker', process.env.WORKER_INDEX, process.env.NODE_APP_INSTANCE);\n this.sendWorkerResponse(ws, 'ping');\n\n interval = setInterval(() => {\n if (!lastComm) {\n ws.close();\n }\n else {\n lastComm = null;\n this.sendWorkerResponse(ws, 'ping');\n }\n }, 15000);\n });\n\n ws.on('message', async (rawData: any) => {\n // console.log(new Date(), 'Message Recv', rawData);\n\n if (typeof rawData !== 'string') {\n rawData = rawData.toString();\n }\n\n // console.log(new Date(), 'Message Recv From Main Server', rawData);\n\n if (rawData === 'ping') {\n // console.log(new Date(), 'Recv Ping, Sending Pong');\n this.sendWorkerResponse(ws, 'pong');\n }\n else if (rawData === 'pong') {\n // console.log(new Date(), 'Recv Ping, Sending Pong');\n lastComm = new Date();\n }\n else {\n let msg: any;\n try {\n msg = JSON.parse(rawData, dateReviver);\n }\n catch (e) {\n console.error('Worker parse error', e);\n return;\n }\n\n // We expect: { type: 'task', taskId, method, params, userContext? }\n if (msg.type === 'task') {\n await this.handleIncomingTask(ws, msg);\n }\n }\n });\n\n ws.on('close', () => {\n console.log(new Date(), 'Disconnected from main server. Reconnecting in 5s...');\n setTimeout(() => {\n // console.log('Reconnecting to Main Server');\n this.startWorkerInstance();\n }, 5000);\n\n if (interval) {\n clearInterval(interval);\n }\n });\n\n ws.on('error', (err) => {\n console.error(new Date(), 'Worker WS error:', err);\n ws.close();\n });\n }\n\n private async handleIncomingTask(ws: WebSocket.WebSocket, data: TaskPayload) {\n let { taskId, messageId, method, params, userContext } = data;\n this._runningTasks.push(taskId);\n if (!taskId || !method) {\n // console.log('Invalid task message received', data);\n this.sendWorkerResponse(ws, {\n type: 'taskComplete',\n taskId,\n messageId,\n error: true,\n result: 'Invalid task'\n });\n\n return;\n }\n\n let timedOut = false;\n let timeoutHandle = setTimeout(async () => {\n timedOut = true;\n console.error(new Date(), 'Worker timed out on task:', taskId, 'Method:', method);\n\n console.error(new Date(), `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n\n this.sendWorkerResponse(ws, {\n type: 'taskComplete',\n taskId,\n messageId,\n error: true,\n result: 'Task timed out'\n });\n\n await this._methodManager.callMethod('insertErrorLog', `Timeout in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n }, 120000);\n\n try {\n let managerThis = Object.assign({}, this._methodManager, MethodManager.prototype, {\n id_user: userContext?.id_user || '',\n user: userContext?.user || '',\n id_ws: userContext?.id_ws || ''\n });\n\n console.log(new Date(), 'Running method', method);\n\n let result = await this._methodManager.callMethod.call(managerThis, method, ...params);\n\n console.log(new Date(), 'Finished method', method);\n\n if (!timedOut) {\n clearTimeout(timeoutHandle);\n this.sendWorkerResponse(ws, {\n type: 'taskComplete',\n taskId,\n messageId,\n error: false,\n result\n });\n }\n\n this._runningTasks = this._runningTasks.filter(a => a !== taskId);\n \n console.log(new Date(), 'Done with Task', JSON.stringify(this._runningTasks, null, 2));\n }\n catch (err) {\n if (!timedOut) {\n clearTimeout(timeoutHandle);\n console.error('Worker failed task:', taskId, 'Method:', method, err);\n err.message = 'Worker failed task:' + taskId + ' Method:' + method + ' - ' + err.message;\n this.sendWorkerResponse(ws, {\n type: 'taskComplete',\n taskId,\n messageId,\n error: true,\n result: err || 'Unknown error'\n });\n throw err;\n }\n\n console.error(new Date(), `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n \n await this._methodManager.callMethod('insertErrorLog', `Error in Method: ${method} - ${JSON.stringify(data, null, 2)}`);\n \n this._runningTasks = this._runningTasks.filter(a => a !== taskId);\n }\n }\n\n public sendWorkerResponse(ws, payload: TaskResponse | string) {\n if (typeof payload !== 'string') {\n payload = JSON.stringify(payload);\n }\n\n // console.log(new Date(), 'Sending', payload);\n\n if (ws && ws.readyState === ws.OPEN) {\n try {\n ws.send(payload);\n }\n catch (err) {\n console.error('Failed to send worker response:', err);\n }\n }\n else if (ws) {\n ws.close();\n }\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "20.7.53",
3
+ "version": "20.7.56",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",
@@ -1,2 +1,2 @@
1
- "use strict";var __awaiter=this&&this.__awaiter||function(e,o,t,s){return new(t=t||Promise)(function(n,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?n(e.value):((r=e.value)instanceof t?r:new t(function(e){e(r)})).then(fulfilled,rejected)}step((s=s.apply(e,o||[])).next())})},__generator=this&&this.__generator||function(o,t){var s,v,l,i={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]},a={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function verb(n){return function(e){var r=[n,e];if(s)throw new TypeError("Generator is already executing.");for(;i=a&&r[a=0]?0:i;)try{if(s=1,v&&(l=2&r[0]?v.return:r[0]?v.throw||((l=v.return)&&l.call(v),0):v.next)&&!(l=l.call(v,r[1])).done)return l;switch(v=0,(r=l?[2&r[0],l.value]:r)[0]){case 0:case 1:l=r;break;case 4:return i.label++,{value:r[1],done:!1};case 5:i.label++,v=r[1],r=[0];continue;case 7:r=i.ops.pop(),i.trys.pop();continue;default:if(!(l=0<(l=i.trys).length&&l[l.length-1])&&(6===r[0]||2===r[0])){i=0;continue}if(3===r[0]&&(!l||r[1]>l[0]&&r[1]<l[3]))i.label=r[1];else if(6===r[0]&&i.label<l[1])i.label=l[1],l=r;else{if(!(l&&i.label<l[2])){l[2]&&i.ops.pop(),i.trys.pop();continue}i.label=l[2],i.ops.push(r)}}r=t.call(o,i)}catch(e){r=[6,e],v=0}finally{s=l=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},mongodb_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResolveIOServer=void 0,require("mongodb")),ResolveIOServer=function(){function ResolveIOServer(){}return ResolveIOServer.create=function(n,o,t,s,v,l){return void 0===v&&(v=!0),void 0===l&&(l=!1),__awaiter(this,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return[4,(r=new ResolveIOServer).initialize(n,o,t,s,v,l)];case 1:return e.sent(),[2,r]}})})},ResolveIOServer.prototype.initialize=function(t,s,v,l,i,a){return void 0===i&&(i=!0),void 0===a&&(a=!1),__awaiter(this,void 0,void 0,function(){var r,n,o;return __generator(this,function(e){switch(e.label){case 0:ResolveIOServer._serverConfig=t,ResolveIOServer._clientRoutes=s,ResolveIOServer._client=v,ResolveIOServer._clientDir=l,ResolveIOServer._sesMail=i,ResolveIOServer._standardProgram=a,e.label=1;case 1:return e.trys.push([1,8,,9]),[4,mongodb_1.MongoClient.connect(ResolveIOServer.getServerConfig().MONGO_URL)];case 2:return r=e.sent(),ResolveIOServer.setMongoConnection(r),ResolveIOServer.setMainDB(r.db(ResolveIOServer.getServerConfig().DATABASE)),r.on("error",function(e){if("string"!=typeof e.message||!e.message.includes("ns does not exist"))throw e}).on("close",function(){return process.exit(1)}),[4,Promise.resolve().then(function(){return require("./managers/local-log.manager")})];case 3:return r=e.sent().LocalLogManager,n=r.create(),ResolveIOServer.setLocalLogManager(n),[4,Promise.resolve().then(function(){return require("./managers/mongo.manager")})];case 4:return[4,e.sent().MongoManager.create()];case 5:return n=e.sent(),ResolveIOServer.setMongoManager(n),[4,Promise.resolve().then(function(){return require("./server-app")})];case 6:return[4,e.sent().ResolveIOMainServer.create()];case 7:return o=e.sent(),ResolveIOServer.setMainServer(o),[2,!0];case 8:return(o=e.sent()).message="Error in ResolveIOServer (initialize): Mongo Client Connect And Run ResolveIO Server App Library - "+o.message,process.exit(1),[3,9];case 9:return[2]}})})},ResolveIOServer.getClientName=function(){return this._client},ResolveIOServer.getMainServer=function(){return ResolveIOServer._mainServer},ResolveIOServer.setMainServer=function(e){ResolveIOServer._mainServer=e},ResolveIOServer.setMongoConnection=function(e){ResolveIOServer._mongoConnection=e},ResolveIOServer.getMongoConnection=function(){return ResolveIOServer._mongoConnection},ResolveIOServer.getMainDB=function(){return ResolveIOServer._mainDB},ResolveIOServer.setMainDB=function(e){ResolveIOServer._mainDB=e},ResolveIOServer.getMongoManager=function(){return ResolveIOServer._mongoManager},ResolveIOServer.setMongoManager=function(e){ResolveIOServer._mongoManager=e},ResolveIOServer.getLocalLogManager=function(){return ResolveIOServer._localLogManager},ResolveIOServer.setLocalLogManager=function(e){ResolveIOServer._localLogManager=e},ResolveIOServer.getServerConfig=function(){return ResolveIOServer._serverConfig},ResolveIOServer.getClientRoutes=function(){return ResolveIOServer._clientRoutes},ResolveIOServer.getClientDir=function(){return ResolveIOServer._clientDir},ResolveIOServer.getSESMail=function(){return ResolveIOServer._sesMail},ResolveIOServer.getStandardProgram=function(){return ResolveIOServer._standardProgram},ResolveIOServer._serverConfig=null,ResolveIOServer._clientRoutes=[],ResolveIOServer._mongoConnection=null,ResolveIOServer._mainDB=null,ResolveIOServer._mainServer=null,ResolveIOServer._localLogManager=null,ResolveIOServer._mongoManager=null,ResolveIOServer._client="",ResolveIOServer._clientDir="",ResolveIOServer._sesMail=!0,ResolveIOServer._standardProgram=!1,ResolveIOServer}();exports.ResolveIOServer=ResolveIOServer;
1
+ "use strict";var __awaiter=this&&this.__awaiter||function(e,o,t,s){return new(t=t||Promise)(function(n,r){function fulfilled(e){try{step(s.next(e))}catch(e){r(e)}}function rejected(e){try{step(s.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?n(e.value):((r=e.value)instanceof t?r:new t(function(e){e(r)})).then(fulfilled,rejected)}step((s=s.apply(e,o||[])).next())})},__generator=this&&this.__generator||function(o,t){var s,v,l,i={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]},a={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function verb(n){return function(e){var r=[n,e];if(s)throw new TypeError("Generator is already executing.");for(;i=a&&r[a=0]?0:i;)try{if(s=1,v&&(l=2&r[0]?v.return:r[0]?v.throw||((l=v.return)&&l.call(v),0):v.next)&&!(l=l.call(v,r[1])).done)return l;switch(v=0,(r=l?[2&r[0],l.value]:r)[0]){case 0:case 1:l=r;break;case 4:return i.label++,{value:r[1],done:!1};case 5:i.label++,v=r[1],r=[0];continue;case 7:r=i.ops.pop(),i.trys.pop();continue;default:if(!(l=0<(l=i.trys).length&&l[l.length-1])&&(6===r[0]||2===r[0])){i=0;continue}if(3===r[0]&&(!l||r[1]>l[0]&&r[1]<l[3]))i.label=r[1];else if(6===r[0]&&i.label<l[1])i.label=l[1],l=r;else{if(!(l&&i.label<l[2])){l[2]&&i.ops.pop(),i.trys.pop();continue}i.label=l[2],i.ops.push(r)}}r=t.call(o,i)}catch(e){r=[6,e],v=0}finally{s=l=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}}},mongodb_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResolveIOServer=void 0,require("mongodb")),ResolveIOServer=function(){function ResolveIOServer(){}return ResolveIOServer.create=function(n,o,t,s,v,l){return void 0===v&&(v=!0),void 0===l&&(l=!1),__awaiter(this,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return[4,(r=new ResolveIOServer).initialize(n,o,t,s,v,l)];case 1:return e.sent(),[2,r]}})})},ResolveIOServer.prototype.initialize=function(t,s,v,l,i,a){return void 0===i&&(i=!0),void 0===a&&(a=!1),__awaiter(this,void 0,void 0,function(){var r,n,o;return __generator(this,function(e){switch(e.label){case 0:ResolveIOServer._serverConfig=t,ResolveIOServer._clientRoutes=s,ResolveIOServer._client=v,ResolveIOServer._clientDir=l,ResolveIOServer._sesMail=i,ResolveIOServer._standardProgram=a,e.label=1;case 1:return e.trys.push([1,8,,9]),[4,mongodb_1.MongoClient.connect(ResolveIOServer.getServerConfig().MONGO_URL)];case 2:return r=e.sent(),process.removeAllListeners("unhandledRejection"),ResolveIOServer.setMongoConnection(r),ResolveIOServer.setMainDB(r.db(ResolveIOServer.getServerConfig().DATABASE)),[4,Promise.resolve().then(function(){return require("./managers/local-log.manager")})];case 3:return r=e.sent().LocalLogManager,n=r.create(),ResolveIOServer.setLocalLogManager(n),[4,Promise.resolve().then(function(){return require("./managers/mongo.manager")})];case 4:return[4,e.sent().MongoManager.create()];case 5:return n=e.sent(),ResolveIOServer.setMongoManager(n),[4,Promise.resolve().then(function(){return require("./server-app")})];case 6:return[4,e.sent().ResolveIOMainServer.create()];case 7:return o=e.sent(),ResolveIOServer.setMainServer(o),[2,!0];case 8:return(o=e.sent()).message="Error in ResolveIOServer (initialize): Mongo Client Connect And Run ResolveIO Server App Library - "+o.message,process.exit(1),[3,9];case 9:return[2]}})})},ResolveIOServer.getClientName=function(){return this._client},ResolveIOServer.getMainServer=function(){return ResolveIOServer._mainServer},ResolveIOServer.setMainServer=function(e){ResolveIOServer._mainServer=e},ResolveIOServer.setMongoConnection=function(e){ResolveIOServer._mongoConnection=e},ResolveIOServer.getMongoConnection=function(){return ResolveIOServer._mongoConnection},ResolveIOServer.getMainDB=function(){return ResolveIOServer._mainDB},ResolveIOServer.setMainDB=function(e){ResolveIOServer._mainDB=e},ResolveIOServer.getMongoManager=function(){return ResolveIOServer._mongoManager},ResolveIOServer.setMongoManager=function(e){ResolveIOServer._mongoManager=e},ResolveIOServer.getLocalLogManager=function(){return ResolveIOServer._localLogManager},ResolveIOServer.setLocalLogManager=function(e){ResolveIOServer._localLogManager=e},ResolveIOServer.getServerConfig=function(){return ResolveIOServer._serverConfig},ResolveIOServer.getClientRoutes=function(){return ResolveIOServer._clientRoutes},ResolveIOServer.getClientDir=function(){return ResolveIOServer._clientDir},ResolveIOServer.getSESMail=function(){return ResolveIOServer._sesMail},ResolveIOServer.getStandardProgram=function(){return ResolveIOServer._standardProgram},ResolveIOServer._serverConfig=null,ResolveIOServer._clientRoutes=[],ResolveIOServer._mongoConnection=null,ResolveIOServer._mainDB=null,ResolveIOServer._mainServer=null,ResolveIOServer._localLogManager=null,ResolveIOServer._mongoManager=null,ResolveIOServer._client="",ResolveIOServer._clientDir="",ResolveIOServer._sesMail=!0,ResolveIOServer._standardProgram=!1,ResolveIOServer}();exports.ResolveIOServer=ResolveIOServer;
2
2
  //# sourceMappingURL=resolveio-server-app.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/resolveio-server-app.ts"],"names":["mongodb_1","require","ResolveIOServer","create","serverConfig","clientRoutes","client","clientDir","sesMail","standardProgram","resolveioServer","initialize","_a","sent","prototype","_serverConfig","_clientRoutes","_client","_clientDir","_sesMail","_standardProgram","MongoClient","connect","getServerConfig","dbConnection","setMongoConnection","setMainDB","db","on","error","message","includes","process","exit","Promise","resolve","then","LocalLogManager_1","LocalLogManager","localLogManager","setLocalLogManager","MongoManager","mongoManager","setMongoManager","ResolveIOMainServer","app","setMainServer","err_1","getClientName","this","getMainServer","_mainServer","mainServer","mongoConnection","_mongoConnection","getMongoConnection","getMainDB","_mainDB","mainDB","getMongoManager","_mongoManager","getLocalLogManager","_localLogManager","getClientRoutes","getClientDir","getSESMail","getStandardProgram","exports"],"mappings":"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","file":"resolveio-server-app.js","sourcesContent":["import { Db, MongoClient } from 'mongodb';\nimport { LocalLogManager } from './managers/local-log.manager';\nimport { MongoManager } from './managers/mongo.manager';\nimport { ResolveIOMainServer } from './server-app';\n\nexport class ResolveIOServer {\n\tprivate static _serverConfig = null;\n\tprivate static _clientRoutes = [];\n\tprivate static _mongoConnection: MongoClient = null;\n\tprivate static _mainDB: Db = null;\n\tprivate static _mainServer = null;\n\tprivate static _localLogManager = null;\n\tprivate static _mongoManager = null;\n\tprivate static _client = '';\n\tprivate static _clientDir = '';\n\tprivate static _sesMail = true;\n\tprivate static _standardProgram = false;\n\n\tconstructor() {}\n\t\n\tpublic static async create(serverConfig, clientRoutes: string[], client: string, clientDir, sesMail = true, standardProgram = false) {\n\t\tconst resolveioServer = new ResolveIOServer();\n\t\tawait resolveioServer.initialize(serverConfig, clientRoutes, client, clientDir, sesMail, standardProgram);\n\t\treturn resolveioServer;\n\t}\n\n\tprivate async initialize(serverConfig, clientRoutes: string[], client: string, clientDir, sesMail = true, standardProgram = false) {\n\t\tResolveIOServer._serverConfig = serverConfig;\n\t\tResolveIOServer._clientRoutes = clientRoutes;\n\t\tResolveIOServer._client = client;\n\t\tResolveIOServer._clientDir = clientDir;\n\t\tResolveIOServer._sesMail = sesMail;\n\t\tResolveIOServer._standardProgram = standardProgram;\n\t\t\n\t\ttry {\n\t\t\tlet dbConnection = await MongoClient.connect(ResolveIOServer.getServerConfig()['MONGO_URL']);\n\t\t\tResolveIOServer.setMongoConnection(dbConnection);\n\t\t\tResolveIOServer.setMainDB(dbConnection.db(ResolveIOServer.getServerConfig()['DATABASE']));\n\n\t\t\tdbConnection.on('error', error => {\n\t\t\t\tif (typeof error.message === 'string' && error.message.includes('ns does not exist')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t// Otherwise log normally\n\t\t\t\tthrow error;\n\t\t\t}).on('close', () => process.exit(1));\n\t\n\t\t\tlet LocalLogManager = (await import('./managers/local-log.manager')).LocalLogManager;\n\t\t\tlet localLogManager = LocalLogManager.create();\n\t\t\tResolveIOServer.setLocalLogManager(localLogManager);\n\n\t\t\tlet MongoManager = (await import('./managers/mongo.manager')).MongoManager;\n\t\t\tlet mongoManager = await MongoManager.create();\n\t\t\tResolveIOServer.setMongoManager(mongoManager);\n\t\t\t\n\t\t\tlet serverApp = (await import('./server-app')).ResolveIOMainServer;\n\t\t\tlet app = await serverApp.create();\n\t\t\tResolveIOServer.setMainServer(app);\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\tcatch (err) {\n\t\t\terr.message = 'Error in ResolveIOServer (initialize): Mongo Client Connect And Run ResolveIO Server App Library - ' + err.message;\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tpublic static getClientName() {\n\t\treturn this._client;\n\t}\n\n\tpublic static getMainServer(): ResolveIOMainServer {\n\t\treturn ResolveIOServer._mainServer;\n\t}\n\n\tpublic static setMainServer(mainServer: ResolveIOMainServer) {\n\t\tResolveIOServer._mainServer = mainServer;\n\t}\n\n\tpublic static setMongoConnection(mongoConnection: MongoClient) {\n\t\tResolveIOServer._mongoConnection = mongoConnection;\n\t}\n\n\tpublic static getMongoConnection(): MongoClient {\n\t\treturn ResolveIOServer._mongoConnection;\n\t}\n\n\tpublic static getMainDB(): Db {\n\t\treturn ResolveIOServer._mainDB;\n\t}\n\n\tpublic static setMainDB(mainDB: Db) {\n\t\tResolveIOServer._mainDB = mainDB\n\t}\n\n\tpublic static getMongoManager(): MongoManager {\n\t\treturn ResolveIOServer._mongoManager;\n\t}\n\n\tpublic static setMongoManager(mongoManager: MongoManager) {\n\t\tResolveIOServer._mongoManager = mongoManager;\n\t}\n\n\tpublic static getLocalLogManager(): LocalLogManager {\n\t\treturn ResolveIOServer._localLogManager;\n\t}\n\n\tpublic static setLocalLogManager(localLogManager: LocalLogManager) {\n\t\tResolveIOServer._localLogManager = localLogManager;\n\t}\n\n\tpublic static getServerConfig() {\n\t\treturn ResolveIOServer._serverConfig;\n\t}\n\n\tpublic static getClientRoutes() {\n\t\treturn ResolveIOServer._clientRoutes;\n\t}\n\n\tpublic static getClientDir(): string {\n\t\treturn ResolveIOServer._clientDir;\n\t}\n\n\tpublic static getSESMail(): boolean {\n\t\treturn ResolveIOServer._sesMail;\n\t}\n\n\tpublic static getStandardProgram(): boolean {\n\t\treturn ResolveIOServer._standardProgram;\n\t}\n}"]}
1
+ {"version":3,"sources":["../../src/resolveio-server-app.ts"],"names":["mongodb_1","require","ResolveIOServer","create","serverConfig","clientRoutes","client","clientDir","sesMail","standardProgram","resolveioServer","initialize","_a","sent","prototype","_serverConfig","_clientRoutes","_client","_clientDir","_sesMail","_standardProgram","MongoClient","connect","getServerConfig","dbConnection","process","removeAllListeners","setMongoConnection","setMainDB","db","Promise","resolve","then","LocalLogManager_1","LocalLogManager","localLogManager","setLocalLogManager","MongoManager","mongoManager","setMongoManager","ResolveIOMainServer","app","setMainServer","message","err_1","exit","getClientName","this","getMainServer","_mainServer","mainServer","mongoConnection","_mongoConnection","getMongoConnection","getMainDB","_mainDB","mainDB","getMongoManager","_mongoManager","getLocalLogManager","_localLogManager","getClientRoutes","getClientDir","getSESMail","getStandardProgram","exports"],"mappings":"k8CAAAA,W,sFAAAC,QAAA,SAAA,GAKAC,gBAAA,WAaC,SAAAA,mBAqHD,OAnHqBA,gBAAAC,OAApB,SAA2BC,EAAcC,EAAwBC,EAAgBC,EAAWC,EAAgBC,G,OAAhB,KAAA,IAAAD,IAAAA,EAAA,CAAA,GAAgB,KAAA,IAAAC,IAAAA,EAAA,CAAA,G,yGAE3G,MAAA,CAAA,GADMC,EAAkB,IAAIR,iBACNS,WAAWP,EAAcC,EAAcC,EAAQC,EAAWC,EAASC,CAAe,G,OACxG,OADAG,EAAAC,KAAA,EACA,CAAA,EAAOH,E,OAGMR,gBAAAY,UAAAH,WAAd,SAAyBP,EAAcC,EAAwBC,EAAgBC,EAAWC,EAAgBC,G,OAAhB,KAAA,IAAAD,IAAAA,EAAA,CAAA,GAAgB,KAAA,IAAAC,IAAAA,EAAA,CAAA,G,6GACzGP,gBAAgBa,cAAgBX,EAChCF,gBAAgBc,cAAgBX,EAChCH,gBAAgBe,QAAUX,EAC1BJ,gBAAgBgB,WAAaX,EAC7BL,gBAAgBiB,SAAWX,EAC3BN,gBAAgBkB,iBAAmBX,E,iBAGf,O,sBAAA,CAAA,EAAMT,UAAAqB,YAAYC,QAAQpB,gBAAgBqB,gBAAe,EAAc,SAAC,G,OAiBpE,OAjBnBC,EAAeZ,EAAAC,KAAA,EACnBY,QAAQC,mBAAmB,oBAAoB,EAE/CxB,gBAAgByB,mBAAmBH,CAAY,EAC/CtB,gBAAgB0B,UAAUJ,EAAaK,GAAG3B,gBAAgBqB,gBAAe,EAAa,QAAC,CAAC,EAajE,CAAA,EAAAO,QAAAC,QAAA,EAAAC,KAAA,WAAA,OAAA/B,QAAa,8BAA8B,CAAA,CAAA,G,OAI9C,OAJhBgC,EAAmBrB,EAAAC,KAA4C,EAAEqB,gBACjEC,EAAkBF,EAAgB9B,OAAM,EAC5CD,gBAAgBkC,mBAAmBD,CAAe,EAE9B,CAAA,EAAAL,QAAAC,QAAA,EAAAC,KAAA,WAAA,OAAA/B,QAAa,0BAA0B,CAAA,CAAA,G,OACxC,MAAA,CAAA,EADCW,EAAAC,KAAwC,EAAEwB,aACxBlC,OAAM,G,OAG3B,OAHbmC,EAAe1B,EAAAC,KAAA,EACnBX,gBAAgBqC,gBAAgBD,CAAY,EAE3B,CAAA,EAAAR,QAAAC,QAAA,EAAAC,KAAA,WAAA,OAAA/B,QAAa,cAAc,CAAA,CAAA,G,OAClC,MAAA,CAAA,EADOW,EAAAC,KAA4B,EAAE2B,oBACrBrC,OAAM,G,OAGhC,OAHIsC,EAAM7B,EAAAC,KAAA,EACVX,gBAAgBwC,cAAcD,CAAG,EAEjC,CAAA,EAAO,CAAA,G,0BAGHE,QAAU,sGAAwGC,EAAID,QAC1HlB,QAAQoB,KAAK,CAAC,E,6BAIF3C,gBAAA4C,cAAd,WACC,OAAOC,KAAK9B,OACb,EAEcf,gBAAA8C,cAAd,WACC,OAAO9C,gBAAgB+C,WACxB,EAEc/C,gBAAAwC,cAAd,SAA4BQ,GAC3BhD,gBAAgB+C,YAAcC,CAC/B,EAEchD,gBAAAyB,mBAAd,SAAiCwB,GAChCjD,gBAAgBkD,iBAAmBD,CACpC,EAEcjD,gBAAAmD,mBAAd,WACC,OAAOnD,gBAAgBkD,gBACxB,EAEclD,gBAAAoD,UAAd,WACC,OAAOpD,gBAAgBqD,OACxB,EAEcrD,gBAAA0B,UAAd,SAAwB4B,GACvBtD,gBAAgBqD,QAAUC,CAC3B,EAEctD,gBAAAuD,gBAAd,WACC,OAAOvD,gBAAgBwD,aACxB,EAEcxD,gBAAAqC,gBAAd,SAA8BD,GAC7BpC,gBAAgBwD,cAAgBpB,CACjC,EAEcpC,gBAAAyD,mBAAd,WACC,OAAOzD,gBAAgB0D,gBACxB,EAEc1D,gBAAAkC,mBAAd,SAAiCD,GAChCjC,gBAAgB0D,iBAAmBzB,CACpC,EAEcjC,gBAAAqB,gBAAd,WACC,OAAOrB,gBAAgBa,aACxB,EAEcb,gBAAA2D,gBAAd,WACC,OAAO3D,gBAAgBc,aACxB,EAEcd,gBAAA4D,aAAd,WACC,OAAO5D,gBAAgBgB,UACxB,EAEchB,gBAAA6D,WAAd,WACC,OAAO7D,gBAAgBiB,QACxB,EAEcjB,gBAAA8D,mBAAd,WACC,OAAO9D,gBAAgBkB,gBACxB,EAhIelB,gBAAAa,cAAgB,KAChBb,gBAAAc,cAAgB,GAChBd,gBAAAkD,iBAAgC,KAChClD,gBAAAqD,QAAc,KACdrD,gBAAA+C,YAAc,KACd/C,gBAAA0D,iBAAmB,KACnB1D,gBAAAwD,cAAgB,KAChBxD,gBAAAe,QAAU,GACVf,gBAAAgB,WAAa,GACbhB,gBAAAiB,SAAW,CAAA,EACXjB,gBAAAkB,iBAAmB,CAAA,EAuHnClB,e,EAAC,EAlIY+D,QAAA/D,gBAAAA","file":"resolveio-server-app.js","sourcesContent":["import { Db, MongoClient } from 'mongodb';\nimport { LocalLogManager } from './managers/local-log.manager';\nimport { MongoManager } from './managers/mongo.manager';\nimport { ResolveIOMainServer } from './server-app';\n\nexport class ResolveIOServer {\n\tprivate static _serverConfig = null;\n\tprivate static _clientRoutes = [];\n\tprivate static _mongoConnection: MongoClient = null;\n\tprivate static _mainDB: Db = null;\n\tprivate static _mainServer = null;\n\tprivate static _localLogManager = null;\n\tprivate static _mongoManager = null;\n\tprivate static _client = '';\n\tprivate static _clientDir = '';\n\tprivate static _sesMail = true;\n\tprivate static _standardProgram = false;\n\n\tconstructor() {}\n\t\n\tpublic static async create(serverConfig, clientRoutes: string[], client: string, clientDir, sesMail = true, standardProgram = false) {\n\t\tconst resolveioServer = new ResolveIOServer();\n\t\tawait resolveioServer.initialize(serverConfig, clientRoutes, client, clientDir, sesMail, standardProgram);\n\t\treturn resolveioServer;\n\t}\n\n\tprivate async initialize(serverConfig, clientRoutes: string[], client: string, clientDir, sesMail = true, standardProgram = false) {\n\t\tResolveIOServer._serverConfig = serverConfig;\n\t\tResolveIOServer._clientRoutes = clientRoutes;\n\t\tResolveIOServer._client = client;\n\t\tResolveIOServer._clientDir = clientDir;\n\t\tResolveIOServer._sesMail = sesMail;\n\t\tResolveIOServer._standardProgram = standardProgram;\n\t\t\n\t\ttry {\n\t\t\tlet dbConnection = await MongoClient.connect(ResolveIOServer.getServerConfig()['MONGO_URL']);\n\t\t\tprocess.removeAllListeners('unhandledRejection');\n\t\t\t\n\t\t\tResolveIOServer.setMongoConnection(dbConnection);\n\t\t\tResolveIOServer.setMainDB(dbConnection.db(ResolveIOServer.getServerConfig()['DATABASE']));\n\n\t\t\t// dbConnection\n\t\t\t// .on('error', error => {\n\t\t\t// \tif (typeof error.message === 'string' && error.message.includes('ns does not exist')) {\n\t\t\t// \t\treturn;\n\t\t\t// \t}\n\t\t\t\t\t\n\t\t\t// \t// Otherwise log normally\n\t\t\t// \tthrow error;\n\t\t\t// })\n\t\t\t// .on('close', () => process.exit(1));\n\t\n\t\t\tlet LocalLogManager = (await import('./managers/local-log.manager')).LocalLogManager;\n\t\t\tlet localLogManager = LocalLogManager.create();\n\t\t\tResolveIOServer.setLocalLogManager(localLogManager);\n\n\t\t\tlet MongoManager = (await import('./managers/mongo.manager')).MongoManager;\n\t\t\tlet mongoManager = await MongoManager.create();\n\t\t\tResolveIOServer.setMongoManager(mongoManager);\n\t\t\t\n\t\t\tlet serverApp = (await import('./server-app')).ResolveIOMainServer;\n\t\t\tlet app = await serverApp.create();\n\t\t\tResolveIOServer.setMainServer(app);\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\tcatch (err) {\n\t\t\terr.message = 'Error in ResolveIOServer (initialize): Mongo Client Connect And Run ResolveIO Server App Library - ' + err.message;\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\tpublic static getClientName() {\n\t\treturn this._client;\n\t}\n\n\tpublic static getMainServer(): ResolveIOMainServer {\n\t\treturn ResolveIOServer._mainServer;\n\t}\n\n\tpublic static setMainServer(mainServer: ResolveIOMainServer) {\n\t\tResolveIOServer._mainServer = mainServer;\n\t}\n\n\tpublic static setMongoConnection(mongoConnection: MongoClient) {\n\t\tResolveIOServer._mongoConnection = mongoConnection;\n\t}\n\n\tpublic static getMongoConnection(): MongoClient {\n\t\treturn ResolveIOServer._mongoConnection;\n\t}\n\n\tpublic static getMainDB(): Db {\n\t\treturn ResolveIOServer._mainDB;\n\t}\n\n\tpublic static setMainDB(mainDB: Db) {\n\t\tResolveIOServer._mainDB = mainDB\n\t}\n\n\tpublic static getMongoManager(): MongoManager {\n\t\treturn ResolveIOServer._mongoManager;\n\t}\n\n\tpublic static setMongoManager(mongoManager: MongoManager) {\n\t\tResolveIOServer._mongoManager = mongoManager;\n\t}\n\n\tpublic static getLocalLogManager(): LocalLogManager {\n\t\treturn ResolveIOServer._localLogManager;\n\t}\n\n\tpublic static setLocalLogManager(localLogManager: LocalLogManager) {\n\t\tResolveIOServer._localLogManager = localLogManager;\n\t}\n\n\tpublic static getServerConfig() {\n\t\treturn ResolveIOServer._serverConfig;\n\t}\n\n\tpublic static getClientRoutes() {\n\t\treturn ResolveIOServer._clientRoutes;\n\t}\n\n\tpublic static getClientDir(): string {\n\t\treturn ResolveIOServer._clientDir;\n\t}\n\n\tpublic static getSESMail(): boolean {\n\t\treturn ResolveIOServer._sesMail;\n\t}\n\n\tpublic static getStandardProgram(): boolean {\n\t\treturn ResolveIOServer._standardProgram;\n\t}\n}"]}