@resolveio/server-lib 12.5.52 → 12.5.54

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 (400) hide show
  1. package/.nodemon.json +5 -0
  2. package/.vscode/settings.json +3 -0
  3. package/README.md +22 -0
  4. package/compileDTS.pl +64 -0
  5. package/gulpfile.js +127 -0
  6. package/mongodbensurers.js +2 -0
  7. package/mongostop.js +3 -0
  8. package/package.json +1 -1
  9. package/settings.development.json +13 -0
  10. package/src/client-server-app.ts +7 -0
  11. package/src/collections/app-status.collection.ts +51 -0
  12. package/src/collections/counter.collection.ts +54 -0
  13. package/src/collections/cron-job-history.collection.ts +82 -0
  14. package/src/collections/cron-job.collection.ts +85 -0
  15. package/src/collections/email-history.collection.ts +66 -0
  16. package/src/collections/email-verified.collection.ts +61 -0
  17. package/src/collections/file.collection.ts +73 -0
  18. package/src/collections/flag.collection.ts +56 -0
  19. package/src/collections/log-method-latency.collection.ts +64 -0
  20. package/src/collections/log-subscription.collection.ts +68 -0
  21. package/src/collections/log-ts.collection.ts +78 -0
  22. package/src/collections/log.collection.ts +77 -0
  23. package/src/collections/logged-in-users.collection.ts +65 -0
  24. package/src/collections/method-response.collection.ts +66 -0
  25. package/src/collections/monitor-cpu.collection.ts +63 -0
  26. package/src/collections/monitor-memory.collection.ts +75 -0
  27. package/src/collections/monitor-mongo.collection.ts +69 -0
  28. package/src/collections/notification.collection.ts +51 -0
  29. package/src/collections/report-builder-dashboard-builder.collection.ts +109 -0
  30. package/src/collections/report-builder-library.collection.ts +89 -0
  31. package/src/collections/report-builder-report.collection.ts +149 -0
  32. package/src/collections/user-group.collection.ts +90 -0
  33. package/src/collections/user-guide.collection.ts +57 -0
  34. package/src/collections/user.collection.ts +259 -0
  35. package/src/cron/cron.ts +188 -0
  36. package/src/fixtures/cron-jobs.ts +25 -0
  37. package/src/fixtures/init.ts +10 -0
  38. package/src/http/auth.ts +732 -0
  39. package/src/http/health.ts +7 -0
  40. package/src/http/home.ts +71 -0
  41. package/src/index.ts +71 -0
  42. package/src/managers/cron.manager.ts +208 -0
  43. package/src/managers/method.manager.ts +607 -0
  44. package/src/managers/mongo.manager.ts +2282 -0
  45. package/src/managers/monitor.manager.ts +323 -0
  46. package/src/managers/subscription.manager.ts +1196 -0
  47. package/{managers/subscription.performance.js → src/managers/subscription.performance.ts} +68 -33
  48. package/src/methods/accounts.ts +202 -0
  49. package/src/methods/aws.ts +507 -0
  50. package/src/methods/collections.ts +512 -0
  51. package/src/methods/counters.ts +75 -0
  52. package/src/methods/cron-jobs.ts +1454 -0
  53. package/src/methods/flags.ts +7 -0
  54. package/src/methods/logs.ts +327 -0
  55. package/src/methods/monitor.ts +548 -0
  56. package/src/methods/pdf.ts +615 -0
  57. package/src/methods/report-builder.ts +876 -0
  58. package/src/methods/support.ts +146 -0
  59. package/{models/app-status.model.d.ts → src/models/app-status.model.ts} +3 -2
  60. package/{models/billing-logged-in-users.model.d.ts → src/models/billing-logged-in-users.model.ts} +5 -4
  61. package/src/models/collection-document.model.ts +22 -0
  62. package/{models/counter.model.d.ts → src/models/counter.model.ts} +4 -3
  63. package/src/models/cron-job-history.model.ts +13 -0
  64. package/src/models/cron-job.model.ts +14 -0
  65. package/src/models/dialog.model.ts +25 -0
  66. package/{models/email-history.model.d.ts → src/models/email-history.model.ts} +8 -7
  67. package/{models/email-verified.model.d.ts → src/models/email-verified.model.ts} +6 -5
  68. package/{models/file.model.d.ts → src/models/file.model.ts} +8 -7
  69. package/{models/flag.model.d.ts → src/models/flag.model.ts} +4 -3
  70. package/{models/log-method-latency.model.d.ts → src/models/log-method-latency.model.ts} +5 -4
  71. package/{models/log-subscription.model.d.ts → src/models/log-subscription.model.ts} +8 -6
  72. package/{models/log.model.d.ts → src/models/log.model.ts} +12 -10
  73. package/{models/logged-in-users.model.d.ts → src/models/logged-in-users.model.ts} +6 -5
  74. package/{models/method-response.model.d.ts → src/models/method-response.model.ts} +7 -6
  75. package/src/models/method.model.ts +11 -0
  76. package/{models/monitor-cpu.model.d.ts → src/models/monitor-cpu.model.ts} +9 -7
  77. package/src/models/monitor-memory.model.ts +17 -0
  78. package/src/models/monitor-mongo.model.ts +15 -0
  79. package/{models/notification.model.d.ts → src/models/notification.model.ts} +3 -2
  80. package/src/models/pagination.model.ts +30 -0
  81. package/src/models/permission.model.ts +14 -0
  82. package/src/models/report-builder-dashboard-builder.model.ts +29 -0
  83. package/src/models/report-builder-library.model.ts +20 -0
  84. package/src/models/report-builder-report.model.ts +110 -0
  85. package/src/models/report-builder.model.ts +68 -0
  86. package/src/models/select-data-label.model.ts +9 -0
  87. package/src/models/server-response.model.ts +5 -0
  88. package/src/models/subscription.model.ts +64 -0
  89. package/src/models/support-ticket.model.ts +81 -0
  90. package/src/models/user-group.model.ts +23 -0
  91. package/{models/user-guide.model.d.ts → src/models/user-guide.model.ts} +5 -4
  92. package/src/models/user.model.ts +79 -0
  93. package/{public_api.d.ts → src/public_api.ts} +1 -1
  94. package/src/publications/app-status.ts +13 -0
  95. package/src/publications/cron-jobs.ts +30 -0
  96. package/src/publications/files.ts +34 -0
  97. package/src/publications/flags.ts +20 -0
  98. package/src/publications/logs.ts +164 -0
  99. package/src/publications/method-responses.ts +13 -0
  100. package/src/publications/notifications.ts +13 -0
  101. package/src/publications/report-builder-dashboard-builders.ts +39 -0
  102. package/src/publications/report-builder-libraries.ts +41 -0
  103. package/src/publications/report-builder-reports.ts +48 -0
  104. package/src/publications/super-admin.ts +13 -0
  105. package/src/publications/user-groups.ts +12 -0
  106. package/src/publications/user-guides.ts +12 -0
  107. package/src/server-app.ts +769 -0
  108. package/src/util/common.ts +519 -0
  109. package/src/util/schema-report-builder.ts +413 -0
  110. package/tsconfig.json +30 -0
  111. package/tslint.json +143 -0
  112. package/client-server-app.d.ts +0 -1
  113. package/client-server-app.js +0 -48
  114. package/client-server-app.js.map +0 -1
  115. package/collections/app-status.collection.d.ts +0 -3
  116. package/collections/app-status.collection.js +0 -51
  117. package/collections/app-status.collection.js.map +0 -1
  118. package/collections/counter.collection.d.ts +0 -3
  119. package/collections/counter.collection.js +0 -54
  120. package/collections/counter.collection.js.map +0 -1
  121. package/collections/cron-job-history.collection.d.ts +0 -3
  122. package/collections/cron-job-history.collection.js +0 -82
  123. package/collections/cron-job-history.collection.js.map +0 -1
  124. package/collections/cron-job.collection.d.ts +0 -3
  125. package/collections/cron-job.collection.js +0 -85
  126. package/collections/cron-job.collection.js.map +0 -1
  127. package/collections/email-history.collection.d.ts +0 -3
  128. package/collections/email-history.collection.js +0 -66
  129. package/collections/email-history.collection.js.map +0 -1
  130. package/collections/email-verified.collection.d.ts +0 -3
  131. package/collections/email-verified.collection.js +0 -61
  132. package/collections/email-verified.collection.js.map +0 -1
  133. package/collections/file.collection.d.ts +0 -3
  134. package/collections/file.collection.js +0 -73
  135. package/collections/file.collection.js.map +0 -1
  136. package/collections/flag.collection.d.ts +0 -3
  137. package/collections/flag.collection.js +0 -56
  138. package/collections/flag.collection.js.map +0 -1
  139. package/collections/log-method-latency.collection.d.ts +0 -3
  140. package/collections/log-method-latency.collection.js +0 -64
  141. package/collections/log-method-latency.collection.js.map +0 -1
  142. package/collections/log-subscription.collection.d.ts +0 -3
  143. package/collections/log-subscription.collection.js +0 -68
  144. package/collections/log-subscription.collection.js.map +0 -1
  145. package/collections/log-ts.collection.d.ts +0 -3
  146. package/collections/log-ts.collection.js +0 -78
  147. package/collections/log-ts.collection.js.map +0 -1
  148. package/collections/log.collection.d.ts +0 -3
  149. package/collections/log.collection.js +0 -77
  150. package/collections/log.collection.js.map +0 -1
  151. package/collections/logged-in-users.collection.d.ts +0 -3
  152. package/collections/logged-in-users.collection.js +0 -65
  153. package/collections/logged-in-users.collection.js.map +0 -1
  154. package/collections/method-response.collection.d.ts +0 -3
  155. package/collections/method-response.collection.js +0 -66
  156. package/collections/method-response.collection.js.map +0 -1
  157. package/collections/monitor-cpu.collection.d.ts +0 -3
  158. package/collections/monitor-cpu.collection.js +0 -63
  159. package/collections/monitor-cpu.collection.js.map +0 -1
  160. package/collections/monitor-memory.collection.d.ts +0 -3
  161. package/collections/monitor-memory.collection.js +0 -75
  162. package/collections/monitor-memory.collection.js.map +0 -1
  163. package/collections/monitor-mongo.collection.d.ts +0 -3
  164. package/collections/monitor-mongo.collection.js +0 -69
  165. package/collections/monitor-mongo.collection.js.map +0 -1
  166. package/collections/notification.collection.d.ts +0 -3
  167. package/collections/notification.collection.js +0 -51
  168. package/collections/notification.collection.js.map +0 -1
  169. package/collections/report-builder-dashboard-builder.collection.d.ts +0 -3
  170. package/collections/report-builder-dashboard-builder.collection.js +0 -109
  171. package/collections/report-builder-dashboard-builder.collection.js.map +0 -1
  172. package/collections/report-builder-library.collection.d.ts +0 -3
  173. package/collections/report-builder-library.collection.js +0 -87
  174. package/collections/report-builder-library.collection.js.map +0 -1
  175. package/collections/report-builder-report.collection.d.ts +0 -4
  176. package/collections/report-builder-report.collection.js +0 -149
  177. package/collections/report-builder-report.collection.js.map +0 -1
  178. package/collections/user-group.collection.d.ts +0 -4
  179. package/collections/user-group.collection.js +0 -90
  180. package/collections/user-group.collection.js.map +0 -1
  181. package/collections/user-guide.collection.d.ts +0 -3
  182. package/collections/user-guide.collection.js +0 -57
  183. package/collections/user-guide.collection.js.map +0 -1
  184. package/collections/user.collection.d.ts +0 -4
  185. package/collections/user.collection.js +0 -259
  186. package/collections/user.collection.js.map +0 -1
  187. package/cron/cron.d.ts +0 -5
  188. package/cron/cron.js +0 -162
  189. package/cron/cron.js.map +0 -1
  190. package/fixtures/cron-jobs.d.ts +0 -1
  191. package/fixtures/cron-jobs.js +0 -73
  192. package/fixtures/cron-jobs.js.map +0 -1
  193. package/fixtures/init.d.ts +0 -1
  194. package/fixtures/init.js +0 -59
  195. package/fixtures/init.js.map +0 -1
  196. package/http/auth.d.ts +0 -2
  197. package/http/auth.js +0 -763
  198. package/http/auth.js.map +0 -1
  199. package/http/health.d.ts +0 -1
  200. package/http/health.js +0 -12
  201. package/http/health.js.map +0 -1
  202. package/http/home.d.ts +0 -2
  203. package/http/home.js +0 -66
  204. package/http/home.js.map +0 -1
  205. package/index.d.ts +0 -23
  206. package/index.js +0 -127
  207. package/index.js.map +0 -1
  208. package/managers/cron.manager.d.ts +0 -17
  209. package/managers/cron.manager.js +0 -242
  210. package/managers/cron.manager.js.map +0 -1
  211. package/managers/method.manager.d.ts +0 -38
  212. package/managers/method.manager.js +0 -595
  213. package/managers/method.manager.js.map +0 -1
  214. package/managers/mongo.manager.d.ts +0 -178
  215. package/managers/mongo.manager.js +0 -2221
  216. package/managers/mongo.manager.js.map +0 -1
  217. package/managers/monitor.manager.d.ts +0 -59
  218. package/managers/monitor.manager.js +0 -351
  219. package/managers/monitor.manager.js.map +0 -1
  220. package/managers/subscription.manager.d.ts +0 -50
  221. package/managers/subscription.manager.js +0 -1091
  222. package/managers/subscription.manager.js.map +0 -1
  223. package/managers/subscription.performance.d.ts +0 -1
  224. package/managers/subscription.performance.js.map +0 -1
  225. package/methods/accounts.d.ts +0 -2
  226. package/methods/accounts.js +0 -274
  227. package/methods/accounts.js.map +0 -1
  228. package/methods/aws.d.ts +0 -2
  229. package/methods/aws.js +0 -617
  230. package/methods/aws.js.map +0 -1
  231. package/methods/collections.d.ts +0 -2
  232. package/methods/collections.js +0 -499
  233. package/methods/collections.js.map +0 -1
  234. package/methods/counters.d.ts +0 -2
  235. package/methods/counters.js +0 -122
  236. package/methods/counters.js.map +0 -1
  237. package/methods/cron-jobs.d.ts +0 -2
  238. package/methods/cron-jobs.js +0 -1315
  239. package/methods/cron-jobs.js.map +0 -1
  240. package/methods/flags.d.ts +0 -2
  241. package/methods/flags.js +0 -9
  242. package/methods/flags.js.map +0 -1
  243. package/methods/logs.d.ts +0 -2
  244. package/methods/logs.js +0 -371
  245. package/methods/logs.js.map +0 -1
  246. package/methods/monitor.d.ts +0 -2
  247. package/methods/monitor.js +0 -565
  248. package/methods/monitor.js.map +0 -1
  249. package/methods/pdf.d.ts +0 -2
  250. package/methods/pdf.js +0 -324
  251. package/methods/pdf.js.map +0 -1
  252. package/methods/report-builder.d.ts +0 -2
  253. package/methods/report-builder.js +0 -858
  254. package/methods/report-builder.js.map +0 -1
  255. package/methods/support.d.ts +0 -2
  256. package/methods/support.js +0 -246
  257. package/methods/support.js.map +0 -1
  258. package/models/app-status.model.js +0 -4
  259. package/models/app-status.model.js.map +0 -1
  260. package/models/billing-logged-in-users.model.js +0 -4
  261. package/models/billing-logged-in-users.model.js.map +0 -1
  262. package/models/collection-document.model.d.ts +0 -19
  263. package/models/collection-document.model.js +0 -4
  264. package/models/collection-document.model.js.map +0 -1
  265. package/models/counter.model.js +0 -4
  266. package/models/counter.model.js.map +0 -1
  267. package/models/cron-job-history.model.d.ts +0 -12
  268. package/models/cron-job-history.model.js +0 -4
  269. package/models/cron-job-history.model.js.map +0 -1
  270. package/models/cron-job.model.d.ts +0 -13
  271. package/models/cron-job.model.js +0 -4
  272. package/models/cron-job.model.js.map +0 -1
  273. package/models/dialog.model.d.ts +0 -23
  274. package/models/dialog.model.js +0 -4
  275. package/models/dialog.model.js.map +0 -1
  276. package/models/email-history.model.js +0 -4
  277. package/models/email-history.model.js.map +0 -1
  278. package/models/email-verified.model.js +0 -4
  279. package/models/email-verified.model.js.map +0 -1
  280. package/models/file.model.js +0 -4
  281. package/models/file.model.js.map +0 -1
  282. package/models/flag.model.js +0 -4
  283. package/models/flag.model.js.map +0 -1
  284. package/models/log-method-latency.model.js +0 -4
  285. package/models/log-method-latency.model.js.map +0 -1
  286. package/models/log-subscription.model.js +0 -4
  287. package/models/log-subscription.model.js.map +0 -1
  288. package/models/log.model.js +0 -4
  289. package/models/log.model.js.map +0 -1
  290. package/models/logged-in-users.model.js +0 -4
  291. package/models/logged-in-users.model.js.map +0 -1
  292. package/models/method-response.model.js +0 -4
  293. package/models/method-response.model.js.map +0 -1
  294. package/models/method.model.d.ts +0 -9
  295. package/models/method.model.js +0 -4
  296. package/models/method.model.js.map +0 -1
  297. package/models/monitor-cpu.model.js +0 -4
  298. package/models/monitor-cpu.model.js.map +0 -1
  299. package/models/monitor-memory.model.d.ts +0 -15
  300. package/models/monitor-memory.model.js +0 -4
  301. package/models/monitor-memory.model.js.map +0 -1
  302. package/models/monitor-mongo.model.d.ts +0 -13
  303. package/models/monitor-mongo.model.js +0 -4
  304. package/models/monitor-mongo.model.js.map +0 -1
  305. package/models/notification.model.js +0 -4
  306. package/models/notification.model.js.map +0 -1
  307. package/models/pagination.model.d.ts +0 -10
  308. package/models/pagination.model.js +0 -24
  309. package/models/pagination.model.js.map +0 -1
  310. package/models/permission.model.d.ts +0 -12
  311. package/models/permission.model.js +0 -4
  312. package/models/permission.model.js.map +0 -1
  313. package/models/report-builder-dashboard-builder.model.d.ts +0 -25
  314. package/models/report-builder-dashboard-builder.model.js +0 -4
  315. package/models/report-builder-dashboard-builder.model.js.map +0 -1
  316. package/models/report-builder-library.model.d.ts +0 -17
  317. package/models/report-builder-library.model.js +0 -4
  318. package/models/report-builder-library.model.js.map +0 -1
  319. package/models/report-builder-report.model.d.ts +0 -98
  320. package/models/report-builder-report.model.js +0 -4
  321. package/models/report-builder-report.model.js.map +0 -1
  322. package/models/report-builder.model.d.ts +0 -61
  323. package/models/report-builder.model.js +0 -4
  324. package/models/report-builder.model.js.map +0 -1
  325. package/models/select-data-label.model.d.ts +0 -9
  326. package/models/select-data-label.model.js +0 -4
  327. package/models/select-data-label.model.js.map +0 -1
  328. package/models/server-response.model.d.ts +0 -5
  329. package/models/server-response.model.js +0 -4
  330. package/models/server-response.model.js.map +0 -1
  331. package/models/subscription.model.d.ts +0 -23
  332. package/models/subscription.model.js +0 -4
  333. package/models/subscription.model.js.map +0 -1
  334. package/models/support-ticket.model.d.ts +0 -72
  335. package/models/support-ticket.model.js +0 -4
  336. package/models/support-ticket.model.js.map +0 -1
  337. package/models/user-group.model.d.ts +0 -19
  338. package/models/user-group.model.js +0 -4
  339. package/models/user-group.model.js.map +0 -1
  340. package/models/user-guide.model.js +0 -4
  341. package/models/user-guide.model.js.map +0 -1
  342. package/models/user.model.d.ts +0 -70
  343. package/models/user.model.js +0 -4
  344. package/models/user.model.js.map +0 -1
  345. package/public_api.js +0 -75
  346. package/public_api.js.map +0 -1
  347. package/publications/app-status.d.ts +0 -2
  348. package/publications/app-status.js +0 -17
  349. package/publications/app-status.js.map +0 -1
  350. package/publications/cron-jobs.d.ts +0 -2
  351. package/publications/cron-jobs.js +0 -33
  352. package/publications/cron-jobs.js.map +0 -1
  353. package/publications/files.d.ts +0 -2
  354. package/publications/files.js +0 -37
  355. package/publications/files.js.map +0 -1
  356. package/publications/flags.d.ts +0 -2
  357. package/publications/flags.js +0 -23
  358. package/publications/flags.js.map +0 -1
  359. package/publications/logs.d.ts +0 -2
  360. package/publications/logs.js +0 -165
  361. package/publications/logs.js.map +0 -1
  362. package/publications/method-responses.d.ts +0 -2
  363. package/publications/method-responses.js +0 -17
  364. package/publications/method-responses.js.map +0 -1
  365. package/publications/notifications.d.ts +0 -2
  366. package/publications/notifications.js +0 -17
  367. package/publications/notifications.js.map +0 -1
  368. package/publications/report-builder-dashboard-builders.d.ts +0 -2
  369. package/publications/report-builder-dashboard-builders.js +0 -43
  370. package/publications/report-builder-dashboard-builders.js.map +0 -1
  371. package/publications/report-builder-libraries.d.ts +0 -2
  372. package/publications/report-builder-libraries.js +0 -90
  373. package/publications/report-builder-libraries.js.map +0 -1
  374. package/publications/report-builder-reports.d.ts +0 -2
  375. package/publications/report-builder-reports.js +0 -51
  376. package/publications/report-builder-reports.js.map +0 -1
  377. package/publications/super-admin.d.ts +0 -2
  378. package/publications/super-admin.js +0 -17
  379. package/publications/super-admin.js.map +0 -1
  380. package/publications/user-groups.d.ts +0 -1
  381. package/publications/user-groups.js +0 -17
  382. package/publications/user-groups.js.map +0 -1
  383. package/publications/user-guides.d.ts +0 -1
  384. package/publications/user-guides.js +0 -17
  385. package/publications/user-guides.js.map +0 -1
  386. package/server-app.d.ts +0 -52
  387. package/server-app.js +0 -739
  388. package/server-app.js.map +0 -1
  389. package/util/common.d.ts +0 -25
  390. package/util/common.js +0 -524
  391. package/util/common.js.map +0 -1
  392. package/util/schema-report-builder.d.ts +0 -6
  393. package/util/schema-report-builder.js +0 -453
  394. package/util/schema-report-builder.js.map +0 -1
  395. /package/{private → src/private}/email-templates/enrollment.html +0 -0
  396. /package/{private → src/private}/email-templates/forgot-password.html +0 -0
  397. /package/{private → src/private}/email-templates/support-ticket-deleted.html +0 -0
  398. /package/{private → src/private}/email-templates/support-ticket-modified.html +0 -0
  399. /package/{private → src/private}/email-templates/support-ticket.html +0 -0
  400. /package/{private → src/private}/images/ResolveIO.png +0 -0
@@ -0,0 +1,769 @@
1
+ import { createServer, Server } from 'http';
2
+ import * as express from 'express';
3
+ import * as bodyParser from 'body-parser';
4
+ import * as xmlParser from 'express-xml-bodyparser';
5
+ import * as WebSocket from 'ws';
6
+ import * as jwt from 'jsonwebtoken';
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ // import * as SegfaultHandler from 'segfault-handler';
9
+ import * as moment from 'moment';
10
+
11
+ import { dateReviver, getBinarySize, deepCopy } from './util/common';
12
+
13
+ import { objectIdHexString } from './managers/mongo.manager';
14
+ import { CronManager } from './managers/cron.manager';
15
+ import { MethodManager } from './managers/method.manager';
16
+ import { SubscriptionManager } from './managers/subscription.manager';
17
+ import { MonitorManager, MonitorManagerFunction } from './managers/monitor.manager';
18
+
19
+ import { ServerResponseModel } from './models/server-response.model';
20
+
21
+ import { MethodResponses } from './collections/method-response.collection';
22
+ import { Logs } from './collections/log.collection';
23
+ import { LogMethodLatencies } from './collections/log-method-latency.collection';
24
+ import { Users } from './collections/user.collection';
25
+
26
+ import { setupHomeRoutes } from './http/home';
27
+ import { setupAuthRoutes } from './http/auth';
28
+ import { setupHealthRoutes } from './http/health';
29
+ import { ResolveIOServer } from './index';
30
+
31
+ export default class ResolveIOMainServer {
32
+ private _app: express.Application;
33
+ private _serverHTTP: Server;
34
+ private _portHTTP: string | number;
35
+ private _serverWSS: WebSocket.Server;
36
+ private _portWSS: number;
37
+ private _serverConfig;
38
+ private _clientDir;
39
+ private _offlineUpdates = [];
40
+ private _msgQueue = [];
41
+ private _msgQueueRunning = false;
42
+ public sesMail = false;
43
+ private standardProgram = false;
44
+ private publicProgram = false;
45
+ private _rebootFlag = false;
46
+
47
+ private LOGGER = 'ERROR'; //ERROR / DEBUG
48
+
49
+ private _monitorManager: MonitorManager;
50
+ private _monitorManagerFunction: MonitorManagerFunction;
51
+ private _subscriptionManager: SubscriptionManager;
52
+ private _methodManager: MethodManager;
53
+ private _cronManager: CronManager;
54
+ private _clientRoutes: string[] = [];
55
+
56
+ private _serverStartTime: Date;
57
+ private _lastErrorMsg: Date = null;
58
+
59
+ private _debugMsgRecv = 0;
60
+ private _debugMsgQueue = 0;
61
+
62
+ constructor(mainServer, serverConfig, clientRoutes, clientDir, sesMail, standardProgram, publicProgram = false) {
63
+ this._serverConfig = serverConfig;
64
+ this._clientRoutes = clientRoutes;
65
+ this._clientDir = clientDir;
66
+ this.sesMail = sesMail;
67
+ this.standardProgram = standardProgram;
68
+ this.publicProgram = publicProgram;
69
+
70
+ this._serverStartTime = new Date();
71
+ this._lastErrorMsg = null;
72
+ this._monitorManager = new MonitorManager(mainServer, serverConfig);
73
+ this._monitorManagerFunction = new MonitorManagerFunction();
74
+
75
+ setInterval(() => {
76
+ if (this._subscriptionManager.getEnableDebug()) {
77
+ console.log(new Date(), 'Server App', 'Msg Queue Length', this._msgQueue.length);
78
+ console.log(new Date(), 'Server App', 'Msg Recv Hits', this._debugMsgRecv);
79
+ console.log(new Date(), 'Server App', 'Msg Queue Hits', this._debugMsgQueue);
80
+ }
81
+
82
+ this._debugMsgQueue = 0;
83
+ this._debugMsgRecv = 0;
84
+ }, 60000);
85
+
86
+ process.on('unhandledRejection', async (error, rej) => {
87
+ console.error(new Date(), 'Unhandled Rejection at Promise', [error, rej]);
88
+
89
+ let diffTimeSec = moment().diff(this._serverStartTime, 'seconds');
90
+
91
+ if (error && error['name'] === 'MongoError' && error['message'] === 'not master') {
92
+ if (diffTimeSec > 60 && !this._lastErrorMsg) {
93
+ this._lastErrorMsg = new Date();
94
+
95
+ setTimeout(() => {
96
+ this._lastErrorMsg = null;
97
+ }, 60000);
98
+
99
+ await this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));
100
+ }
101
+
102
+ process.exit(1);
103
+ }
104
+ else if (error && error['name'] === 'MongoError' && error['message'] === 'not master and slaveOk=false') {
105
+ if (diffTimeSec > 60 && !this._lastErrorMsg) {
106
+ this._lastErrorMsg = new Date();
107
+
108
+ setTimeout(() => {
109
+ this._lastErrorMsg = null;
110
+ }, 60000);
111
+
112
+ await this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - Quitting NodeJS - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));
113
+ }
114
+
115
+ process.exit(1);
116
+ }
117
+ else if (error) {
118
+ if (error['name'] !== 'StatusError' && error['message'] !== '') {
119
+ if (diffTimeSec > 60 && !this._lastErrorMsg) {
120
+ this._lastErrorMsg = new Date();
121
+
122
+ setTimeout(() => {
123
+ this._lastErrorMsg = null;
124
+ }, 60000);
125
+
126
+ this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));
127
+ }
128
+ }
129
+ }
130
+ });
131
+
132
+ process.on('uncaughtException', async error => {
133
+ console.error(error, 'Uncaught Exception thrown');
134
+
135
+ let diffTimeSec = moment().diff(this._serverStartTime, 'seconds');
136
+
137
+ if (diffTimeSec > 60 && !this._lastErrorMsg) {
138
+ this._lastErrorMsg = new Date();
139
+
140
+ setTimeout(() => {
141
+ this._lastErrorMsg = null;
142
+ }, 60000);
143
+
144
+ await this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Exception - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));
145
+ }
146
+ });
147
+
148
+ //PM2 wants to reboot/restart
149
+ process.on('SIGINT', () => {
150
+ this._rebootFlag = true;
151
+ this._serverHTTP.close();
152
+ this.safeShutdown();
153
+ });
154
+
155
+ process.on('SIGTERM', () => {
156
+ this._rebootFlag = true;
157
+ this._serverHTTP.close();
158
+ this.safeShutdown();
159
+ });
160
+
161
+ process.on('SIGQUIT', () => {
162
+ this._rebootFlag = true;
163
+ this._serverHTTP.close();
164
+ this.safeShutdown();
165
+ });
166
+
167
+ if (this.LOGGER === 'DEBUG') {
168
+ console.log('Starting ResolveIO Server');
169
+ }
170
+
171
+ // Start express app
172
+ this._app = express();
173
+
174
+ // Use body parser for http call (login)
175
+ this._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));
176
+ this._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));
177
+ this._app.use(xmlParser());
178
+
179
+ // Set port
180
+ this._portHTTP = process.env.PORT_HTTP || serverConfig['PORT_HTTP'] || 8080;
181
+ this._portWSS = process.env.PORT_WSS || serverConfig['PORT_WSS'] || 8081;
182
+
183
+ if (this.LOGGER === 'DEBUG') {
184
+ console.log('Setup ports');
185
+ }
186
+
187
+ // Create http server and websock server
188
+ this.createServer();
189
+
190
+ if (this.LOGGER === 'DEBUG') {
191
+ console.log('Create server');
192
+ }
193
+
194
+ // Set CORS
195
+ this._app.use(function (req, res, next) {
196
+
197
+ // Website you wish to allow to connect
198
+ // res.setHeader('Access-Control-Allow-Origin', serverConfig['ROOT_URL']);
199
+ res.setHeader('Access-Control-Allow-Origin', '*');
200
+
201
+ // Request methods you wish to allow
202
+ // res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
203
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
204
+
205
+ // Request headers you wish to allow
206
+ res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
207
+
208
+ // Set to true if you need the website to include cookies in the requests sent
209
+ // to the API (e.g. in case you use sessions)
210
+ res.setHeader('Access-Control-Allow-Credentials', 'false');
211
+
212
+ // Pass to next layer of middleware
213
+ next();
214
+ });
215
+
216
+ if (this.LOGGER === 'DEBUG') {
217
+ console.log('Setup cors');
218
+ }
219
+
220
+ // Set up http login route
221
+ setupAuthRoutes(this, this._app, serverConfig);
222
+ setupHealthRoutes(this._app, serverConfig);
223
+
224
+ if (serverConfig['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {
225
+ setupHomeRoutes(this, this._app, serverConfig);
226
+ }
227
+
228
+ if (this.LOGGER === 'DEBUG') {
229
+ console.log('Setup express routes');
230
+ }
231
+ }
232
+
233
+ private safeShutdown() {
234
+ console.log(new Date(), 'Safe Shutdown Command Received');
235
+ if (
236
+ !this._monitorManagerFunction.getActiveMonitorFunctions().length &&
237
+ // (!this._monitorManagerFunction.getLastCompletedMonitorFunction() ||
238
+ // Date.now() >= this._monitorManagerFunction.getLastCompletedMonitorFunction().endTime.getTime() + 1500) &&
239
+ !this._msgQueue.length &&
240
+ !this._msgQueueRunning &&
241
+ !this._offlineUpdates.length
242
+ ) {
243
+ ResolveIOServer.getMongoConnection().close(false, () => {
244
+ console.log(new Date(), 'Safe Exit Complete, Process Exit');
245
+ process.exit(0);
246
+ });
247
+ }
248
+ else {
249
+ console.log(new Date(),
250
+ 'Safe Exit In Progress',
251
+ this._monitorManagerFunction.getActiveMonitorFunctions().length,
252
+ // this._monitorManagerFunction.getLastCompletedMonitorFunction() ? this._monitorManagerFunction.getLastCompletedMonitorFunction().endTime : '',
253
+ this._msgQueue.length,
254
+ this._msgQueueRunning,
255
+ this._offlineUpdates.length
256
+ );
257
+
258
+ setImmediate(() => {
259
+ this.safeShutdown();
260
+ });
261
+ }
262
+ }
263
+
264
+ public getWS(id_ws: string) {
265
+ return Array.from(this._serverWSS.clients).filter(a => a['id_socket'] === id_ws)[0];
266
+ }
267
+
268
+ public getWSList() {
269
+ let res = [];
270
+
271
+ this._serverWSS.clients.forEach((ws: WebSocket) => {
272
+ res.push(ws['id_socket']);
273
+ });
274
+
275
+ return res;
276
+ }
277
+
278
+ public getWSUserList() {
279
+ let res = [];
280
+
281
+ this._serverWSS.clients.forEach((ws: WebSocket) => {
282
+ res.push(ws['id_user']);
283
+ });
284
+
285
+ return res;
286
+ }
287
+
288
+ public getHTTPServer() {
289
+ return this._serverHTTP;
290
+ }
291
+
292
+ public getCronManager() {
293
+ return this._cronManager;
294
+ }
295
+
296
+ public getMethodManager() {
297
+ return this._methodManager;
298
+ }
299
+
300
+ public getSubscriptionManager() {
301
+ return this._subscriptionManager;
302
+ }
303
+
304
+ public getMonitorManager() {
305
+ return this._monitorManager;
306
+ }
307
+
308
+ public getRebootFlag() {
309
+ return this._rebootFlag;
310
+ }
311
+
312
+ private createServer(): void {
313
+ // Start express server
314
+ this._serverHTTP = createServer(this._app);
315
+ this._serverHTTP.keepAliveTimeout = 65000;
316
+ this._serverHTTP.headersTimeout = 66000; // This should be bigger than `keepAliveTimeout + your server's expected response time`
317
+
318
+ // Start websocket server
319
+ // Verify client with token before opening socket
320
+ this._serverWSS = new WebSocket.Server({
321
+ port: this._portWSS,
322
+ verifyClient: this.publicProgram ? null : async (info, cb) => {
323
+ if (this._rebootFlag) {
324
+ cb(false, 409, 'Unable To Process');
325
+ }
326
+ else {
327
+ if (this.LOGGER === 'DEBUG') {
328
+ console.log('Verify Client', info, cb);
329
+ }
330
+
331
+ let infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);
332
+
333
+ if (info.origin !== this._serverConfig['ROOT_URL'] && info.origin !== this._serverConfig['SEC_ROOT_URL'] && info.origin !== this._serverConfig['RESOLVEIO_URL'] && info.origin !== this._serverConfig['RESOLVEIO_SECONDARY_URL']) {
334
+ cb(false, 401, 'Unauthorized');
335
+ }
336
+ else {
337
+ let token = infoData[0];
338
+ if (!token) {
339
+ cb(false, 401, 'Unauthorized');
340
+ }
341
+ else {
342
+ jwt.verify(token, this._serverConfig['JWT_SECRET'], async (err, decoded) => {
343
+ if (err) {
344
+ cb(false, 401, 'Unauthorized');
345
+ }
346
+ else {
347
+ info.req['id_user'] = decoded['id_user'];
348
+ try {
349
+ let user = await Users.findById(decoded['id_user']);
350
+ if (user) {
351
+ info.req['user'] = user.fullname;
352
+ info.req['user_readonly'] = user.readonly || false;
353
+ info.req['doc_user'] = user;
354
+ cb(true);
355
+ }
356
+ else {
357
+ cb(false);
358
+ }
359
+ }
360
+ catch (err) {
361
+ cb(false);
362
+ }
363
+ }
364
+ });
365
+ }
366
+ }
367
+ }
368
+ }
369
+ });
370
+
371
+ // Start MongoDB Connection
372
+ this.setUpMongo();
373
+ }
374
+
375
+ private setUpMongo() {
376
+ if (this.LOGGER === 'DEBUG') {
377
+ console.log('Start Managers');
378
+ }
379
+
380
+ // Start Managers
381
+ this._subscriptionManager = new SubscriptionManager(this, this._serverWSS, this._serverConfig, this._monitorManagerFunction);
382
+ this._methodManager = new MethodManager(this, this._serverConfig, this._clientDir, this._monitorManagerFunction);
383
+ this._cronManager = new CronManager(this);
384
+
385
+ if (this.LOGGER === 'DEBUG') {
386
+ console.log('End Managers');
387
+ }
388
+
389
+ this.listen();
390
+ }
391
+
392
+ // Listen to port for websocket
393
+ private listen(): void {
394
+ this._serverHTTP.listen(this._portHTTP, () => {
395
+ console.log('Running server on port %s', this._portHTTP);
396
+ });
397
+
398
+ this._serverWSS.on('listening', () => {
399
+ console.log('Running server on port %s', this._portWSS);
400
+ });
401
+
402
+ // On websocket connection (already verified)
403
+ this._serverWSS.on('connection', (ws, req) => {
404
+ if (!this.publicProgram) {
405
+ // Get user from token
406
+ ws['id_user'] = req['id_user'];
407
+ ws['user'] = req['user'];
408
+ ws['user_readonly'] = req['user_readonly'];
409
+ ws['doc_user'] = req['doc_user'];
410
+
411
+ if (ws['user'] !== 'Admin' && this._serverConfig['CLIENT_NAME'] !== 'ResolveIO') {
412
+ this.getMethodManager().callMethodInternal.call(this.getMethodManager(), 'supportCreateBillingUser', {
413
+ id_user: ws['id_user'],
414
+ user: ws['user'],
415
+ date: new Date(),
416
+ client: ResolveIOServer.getClientName()
417
+ });
418
+ }
419
+ }
420
+
421
+ let idSocket = '';
422
+
423
+ while (!idSocket || Array.from(this._serverWSS.clients).some(a => a['id_socket'] === idSocket)) {
424
+ idSocket = uuidv4();
425
+ }
426
+
427
+ ws['id_socket'] = idSocket;
428
+ ws['retryCnt'] = 0;
429
+
430
+ this._subscriptionManager.createLoggedInUser(idSocket).then(() => {
431
+ setTimeout(() => {
432
+ ws['pingTime'] = new Date();
433
+ ws.ping(() => {});
434
+ }, 5000);
435
+ });
436
+
437
+ if (this.LOGGER === 'DEBUG') {
438
+ console.log('Connection from: ' + req['user']);
439
+ }
440
+
441
+ // Use for keeping connection alive (ping/pong)
442
+ ws['isAlive'] = true;
443
+ ws.on('pong', () => {
444
+ ws['isAlive'] = true;
445
+ ws['pongTime'] = new Date();
446
+ ws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();
447
+ this._subscriptionManager.loggedInLatency(ws);
448
+ });
449
+
450
+ // On data received (message)
451
+ ws.on('message', async (message: string) => {
452
+ if (this.LOGGER === 'DEBUG') {
453
+ console.log('Message from: ' + ws['user'], message);
454
+ }
455
+
456
+ this._debugMsgRecv += 1;
457
+
458
+ let parseErrorFound = false;
459
+
460
+ let socketData = [];
461
+
462
+ try {
463
+ socketData = JSON.parse(message, dateReviver);
464
+ }
465
+ catch(e) {
466
+ console.log('Error - JSON.parse', message);
467
+
468
+ this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - JSON Parse Error - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([message, e]));
469
+
470
+ parseErrorFound = true;
471
+ }
472
+
473
+ if (!parseErrorFound) {
474
+ if (socketData[0] === 'ping') {
475
+ if (ws && ws.readyState === ws.OPEN) {
476
+ ws.send('pong', (error) => {
477
+ if (error) {
478
+ console.log('Error on WS: ', error);
479
+ if (this._subscriptionManager.getEnableDebug()) {
480
+ console.log(new Date(), 'Server App', 'Error WS Pong');
481
+ }
482
+ this.unsubscribeWS(ws);
483
+ }
484
+ });
485
+ }
486
+
487
+ return;
488
+ }
489
+
490
+ let messageRoute = socketData[0];
491
+
492
+ if (!this.publicProgram && this._clientRoutes.some(a => messageRoute.includes(a)) && !ws['doc_user'].roles.groups.some(a => a.views.some(b => messageRoute.includes(b))) && !ws['doc_user'].roles.super_admin) {
493
+ return;
494
+ }
495
+
496
+ let messageDate = socketData[1];
497
+ let messageId = socketData[2]
498
+ let type = socketData[3]
499
+
500
+ if (type === 'subscription') {
501
+ let subType = socketData[4];
502
+ let pub = socketData[5];
503
+
504
+ // Subscribe
505
+ if (subType === 'sub') {
506
+ this._subscriptionManager.subscribe(messageRoute, messageDate, ws, messageId, pub, socketData.slice(6));
507
+ }
508
+ // Unsubscribe
509
+ else {
510
+ this._subscriptionManager.unsubscribe(messageRoute, messageDate, ws, messageId, pub, socketData.slice(6));
511
+ }
512
+ }
513
+ else if (!this.publicProgram && type === 'offline') {
514
+ let serverRes: ServerResponseModel = {
515
+ messageId: messageId,
516
+ hasError: false,
517
+ data: 'ACK'
518
+ };
519
+
520
+ if (ws && ws.readyState === ws.OPEN) {
521
+ ws.send(JSON.stringify(serverRes), (error) => {
522
+ if (error) {
523
+ console.log('Error on WS: ', error);
524
+ if (this._subscriptionManager.getEnableDebug()) {
525
+ console.log(new Date(), 'Server App', 'Error WS Offline Ack Main');
526
+ }
527
+ this.unsubscribeWS(ws);
528
+ }
529
+ });
530
+ }
531
+
532
+ this._offlineUpdates.push(ws);
533
+ let offlineUpdates = socketData[4];
534
+
535
+ for (let i = 0; i < offlineUpdates.length; i++) {
536
+ let update = offlineUpdates[i];
537
+ let data = update.data;
538
+
539
+ let serverResMethod: ServerResponseModel = {
540
+ messageId: update.data[2],
541
+ hasError: false,
542
+ data: 'ACK'
543
+ };
544
+
545
+ if (ws && ws.readyState === ws.OPEN) {
546
+ ws.send(JSON.stringify(serverResMethod), (error) => {
547
+ if (error) {
548
+ console.log('Error on WS: ', error);
549
+ if (this._subscriptionManager.getEnableDebug()) {
550
+ console.log(new Date(), 'Server App', 'Error WS Offline Ack Each');
551
+ }
552
+ this.unsubscribeWS(ws);
553
+ }
554
+ });
555
+ }
556
+
557
+ let updateRoute = data.shift();
558
+ let updateDate = data.shift();
559
+ let updateMessageId = data.shift();
560
+ let updateType = data.shift();
561
+ let method = data.shift();
562
+ let methodLatencyId = objectIdHexString();
563
+
564
+ LogMethodLatencies.create({
565
+ _id: methodLatencyId,
566
+ __v: 0,
567
+ date_start: new Date(),
568
+ date_end: null,
569
+ latency_ms: 0,
570
+ method: method
571
+ });
572
+
573
+ if (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {
574
+ Logs.insertOne({
575
+ _id: objectIdHexString(),
576
+ type: 'client-request',
577
+ collection: '',
578
+ id_document: '',
579
+ payload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',
580
+ method: method,
581
+ id_user: ws['id_user'] || '',
582
+ user: ws['user'] || '',
583
+ messageId: messageId,
584
+ route: messageRoute
585
+ });
586
+ }
587
+
588
+ if (this._methodManager._methods[method]) {
589
+ try {
590
+ await this._methodManager.callMethodInternal.call(Object.assign({}, this._methodManager, {id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket']}), method, ...data);
591
+ }
592
+ catch (err) {
593
+ console.log(new Date(), 'Offline Error', JSON.stringify(err, null, 2));
594
+ }
595
+
596
+ if (method === 'updateDocumentOffline' || method === 'updateDocumentPropsOffline') {
597
+ ResolveIOServer.getMongoManager().invalidateQueryCache(data[0]);
598
+ }
599
+ }
600
+ else {
601
+ console.log('Offline - Could not find method: ' + method);
602
+ }
603
+ }
604
+
605
+ this._offlineUpdates.splice(this._offlineUpdates.map(a => a['id_socket']).indexOf(ws['id_socket']), 1);
606
+ }
607
+ else { //methods
608
+ this._msgQueue.splice(0, 0, {
609
+ ws: ws,
610
+ data: socketData
611
+ });
612
+ }
613
+ }
614
+ });
615
+
616
+ ws.on('close', () => {
617
+ this.unsubscribeWS(ws);
618
+ if (this._subscriptionManager.getEnableDebug()) {
619
+ console.log(new Date(), 'Server App', 'WS Close');
620
+ }
621
+ });
622
+
623
+ ws.on('error', error => {
624
+ console.log(new Date(), ws['user'], ws['id_socket'], 'WS Error');
625
+
626
+ this.unsubscribeWS(ws);
627
+ });
628
+ });
629
+
630
+ // Keep alive timer to ping/pong
631
+ setInterval(() => {
632
+ this._serverWSS.clients.forEach((ws: WebSocket) => {
633
+ if (ws['pingTime'] && Date.now() - ws['pingTime'].getTime() >= 20000) {
634
+ if (ws['isAlive'] === false) {
635
+ ws['retryCnt']++;
636
+
637
+ if (ws['retryCnt'] >= 3) {
638
+ this.unsubscribeWS(ws);
639
+ console.log(new Date(), ws['user'], ws['id_socket'], 'Ping Retry', ws['retryCnt'], ws['pingTime'], ws['pongTime']);
640
+ }
641
+ else {
642
+ ws['pingTime'] = new Date();
643
+ ws.ping(() => {});
644
+ }
645
+ }
646
+ else {
647
+ ws['retryCnt'] = 0;
648
+ ws['isAlive'] = false;
649
+ ws['pingTime'] = new Date();
650
+ ws.ping(() => {});
651
+ }
652
+ }
653
+ });
654
+ }, 20000);
655
+
656
+ setInterval(() => {
657
+ if (!this._msgQueueRunning) {
658
+ if (this._msgQueue.length) {
659
+ this._msgQueueRunning = true;
660
+ this._debugMsgQueue += 1;
661
+
662
+ let msg = this._msgQueue.pop();
663
+ let data = msg.data;
664
+ let ws = msg.ws;
665
+
666
+ let messageRoute: string = data.shift();
667
+ let messageDate: Date = data.shift();
668
+ let messageId: number = data.shift();
669
+ let type: string = data.shift();
670
+
671
+ // Method call
672
+ if (type === 'method') {
673
+ let method = data.shift();
674
+
675
+ if (ws['user_readonly']) {
676
+ return;
677
+ }
678
+
679
+ let methodLatencyId = objectIdHexString();
680
+
681
+ LogMethodLatencies.create({
682
+ _id: methodLatencyId,
683
+ __v: 0,
684
+ date_start: new Date(),
685
+ date_end: null,
686
+ latency_ms: 0,
687
+ method: method
688
+ });
689
+
690
+ if (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'getDrivers' && method !== 'processAirdropDistribution') {
691
+ Logs.insertOne({
692
+ _id: objectIdHexString(),
693
+ type: 'client-request',
694
+ collection: '',
695
+ id_document: '',
696
+ payload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',
697
+ method: method,
698
+ id_user: ws['id_user'] || '',
699
+ user: ws['user'] || '',
700
+ messageId: messageId,
701
+ route: messageRoute
702
+ });
703
+ }
704
+
705
+ let serverRes: ServerResponseModel = {
706
+ messageId: messageId,
707
+ hasError: false,
708
+ data: 'ACK'
709
+ };
710
+
711
+ if (ws && ws.readyState === ws.OPEN) {
712
+ ws.send(JSON.stringify(serverRes), (error) => {
713
+ if (error) {
714
+ console.log('Error on WS: ', error);
715
+ this.unsubscribeWS(ws);
716
+ }
717
+ });
718
+ }
719
+
720
+ if (this._methodManager._methods[method]) {
721
+ this._methodManager.callMethod(methodLatencyId, ws, messageDate, messageId, method, ...data);
722
+ }
723
+ else {
724
+ console.log('Could not find method: ' + method);
725
+ }
726
+ }
727
+ else if (type === 'methodResponse') {
728
+ let method = data.shift();
729
+
730
+ MethodResponses.findOne({$and: [
731
+ {id_user: ws['id_user']},
732
+ {message_id: messageId},
733
+ {method: method},
734
+ {date: messageDate}
735
+ ]}).then(res => {
736
+ if (res) {
737
+ if (ws && ws.readyState === ws.OPEN) {
738
+ ws.send(JSON.stringify(res.response), (error) => {
739
+ if (error) {
740
+ console.log('Error on WS: ', error);
741
+ this.unsubscribeWS(ws);
742
+ }
743
+ });
744
+ }
745
+ }
746
+ }, err => {});
747
+ }
748
+
749
+ this._msgQueueRunning = false;
750
+ }
751
+ }
752
+ }, 25);
753
+ }
754
+
755
+ public unsubscribeWS(ws: WebSocket) {
756
+ if (this._subscriptionManager.getEnableDebug()) {
757
+ console.log(new Date(), 'Server App', 'Unsub WS', ws['user'], ws['id_socket']);
758
+ }
759
+ this._subscriptionManager.unsubscribeAll(ws);
760
+ }
761
+
762
+ public getApp() {
763
+ return this._app;
764
+ }
765
+
766
+ public getServerConfig() {
767
+ return this._serverConfig;
768
+ }
769
+ }