@resolveio/server-lib 20.7.120 → 20.7.122

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.
Files changed (216) hide show
  1. package/client-server-app.js +51 -1
  2. package/client-server-app.js.map +1 -1
  3. package/collections/app-status.collection.js +51 -1
  4. package/collections/app-status.collection.js.map +1 -1
  5. package/collections/counter.collection.js +55 -1
  6. package/collections/counter.collection.js.map +1 -1
  7. package/collections/cron-job-history.collection.js +136 -1
  8. package/collections/cron-job-history.collection.js.map +1 -1
  9. package/collections/cron-job.collection.js +87 -1
  10. package/collections/cron-job.collection.js.map +1 -1
  11. package/collections/email-history.collection.js +98 -1
  12. package/collections/email-history.collection.js.map +1 -1
  13. package/collections/email-verified.collection.js +60 -1
  14. package/collections/email-verified.collection.js.map +1 -1
  15. package/collections/file.collection.js +73 -1
  16. package/collections/file.collection.js.map +1 -1
  17. package/collections/flag-update.collection.js +56 -1
  18. package/collections/flag-update.collection.js.map +1 -1
  19. package/collections/flag.collection.js +56 -1
  20. package/collections/flag.collection.js.map +1 -1
  21. package/collections/log-method-latency.collection.js +72 -1
  22. package/collections/log-method-latency.collection.js.map +1 -1
  23. package/collections/log-subscription.collection.js +75 -1
  24. package/collections/log-subscription.collection.js.map +1 -1
  25. package/collections/log.collection.js +87 -1
  26. package/collections/log.collection.js.map +1 -1
  27. package/collections/logged-in-users.collection.js +66 -1
  28. package/collections/logged-in-users.collection.js.map +1 -1
  29. package/collections/monitor-cpu.collection.js +64 -1
  30. package/collections/monitor-cpu.collection.js.map +1 -1
  31. package/collections/monitor-function.collection.js +73 -1
  32. package/collections/monitor-function.collection.js.map +1 -1
  33. package/collections/monitor-memory.collection.js +76 -1
  34. package/collections/monitor-memory.collection.js.map +1 -1
  35. package/collections/monitor-mongo.collection.js +70 -1
  36. package/collections/monitor-mongo.collection.js.map +1 -1
  37. package/collections/notification.collection.js +56 -1
  38. package/collections/notification.collection.js.map +1 -1
  39. package/collections/report-builder-dashboard-builder.collection.js +108 -1
  40. package/collections/report-builder-dashboard-builder.collection.js.map +1 -1
  41. package/collections/report-builder-library.collection.js +86 -1
  42. package/collections/report-builder-library.collection.js.map +1 -1
  43. package/collections/report-builder-report.collection.js +148 -1
  44. package/collections/report-builder-report.collection.js.map +1 -1
  45. package/collections/user-group.collection.js +88 -1
  46. package/collections/user-group.collection.js.map +1 -1
  47. package/collections/user-guide.collection.js +56 -1
  48. package/collections/user-guide.collection.js.map +1 -1
  49. package/collections/user.collection.js +265 -1
  50. package/collections/user.collection.js.map +1 -1
  51. package/cron/cron.js +97 -1
  52. package/cron/cron.js.map +1 -1
  53. package/fixtures/cron-jobs.js +95 -1
  54. package/fixtures/cron-jobs.js.map +1 -1
  55. package/fixtures/init.js +78 -1
  56. package/fixtures/init.js.map +1 -1
  57. package/http/auth.js +869 -1
  58. package/http/auth.js.map +1 -1
  59. package/http/health.js +11 -1
  60. package/http/health.js.map +1 -1
  61. package/http/home.js +114 -1
  62. package/http/home.js.map +1 -1
  63. package/index.js +18 -1
  64. package/index.js.map +1 -1
  65. package/managers/cron.manager.js +461 -1
  66. package/managers/cron.manager.js.map +1 -1
  67. package/managers/local-log.manager.js +79 -1
  68. package/managers/local-log.manager.js.map +1 -1
  69. package/managers/method.manager.js +1025 -1
  70. package/managers/method.manager.js.map +1 -1
  71. package/managers/mongo.manager.js +4231 -1
  72. package/managers/mongo.manager.js.map +1 -1
  73. package/managers/monitor.manager.js +534 -1
  74. package/managers/monitor.manager.js.map +1 -1
  75. package/managers/subscription.manager.js +1292 -1
  76. package/managers/subscription.manager.js.map +1 -1
  77. package/managers/websocket.manager.js +165 -1
  78. package/managers/websocket.manager.js.map +1 -1
  79. package/managers/worker-dispatcher.manager.js +335 -1
  80. package/managers/worker-dispatcher.manager.js.map +1 -1
  81. package/managers/worker-server.manager.js +292 -1
  82. package/managers/worker-server.manager.js.map +1 -1
  83. package/methods/accounts.js +302 -1
  84. package/methods/accounts.js.map +1 -1
  85. package/methods/aws.js +748 -1
  86. package/methods/aws.js.map +1 -1
  87. package/methods/collections.js +542 -1
  88. package/methods/collections.js.map +1 -1
  89. package/methods/counters.js +111 -1
  90. package/methods/counters.js.map +1 -1
  91. package/methods/cron-jobs.js +1476 -1
  92. package/methods/cron-jobs.js.map +1 -1
  93. package/methods/flag-updates.js +8 -1
  94. package/methods/flag-updates.js.map +1 -1
  95. package/methods/flags.js +8 -1
  96. package/methods/flags.js.map +1 -1
  97. package/methods/logs.js +417 -1
  98. package/methods/logs.js.map +1 -1
  99. package/methods/monitor.js +543 -1
  100. package/methods/monitor.js.map +1 -1
  101. package/methods/pdf.js +742 -1
  102. package/methods/pdf.js.map +1 -1
  103. package/methods/report-builder.js +840 -1
  104. package/methods/report-builder.js.map +1 -1
  105. package/methods/support.js +232 -1
  106. package/methods/support.js.map +1 -1
  107. package/models/app-status.model.js +3 -1
  108. package/models/app-status.model.js.map +1 -1
  109. package/models/billing-logged-in-users.model.js +3 -1
  110. package/models/billing-logged-in-users.model.js.map +1 -1
  111. package/models/collection-document.model.js +3 -1
  112. package/models/collection-document.model.js.map +1 -1
  113. package/models/counter.model.js +3 -1
  114. package/models/counter.model.js.map +1 -1
  115. package/models/cron-job-history.model.js +3 -1
  116. package/models/cron-job-history.model.js.map +1 -1
  117. package/models/cron-job.model.js +3 -1
  118. package/models/cron-job.model.js.map +1 -1
  119. package/models/dialog.model.js +3 -1
  120. package/models/dialog.model.js.map +1 -1
  121. package/models/email-history.model.js +15 -1
  122. package/models/email-history.model.js.map +1 -1
  123. package/models/email-verified.model.js +3 -1
  124. package/models/email-verified.model.js.map +1 -1
  125. package/models/file.model.js +3 -1
  126. package/models/file.model.js.map +1 -1
  127. package/models/flag-update.model.js +3 -1
  128. package/models/flag-update.model.js.map +1 -1
  129. package/models/flag.model.js +3 -1
  130. package/models/flag.model.js.map +1 -1
  131. package/models/log-method-latency.model.js +3 -1
  132. package/models/log-method-latency.model.js.map +1 -1
  133. package/models/log-subscription.model.js +3 -1
  134. package/models/log-subscription.model.js.map +1 -1
  135. package/models/log.model.js +3 -1
  136. package/models/log.model.js.map +1 -1
  137. package/models/logged-in-users.model.js +3 -1
  138. package/models/logged-in-users.model.js.map +1 -1
  139. package/models/method-response.model.js +3 -1
  140. package/models/method-response.model.js.map +1 -1
  141. package/models/method.model.d.ts +0 -1
  142. package/models/method.model.js +3 -1
  143. package/models/method.model.js.map +1 -1
  144. package/models/monitor-cpu.model.js +3 -1
  145. package/models/monitor-cpu.model.js.map +1 -1
  146. package/models/monitor-function.model.js +3 -1
  147. package/models/monitor-function.model.js.map +1 -1
  148. package/models/monitor-memory.model.js +3 -1
  149. package/models/monitor-memory.model.js.map +1 -1
  150. package/models/monitor-mongo.model.js +3 -1
  151. package/models/monitor-mongo.model.js.map +1 -1
  152. package/models/notification.model.js +3 -1
  153. package/models/notification.model.js.map +1 -1
  154. package/models/pagination.model.js +23 -1
  155. package/models/pagination.model.js.map +1 -1
  156. package/models/permission.model.js +3 -1
  157. package/models/permission.model.js.map +1 -1
  158. package/models/report-builder-dashboard-builder.model.js +3 -1
  159. package/models/report-builder-dashboard-builder.model.js.map +1 -1
  160. package/models/report-builder-library.model.js +3 -1
  161. package/models/report-builder-library.model.js.map +1 -1
  162. package/models/report-builder-report.model.js +3 -1
  163. package/models/report-builder-report.model.js.map +1 -1
  164. package/models/report-builder.model.js +3 -1
  165. package/models/report-builder.model.js.map +1 -1
  166. package/models/select-data-label.model.js +3 -1
  167. package/models/select-data-label.model.js.map +1 -1
  168. package/models/server-message.model.js +3 -1
  169. package/models/server-message.model.js.map +1 -1
  170. package/models/subscription.model.js +3 -1
  171. package/models/subscription.model.js.map +1 -1
  172. package/models/support-ticket.model.js +3 -1
  173. package/models/support-ticket.model.js.map +1 -1
  174. package/models/user-group.model.js +3 -1
  175. package/models/user-group.model.js.map +1 -1
  176. package/models/user-guide.model.js +3 -1
  177. package/models/user-guide.model.js.map +1 -1
  178. package/models/user.model.js +3 -1
  179. package/models/user.model.js.map +1 -1
  180. package/package.json +1 -1
  181. package/public_api.js +77 -1
  182. package/public_api.js.map +1 -1
  183. package/publications/app-status.js +16 -1
  184. package/publications/app-status.js.map +1 -1
  185. package/publications/cron-jobs.js +32 -1
  186. package/publications/cron-jobs.js.map +1 -1
  187. package/publications/files.js +36 -1
  188. package/publications/files.js.map +1 -1
  189. package/publications/flags-update.js +22 -1
  190. package/publications/flags-update.js.map +1 -1
  191. package/publications/flags.js +22 -1
  192. package/publications/flags.js.map +1 -1
  193. package/publications/logs.js +164 -1
  194. package/publications/logs.js.map +1 -1
  195. package/publications/notifications.js +16 -1
  196. package/publications/notifications.js.map +1 -1
  197. package/publications/report-builder-dashboard-builders.js +42 -1
  198. package/publications/report-builder-dashboard-builders.js.map +1 -1
  199. package/publications/report-builder-libraries.js +90 -1
  200. package/publications/report-builder-libraries.js.map +1 -1
  201. package/publications/report-builder-reports.js +50 -1
  202. package/publications/report-builder-reports.js.map +1 -1
  203. package/publications/super-admin.js +16 -1
  204. package/publications/super-admin.js.map +1 -1
  205. package/publications/user-groups.js +16 -1
  206. package/publications/user-groups.js.map +1 -1
  207. package/publications/user-guides.js +16 -1
  208. package/publications/user-guides.js.map +1 -1
  209. package/resolveio-server-app.js +176 -1
  210. package/resolveio-server-app.js.map +1 -1
  211. package/server-app.js +1159 -1
  212. package/server-app.js.map +1 -1
  213. package/util/common.js +632 -1
  214. package/util/common.js.map +1 -1
  215. package/util/schema-report-builder.js +454 -1
  216. package/util/schema-report-builder.js.map +1 -1
@@ -1,2 +1,293 @@
1
- "use strict";var __awaiter=this&&this.__awaiter||function(e,n,o,a){return new(o=o||Promise)(function(t,r){function fulfilled(e){try{step(a.next(e))}catch(e){r(e)}}function rejected(e){try{step(a.throw(e))}catch(e){r(e)}}function step(e){var r;e.done?t(e.value):((r=e.value)instanceof o?r:new o(function(e){e(r)})).then(fulfilled,rejected)}step((a=a.apply(e,n||[])).next())})},__generator=this&&this.__generator||function(n,o){var a,s,i,l={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},c={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function verb(t){return function(e){var r=[t,e];if(a)throw new TypeError("Generator is already executing.");for(;l=c&&r[c=0]?0:l;)try{if(a=1,s&&(i=2&r[0]?s.return:r[0]?s.throw||((i=s.return)&&i.call(s),0):s.next)&&!(i=i.call(s,r[1])).done)return i;switch(s=0,(r=i?[2&r[0],i.value]:r)[0]){case 0:case 1:i=r;break;case 4:return l.label++,{value:r[1],done:!1};case 5:l.label++,s=r[1],r=[0];continue;case 7:r=l.ops.pop(),l.trys.pop();continue;default:if(!(i=0<(i=l.trys).length&&i[i.length-1])&&(6===r[0]||2===r[0])){l=0;continue}if(3===r[0]&&(!i||r[1]>i[0]&&r[1]<i[3]))l.label=r[1];else if(6===r[0]&&l.label<i[1])l.label=i[1],i=r;else{if(!(i&&l.label<i[2])){i[2]&&l.ops.pop(),l.trys.pop();continue}l.label=i[2],l.ops.push(r)}}r=o.call(n,l)}catch(e){r=[6,e],s=0}finally{a=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 t="function"==typeof Symbol&&e[Symbol.iterator];if(!t)return e;var n,o,a=t.call(e),s=[];try{for(;(void 0===r||0<r--)&&!(n=a.next()).done;)s.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(t=a.return)&&t.call(a)}finally{if(o)throw o.error}}return s},__spreadArray=this&&this.__spreadArray||function(e,r,t){if(t||2===arguments.length)for(var n,o=0,a=r.length;o<a;o++)!n&&o in r||((n=n||Array.prototype.slice.call(r,0,o))[o]=r[o]);return e.concat(n||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 t=new WorkerServerManager;return t.initialize(e,r),t},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_INTERNAL||this._serverConfig.SERVER_URL)+"/websocket?workerToken="+this._serverConfig.WORKER_TOKEN),n=new WebSocket(r),o=null,t=null,a=!1,s=setTimeout(function(){a||(console.error(new Date,"WebSocket connection timeout. Retrying..."),n.terminate())},1e4);n.on("open",function(){a=!0,clearTimeout(s),console.log(new Date,"Connected to main server as worker",process.env.WORKER_INDEX,process.env.NODE_APP_INSTANCE),e.sendWorkerResponse(n,"ping"),t=setInterval(function(){o?(o=null,e.sendWorkerResponse(n,"ping")):n.close()},15e3)}),n.on("message",function(t){return __awaiter(e,void 0,void 0,function(){var r;return __generator(this,function(e){switch(e.label){case 0:return(this._methodManager.getEnableDebug()&&console.log(new Date,"Message Recv",t),"ping"!==(t="string"!=typeof t?t.toString():t))?[3,1]:(this._methodManager.getEnableDebug()&&console.log(new Date,"Recv Ping, Sending Pong"),this.sendWorkerResponse(n,"pong"),[3,4]);case 1:return"pong"!==t?[3,2]:(this._methodManager.getEnableDebug()&&console.log(new Date,"Recv Pong"),o=new Date,[3,4]);case 2:r=void 0;try{r=JSON.parse(t,common_1.dateReviver)}catch(e){return console.error("Worker parse error",e),[2]}return"task"!==r.type?[3,4]:[4,this.handleIncomingTask(n,r)];case 3:e.sent(),e.label=4;case 4:return[2]}})})}),n.on("close",function(){console.log(new Date,"Disconnected from main server. Reconnecting in 1s..."),setTimeout(function(){e.startWorkerInstance()},1e3),t&&clearInterval(t),clearTimeout(s)}),n.on("error",function(e){console.error(new Date,"Worker WS error:",e),n.close()})},WorkerServerManager.prototype.handleIncomingTask=function(g,h){return __awaiter(this,void 0,void 0,function(){var r,t,n,o,a,s,i,l,c,u=this;return __generator(this,function(e){switch(e.label){case 0:if(r=h.taskId,t=h.messageId,n=h.method,o=h.params,a=h.userContext,this._runningTasks.push(r),!r||!n)return this.sendWorkerResponse(g,{type:"taskComplete",taskId:r,messageId:t,error:!0,result:"Invalid task"}),[2];s=!1,i=setTimeout(function(){return __awaiter(u,void 0,void 0,function(){return __generator(this,function(e){switch(e.label){case 0:return s=!0,console.error(new Date,"Worker timed out on task:",r,"Method:",n),this.sendWorkerResponse(g,{type:"taskComplete",taskId:r,messageId:t,error:!0,result:"Task timed out"}),[4,this._methodManager.callMethod("insertErrorLog","Timeout in Method: ".concat(n," - ").concat(JSON.stringify(h,null,2)))];case 1:return e.sent(),[2]}})})},this._methodManager.getMethod(n).timeoutOverride||12e4),e.label=1;case 1:return e.trys.push([1,3,,5]),l=Object.assign({},this._methodManager,method_manager_1.MethodManager.prototype,{id_user:(null==a?void 0:a.id_user)||"",user:(null==a?void 0:a.user)||"",id_ws:(null==a?void 0:a.id_ws)||""}),this._methodManager.getEnableDebug()&&console.log(new Date,"Running method",n),[4,(c=this._methodManager.callMethod).call.apply(c,__spreadArray([l,n],__read(o),!1))];case 2:return c=e.sent(),this._methodManager.getEnableDebug()&&console.log(new Date,"Finished method",n),s||(clearTimeout(i),this.sendWorkerResponse(g,{type:"taskComplete",taskId:r,messageId:t,error:!1,result:c})),this._runningTasks=this._runningTasks.filter(function(e){return e!==r}),this._methodManager.getEnableDebug()&&console.log(new Date,"Done with Task",JSON.stringify(this._runningTasks,null,2)),[3,5];case 3:if(l=e.sent(),s)return console.error(new Date,"Error in Method: ".concat(n," - ").concat(JSON.stringify(h,null,2))),[4,this._methodManager.callMethod("insertErrorLog","Error in Method: ".concat(n," - ").concat(JSON.stringify(h,null,2)))];throw clearTimeout(i),console.error("Worker failed task:",r,"Method:",n,l),l.message="Worker failed task:"+r+" Method:"+n+" - "+l.message,this.sendWorkerResponse(g,{type:"taskComplete",taskId:r,messageId:t,error:!0,result:l||"Unknown error"}),l;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)),this._methodManager.getEnableDebug()&&console.log(new Date,"Sending",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";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __read = (this && this.__read) || function (o, n) {
39
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
40
+ if (!m) return o;
41
+ var i = m.call(o), r, ar = [], e;
42
+ try {
43
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
44
+ }
45
+ catch (error) { e = { error: error }; }
46
+ finally {
47
+ try {
48
+ if (r && !r.done && (m = i["return"])) m.call(i);
49
+ }
50
+ finally { if (e) throw e.error; }
51
+ }
52
+ return ar;
53
+ };
54
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
55
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
56
+ if (ar || !(i in from)) {
57
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
58
+ ar[i] = from[i];
59
+ }
60
+ }
61
+ return to.concat(ar || Array.prototype.slice.call(from));
62
+ };
63
+ Object.defineProperty(exports, "__esModule", { value: true });
64
+ exports.WorkerServerManager = void 0;
65
+ var WebSocket = require("ws");
66
+ var common_1 = require("../util/common");
67
+ var method_manager_1 = require("./method.manager");
68
+ var WorkerServerManager = /** @class */ (function () {
69
+ function WorkerServerManager() {
70
+ this._runningTasks = [];
71
+ }
72
+ WorkerServerManager.create = function (methodManager, serverConfig) {
73
+ var workerServerManager = new WorkerServerManager();
74
+ workerServerManager.initialize(methodManager, serverConfig);
75
+ return workerServerManager;
76
+ };
77
+ WorkerServerManager.prototype.initialize = function (methodManager, serverConfig) {
78
+ this._methodManager = methodManager;
79
+ this._serverConfig = serverConfig;
80
+ this.startWorkerInstance();
81
+ };
82
+ WorkerServerManager.prototype.startWorkerInstance = function () {
83
+ var _this = this;
84
+ console.log(new Date(), 'Worker instance started, connecting to main server via WebSocket...');
85
+ var wsUrl = (this._serverConfig['SERVER_URL_INTERNAL'] ? this._serverConfig['SERVER_URL_INTERNAL'] : this._serverConfig['SERVER_URL']) + '/websocket?workerToken=' + this._serverConfig['WORKER_TOKEN'];
86
+ var ws = new WebSocket(wsUrl);
87
+ var lastComm = null;
88
+ var interval = null;
89
+ var openTimeout = null;
90
+ var opened = false;
91
+ // Set timeout if the socket never opens
92
+ openTimeout = setTimeout(function () {
93
+ if (!opened) {
94
+ console.error(new Date(), 'WebSocket connection timeout. Retrying...');
95
+ ws.terminate(); // force close if still connecting
96
+ }
97
+ }, 10000); // 10 seconds timeout
98
+ ws.on('open', function () {
99
+ opened = true;
100
+ clearTimeout(openTimeout);
101
+ console.log(new Date(), 'Connected to main server as worker', process.env.WORKER_INDEX, process.env.NODE_APP_INSTANCE);
102
+ _this.sendWorkerResponse(ws, 'ping');
103
+ interval = setInterval(function () {
104
+ if (!lastComm) {
105
+ ws.close();
106
+ }
107
+ else {
108
+ lastComm = null;
109
+ _this.sendWorkerResponse(ws, 'ping');
110
+ }
111
+ }, 15000);
112
+ });
113
+ ws.on('message', function (rawData) { return __awaiter(_this, void 0, void 0, function () {
114
+ var msg;
115
+ return __generator(this, function (_a) {
116
+ switch (_a.label) {
117
+ case 0:
118
+ if (this._methodManager.getEnableDebug()) {
119
+ console.log(new Date(), 'Message Recv', rawData);
120
+ }
121
+ if (typeof rawData !== 'string') {
122
+ rawData = rawData.toString();
123
+ }
124
+ if (!(rawData === 'ping')) return [3 /*break*/, 1];
125
+ if (this._methodManager.getEnableDebug()) {
126
+ console.log(new Date(), 'Recv Ping, Sending Pong');
127
+ }
128
+ this.sendWorkerResponse(ws, 'pong');
129
+ return [3 /*break*/, 4];
130
+ case 1:
131
+ if (!(rawData === 'pong')) return [3 /*break*/, 2];
132
+ if (this._methodManager.getEnableDebug()) {
133
+ console.log(new Date(), 'Recv Pong');
134
+ }
135
+ lastComm = new Date();
136
+ return [3 /*break*/, 4];
137
+ case 2:
138
+ msg = void 0;
139
+ try {
140
+ msg = JSON.parse(rawData, common_1.dateReviver);
141
+ }
142
+ catch (e) {
143
+ console.error('Worker parse error', e);
144
+ return [2 /*return*/];
145
+ }
146
+ if (!(msg.type === 'task')) return [3 /*break*/, 4];
147
+ return [4 /*yield*/, this.handleIncomingTask(ws, msg)];
148
+ case 3:
149
+ _a.sent();
150
+ _a.label = 4;
151
+ case 4: return [2 /*return*/];
152
+ }
153
+ });
154
+ }); });
155
+ ws.on('close', function () {
156
+ console.log(new Date(), 'Disconnected from main server. Reconnecting in 1s...');
157
+ setTimeout(function () {
158
+ _this.startWorkerInstance();
159
+ }, 1000);
160
+ if (interval) {
161
+ clearInterval(interval);
162
+ }
163
+ clearTimeout(openTimeout);
164
+ });
165
+ ws.on('error', function (err) {
166
+ console.error(new Date(), 'Worker WS error:', err);
167
+ ws.close();
168
+ });
169
+ };
170
+ WorkerServerManager.prototype.handleIncomingTask = function (ws, data) {
171
+ return __awaiter(this, void 0, void 0, function () {
172
+ var taskId, messageId, method, params, userContext, timedOut, timeoutHandle, managerThis, result, err_1;
173
+ var _a;
174
+ var _this = this;
175
+ return __generator(this, function (_b) {
176
+ switch (_b.label) {
177
+ case 0:
178
+ taskId = data.taskId, messageId = data.messageId, method = data.method, params = data.params, userContext = data.userContext;
179
+ this._runningTasks.push(taskId);
180
+ if (!taskId || !method) {
181
+ // console.log('Invalid task message received', data);
182
+ this.sendWorkerResponse(ws, {
183
+ type: 'taskComplete',
184
+ taskId: taskId,
185
+ messageId: messageId,
186
+ error: true,
187
+ result: 'Invalid task'
188
+ });
189
+ return [2 /*return*/];
190
+ }
191
+ timedOut = false;
192
+ timeoutHandle = setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
193
+ return __generator(this, function (_a) {
194
+ switch (_a.label) {
195
+ case 0:
196
+ timedOut = true;
197
+ console.error(new Date(), 'Worker timed out on task:', taskId, 'Method:', method);
198
+ this.sendWorkerResponse(ws, {
199
+ type: 'taskComplete',
200
+ taskId: taskId,
201
+ messageId: messageId,
202
+ error: true,
203
+ result: 'Task timed out'
204
+ });
205
+ return [4 /*yield*/, this._methodManager.callMethod('insertErrorLog', "Timeout in Method: ".concat(method, " - ").concat(JSON.stringify(data, null, 2)))];
206
+ case 1:
207
+ _a.sent();
208
+ return [2 /*return*/];
209
+ }
210
+ });
211
+ }); }, (1000 * 60 * 2));
212
+ _b.label = 1;
213
+ case 1:
214
+ _b.trys.push([1, 3, , 5]);
215
+ managerThis = Object.assign({}, this._methodManager, method_manager_1.MethodManager.prototype, {
216
+ id_user: (userContext === null || userContext === void 0 ? void 0 : userContext.id_user) || '',
217
+ user: (userContext === null || userContext === void 0 ? void 0 : userContext.user) || '',
218
+ id_ws: (userContext === null || userContext === void 0 ? void 0 : userContext.id_ws) || ''
219
+ });
220
+ if (this._methodManager.getEnableDebug()) {
221
+ console.log(new Date(), 'Running method', method);
222
+ }
223
+ return [4 /*yield*/, (_a = this._methodManager.callMethod).call.apply(_a, __spreadArray([managerThis, method], __read(params), false))];
224
+ case 2:
225
+ result = _b.sent();
226
+ if (this._methodManager.getEnableDebug()) {
227
+ console.log(new Date(), 'Finished method', method);
228
+ }
229
+ if (!timedOut) {
230
+ clearTimeout(timeoutHandle);
231
+ this.sendWorkerResponse(ws, {
232
+ type: 'taskComplete',
233
+ taskId: taskId,
234
+ messageId: messageId,
235
+ error: false,
236
+ result: result
237
+ });
238
+ }
239
+ this._runningTasks = this._runningTasks.filter(function (a) { return a !== taskId; });
240
+ if (this._methodManager.getEnableDebug()) {
241
+ console.log(new Date(), 'Done with Task', JSON.stringify(this._runningTasks, null, 2));
242
+ }
243
+ return [3 /*break*/, 5];
244
+ case 3:
245
+ err_1 = _b.sent();
246
+ if (!timedOut) {
247
+ clearTimeout(timeoutHandle);
248
+ console.error('Worker failed task:', taskId, 'Method:', method, err_1);
249
+ err_1.message = 'Worker failed task:' + taskId + ' Method:' + method + ' - ' + err_1.message;
250
+ this.sendWorkerResponse(ws, {
251
+ type: 'taskComplete',
252
+ taskId: taskId,
253
+ messageId: messageId,
254
+ error: true,
255
+ result: err_1 || 'Unknown error'
256
+ });
257
+ throw err_1;
258
+ }
259
+ console.error(new Date(), "Error in Method: ".concat(method, " - ").concat(JSON.stringify(data, null, 2)));
260
+ return [4 /*yield*/, this._methodManager.callMethod('insertErrorLog', "Error in Method: ".concat(method, " - ").concat(JSON.stringify(data, null, 2)))];
261
+ case 4:
262
+ _b.sent();
263
+ this._runningTasks = this._runningTasks.filter(function (a) { return a !== taskId; });
264
+ return [3 /*break*/, 5];
265
+ case 5: return [2 /*return*/];
266
+ }
267
+ });
268
+ });
269
+ };
270
+ WorkerServerManager.prototype.sendWorkerResponse = function (ws, payload) {
271
+ if (typeof payload !== 'string') {
272
+ payload = JSON.stringify(payload);
273
+ }
274
+ if (this._methodManager.getEnableDebug()) {
275
+ console.log(new Date(), 'Sending', payload);
276
+ }
277
+ if (ws && ws.readyState === ws.OPEN) {
278
+ try {
279
+ ws.send(payload);
280
+ }
281
+ catch (err) {
282
+ console.error('Failed to send worker response:', err);
283
+ }
284
+ }
285
+ else if (ws) {
286
+ ws.close();
287
+ }
288
+ };
289
+ return WorkerServerManager;
290
+ }());
291
+ exports.WorkerServerManager = WorkerServerManager;
292
+
2
293
  //# 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","opened","openTimeout","setTimeout","error","terminate","on","clearTimeout","process","env","WORKER_INDEX","NODE_APP_INSTANCE","sendWorkerResponse","setInterval","close","rawData","__awaiter","getEnableDebug","toString","msg","JSON","parse","dateReviver","e","type","handleIncomingTask","_a","sent","clearInterval","err","data","taskId","messageId","method","params","userContext","push","result","timedOut","timeoutHandle","callMethod","concat","stringify","getMethod","timeoutOverride","managerThis","Object","assign","MethodManager","id_user","user","id_ws","call","apply","__spreadArray","__read","_b","filter","a","err_1","message","payload","readyState","OPEN","send","exports"],"mappings":"y9DAAAA,W,0FAAAC,QAAA,IAAA,GAEAC,SAAAD,QAAA,gBAAA,EACAE,iBAAAF,QAAA,kBAAA,EAEAG,oBAAA,WAKI,SAAAA,sBAFQC,KAAAC,cAAgB,EAET,CAyNnB,OAvNWF,oBAAAG,OAAP,SAAcC,EAA8BC,GACxC,IAAMC,EAAsB,IAAIN,oBAEhC,OADAM,EAAoBC,WAAWH,EAAeC,CAAY,EACnDC,CACX,EAEON,oBAAAQ,UAAAD,WAAP,SAAkBH,EAA8BC,GAC5CJ,KAAKQ,eAAiBL,EACtBH,KAAKS,cAAgBL,EACrBJ,KAAKU,oBAAmB,CAC5B,EAEQX,oBAAAQ,UAAAG,oBAAR,WAAA,IAAAC,EAAAX,KAGQY,GAFJC,QAAQC,IAAI,IAAIC,KAAQ,qEAAqE,GAEhFf,KAAKS,cAAmC,qBAAgDT,KAAKS,cAA0B,YAAK,0BAA4BT,KAAKS,cAA4B,cAChMO,EAAK,IAAIrB,UAAUiB,CAAK,EAE1BK,EAAW,KACXC,EAAW,KAEXC,EAAS,CAAA,EAGbC,EAAcC,WAAW,WAChBF,IACDN,QAAQS,MAAM,IAAIP,KAAQ,2CAA2C,EACrEC,EAAGO,UAAS,EAEpB,EAAG,GAAK,EAERP,EAAGQ,GAAG,OAAQ,WACVL,EAAS,CAAA,EACTM,aAAaL,CAAW,EAExBP,QAAQC,IAAI,IAAIC,KAAQ,qCAAsCW,QAAQC,IAAIC,aAAcF,QAAQC,IAAIE,iBAAiB,EACrHlB,EAAKmB,mBAAmBd,EAAI,MAAM,EAElCE,EAAWa,YAAY,WACdd,GAIDA,EAAW,KACXN,EAAKmB,mBAAmBd,EAAI,MAAM,GAJlCA,EAAGgB,MAAK,CAMhB,EAAG,IAAK,CACZ,CAAC,EAEDhB,EAAGQ,GAAG,UAAW,SAAOS,GAAY,OAAAC,UAAAvB,EAAA,KAAA,EAAA,KAAA,EAAA,W,wEAC5BX,KAAKQ,eAAe2B,eAAc,GAClCtB,QAAQC,IAAI,IAAIC,KAAQ,eAAgBkB,CAAO,EAOnC,UAHZA,EADmB,UAAnB,OAAOA,EACGA,EAAQG,SAAQ,EAG1BH,IAAA,CAAA,EAAA,IACIjC,KAAKQ,eAAe2B,eAAc,GAClCtB,QAAQC,IAAI,IAAIC,KAAQ,yBAAyB,EAGrDf,KAAK8B,mBAAmBd,EAAI,MAAM,E,oBAEjB,SAAZiB,EAAA,CAAA,EAAA,IACDjC,KAAKQ,eAAe2B,eAAc,GAClCtB,QAAQC,IAAI,IAAIC,KAAQ,WAAW,EAEvCE,EAAW,IAAIF,K,cAGXsB,EAAG,KAAA,EACP,IACIA,EAAMC,KAAKC,MAAMN,EAASpC,SAAA2C,WAAW,C,CAEzC,MAAOC,GAEH,OADA5B,QAAQS,MAAM,qBAAsBmB,CAAC,EACrC,CAAA,E,OAGa,SAAbJ,EAAIK,KAAJ,CAAA,EAAA,GACA,CAAA,EAAM1C,KAAK2C,mBAAmB3B,EAAIqB,CAAG,G,OAArCO,EAAAC,KAAA,E,gCAGX,EAED7B,EAAGQ,GAAG,QAAS,WACXX,QAAQC,IAAI,IAAIC,KAAQ,sDAAsD,EAC9EM,WAAW,WACPV,EAAKD,oBAAmB,CAC5B,EAAG,GAAI,EAEHQ,GACA4B,cAAc5B,CAAQ,EAE1BO,aAAaL,CAAW,CAC5B,CAAC,EAEDJ,EAAGQ,GAAG,QAAS,SAACuB,GACZlC,QAAQS,MAAM,IAAIP,KAAQ,mBAAoBgC,CAAG,EACjD/B,EAAGgB,MAAK,CACZ,CAAC,CACL,EAEcjC,oBAAAQ,UAAAoC,mBAAd,SAAiC3B,EAAyBgC,G,uIAGtD,GAFMC,EAAmDD,EAAIC,OAA/CC,EAA2CF,EAAIE,UAApCC,EAAgCH,EAAIG,OAA5BC,EAAwBJ,EAAII,OAApBC,EAAgBL,EAAIK,YAC7DrD,KAAKC,cAAcqD,KAAKL,CAAM,EAC1B,CAACA,GAAU,CAACE,EAUZ,OARAnD,KAAK8B,mBAAmBd,EAAI,CACxB0B,KAAM,eACNO,OAAMA,EACNC,UAASA,EACT5B,MAAO,CAAA,EACPiC,OAAQ,c,CACX,EAED,CAAA,GAGAC,EAAW,CAAA,EACXC,EAAgBpC,WAAW,WAAA,OAAAa,UAAAvB,EAAA,KAAA,EAAA,KAAA,EAAA,W,2DAY3B,OAXA6C,EAAW,CAAA,EACX3C,QAAQS,MAAM,IAAIP,KAAQ,4BAA6BkC,EAAQ,UAAWE,CAAM,EAEhFnD,KAAK8B,mBAAmBd,EAAI,CACxB0B,KAAM,eACNO,OAAMA,EACNC,UAASA,EACT5B,MAAO,CAAA,EACPiC,OAAQ,gB,CACX,EAED,CAAA,EAAMvD,KAAKQ,eAAekD,WAAW,iBAAkB,sBAAAC,OAAsBR,EAAM,KAAA,EAAAQ,OAAMrB,KAAKsB,UAAUZ,EAAM,KAAM,CAAC,CAAC,CAAE,G,cAAxHJ,EAAAC,KAAA,E,UACD7C,KAAKQ,eAAeqD,UAAUV,CAAM,EAAEW,iBAAmB,IAAe,E,iBAa1D,O,sBAVTC,EAAcC,OAAOC,OAAO,GAAIjE,KAAKQ,eAAgBV,iBAAAoE,cAAc3D,UAAW,CAC9E4D,SAASd,MAAAA,EAAW,KAAA,EAAXA,EAAac,UAAW,GACjCC,MAAMf,MAAAA,EAAW,KAAA,EAAXA,EAAae,OAAQ,GAC3BC,OAAOhB,MAAAA,EAAW,KAAA,EAAXA,EAAagB,QAAS,E,CAChC,EAEGrE,KAAKQ,eAAe2B,eAAc,GAClCtB,QAAQC,IAAI,IAAIC,KAAQ,iBAAkBoC,CAAM,EAGvC,CAAA,GAAMP,EAAA5C,KAAKQ,eAAekD,YAAWY,KAAIC,MAAA3B,EAAA4B,cAAA,CAACT,EAAaZ,GAAMsB,OAAKrB,CAAM,EAAA,CAAA,CAAA,CAAA,G,cAAjFG,EAASmB,EAAA7B,KAAA,EAET7C,KAAKQ,eAAe2B,eAAc,GAClCtB,QAAQC,IAAI,IAAIC,KAAQ,kBAAmBoC,CAAM,EAGhDK,IACD/B,aAAagC,CAAa,EAC1BzD,KAAK8B,mBAAmBd,EAAI,CACxB0B,KAAM,eACNO,OAAMA,EACNC,UAASA,EACT5B,MAAO,CAAA,EACPiC,OAAMA,C,CACT,GAGLvD,KAAKC,cAAgBD,KAAKC,cAAc0E,OAAO,SAAAC,GAAK,OAAAA,IAAM3B,CAAN,CAAY,EAE5DjD,KAAKQ,eAAe2B,eAAc,GAClCtB,QAAQC,IAAI,IAAIC,KAAQ,iBAAkBuB,KAAKsB,UAAU5D,KAAKC,cAAe,KAAM,CAAC,CAAC,E,aAIzF,G,WAAKuD,EAgBL,OAFA3C,QAAQS,MAAM,IAAIP,KAAS,oBAAA4C,OAAoBR,EAAM,KAAA,EAAAQ,OAAMrB,KAAKsB,UAAUZ,EAAM,KAAM,CAAC,CAAC,CAAE,EAE1F,CAAA,EAAMhD,KAAKQ,eAAekD,WAAW,iBAAkB,oBAAAC,OAAoBR,EAAM,KAAA,EAAAQ,OAAMrB,KAAKsB,UAAUZ,EAAM,KAAM,CAAC,CAAC,CAAE,GALlH,MAVAvB,aAAagC,CAAa,EAC1B5C,QAAQS,MAAM,sBAAuB2B,EAAQ,UAAWE,EAAQ0B,CAAG,EACnEA,EAAIC,QAAU,sBAAwB7B,EAAS,WAAaE,EAAS,MAAQ0B,EAAIC,QACjF9E,KAAK8B,mBAAmBd,EAAI,CACxB0B,KAAM,eACNO,OAAMA,EACNC,UAASA,EACT5B,MAAO,CAAA,EACPiC,OAAQsB,GAAO,e,CAClB,EACKA,E,cAKVH,EAAA7B,KAAA,EAEA7C,KAAKC,cAAgBD,KAAKC,cAAc0E,OAAO,SAAAC,GAAK,OAAAA,IAAM3B,CAAN,CAAY,E,6BAIjElD,oBAAAQ,UAAAuB,mBAAP,SAA0Bd,EAAI+D,GAS1B,GARuB,UAAnB,OAAOA,IACPA,EAAUzC,KAAKsB,UAAUmB,CAAO,GAGhC/E,KAAKQ,eAAe2B,eAAc,GAClCtB,QAAQC,IAAI,IAAIC,KAAQ,UAAWgE,CAAO,EAG1C/D,GAAMA,EAAGgE,aAAehE,EAAGiE,KAC3B,IACIjE,EAAGkE,KAAKH,CAAO,C,CAEnB,MAAOhC,GACHlC,QAAQS,MAAM,kCAAmCyB,CAAG,C,MAGnD/B,GACLA,EAAGgB,MAAK,CAEhB,EACJjC,mBAAA,EAAC,EA9NYoF,QAAApF,oBAAAA","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: 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_INTERNAL'] ? this._serverConfig['SERVER_URL_INTERNAL'] : this._serverConfig['SERVER_URL']) + '/websocket?workerToken=' + this._serverConfig['WORKER_TOKEN'];\n const ws = new WebSocket(wsUrl);\n \n let lastComm = null;\n let interval = null;\n let openTimeout = null;\n let opened = false;\n \n // Set timeout if the socket never opens\n openTimeout = setTimeout(() => {\n if (!opened) {\n console.error(new Date(), 'WebSocket connection timeout. Retrying...');\n ws.terminate(); // force close if still connecting\n }\n }, 10000); // 10 seconds timeout\n \n ws.on('open', () => {\n opened = true;\n clearTimeout(openTimeout);\n \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 if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Message Recv', rawData);\n }\n \n if (typeof rawData !== 'string') {\n rawData = rawData.toString();\n }\n \n if (rawData === 'ping') {\n if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Recv Ping, Sending Pong');\n }\n \n this.sendWorkerResponse(ws, 'pong');\n }\n else if (rawData === 'pong') {\n if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Recv Pong');\n }\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 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 1s...');\n setTimeout(() => {\n this.startWorkerInstance();\n }, 1000);\n \n if (interval) {\n clearInterval(interval);\n }\n clearTimeout(openTimeout);\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 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 }, this._methodManager.getMethod(method).timeoutOverride || (1000 * 60 * 2));\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 if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Running method', method);\n }\n\n let result = await this._methodManager.callMethod.call(managerThis, method, ...params);\n\n if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Finished method', method);\n }\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 if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Done with Task', JSON.stringify(this._runningTasks, null, 2));\n }\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 if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Sending', payload);\n }\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":[],"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_INTERNAL'] ? this._serverConfig['SERVER_URL_INTERNAL'] : this._serverConfig['SERVER_URL']) + '/websocket?workerToken=' + this._serverConfig['WORKER_TOKEN'];\n const ws = new WebSocket(wsUrl);\n \n let lastComm = null;\n let interval = null;\n let openTimeout = null;\n let opened = false;\n \n // Set timeout if the socket never opens\n openTimeout = setTimeout(() => {\n if (!opened) {\n console.error(new Date(), 'WebSocket connection timeout. Retrying...');\n ws.terminate(); // force close if still connecting\n }\n }, 10000); // 10 seconds timeout\n \n ws.on('open', () => {\n opened = true;\n clearTimeout(openTimeout);\n \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 if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Message Recv', rawData);\n }\n \n if (typeof rawData !== 'string') {\n rawData = rawData.toString();\n }\n \n if (rawData === 'ping') {\n if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Recv Ping, Sending Pong');\n }\n \n this.sendWorkerResponse(ws, 'pong');\n }\n else if (rawData === 'pong') {\n if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Recv Pong');\n }\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 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 1s...');\n setTimeout(() => {\n this.startWorkerInstance();\n }, 1000);\n \n if (interval) {\n clearInterval(interval);\n }\n clearTimeout(openTimeout);\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 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 }, (1000 * 60 * 2));\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 if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Running method', method);\n }\n\n let result = await this._methodManager.callMethod.call(managerThis, method, ...params);\n\n if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Finished method', method);\n }\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 if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Done with Task', JSON.stringify(this._runningTasks, null, 2));\n }\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 if (this._methodManager.getEnableDebug()) {\n console.log(new Date(), 'Sending', payload);\n }\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}"]}