@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.
- package/client-server-app.js +55 -1
- package/client-server-app.js.map +1 -1
- package/collections/app-status.collection.js +40 -1
- package/collections/app-status.collection.js.map +1 -1
- package/collections/app-version.collection.js +40 -1
- package/collections/app-version.collection.js.map +1 -1
- package/collections/counter.collection.js +43 -1
- package/collections/counter.collection.js.map +1 -1
- package/collections/cron-job-history.collection.js +71 -1
- package/collections/cron-job-history.collection.js.map +1 -1
- package/collections/cron-job.collection.js +74 -1
- package/collections/cron-job.collection.js.map +1 -1
- package/collections/email-history.collection.js +55 -1
- package/collections/email-history.collection.js.map +1 -1
- package/collections/email-verified.collection.js +50 -1
- package/collections/email-verified.collection.js.map +1 -1
- package/collections/file.collection.js +62 -1
- package/collections/file.collection.js.map +1 -1
- package/collections/flag.collection.js +44 -1
- package/collections/flag.collection.js.map +1 -1
- package/collections/log-method-latency.collection.js +53 -1
- package/collections/log-method-latency.collection.js.map +1 -1
- package/collections/log-subscription.collection.js +57 -1
- package/collections/log-subscription.collection.js.map +1 -1
- package/collections/log.collection.js +72 -1
- package/collections/log.collection.js.map +1 -1
- package/collections/logged-in-users.collection.js +58 -1
- package/collections/logged-in-users.collection.js.map +1 -1
- package/collections/method-call.collection.js +51 -1
- package/collections/method-call.collection.js.map +1 -1
- package/collections/method-response.collection.js +55 -1
- package/collections/method-response.collection.js.map +1 -1
- package/collections/monitor-cpu.collection.js +57 -1
- package/collections/monitor-cpu.collection.js.map +1 -1
- package/collections/monitor-https-inbound.collection.js +66 -1
- package/collections/monitor-https-inbound.collection.js.map +1 -1
- package/collections/monitor-https-outbound.collection.js +74 -1
- package/collections/monitor-https-outbound.collection.js.map +1 -1
- package/collections/monitor-memory.collection.js +68 -1
- package/collections/monitor-memory.collection.js.map +1 -1
- package/collections/monitor-mongo.collection.js +62 -1
- package/collections/monitor-mongo.collection.js.map +1 -1
- package/collections/notification.collection.js +40 -1
- package/collections/notification.collection.js.map +1 -1
- package/collections/report-builder-dashboard-builder.collection.js +93 -1
- package/collections/report-builder-dashboard-builder.collection.js.map +1 -1
- package/collections/report-builder-library.collection.js +76 -1
- package/collections/report-builder-library.collection.js.map +1 -1
- package/collections/report-builder-report.collection.js +138 -1
- package/collections/report-builder-report.collection.js.map +1 -1
- package/collections/user-group.collection.js +79 -1
- package/collections/user-group.collection.js.map +1 -1
- package/collections/user-guide.collection.js +46 -1
- package/collections/user-guide.collection.js.map +1 -1
- package/collections/user.collection.js +248 -1
- package/collections/user.collection.js.map +1 -1
- package/cron/cron.js +161 -1
- package/cron/cron.js.map +1 -1
- package/fixtures/cron-jobs.js +72 -1
- package/fixtures/cron-jobs.js.map +1 -1
- package/fixtures/init.js +62 -1
- package/fixtures/init.js.map +1 -1
- package/http/auth.js +697 -1
- package/http/auth.js.map +1 -1
- package/http/health.js +10 -1
- package/http/health.js.map +1 -1
- package/http/home.js +64 -1
- package/http/home.js.map +1 -1
- package/index.js +123 -1
- package/index.js.map +1 -1
- package/managers/cron.manager.js +205 -1
- package/managers/cron.manager.js.map +1 -1
- package/managers/method.manager.js +599 -1
- package/managers/method.manager.js.map +1 -1
- package/managers/mongo.manager.js +1682 -1
- package/managers/mongo.manager.js.map +1 -1
- package/managers/monitor.manager.js +334 -1
- package/managers/monitor.manager.js.map +1 -1
- package/managers/subscription.manager.js +867 -1
- package/managers/subscription.manager.js.map +1 -1
- package/managers/subscription.performance.js +100 -1
- package/managers/subscription.performance.js.map +1 -1
- package/methods/accounts.js +224 -1
- package/methods/accounts.js.map +1 -1
- package/methods/aws.js +449 -1
- package/methods/aws.js.map +1 -1
- package/methods/cloudconvert.js +214 -1
- package/methods/cloudconvert.js.map +1 -1
- package/methods/collections.js +526 -1
- package/methods/collections.js.map +1 -1
- package/methods/counters.js +121 -1
- package/methods/counters.js.map +1 -1
- package/methods/cron-jobs.js +1284 -1
- package/methods/cron-jobs.js.map +1 -1
- package/methods/flags.js +8 -1
- package/methods/flags.js.map +1 -1
- package/methods/logs.js +370 -1
- package/methods/logs.js.map +1 -1
- package/methods/monitor.js +384 -1
- package/methods/monitor.js.map +1 -1
- package/methods/pdf.js +685 -1
- package/methods/pdf.js.map +1 -1
- package/methods/report-builder.js +826 -1
- package/methods/report-builder.js.map +1 -1
- package/methods/support.js +263 -1
- package/methods/support.js.map +1 -1
- package/models/app-status.model.js +3 -1
- package/models/app-status.model.js.map +1 -1
- package/models/app-version.model.js +3 -1
- package/models/app-version.model.js.map +1 -1
- package/models/billing-logged-in-users.model.js +3 -1
- package/models/billing-logged-in-users.model.js.map +1 -1
- package/models/collection-document.model.js +3 -1
- package/models/collection-document.model.js.map +1 -1
- package/models/counter.model.js +3 -1
- package/models/counter.model.js.map +1 -1
- package/models/cron-job-history.model.js +3 -1
- package/models/cron-job-history.model.js.map +1 -1
- package/models/cron-job.model.js +3 -1
- package/models/cron-job.model.js.map +1 -1
- package/models/dialog.model.js +3 -1
- package/models/dialog.model.js.map +1 -1
- package/models/email-history.model.js +3 -1
- package/models/email-history.model.js.map +1 -1
- package/models/email-verified.model.js +3 -1
- package/models/email-verified.model.js.map +1 -1
- package/models/file.model.js +3 -1
- package/models/file.model.js.map +1 -1
- package/models/flag.model.js +3 -1
- package/models/flag.model.js.map +1 -1
- package/models/log-method-latency.model.js +3 -1
- package/models/log-method-latency.model.js.map +1 -1
- package/models/log-subscription.model.js +3 -1
- package/models/log-subscription.model.js.map +1 -1
- package/models/log.model.js +3 -1
- package/models/log.model.js.map +1 -1
- package/models/logged-in-users.model.js +3 -1
- package/models/logged-in-users.model.js.map +1 -1
- package/models/method-call.model.js +3 -1
- package/models/method-call.model.js.map +1 -1
- package/models/method-response.model.js +3 -1
- package/models/method-response.model.js.map +1 -1
- package/models/method.model.js +3 -1
- package/models/method.model.js.map +1 -1
- package/models/monitor-cpu.model.js +3 -1
- package/models/monitor-cpu.model.js.map +1 -1
- package/models/monitor-https-inbound.model.js +3 -1
- package/models/monitor-https-inbound.model.js.map +1 -1
- package/models/monitor-https-outbound.model.js +3 -1
- package/models/monitor-https-outbound.model.js.map +1 -1
- package/models/monitor-memory.model.js +3 -1
- package/models/monitor-memory.model.js.map +1 -1
- package/models/monitor-mongo.model.js +3 -1
- package/models/monitor-mongo.model.js.map +1 -1
- package/models/notification.model.js +3 -1
- package/models/notification.model.js.map +1 -1
- package/models/pagination.model.js +23 -1
- package/models/pagination.model.js.map +1 -1
- package/models/permission.model.js +3 -1
- package/models/permission.model.js.map +1 -1
- package/models/report-builder-dashboard-builder.model.js +3 -1
- package/models/report-builder-dashboard-builder.model.js.map +1 -1
- package/models/report-builder-library.model.js +3 -1
- package/models/report-builder-library.model.js.map +1 -1
- package/models/report-builder-report.model.js +3 -1
- package/models/report-builder-report.model.js.map +1 -1
- package/models/report-builder.model.js +3 -1
- package/models/report-builder.model.js.map +1 -1
- package/models/select-data-label.model.js +3 -1
- package/models/select-data-label.model.js.map +1 -1
- package/models/server-response.model.js +3 -1
- package/models/server-response.model.js.map +1 -1
- package/models/subscription.model.js +3 -1
- package/models/subscription.model.js.map +1 -1
- package/models/support-ticket.model.js +3 -1
- package/models/support-ticket.model.js.map +1 -1
- package/models/user-group.model.js +3 -1
- package/models/user-group.model.js.map +1 -1
- package/models/user-guide.model.js +3 -1
- package/models/user-guide.model.js.map +1 -1
- package/models/user.model.js +3 -1
- package/models/user.model.js.map +1 -1
- package/package.json +1 -2
- package/public_api.js +78 -1
- package/public_api.js.map +1 -1
- package/publications/app-status.js +16 -1
- package/publications/app-status.js.map +1 -1
- package/publications/app-version.js +16 -1
- package/publications/app-version.js.map +1 -1
- package/publications/cron-jobs.js +32 -1
- package/publications/cron-jobs.js.map +1 -1
- package/publications/files.js +36 -1
- package/publications/files.js.map +1 -1
- package/publications/flags.js +22 -1
- package/publications/flags.js.map +1 -1
- package/publications/logs.js +90 -1
- package/publications/logs.js.map +1 -1
- package/publications/method-calls.js +16 -1
- package/publications/method-calls.js.map +1 -1
- package/publications/method-responses.js +16 -1
- package/publications/method-responses.js.map +1 -1
- package/publications/notifications.js +16 -1
- package/publications/notifications.js.map +1 -1
- package/publications/report-builder-dashboard-builders.js +42 -1
- package/publications/report-builder-dashboard-builders.js.map +1 -1
- package/publications/report-builder-libraries.js +89 -1
- package/publications/report-builder-libraries.js.map +1 -1
- package/publications/report-builder-reports.js +50 -1
- package/publications/report-builder-reports.js.map +1 -1
- package/publications/super-admin.js +16 -1
- package/publications/super-admin.js.map +1 -1
- package/publications/user-groups.js +16 -1
- package/publications/user-groups.js.map +1 -1
- package/publications/user-guides.js +16 -1
- package/publications/user-guides.js.map +1 -1
- package/server-app.js +682 -1
- package/server-app.js.map +1 -1
- package/util/common.js +498 -1
- package/util/common.js.map +1 -1
- package/util/schema-report-builder.js +452 -1
- package/util/schema-report-builder.js.map +1 -1
package/server-app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server-app.ts"],"names":["http_1","require","express","bodyParser","xmlParser","passport","passportlocal","WebSocket","jwt","uuid","SegfaultHandler","moment","common_1","mongo_manager_1","cron_manager_1","method_manager_1","subscription_manager_1","monitor_manager_1","method_call_collection_1","method_response_collection_1","log_collection_1","log_method_latency_collection_1","user_collection_1","home_1","auth_1","health_1","ResolveIOMainServer","mainServer","monitorAgent","serverConfig","clientRoutes","clientDir","sesMail","standardProgram","_this","this","_msgQueue","_msgQueueRunning","LOGGER","_clientRoutes","_lastErrorMsg","_serverConfig","_clientDir","_serverStartTime","Date","_monitorManager","MonitorManager","process","on","error","rej","__awaiter","diffTimeSec","diff","setTimeout","_methodManager","sendEmail","JSON","stringify","_a","sent","exit","console","registerHandler","signal","address","stack","log","_app","use","json","limit","reviver","dateReviver","urlencoded","extended","parameterLimit","_port","env","PORT","createServer","req","res","next","setHeader","setupAuthRoutes","setupHealthRoutes","setupHomeRoutes","prototype","getWS","id_ws","Array","from","_wss","clients","filter","a","getWSList","forEach","ws","push","getWSUserList","getHTTPServer","_server","getCronManager","_cronManager","getMethodManager","getSubscriptionManager","_subscriptionManager","getMonitorManager","keepAliveTimeout","headersTimeout","Server","server","verifyClient","info","cb","infoData","headers","split","origin","token","verify","err","decoded","Users","findById","user","fullname","readonly","setUpMongo","setUpPassport","SubscriptionManager","MethodManager","CronManager","listen","initialize","Strategy","authenticateStrategy","serializeUser","deserializeUser","duration","asMilliseconds","loggedInLatency","unsubscribeWS","message","parseErrorFound","socketData","parse","e","readyState","OPEN","send","messageRoute_1","some","includes","roles","groups","views","b","super_admin","messageDate","messageId","subType","pub","subscribe","apply","__spreadArrays","slice","_b","unsubscribe","splice","data","setInterval","ping","i","msg","this_1","pop","messageRoute","shift","type","method","clearTimeout","methodLatencyId","objectIdHexString","LogMethodLatencies","create","_id","__v","date_start","date_end","latency_ms","Logs","insertOne","collection","id_document","payload","getBinarySize","id_user","route","serverRes","hasError","_methods","query","$and","message_id","date","$or","MethodCalls","findOne","MethodResponses","then","response","callMethod","length","unsubscribeAll","getApp"],"mappings":"iwDAAA,IAAAA,OAAAC,QAAA,QACAC,QAAAD,QAAA,WACAE,WAAAF,QAAA,eACAG,UAAAH,QAAA,0BACAI,SAAAJ,QAAA,YACAK,cAAAL,QAAA,kBACAM,UAAAN,QAAA,MACAO,IAAAP,QAAA,gBACAQ,KAAAR,QAAA,WACAS,gBAAAT,QAAA,oBACAU,OAAAV,QAAA,UAEAW,SAAAX,QAAA,iBAEAY,gBAAAZ,QAAA,4BACAa,eAAAb,QAAA,2BACAc,iBAAAd,QAAA,6BACAe,uBAAAf,QAAA,mCACAgB,kBAAAhB,QAAA,8BAIAiB,yBAAAjB,QAAA,wCACAkB,6BAAAlB,QAAA,4CACAmB,iBAAAnB,QAAA,gCACAoB,gCAAApB,QAAA,+CACAqB,kBAAArB,QAAA,iCAEAsB,OAAAtB,QAAA,eACAuB,OAAAvB,QAAA,eACAwB,SAAAxB,QAAA,iBAEAyB,oBAAA,WAuBC,SAAAA,oBAAYC,EAAYC,EAAcC,EAAcC,EAAcC,EAAWC,EAASC,GAAtF,IAAAC,EAAAC,KAhBQA,KAAAC,UAAY,GACZD,KAAAE,kBAAmB,EACpBF,KAAAH,SAAU,EACTG,KAAAF,iBAAkB,EAElBE,KAAAG,OAAS,QAMTH,KAAAI,cAA0B,GAG1BJ,KAAAK,cAAsB,KAG7BL,KAAKM,cAAgBZ,EACrBM,KAAKI,cAAgBT,EACrBK,KAAKO,WAAaX,EAClBI,KAAKH,QAAUA,EACfG,KAAKF,gBAAkBA,EAEvBE,KAAKQ,iBAAmB,IAAIC,KAC5BT,KAAKK,cAAgB,KAEY,0BAA7BX,EAAuB,WAC1BM,KAAKU,gBAAkB,IAAI5B,kBAAA6B,eAAenB,EAAYC,EAAcC,IAGrEkB,QAAQC,GAAG,sBAAsB,SAAOC,EAAOC,GAAG,OAAAC,UAAAjB,OAAA,OAAA,GAAA,2FAG7CkB,EAAczC,SAAS0C,KAAKlB,KAAKQ,iBAAkB,WAEnDM,GAA2B,eAAlBA,EAAY,MAA2C,eAArBA,EAAe,QACzDG,EAAc,KAAOjB,KAAKK,eAC7BL,KAAKK,cAAgB,IAAII,KAEzBU,YAAW,WACVpB,EAAKM,cAAgB,OACnB,KAEH,CAAA,EAAML,KAAKoB,eAAeC,UAAU,oBAAqB,oDAAsDrB,KAAKM,cAA2B,YAAGgB,KAAKC,UAAU,CAACT,EAAY,KAAGA,EAAe,QAAGA,EAAa,OAAI,KAAM,MAPvN,CAAA,EAAA,GADD,CAAA,EAAA,UAQFU,EAAAC,+BAGDb,QAAQc,KAAK,uBAELZ,GAA2B,eAAlBA,EAAY,MAA2C,iCAArBA,EAAe,QAC9DG,EAAc,KAAOjB,KAAKK,eAC7BL,KAAKK,cAAgB,IAAII,KAEzBU,YAAW,WACVpB,EAAKM,cAAgB,OACnB,KAEH,CAAA,EAAML,KAAKoB,eAAeC,UAAU,oBAAqB,oDAAsDrB,KAAKM,cAA2B,YAAGgB,KAAKC,UAAU,CAACT,EAAY,KAAGA,EAAe,QAAGA,EAAa,OAAI,KAAM,MAPvN,CAAA,EAAA,GADI,CAAA,EAAA,UAQPU,EAAAC,+BAGDb,QAAQc,KAAK,gBAELZ,GACc,gBAAlBA,EAAY,MAA4C,KAArBA,EAAe,SACjDG,EAAc,KAAOjB,KAAKK,gBAC7BL,KAAKK,cAAgB,IAAII,KAEzBU,YAAW,WACVpB,EAAKM,cAAgB,OACnB,KAEHL,KAAKoB,eAAeC,UAAU,oBAAqB,kCAAoCrB,KAAKM,cAA2B,YAAGgB,KAAKC,UAAU,CAACT,EAAY,KAAGA,EAAe,QAAGA,EAAa,OAAI,KAAM,0CAMtMF,QAAQC,GAAG,qBAAqB,SAAMC,GAAK,OAAAE,UAAAjB,OAAA,OAAA,GAAA,yFAC1C4B,QAAQb,MAAMA,EAAO,6BAEHtC,SAAS0C,KAAKlB,KAAKQ,iBAAkB,WAErC,KAAOR,KAAKK,eAC7BL,KAAKK,cAAgB,IAAII,KAEzBU,YAAW,WACVpB,EAAKM,cAAgB,OACnB,KAEH,CAAA,EAAML,KAAKoB,eAAeC,UAAU,oBAAqB,kCAAoCrB,KAAKM,cAA2B,YAAGgB,KAAKC,UAAU,CAACT,EAAY,KAAGA,EAAe,QAAGA,EAAa,OAAI,KAAM,MAPrM,CAAA,EAAA,UAOHU,EAAAC,+BAGDb,QAAQc,KAAK,iBAGdnD,gBAAgBqD,gBAAgB,aAAa,SAAOC,EAAQC,EAASC,GAAK,OAAAf,UAAAjB,OAAA,OAAA,GAAA,8EAIzE4B,QAAQK,IAAI,0BACZL,QAAQK,IAAI,SAAUV,KAAKC,UAAUM,EAAQ,KAAM,IACnDF,QAAQK,IAAI,UAAWV,KAAKC,UAAUO,EAAS,KAAM,IACrDH,QAAQK,IAAI,QAASV,KAAKC,UAAUQ,EAAO,KAAM,IAE/BvD,SAAS0C,KAAKlB,KAAKQ,iBAAkB,WAErC,KAAOR,KAAKK,cAC7B,CAAA,EAAML,KAAKoB,eAAeC,UAAU,oBAAqB,uBAAyBrB,KAAKM,cAA2B,YAAGgB,KAAKC,UAAU,CAACM,EAAQC,EAASC,GAAQ,KAAM,KADjK,CAAA,EAAA,UACHP,EAAAC,+BAGDb,QAAQc,KAAK,iBAKM,UAAhB1B,KAAKG,QACRwB,QAAQK,IAAI,6BAIbhC,KAAKiC,KAAOlE,UAGZiC,KAAKiC,KAAKC,IAAIlE,WAAWmE,KAAK,CAACC,MAAO,OAAQC,QAAS5D,SAAA6D,eACvDtC,KAAKiC,KAAKC,IAAIlE,WAAWuE,WAAW,CAACH,MAAO,OAAQI,UAAU,EAAMC,eAAgB,OACpFzC,KAAKiC,KAAKC,IAAIjE,aAGd+B,KAAK0C,MAAQ9B,QAAQ+B,IAAIC,MAAQlD,EAAmB,KAEhC,UAAhBM,KAAKG,QACRwB,QAAQK,IAAI,eAIbhC,KAAK6C,eAEe,UAAhB7C,KAAKG,QACRwB,QAAQK,IAAI,iBAIbhC,KAAKiC,KAAKC,KAAI,SAAUY,EAAKC,EAAKC,GAIjCD,EAAIE,UAAU,8BAA+B,KAI7CF,EAAIE,UAAU,+BAAgC,aAG9CF,EAAIE,UAAU,+BAAgC,iCAI9CF,EAAIE,UAAU,mCAAoC,SAGlDD,OAGmB,UAAhBhD,KAAKG,QACRwB,QAAQK,IAAI,cAIb3C,OAAA6D,gBAAgBlD,KAAMA,KAAKiC,KAAMvC,GACjCJ,SAAA6D,kBAAkBnD,KAAKiC,KAAMvC,IAEO,cAAhCA,EAA0B,aAAqBM,KAAKF,kBACvDV,OAAAgE,gBAAgBpD,KAAMA,KAAKiC,KAAMvC,GAGd,UAAhBM,KAAKG,QACRwB,QAAQK,IAAI,wBA4cf,OAxcQzC,oBAAA8D,UAAAC,MAAP,SAAaC,GACZ,OAAOC,MAAMC,KAAKzD,KAAK0D,KAAKC,SAASC,QAAO,SAAAC,GAAK,OAAAA,EAAa,YAAMN,KAAO,IAGrEhE,oBAAA8D,UAAAS,UAAP,WACC,IAAIf,EAAM,GAMV,OAJA/C,KAAK0D,KAAKC,QAAQI,SAAQ,SAACC,GAC1BjB,EAAIkB,KAAKD,EAAc,cAGjBjB,GAGDxD,oBAAA8D,UAAAa,cAAP,WACC,IAAInB,EAAM,GAMV,OAJA/C,KAAK0D,KAAKC,QAAQI,SAAQ,SAACC,GAC1BjB,EAAIkB,KAAKD,EAAY,YAGfjB,GAGDxD,oBAAA8D,UAAAc,cAAP,WACC,OAAOnE,KAAKoE,SAGN7E,oBAAA8D,UAAAgB,eAAP,WACC,OAAOrE,KAAKsE,cAGN/E,oBAAA8D,UAAAkB,iBAAP,WACC,OAAOvE,KAAKoB,gBAGN7B,oBAAA8D,UAAAmB,uBAAP,WACC,OAAOxE,KAAKyE,sBAGNlF,oBAAA8D,UAAAqB,kBAAP,WACC,OAAO1E,KAAKU,iBAGLnB,oBAAA8D,UAAAR,aAAR,WAAA,IAAA9C,EAAAC,KAECA,KAAKoE,QAAUvG,OAAAgF,aAAa7C,KAAKiC,MACjCjC,KAAKoE,QAAQO,iBAAmB,KAChC3E,KAAKoE,QAAQQ,eAAiB,KAI9B5E,KAAK0D,KAAO,IAAItF,UAAUyG,OAAO,CAChCC,OAAQ9E,KAAKoE,QACbW,aAAc,SAAOC,EAAMC,GAAE,OAAAjE,UAAAjB,OAAA,OAAA,GAAA,qEACR,UAAhBC,KAAKG,QACRwB,QAAQK,IAAI,gBAAiBgD,EAAMC,GAGhCC,EAAoBF,EAAKlC,IAAIqC,QAAQ,0BAA2BC,MAAM,KAEtEJ,EAAKK,SAAWrF,KAAKM,cAAwB,UAAK0E,EAAKK,SAAWrF,KAAKM,cAA4B,cAAK0E,EAAKK,SAAWrF,KAAKM,cAA6B,eAAK0E,EAAKK,SAAWrF,KAAKM,cAAuC,wBAC9N2E,GAAG,EAAO,IAAK,gBAGXC,EAAS,IACRI,EAAQJ,EAAS,IAKpB7G,IAAIkH,OAAOD,EAAOtF,KAAKM,cAA0B,YAAG,SAAOkF,EAAKC,GAAO,OAAAzE,UAAAjB,OAAA,OAAA,GAAA,oFAClEyF,GACHP,GAAG,EAAO,IAAK,uBADZ,CAAA,EAAA,UAIHD,EAAKlC,IAAa,QAAI2C,EAAiB,yBAE3B,6BAAA,CAAA,EAAMtG,kBAAAuG,MAAMC,SAASF,EAAiB,wBAA7CG,EAAOpE,EAAAC,SAEVuD,EAAKlC,IAAU,KAAI8C,EAAKC,SACxBb,EAAKlC,IAAmB,cAAI8C,EAAKE,WAAY,EAC7Cd,EAAKlC,IAAc,SAAI8C,EACvBX,GAAG,IAGHA,GAAG,gCAIJA,GAAG,oCAtBNA,GAAG,EAAO,IAAK,gBA6BhBA,GAAG,EAAO,IAAK,gCAOnBjF,KAAK+F,cAGExG,oBAAA8D,UAAA0C,WAAR,WACC/F,KAAKgG,gBAEe,UAAhBhG,KAAKG,QACRwB,QAAQK,IAAI,kBAIbhC,KAAKyE,qBAAuB,IAAI5F,uBAAAoH,oBAAoBjG,KAAMA,KAAK0D,KAAM1D,KAAKM,eAC1EN,KAAKoB,eAAiB,IAAIxC,iBAAAsH,cAAclG,KAAMA,KAAKM,cAAeN,KAAKO,YACvEP,KAAKsE,aAAe,IAAI3F,eAAAwH,YAAYnG,MAEhB,UAAhBA,KAAKG,QACRwB,QAAQK,IAAI,gBAGbhC,KAAKoG,UAGE7G,oBAAA8D,UAAA2C,cAAR,WAAA,IAAAjG,EAAAC,KACKb,kBAAAuG,OAEH1F,KAAKiC,KAAKC,IAAIhE,SAASmI,cAGvBnI,SAASgE,IAAI,IAAI/D,cAAcmI,SAASnH,kBAAAuG,MAAMa,yBAC9CrI,SAASsI,cAAcrH,kBAAAuG,MAAMc,iBAC7BtI,SAASuI,gBAAgBtH,kBAAAuG,MAAMe,oBAG/BtF,YAAW,WACVpB,EAAKiG,kBACH,IAMGzG,oBAAA8D,UAAA+C,OAAR,WAAA,IAAArG,EAAAC,KACCA,KAAKoE,QAAQgC,OAAOpG,KAAK0C,OAAO,WAC/Bf,QAAQK,IAAI,4BAA6BjC,EAAK2C,UAI/C1C,KAAK0D,KAAK7C,GAAG,cAAc,SAACmD,EAAIlB,GAG/BkB,EAAY,QAAIlB,EAAa,QAC7BkB,EAAS,KAAIlB,EAAU,KACvBkB,EAAkB,cAAIlB,EAAmB,cACzCkB,EAAa,SAAIlB,EAAc,SAC/BkB,EAAc,UAAI1F,OAClB0F,EAAa,SAAI,EAEG,UAAhBjE,EAAKI,QACRwB,QAAQK,IAAI,oBAAsBc,EAAU,MAI7CkB,EAAY,SAAI,EAChBA,EAAGnD,GAAG,QAAQ,WACbmD,EAAY,SAAI,EAChBA,EAAa,SAAI,IAAIvD,KACrBuD,EAAY,QAAIxF,OAAOkI,SAASlI,OAAOwF,EAAa,UAAG9C,KAAK8C,EAAa,WAAI2C,iBAC7E5G,EAAK0E,qBAAqBmC,gBAAgB5C,MAG3CA,EAAiB,aAAI7C,YAAW,WAC/BpB,EAAK8G,cAAc7C,KACjB,KAGHA,EAAGnD,GAAG,WAAW,SAAOiG,GAAe,OAAA9F,UAAAjB,OAAA,OAAA,GAAA,6EAClB,UAAhBC,KAAKG,QACRwB,QAAQK,IAAI,iBAAmBgC,EAAS,KAAG8C,GAGxCC,GAAkB,EAElBC,EAAa,GAEjB,IACCA,EAAa1F,KAAK2F,MAAMH,EAASrI,SAAA6D,aAElC,MAAM4E,GACLvF,QAAQK,IAAI,qBAAsB8E,GAElC9G,KAAKoB,eAAeC,UAAU,oBAAqB,+BAAiCrB,KAAKM,cAA2B,YAAGgB,KAAKC,UAAU,CAACuF,EAASI,KAEhJH,GAAkB,EAGnB,IAAKA,EAAiB,CACrB,GAAsB,SAAlBC,EAAW,GAUd,OATIhD,GAAMA,EAAGmD,aAAenD,EAAGoD,MAC9BpD,EAAGqD,KAAK,QAAQ,SAACvG,GACZA,IACHa,QAAQK,IAAI,gBAAiBlB,GAC7Bf,EAAK8G,cAAc7C,OAKtB,CAAA,GAKD,GAFIsD,EAAeN,EAAW,GAE1BhH,KAAKI,cAAcmH,MAAK,SAAA1D,GAAK,OAAAyD,EAAaE,SAAS3D,QAAQG,EAAa,SAAEyD,MAAMC,OAAOH,MAAK,SAAA1D,GAAK,OAAAA,EAAE8D,MAAMJ,MAAK,SAAAK,GAAK,OAAAN,EAAaE,SAASI,WAAS5D,EAAa,SAAEyD,MAAMI,YAC1K,MAAA,CAAA,GAGGC,EAAcd,EAAW,GACzBe,EAAYf,EAAW,GAGd,iBAFFA,EAAW,IAGjBgB,EAAUhB,EAAW,GACrBiB,EAAMjB,EAAW,GAGL,QAAZgB,GACHxG,EAAAxB,KAAKyE,sBAAqByD,UAASC,MAAA3G,EAAA4G,eAAA,CAACN,EAAa9D,EAAI+D,EAAWE,GAAQjB,EAAWqB,MAAM,MAIzFC,EAAAtI,KAAKyE,sBAAqB8D,YAAWJ,MAAAG,EAAAF,eAAA,CAACN,EAAa9D,EAAI+D,EAAWE,GAAQjB,EAAWqB,MAAM,MAI5FrI,KAAKC,UAAUuI,OAAO,EAAG,EAAG,CAC3BxE,GAAIA,EACJyE,KAAMzB,uBAMVhD,EAAGnD,GAAG,SAAS,WACdd,EAAK8G,cAAc7C,MAGpBA,EAAGnD,GAAG,SAAS,SAAAC,GACda,QAAQK,IAAIlB,GAEZf,EAAK8G,cAAc7C,SAKrB0E,aAAY,WACX3I,EAAK2D,KAAKC,QAAQI,SAAQ,SAACC,IACJ,IAAlBA,EAAY,SACfA,EAAa,WAETA,EAAa,UAAK,GACrBjE,EAAK8G,cAAc7C,IAGnBA,EAAa,SAAI,IAAIvD,KACrBuD,EAAG2E,MAAK,kBAIT3E,EAAa,SAAI,EACjBA,EAAY,SAAI,EAChBA,EAAa,SAAI,IAAIvD,KACrBuD,EAAG2E,MAAK,qBAGR,MAEHD,aAAY,WAAA,OAAA1H,UAAAjB,OAAA,OAAA,GAAA,2FAGNC,KAAKE,iBAAN,MAAA,CAAA,EAAA,GACHF,KAAKE,kBAAmB,aAEf0I,kGACJC,EAAMC,EAAK7I,UAAU8I,MACrBN,EAAOI,EAAIJ,KACXzE,EAAK6E,EAAI7E,GAETgF,EAAuBP,EAAKQ,QAC5BnB,EAAoBW,EAAKQ,QACzBlB,EAAoBU,EAAKQ,QAIhB,YAHTC,EAAeT,EAAKQ,SAGpB,CAAA,EAAA,IAGY,qBAFXE,EAASV,EAAKQ,UAGjBG,aAAapF,EAAiB,cAG3BA,EAAkB,8BAIlBqF,EAAkB3K,gBAAA4K,oBAEtBpK,gCAAAqK,mBAAmBC,OAAO,CACzBC,IAAKJ,EACLK,IAAK,EACLC,WAAY,IAAIlJ,KAChBmJ,SAAU,KACVC,WAAY,EACZV,OAAQA,IAGM,4BAAXA,GAAmD,kCAAXA,GAAyD,2BAAXA,GAAkD,gBAAXA,GAAuC,qBAAXA,GAA4C,eAAXA,GAAsC,mBAAXA,GAA0C,6BAAXA,GAAoD,SAAXA,GAAgC,YAAXA,GAAmC,oBAAXA,GAA2C,oBAAXA,GAA2C,eAAXA,GAC7YlK,iBAAA6K,KAAKC,UAAU,CACdN,IAAK/K,gBAAA4K,oBACLJ,KAAM,iBACNc,WAAY,GACZC,YAAa,GACbC,QAASzL,SAAA0L,cAAc7I,KAAKC,UAAUkH,IAAS,IAASnH,KAAKC,UAAUkH,EAAM,KAAM,GAAK,UACxFU,OAAQA,EACRiB,QAASpG,EAAY,SAAK,GAC1B4B,KAAM5B,EAAS,MAAK,GACpB+D,UAAWA,EACXsC,MAAOrB,IAILsB,EAAiC,CACpCvC,UAAWA,EACXwC,UAAU,EACV9B,KAAM,OAGHzE,GAAMA,EAAGmD,aAAenD,EAAGoD,MAC9BpD,EAAGqD,KAAK/F,KAAKC,UAAU+I,IAAY,SAACxJ,GAC/BA,IACHa,QAAQK,IAAI,gBAAiBlB,GAC7Bf,EAAK8G,cAAc7C,OAKlB8E,EAAK1H,eAAeoJ,SAASrB,IAE5BsB,EAAa,CAACC,KAAM,CACvB,CAACN,QAASpG,EAAY,SACtB,CAAC2G,WAAY5C,GACb,CAAC6C,KAAM9C,KAGO,0BAAXqB,GAAiD,+BAAXA,EACzCsB,EAAMC,KAAKzG,KAAK,CAACkF,OAAQA,IAGV,0BAAXA,EACHsB,EAAMC,KAAKzG,KAAK,CACf4G,IAAK,CACJ,CAAC1B,OAAQA,GACT,CAACA,OAAQ,qBAIQ,+BAAXA,GACRsB,EAAMC,KAAKzG,KAAK,CACf4G,IAAK,CACJ,CAAC1B,OAAQA,GACT,CAACA,OAAQ,0BAMI,CAAA,EAAMpK,yBAAA+L,YAAYC,QAAQN,KA9BxC,CAAA,EAAA,mBA8BcnC,EAAA7G,OAoBhBzC,6BAAAgM,gBAAgBD,QAAQ,CAACL,KAAM,CAC9B,CAACN,QAASpG,EAAY,SACtB,CAAC2G,WAAY5C,GACb,CAACoB,OAAQA,GACT,CAACyB,KAAM9C,MACJmD,MAAK,SAAAlI,GACJA,GACCiB,GAAMA,EAAGmD,aAAenD,EAAGoD,MAC9BpD,EAAGqD,KAAK/F,KAAKC,UAAUwB,EAAImI,WAAW,SAACpK,GAClCA,IACHa,QAAQK,IAAI,gBAAiBlB,GAC7Bf,EAAK8G,cAAc7C,UAKrB,SAAAwB,QAjCHzG,yBAAA+L,YAAYtB,OAAO,CAClBC,IAAK/K,gBAAA4K,oBACLI,IAAK,EACLU,QAASpG,EAAY,QACrB2G,WAAY5C,EACZoB,OAAQA,EACRyB,KAAM9C,IAGHgB,EAAK1H,eAAeoJ,SAASrB,IAChC3H,EAAAsH,EAAK1H,gBAAe+J,WAAUhD,MAAA3G,EAAA4G,eAAA,CAACiB,EAAiBrF,EAAI8D,EAAaC,EAAWoB,GAAWV,IAGvF9G,QAAQK,IAAI,0BAA4BmH,iBAwB1CxH,QAAQK,IAAI,0BAA4BmH,uCAGxB,mBAATD,IACJC,EAASV,EAAKQ,QAElBjK,6BAAAgM,gBAAgBD,QAAQ,CAACL,KAAM,CAC9B,CAACN,QAASpG,EAAY,SACtB,CAAC2G,WAAY5C,GACb,CAACoB,OAAQA,GACT,CAACyB,KAAM9C,MACJmD,MAAK,SAAAlI,GACJA,GACCiB,GAAMA,EAAGmD,aAAenD,EAAGoD,MAC9BpD,EAAGqD,KAAK/F,KAAKC,UAAUwB,EAAImI,WAAW,SAACpK,GAClCA,IACHa,QAAQK,IAAI,gBAAiBlB,GAC7Bf,EAAK8G,cAAc7C,UAKrB,SAAAwB,+CA3JIoD,EAAI5I,KAAKC,UAAUmL,OAAS,0BAAGxC,GAAK,OAApCA,IAAqC,CAAA,EAAA,2CAAEA,iBA+JhD5I,KAAKE,kBAAmB,sCAEvB,KAGGX,oBAAA8D,UAAAwD,cAAP,SAAqB7C,GACpBhE,KAAKyE,qBAAqB4G,eAAerH,IAGnCzE,oBAAA8D,UAAAiI,OAAP,WACC,OAAOtL,KAAKiC,MAEd1C,oBAloBA","file":"server-app.js","sourcesContent":["import { createServer, Server } from 'http';\nimport * as express from 'express';\nimport * as bodyParser from 'body-parser';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport * as passport from 'passport';\nimport * as passportlocal from 'passport-local';\nimport * as WebSocket from 'ws';\nimport * as jwt from 'jsonwebtoken';\nimport * as uuid from 'uuid/v4';\nimport * as SegfaultHandler from 'segfault-handler';\nimport * as moment from 'moment';\n\nimport { dateReviver, getBinarySize, deepCopy } from './util/common';\n\nimport { objectIdHexString } from './managers/mongo.manager';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { MonitorManager } from './managers/monitor.manager';\n\nimport { ServerResponseModel } from './models/server-response.model';\n\nimport { MethodCalls } from './collections/method-call.collection';\nimport { MethodResponses } from './collections/method-response.collection';\nimport { Logs } from './collections/log.collection';\nimport { LogMethodLatencies } from './collections/log-method-latency.collection';\nimport { Users } from './collections/user.collection';\n\nimport { setupHomeRoutes } from './http/home';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\n\nexport default class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _server: Server;\n\tprivate _port: string | number;\n\tprivate _wss: WebSocket.Server;\n\tprivate _serverConfig;\n\tprivate _clientDir;\n\tprivate _msgQueue = [];\n\tprivate _msgQueueRunning = false;\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _monitorManager: MonitorManager;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tconstructor(mainServer, monitorAgent, serverConfig, clientRoutes, clientDir, sesMail, standardProgram) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._clientRoutes = clientRoutes;\n\t\tthis._clientDir = clientDir;\n\t\tthis.sesMail = sesMail;\n\t\tthis.standardProgram = standardProgram;\n\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\t\n\t\tif (serverConfig['ROOT_URL'] !== 'http://localhost:4200') {\n\t\t\tthis._monitorManager = new MonitorManager(mainServer, monitorAgent, serverConfig);\n\t\t}\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\t// console.error('Unhandled Rejection at Promise', [error, rej]);\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (error && error['name'] === 'MongoError' && error['message'] === 'not master') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait 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));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master and slaveOk=false') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait 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));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error) {\n\t\t\t\tif (error['name'] !== 'StatusError' && error['message'] !== '') {\n\t\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t\tthis._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tprocess.on('uncaughtException', async error => {\n\t\t\tconsole.error(error, 'Uncaught Exception thrown');\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t}, 60000);\n\t\t\t\t\n\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Exception - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t}\n\n\t\t\tprocess.exit(1);\n\t\t});\n\n\t\tSegfaultHandler.registerHandler('crash.log', async (signal, address, stack) => {\n\t\t\t// Do what you want with the signal, address, or stack (array)\n\t\t\t// This callback will execute before the signal is forwarded on.\n\n\t\t\tconsole.log('Segment Fault Detected');\n\t\t\tconsole.log('Signal', JSON.stringify(signal, null, 2));\n\t\t\tconsole.log('Address', JSON.stringify(address, null, 2));\n\t\t\tconsole.log('Stack', JSON.stringify(stack, null, 2));\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Segfault - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([signal, address, stack], null, 2));\n\t\t\t}\n\n\t\t\tprocess.exit(1);\n\t\t});\n\n\t\t//SegfaultHandler.causeSegfault(); // simulates a buggy native module that dereferences NULL\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\t// Use body parser for http call (login)\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._port = process.env.PORT || serverConfig['PORT'];\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\t\t\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\n\t\t\t// Website you wish to allow to connect\n\t\t\t// res.setHeader('Access-Control-Allow-Origin', serverConfig['ROOT_URL']);\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\t\t\n\t\t\t// Request methods you wish to allow\n\t\t\t// res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\t\t\n\t\t\t// Request headers you wish to allow\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\t\t\n\t\t\t// Set to true if you need the website to include cookies in the requests sent\n\t\t\t// to the API (e.g. in case you use sessions)\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\t\t\n\t\t\t// Pass to next layer of middleware\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, serverConfig);\n\t\tsetupHealthRoutes(this._app, serverConfig);\n\n\t\tif (serverConfig['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, serverConfig);\n\t\t}\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup express routes');\n\t\t}\n\t}\n\n\tpublic getWS(id_ws: string) {\n\t\treturn Array.from(this._wss.clients).filter(a => a['id_socket'] === id_ws)[0];\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\n\t\tthis._wss.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\n\t\tthis._wss.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._server;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tprivate createServer(): void {\n\t\t// Start express server\n\t\tthis._server = createServer(this._app);\n\t\tthis._server.keepAliveTimeout = 65000;\n\t\tthis._server.headersTimeout = 66000; // This should be bigger than `keepAliveTimeout + your server's expected response time`\n\n\t\t// Start websocket server\n\t\t// Verify client with token before opening socket\n\t\tthis._wss = new WebSocket.Server({ \n\t\t\tserver: this._server,\n\t\t\tverifyClient: async (info, cb) => {\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t}\n\n\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\tif (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']) {\n\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (infoData[1]) { //app version\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, this._serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tinfo.req['id_user'] = decoded['id_user'];\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user'] = user.fullname;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user_readonly'] = user.readonly || false;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['doc_user'] = user;\n\t\t\t\t\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcb(false, 401, 'Invalid Version');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Start MongoDB Connection\n\t\tthis.setUpMongo();\n\t}\n\n\tprivate setUpMongo() {\n\t\tthis.setUpPassport();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Start Managers');\n\t\t}\n\n\t\t// Start Managers\n\t\tthis._subscriptionManager = new SubscriptionManager(this, this._wss, this._serverConfig);\n\t\tthis._methodManager = new MethodManager(this, this._serverConfig, this._clientDir);\n\t\tthis._cronManager = new CronManager(this);\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('End Managers');\n\t\t}\n\n\t\tthis.listen();\n\t}\n\n\tprivate setUpPassport(): void {\n\t\tif (Users) {\n\t\t\t// Set up login passort\n\t\t\tthis._app.use(passport.initialize());\n\n\t\t\t// Start user authentication\n\t\t\tpassport.use(new passportlocal.Strategy(Users.authenticateStrategy()));\n\t\t\tpassport.serializeUser(Users.serializeUser());\n\t\t\tpassport.deserializeUser(Users.deserializeUser());\n\t\t}\n\t\telse {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.setUpPassport();\n\t\t\t}, 1);\n\t\t}\n\t}\n\n\n\t// Listen to port for websocket\n\tprivate listen(): void {\n\t\tthis._server.listen(this._port, () => {\n\t\t\tconsole.log('Running server on port %s', this._port);\n\t\t});\n\n\t\t// On websocket connection (already verified)\n\t\tthis._wss.on('connection', (ws, req) => {\n\n\t\t\t// Get user from token\n\t\t\tws['id_user'] = req['id_user'];\n\t\t\tws['user'] = req['user'];\n\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\tws['doc_user'] = req['doc_user'];\n\t\t\tws['id_socket'] = uuid();\n\t\t\tws['retryCnt'] = 0;\n\n\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\tconsole.log('Connection from: ' + req['user']);\n\t\t\t}\n\t\t\t\n\t\t\t// Use for keeping connection alive (ping/pong)\n\t\t\tws['isAlive'] = true;\n\t\t\tws.on('pong', () => {\n\t\t\t\tws['isAlive'] = true;\n\t\t\t\tws['pongTime'] = new Date();\n\t\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\t});\n\n\t\t\tws['versionTimer'] = setTimeout(() => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t}, 10000);\n\n\t\t\t// On data received (message)\n\t\t\tws.on('message', async (message: string) => {\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Message from: ' + ws['user'], message);\n\t\t\t\t}\n\n\t\t\t\tlet parseErrorFound = false;\n\n\t\t\t\tlet socketData = [];\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tconsole.log('Error - JSON.parse', message);\n\t\t\t\t\t\n\t\t\t\t\tthis._methodManager.sendEmail('dev@resolveio.com', 'SERVER - JSON Parse Error - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([message, e]));\n\n\t\t\t\t\tparseErrorFound = true;\n\t\t\t\t}\n\n\t\t\t\tif (!parseErrorFound) {\n\t\t\t\t\tif (socketData[0] === 'ping') {\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tws.send('pong', (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tconsole.log('Error on WS: ', error);\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet messageRoute = socketData[0];\n\n\t\t\t\t\tif (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) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet messageDate = socketData[1];\n\t\t\t\t\tlet messageId = socketData[2]\n\t\t\t\t\tlet type = socketData[3]\n\n\t\t\t\t\tif (type === 'subscription') {\n\t\t\t\t\t\tlet subType = socketData[4];\n\t\t\t\t\t\tlet pub = socketData[5];\n\t\t\n\t\t\t\t\t\t// Subscribe\n\t\t\t\t\t\tif (subType === 'sub') {\n\t\t\t\t\t\t\tthis._subscriptionManager.subscribe(messageDate, ws, messageId, pub, ...socketData.slice(6));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Unsubscribe\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis._subscriptionManager.unsubscribe(messageDate, ws, messageId, pub, ...socketData.slice(6));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._msgQueue.splice(0, 0, {\n\t\t\t\t\t\t\tws: ws,\n\t\t\t\t\t\t\tdata: socketData\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tws.on('close', () => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t});\n\n\t\t\tws.on('error', error => {\n\t\t\t\tconsole.log(error);\n\t\t\t\t\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t});\n\t\t});\n\n\t\t// Keep alive timer to ping/pong\n\t\tsetInterval(() => {\n\t\t\tthis._wss.clients.forEach((ws: WebSocket) => {\n\t\t\t\tif (ws['isAlive'] === false) {\n\t\t\t\t\tws['retryCnt']++;\n\n\t\t\t\t\tif (ws['retryCnt'] >= 60) {\n\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\tws.ping(() => {});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\tws['isAlive'] = false;\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.ping(() => {});\n\t\t\t\t}\n\t\t\t});\n\t\t}, 15000);\n\n\t\tsetInterval(async () => {\n\t\t\t// console.log(data);\n\n\t\t\tif (!this._msgQueueRunning) {\n\t\t\t\tthis._msgQueueRunning = true;\n\t\t\t\t\n\t\t\t\tfor (let i = this._msgQueue.length - 1; i >= 0; i--) {\n\t\t\t\t\tlet msg = this._msgQueue.pop();\n\t\t\t\t\tlet data = msg.data;\n\t\t\t\t\tlet ws = msg.ws;\n\t\t\n\t\t\t\t\tlet messageRoute: string = data.shift();\n\t\t\t\t\tlet messageDate: Date = data.shift();\n\t\t\t\t\tlet messageId: number = data.shift();\n\t\t\t\t\tlet type: string = data.shift();\n\t\t\n\t\t\t\t\t// Method call\n\t\t\t\t\tif (type === 'method') {\n\t\t\t\t\t\tlet method = data.shift();\n\t\t\n\t\t\t\t\t\tif (method === 'setWSAppVersion') {\n\t\t\t\t\t\t\tclearTimeout(ws['versionTimer']);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (ws['user_readonly']) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet methodLatencyId = objectIdHexString();\n\n\t\t\t\t\t\tLogMethodLatencies.create({\n\t\t\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\t\t\tdate_end: null,\n\t\t\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\t\t\tmethod: method\n\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'setWSAppVersion' && method !== 'getDrivers') {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\tdata: 'ACK'\n\t\t\t\t\t\t};\n\t\t\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tws.send(JSON.stringify(serverRes), (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tconsole.log('Error on WS: ', error);\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\n\t\t\t\t\t\t\tlet query: any = {$and: [\n\t\t\t\t\t\t\t\t{id_user: ws['id_user']}, \n\t\t\t\t\t\t\t\t{message_id: messageId},\n\t\t\t\t\t\t\t\t{date: messageDate}\n\t\t\t\t\t\t\t]};\n\t\t\n\t\t\t\t\t\t\tif (method !== 'updateDocumentOffline' && method !== 'updateDocumentPropsOffline') {\n\t\t\t\t\t\t\t\tquery.$and.push({method: method});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tif (method === 'updateDocumentOffline') {\n\t\t\t\t\t\t\t\t\tquery.$and.push({\n\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t{method: method},\n\t\t\t\t\t\t\t\t\t\t\t{method: 'updateDocument'}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (method === 'updateDocumentPropsOffline') {\n\t\t\t\t\t\t\t\t\tquery.$and.push({\n\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t{method: method},\n\t\t\t\t\t\t\t\t\t\t\t{method: 'updateDocumentProps'}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tlet methodCall = await MethodCalls.findOne(query);\n\t\t\n\t\t\t\t\t\t\tif (!methodCall) {\n\t\t\t\t\t\t\t\tMethodCalls.create({\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\t\t\t\tmessage_id: messageId,\n\t\t\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\t\t\tdate: messageDate\n\t\t\t\t\t\t\t\t});\n\t\t\t\n\t\t\t\t\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\t\t\t\t\tthis._methodManager.callMethod(methodLatencyId, ws, messageDate, messageId, method, ...data);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tconsole.log('Could not find method: ' + method);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tMethodResponses.findOne({$and: [\n\t\t\t\t\t\t\t\t\t{id_user: ws['id_user']}, \n\t\t\t\t\t\t\t\t\t{message_id: messageId},\n\t\t\t\t\t\t\t\t\t{method: method},\n\t\t\t\t\t\t\t\t\t{date: messageDate}\n\t\t\t\t\t\t\t\t]}).then(res => {\n\t\t\t\t\t\t\t\t\tif (res) {\n\t\t\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\t\t\tws.send(JSON.stringify(res.response), (error) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconsole.log('Error on WS: ', error);\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}, err => {});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tconsole.log('Could not find method: ' + method);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (type === 'methodResponse') {\n\t\t\t\t\t\tlet method = data.shift();\n\t\t\n\t\t\t\t\t\tMethodResponses.findOne({$and: [\n\t\t\t\t\t\t\t{id_user: ws['id_user']}, \n\t\t\t\t\t\t\t{message_id: messageId},\n\t\t\t\t\t\t\t{method: method},\n\t\t\t\t\t\t\t{date: messageDate}\n\t\t\t\t\t\t]}).then(res => {\n\t\t\t\t\t\t\tif (res) {\n\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\tws.send(JSON.stringify(res.response), (error) => {\n\t\t\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.log('Error on WS: ', error);\n\t\t\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._msgQueueRunning = false;\n\t\t\t}\n\t\t}, 10);\n\t}\n\n\tpublic unsubscribeWS(ws: WebSocket) {\n\t\tthis._subscriptionManager.unsubscribeAll(ws);\n\t}\n\n\tpublic getApp() {\n\t\treturn this._app;\n\t}\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/server-app.ts"],"names":[],"mappings":"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","file":"server-app.js","sourcesContent":["import { createServer, Server } from 'http';\nimport * as express from 'express';\nimport * as bodyParser from 'body-parser';\nimport * as xmlParser from 'express-xml-bodyparser';\nimport * as passport from 'passport';\nimport * as passportlocal from 'passport-local';\nimport * as WebSocket from 'ws';\nimport * as jwt from 'jsonwebtoken';\nimport * as uuid from 'uuid/v4';\nimport * as SegfaultHandler from 'segfault-handler';\nimport * as moment from 'moment';\n\nimport { dateReviver, getBinarySize, deepCopy } from './util/common';\n\nimport { objectIdHexString } from './managers/mongo.manager';\nimport { CronManager } from './managers/cron.manager';\nimport { MethodManager } from './managers/method.manager';\nimport { SubscriptionManager } from './managers/subscription.manager';\nimport { MonitorManager } from './managers/monitor.manager';\n\nimport { ServerResponseModel } from './models/server-response.model';\n\nimport { MethodCalls } from './collections/method-call.collection';\nimport { MethodResponses } from './collections/method-response.collection';\nimport { Logs } from './collections/log.collection';\nimport { LogMethodLatencies } from './collections/log-method-latency.collection';\nimport { Users } from './collections/user.collection';\n\nimport { setupHomeRoutes } from './http/home';\nimport { setupAuthRoutes } from './http/auth';\nimport { setupHealthRoutes } from './http/health';\n\nexport default class ResolveIOMainServer {\n\tprivate _app: express.Application;\n\tprivate _server: Server;\n\tprivate _port: string | number;\n\tprivate _wss: WebSocket.Server;\n\tprivate _serverConfig;\n\tprivate _clientDir;\n\tprivate _msgQueue = [];\n\tprivate _msgQueueRunning = false;\n\tpublic sesMail = false;\n\tprivate standardProgram = false;\n\n\tprivate LOGGER = 'ERROR'; //ERROR / DEBUG\n\n\tprivate _monitorManager: MonitorManager;\n\tprivate _subscriptionManager: SubscriptionManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _cronManager: CronManager;\n\tprivate _clientRoutes: string[] = [];\n\n\tprivate _serverStartTime: Date;\n\tprivate _lastErrorMsg: Date = null;\n\n\tconstructor(mainServer, monitorAgent, serverConfig, clientRoutes, clientDir, sesMail, standardProgram) {\n\t\tthis._serverConfig = serverConfig;\n\t\tthis._clientRoutes = clientRoutes;\n\t\tthis._clientDir = clientDir;\n\t\tthis.sesMail = sesMail;\n\t\tthis.standardProgram = standardProgram;\n\n\t\tthis._serverStartTime = new Date();\n\t\tthis._lastErrorMsg = null;\n\t\t\n\t\tif (serverConfig['ROOT_URL'] !== 'http://localhost:4200') {\n\t\t\tthis._monitorManager = new MonitorManager(mainServer, monitorAgent, serverConfig);\n\t\t}\n\n\t\tprocess.on('unhandledRejection', async (error, rej) => {\n\t\t\t// console.error('Unhandled Rejection at Promise', [error, rej]);\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (error && error['name'] === 'MongoError' && error['message'] === 'not master') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait 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));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error && error['name'] === 'MongoError' && error['message'] === 'not master and slaveOk=false') {\n\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t}, 60000);\n\n\t\t\t\t\tawait 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));\n\t\t\t\t}\n\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\telse if (error) {\n\t\t\t\tif (error['name'] !== 'StatusError' && error['message'] !== '') {\n\t\t\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t\t\t}, 60000);\n\n\t\t\t\t\t\tthis._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Rejection - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tprocess.on('uncaughtException', async error => {\n\t\t\tconsole.error(error, 'Uncaught Exception thrown');\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tthis._lastErrorMsg = new Date();\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._lastErrorMsg = null;\n\t\t\t\t}, 60000);\n\t\t\t\t\n\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Unhandled Exception - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([error['name'], error['message'], error['stack']], null, 2));\n\t\t\t}\n\n\t\t\tprocess.exit(1);\n\t\t});\n\n\t\tSegfaultHandler.registerHandler('crash.log', async (signal, address, stack) => {\n\t\t\t// Do what you want with the signal, address, or stack (array)\n\t\t\t// This callback will execute before the signal is forwarded on.\n\n\t\t\tconsole.log('Segment Fault Detected');\n\t\t\tconsole.log('Signal', JSON.stringify(signal, null, 2));\n\t\t\tconsole.log('Address', JSON.stringify(address, null, 2));\n\t\t\tconsole.log('Stack', JSON.stringify(stack, null, 2));\n\n\t\t\tlet diffTimeSec = moment().diff(this._serverStartTime, 'seconds');\n\n\t\t\tif (diffTimeSec > 60 && !this._lastErrorMsg) {\n\t\t\t\tawait this._methodManager.sendEmail('dev@resolveio.com', 'SERVER - Segfault - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([signal, address, stack], null, 2));\n\t\t\t}\n\n\t\t\tprocess.exit(1);\n\t\t});\n\n\t\t//SegfaultHandler.causeSegfault(); // simulates a buggy native module that dereferences NULL\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Starting ResolveIO Server');\n\t\t}\n\n\t\t// Start express app\n\t\tthis._app = express();\n\n\t\t// Use body parser for http call (login)\n\t\tthis._app.use(bodyParser.json({limit: '50mb', reviver: dateReviver}));\n\t\tthis._app.use(bodyParser.urlencoded({limit: '50mb', extended: true, parameterLimit: 1000000 }));\n\t\tthis._app.use(xmlParser());\n\t\t\n\t\t// Set port\n\t\tthis._port = process.env.PORT || serverConfig['PORT'];\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup ports');\n\t\t}\n\n\t\t// Create http server and websock server\n\t\tthis.createServer();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Create server');\n\t\t}\n\t\t\n\t\t// Set CORS\n\t\tthis._app.use(function (req, res, next) {\n\n\t\t\t// Website you wish to allow to connect\n\t\t\t// res.setHeader('Access-Control-Allow-Origin', serverConfig['ROOT_URL']);\n\t\t\tres.setHeader('Access-Control-Allow-Origin', '*');\n\t\t\n\t\t\t// Request methods you wish to allow\n\t\t\t// res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');\n\t\t\tres.setHeader('Access-Control-Allow-Methods', 'GET, POST');\n\t\t\n\t\t\t// Request headers you wish to allow\n\t\t\tres.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\t\t\n\t\t\t// Set to true if you need the website to include cookies in the requests sent\n\t\t\t// to the API (e.g. in case you use sessions)\n\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'false');\n\t\t\n\t\t\t// Pass to next layer of middleware\n\t\t\tnext();\n\t\t});\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup cors');\n\t\t}\n\n\t\t// Set up http login route\n\t\tsetupAuthRoutes(this, this._app, serverConfig);\n\t\tsetupHealthRoutes(this._app, serverConfig);\n\n\t\tif (serverConfig['CLIENT_NAME'] === 'ResolveIO' || this.standardProgram) {\n\t\t\tsetupHomeRoutes(this, this._app, serverConfig);\n\t\t}\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Setup express routes');\n\t\t}\n\t}\n\n\tpublic getWS(id_ws: string) {\n\t\treturn Array.from(this._wss.clients).filter(a => a['id_socket'] === id_ws)[0];\n\t}\n\n\tpublic getWSList() {\n\t\tlet res = [];\n\n\t\tthis._wss.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_socket']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getWSUserList() {\n\t\tlet res = [];\n\n\t\tthis._wss.clients.forEach((ws: WebSocket) => {\n\t\t\tres.push(ws['id_user']);\n\t\t});\n\n\t\treturn res;\n\t}\n\n\tpublic getHTTPServer() {\n\t\treturn this._server;\n\t}\n\n\tpublic getCronManager() {\n\t\treturn this._cronManager;\n\t}\n\n\tpublic getMethodManager() {\n\t\treturn this._methodManager;\n\t}\n\n\tpublic getSubscriptionManager() {\n\t\treturn this._subscriptionManager;\n\t}\n\n\tpublic getMonitorManager() {\n\t\treturn this._monitorManager;\n\t}\n\n\tprivate createServer(): void {\n\t\t// Start express server\n\t\tthis._server = createServer(this._app);\n\t\tthis._server.keepAliveTimeout = 65000;\n\t\tthis._server.headersTimeout = 66000; // This should be bigger than `keepAliveTimeout + your server's expected response time`\n\n\t\t// Start websocket server\n\t\t// Verify client with token before opening socket\n\t\tthis._wss = new WebSocket.Server({ \n\t\t\tserver: this._server,\n\t\t\tverifyClient: async (info, cb) => {\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Verify Client', info, cb);\n\t\t\t\t}\n\n\t\t\t\tlet infoData = (<string>info.req.headers['sec-websocket-protocol']).split(/,/);\n\n\t\t\t\tif (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']) {\n\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (infoData[1]) { //app version\n\t\t\t\t\t\tlet token = infoData[0];\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tjwt.verify(token, this._serverConfig['JWT_SECRET'], async (err, decoded) => {\n\t\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\t\tcb(false, 401, 'Unauthorized');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tinfo.req['id_user'] = decoded['id_user'];\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tlet user = await Users.findById(decoded['id_user']);\n\t\t\t\t\t\t\t\t\t\tif (user) {\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user'] = user.fullname;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['user_readonly'] = user.readonly || false;\n\t\t\t\t\t\t\t\t\t\t\tinfo.req['doc_user'] = user;\n\t\t\t\t\t\t\t\t\t\t\tcb(true);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\t\t\t\t\tcb(false);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcb(false, 401, 'Invalid Version');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Start MongoDB Connection\n\t\tthis.setUpMongo();\n\t}\n\n\tprivate setUpMongo() {\n\t\tthis.setUpPassport();\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('Start Managers');\n\t\t}\n\n\t\t// Start Managers\n\t\tthis._subscriptionManager = new SubscriptionManager(this, this._wss, this._serverConfig);\n\t\tthis._methodManager = new MethodManager(this, this._serverConfig, this._clientDir);\n\t\tthis._cronManager = new CronManager(this);\n\n\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\tconsole.log('End Managers');\n\t\t}\n\n\t\tthis.listen();\n\t}\n\n\tprivate setUpPassport(): void {\n\t\tif (Users) {\n\t\t\t// Set up login passort\n\t\t\tthis._app.use(passport.initialize());\n\n\t\t\t// Start user authentication\n\t\t\tpassport.use(new passportlocal.Strategy(Users.authenticateStrategy()));\n\t\t\tpassport.serializeUser(Users.serializeUser());\n\t\t\tpassport.deserializeUser(Users.deserializeUser());\n\t\t}\n\t\telse {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.setUpPassport();\n\t\t\t}, 1);\n\t\t}\n\t}\n\n\n\t// Listen to port for websocket\n\tprivate listen(): void {\n\t\tthis._server.listen(this._port, () => {\n\t\t\tconsole.log('Running server on port %s', this._port);\n\t\t});\n\n\t\t// On websocket connection (already verified)\n\t\tthis._wss.on('connection', (ws, req) => {\n\n\t\t\t// Get user from token\n\t\t\tws['id_user'] = req['id_user'];\n\t\t\tws['user'] = req['user'];\n\t\t\tws['user_readonly'] = req['user_readonly'];\n\t\t\tws['doc_user'] = req['doc_user'];\n\t\t\tws['id_socket'] = uuid();\n\t\t\tws['retryCnt'] = 0;\n\n\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\tconsole.log('Connection from: ' + req['user']);\n\t\t\t}\n\t\t\t\n\t\t\t// Use for keeping connection alive (ping/pong)\n\t\t\tws['isAlive'] = true;\n\t\t\tws.on('pong', () => {\n\t\t\t\tws['isAlive'] = true;\n\t\t\t\tws['pongTime'] = new Date();\n\t\t\t\tws['latency'] = moment.duration(moment(ws['pongTime']).diff(ws['pingTime'])).asMilliseconds();\n\t\t\t\tthis._subscriptionManager.loggedInLatency(ws);\n\t\t\t});\n\n\t\t\tws['versionTimer'] = setTimeout(() => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t}, 10000);\n\n\t\t\t// On data received (message)\n\t\t\tws.on('message', async (message: string) => {\n\t\t\t\tif (this.LOGGER === 'DEBUG') {\n\t\t\t\t\tconsole.log('Message from: ' + ws['user'], message);\n\t\t\t\t}\n\n\t\t\t\tlet parseErrorFound = false;\n\n\t\t\t\tlet socketData = [];\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tsocketData = JSON.parse(message, dateReviver);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tconsole.log('Error - JSON.parse', message);\n\t\t\t\t\t\n\t\t\t\t\tthis._methodManager.sendEmail('dev@resolveio.com', 'SERVER - JSON Parse Error - ' + this._serverConfig['CLIENT_NAME'], JSON.stringify([message, e]));\n\n\t\t\t\t\tparseErrorFound = true;\n\t\t\t\t}\n\n\t\t\t\tif (!parseErrorFound) {\n\t\t\t\t\tif (socketData[0] === 'ping') {\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tws.send('pong', (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tconsole.log('Error on WS: ', error);\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet messageRoute = socketData[0];\n\n\t\t\t\t\tif (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) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tlet messageDate = socketData[1];\n\t\t\t\t\tlet messageId = socketData[2]\n\t\t\t\t\tlet type = socketData[3]\n\n\t\t\t\t\tif (type === 'subscription') {\n\t\t\t\t\t\tlet subType = socketData[4];\n\t\t\t\t\t\tlet pub = socketData[5];\n\t\t\n\t\t\t\t\t\t// Subscribe\n\t\t\t\t\t\tif (subType === 'sub') {\n\t\t\t\t\t\t\tthis._subscriptionManager.subscribe(messageDate, ws, messageId, pub, ...socketData.slice(6));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Unsubscribe\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis._subscriptionManager.unsubscribe(messageDate, ws, messageId, pub, ...socketData.slice(6));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._msgQueue.splice(0, 0, {\n\t\t\t\t\t\t\tws: ws,\n\t\t\t\t\t\t\tdata: socketData\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tws.on('close', () => {\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t});\n\n\t\t\tws.on('error', error => {\n\t\t\t\tconsole.log(error);\n\t\t\t\t\n\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t});\n\t\t});\n\n\t\t// Keep alive timer to ping/pong\n\t\tsetInterval(() => {\n\t\t\tthis._wss.clients.forEach((ws: WebSocket) => {\n\t\t\t\tif (ws['isAlive'] === false) {\n\t\t\t\t\tws['retryCnt']++;\n\n\t\t\t\t\tif (ws['retryCnt'] >= 60) {\n\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\t\tws.ping(() => {});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tws['retryCnt'] = 0;\n\t\t\t\t\tws['isAlive'] = false;\n\t\t\t\t\tws['pingTime'] = new Date();\n\t\t\t\t\tws.ping(() => {});\n\t\t\t\t}\n\t\t\t});\n\t\t}, 15000);\n\n\t\tsetInterval(async () => {\n\t\t\t// console.log(data);\n\n\t\t\tif (!this._msgQueueRunning) {\n\t\t\t\tthis._msgQueueRunning = true;\n\t\t\t\t\n\t\t\t\tfor (let i = this._msgQueue.length - 1; i >= 0; i--) {\n\t\t\t\t\tlet msg = this._msgQueue.pop();\n\t\t\t\t\tlet data = msg.data;\n\t\t\t\t\tlet ws = msg.ws;\n\t\t\n\t\t\t\t\tlet messageRoute: string = data.shift();\n\t\t\t\t\tlet messageDate: Date = data.shift();\n\t\t\t\t\tlet messageId: number = data.shift();\n\t\t\t\t\tlet type: string = data.shift();\n\t\t\n\t\t\t\t\t// Method call\n\t\t\t\t\tif (type === 'method') {\n\t\t\t\t\t\tlet method = data.shift();\n\t\t\n\t\t\t\t\t\tif (method === 'setWSAppVersion') {\n\t\t\t\t\t\t\tclearTimeout(ws['versionTimer']);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (ws['user_readonly']) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet methodLatencyId = objectIdHexString();\n\n\t\t\t\t\t\tLogMethodLatencies.create({\n\t\t\t\t\t\t\t_id: methodLatencyId,\n\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\tdate_start: new Date(),\n\t\t\t\t\t\t\tdate_end: null,\n\t\t\t\t\t\t\tlatency_ms: 0,\n\t\t\t\t\t\t\tmethod: method\n\t\t\t\t\t\t});\n\t\t\n\t\t\t\t\t\tif (method !== 'reportBuilderGetResults' && method !== 'reportBuilderGetDistinctValue' && method !== 'reportBuilderBuildTree' && method !== 'generatePDF' && method !== 'getWOOfflineData' && method !== 'countQuery' && method !== 'countWithQuery' && method !== 'countCollectionWithQuery' && method !== 'find' && method !== 'findOne' && method !== 'findWithOptions' && method !== 'setWSAppVersion' && method !== 'getDrivers') {\n\t\t\t\t\t\t\tLogs.insertOne({\n\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\ttype: 'client-request',\n\t\t\t\t\t\t\t\tcollection: '',\n\t\t\t\t\t\t\t\tid_document: '',\n\t\t\t\t\t\t\t\tpayload: getBinarySize(JSON.stringify(data)) < 200000 ? JSON.stringify(data, null, 2) : 'Too Big',\n\t\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\t\t\t\t\tuser: ws['user'] || '',\n\t\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\t\troute: messageRoute\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\t\thasError: false,\n\t\t\t\t\t\t\tdata: 'ACK'\n\t\t\t\t\t\t};\n\t\t\n\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\tws.send(JSON.stringify(serverRes), (error) => {\n\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\tconsole.log('Error on WS: ', error);\n\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\n\t\t\t\t\t\t\tlet query: any = {$and: [\n\t\t\t\t\t\t\t\t{id_user: ws['id_user']}, \n\t\t\t\t\t\t\t\t{message_id: messageId},\n\t\t\t\t\t\t\t\t{date: messageDate}\n\t\t\t\t\t\t\t]};\n\t\t\n\t\t\t\t\t\t\tif (method !== 'updateDocumentOffline' && method !== 'updateDocumentPropsOffline') {\n\t\t\t\t\t\t\t\tquery.$and.push({method: method});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tif (method === 'updateDocumentOffline') {\n\t\t\t\t\t\t\t\t\tquery.$and.push({\n\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t{method: method},\n\t\t\t\t\t\t\t\t\t\t\t{method: 'updateDocument'}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (method === 'updateDocumentPropsOffline') {\n\t\t\t\t\t\t\t\t\tquery.$and.push({\n\t\t\t\t\t\t\t\t\t\t$or: [\n\t\t\t\t\t\t\t\t\t\t\t{method: method},\n\t\t\t\t\t\t\t\t\t\t\t{method: 'updateDocumentProps'}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\n\t\t\t\t\t\t\tlet methodCall = await MethodCalls.findOne(query);\n\t\t\n\t\t\t\t\t\t\tif (!methodCall) {\n\t\t\t\t\t\t\t\tMethodCalls.create({\n\t\t\t\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\t\t\t\tid_user: ws['id_user'],\n\t\t\t\t\t\t\t\t\tmessage_id: messageId,\n\t\t\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\t\t\tdate: messageDate\n\t\t\t\t\t\t\t\t});\n\t\t\t\n\t\t\t\t\t\t\t\tif (this._methodManager._methods[method]) {\n\t\t\t\t\t\t\t\t\tthis._methodManager.callMethod(methodLatencyId, ws, messageDate, messageId, method, ...data);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tconsole.log('Could not find method: ' + method);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tMethodResponses.findOne({$and: [\n\t\t\t\t\t\t\t\t\t{id_user: ws['id_user']}, \n\t\t\t\t\t\t\t\t\t{message_id: messageId},\n\t\t\t\t\t\t\t\t\t{method: method},\n\t\t\t\t\t\t\t\t\t{date: messageDate}\n\t\t\t\t\t\t\t\t]}).then(res => {\n\t\t\t\t\t\t\t\t\tif (res) {\n\t\t\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\t\t\tws.send(JSON.stringify(res.response), (error) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconsole.log('Error on WS: ', error);\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}, err => {});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tconsole.log('Could not find method: ' + method);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (type === 'methodResponse') {\n\t\t\t\t\t\tlet method = data.shift();\n\t\t\n\t\t\t\t\t\tMethodResponses.findOne({$and: [\n\t\t\t\t\t\t\t{id_user: ws['id_user']}, \n\t\t\t\t\t\t\t{message_id: messageId},\n\t\t\t\t\t\t\t{method: method},\n\t\t\t\t\t\t\t{date: messageDate}\n\t\t\t\t\t\t]}).then(res => {\n\t\t\t\t\t\t\tif (res) {\n\t\t\t\t\t\t\t\tif (ws && ws.readyState === ws.OPEN) {\n\t\t\t\t\t\t\t\t\tws.send(JSON.stringify(res.response), (error) => {\n\t\t\t\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.log('Error on WS: ', error);\n\t\t\t\t\t\t\t\t\t\t\tthis.unsubscribeWS(ws);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, err => {});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._msgQueueRunning = false;\n\t\t\t}\n\t\t}, 10);\n\t}\n\n\tpublic unsubscribeWS(ws: WebSocket) {\n\t\tthis._subscriptionManager.unsubscribeAll(ws);\n\t}\n\n\tpublic getApp() {\n\t\treturn this._app;\n\t}\n}"]}
|