@resolveio/server-lib 9.2.19 → 9.2.20

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 (221) hide show
  1. package/client-server-app.js +55 -1
  2. package/client-server-app.js.map +1 -1
  3. package/collections/app-status.collection.js +40 -1
  4. package/collections/app-status.collection.js.map +1 -1
  5. package/collections/app-version.collection.js +40 -1
  6. package/collections/app-version.collection.js.map +1 -1
  7. package/collections/counter.collection.js +43 -1
  8. package/collections/counter.collection.js.map +1 -1
  9. package/collections/cron-job-history.collection.js +71 -1
  10. package/collections/cron-job-history.collection.js.map +1 -1
  11. package/collections/cron-job.collection.js +74 -1
  12. package/collections/cron-job.collection.js.map +1 -1
  13. package/collections/email-history.collection.js +55 -1
  14. package/collections/email-history.collection.js.map +1 -1
  15. package/collections/email-verified.collection.js +50 -1
  16. package/collections/email-verified.collection.js.map +1 -1
  17. package/collections/file.collection.js +62 -1
  18. package/collections/file.collection.js.map +1 -1
  19. package/collections/flag.collection.js +44 -1
  20. package/collections/flag.collection.js.map +1 -1
  21. package/collections/log-method-latency.collection.js +53 -1
  22. package/collections/log-method-latency.collection.js.map +1 -1
  23. package/collections/log-subscription.collection.js +57 -1
  24. package/collections/log-subscription.collection.js.map +1 -1
  25. package/collections/log.collection.js +72 -1
  26. package/collections/log.collection.js.map +1 -1
  27. package/collections/logged-in-users.collection.js +58 -1
  28. package/collections/logged-in-users.collection.js.map +1 -1
  29. package/collections/method-call.collection.js +51 -1
  30. package/collections/method-call.collection.js.map +1 -1
  31. package/collections/method-response.collection.js +55 -1
  32. package/collections/method-response.collection.js.map +1 -1
  33. package/collections/monitor-cpu.collection.js +57 -1
  34. package/collections/monitor-cpu.collection.js.map +1 -1
  35. package/collections/monitor-https-inbound.collection.js +66 -1
  36. package/collections/monitor-https-inbound.collection.js.map +1 -1
  37. package/collections/monitor-https-outbound.collection.js +74 -1
  38. package/collections/monitor-https-outbound.collection.js.map +1 -1
  39. package/collections/monitor-memory.collection.js +68 -1
  40. package/collections/monitor-memory.collection.js.map +1 -1
  41. package/collections/monitor-mongo.collection.js +62 -1
  42. package/collections/monitor-mongo.collection.js.map +1 -1
  43. package/collections/notification.collection.js +40 -1
  44. package/collections/notification.collection.js.map +1 -1
  45. package/collections/report-builder-dashboard-builder.collection.js +93 -1
  46. package/collections/report-builder-dashboard-builder.collection.js.map +1 -1
  47. package/collections/report-builder-library.collection.js +76 -1
  48. package/collections/report-builder-library.collection.js.map +1 -1
  49. package/collections/report-builder-report.collection.js +138 -1
  50. package/collections/report-builder-report.collection.js.map +1 -1
  51. package/collections/user-group.collection.js +79 -1
  52. package/collections/user-group.collection.js.map +1 -1
  53. package/collections/user-guide.collection.js +46 -1
  54. package/collections/user-guide.collection.js.map +1 -1
  55. package/collections/user.collection.js +248 -1
  56. package/collections/user.collection.js.map +1 -1
  57. package/cron/cron.js +161 -1
  58. package/cron/cron.js.map +1 -1
  59. package/fixtures/cron-jobs.js +72 -1
  60. package/fixtures/cron-jobs.js.map +1 -1
  61. package/fixtures/init.js +62 -1
  62. package/fixtures/init.js.map +1 -1
  63. package/http/auth.js +697 -1
  64. package/http/auth.js.map +1 -1
  65. package/http/health.js +10 -1
  66. package/http/health.js.map +1 -1
  67. package/http/home.js +64 -1
  68. package/http/home.js.map +1 -1
  69. package/index.js +123 -1
  70. package/index.js.map +1 -1
  71. package/managers/cron.manager.js +205 -1
  72. package/managers/cron.manager.js.map +1 -1
  73. package/managers/method.manager.js +599 -1
  74. package/managers/method.manager.js.map +1 -1
  75. package/managers/mongo.manager.js +1682 -1
  76. package/managers/mongo.manager.js.map +1 -1
  77. package/managers/monitor.manager.js +334 -1
  78. package/managers/monitor.manager.js.map +1 -1
  79. package/managers/subscription.manager.js +867 -1
  80. package/managers/subscription.manager.js.map +1 -1
  81. package/managers/subscription.performance.js +100 -1
  82. package/managers/subscription.performance.js.map +1 -1
  83. package/methods/accounts.js +224 -1
  84. package/methods/accounts.js.map +1 -1
  85. package/methods/aws.js +449 -1
  86. package/methods/aws.js.map +1 -1
  87. package/methods/cloudconvert.js +214 -1
  88. package/methods/cloudconvert.js.map +1 -1
  89. package/methods/collections.js +526 -1
  90. package/methods/collections.js.map +1 -1
  91. package/methods/counters.js +121 -1
  92. package/methods/counters.js.map +1 -1
  93. package/methods/cron-jobs.js +1284 -1
  94. package/methods/cron-jobs.js.map +1 -1
  95. package/methods/flags.js +8 -1
  96. package/methods/flags.js.map +1 -1
  97. package/methods/logs.js +370 -1
  98. package/methods/logs.js.map +1 -1
  99. package/methods/monitor.js +384 -1
  100. package/methods/monitor.js.map +1 -1
  101. package/methods/pdf.js +685 -1
  102. package/methods/pdf.js.map +1 -1
  103. package/methods/report-builder.js +826 -1
  104. package/methods/report-builder.js.map +1 -1
  105. package/methods/support.js +263 -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/app-version.model.js +3 -1
  110. package/models/app-version.model.js.map +1 -1
  111. package/models/billing-logged-in-users.model.js +3 -1
  112. package/models/billing-logged-in-users.model.js.map +1 -1
  113. package/models/collection-document.model.js +3 -1
  114. package/models/collection-document.model.js.map +1 -1
  115. package/models/counter.model.js +3 -1
  116. package/models/counter.model.js.map +1 -1
  117. package/models/cron-job-history.model.js +3 -1
  118. package/models/cron-job-history.model.js.map +1 -1
  119. package/models/cron-job.model.js +3 -1
  120. package/models/cron-job.model.js.map +1 -1
  121. package/models/dialog.model.js +3 -1
  122. package/models/dialog.model.js.map +1 -1
  123. package/models/email-history.model.js +3 -1
  124. package/models/email-history.model.js.map +1 -1
  125. package/models/email-verified.model.js +3 -1
  126. package/models/email-verified.model.js.map +1 -1
  127. package/models/file.model.js +3 -1
  128. package/models/file.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-call.model.js +3 -1
  140. package/models/method-call.model.js.map +1 -1
  141. package/models/method-response.model.js +3 -1
  142. package/models/method-response.model.js.map +1 -1
  143. package/models/method.model.js +3 -1
  144. package/models/method.model.js.map +1 -1
  145. package/models/monitor-cpu.model.js +3 -1
  146. package/models/monitor-cpu.model.js.map +1 -1
  147. package/models/monitor-https-inbound.model.js +3 -1
  148. package/models/monitor-https-inbound.model.js.map +1 -1
  149. package/models/monitor-https-outbound.model.js +3 -1
  150. package/models/monitor-https-outbound.model.js.map +1 -1
  151. package/models/monitor-memory.model.js +3 -1
  152. package/models/monitor-memory.model.js.map +1 -1
  153. package/models/monitor-mongo.model.js +3 -1
  154. package/models/monitor-mongo.model.js.map +1 -1
  155. package/models/notification.model.js +3 -1
  156. package/models/notification.model.js.map +1 -1
  157. package/models/pagination.model.js +23 -1
  158. package/models/pagination.model.js.map +1 -1
  159. package/models/permission.model.js +3 -1
  160. package/models/permission.model.js.map +1 -1
  161. package/models/report-builder-dashboard-builder.model.js +3 -1
  162. package/models/report-builder-dashboard-builder.model.js.map +1 -1
  163. package/models/report-builder-library.model.js +3 -1
  164. package/models/report-builder-library.model.js.map +1 -1
  165. package/models/report-builder-report.model.js +3 -1
  166. package/models/report-builder-report.model.js.map +1 -1
  167. package/models/report-builder.model.js +3 -1
  168. package/models/report-builder.model.js.map +1 -1
  169. package/models/select-data-label.model.js +3 -1
  170. package/models/select-data-label.model.js.map +1 -1
  171. package/models/server-response.model.js +3 -1
  172. package/models/server-response.model.js.map +1 -1
  173. package/models/subscription.model.js +3 -1
  174. package/models/subscription.model.js.map +1 -1
  175. package/models/support-ticket.model.js +3 -1
  176. package/models/support-ticket.model.js.map +1 -1
  177. package/models/user-group.model.js +3 -1
  178. package/models/user-group.model.js.map +1 -1
  179. package/models/user-guide.model.js +3 -1
  180. package/models/user-guide.model.js.map +1 -1
  181. package/models/user.model.js +3 -1
  182. package/models/user.model.js.map +1 -1
  183. package/package.json +1 -2
  184. package/public_api.js +78 -1
  185. package/public_api.js.map +1 -1
  186. package/publications/app-status.js +16 -1
  187. package/publications/app-status.js.map +1 -1
  188. package/publications/app-version.js +16 -1
  189. package/publications/app-version.js.map +1 -1
  190. package/publications/cron-jobs.js +32 -1
  191. package/publications/cron-jobs.js.map +1 -1
  192. package/publications/files.js +36 -1
  193. package/publications/files.js.map +1 -1
  194. package/publications/flags.js +22 -1
  195. package/publications/flags.js.map +1 -1
  196. package/publications/logs.js +90 -1
  197. package/publications/logs.js.map +1 -1
  198. package/publications/method-calls.js +16 -1
  199. package/publications/method-calls.js.map +1 -1
  200. package/publications/method-responses.js +16 -1
  201. package/publications/method-responses.js.map +1 -1
  202. package/publications/notifications.js +16 -1
  203. package/publications/notifications.js.map +1 -1
  204. package/publications/report-builder-dashboard-builders.js +42 -1
  205. package/publications/report-builder-dashboard-builders.js.map +1 -1
  206. package/publications/report-builder-libraries.js +89 -1
  207. package/publications/report-builder-libraries.js.map +1 -1
  208. package/publications/report-builder-reports.js +50 -1
  209. package/publications/report-builder-reports.js.map +1 -1
  210. package/publications/super-admin.js +16 -1
  211. package/publications/super-admin.js.map +1 -1
  212. package/publications/user-groups.js +16 -1
  213. package/publications/user-groups.js.map +1 -1
  214. package/publications/user-guides.js +16 -1
  215. package/publications/user-guides.js.map +1 -1
  216. package/server-app.js +682 -1
  217. package/server-app.js.map +1 -1
  218. package/util/common.js +498 -1
  219. package/util/common.js.map +1 -1
  220. package/util/schema-report-builder.js +452 -1
  221. package/util/schema-report-builder.js.map +1 -1
@@ -1,2 +1,868 @@
1
- "use strict";var __awaiter=this&&this.__awaiter||function(e,i,t,n){return new(t||(t=Promise))((function(r,s){function fulfilled(e){try{step(n.next(e))}catch(e){s(e)}}function rejected(e){try{step(n.throw(e))}catch(e){s(e)}}function step(e){e.done?r(e.value):function adopt(e){return e instanceof t?e:new t((function(i){i(e)}))}(e.value).then(fulfilled,rejected)}step((n=n.apply(e,i||[])).next())}))},__generator=this&&this.__generator||function(e,i){var t,n,r,s,o={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return s={next:verb(0),throw:verb(1),return:verb(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function verb(s){return function(a){return function step(s){if(t)throw new TypeError("Generator is already executing.");for(;o;)try{if(t=1,n&&(r=2&s[0]?n.return:s[0]?n.throw||((r=n.return)&&r.call(n),0):n.next)&&!(r=r.call(n,s[1])).done)return r;switch(n=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,n=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(!(r=o.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){o=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]<r[3])){o.label=s[1];break}if(6===s[0]&&o.label<r[1]){o.label=r[1],r=s;break}if(r&&o.label<r[2]){o.label=r[2],o.ops.push(s);break}r[2]&&o.ops.pop(),o.trys.pop();continue}s=i.call(e,o)}catch(e){s=[6,e],n=0}finally{t=r=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,a])}}},__spreadArrays=this&&this.__spreadArrays||function(){for(var e=0,i=0,t=arguments.length;i<t;i++)e+=arguments[i].length;var n=Array(e),r=0;for(i=0;i<t;i++)for(var s=arguments[i],o=0,a=s.length;o<a;o++,r++)n[r]=s[o];return n};Object.defineProperty(exports,"__esModule",{value:!0}),exports.SubscriptionManager=void 0;var logs_1=require("../publications/logs"),app_status_1=require("../publications/app-status"),app_version_1=require("../publications/app-version"),files_1=require("../publications/files"),super_admin_1=require("../publications/super-admin"),logged_in_users_collection_1=require("../collections/logged-in-users.collection"),cron_jobs_1=require("../publications/cron-jobs"),flags_1=require("../publications/flags"),method_calls_1=require("../publications/method-calls"),method_responses_1=require("../publications/method-responses"),index_1=require("../index"),notifications_1=require("../publications/notifications"),report_builder_reports_1=require("../publications/report-builder-reports"),report_builder_libraries_1=require("../publications/report-builder-libraries"),user_groups_1=require("../publications/user-groups"),user_guides_1=require("../publications/user-guides"),report_builder_dashboard_builders_1=require("../publications/report-builder-dashboard-builders"),mongo_manager_1=require("./mongo.manager"),common_1=require("../util/common"),moment=require("moment"),NodeCache=require("node-cache"),SubscriptionManager=function(){function SubscriptionManager(e,i,t){var n=this;this._publications={},this._subscriptions=[],this._loggedInUsers=[],this._mongoQueue=[],this._mongoQueueId=0,this._sendQueue=[],this._runningQueue=!1,this._cacheId=1,this._mainServer=e,this._nodeCache=new NodeCache({stdTTL:0,checkperiod:0}),this.serverConfig=t,this._wss=i,super_admin_1.loadSuperAdminPublications(this),app_version_1.loadAppVersionPublications(this),app_status_1.loadAppStatusPublications(this),logs_1.loadLogPublications(this),files_1.loadFilePublications(this),cron_jobs_1.loadCronJobPublications(this),flags_1.loadFlagsPublications(this),method_calls_1.loadMethodCallsPublications(this),method_responses_1.loadMethodResponsePublications(this),notifications_1.loadNotificationPublications(this),report_builder_reports_1.loadReportBuilderReportPublications(this),report_builder_libraries_1.loadReportBuilderLibraryPublications(this),user_groups_1.loadUserGroupPublications(this),user_guides_1.loadUserGuidePublications(this),report_builder_dashboard_builders_1.loadReportBuilderDashboardBuilderPublications(this),this.tailOpLog(),setInterval((function(){return __awaiter(n,void 0,void 0,(function(){var e,i,t,n,r,s,o,a,c=this;return __generator(this,(function(u){if(!this._runningQueue&&this._sendQueue.length){for(this._runningQueue=!0,e=function(e){var t=i._mainServer.getWS(i._sendQueue[e].id_ws);if(t&&t.readyState===t.OPEN){if(t.bufferedAmount<20480){var n=i._sendQueue.pop();t.send(JSON.stringify(n.data),(function(e){e&&(console.log("Error on WS: ",e),c.unsubscribeAll(t))}))}}else i._sendQueue.splice(e,1)},i=this,n=this._sendQueue.length-1;n>=0;n--)e(n);this._runningQueue=!1}if((t=this._mongoQueue.filter((function(e){return!e.running}))).length)for(t.forEach((function(e){e.running=!0})),n=0;n<t.length;n++){if(r=t[n],this._publications[r.subscription.publication].ws_specific)for(s=0;s<r.subscription.clients.length;s++)o=r.subscription.clients[s],(a=this._mainServer.getWS(o.id_socket))&&a.id_socket===o.id_socket&&this.sendPubDataOnce(a,o.messageId,r.subscription,r.type,r.collection);else this.sendPubData(r.subscription,r.type,r.collection);r.run_again?(r.running=!1,r.run_again=!1):this._mongoQueue.splice(this._mongoQueue.map((function(e){return e._id})).indexOf(r._id),1)}return[2]}))}))}),10),setInterval((function(){return __awaiter(n,void 0,void 0,(function(){var e,i,t,n,r,s,o,a,c;return __generator(this,(function(u){switch(u.label){case 0:return e=this,[4,logged_in_users_collection_1.LoggedInUsers.find()];case 1:for(e._loggedInUsers=u.sent(),i=common_1.deepCopy(this._loggedInUsers),t=function(e){var t=i[e];(!t.date||moment().diff(moment(t.date),"seconds")>=60)&&(n._mainServer.getWS(t.id_ws)?n.unsubscribeAll(n._mainServer.getWS(t.id_ws)):(n._subscriptions.forEach((function(e){for(var i=e.clients.length-1;i>=0;i--){e.clients[i].id_socket===t.id_ws&&e.clients.splice(i,1)}})),logged_in_users_collection_1.LoggedInUsers.deleteOne({_id:t._id}),n._loggedInUsers.findIndex((function(e){return e._id===t._id}))>=0&&n._loggedInUsers.splice(n._loggedInUsers.findIndex((function(e){return e._id===t._id})),1)))},n=this,r=this._loggedInUsers.length-1;r>=0;r--)t(r);for(r=0;r<this._subscriptions.length;r++)for(s=this._subscriptions[r],o=function(e){var i=s.clients[e];a._loggedInUsers.some((function(e){return e.id_ws===i.id_socket}))||s.clients.splice(e,1)},a=this,c=s.clients.length-1;c>=0;c--)o(c);return[2]}}))}))}),6e4)}return SubscriptionManager.prototype.addToQueue=function(e){var i=this._mongoQueue.filter((function(i){return i.subscription.publication===e.subscription.publication&&JSON.stringify(i.subscription.subscriptionData)===JSON.stringify(e.subscription.subscriptionData)}))[0];i?i.running&&(i.run_again=!0):(e._id=this._mongoQueueId,this._mongoQueueId+=1,this._mongoQueue.push(e))},SubscriptionManager.prototype.invalidatePubsCache=function(e,i){for(var t=this._subscriptions.filter((function(i){return i.collections.includes(e)})),n=t.length-1;n>=0;n--){var r=t[n];r.cacheValid=!1,this.addToQueue({_id:0,type:i,collection:e,subscription:r,running:!1,run_again:!1})}index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(e)},SubscriptionManager.prototype.publications=function(e){this._publications=Object.assign(this._publications,e)},SubscriptionManager.prototype.loggedInLatency=function(e){return __awaiter(this,void 0,void 0,(function(){var i,t,n=this;return __generator(this,(function(r){return i=new Date,(t=this._loggedInUsers.filter((function(i){return i.id_ws===e.id_socket}))[0])&&(t.date=i),logged_in_users_collection_1.LoggedInUsers.findOneAndUpdate({id_ws:e.id_socket},{$set:{latency:e.latency,date:i}}).then((function(i){i||n.unsubscribeAll(e)}),(function(){n.unsubscribeAll(e)})),[2]}))}))},SubscriptionManager.prototype.subscribe=function(e,i,t,n){for(var r=[],s=4;s<arguments.length;s++)r[s-4]=arguments[s];return __awaiter(this,void 0,void 0,(function(){var e,s,o,a,c,u,l;return __generator(this,(function(d){if(!(e=this._publications[n]))return console.error("No Publication: "+n),[2];if(r.length>1||r[0]){if(!e.check)return console.error("No Check Function For Pub "+n),[2];if(!e.check._schema)return console.error("No Check Schema For Pub "+n),[2];for(s={},o=Object.keys(e.check._schema),a=o.filter((function(e){return!e.includes(".")})),c=0;c<r.length;c++)s[a[c]]=r[c];try{e.check.validate(s)}catch(e){if(e)return console.error("Error in Pub Check ("+n+")",e),[2]}}return(u=this._subscriptions.filter((function(e){return e.publication===n&&JSON.stringify(e.subscriptionData)===JSON.stringify(r)}))[0])?u.clients.some((function(e){return e.id_socket===i.id_socket&&e.messageId===t}))||u.clients.push({id_user:i.id_user,messageId:t,id_socket:i.id_socket}):this._subscriptions.push({publication:n,subscriptionData:r,collections:this.getPublicationCollections(n),clients:[{id_user:i.id_user,messageId:t,id_socket:i.id_socket}],cacheId:0,cacheValid:!1}),u||(u=this._subscriptions.filter((function(e){return e.publication===n&&JSON.stringify(e.subscriptionData)===JSON.stringify(r)}))[0]),u.cacheId||this._mongoQueue.some((function(e){return e.subscription.publication===u.publication&&JSON.stringify(e.subscription.subscriptionData)===JSON.stringify(u.subscriptionData)}))?u.cacheValid&&this.sendPubDataOnce(i,t,u,"newSub",n):this.addToQueue({_id:0,type:"newSub",collection:"",subscription:u,running:!1,run_again:!1}),"appversion"===n&&(l={_id:mongo_manager_1.objectIdHexString(),__v:0,date:new Date,id_user:i.id_user,user:i.user,id_ws:i.id_socket},this._loggedInUsers.push(l),logged_in_users_collection_1.LoggedInUsers.insertOne(l),"Admin"!==i.user&&"ResolveIO"!==this.serverConfig.CLIENT_NAME&&this._mainServer.getMethodManager().callMethodInternal("supportCreateBillingUser",{id_user:i.id_user,user:i.user,date:new Date,client:index_1.ResolveIOServer.getClientName()})),[2]}))}))},SubscriptionManager.prototype.unsubscribe=function(e,i,t,n){for(var r=[],s=4;s<arguments.length;s++)r[s-4]=arguments[s];return __awaiter(this,void 0,void 0,(function(){var e,s;return __generator(this,(function(o){if(!this._publications[n])return console.log("No Publication: "+n),[2];if(e=this._subscriptions.filter((function(e){return e.publication===n&&JSON.stringify(e.subscriptionData)===JSON.stringify(r)}))[0])for(s=e.clients.length-1;s>=0;s--)e.clients[s].id_user===i.id_user&&e.clients[s].messageId===t&&e.clients[s].id_socket===i.id_socket&&e.clients.splice(s,1);return[2]}))}))},SubscriptionManager.prototype.unsubscribeAll=function(e){return __awaiter(this,void 0,void 0,(function(){var i,t,n,r,s;return __generator(this,(function(o){switch(o.label){case 0:return e?[4,logged_in_users_collection_1.LoggedInUsers.findOne({id_ws:e.id_socket})]:[3,2];case 1:for((i=o.sent())&&(this._loggedInUsers.map((function(e){return e._id})).indexOf(i._id)>=0&&this._loggedInUsers.splice(this._loggedInUsers.map((function(e){return e._id})).indexOf(i._id),1),logged_in_users_collection_1.LoggedInUsers.deleteOne({_id:i._id})),t=this._subscriptions.filter((function(i){return i.clients.some((function(i){return i.id_user===e.id_user&&i.id_socket===e.id_socket}))})),n=t.length-1;n>=0;n--)for(r=t[n],s=r.clients.length-1;s>=0;s--)r.clients[s].id_socket===e.id_socket&&r.clients.splice(s,1);e.terminate(),o.label=2;case 2:return[2]}}))}))},SubscriptionManager.prototype.getPublicationCollections=function(e){return this._publications[e].collections},SubscriptionManager.prototype.tailOpLog=function(){var e=this;this._oplog=index_1.ResolveIOServer.getMainDB().watch(),this._oplog.on("change",(function(i){var t=i.ns.coll;!t||t.endsWith(".versions")||t.startsWith("monitor-")||"logs"===t||"log-method-latencies"===t||"log-subscriptions"===t||("insert"===i.operationType?("cron-jobs"===t?e._mainServer.getCronManager().checkCronJobsForUpdates():"support-tickets"===t&&"https://resolveio.com"===e.serverConfig.ROOT_URL&&(e._mainServer.getMethodManager().callMethodInternal("sendSupportTicketEmail",i.documentKey._id),e.invalidatePubsCache(t,"insert")),"method-responses"!==t&&"method-calls"!==t&&e.invalidatePubsCache(t,"insert")):"update"===i.operationType||"replace"===i.operationType?("cron-jobs"===t&&e._mainServer.getCronManager().checkCronJobsForUpdates(),"method-responses"!==t&&"method-calls"!==t&&e.invalidatePubsCache(t,"update")):"delete"===i.operationType&&("cron-jobs"===t&&e._mainServer.getCronManager().checkCronJobsForUpdates(),"method-responses"!==t&&"method-calls"!==t&&e.invalidatePubsCache(t,"delete")))})),this._oplog.on("error",(function(e){console.log("oplog error",e),process.exit()})),this._oplog.on("end",(function(){console.log("oplog ended"),process.exit()}))},SubscriptionManager.prototype.sendPubDataOnce=function(e,i,t,n,r){var s=this;return new Promise((function(n,r){return __awaiter(s,void 0,void 0,(function(){var s,o,a=this;return __generator(this,(function(c){return this._publications[t.publication].ws_specific?(o=this._publications[t.publication].function).call.apply(o,__spreadArrays([Object.assign({},this,SubscriptionManager.prototype),e.id_user],t.subscriptionData)).catch((function(e){a._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Error Detected - "+a.serverConfig.CLIENT_NAME,"Error Detected During Subscription "+t.publication+" - (sendPubDataOnce - WS)\n\nData \n"+JSON.stringify(t.subscriptionData,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2))})).then((function(t){var r={messageId:i,hasError:!1,data:t};a.sendWS(e,r),n(!0)}),(function(t){var n={messageId:i,hasError:!0,data:t};a.sendWS(e,n),r(t)})):t.cacheId&&t.cacheValid?(void 0===(s={messageId:i,hasError:!1,data:JSON.parse(this._nodeCache.get(t.cacheId),common_1.dateReviver)}).data&&(t.cacheId=0,t.cacheValid=!1,this._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Error Detected - "+this.serverConfig.CLIENT_NAME,"Error Detected During SendPubDataOnce - Invalid Cache! - "+t.publication+"\n\nData \n"+JSON.stringify(t.subscriptionData,null,2))),this.sendWS(e,s),n(!0)):(this._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Error Detected - "+this.serverConfig.CLIENT_NAME,"Error Detected During SendPubDataOnce - No Cache! - "+t.publication+"\n\nData \n"+JSON.stringify(t.subscriptionData,null,2)),n(!1)),[2]}))}))}))},SubscriptionManager.prototype.sendPubData=function(e,i,t){var n=this;return new Promise((function(r,s){return __awaiter(n,void 0,void 0,(function(){var n,o=this;return __generator(this,(function(a){return e.clients.length?("superadminAPM"!==e.publication&&"loggedInUsers"!==e.publication&&this._mainServer.getMethodManager().callMethodInternal("insertSubscriptionLog",i,e.publication,t,JSON.stringify(e.subscriptionData)),(n=this._publications[e.publication].function).call.apply(n,__spreadArrays([Object.assign({},this,SubscriptionManager.prototype)],e.subscriptionData)).catch((function(i){o._mainServer.getMethodManager().sendEmail("dev@resolveio.com","SERVER - Error Detected - "+o.serverConfig.CLIENT_NAME,"Error Detected During Subscription "+e.publication+" - (sendPubData)\n\nData \n"+JSON.stringify(e.subscriptionData,null,2)+"\n\nErrors\n"+JSON.stringify(i,null,2))})).then((function(i){if(e.clients.length){if(e.cacheId&&o._nodeCache.get(e.cacheId)===JSON.stringify(i))e.cacheValid=!0;else{e.clients.forEach((function(e){var t=o._mainServer.getWS(e.id_socket);if(t){var n={messageId:e.messageId,hasError:!1,data:i};o.sendWS(t,n)}}));var n=o._nodeCache.getStats().vsize;if(n>1e8){for(var s=0,a=o._subscriptions.filter((function(e){return e.cacheId})),c=0;c<a.length&&(o._nodeCache.del(a[c].cacheId),e.cacheId=0,e.cacheValid=!1,s+=1,!((n=o._nodeCache.getStats().vsize)<1e8));c++);console.log("Sub Cache: Too Big - "+e.publication+" - Deleted: "+s+" - "+n)}if(e.cacheId&&o._nodeCache.del(e.cacheId),"cron-jobs"!==t&&"logs"!==t&&"logged-in-users"!==t){var u=o._cacheId;o._cacheId+=1,o._nodeCache.set(u,JSON.stringify(i)),e.cacheId=u,e.cacheValid=!0}}r(!0)}else e.cacheId&&o._nodeCache.del(e.cacheId),o._subscriptions.splice(o._subscriptions.findIndex((function(i){return i.publication===e.publication&&JSON.stringify(i.subscriptionData)===JSON.stringify(e.subscriptionData)})),1),r(!1)}),(function(i){e.clients.forEach((function(e){var t=o._mainServer.getWS(e.id_socket);if(t&&t.id_socket===e.id_socket){var n={messageId:e.messageId,hasError:!0,data:i};o.sendWS(t,n)}})),s(i)}))):(e.cacheId&&this._nodeCache.del(e.cacheId),this._subscriptions.splice(this._subscriptions.findIndex((function(i){return i.publication===e.publication&&JSON.stringify(i.subscriptionData)===JSON.stringify(e.subscriptionData)})),1),r(!1)),[2]}))}))}))},SubscriptionManager.prototype.sendWS=function(e,i){this._sendQueue.splice(0,0,{id_ws:e.id_socket,data:i})},SubscriptionManager}();exports.SubscriptionManager=SubscriptionManager;
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 (_) 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 __spreadArrays = (this && this.__spreadArrays) || function () {
39
+ for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
40
+ for (var r = Array(s), k = 0, i = 0; i < il; i++)
41
+ for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
42
+ r[k] = a[j];
43
+ return r;
44
+ };
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.SubscriptionManager = void 0;
47
+ var logs_1 = require("../publications/logs");
48
+ var app_status_1 = require("../publications/app-status");
49
+ var app_version_1 = require("../publications/app-version");
50
+ var files_1 = require("../publications/files");
51
+ var super_admin_1 = require("../publications/super-admin");
52
+ var logged_in_users_collection_1 = require("../collections/logged-in-users.collection");
53
+ var cron_jobs_1 = require("../publications/cron-jobs");
54
+ var flags_1 = require("../publications/flags");
55
+ var method_calls_1 = require("../publications/method-calls");
56
+ var method_responses_1 = require("../publications/method-responses");
57
+ var index_1 = require("../index");
58
+ var notifications_1 = require("../publications/notifications");
59
+ var report_builder_reports_1 = require("../publications/report-builder-reports");
60
+ var report_builder_libraries_1 = require("../publications/report-builder-libraries");
61
+ var user_groups_1 = require("../publications/user-groups");
62
+ var user_guides_1 = require("../publications/user-guides");
63
+ var report_builder_dashboard_builders_1 = require("../publications/report-builder-dashboard-builders");
64
+ var mongo_manager_1 = require("./mongo.manager");
65
+ var common_1 = require("../util/common");
66
+ var moment = require("moment");
67
+ var NodeCache = require("node-cache");
68
+ // interface CurrentPerformanceMonitor {
69
+ // _id: number;
70
+ // function: string;
71
+ // publication: string;
72
+ // subscriptionData: any[];
73
+ // date_start: Date;
74
+ // date_end: Date;
75
+ // duration: number;
76
+ // result: string;
77
+ // }
78
+ var SubscriptionManager = /** @class */ (function () {
79
+ // private currentPerfomanceMonitor: CurrentPerformanceMonitor[] = [];
80
+ // private idPerformance: number = 0;
81
+ // private performanceThread;
82
+ function SubscriptionManager(mainServer, wss, serverConfig) {
83
+ var _this = this;
84
+ this._publications = {};
85
+ this._subscriptions = [];
86
+ this._loggedInUsers = [];
87
+ this._mongoQueue = [];
88
+ this._mongoQueueId = 0;
89
+ this._sendQueue = [];
90
+ this._runningQueue = false;
91
+ this._cacheId = 1;
92
+ this._mainServer = mainServer;
93
+ this._nodeCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });
94
+ // setTimeout(() => {
95
+ // console.log('Setting up performance thread');
96
+ // this.performanceThread = new Worker(path.join(__dirname, './subscription.performance.js'));
97
+ // this.performanceThread.on('exit', code => {
98
+ // console.error('THREAD EXITED!!!!!!!!!!!!!!!!!!', code);
99
+ // });
100
+ // this.performanceThread.on('error', code => {
101
+ // console.error('THREAD RECV ERROR !!!!!!!!!!!!!!!!!!', code);
102
+ // });
103
+ // }, 5000);
104
+ // setInterval(() => {
105
+ // console.log('Post thread msg');
106
+ // this.performanceThread.postMessage(this.currentPerfomanceMonitor);
107
+ // this.currentPerfomanceMonitor = [];
108
+ // }, 10000);
109
+ this.serverConfig = serverConfig;
110
+ this._wss = wss;
111
+ // Publications
112
+ super_admin_1.loadSuperAdminPublications(this);
113
+ app_version_1.loadAppVersionPublications(this);
114
+ app_status_1.loadAppStatusPublications(this);
115
+ logs_1.loadLogPublications(this);
116
+ files_1.loadFilePublications(this);
117
+ cron_jobs_1.loadCronJobPublications(this);
118
+ flags_1.loadFlagsPublications(this);
119
+ method_calls_1.loadMethodCallsPublications(this);
120
+ method_responses_1.loadMethodResponsePublications(this);
121
+ notifications_1.loadNotificationPublications(this);
122
+ report_builder_reports_1.loadReportBuilderReportPublications(this);
123
+ report_builder_libraries_1.loadReportBuilderLibraryPublications(this);
124
+ user_groups_1.loadUserGroupPublications(this);
125
+ user_guides_1.loadUserGuidePublications(this);
126
+ report_builder_dashboard_builders_1.loadReportBuilderDashboardBuilderPublications(this);
127
+ this.tailOpLog();
128
+ setInterval(function () { return __awaiter(_this, void 0, void 0, function () {
129
+ var _loop_1, this_1, i, queueArr, i, mongoQueue, j, client, ws;
130
+ var _this = this;
131
+ return __generator(this, function (_a) {
132
+ if (!this._runningQueue) {
133
+ if (this._sendQueue.length) {
134
+ // let startDate = new Date();
135
+ this._runningQueue = true;
136
+ _loop_1 = function (i) {
137
+ var ws = this_1._mainServer.getWS(this_1._sendQueue[i].id_ws);
138
+ if (ws && ws.readyState === ws.OPEN) {
139
+ if (ws.bufferedAmount < 20480) {
140
+ var sendItem = this_1._sendQueue.pop();
141
+ ws.send(JSON.stringify(sendItem.data), function (error) {
142
+ if (error) {
143
+ console.log('Error on WS: ', error);
144
+ _this.unsubscribeAll(ws);
145
+ }
146
+ });
147
+ }
148
+ }
149
+ else {
150
+ this_1._sendQueue.splice(i, 1);
151
+ }
152
+ };
153
+ this_1 = this;
154
+ for (i = this._sendQueue.length - 1; i >= 0; i--) {
155
+ _loop_1(i);
156
+ }
157
+ this._runningQueue = false;
158
+ // let endDate = new Date();
159
+ // this.currentPerfomanceMonitor.push({
160
+ // _id: this.idPerformance++,
161
+ // function: 'sendInterval',
162
+ // publication: '',
163
+ // subscriptionData: [],
164
+ // date_start: startDate,
165
+ // date_end: endDate,
166
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
167
+ // result: 'Done'
168
+ // });
169
+ }
170
+ }
171
+ queueArr = this._mongoQueue.filter(function (a) { return !a.running; });
172
+ if (queueArr.length) {
173
+ queueArr.forEach(function (entry) {
174
+ entry.running = true;
175
+ });
176
+ // let startDate = new Date();
177
+ for (i = 0; i < queueArr.length; i++) {
178
+ mongoQueue = queueArr[i];
179
+ if (this._publications[mongoQueue.subscription.publication].ws_specific) {
180
+ for (j = 0; j < mongoQueue.subscription.clients.length; j++) {
181
+ client = mongoQueue.subscription.clients[j];
182
+ ws = this._mainServer.getWS(client.id_socket);
183
+ if (ws && ws['id_socket'] === client.id_socket) {
184
+ this.sendPubDataOnce(ws, client.messageId, mongoQueue.subscription, mongoQueue.type, mongoQueue.collection);
185
+ }
186
+ }
187
+ }
188
+ else {
189
+ this.sendPubData(mongoQueue.subscription, mongoQueue.type, mongoQueue.collection);
190
+ }
191
+ if (mongoQueue.run_again) {
192
+ mongoQueue.running = false;
193
+ mongoQueue.run_again = false;
194
+ }
195
+ else {
196
+ this._mongoQueue.splice(this._mongoQueue.map(function (a) { return a._id; }).indexOf(mongoQueue._id), 1);
197
+ }
198
+ }
199
+ // let endDate = new Date();
200
+ // this.currentPerfomanceMonitor.push({
201
+ // _id: this.idPerformance++,
202
+ // function: 'mongoQueue',
203
+ // publication: '',
204
+ // subscriptionData: queueArr,
205
+ // date_start: startDate,
206
+ // date_end: endDate,
207
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
208
+ // result: 'Done'
209
+ // });
210
+ }
211
+ return [2 /*return*/];
212
+ });
213
+ }); }, 10);
214
+ setInterval(function () { return __awaiter(_this, void 0, void 0, function () {
215
+ var _a, userCopy, _loop_2, this_2, i, i, sub, _loop_3, this_3, j;
216
+ return __generator(this, function (_b) {
217
+ switch (_b.label) {
218
+ case 0:
219
+ _a = this;
220
+ return [4 /*yield*/, logged_in_users_collection_1.LoggedInUsers.find()];
221
+ case 1:
222
+ _a._loggedInUsers = _b.sent();
223
+ userCopy = common_1.deepCopy(this._loggedInUsers);
224
+ _loop_2 = function (i) {
225
+ var loggedInUser = userCopy[i];
226
+ if (!loggedInUser.date || moment().diff(moment(loggedInUser.date), 'seconds') >= 60) {
227
+ if (this_2._mainServer.getWS(loggedInUser.id_ws)) {
228
+ this_2.unsubscribeAll(this_2._mainServer.getWS(loggedInUser.id_ws));
229
+ }
230
+ else {
231
+ this_2._subscriptions.forEach(function (sub) {
232
+ for (var j = sub.clients.length - 1; j >= 0; j--) {
233
+ var client = sub.clients[j];
234
+ if (client.id_socket === loggedInUser.id_ws) {
235
+ sub.clients.splice(j, 1);
236
+ }
237
+ }
238
+ });
239
+ logged_in_users_collection_1.LoggedInUsers.deleteOne({ _id: loggedInUser._id });
240
+ if (this_2._loggedInUsers.findIndex(function (a) { return a._id === loggedInUser._id; }) >= 0) {
241
+ this_2._loggedInUsers.splice(this_2._loggedInUsers.findIndex(function (a) { return a._id === loggedInUser._id; }), 1);
242
+ }
243
+ }
244
+ }
245
+ };
246
+ this_2 = this;
247
+ for (i = this._loggedInUsers.length - 1; i >= 0; i--) {
248
+ _loop_2(i);
249
+ }
250
+ for (i = 0; i < this._subscriptions.length; i++) {
251
+ sub = this._subscriptions[i];
252
+ _loop_3 = function (j) {
253
+ var client = sub.clients[j];
254
+ if (!this_3._loggedInUsers.some(function (a) { return a.id_ws === client.id_socket; })) {
255
+ sub.clients.splice(j, 1);
256
+ }
257
+ };
258
+ this_3 = this;
259
+ for (j = sub.clients.length - 1; j >= 0; j--) {
260
+ _loop_3(j);
261
+ }
262
+ }
263
+ return [2 /*return*/];
264
+ }
265
+ });
266
+ }); }, 60000);
267
+ }
268
+ SubscriptionManager.prototype.addToQueue = function (mongoQueue) {
269
+ // let startDate = new Date();
270
+ var _mongoQueue = this._mongoQueue.filter(function (a) { return a.subscription.publication === mongoQueue.subscription.publication && JSON.stringify(a.subscription.subscriptionData) === JSON.stringify(mongoQueue.subscription.subscriptionData); })[0];
271
+ if (_mongoQueue) {
272
+ if (_mongoQueue.running) {
273
+ _mongoQueue.run_again = true;
274
+ // let endDate = new Date();
275
+ // this.currentPerfomanceMonitor.push({
276
+ // _id: this.idPerformance++,
277
+ // function: 'addToQueue',
278
+ // publication: mongoQueue.subscription.publication,
279
+ // subscriptionData: mongoQueue.subscription.subscriptionData,
280
+ // date_start: startDate,
281
+ // date_end: endDate,
282
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
283
+ // result: 'Run Again'
284
+ // });
285
+ }
286
+ // else {
287
+ // let endDate = new Date();
288
+ // this.currentPerfomanceMonitor.push({
289
+ // _id: this.idPerformance++,
290
+ // function: 'addToQueue',
291
+ // publication: mongoQueue.subscription.publication,
292
+ // subscriptionData: mongoQueue.subscription.subscriptionData,
293
+ // date_start: startDate,
294
+ // date_end: endDate,
295
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
296
+ // result: 'Not Running Yet'
297
+ // });
298
+ // }
299
+ }
300
+ else {
301
+ mongoQueue._id = this._mongoQueueId;
302
+ this._mongoQueueId += 1;
303
+ this._mongoQueue.push(mongoQueue);
304
+ // let endDate = new Date();
305
+ // this.currentPerfomanceMonitor.push({
306
+ // _id: this.idPerformance++,
307
+ // function: 'addToQueue',
308
+ // publication: mongoQueue.subscription.publication,
309
+ // subscriptionData: mongoQueue.subscription.subscriptionData,
310
+ // date_start: startDate,
311
+ // date_end: endDate,
312
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
313
+ // result: 'Add to Queue'
314
+ // });
315
+ }
316
+ };
317
+ SubscriptionManager.prototype.invalidatePubsCache = function (collection, type) {
318
+ // let startDate = new Date();
319
+ var collSubs = this._subscriptions.filter(function (a) { return a.collections.includes(collection); });
320
+ for (var i = collSubs.length - 1; i >= 0; i--) {
321
+ var sub = collSubs[i];
322
+ sub.cacheValid = false;
323
+ this.addToQueue({
324
+ _id: 0,
325
+ type: type,
326
+ collection: collection,
327
+ subscription: sub,
328
+ running: false,
329
+ run_again: false
330
+ });
331
+ }
332
+ index_1.ResolveIOServer.getMongoManager().invalidateQueryCache(collection);
333
+ // let endDate = new Date();
334
+ // this.currentPerfomanceMonitor.push({
335
+ // _id: this.idPerformance++,
336
+ // function: 'invalidatePubsCache',
337
+ // publication: collection,
338
+ // subscriptionData: [],
339
+ // date_start: startDate,
340
+ // date_end: endDate,
341
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
342
+ // result: 'Done'
343
+ // });
344
+ };
345
+ // Add all files to publications private object
346
+ SubscriptionManager.prototype.publications = function (method) {
347
+ this._publications = Object.assign(this._publications, method);
348
+ };
349
+ SubscriptionManager.prototype.loggedInLatency = function (ws) {
350
+ return __awaiter(this, void 0, void 0, function () {
351
+ var date, loggedInUser;
352
+ var _this = this;
353
+ return __generator(this, function (_a) {
354
+ date = new Date();
355
+ loggedInUser = this._loggedInUsers.filter(function (a) { return a.id_ws === ws['id_socket']; })[0];
356
+ if (loggedInUser) {
357
+ loggedInUser.date = date;
358
+ }
359
+ logged_in_users_collection_1.LoggedInUsers.findOneAndUpdate({ id_ws: ws['id_socket'] }, { $set: { latency: ws['latency'], date: date } }).then(function (res) {
360
+ if (!res) {
361
+ _this.unsubscribeAll(ws);
362
+ }
363
+ }, function () {
364
+ _this.unsubscribeAll(ws);
365
+ });
366
+ return [2 /*return*/];
367
+ });
368
+ });
369
+ };
370
+ // Subscribe to publication
371
+ SubscriptionManager.prototype.subscribe = function (messageDate, ws, messageId, publication) {
372
+ var subscriptionData = [];
373
+ for (var _i = 4; _i < arguments.length; _i++) {
374
+ subscriptionData[_i - 4] = arguments[_i];
375
+ }
376
+ return __awaiter(this, void 0, void 0, function () {
377
+ var pub, valObj, valKeys, rootKeys, i, sub_1, newLoggedInUser;
378
+ return __generator(this, function (_a) {
379
+ pub = this._publications[publication];
380
+ if (!pub) {
381
+ console.error('No Publication: ' + publication);
382
+ return [2 /*return*/];
383
+ }
384
+ else {
385
+ if (subscriptionData.length > 1 || subscriptionData[0]) {
386
+ if (!pub.check) {
387
+ console.error('No Check Function For Pub ' + publication);
388
+ return [2 /*return*/];
389
+ }
390
+ else if (!pub.check._schema) {
391
+ console.error('No Check Schema For Pub ' + publication);
392
+ return [2 /*return*/];
393
+ }
394
+ else {
395
+ valObj = {};
396
+ valKeys = Object.keys(pub.check._schema);
397
+ rootKeys = valKeys.filter(function (a) { return !a.includes('.'); });
398
+ for (i = 0; i < subscriptionData.length; i++) {
399
+ valObj[rootKeys[i]] = subscriptionData[i];
400
+ }
401
+ try {
402
+ pub.check.validate(valObj);
403
+ }
404
+ catch (errors) {
405
+ if (errors) {
406
+ console.error('Error in Pub Check (' + publication + ')', errors);
407
+ return [2 /*return*/];
408
+ }
409
+ }
410
+ }
411
+ }
412
+ sub_1 = this._subscriptions.filter(function (a) { return a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData); })[0];
413
+ // If sub found (another user watching same data), add client to same sub
414
+ if (sub_1) {
415
+ if (!sub_1.clients.some(function (a) { return a.id_socket === ws['id_socket'] && a.messageId === messageId; })) {
416
+ sub_1.clients.push({
417
+ id_user: ws['id_user'],
418
+ messageId: messageId,
419
+ id_socket: ws['id_socket']
420
+ });
421
+ }
422
+ }
423
+ // If sub not found, create new sub
424
+ else {
425
+ this._subscriptions.push({
426
+ publication: publication,
427
+ subscriptionData: subscriptionData,
428
+ collections: this.getPublicationCollections(publication),
429
+ clients: [{
430
+ id_user: ws['id_user'],
431
+ messageId: messageId,
432
+ id_socket: ws['id_socket']
433
+ }],
434
+ cacheId: 0,
435
+ cacheValid: false
436
+ });
437
+ }
438
+ if (!sub_1) {
439
+ sub_1 = this._subscriptions.filter(function (a) { return a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData); })[0];
440
+ }
441
+ if (!sub_1.cacheId && !this._mongoQueue.some(function (a) { return a.subscription.publication === sub_1.publication && JSON.stringify(a.subscription.subscriptionData) === JSON.stringify(sub_1.subscriptionData); })) {
442
+ this.addToQueue({
443
+ _id: 0,
444
+ type: 'newSub',
445
+ collection: '',
446
+ subscription: sub_1,
447
+ running: false,
448
+ run_again: false
449
+ });
450
+ // let endDate = new Date();
451
+ // this.currentPerfomanceMonitor.push({
452
+ // _id: this.idPerformance++,
453
+ // function: 'subscribe',
454
+ // publication: publication,
455
+ // subscriptionData: subscriptionData,
456
+ // date_start: startDate,
457
+ // date_end: endDate,
458
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
459
+ // result: 'Add to Queue'
460
+ // });
461
+ }
462
+ else if (sub_1.cacheValid) {
463
+ this.sendPubDataOnce(ws, messageId, sub_1, 'newSub', publication);
464
+ // let endDate = new Date();
465
+ // this.currentPerfomanceMonitor.push({
466
+ // _id: this.idPerformance++,
467
+ // function: 'subscribe',
468
+ // publication: publication,
469
+ // subscriptionData: subscriptionData,
470
+ // date_start: startDate,
471
+ // date_end: endDate,
472
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
473
+ // result: 'Send Pub Data Once'
474
+ // });
475
+ }
476
+ }
477
+ if (publication === 'appversion') {
478
+ newLoggedInUser = {
479
+ _id: mongo_manager_1.objectIdHexString(),
480
+ __v: 0,
481
+ date: new Date(),
482
+ id_user: ws['id_user'],
483
+ user: ws['user'],
484
+ id_ws: ws['id_socket']
485
+ };
486
+ this._loggedInUsers.push(newLoggedInUser);
487
+ logged_in_users_collection_1.LoggedInUsers.insertOne(newLoggedInUser);
488
+ if (ws['user'] !== 'Admin' && this.serverConfig['CLIENT_NAME'] !== 'ResolveIO') {
489
+ this._mainServer.getMethodManager().callMethodInternal('supportCreateBillingUser', {
490
+ id_user: ws['id_user'],
491
+ user: ws['user'],
492
+ date: new Date(),
493
+ client: index_1.ResolveIOServer.getClientName()
494
+ });
495
+ }
496
+ }
497
+ return [2 /*return*/];
498
+ });
499
+ });
500
+ };
501
+ // Unsubscribe from publication
502
+ SubscriptionManager.prototype.unsubscribe = function (messageDate, ws, messageId, publication) {
503
+ var subscriptionData = [];
504
+ for (var _i = 4; _i < arguments.length; _i++) {
505
+ subscriptionData[_i - 4] = arguments[_i];
506
+ }
507
+ return __awaiter(this, void 0, void 0, function () {
508
+ var sub, i;
509
+ return __generator(this, function (_a) {
510
+ // let startDate = new Date();
511
+ // console.log('Before');
512
+ // console.dir(this._subscriptions.map(a => a.publication));
513
+ if (!this._publications[publication]) {
514
+ console.log('No Publication: ' + publication);
515
+ return [2 /*return*/];
516
+ }
517
+ else {
518
+ sub = this._subscriptions.filter(function (a) { return a.publication === publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscriptionData); })[0];
519
+ if (sub) {
520
+ for (i = sub.clients.length - 1; i >= 0; i--) {
521
+ if (sub.clients[i].id_user === ws['id_user'] && sub.clients[i].messageId === messageId && sub.clients[i].id_socket === ws['id_socket']) {
522
+ sub.clients.splice(i, 1);
523
+ }
524
+ }
525
+ }
526
+ }
527
+ return [2 /*return*/];
528
+ });
529
+ });
530
+ };
531
+ // Unsubscribe from publication
532
+ SubscriptionManager.prototype.unsubscribeAll = function (ws) {
533
+ return __awaiter(this, void 0, void 0, function () {
534
+ var loggedInUser, userSubs, i, sub, j;
535
+ return __generator(this, function (_a) {
536
+ switch (_a.label) {
537
+ case 0:
538
+ if (!ws) return [3 /*break*/, 2];
539
+ return [4 /*yield*/, logged_in_users_collection_1.LoggedInUsers.findOne({ id_ws: ws['id_socket'] })];
540
+ case 1:
541
+ loggedInUser = _a.sent();
542
+ if (loggedInUser) {
543
+ if (this._loggedInUsers.map(function (a) { return a._id; }).indexOf(loggedInUser._id) >= 0) {
544
+ this._loggedInUsers.splice(this._loggedInUsers.map(function (a) { return a._id; }).indexOf(loggedInUser._id), 1);
545
+ }
546
+ logged_in_users_collection_1.LoggedInUsers.deleteOne({ _id: loggedInUser._id });
547
+ }
548
+ userSubs = this._subscriptions.filter(function (a) { return a.clients.some(function (b) { return b.id_user === ws['id_user'] && b.id_socket === ws['id_socket']; }); });
549
+ for (i = userSubs.length - 1; i >= 0; i--) {
550
+ sub = userSubs[i];
551
+ for (j = sub.clients.length - 1; j >= 0; j--) {
552
+ if (sub.clients[j].id_socket === ws['id_socket']) {
553
+ sub.clients.splice(j, 1);
554
+ }
555
+ }
556
+ }
557
+ ws.terminate();
558
+ _a.label = 2;
559
+ case 2: return [2 /*return*/];
560
+ }
561
+ });
562
+ });
563
+ };
564
+ // Get publication collection
565
+ SubscriptionManager.prototype.getPublicationCollections = function (publication) {
566
+ return this._publications[publication].collections;
567
+ };
568
+ // Watch (tail) Mongo's operation log on the entire database (all insert/modify/delete will trigger this function)
569
+ SubscriptionManager.prototype.tailOpLog = function () {
570
+ var _this = this;
571
+ this._oplog = index_1.ResolveIOServer.getMainDB().watch();
572
+ this._oplog.on('change', function (doc) {
573
+ // let startDate = new Date();
574
+ var collection = doc.ns.coll;
575
+ if (collection && !collection.endsWith('.versions') && !collection.startsWith('monitor-') && collection !== 'logs' && collection !== 'log-method-latencies' && collection !== 'log-subscriptions') {
576
+ if (doc.operationType === 'insert') {
577
+ if (collection === 'cron-jobs') {
578
+ _this._mainServer.getCronManager().checkCronJobsForUpdates();
579
+ }
580
+ else if (collection === 'support-tickets') {
581
+ if (_this.serverConfig['ROOT_URL'] === 'https://resolveio.com') {
582
+ _this._mainServer.getMethodManager().callMethodInternal('sendSupportTicketEmail', doc.documentKey._id);
583
+ _this.invalidatePubsCache(collection, 'insert');
584
+ }
585
+ }
586
+ if (collection !== 'method-responses' && collection !== 'method-calls') {
587
+ _this.invalidatePubsCache(collection, 'insert');
588
+ }
589
+ // let endDate = new Date();
590
+ // this.currentPerfomanceMonitor.push({
591
+ // _id: this.idPerformance++,
592
+ // function: 'oplog',
593
+ // publication: collection,
594
+ // subscriptionData: [doc.documentKey._id],
595
+ // date_start: startDate,
596
+ // date_end: endDate,
597
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
598
+ // result: 'Insert'
599
+ // });
600
+ }
601
+ else if (doc.operationType === 'update' || doc.operationType === 'replace') {
602
+ if (collection === 'cron-jobs') {
603
+ _this._mainServer.getCronManager().checkCronJobsForUpdates();
604
+ }
605
+ if (collection !== 'method-responses' && collection !== 'method-calls') {
606
+ _this.invalidatePubsCache(collection, 'update');
607
+ }
608
+ // let endDate = new Date();
609
+ // this.currentPerfomanceMonitor.push({
610
+ // _id: this.idPerformance++,
611
+ // function: 'oplog',
612
+ // publication: collection,
613
+ // subscriptionData: [doc.documentKey._id],
614
+ // date_start: startDate,
615
+ // date_end: endDate,
616
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
617
+ // result: 'Update'
618
+ // });
619
+ }
620
+ else if (doc.operationType === 'delete') {
621
+ if (collection === 'cron-jobs') {
622
+ _this._mainServer.getCronManager().checkCronJobsForUpdates();
623
+ }
624
+ if (collection !== 'method-responses' && collection !== 'method-calls') {
625
+ _this.invalidatePubsCache(collection, 'delete');
626
+ }
627
+ // let endDate = new Date();
628
+ // this.currentPerfomanceMonitor.push({
629
+ // _id: this.idPerformance++,
630
+ // function: 'oplog',
631
+ // publication: collection,
632
+ // subscriptionData: [doc.documentKey._id],
633
+ // date_start: startDate,
634
+ // date_end: endDate,
635
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
636
+ // result: 'Delete'
637
+ // });
638
+ }
639
+ }
640
+ });
641
+ this._oplog.on('error', function (error) {
642
+ console.log('oplog error', error);
643
+ process.exit();
644
+ });
645
+ this._oplog.on('end', function () {
646
+ console.log('oplog ended');
647
+ process.exit();
648
+ });
649
+ };
650
+ // Fetch pub once, send to all clients linked to this pub
651
+ SubscriptionManager.prototype.sendPubDataOnce = function (ws, messageId, subscription, type, collection) {
652
+ var _this = this;
653
+ return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
654
+ var serverRes;
655
+ var _a;
656
+ var _this = this;
657
+ return __generator(this, function (_b) {
658
+ // let startDate = new Date();
659
+ if (!this._publications[subscription.publication].ws_specific) { // Same pub for all users
660
+ if (subscription.cacheId && subscription.cacheValid) {
661
+ serverRes = {
662
+ messageId: messageId,
663
+ hasError: false,
664
+ data: JSON.parse(this._nodeCache.get(subscription.cacheId), common_1.dateReviver)
665
+ };
666
+ if (serverRes.data === undefined) {
667
+ subscription.cacheId = 0;
668
+ subscription.cacheValid = false;
669
+ this._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During SendPubDataOnce - Invalid Cache! - ' + subscription.publication + '\n\nData \n' + JSON.stringify(subscription.subscriptionData, null, 2));
670
+ }
671
+ this.sendWS(ws, serverRes);
672
+ // let endDate = new Date();
673
+ // this.currentPerfomanceMonitor.push({
674
+ // _id: this.idPerformance++,
675
+ // function: 'sendPubDataOnce',
676
+ // publication: subscription.publication,
677
+ // subscriptionData: subscription.subscriptionData,
678
+ // date_start: startDate,
679
+ // date_end: endDate,
680
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
681
+ // result: 'Send cache'
682
+ // });
683
+ resolve(true);
684
+ }
685
+ else {
686
+ this._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + this.serverConfig['CLIENT_NAME'], 'Error Detected During SendPubDataOnce - No Cache! - ' + subscription.publication + '\n\nData \n' + JSON.stringify(subscription.subscriptionData, null, 2));
687
+ resolve(false);
688
+ }
689
+ }
690
+ else { // Pub is different for each user (Look at users publication) [MUCH SLOWER, RE-RUNS FOR EACH USER]
691
+ (_a = this._publications[subscription.publication].function).call.apply(_a, __spreadArrays([Object.assign({}, this, SubscriptionManager.prototype), ws['id_user']], subscription.subscriptionData)).catch(function (methodErrs) {
692
+ _this._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + _this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + subscription.publication + ' - (sendPubDataOnce - WS)\n\nData \n' + JSON.stringify(subscription.subscriptionData, null, 2) + '\n\nErrors\n' + JSON.stringify(methodErrs, null, 2));
693
+ })
694
+ .then(function (res) {
695
+ var serverRes = {
696
+ messageId: messageId,
697
+ hasError: false,
698
+ data: res
699
+ };
700
+ // console.log('Send Pub Data Once 2', new Date(), 'Success', subscription);
701
+ _this.sendWS(ws, serverRes);
702
+ // let endDate = new Date();
703
+ // this.currentPerfomanceMonitor.push({
704
+ // _id: this.idPerformance++,
705
+ // function: 'sendPubDataOnce',
706
+ // publication: subscription.publication,
707
+ // subscriptionData: subscription.subscriptionData,
708
+ // date_start: startDate,
709
+ // date_end: endDate,
710
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
711
+ // result: 'Send ws spec data'
712
+ // });
713
+ resolve(true);
714
+ }, function (err) {
715
+ var serverRes = {
716
+ messageId: messageId,
717
+ hasError: true,
718
+ data: err
719
+ };
720
+ // console.log('Send Pub Data Once 2', new Date(), 'Error', subscription);
721
+ _this.sendWS(ws, serverRes);
722
+ reject(err);
723
+ });
724
+ }
725
+ return [2 /*return*/];
726
+ });
727
+ }); });
728
+ };
729
+ // Fetch pub once, send to all clients linked to this pub
730
+ SubscriptionManager.prototype.sendPubData = function (subscription, type, collection) {
731
+ var _this = this;
732
+ return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
733
+ var _a;
734
+ var _this = this;
735
+ return __generator(this, function (_b) {
736
+ // let startDate = new Date();
737
+ if (!subscription.clients.length) {
738
+ if (subscription.cacheId) {
739
+ this._nodeCache.del(subscription.cacheId);
740
+ }
741
+ this._subscriptions.splice(this._subscriptions.findIndex(function (a) { return a.publication === subscription.publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscription.subscriptionData); }), 1);
742
+ resolve(false);
743
+ }
744
+ else {
745
+ if (subscription.publication !== 'superadminAPM' && subscription.publication !== 'loggedInUsers') {
746
+ this._mainServer.getMethodManager().callMethodInternal('insertSubscriptionLog', type, subscription.publication, collection, JSON.stringify(subscription.subscriptionData));
747
+ }
748
+ (_a = this._publications[subscription.publication].function).call.apply(_a, __spreadArrays([Object.assign({}, this, SubscriptionManager.prototype)], subscription.subscriptionData)).catch(function (methodErrs) {
749
+ _this._mainServer.getMethodManager().sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + _this.serverConfig['CLIENT_NAME'], 'Error Detected During Subscription ' + subscription.publication + ' - (sendPubData)\n\nData \n' + JSON.stringify(subscription.subscriptionData, null, 2) + '\n\nErrors\n' + JSON.stringify(methodErrs, null, 2));
750
+ })
751
+ .then(function (res) {
752
+ if (!subscription.clients.length) {
753
+ if (subscription.cacheId) {
754
+ _this._nodeCache.del(subscription.cacheId);
755
+ }
756
+ _this._subscriptions.splice(_this._subscriptions.findIndex(function (a) { return a.publication === subscription.publication && JSON.stringify(a.subscriptionData) === JSON.stringify(subscription.subscriptionData); }), 1);
757
+ // let endDate = new Date();
758
+ // this.currentPerfomanceMonitor.push({
759
+ // _id: this.idPerformance++,
760
+ // function: 'sendPubData',
761
+ // publication: subscription.publication,
762
+ // subscriptionData: subscription.subscriptionData,
763
+ // date_start: startDate,
764
+ // date_end: endDate,
765
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
766
+ // result: 'No clients'
767
+ // });
768
+ resolve(false);
769
+ }
770
+ else {
771
+ if (subscription.cacheId && _this._nodeCache.get(subscription.cacheId) === JSON.stringify(res)) {
772
+ subscription.cacheValid = true;
773
+ // let endDate = new Date();
774
+ // this.currentPerfomanceMonitor.push({
775
+ // _id: this.idPerformance++,
776
+ // function: 'sendPubData',
777
+ // publication: subscription.publication,
778
+ // subscriptionData: subscription.subscriptionData,
779
+ // date_start: startDate,
780
+ // date_end: endDate,
781
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
782
+ // result: 'Same cache dont send'
783
+ // });
784
+ }
785
+ else {
786
+ subscription.clients.forEach(function (client) {
787
+ var ws = _this._mainServer.getWS(client.id_socket);
788
+ if (ws) {
789
+ var serverRes = {
790
+ messageId: client.messageId,
791
+ hasError: false,
792
+ data: res
793
+ };
794
+ _this.sendWS(ws, serverRes);
795
+ }
796
+ });
797
+ var nodeCacheSize = _this._nodeCache.getStats().vsize;
798
+ if (nodeCacheSize > 100000000) {
799
+ var deleteCount = 0;
800
+ var subArr = _this._subscriptions.filter(function (a) { return a.cacheId; });
801
+ for (var zz = 0; zz < subArr.length; zz++) {
802
+ _this._nodeCache.del(subArr[zz].cacheId);
803
+ subscription.cacheId = 0;
804
+ subscription.cacheValid = false;
805
+ deleteCount += 1;
806
+ nodeCacheSize = _this._nodeCache.getStats().vsize;
807
+ if (nodeCacheSize < 100000000) {
808
+ break;
809
+ }
810
+ }
811
+ console.log('Sub Cache: ' + 'Too Big - ' + subscription.publication + ' - Deleted: ' + deleteCount + ' - ' + nodeCacheSize);
812
+ }
813
+ if (subscription.cacheId) {
814
+ _this._nodeCache.del(subscription.cacheId);
815
+ }
816
+ if (collection !== 'cron-jobs' && collection !== 'logs' && collection !== 'logged-in-users') {
817
+ var cacheId = _this._cacheId;
818
+ _this._cacheId += 1;
819
+ _this._nodeCache.set(cacheId, JSON.stringify(res));
820
+ subscription.cacheId = cacheId;
821
+ subscription.cacheValid = true;
822
+ }
823
+ // let endDate = new Date();
824
+ // this.currentPerfomanceMonitor.push({
825
+ // _id: this.idPerformance++,
826
+ // function: 'sendPubData',
827
+ // publication: subscription.publication,
828
+ // subscriptionData: subscription.subscriptionData,
829
+ // date_start: startDate,
830
+ // date_end: endDate,
831
+ // duration: moment(endDate).diff(moment(startDate), 'milliseconds', false),
832
+ // result: 'Same data'
833
+ // });
834
+ }
835
+ resolve(true);
836
+ }
837
+ }, function (err) {
838
+ subscription.clients.forEach(function (client) {
839
+ var ws = _this._mainServer.getWS(client.id_socket);
840
+ if (ws) {
841
+ if (ws['id_socket'] === client.id_socket) {
842
+ var serverRes = {
843
+ messageId: client.messageId,
844
+ hasError: true,
845
+ data: err
846
+ };
847
+ _this.sendWS(ws, serverRes);
848
+ }
849
+ }
850
+ });
851
+ reject(err);
852
+ });
853
+ }
854
+ return [2 /*return*/];
855
+ });
856
+ }); });
857
+ };
858
+ SubscriptionManager.prototype.sendWS = function (ws, data) {
859
+ this._sendQueue.splice(0, 0, {
860
+ id_ws: ws['id_socket'],
861
+ data: data
862
+ });
863
+ };
864
+ return SubscriptionManager;
865
+ }());
866
+ exports.SubscriptionManager = SubscriptionManager;
867
+
2
868
  //# sourceMappingURL=subscription.manager.js.map