@resolveio/server-lib 20.5.7 → 20.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LocalLogManager=void 0;var fs=require("fs"),resolveio_server_app_1=require("../resolveio-server-app"),LocalLogManager=function(){function LocalLogManager(){"https://resolveio.com"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||"http://localhost:4200"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||fs.existsSync("~/resolveio/logs")||fs.mkdirSync("~/resolveio/logs"),this._logFilePath="~/resolveio/logs/local-logs.jsonl"}return LocalLogManager.prototype.writeLog=function(e){try{var o=JSON.stringify(e)+"\n";fs.appendFileSync(this._logFilePath,o,{encoding:"utf8"})}catch(e){console.error(new Date,"LocalLogManager","Failed to write log to file:",e)}},LocalLogManager.prototype.writeLogs=function(e){if(e&&0!==e.length)try{var o=e.map(function(e){return JSON.stringify(e)}).join("\n")+"\n";fs.appendFileSync(this._logFilePath,o,{encoding:"utf8"})}catch(e){console.error(new Date,"LocalLogManager","Failed to write logs batch:",e)}},LocalLogManager.prototype.offloadLogs=function(){var e=[];try{if(!fs.existsSync(this._logFilePath))return e;var o=fs.readFileSync(this._logFilePath,"utf8");if(0===o.trim().length)return e;e=o.split("\n").filter(function(e){return""!==e.trim()}),fs.writeFileSync(this._logFilePath,"")}catch(e){console.error(new Date,"LocalLogManager","Failed to offload logs:",e)}return e},LocalLogManager}();exports.LocalLogManager=LocalLogManager;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LocalLogManager=void 0;var fs=require("fs"),resolveio_server_app_1=require("../resolveio-server-app"),LocalLogManager=function(){function LocalLogManager(){"https://resolveio.com"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||"http://localhost:4200"===resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||fs.existsSync("/home/ubuntu/resolveio/logs")||fs.mkdirSync("/home/ubuntu/resolveio/logs"),this._logFilePath="/home/ubuntu/resolveio/logs/local-logs.jsonl"}return LocalLogManager.prototype.writeLog=function(e){try{var o=JSON.stringify(e)+"\n";fs.appendFileSync(this._logFilePath,o,{encoding:"utf8"})}catch(e){console.error(new Date,"LocalLogManager","Failed to write log to file:",e)}},LocalLogManager.prototype.writeLogs=function(e){if(e&&0!==e.length)try{var o=e.map(function(e){return JSON.stringify(e)}).join("\n")+"\n";fs.appendFileSync(this._logFilePath,o,{encoding:"utf8"})}catch(e){console.error(new Date,"LocalLogManager","Failed to write logs batch:",e)}},LocalLogManager.prototype.offloadLogs=function(){var e=[];try{if(!fs.existsSync(this._logFilePath))return e;var o=fs.readFileSync(this._logFilePath,"utf8");if(0===o.trim().length)return e;e=o.split("\n").filter(function(e){return""!==e.trim()}),fs.writeFileSync(this._logFilePath,"")}catch(e){console.error(new Date,"LocalLogManager","Failed to offload logs:",e)}return e},LocalLogManager}();exports.LocalLogManager=LocalLogManager;
2
2
  //# sourceMappingURL=local-log.manager.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/local-log.manager.ts"],"names":["fs","require","resolveio_server_app_1","LocalLogManager","ResolveIOServer","getServerConfig","existsSync","mkdirSync","this","_logFilePath","prototype","writeLog","logEntry","line","JSON","stringify","appendFileSync","encoding","err","console","error","Date","writeLogs","items","length","lines","map","item","join","offloadLogs","result","fileData","readFileSync","trim","split","filter","l","writeFileSync","exports"],"mappings":"mGAGA,IAAAA,GAAAC,QAAA,IAAA,EACAC,uBAAAD,QAAA,yBAAA,EAeAE,gBAAA,WAGC,SAAAA,kBAEoD,0BAAlDD,uBAAAE,gBAAgBC,gBAAe,EAAa,UACS,0BAAlDH,uBAAAE,gBAAgBC,gBAAe,EAAa,UAE1CL,GAAGM,WAAW,kBAAkB,GACpCN,GAAGO,UAAU,kBAAkB,EAIjCC,KAAKC,aAAe,mCACrB,CAwDD,OArDQN,gBAAAO,UAAAC,SAAP,SAAgBC,GACf,IACC,IAAIC,EAAOC,KAAKC,UAAUH,CAAQ,EAAI,KACtCZ,GAAGgB,eAAeR,KAAKC,aAAcI,EAAM,CAAEI,SAAU,MAAM,CAAE,C,CAEhE,MAAMC,GAELC,QAAQC,MAAM,IAAIC,KAAQ,kBAAmB,+BAAgCH,CAAG,C,CAElF,EAEOf,gBAAAO,UAAAY,UAAP,SAAiBC,GAChB,GAAKA,GAA0B,IAAjBA,EAAMC,OAIpB,IAEC,IAAIC,EAAQF,EAAMG,IAAI,SAAAC,GAAQ,OAAAb,KAAKC,UAAUY,CAAI,CAAnB,CAAoB,EAAEC,KAAK,IAAI,EAAI,KACjE5B,GAAGgB,eAAeR,KAAKC,aAAcgB,EAAO,CAAER,SAAU,MAAM,CAAE,C,CAEjE,MAAOC,GACNC,QAAQC,MAAM,IAAIC,KAAQ,kBAAmB,8BAA+BH,CAAG,C,CAEjF,EAKOf,gBAAAO,UAAAmB,YAAP,WACC,IAAIC,EAAS,GAEb,IACC,GAAI,CAAC9B,GAAGM,WAAWE,KAAKC,YAAY,EACnC,OAAOqB,EAGR,IAAIC,EAAW/B,GAAGgC,aAAaxB,KAAKC,aAAc,MAAM,EACxD,GAA+B,IAA3BsB,EAASE,KAAI,EAAGT,OACnB,OAAOM,EAGRA,EAASC,EAASG,MAAM,IAAI,EAAEC,OAAO,SAAAC,GAAK,MAAa,KAAbA,EAAEH,KAAI,CAAN,CAAe,EAGzDjC,GAAGqC,cAAc7B,KAAKC,aAAc,EAAE,C,CAEvC,MAAMS,GACLC,QAAQC,MAAM,IAAIC,KAAQ,kBAAmB,0BAA2BH,CAAG,C,CAG5E,OAAOY,CACR,EACD3B,eAAA,EAAC,EAtEYmC,QAAAnC,gBAAAA","file":"local-log.manager.js","sourcesContent":["/***************\nlocal-logs.manager.ts\n****************/\nimport * as fs from 'fs';\nimport { ResolveIOServer } from '../resolveio-server-app';\n\nexport type LocalLogType = 'monitor-mongo' \n\t| 'monitor-memory'\n\t| 'monitor-cpu'\n\t| 'log'\n\t| 'log-method-latency'\n\t| 'log-subscription';\n\nexport interface LocalLogModel {\n\ttype: LocalLogType;\n\tdate: Date;\n\tdata: any;\n}\n\nexport class LocalLogManager {\n\tprivate _logFilePath: string;\n\n\tconstructor() {\n\t\tif (\n\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t) {\n\t\t\tif (!fs.existsSync('~/resolveio/logs')) {\n\t\t\t\tfs.mkdirSync('~/resolveio/logs');\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis._logFilePath = '~/resolveio/logs/local-logs.jsonl';\n\t}\n\n\t// Internal method to append a JSON line to the file\n\tpublic writeLog(logEntry: LocalLogModel): void {\n\t\ttry {\n\t\t\tlet line = JSON.stringify(logEntry) + '\\n';\n\t\t\tfs.appendFileSync(this._logFilePath, line, { encoding: 'utf8' });\n\t\t}\n\t\tcatch(err) {\n\t\t\t// If there's an error writing logs, you might want to handle it or queue it\n\t\t\tconsole.error(new Date(), 'LocalLogManager', 'Failed to write log to file:', err);\n\t\t}\n\t}\n\n\tpublic writeLogs(items: LocalLogModel[]): void {\n\t\tif (!items || items.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Convert each item to a JSON string, add newline\n\t\t\tlet lines = items.map(item => JSON.stringify(item)).join('\\n') + '\\n';\n\t\t\tfs.appendFileSync(this._logFilePath, lines, { encoding: 'utf8' });\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error(new Date(), 'LocalLogManager', 'Failed to write logs batch:', err);\n\t\t}\n\t}\n\n\t/**\n\t * Reads all logs from disk, then empties the file.\n\t */\n\tpublic offloadLogs(): any[] {\n\t\tlet result = [];\n\n\t\ttry {\n\t\t\tif (!fs.existsSync(this._logFilePath)) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tlet fileData = fs.readFileSync(this._logFilePath, 'utf8');\n\t\t\tif (fileData.trim().length === 0) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tresult = fileData.split('\\n').filter(l => l.trim() !== '');\n\n\t\t\t// Truncate the file so we don't send logs more than once\n\t\t\tfs.writeFileSync(this._logFilePath, '');\n\t\t}\n\t\tcatch(err) {\n\t\t\tconsole.error(new Date(), 'LocalLogManager', 'Failed to offload logs:', err);\n\t\t}\n\n\t\treturn result;\n\t}\n}"]}
1
+ {"version":3,"sources":["../../src/managers/local-log.manager.ts"],"names":["fs","require","resolveio_server_app_1","LocalLogManager","ResolveIOServer","getServerConfig","existsSync","mkdirSync","this","_logFilePath","prototype","writeLog","logEntry","line","JSON","stringify","appendFileSync","encoding","err","console","error","Date","writeLogs","items","length","lines","map","item","join","offloadLogs","result","fileData","readFileSync","trim","split","filter","l","writeFileSync","exports"],"mappings":"mGAGA,IAAAA,GAAAC,QAAA,IAAA,EACAC,uBAAAD,QAAA,yBAAA,EAeAE,gBAAA,WAGC,SAAAA,kBAEoD,0BAAlDD,uBAAAE,gBAAgBC,gBAAe,EAAa,UACS,0BAAlDH,uBAAAE,gBAAgBC,gBAAe,EAAa,UAE1CL,GAAGM,WAAW,6BAA6B,GAC/CN,GAAGO,UAAU,6BAA6B,EAI5CC,KAAKC,aAAe,8CACrB,CAwDD,OArDQN,gBAAAO,UAAAC,SAAP,SAAgBC,GACf,IACC,IAAIC,EAAOC,KAAKC,UAAUH,CAAQ,EAAI,KACtCZ,GAAGgB,eAAeR,KAAKC,aAAcI,EAAM,CAAEI,SAAU,MAAM,CAAE,C,CAEhE,MAAMC,GAELC,QAAQC,MAAM,IAAIC,KAAQ,kBAAmB,+BAAgCH,CAAG,C,CAElF,EAEOf,gBAAAO,UAAAY,UAAP,SAAiBC,GAChB,GAAKA,GAA0B,IAAjBA,EAAMC,OAIpB,IAEC,IAAIC,EAAQF,EAAMG,IAAI,SAAAC,GAAQ,OAAAb,KAAKC,UAAUY,CAAI,CAAnB,CAAoB,EAAEC,KAAK,IAAI,EAAI,KACjE5B,GAAGgB,eAAeR,KAAKC,aAAcgB,EAAO,CAAER,SAAU,MAAM,CAAE,C,CAEjE,MAAOC,GACNC,QAAQC,MAAM,IAAIC,KAAQ,kBAAmB,8BAA+BH,CAAG,C,CAEjF,EAKOf,gBAAAO,UAAAmB,YAAP,WACC,IAAIC,EAAS,GAEb,IACC,GAAI,CAAC9B,GAAGM,WAAWE,KAAKC,YAAY,EACnC,OAAOqB,EAGR,IAAIC,EAAW/B,GAAGgC,aAAaxB,KAAKC,aAAc,MAAM,EACxD,GAA+B,IAA3BsB,EAASE,KAAI,EAAGT,OACnB,OAAOM,EAGRA,EAASC,EAASG,MAAM,IAAI,EAAEC,OAAO,SAAAC,GAAK,MAAa,KAAbA,EAAEH,KAAI,CAAN,CAAe,EAGzDjC,GAAGqC,cAAc7B,KAAKC,aAAc,EAAE,C,CAEvC,MAAMS,GACLC,QAAQC,MAAM,IAAIC,KAAQ,kBAAmB,0BAA2BH,CAAG,C,CAG5E,OAAOY,CACR,EACD3B,eAAA,EAAC,EAtEYmC,QAAAnC,gBAAAA","file":"local-log.manager.js","sourcesContent":["/***************\nlocal-logs.manager.ts\n****************/\nimport * as fs from 'fs';\nimport { ResolveIOServer } from '../resolveio-server-app';\n\nexport type LocalLogType = 'monitor-mongo' \n\t| 'monitor-memory'\n\t| 'monitor-cpu'\n\t| 'log'\n\t| 'log-method-latency'\n\t| 'log-subscription';\n\nexport interface LocalLogModel {\n\ttype: LocalLogType;\n\tdate: Date;\n\tdata: any;\n}\n\nexport class LocalLogManager {\n\tprivate _logFilePath: string;\n\n\tconstructor() {\n\t\tif (\n\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'https://resolveio.com'\n\t\t\t&& ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200'\n\t\t) {\n\t\t\tif (!fs.existsSync('/home/ubuntu/resolveio/logs')) {\n\t\t\t\tfs.mkdirSync('/home/ubuntu/resolveio/logs');\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis._logFilePath = '/home/ubuntu/resolveio/logs/local-logs.jsonl';\n\t}\n\n\t// Internal method to append a JSON line to the file\n\tpublic writeLog(logEntry: LocalLogModel): void {\n\t\ttry {\n\t\t\tlet line = JSON.stringify(logEntry) + '\\n';\n\t\t\tfs.appendFileSync(this._logFilePath, line, { encoding: 'utf8' });\n\t\t}\n\t\tcatch(err) {\n\t\t\t// If there's an error writing logs, you might want to handle it or queue it\n\t\t\tconsole.error(new Date(), 'LocalLogManager', 'Failed to write log to file:', err);\n\t\t}\n\t}\n\n\tpublic writeLogs(items: LocalLogModel[]): void {\n\t\tif (!items || items.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Convert each item to a JSON string, add newline\n\t\t\tlet lines = items.map(item => JSON.stringify(item)).join('\\n') + '\\n';\n\t\t\tfs.appendFileSync(this._logFilePath, lines, { encoding: 'utf8' });\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error(new Date(), 'LocalLogManager', 'Failed to write logs batch:', err);\n\t\t}\n\t}\n\n\t/**\n\t * Reads all logs from disk, then empties the file.\n\t */\n\tpublic offloadLogs(): any[] {\n\t\tlet result = [];\n\n\t\ttry {\n\t\t\tif (!fs.existsSync(this._logFilePath)) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tlet fileData = fs.readFileSync(this._logFilePath, 'utf8');\n\t\t\tif (fileData.trim().length === 0) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tresult = fileData.split('\\n').filter(l => l.trim() !== '');\n\n\t\t\t// Truncate the file so we don't send logs more than once\n\t\t\tfs.writeFileSync(this._logFilePath, '');\n\t\t}\n\t\tcatch(err) {\n\t\t\tconsole.error(new Date(), 'LocalLogManager', 'Failed to offload logs:', err);\n\t\t}\n\n\t\treturn result;\n\t}\n}"]}
@@ -23,6 +23,8 @@ export declare class MethodManager {
23
23
  private _debugCallMethodHits;
24
24
  private _debugCallMethodCronJobHits;
25
25
  private _debugSendQueueHits;
26
+ clientDir: string;
27
+ serverConfig: string;
26
28
  constructor(monitorManagerFunction: MonitorManagerFunction, isWorkersEnabled: any, isWorkerInstance: any);
27
29
  methods(method: MethodModel): void;
28
30
  callMethodCron(method: string, ...methodData: any[]): any;
@@ -1,2 +1,2 @@
1
- "use strict";var __assign=this&&this.__assign||function(){return(__assign=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)},__awaiter=this&&this.__awaiter||function(e,o,n,i){return new(n=n||Promise)(function(r,t){function fulfilled(e){try{step(i.next(e))}catch(e){t(e)}}function rejected(e){try{step(i.throw(e))}catch(e){t(e)}}function step(e){var t;e.done?r(e.value):((t=e.value)instanceof n?t:new n(function(e){e(t)})).then(fulfilled,rejected)}step((i=i.apply(e,o||[])).next())})},__generator=this&&this.__generator||function(o,n){var i,s,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},c={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function verb(r){return function(e){var t=[r,e];if(i)throw new TypeError("Generator is already executing.");for(;l=c&&t[c=0]?0:l;)try{if(i=1,s&&(a=2&t[0]?s.return:t[0]?s.throw||((a=s.return)&&a.call(s),0):s.next)&&!(a=a.call(s,t[1])).done)return a;switch(s=0,(t=a?[2&t[0],a.value]:t)[0]){case 0:case 1:a=t;break;case 4:return l.label++,{value:t[1],done:!1};case 5:l.label++,s=t[1],t=[0];continue;case 7:t=l.ops.pop(),l.trys.pop();continue;default:if(!(a=0<(a=l.trys).length&&a[a.length-1])&&(6===t[0]||2===t[0])){l=0;continue}if(3===t[0]&&(!a||t[1]>a[0]&&t[1]<a[3]))l.label=t[1];else if(6===t[0]&&l.label<a[1])l.label=a[1],a=t;else{if(!(a&&l.label<a[2])){a[2]&&l.ops.pop(),l.trys.pop();continue}l.label=a[2],l.ops.push(t)}}t=n.call(o,l)}catch(e){t=[6,e],s=0}finally{i=a=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}}},__read=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var o,n,i=r.call(e),s=[];try{for(;(void 0===t||0<t--)&&!(o=i.next()).done;)s.push(o.value)}catch(e){n={error:e}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return s},__spreadArray=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var o,n=0,i=t.length;n<i;n++)!o&&n in t||((o=o||Array.prototype.slice.call(t,0,n))[n]=t[n]);return e.concat(o||Array.prototype.slice.call(t))},__values=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,r=t&&e[t],o=0;if(r)return r.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&o>=e.length?void 0:e)&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},collections_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.MethodManager=exports.AWS=void 0,require("../methods/collections")),logs_1=require("../methods/logs"),counters_1=require("../methods/counters"),pdf_1=require("../methods/pdf"),aws_1=require("../methods/aws"),path=require("path"),fs=require("fs"),nodemailer=require("nodemailer"),sesTransport=require("nodemailer-ses-transport"),accounts_1=require("../methods/accounts"),init_1=require("../fixtures/init"),cron_jobs_1=require("../fixtures/cron-jobs"),cron_jobs_2=require("../methods/cron-jobs"),flags_1=require("../methods/flags"),common_1=require("../util/common"),log_collection_1=require("../collections/log.collection"),log_method_latency_collection_1=require("../collections/log-method-latency.collection"),moment=require("moment-timezone"),report_builder_1=require("../methods/report-builder"),support_1=require("../methods/support"),monitor_1=require("../methods/monitor"),email_history_collection_1=require("../collections/email-history.collection"),client_s3_1=require("@aws-sdk/client-s3"),worker_task_request_collection_1=require("../collections/worker-task-request.collection"),worker_task_response_collection_1=require("../collections/worker-task-response.collection"),flag_updates_1=require("../methods/flag-updates"),resolveio_server_app_1=require("../resolveio-server-app"),AWS=function(){function AWS(){this._s3=null,this._s3USEast1=null}return AWS.prototype.s3=function(){return this._s3||(this._s3=new client_s3_1.S3({credentials:{accessKeyId:process.env.AWS_ACCESS_KEY,secretAccessKey:process.env.AWS_SECRET_ACCESS_KEY},region:process.env.AWS_REGION,apiVersion:"2006-03-01"})),this._s3},AWS.prototype.s3USEast1=function(){return"us-east-1"===process.env.AWS_REGION?this.s3():(this._s3USEast1||(this._s3USEast1=new client_s3_1.S3({credentials:{accessKeyId:process.env.AWS_ACCESS_KEY,secretAccessKey:process.env.AWS_SECRET_ACCESS_KEY},region:"us-east-1",apiVersion:"2006-03-01"})),this._s3USEast1)},AWS}(),MethodManager=(exports.AWS=AWS,function(){function MethodManager(e,t,r){var o=this;this._methods={},this._isWorkersEnabled=!1,this._isWorkerInstance=!1,this.emailQueue=new Set,this.isEmailProcessing=!1,this._debugCallMethodInternalHits=0,this._debugCallMethodHits=0,this._debugCallMethodCronJobHits=0,this._debugSendQueueHits=0,this._websocketManager=resolveio_server_app_1.ResolveIOServer.getMainServer().getWebSocketManager(),this._monitorManagerFunction=e,this._isWorkersEnabled=t,this._isWorkerInstance=r,"false"!==process.env.IS_WORKERS_ENABLED&&("true"!==process.env.IS_WORKER_INSTANCE||"0"!==process.env.WORKER_INDEX)||process.env.NODE_APP_INSTANCE&&"0"!==process.env.NODE_APP_INSTANCE||setTimeout(function(){console.log(new Date,"Start Server Fixture"),(0,init_1.loadServerInit)(),console.log(new Date,"End Server Fixture")},5e3),(0,cron_jobs_1.loadServerCronJobs)(),(0,accounts_1.loadAccountMethods)(this),(0,aws_1.loadAWSMethods)(this),(0,collections_1.loadCollectionMethods)(this),(0,counters_1.loadCounterMethods)(this),(0,logs_1.loadLogMethods)(this),(0,pdf_1.loadPDFMethods)(this),(0,cron_jobs_2.loadCronJobMethods)(this),(0,flags_1.loadFlagMethods)(this),(0,flag_updates_1.loadFlagUpdatesMethods)(this),(0,report_builder_1.loadReportBuilderMethods)(this),(0,support_1.loadSupportMethods)(this),(0,monitor_1.loadMonitorMethods)(this),this._aws=new AWS,resolveio_server_app_1.ResolveIOServer.getSESMail()?this._mailer=nodemailer.createTransport(sesTransport({accessKeyId:process.env.AWS_ACCESS_KEY,secretAccessKey:process.env.AWS_SECRET_ACCESS_KEY,region:process.env.AWS_SES_REGION})):this._mailer=nodemailer.createTransport({host:resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_HOST,port:resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_PORT,secure:!1,auth:{user:resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_USERNAME,pass:resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_PASSWORD},tls:{ciphers:"SSLv3"}}),setInterval(function(){resolveio_server_app_1.ResolveIOServer.getMainServer().getSubscriptionManager()&&resolveio_server_app_1.ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()&&(console.log(new Date,"Method Manager","Send Queue Hits",o._debugSendQueueHits),console.log(new Date,"Method Manager","Call Method Internal Hits",o._debugCallMethodInternalHits),console.log(new Date,"Method Manager","Call Method Hits",o._debugCallMethodHits),console.log(new Date,"Method Manager","Call Method Cron Hits",o._debugCallMethodCronJobHits)),o._debugCallMethodInternalHits=0,o._debugCallMethodHits=0,o._debugCallMethodCronJobHits=0,o._debugSendQueueHits=0},6e4),this._isWorkersEnabled&&!this._isWorkerInstance||this.setupEmailWatcher()}return MethodManager.prototype.methods=function(e){this._methods=Object.assign(this._methods,e)},MethodManager.prototype.callMethodCron=function(t){for(var n=this,r=[],e=1;e<arguments.length;e++)r[e-1]=arguments[e];if(this._debugCallMethodCronJobHits+=1,this._methods[t]){if((1<r.length||r[0])&&!this._methods[t].skipValidation){if(!this._methods[t].check)return console.error(new Date,"No Check Function For Method "+t),void this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Check Function For Method "+t);if(!this._methods[t].check._schema)return console.error(new Date,"No Check Schema For Method "+t),void this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Check Function For Method "+t);for(var o={},i=Object.keys(this._methods[t].check._schema).filter(function(e){return!e.includes(".")}),s=0;s<r.length;s++)o[i[s]]=r[s];try{this._methods[t].check.validate(o)}catch(e){if(e)return console.error(new Date,"Error in Method Check ("+t+")",e),void this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"Match Error On Method "+t+"\n\nData Being Checked\n"+JSON.stringify(o,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2))}}var a,l,c,u=null,_=JSON.stringify(r);return this._isWorkersEnabled&&!this._isWorkerInstance&&Buffer.byteLength(_,"utf8")<8388608&&"insertSubscriptionLog"!==t&&"countQuery"!==t&&"incCounter"!==t&&"supportCreateBillingUser"!==t&&"find"!==t&&"insertDocument"!==t&&"countWithQuery"!==t&&"findOne"!==t&&"updateDocumentProps"!==t&&"findWithOptions"!==t&&"getSignedUrl"!==t&&"updateDocument"!==t&&"insertErrorLog"!==t&&"getSignedUrls"!==t&&"removeDocument"!==t&&"getSignedUrlWithId"!==t&&"incorrectUser"!==t&&"reloadWS"!==t&&"reconnectWS"!==t&&"disconnectWS"!==t?(a=this._monitorManagerFunction.startMonitorFunction("Cron Method",t,"","",r),l=(0,common_1.objectIdHexString)(),u=new Promise(function(t,r){var o=worker_task_response_collection_1.WorkerTaskResponses.watchCollection([{$match:{"fullDocument.id_request":l}}],{fullDocument:"updateLookup"});o.on("change",function(e){"insert"===e.operationType&&(n._monitorManagerFunction.finishMonitorFunction(a),((e=e.fullDocument).has_error?r:t)(e.data),o.close())}),o.on("error",function(e){console.error("Error watching worker responses:",e),r(e),o.close()})}),worker_task_request_collection_1.WorkerTaskRequests.create({_id:l,method:t,params:r,status:"pending",id_user:this.id_user,user:this.user,id_ws:this.id_socket})):(c=this._monitorManagerFunction.startMonitorFunction("Cron Method",t,"","",r),u=(_=this._methods[t].function).call.apply(_,__spreadArray([Object.assign({},this,MethodManager.prototype,{id_user:"",user:"",id_ws:""})],__read(r),!1)).then(function(e){return n._monitorManagerFunction.finishMonitorFunction(c),e},function(e){return n._monitorManagerFunction.finishMonitorFunction(c),n.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"Error Detected During Method "+t+" - (callMethodCron)\n\nData \n"+JSON.stringify(r,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2)),e})),u}console.log("No Method: "+t),this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Method: "+t)},MethodManager.prototype.callMethod=function(o,n,i,s,a){for(var t=this,l=[],e=5;e<arguments.length;e++)l[e-5]=arguments[e];if(this._debugCallMethodHits+=1,this._methods[a]){if((1<l.length||l[0])&&!this._methods[a].skipValidation){if(!this._methods[a].check)return console.error(new Date,"No Check Function For Method "+a),this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Check Function For Method "+a),this.sendWS(n,i,a,l,r={messageId:s,hasError:!0,data:"Internal Error"}),void(o&&log_method_latency_collection_1.LogMethodLatencies.deleteOne({_id:o}));if(!this._methods[a].check._schema)return console.error(new Date,"No Check Schema For Method "+a),this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Check Schema For Method "+a),r={messageId:s,hasError:!0,data:"Internal Error"},o&&log_method_latency_collection_1.LogMethodLatencies.deleteOne({_id:o}),void this.sendWS(n,i,a,l,r);for(var r,c={},u=Object.keys(this._methods[a].check._schema).filter(function(e){return!e.includes(".")}),_=0;_<l.length;_++)c[u[_]]=l[_];try{this._methods[a].check.validate(c)}catch(e){if(e)return console.error(new Date,"Error in Method Check ("+a+")",e),"processAirdropDistribution"!==a&&this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"Match Error On Method "+a+"\n\nData Being Checked\n"+JSON.stringify(c,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2)),this.sendWS(n,i,a,l,r={messageId:s,hasError:!0,data:"Internal Error"}),void(o&&log_method_latency_collection_1.LogMethodLatencies.deleteOne({_id:o}))}}var d,h,p,g=JSON.stringify(l);this._isWorkersEnabled&&!this._isWorkerInstance&&Buffer.byteLength(g,"utf8")<8388608&&"insertSubscriptionLog"!==a&&"countQuery"!==a&&"incCounter"!==a&&"supportCreateBillingUser"!==a&&"find"!==a&&"insertDocument"!==a&&"countWithQuery"!==a&&"findOne"!==a&&"updateDocumentProps"!==a&&"findWithOptions"!==a&&"getSignedUrl"!==a&&"updateDocument"!==a&&"insertErrorLog"!==a&&"getSignedUrls"!==a&&"removeDocument"!==a&&"getSignedUrlWithId"!==a&&"incorrectUser"!==a&&"reloadWS"!==a&&"reconnectWS"!==a&&"disconnectWS"!==a?(d=this._monitorManagerFunction.startMonitorFunction("Method",a,n.user||"",n.id_socket||"",l),g=(0,common_1.objectIdHexString)(),(h=worker_task_response_collection_1.WorkerTaskResponses.watchCollection([{$match:{"fullDocument.id_request":g}}],{fullDocument:"updateLookup"})).on("change",function(r){return __awaiter(t,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return"insert"!==r.operationType?[3,3]:(this._monitorManagerFunction.finishMonitorFunction(d),t=r.fullDocument,t={messageId:s,hasError:t.has_error,data:t.data},this.sendWS(n,new Date,a,l,t),o?[4,log_method_latency_collection_1.LogMethodLatencies.findById(o)]:[3,2]);case 1:(t=e.sent())&&log_method_latency_collection_1.LogMethodLatencies.updateOne({_id:o},{$set:{date_end:new Date,latency_ms:moment().diff(moment(t.date_start),"milliseconds",!0)}}),e.label=2;case 2:h.close(),e.label=3;case 3:return[2]}})})}),h.on("error",function(e){console.error("Error watching worker responses:",e),h.close()}),worker_task_request_collection_1.WorkerTaskRequests.create({_id:g,method:a,params:l,status:"pending",id_user:n.id_user,user:n.user,id_ws:n.id_socket})):(p=this._monitorManagerFunction.startMonitorFunction("Method",a,n.user||"",n.id_socket||"",l),(g=this._methods[a].function).call.apply(g,__spreadArray([Object.assign({},this,MethodManager.prototype,{id_user:n.id_user,user:n.user,id_ws:n.id_socket})],__read(l),!1)).then(function(r){return __awaiter(t,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return(this._monitorManagerFunction.finishMonitorFunction(p),t={messageId:s,hasError:!1,data:r},this.sendWS(n,i,a,l,t),o)?[4,log_method_latency_collection_1.LogMethodLatencies.findById(o)]:[3,2];case 1:(t=e.sent())&&log_method_latency_collection_1.LogMethodLatencies.updateOne({_id:o},{$set:{date_end:new Date,latency_ms:moment().diff(moment(t.date_start),"milliseconds",!0)}}),e.label=2;case 2:return[2]}})})},function(e){t._monitorManagerFunction.finishMonitorFunction(p),t.sendWS(n,i,a,l,{messageId:s,hasError:!0,data:e}),o&&log_method_latency_collection_1.LogMethodLatencies.deleteOne({_id:o}),"processAirdropDistribution"!==a&&t.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"Error Detected During Method "+a+" - (callMethod)\n\nData \n"+JSON.stringify(l,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2))}))}else console.log("No Method: "+a),this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Method: "+a),r={messageId:s,hasError:!0,data:"Internal Error"},this.sendWS(n,new Date,a,l,r),o&&log_method_latency_collection_1.LogMethodLatencies.deleteOne({_id:o})},MethodManager.prototype.callMethodInternal=function(t){for(var n=this,r=[],e=1;e<arguments.length;e++)r[e-1]=arguments[e];if(this._debugCallMethodInternalHits+=1,!this._methods[t])return console.log("No Method: "+t),null;if((1<r.length||r[0]&&"function"!=typeof r[0])&&!this._methods[t].skipValidation){if(!this._methods[t].check)return console.error(new Date,"No Check Function For Method "+t),null;if(!this._methods[t].check._schema)return console.error(new Date,"No Check Schema For Method "+t),null}"insertSubscriptionLog"!==t&&"getDataURIfromURL"!==t&&"processAirdropDistribution"!==t&&"incCounter"!==t&&"supportCreateBillingUser"!==t&&"countCollectionWithQuery"!==t&&log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"callMethodInternal",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([r]))<2e5?JSON.stringify([r],null,2):"Too Big",method:t,id_user:this.id_user||"",user:this.user||"",messageId:0,route:""});var i,s,o,a="function"==typeof r[r.length-1]?r.slice(0,-1):r,l=null,c=JSON.stringify(a);return this._isWorkersEnabled&&!this._isWorkerInstance&&Buffer.byteLength(c,"utf8")<8388608&&"insertSubscriptionLog"!==t&&"countQuery"!==t&&"incCounter"!==t&&"supportCreateBillingUser"!==t&&"find"!==t&&"insertDocument"!==t&&"countWithQuery"!==t&&"findOne"!==t&&"updateDocumentProps"!==t&&"findWithOptions"!==t&&"getSignedUrl"!==t&&"updateDocument"!==t&&"insertErrorLog"!==t&&"getSignedUrls"!==t&&"removeDocument"!==t&&"getSignedUrlWithId"!==t&&"incorrectUser"!==t&&"reloadWS"!==t&&"reconnectWS"!==t&&"disconnectWS"!==t?(i=this._monitorManagerFunction.startMonitorFunction("Internal Method",t,this.user||"","",a),s=(0,common_1.objectIdHexString)(),l=new Promise(function(t,r){var o=worker_task_response_collection_1.WorkerTaskResponses.watchCollection([{$match:{"fullDocument.id_request":s}}],{fullDocument:"updateLookup"});o.on("change",function(e){"insert"===e.operationType&&(n._monitorManagerFunction.finishMonitorFunction(i),((e=e.fullDocument).has_error?r:t)(e.data),o.close())}),o.on("error",function(e){console.error("Error watching worker responses:",e),r(e),o.close()})}),worker_task_request_collection_1.WorkerTaskRequests.create({_id:s,method:t,params:a,status:"pending",id_user:this.id_user,user:this.user,id_ws:this.id_socket})):(o=this._monitorManagerFunction.startMonitorFunction("Internal Method",t,this.user||"","",a),l=(c=this._methods[t].function).call.apply(c,__spreadArray([Object.assign({},this,MethodManager.prototype)],__read(a),!1)).then(function(e){return n._monitorManagerFunction.finishMonitorFunction(o),e},function(e){return n._monitorManagerFunction.finishMonitorFunction(o),n.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"Error Detected During Method "+t+" - (callMethodInternal)\n\nData \n"+JSON.stringify(r,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2)),e})),r[r.length-1]&&"function"==typeof r[r.length-1]&&l.then(function(e){return r[r.length-1](null,e)},function(e){return r[r.length-1](e,null)}),l},MethodManager.prototype.sendWS=function(e,t,r,o,n){this._websocketManager.send(e,n),"reportBuilderGetResults"!==r&&"reportBuilderGetDistinctValue"!==r&&"reportBuilderBuildTree"!==r&&"generatePDF"!==r&&"getWOOfflineData"!==r&&"countQuery"!==r&&"countWithQuery"!==r&&"countCollectionWithQuery"!==r&&"find"!==r&&"findOne"!==r&&"findWithOptions"!==r&&"uploadFileAndSave"!==r&&"getDrivers"!==r&&"processAirdropDistribution"!==r&&log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"client-response",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([o,n]))<2e5?JSON.stringify([o,n],null,2):"Too Big",method:r,id_user:e.id_user||"",user:e.user||"",messageId:n.messageId,route:""})},MethodManager.prototype.setupEmailWatcher=function(){return __awaiter(this,void 0,void 0,function(){var t,o=this;return __generator(this,function(e){switch(e.label){case 0:return(t=email_history_collection_1.EmailHistories.watchCollection([])).on("change",function(r){return __awaiter(o,void 0,void 0,function(){var t;return __generator(this,function(e){return"insert"===r.operationType&&r.fullDocument&&"pending"===r.fullDocument.status?(this.emailQueue.add(r.fullDocument._id.toString()),this.tryProcessEmail()):"update"!==r.operationType&&"replace"!==r.operationType||(t=r.fullDocument)&&"pending"!==t.status&&this.emailQueue.has(t._id.toString())&&this.emailQueue.delete(t._id.toString()),[2]})})}).on("error",function(e){console.error("Email history changestream error",e),t.close()}).on("close",function(){o.setupEmailWatcher()}),[4,this.loadPendingEmails()];case 1:return e.sent(),[2]}})})},MethodManager.prototype.loadPendingEmails=function(){return __awaiter(this,void 0,void 0,function(){var t,r,o,n,i,s;return __generator(this,function(e){switch(e.label){case 0:return[4,email_history_collection_1.EmailHistories.find({status:"pending"},{sort:{_id:1}})];case 1:t=e.sent();try{for(r=__values(t),o=r.next();!o.done;o=r.next())n=o.value,this.emailQueue.add(n._id.toString())}catch(e){i={error:e}}finally{try{o&&!o.done&&(s=r.return)&&s.call(r)}finally{if(i)throw i.error}}return this.tryProcessEmail(),[2]}})})},MethodManager.prototype.tryProcessEmail=function(){return __awaiter(this,void 0,void 0,function(){var t,_,r,d=this;return __generator(this,function(e){switch(e.label){case 0:if(this.isEmailProcessing||0===this.emailQueue.size)return[2];this.isEmailProcessing=!0,e.label=1;case 1:e.trys.push([1,5,6,7]),t=function(){var o,t,r,n,i,s,a,l,c,u;return __generator(this,function(e){switch(e.label){case 0:return i=_.emailQueue.values().next().value,_.emailQueue.delete(i),[4,email_history_collection_1.EmailHistories.findOneAndUpdate({_id:i,status:"pending"},{$set:{status:"processing",processingAt:new Date}})];case 1:if(!(o=e.sent()))return[2,"continue"];if(!(o.attachments&&0<o.attachments.length))return[3,14];e.label=2;case 2:e.trys.push([2,12,,14]),e.label=3;case 3:e.trys.push([3,9,10,11]),c=void 0,t=__values(o.attachments),r=t.next(),e.label=4;case 4:return r.done?[3,8]:(n=r.value).path&&n.path.startsWith("http")?[4,fetch(n.path)]:[3,7];case 5:if((i=e.sent()).ok)return[4,i.arrayBuffer()];throw new Error("Failed to fetch attachment: ".concat(n.path));case 6:s=e.sent(),s=Buffer.from(s),s.length<=20971520&&(n.content=s,delete n.path),e.label=7;case 7:return r=t.next(),[3,4];case 8:return[3,11];case 9:return s=e.sent(),c={error:s},[3,11];case 10:try{r&&!r.done&&(u=t.return)&&u.call(t)}finally{if(c)throw c.error}return[7];case 11:return[3,14];case 12:return a=e.sent(),console.error("Failed to fetch attachment:",a),[4,email_history_collection_1.EmailHistories.updateOne({_id:o._id},{$set:{status:"failed",error:"string"==typeof a?a:_.safeStringify(a),completedAt:new Date}})];case 13:return e.sent(),[2,"continue"];case 14:return(l={replyTo:o.reply_to||resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_REPLY_TO||void 0,from:o.send_from||resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_FROM,to:o.email,subject:(resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL.match(/https:\/\/dev\./)||resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL.match(/https:\/\/www\.dev\./)?"(DEV SERVER) - ":"")+o.subject,text:"string"==typeof o.text?o.text:"",html:"string"==typeof o.html?o.html:"",attachments:o.attachments||[]}).attachments&&0<l.attachments.length&&(l.attachments=l.attachments.map(function(e){e=__assign({},e);return!e.content||"object"!=typeof e.content||e.content instanceof Buffer?"string"==typeof e.content&&"base64"===e.encoding?(e.content=Buffer.from(e.content,"base64"),delete e.encoding):"string"==typeof e.content&&(e.content=Buffer.from(e.content)):"Binary"===e.content._bsontype&&0===e.content.sub_type?e.content=Buffer.from(e.content.buffer):e.content=Buffer.from(e.content),e})),[4,new Promise(function(r){d._mailer.sendMail(l,function(t,e){return __awaiter(d,void 0,void 0,function(){return __generator(this,function(e){try{t?(console.error("Failed to send email:",t),email_history_collection_1.EmailHistories.updateOne({_id:o._id},{$set:{status:"failed",error:"string"==typeof t?t:this.safeStringify(t),completedAt:new Date}})):"dev@resolveio.com"===o.email?email_history_collection_1.EmailHistories.deleteOne({_id:o._id}):email_history_collection_1.EmailHistories.updateOne({_id:o._id},{$set:{status:"completed",completedAt:new Date}})}catch(e){console.error("Error in sendMail callback:",e),email_history_collection_1.EmailHistories.updateOne({_id:o._id},{$set:{status:"failed",error:"string"==typeof e?e:this.safeStringify(e),completedAt:new Date}})}finally{r()}return[2]})})})})];case 15:return e.sent(),[4,new Promise(function(e){return setTimeout(e,1e3)})];case 16:return e.sent(),[2]}})},_=this,e.label=2;case 2:return 0<this.emailQueue.size?[5,t()]:[3,4];case 3:return e.sent(),[3,2];case 4:return[3,7];case 5:return r=e.sent(),console.error("Error processing email queue:",r),[3,7];case 6:return this.isEmailProcessing=!1,0<this.emailQueue.size&&this.tryProcessEmail(),[7];case 7:return[2]}})})},MethodManager.prototype.safeStringify=function(e){try{return JSON.stringify(e,this.getCircularReplacer())}catch(e){return"Error in JSON stringifying: ".concat(e.message)}},MethodManager.prototype.getCircularReplacer=function(){var r=new WeakSet;return function(e,t){if("object"==typeof t&&null!==t){if(r.has(t))return"[Circular]";r.add(t)}return t}},MethodManager.prototype.sendEmail=function(n,i,s,a,l,c,u,_){var e=this;return void 0===_&&(_=!1),new Promise(function(r,o){return __awaiter(e,void 0,void 0,function(){var t;return __generator(this,function(e){return(n=!resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL.match(/https:\/\/dev\./)&&!resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL.match(/https:\/\/www\.dev\./)&&"http://localhost:4200"!==resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||n.match(/\@resolveio\.com/)?n:"dev@resolveio.com")?"http://localhost:4200"!==resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||_?(l=l||[],l=(l=Array.isArray(l)?l:[l]).map(function(e){e=__assign({},e);return Buffer.isBuffer(e.content)&&(e.content=e.content.toString("base64"),e.encoding="base64"),e}),t={_id:(0,common_1.objectIdHexString)(),__v:0,date:new Date,id_user:this.id_user||"",user:this.user||"",email:n,subject:i||"",text:s||"",html:a||"",attachments:l||[],send_from:c||"",reply_to:u||"",status:"pending",error:""},email_history_collection_1.EmailHistories.insertOne(t).then(function(e){return r(e)},function(e){console.error("Failed to queue email:",e),o(e)})):(console.log("Send email",n,i,s,a,l,c),r(!0)):r(!0),[2]})})})},MethodManager.prototype.getAWS=function(){return this._aws},MethodManager.prototype.readFile=function(e){return new Promise(function(r,o){fs.existsSync(path.join(__dirname,"../private/"+e))?fs.readFile(path.join(__dirname,"../private/"+e),"utf-8",function(e,t){e?o(e):r(t)}):fs.existsSync(path.join(resolveio_server_app_1.ResolveIOServer.getClientDir(),"./private/"+e))&&fs.readFile(path.join(resolveio_server_app_1.ResolveIOServer.getClientDir(),"./private/"+e),"utf-8",function(e,t){e?o(e):r(t)})})},MethodManager.prototype.readImage=function(e){return new Promise(function(r,o){fs.existsSync(path.join(__dirname,"../private/"+e))?fs.readFile(path.join(__dirname,"../private/"+e),"base64",function(e,t){e?o(e):r(t)}):fs.existsSync(path.join(resolveio_server_app_1.ResolveIOServer.getClientDir(),"./private/"+e))&&fs.readFile(path.join(resolveio_server_app_1.ResolveIOServer.getClientDir(),"./private/"+e),"base64",function(e,t){e?o(e):r(t)})})},MethodManager}());exports.MethodManager=MethodManager;
1
+ "use strict";var __assign=this&&this.__assign||function(){return(__assign=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)},__awaiter=this&&this.__awaiter||function(e,o,n,i){return new(n=n||Promise)(function(r,t){function fulfilled(e){try{step(i.next(e))}catch(e){t(e)}}function rejected(e){try{step(i.throw(e))}catch(e){t(e)}}function step(e){var t;e.done?r(e.value):((t=e.value)instanceof n?t:new n(function(e){e(t)})).then(fulfilled,rejected)}step((i=i.apply(e,o||[])).next())})},__generator=this&&this.__generator||function(o,n){var i,s,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},c={next:verb(0),throw:verb(1),return:verb(2)};return"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function verb(r){return function(e){var t=[r,e];if(i)throw new TypeError("Generator is already executing.");for(;l=c&&t[c=0]?0:l;)try{if(i=1,s&&(a=2&t[0]?s.return:t[0]?s.throw||((a=s.return)&&a.call(s),0):s.next)&&!(a=a.call(s,t[1])).done)return a;switch(s=0,(t=a?[2&t[0],a.value]:t)[0]){case 0:case 1:a=t;break;case 4:return l.label++,{value:t[1],done:!1};case 5:l.label++,s=t[1],t=[0];continue;case 7:t=l.ops.pop(),l.trys.pop();continue;default:if(!(a=0<(a=l.trys).length&&a[a.length-1])&&(6===t[0]||2===t[0])){l=0;continue}if(3===t[0]&&(!a||t[1]>a[0]&&t[1]<a[3]))l.label=t[1];else if(6===t[0]&&l.label<a[1])l.label=a[1],a=t;else{if(!(a&&l.label<a[2])){a[2]&&l.ops.pop(),l.trys.pop();continue}l.label=a[2],l.ops.push(t)}}t=n.call(o,l)}catch(e){t=[6,e],s=0}finally{i=a=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}}},__read=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var o,n,i=r.call(e),s=[];try{for(;(void 0===t||0<t--)&&!(o=i.next()).done;)s.push(o.value)}catch(e){n={error:e}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return s},__spreadArray=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var o,n=0,i=t.length;n<i;n++)!o&&n in t||((o=o||Array.prototype.slice.call(t,0,n))[n]=t[n]);return e.concat(o||Array.prototype.slice.call(t))},__values=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,r=t&&e[t],o=0;if(r)return r.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&o>=e.length?void 0:e)&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},collections_1=(Object.defineProperty(exports,"__esModule",{value:!0}),exports.MethodManager=exports.AWS=void 0,require("../methods/collections")),logs_1=require("../methods/logs"),counters_1=require("../methods/counters"),pdf_1=require("../methods/pdf"),aws_1=require("../methods/aws"),path=require("path"),fs=require("fs"),nodemailer=require("nodemailer"),sesTransport=require("nodemailer-ses-transport"),accounts_1=require("../methods/accounts"),init_1=require("../fixtures/init"),cron_jobs_1=require("../fixtures/cron-jobs"),cron_jobs_2=require("../methods/cron-jobs"),flags_1=require("../methods/flags"),common_1=require("../util/common"),log_collection_1=require("../collections/log.collection"),log_method_latency_collection_1=require("../collections/log-method-latency.collection"),moment=require("moment-timezone"),report_builder_1=require("../methods/report-builder"),support_1=require("../methods/support"),monitor_1=require("../methods/monitor"),email_history_collection_1=require("../collections/email-history.collection"),client_s3_1=require("@aws-sdk/client-s3"),worker_task_request_collection_1=require("../collections/worker-task-request.collection"),worker_task_response_collection_1=require("../collections/worker-task-response.collection"),flag_updates_1=require("../methods/flag-updates"),resolveio_server_app_1=require("../resolveio-server-app"),AWS=function(){function AWS(){this._s3=null,this._s3USEast1=null}return AWS.prototype.s3=function(){return this._s3||(this._s3=new client_s3_1.S3({credentials:{accessKeyId:process.env.AWS_ACCESS_KEY,secretAccessKey:process.env.AWS_SECRET_ACCESS_KEY},region:process.env.AWS_REGION,apiVersion:"2006-03-01"})),this._s3},AWS.prototype.s3USEast1=function(){return"us-east-1"===process.env.AWS_REGION?this.s3():(this._s3USEast1||(this._s3USEast1=new client_s3_1.S3({credentials:{accessKeyId:process.env.AWS_ACCESS_KEY,secretAccessKey:process.env.AWS_SECRET_ACCESS_KEY},region:"us-east-1",apiVersion:"2006-03-01"})),this._s3USEast1)},AWS}(),MethodManager=(exports.AWS=AWS,function(){function MethodManager(e,t,r){var o=this;this._methods={},this._isWorkersEnabled=!1,this._isWorkerInstance=!1,this.emailQueue=new Set,this.isEmailProcessing=!1,this._debugCallMethodInternalHits=0,this._debugCallMethodHits=0,this._debugCallMethodCronJobHits=0,this._debugSendQueueHits=0,this.clientDir="",this.serverConfig="",this._websocketManager=resolveio_server_app_1.ResolveIOServer.getMainServer().getWebSocketManager(),this._monitorManagerFunction=e,this._isWorkersEnabled=t,this._isWorkerInstance=r,this.clientDir=resolveio_server_app_1.ResolveIOServer.getClientDir(),this.serverConfig=resolveio_server_app_1.ResolveIOServer.getServerConfig(),"false"!==process.env.IS_WORKERS_ENABLED&&("true"!==process.env.IS_WORKER_INSTANCE||"0"!==process.env.WORKER_INDEX)||process.env.NODE_APP_INSTANCE&&"0"!==process.env.NODE_APP_INSTANCE||setTimeout(function(){console.log(new Date,"Start Server Fixture"),(0,init_1.loadServerInit)(),console.log(new Date,"End Server Fixture")},5e3),(0,cron_jobs_1.loadServerCronJobs)(),(0,accounts_1.loadAccountMethods)(this),(0,aws_1.loadAWSMethods)(this),(0,collections_1.loadCollectionMethods)(this),(0,counters_1.loadCounterMethods)(this),(0,logs_1.loadLogMethods)(this),(0,pdf_1.loadPDFMethods)(this),(0,cron_jobs_2.loadCronJobMethods)(this),(0,flags_1.loadFlagMethods)(this),(0,flag_updates_1.loadFlagUpdatesMethods)(this),(0,report_builder_1.loadReportBuilderMethods)(this),(0,support_1.loadSupportMethods)(this),(0,monitor_1.loadMonitorMethods)(this),this._aws=new AWS,resolveio_server_app_1.ResolveIOServer.getSESMail()?this._mailer=nodemailer.createTransport(sesTransport({accessKeyId:process.env.AWS_ACCESS_KEY,secretAccessKey:process.env.AWS_SECRET_ACCESS_KEY,region:process.env.AWS_SES_REGION})):this._mailer=nodemailer.createTransport({host:resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_HOST,port:resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_PORT,secure:!1,auth:{user:resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_USERNAME,pass:resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_PASSWORD},tls:{ciphers:"SSLv3"}}),setInterval(function(){resolveio_server_app_1.ResolveIOServer.getMainServer().getSubscriptionManager()&&resolveio_server_app_1.ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()&&(console.log(new Date,"Method Manager","Send Queue Hits",o._debugSendQueueHits),console.log(new Date,"Method Manager","Call Method Internal Hits",o._debugCallMethodInternalHits),console.log(new Date,"Method Manager","Call Method Hits",o._debugCallMethodHits),console.log(new Date,"Method Manager","Call Method Cron Hits",o._debugCallMethodCronJobHits)),o._debugCallMethodInternalHits=0,o._debugCallMethodHits=0,o._debugCallMethodCronJobHits=0,o._debugSendQueueHits=0},6e4),this._isWorkersEnabled&&!this._isWorkerInstance||this.setupEmailWatcher()}return MethodManager.prototype.methods=function(e){this._methods=Object.assign(this._methods,e)},MethodManager.prototype.callMethodCron=function(t){for(var n=this,r=[],e=1;e<arguments.length;e++)r[e-1]=arguments[e];if(this._debugCallMethodCronJobHits+=1,this._methods[t]){if((1<r.length||r[0])&&!this._methods[t].skipValidation){if(!this._methods[t].check)return console.error(new Date,"No Check Function For Method "+t),void this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Check Function For Method "+t);if(!this._methods[t].check._schema)return console.error(new Date,"No Check Schema For Method "+t),void this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Check Function For Method "+t);for(var o={},i=Object.keys(this._methods[t].check._schema).filter(function(e){return!e.includes(".")}),s=0;s<r.length;s++)o[i[s]]=r[s];try{this._methods[t].check.validate(o)}catch(e){if(e)return console.error(new Date,"Error in Method Check ("+t+")",e),void this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"Match Error On Method "+t+"\n\nData Being Checked\n"+JSON.stringify(o,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2))}}var a,l,c,u=null,_=JSON.stringify(r);return this._isWorkersEnabled&&!this._isWorkerInstance&&Buffer.byteLength(_,"utf8")<8388608&&"insertSubscriptionLog"!==t&&"countQuery"!==t&&"incCounter"!==t&&"supportCreateBillingUser"!==t&&"find"!==t&&"insertDocument"!==t&&"countWithQuery"!==t&&"findOne"!==t&&"updateDocumentProps"!==t&&"findWithOptions"!==t&&"getSignedUrl"!==t&&"updateDocument"!==t&&"insertErrorLog"!==t&&"getSignedUrls"!==t&&"removeDocument"!==t&&"getSignedUrlWithId"!==t&&"incorrectUser"!==t&&"reloadWS"!==t&&"reconnectWS"!==t&&"disconnectWS"!==t?(a=this._monitorManagerFunction.startMonitorFunction("Cron Method",t,"","",r),l=(0,common_1.objectIdHexString)(),u=new Promise(function(t,r){var o=worker_task_response_collection_1.WorkerTaskResponses.watchCollection([{$match:{"fullDocument.id_request":l}}],{fullDocument:"updateLookup"});o.on("change",function(e){"insert"===e.operationType&&(n._monitorManagerFunction.finishMonitorFunction(a),((e=e.fullDocument).has_error?r:t)(e.data),o.close())}),o.on("error",function(e){console.error("Error watching worker responses:",e),r(e),o.close()})}),worker_task_request_collection_1.WorkerTaskRequests.create({_id:l,method:t,params:r,status:"pending",id_user:this.id_user,user:this.user,id_ws:this.id_socket})):(c=this._monitorManagerFunction.startMonitorFunction("Cron Method",t,"","",r),u=(_=this._methods[t].function).call.apply(_,__spreadArray([Object.assign({},this,MethodManager.prototype,{id_user:"",user:"",id_ws:""})],__read(r),!1)).then(function(e){return n._monitorManagerFunction.finishMonitorFunction(c),e},function(e){return n._monitorManagerFunction.finishMonitorFunction(c),n.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"Error Detected During Method "+t+" - (callMethodCron)\n\nData \n"+JSON.stringify(r,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2)),e})),u}console.log("No Method: "+t),this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Method: "+t)},MethodManager.prototype.callMethod=function(o,n,i,s,a){for(var t=this,l=[],e=5;e<arguments.length;e++)l[e-5]=arguments[e];if(this._debugCallMethodHits+=1,this._methods[a]){if((1<l.length||l[0])&&!this._methods[a].skipValidation){if(!this._methods[a].check)return console.error(new Date,"No Check Function For Method "+a),this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Check Function For Method "+a),this.sendWS(n,i,a,l,r={messageId:s,hasError:!0,data:"Internal Error"}),void(o&&log_method_latency_collection_1.LogMethodLatencies.deleteOne({_id:o}));if(!this._methods[a].check._schema)return console.error(new Date,"No Check Schema For Method "+a),this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Check Schema For Method "+a),r={messageId:s,hasError:!0,data:"Internal Error"},o&&log_method_latency_collection_1.LogMethodLatencies.deleteOne({_id:o}),void this.sendWS(n,i,a,l,r);for(var r,c={},u=Object.keys(this._methods[a].check._schema).filter(function(e){return!e.includes(".")}),_=0;_<l.length;_++)c[u[_]]=l[_];try{this._methods[a].check.validate(c)}catch(e){if(e)return console.error(new Date,"Error in Method Check ("+a+")",e),"processAirdropDistribution"!==a&&this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"Match Error On Method "+a+"\n\nData Being Checked\n"+JSON.stringify(c,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2)),this.sendWS(n,i,a,l,r={messageId:s,hasError:!0,data:"Internal Error"}),void(o&&log_method_latency_collection_1.LogMethodLatencies.deleteOne({_id:o}))}}var d,h,p,g=JSON.stringify(l);this._isWorkersEnabled&&!this._isWorkerInstance&&Buffer.byteLength(g,"utf8")<8388608&&"insertSubscriptionLog"!==a&&"countQuery"!==a&&"incCounter"!==a&&"supportCreateBillingUser"!==a&&"find"!==a&&"insertDocument"!==a&&"countWithQuery"!==a&&"findOne"!==a&&"updateDocumentProps"!==a&&"findWithOptions"!==a&&"getSignedUrl"!==a&&"updateDocument"!==a&&"insertErrorLog"!==a&&"getSignedUrls"!==a&&"removeDocument"!==a&&"getSignedUrlWithId"!==a&&"incorrectUser"!==a&&"reloadWS"!==a&&"reconnectWS"!==a&&"disconnectWS"!==a?(d=this._monitorManagerFunction.startMonitorFunction("Method",a,n.user||"",n.id_socket||"",l),g=(0,common_1.objectIdHexString)(),(h=worker_task_response_collection_1.WorkerTaskResponses.watchCollection([{$match:{"fullDocument.id_request":g}}],{fullDocument:"updateLookup"})).on("change",function(r){return __awaiter(t,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return"insert"!==r.operationType?[3,3]:(this._monitorManagerFunction.finishMonitorFunction(d),t=r.fullDocument,t={messageId:s,hasError:t.has_error,data:t.data},this.sendWS(n,new Date,a,l,t),o?[4,log_method_latency_collection_1.LogMethodLatencies.findById(o)]:[3,2]);case 1:(t=e.sent())&&log_method_latency_collection_1.LogMethodLatencies.updateOne({_id:o},{$set:{date_end:new Date,latency_ms:moment().diff(moment(t.date_start),"milliseconds",!0)}}),e.label=2;case 2:h.close(),e.label=3;case 3:return[2]}})})}),h.on("error",function(e){console.error("Error watching worker responses:",e),h.close()}),worker_task_request_collection_1.WorkerTaskRequests.create({_id:g,method:a,params:l,status:"pending",id_user:n.id_user,user:n.user,id_ws:n.id_socket})):(p=this._monitorManagerFunction.startMonitorFunction("Method",a,n.user||"",n.id_socket||"",l),(g=this._methods[a].function).call.apply(g,__spreadArray([Object.assign({},this,MethodManager.prototype,{id_user:n.id_user,user:n.user,id_ws:n.id_socket})],__read(l),!1)).then(function(r){return __awaiter(t,void 0,void 0,function(){var t;return __generator(this,function(e){switch(e.label){case 0:return(this._monitorManagerFunction.finishMonitorFunction(p),t={messageId:s,hasError:!1,data:r},this.sendWS(n,i,a,l,t),o)?[4,log_method_latency_collection_1.LogMethodLatencies.findById(o)]:[3,2];case 1:(t=e.sent())&&log_method_latency_collection_1.LogMethodLatencies.updateOne({_id:o},{$set:{date_end:new Date,latency_ms:moment().diff(moment(t.date_start),"milliseconds",!0)}}),e.label=2;case 2:return[2]}})})},function(e){t._monitorManagerFunction.finishMonitorFunction(p),t.sendWS(n,i,a,l,{messageId:s,hasError:!0,data:e}),o&&log_method_latency_collection_1.LogMethodLatencies.deleteOne({_id:o}),"processAirdropDistribution"!==a&&t.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"Error Detected During Method "+a+" - (callMethod)\n\nData \n"+JSON.stringify(l,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2))}))}else console.log("No Method: "+a),this.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"No Method: "+a),r={messageId:s,hasError:!0,data:"Internal Error"},this.sendWS(n,new Date,a,l,r),o&&log_method_latency_collection_1.LogMethodLatencies.deleteOne({_id:o})},MethodManager.prototype.callMethodInternal=function(t){for(var n=this,r=[],e=1;e<arguments.length;e++)r[e-1]=arguments[e];if(this._debugCallMethodInternalHits+=1,!this._methods[t])return console.log("No Method: "+t),null;if((1<r.length||r[0]&&"function"!=typeof r[0])&&!this._methods[t].skipValidation){if(!this._methods[t].check)return console.error(new Date,"No Check Function For Method "+t),null;if(!this._methods[t].check._schema)return console.error(new Date,"No Check Schema For Method "+t),null}"insertSubscriptionLog"!==t&&"getDataURIfromURL"!==t&&"processAirdropDistribution"!==t&&"incCounter"!==t&&"supportCreateBillingUser"!==t&&"countCollectionWithQuery"!==t&&log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"callMethodInternal",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([r]))<2e5?JSON.stringify([r],null,2):"Too Big",method:t,id_user:this.id_user||"",user:this.user||"",messageId:0,route:""});var i,s,o,a="function"==typeof r[r.length-1]?r.slice(0,-1):r,l=null,c=JSON.stringify(a);return this._isWorkersEnabled&&!this._isWorkerInstance&&Buffer.byteLength(c,"utf8")<8388608&&"insertSubscriptionLog"!==t&&"countQuery"!==t&&"incCounter"!==t&&"supportCreateBillingUser"!==t&&"find"!==t&&"insertDocument"!==t&&"countWithQuery"!==t&&"findOne"!==t&&"updateDocumentProps"!==t&&"findWithOptions"!==t&&"getSignedUrl"!==t&&"updateDocument"!==t&&"insertErrorLog"!==t&&"getSignedUrls"!==t&&"removeDocument"!==t&&"getSignedUrlWithId"!==t&&"incorrectUser"!==t&&"reloadWS"!==t&&"reconnectWS"!==t&&"disconnectWS"!==t?(i=this._monitorManagerFunction.startMonitorFunction("Internal Method",t,this.user||"","",a),s=(0,common_1.objectIdHexString)(),l=new Promise(function(t,r){var o=worker_task_response_collection_1.WorkerTaskResponses.watchCollection([{$match:{"fullDocument.id_request":s}}],{fullDocument:"updateLookup"});o.on("change",function(e){"insert"===e.operationType&&(n._monitorManagerFunction.finishMonitorFunction(i),((e=e.fullDocument).has_error?r:t)(e.data),o.close())}),o.on("error",function(e){console.error("Error watching worker responses:",e),r(e),o.close()})}),worker_task_request_collection_1.WorkerTaskRequests.create({_id:s,method:t,params:a,status:"pending",id_user:this.id_user,user:this.user,id_ws:this.id_socket})):(o=this._monitorManagerFunction.startMonitorFunction("Internal Method",t,this.user||"","",a),l=(c=this._methods[t].function).call.apply(c,__spreadArray([Object.assign({},this,MethodManager.prototype)],__read(a),!1)).then(function(e){return n._monitorManagerFunction.finishMonitorFunction(o),e},function(e){return n._monitorManagerFunction.finishMonitorFunction(o),n.sendEmail("dev@resolveio.com","SERVER - Error Detected - "+resolveio_server_app_1.ResolveIOServer.getServerConfig().CLIENT_NAME,"Error Detected During Method "+t+" - (callMethodInternal)\n\nData \n"+JSON.stringify(r,null,2)+"\n\nErrors\n"+JSON.stringify(e,null,2)),e})),r[r.length-1]&&"function"==typeof r[r.length-1]&&l.then(function(e){return r[r.length-1](null,e)},function(e){return r[r.length-1](e,null)}),l},MethodManager.prototype.sendWS=function(e,t,r,o,n){this._websocketManager.send(e,n),"reportBuilderGetResults"!==r&&"reportBuilderGetDistinctValue"!==r&&"reportBuilderBuildTree"!==r&&"generatePDF"!==r&&"getWOOfflineData"!==r&&"countQuery"!==r&&"countWithQuery"!==r&&"countCollectionWithQuery"!==r&&"find"!==r&&"findOne"!==r&&"findWithOptions"!==r&&"uploadFileAndSave"!==r&&"getDrivers"!==r&&"processAirdropDistribution"!==r&&log_collection_1.Logs.insertOne({_id:(0,common_1.objectIdHexString)(),type:"client-response",collection:"",id_document:"",payload:(0,common_1.getBinarySize)(JSON.stringify([o,n]))<2e5?JSON.stringify([o,n],null,2):"Too Big",method:r,id_user:e.id_user||"",user:e.user||"",messageId:n.messageId,route:""})},MethodManager.prototype.setupEmailWatcher=function(){return __awaiter(this,void 0,void 0,function(){var t,o=this;return __generator(this,function(e){switch(e.label){case 0:return(t=email_history_collection_1.EmailHistories.watchCollection([])).on("change",function(r){return __awaiter(o,void 0,void 0,function(){var t;return __generator(this,function(e){return"insert"===r.operationType&&r.fullDocument&&"pending"===r.fullDocument.status?(this.emailQueue.add(r.fullDocument._id.toString()),this.tryProcessEmail()):"update"!==r.operationType&&"replace"!==r.operationType||(t=r.fullDocument)&&"pending"!==t.status&&this.emailQueue.has(t._id.toString())&&this.emailQueue.delete(t._id.toString()),[2]})})}).on("error",function(e){console.error("Email history changestream error",e),t.close()}).on("close",function(){o.setupEmailWatcher()}),[4,this.loadPendingEmails()];case 1:return e.sent(),[2]}})})},MethodManager.prototype.loadPendingEmails=function(){return __awaiter(this,void 0,void 0,function(){var t,r,o,n,i,s;return __generator(this,function(e){switch(e.label){case 0:return[4,email_history_collection_1.EmailHistories.find({status:"pending"},{sort:{_id:1}})];case 1:t=e.sent();try{for(r=__values(t),o=r.next();!o.done;o=r.next())n=o.value,this.emailQueue.add(n._id.toString())}catch(e){i={error:e}}finally{try{o&&!o.done&&(s=r.return)&&s.call(r)}finally{if(i)throw i.error}}return this.tryProcessEmail(),[2]}})})},MethodManager.prototype.tryProcessEmail=function(){return __awaiter(this,void 0,void 0,function(){var t,_,r,d=this;return __generator(this,function(e){switch(e.label){case 0:if(this.isEmailProcessing||0===this.emailQueue.size)return[2];this.isEmailProcessing=!0,e.label=1;case 1:e.trys.push([1,5,6,7]),t=function(){var o,t,r,n,i,s,a,l,c,u;return __generator(this,function(e){switch(e.label){case 0:return i=_.emailQueue.values().next().value,_.emailQueue.delete(i),[4,email_history_collection_1.EmailHistories.findOneAndUpdate({_id:i,status:"pending"},{$set:{status:"processing",processingAt:new Date}})];case 1:if(!(o=e.sent()))return[2,"continue"];if(!(o.attachments&&0<o.attachments.length))return[3,14];e.label=2;case 2:e.trys.push([2,12,,14]),e.label=3;case 3:e.trys.push([3,9,10,11]),c=void 0,t=__values(o.attachments),r=t.next(),e.label=4;case 4:return r.done?[3,8]:(n=r.value).path&&n.path.startsWith("http")?[4,fetch(n.path)]:[3,7];case 5:if((i=e.sent()).ok)return[4,i.arrayBuffer()];throw new Error("Failed to fetch attachment: ".concat(n.path));case 6:s=e.sent(),s=Buffer.from(s),s.length<=20971520&&(n.content=s,delete n.path),e.label=7;case 7:return r=t.next(),[3,4];case 8:return[3,11];case 9:return s=e.sent(),c={error:s},[3,11];case 10:try{r&&!r.done&&(u=t.return)&&u.call(t)}finally{if(c)throw c.error}return[7];case 11:return[3,14];case 12:return a=e.sent(),console.error("Failed to fetch attachment:",a),[4,email_history_collection_1.EmailHistories.updateOne({_id:o._id},{$set:{status:"failed",error:"string"==typeof a?a:_.safeStringify(a),completedAt:new Date}})];case 13:return e.sent(),[2,"continue"];case 14:return(l={replyTo:o.reply_to||resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_REPLY_TO||void 0,from:o.send_from||resolveio_server_app_1.ResolveIOServer.getServerConfig().MAIL_FROM,to:o.email,subject:(resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL.match(/https:\/\/dev\./)||resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL.match(/https:\/\/www\.dev\./)?"(DEV SERVER) - ":"")+o.subject,text:"string"==typeof o.text?o.text:"",html:"string"==typeof o.html?o.html:"",attachments:o.attachments||[]}).attachments&&0<l.attachments.length&&(l.attachments=l.attachments.map(function(e){e=__assign({},e);return!e.content||"object"!=typeof e.content||e.content instanceof Buffer?"string"==typeof e.content&&"base64"===e.encoding?(e.content=Buffer.from(e.content,"base64"),delete e.encoding):"string"==typeof e.content&&(e.content=Buffer.from(e.content)):"Binary"===e.content._bsontype&&0===e.content.sub_type?e.content=Buffer.from(e.content.buffer):e.content=Buffer.from(e.content),e})),[4,new Promise(function(r){d._mailer.sendMail(l,function(t,e){return __awaiter(d,void 0,void 0,function(){return __generator(this,function(e){try{t?(console.error("Failed to send email:",t),email_history_collection_1.EmailHistories.updateOne({_id:o._id},{$set:{status:"failed",error:"string"==typeof t?t:this.safeStringify(t),completedAt:new Date}})):"dev@resolveio.com"===o.email?email_history_collection_1.EmailHistories.deleteOne({_id:o._id}):email_history_collection_1.EmailHistories.updateOne({_id:o._id},{$set:{status:"completed",completedAt:new Date}})}catch(e){console.error("Error in sendMail callback:",e),email_history_collection_1.EmailHistories.updateOne({_id:o._id},{$set:{status:"failed",error:"string"==typeof e?e:this.safeStringify(e),completedAt:new Date}})}finally{r()}return[2]})})})})];case 15:return e.sent(),[4,new Promise(function(e){return setTimeout(e,1e3)})];case 16:return e.sent(),[2]}})},_=this,e.label=2;case 2:return 0<this.emailQueue.size?[5,t()]:[3,4];case 3:return e.sent(),[3,2];case 4:return[3,7];case 5:return r=e.sent(),console.error("Error processing email queue:",r),[3,7];case 6:return this.isEmailProcessing=!1,0<this.emailQueue.size&&this.tryProcessEmail(),[7];case 7:return[2]}})})},MethodManager.prototype.safeStringify=function(e){try{return JSON.stringify(e,this.getCircularReplacer())}catch(e){return"Error in JSON stringifying: ".concat(e.message)}},MethodManager.prototype.getCircularReplacer=function(){var r=new WeakSet;return function(e,t){if("object"==typeof t&&null!==t){if(r.has(t))return"[Circular]";r.add(t)}return t}},MethodManager.prototype.sendEmail=function(n,i,s,a,l,c,u,_){var e=this;return void 0===_&&(_=!1),new Promise(function(r,o){return __awaiter(e,void 0,void 0,function(){var t;return __generator(this,function(e){return(n=!resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL.match(/https:\/\/dev\./)&&!resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL.match(/https:\/\/www\.dev\./)&&"http://localhost:4200"!==resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||n.match(/\@resolveio\.com/)?n:"dev@resolveio.com")?"http://localhost:4200"!==resolveio_server_app_1.ResolveIOServer.getServerConfig().ROOT_URL||_?(l=l||[],l=(l=Array.isArray(l)?l:[l]).map(function(e){e=__assign({},e);return Buffer.isBuffer(e.content)&&(e.content=e.content.toString("base64"),e.encoding="base64"),e}),t={_id:(0,common_1.objectIdHexString)(),__v:0,date:new Date,id_user:this.id_user||"",user:this.user||"",email:n,subject:i||"",text:s||"",html:a||"",attachments:l||[],send_from:c||"",reply_to:u||"",status:"pending",error:""},email_history_collection_1.EmailHistories.insertOne(t).then(function(e){return r(e)},function(e){console.error("Failed to queue email:",e),o(e)})):(console.log("Send email",n,i,s,a,l,c),r(!0)):r(!0),[2]})})})},MethodManager.prototype.getAWS=function(){return this._aws},MethodManager.prototype.readFile=function(e){return new Promise(function(r,o){fs.existsSync(path.join(__dirname,"../private/"+e))?fs.readFile(path.join(__dirname,"../private/"+e),"utf-8",function(e,t){e?o(e):r(t)}):fs.existsSync(path.join(resolveio_server_app_1.ResolveIOServer.getClientDir(),"./private/"+e))&&fs.readFile(path.join(resolveio_server_app_1.ResolveIOServer.getClientDir(),"./private/"+e),"utf-8",function(e,t){e?o(e):r(t)})})},MethodManager.prototype.readImage=function(e){return new Promise(function(r,o){fs.existsSync(path.join(__dirname,"../private/"+e))?fs.readFile(path.join(__dirname,"../private/"+e),"base64",function(e,t){e?o(e):r(t)}):fs.existsSync(path.join(resolveio_server_app_1.ResolveIOServer.getClientDir(),"./private/"+e))&&fs.readFile(path.join(resolveio_server_app_1.ResolveIOServer.getClientDir(),"./private/"+e),"base64",function(e,t){e?o(e):r(t)})})},MethodManager}());exports.MethodManager=MethodManager;
2
2
  //# sourceMappingURL=method.manager.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/method.manager.ts"],"names":["collections_1","require","logs_1","counters_1","pdf_1","aws_1","path","fs","nodemailer","sesTransport","accounts_1","init_1","cron_jobs_1","cron_jobs_2","flags_1","common_1","log_collection_1","log_method_latency_collection_1","moment","report_builder_1","support_1","monitor_1","email_history_collection_1","client_s3_1","worker_task_request_collection_1","worker_task_response_collection_1","flag_updates_1","resolveio_server_app_1","AWS","this","_s3","_s3USEast1","prototype","s3","S3","credentials","accessKeyId","process","env","AWS_ACCESS_KEY","secretAccessKey","AWS_SECRET_ACCESS_KEY","region","AWS_REGION","apiVersion","s3USEast1","MethodManager","exports","monitorManagerFunction","isWorkersEnabled","isWorkerInstance","_this","_methods","_isWorkersEnabled","_isWorkerInstance","emailQueue","Set","isEmailProcessing","_debugCallMethodInternalHits","_debugCallMethodHits","_debugCallMethodCronJobHits","_debugSendQueueHits","_websocketManager","ResolveIOServer","getMainServer","getWebSocketManager","_monitorManagerFunction","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","WORKER_INDEX","NODE_APP_INSTANCE","setTimeout","console","log","Date","loadServerInit","loadServerCronJobs","loadAccountMethods","loadAWSMethods","loadCollectionMethods","loadCounterMethods","loadLogMethods","loadPDFMethods","loadCronJobMethods","loadFlagMethods","loadFlagUpdatesMethods","loadReportBuilderMethods","loadSupportMethods","loadMonitorMethods","_aws","getSESMail","_mailer","createTransport","AWS_SES_REGION","host","getServerConfig","port","secure","auth","user","pass","tls","ciphers","setInterval","getSubscriptionManager","getEnableDebug","setupEmailWatcher","methods","method","Object","assign","callMethodCron","methodData","_i","arguments","length","skipValidation","check","error","sendEmail","_schema","valObj","rootKeys","keys","filter","a","includes","i","validate","errors","JSON","stringify","monitor_2","taskId_1","monitor_3","promise","serializedData","Buffer","byteLength","startMonitorFunction","objectIdHexString","Promise","resolve","reject","changeStream","WorkerTaskResponses","watchCollection","$match","fullDocument.id_request","fullDocument","on","change","operationType","finishMonitorFunction","taskResponse","has_error","data","close","WorkerTaskRequests","create","_id","params","status","id_user","id_ws","_a","function","call","apply","__spreadArray","__read","then","res","methodErrs","callMethod","id_methodLatency","ws","messageDate","messageId","sendWS","serverRes","hasError","LogMethodLatencies","deleteOne","monitor_4","changeStream_1","monitor_5","taskId","__awaiter","findById","latency","sent","updateOne","$set","date_end","latency_ms","diff","date_start","err","callMethodInternal","Logs","insertOne","type","collection","id_document","payload","getBinarySize","route","monitor_6","taskId_2","monitor_7","functionMethodData","slice","send","EmailHistories","add","toString","tryProcessEmail","updatedEmail","has","delete","loadPendingEmails","find","sort","pendingEmails","_b","pendingEmails_1","__values","pendingEmails_1_1","next","done","email","value","size","emailId","this_1","values","findOneAndUpdate","processingAt","emailHistory","_e","attachments","e_2","_c","att","startsWith","fetch","response","ok","arrayBuffer","Error","concat","buffer","from","content","err_2","safeStringify","completedAt","mailOptions","replyTo","reply_to","undefined","send_from","MAIL_FROM","to","subject","match","text","html","map","newAtt","__assign","encoding","_bsontype","sub_type","sendMail","info","err_1","obj","getCircularReplacer","e","message","seen","WeakSet","key","sendTo","local_override","Array","isArray","isBuffer","__v","date","history","getAWS","readFile","fileName","existsSync","join","__dirname","getClientDir","readImage"],"mappings":"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","file":"method.manager.js","sourcesContent":["import { ServerResponseModel } from '../models/server-response.model';\nimport { loadCollectionMethods } from '../methods/collections';\nimport { MethodModel } from '../models/method.model';\nimport { loadLogMethods } from '../methods/logs';\nimport { loadCounterMethods } from '../methods/counters';\nimport { loadPDFMethods } from '../methods/pdf';\nimport { loadAWSMethods } from '../methods/aws';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport * as nodemailer from 'nodemailer';\nimport * as sesTransport from 'nodemailer-ses-transport';\nimport { loadAccountMethods } from '../methods/accounts';\nimport { loadServerInit } from '../fixtures/init';\nimport { loadServerCronJobs } from '../fixtures/cron-jobs';\nimport { loadCronJobMethods } from '../methods/cron-jobs';\nimport { loadFlagMethods } from '../methods/flags';\nimport { getBinarySize, objectIdHexString } from '../util/common';\nimport { Logs } from '../collections/log.collection';\nimport { LogMethodLatencies } from '../collections/log-method-latency.collection';\nimport * as moment from 'moment-timezone';\nimport { loadReportBuilderMethods } from '../methods/report-builder';\nimport { loadSupportMethods } from '../methods/support';\nimport { loadMonitorMethods } from '../methods/monitor';\nimport { EmailHistories } from '../collections/email-history.collection';\nimport { MonitorManagerFunction } from './monitor.manager';\nimport { S3 } from '@aws-sdk/client-s3';\nimport { WorkerTaskRequests } from '../collections/worker-task-request.collection';\nimport { WorkerTaskResponses } from '../collections/worker-task-response.collection';\nimport { WebSocketManager } from './websocket.manager';\nimport * as WebSocket from 'ws';\nimport { loadFlagUpdatesMethods } from '../methods/flag-updates';\nimport { EmailHistoryModel } from '../models/email-history.model';\nimport { ResolveIOServer } from '../resolveio-server-app';\n\nexport class AWS {\n\tprivate _s3: S3 = null;\n\tprivate _s3USEast1: S3 = null;\n\n\tconstructor() {\n\n\t}\n\n\tpublic s3(): S3 {\n\t\tif (this._s3) {\n\t\t\treturn this._s3;\n\t\t}\n\n\t\tthis._s3 = new S3({\n\t\t\tcredentials: {\n\t\t\t\taccessKeyId: process.env.AWS_ACCESS_KEY,\n\t\t\t\tsecretAccessKey: process.env.AWS_SECRET_ACCESS_KEY\n\t\t\t},\n\t\t\tregion: process.env.AWS_REGION,\n\t\t\tapiVersion: '2006-03-01'\n\t\t});\n\n\t\treturn this._s3;\n\t}\n\n\tpublic s3USEast1(): S3 {\n\t\tif (process.env.AWS_REGION === 'us-east-1') {\n\t\t\treturn this.s3();\n\t\t}\n\t\telse {\n\t\t\tif (this._s3USEast1) {\n\t\t\t\treturn this._s3USEast1;\n\t\t\t}\n\t\t\t\n\t\t\tthis._s3USEast1 = new S3({\n\t\t\t\tcredentials: {\n\t\t\t\t\taccessKeyId: process.env.AWS_ACCESS_KEY,\n\t\t\t\t\tsecretAccessKey: process.env.AWS_SECRET_ACCESS_KEY\n\t\t\t\t},\n\t\t\t\tregion: 'us-east-1',\n\t\t\t\tapiVersion: '2006-03-01'\n\t\t\t});\n\t\n\t\t\treturn this._s3USEast1;\n\t\t}\n\t}\n}\n\nexport class MethodManager {\n\tprivate _websocketManager: WebSocketManager;\n\tpublic _methods: MethodModel = {};\n\tprivate _mailer: nodemailer.Transporter;\n\tprivate _aws: AWS;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tprivate emailQueue: Set<string> = new Set(); // Set to store pending email IDs\n\tprivate isEmailProcessing = false;\n\n\tprivate _debugCallMethodInternalHits = 0;\n\tprivate _debugCallMethodHits = 0;\n\tprivate _debugCallMethodCronJobHits = 0;\n\tprivate _debugSendQueueHits = 0;\n\n\tconstructor(monitorManagerFunction: MonitorManagerFunction, isWorkersEnabled, isWorkerInstance) {\n\t\tthis._websocketManager = ResolveIOServer.getMainServer().getWebSocketManager();\n\t\tthis._monitorManagerFunction = monitorManagerFunction;\n\t\tthis._isWorkersEnabled = isWorkersEnabled;\n\t\tthis._isWorkerInstance = isWorkerInstance;\n\n\t\t// Fixtures\n\t\tif (process.env.IS_WORKERS_ENABLED === 'false' || (process.env.IS_WORKER_INSTANCE === 'true' && process.env.WORKER_INDEX === '0')) {\n\t\t\tif (!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconsole.log(new Date(), 'Start Server Fixture');\n\t\t\t\t\tloadServerInit();\n\t\t\t\t\tconsole.log(new Date(), 'End Server Fixture');\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t}\n\n\t\tloadServerCronJobs();\n\n\t\t// Methods\n\t\tloadAccountMethods(this);\n\t\tloadAWSMethods(this);\n\t\tloadCollectionMethods(this);\n\t\tloadCounterMethods(this);\n\t\tloadLogMethods(this);\n\t\tloadPDFMethods(this);\n\t\tloadCronJobMethods(this);\n\t\tloadFlagMethods(this);\n\t\tloadFlagUpdatesMethods(this);\n\t\tloadReportBuilderMethods(this);\n\t\tloadSupportMethods(this);\n\t\tloadMonitorMethods(this);\n\n\t\tthis._aws = new AWS();\n\n\t\tif (ResolveIOServer.getSESMail()) {\n\t\t\tthis._mailer = nodemailer.createTransport(sesTransport({\n\t\t\t\taccessKeyId: process.env.AWS_ACCESS_KEY,\n\t\t\t\tsecretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n\t\t\t\tregion: process.env.AWS_SES_REGION\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tthis._mailer = nodemailer.createTransport({\n\t\t\t\thost: ResolveIOServer.getServerConfig()['MAIL_HOST'], // 'smtp.office365.com', // Office 365 server\n\t\t\t\tport: ResolveIOServer.getServerConfig()['MAIL_PORT'], //587, // secure SMTP\n\t\t\t\tsecure: false, // false for TLS - as a boolean not string - but the default is false so just remove this completely\n\t\t\t\tauth: {\n\t\t\t\t\tuser: ResolveIOServer.getServerConfig()['MAIL_USERNAME'],\n\t\t\t\t\tpass: ResolveIOServer.getServerConfig()['MAIL_PASSWORD']\n\t\t\t\t},\n\t\t\t\ttls: {\n\t\t\t\t\tciphers: 'SSLv3'\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tsetInterval(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Method Manager', 'Send Queue Hits', this._debugSendQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Method Manager', 'Call Method Internal Hits', this._debugCallMethodInternalHits);\n\t\t\t\tconsole.log(new Date(), 'Method Manager', 'Call Method Hits', this._debugCallMethodHits);\n\t\t\t\tconsole.log(new Date(), 'Method Manager', 'Call Method Cron Hits', this._debugCallMethodCronJobHits);\n\t\t\t}\n\n\t\t\tthis._debugCallMethodInternalHits = 0;\n\t\t\tthis._debugCallMethodHits = 0;\n\t\t\tthis._debugCallMethodCronJobHits = 0;\n\t\t\tthis._debugSendQueueHits = 0;\n\t\t}, 60000);\n\n\t\tif (!this._isWorkersEnabled || this._isWorkerInstance) {\n\t\t\tthis.setupEmailWatcher();\n\t\t}\n\t}\n\n\t// Add methods to private methods object\n\tpublic methods(method: MethodModel) {\n\t\tthis._methods = Object.assign(this._methods, method);\n\t}\n\n\tpublic callMethodCron(method: string, ...methodData: any[]) {\n\t\tthis._debugCallMethodCronJobHits += 1;\n\n\t\tif (!this._methods[method]) {\n\t\t\tconsole.log('No Method: ' + method);\n\n\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Method: ' + method);\n\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((methodData.length > 1 || methodData[0]) && !this._methods[method].skipValidation) {\n\t\t\tif (!this._methods[method].check) {\n\t\t\t\tconsole.error(new Date(), 'No Check Function For Method ' + method);\n\n\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Check Function For Method ' + method);\n\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (!this._methods[method].check._schema) {\n\t\t\t\tconsole.error(new Date(), 'No Check Schema For Method ' + method);\n\n\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Check Function For Method ' + method);\n\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet valObj = {};\n\t\t\t\tlet valKeys = Object.keys(this._methods[method].check._schema);\n\n\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\t\t\t\t\n\t\t\t\tfor (let i = 0; i < methodData.length; i++) {\n\t\t\t\t\tvalObj[rootKeys[i]] = methodData[i];\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tthis._methods[method].check.validate(valObj);\n\t\t\t\t}\n\t\t\t\tcatch (errors) {\n\t\t\t\t\tif (errors) {\n\t\t\t\t\t\tconsole.error(new Date(), 'Error in Method Check (' + method + ')', errors);\n\n\t\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'Match Error On Method ' + method + '\\n\\nData Being Checked\\n' + JSON.stringify(valObj, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(errors, null, 2));\n\t\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet promise = null;\n\n\t\t// To prevent extremely large data being inserted, let's split it up into references if needed\n\t\t// For example, if `methodData` is huge, we can store large arrays/objects into a separate collection\n\t\t// and only store references in the worker-task-requests doc. This avoids hitting the 16MB BSON limit.\n\t\tlet MAX_DOCUMENT_SIZE = 1024 * 1024 * 8; // 8MB as a threshold before we chunk (just an example threshold)\n\t\tlet serializedData = JSON.stringify(methodData);\n\n\t\t// Check if workers are enabled and this is not a worker instance\n\t\tif (this._isWorkersEnabled && \n\t\t\t!this._isWorkerInstance && \n\t\t\tBuffer.byteLength(serializedData, 'utf8') < MAX_DOCUMENT_SIZE &&\n\t\t\tmethod !== 'insertSubscriptionLog' && \n\t\t\tmethod !== 'countQuery' &&\n\t\t\tmethod !== 'incCounter' && \n\t\t\tmethod !== 'supportCreateBillingUser' &&\n\t\t\tmethod !== 'find' &&\n\t\t\tmethod !== 'insertDocument' &&\n\t\t\tmethod !== 'countWithQuery' &&\n\t\t\tmethod !== 'findOne' &&\n\t\t\tmethod !== 'updateDocumentProps' &&\n\t\t\tmethod !== 'findWithOptions' &&\n\t\t\tmethod !== 'getSignedUrl' &&\n\t\t\tmethod !== 'updateDocument' &&\n\t\t\tmethod !== 'insertErrorLog' &&\n\t\t\tmethod !== 'getSignedUrls' &&\n\t\t\tmethod !== 'removeDocument' &&\n\t\t\tmethod !== 'getSignedUrlWithId' &&\n\t\t\tmethod !== 'incorrectUser' &&\n\t\t\tmethod !== 'reloadWS' &&\n\t\t\tmethod !== 'reconnectWS' &&\n\t\t\tmethod !== 'disconnectWS'\n\t\t) {\t\t\t\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Cron Method', method, '', '', methodData);\n\n\t\t\t// Push task to worker-task-reqs collection\n\t\t\tconst taskId = objectIdHexString();\n\n\t\t\t// Watch worker-task-resps for result\n\t\t\tpromise = new Promise((resolve, reject) => {\n\t\t\t\tlet changeStream = WorkerTaskResponses.watchCollection([{ $match: { 'fullDocument.id_request': taskId } }], { fullDocument: 'updateLookup' });\n\n\t\t\t\tchangeStream.on('change', change => {\n\t\t\t\t\tif (change.operationType === 'insert') {\n\t\t\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\t\t\tconst taskResponse = change.fullDocument;\n\n\t\t\t\t\t\tif (taskResponse.has_error) {\n\t\t\t\t\t\t\treject(taskResponse.data); // Task failed, return error\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(taskResponse.data); // Task succeeded, return result\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchangeStream.close(); // Close the cursor after receiving response\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tchangeStream.on('error', error => {\n\t\t\t\t\tconsole.error('Error watching worker responses:', error);\n\t\t\t\t\treject(error);\n\t\t\t\t\tchangeStream.close();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tWorkerTaskRequests.create({\n\t\t\t\t_id: taskId,\n\t\t\t\tmethod: method,\n\t\t\t\tparams: methodData,\n\t\t\t\tstatus: 'pending',\n\t\t\t\tid_user: this['id_user'],\n\t\t\t\tuser: this['user'],\n\t\t\t\tid_ws: this['id_socket']\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Cron Method', method, '', '', methodData);\n\t\t\tpromise = this._methods[method].function.call(Object.assign({}, this, MethodManager.prototype, {id_user: '', user: '', id_ws: ''}), ...methodData)\n\t\t\t.then(res => {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t\treturn res;\n\t\t\t}, methodErrs => {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'Error Detected During Method ' + method + ' - (callMethodCron)\\n\\nData \\n' + JSON.stringify(methodData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(methodErrs, null, 2));\n\t\t\t\treturn methodErrs;\n\t\t\t});\n\t\t}\n\n\t\treturn promise;\n\t}\n\n\t// Call/run method (Emit on Socket)\n\tpublic callMethod(id_methodLatency: string, ws: WebSocket, messageDate: Date, messageId: number, method: string, ...methodData: any[]) {\n\t\tthis._debugCallMethodHits += 1;\n\t\n\t\tif (!this._methods[method]) {\n\t\t\tconsole.log('No Method: ' + method);\n\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Method: ' + method);\n\t\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: true,\n\t\t\t\tdata: 'Internal Error'\n\t\t\t};\n\t\n\t\t\tthis.sendWS(ws, new Date(), method, methodData, serverRes);\n\t\n\t\t\tif (id_methodLatency) {\n\t\t\t\tLogMethodLatencies.deleteOne({_id: id_methodLatency});\n\t\t\t}\n\t\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ((methodData.length > 1 || methodData[0]) && !this._methods[method].skipValidation) {\n\t\t\tif (!this._methods[method].check) {\n\t\t\t\tconsole.error(new Date(), 'No Check Function For Method ' + method);\n\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Check Function For Method ' + method);\n\t\t\t\t\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: 'Internal Error'\n\t\t\t\t};\n\t\n\t\t\t\tthis.sendWS(ws, messageDate, method, methodData, serverRes);\n\t\n\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\tLogMethodLatencies.deleteOne({ _id: id_methodLatency });\n\t\t\t\t}\n\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (!this._methods[method].check._schema) {\n\t\t\t\tconsole.error(new Date(), 'No Check Schema For Method ' + method);\n\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Check Schema For Method ' + method);\n\t\t\t\t\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: 'Internal Error'\n\t\t\t\t};\n\t\n\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\tLogMethodLatencies.deleteOne({ _id: id_methodLatency });\n\t\t\t\t}\n\t\n\t\t\t\tthis.sendWS(ws, messageDate, method, methodData, serverRes);\n\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet valObj = {};\n\t\t\t\tlet valKeys = Object.keys(this._methods[method].check._schema);\n\t\n\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\t\n\t\t\t\tfor (let i = 0; i < methodData.length; i++) {\n\t\t\t\t\tvalObj[rootKeys[i]] = methodData[i];\n\t\t\t\t}\n\t\n\t\t\t\ttry {\n\t\t\t\t\tthis._methods[method].check.validate(valObj);\n\t\t\t\t}\n\t\t\t\tcatch (errors) {\n\t\t\t\t\tif (errors) {\n\t\t\t\t\t\tconsole.error(new Date(), 'Error in Method Check (' + method + ')', errors);\n\t\n\t\t\t\t\t\tif (method !== 'processAirdropDistribution') {\n\t\t\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'Match Error On Method ' + method + '\\n\\nData Being Checked\\n' + JSON.stringify(valObj, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(errors, null, 2));\n\t\t\t\t\t\t}\n\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: true,\n\t\t\t\t\t\t\tdata: 'Internal Error'\n\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\tthis.sendWS(ws, messageDate, method, methodData, serverRes);\n\t\n\t\t\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\t\t\tLogMethodLatencies.deleteOne({ _id: id_methodLatency });\n\t\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// To prevent extremely large data being inserted, let's split it up into references if needed\n\t\t// For example, if `methodData` is huge, we can store large arrays/objects into a separate collection\n\t\t// and only store references in the worker-task-requests doc. This avoids hitting the 16MB BSON limit.\n\t\tlet MAX_DOCUMENT_SIZE = 1024 * 1024 * 8; // 8MB as a threshold before we chunk (just an example threshold)\n\t\tlet serializedData = JSON.stringify(methodData);\n\t\n\t\t// Check if workers are enabled and this is not a worker instance\n\t\tif (this._isWorkersEnabled && \n\t\t\t!this._isWorkerInstance && \n\t\t\tBuffer.byteLength(serializedData, 'utf8') < MAX_DOCUMENT_SIZE &&\n\t\t\tmethod !== 'insertSubscriptionLog' && \n\t\t\tmethod !== 'countQuery' && method !== 'incCounter' && \n\t\t\tmethod !== 'supportCreateBillingUser' &&\n\t\t\tmethod !== 'find' &&\n\t\t\tmethod !== 'insertDocument' &&\n\t\t\tmethod !== 'countWithQuery' &&\n\t\t\tmethod !== 'findOne' &&\n\t\t\tmethod !== 'updateDocumentProps' &&\n\t\t\tmethod !== 'findWithOptions' &&\n\t\t\tmethod !== 'getSignedUrl' &&\n\t\t\tmethod !== 'updateDocument' &&\n\t\t\tmethod !== 'insertErrorLog' &&\n\t\t\tmethod !== 'getSignedUrls' &&\n\t\t\tmethod !== 'removeDocument' &&\n\t\t\tmethod !== 'getSignedUrlWithId' &&\n\t\t\tmethod !== 'incorrectUser' &&\n\t\t\tmethod !== 'reloadWS' &&\n\t\t\tmethod !== 'reconnectWS' &&\n\t\t\tmethod !== 'disconnectWS'\n\t\t) {\t\n\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Method', method, ws['user'] || '', ws['id_socket'] || '', methodData);\n\t\t\t\n\t\t\tconst taskId = objectIdHexString();\n\t\n\t\t\tlet changeStream = WorkerTaskResponses.watchCollection([{ $match: { 'fullDocument.id_request': taskId } }], { fullDocument: 'updateLookup' });\n\t\n\t\t\tchangeStream.on('change', async change => {\n\t\t\t\tif (change.operationType === 'insert') {\n\t\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\n\t\t\t\t\tconst taskResponse = change.fullDocument;\n\t\n\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\thasError: taskResponse.has_error,\n\t\t\t\t\t\tdata: taskResponse.data\n\t\t\t\t\t};\n\t\n\t\t\t\t\tthis.sendWS(ws, new Date(), method, methodData, serverRes);\n\t\n\t\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\t\tlet latency = await LogMethodLatencies.findById(id_methodLatency);\n\t\t\t\t\t\tif (latency) {\n\t\t\t\t\t\t\tLogMethodLatencies.updateOne({_id: id_methodLatency}, {$set: {date_end: new Date(), latency_ms: moment().diff(moment(latency.date_start), 'milliseconds', true)}});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tchangeStream.close();\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\tchangeStream.on('error', error => {\n\t\t\t\tconsole.error('Error watching worker responses:', error);\n\t\t\t\tchangeStream.close();\n\t\t\t});\n\t\n\t\t\tWorkerTaskRequests.create({\n\t\t\t\t_id: taskId,\n\t\t\t\tmethod: method,\n\t\t\t\tparams: methodData,\n\t\t\t\tstatus: 'pending',\n\t\t\t\tid_user: ws['id_user'],\n\t\t\t\tuser: ws['user'],\n\t\t\t\tid_ws: ws['id_socket']\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Method', method, ws['user'] || '', ws['id_socket'] || '', methodData);\n\t\t\tthis._methods[method].function.call(Object.assign({}, this, MethodManager.prototype, {id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket']}), ...methodData)\n\t\t\t.then(async (res) => {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: res\n\t\t\t\t};\n\t\n\t\t\t\tthis.sendWS(ws, messageDate, method, methodData, serverRes);\n\t\n\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\tlet latency = await LogMethodLatencies.findById(id_methodLatency);\n\t\t\t\t\tif (latency) {\n\t\t\t\t\t\tLogMethodLatencies.updateOne({_id: id_methodLatency}, {$set: {date_end: new Date(), latency_ms: moment().diff(moment(latency.date_start), 'milliseconds', true)}});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\terr => {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: err\n\t\t\t\t};\n\t\n\t\t\t\tthis.sendWS(ws, messageDate, method, methodData, serverRes);\n\t\n\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\tLogMethodLatencies.deleteOne({_id: id_methodLatency});\n\t\t\t\t}\n\t\n\t\t\t\tif (method !== 'processAirdropDistribution') {\n\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'Error Detected During Method ' + method + ' - (callMethod)\\n\\nData \\n' + JSON.stringify(methodData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Call/run method internal (No Emit on Socket)\n\tpublic callMethodInternal(method: string, ...methodData: any[]): Promise<any> {\n\t\tthis._debugCallMethodInternalHits += 1;\n\n\t\tif (!this._methods[method]) {\n\t\t\tconsole.log('No Method: ' + method);\n\t\t\treturn null;\n\t\t}\n\n\t\tif ((methodData.length > 1 || (methodData[0] && typeof methodData[0] !== 'function')) && !this._methods[method].skipValidation) {\n\t\t\tif (!this._methods[method].check) {\n\t\t\t\tconsole.error(new Date(), 'No Check Function For Method ' + method);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telse if (!this._methods[method].check._schema) {\n\t\t\t\tconsole.error(new Date(), 'No Check Schema For Method ' + method);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tif (method !== 'insertSubscriptionLog' && method !== 'getDataURIfromURL' && method !== 'processAirdropDistribution' && method !== 'incCounter' && method !== 'supportCreateBillingUser' && method !== 'countCollectionWithQuery') {\n\t\t\tLogs.insertOne({\n\t\t\t\t_id: objectIdHexString(),\n\t\t\t\ttype: 'callMethodInternal',\n\t\t\t\tcollection: '',\n\t\t\t\tid_document: '',\n\t\t\t\tpayload: getBinarySize(JSON.stringify([methodData])) < 200000 ? JSON.stringify([methodData], null, 2) : 'Too Big',\n\t\t\t\tmethod: method,\n\t\t\t\tid_user: this['id_user'] || '',\n\t\t\t\tuser: this['user'] || '',\n\t\t\t\tmessageId: 0,\n\t\t\t\troute: ''\n\t\t\t});\n\t\t}\n\n\t\tlet functionMethodData = typeof(methodData[methodData.length - 1]) === 'function' ? methodData.slice(0, -1) : methodData;\n\t\tlet promise = null;\n\n\t\t// To prevent extremely large data being inserted, let's split it up into references if needed\n\t\t// For example, if `methodData` is huge, we can store large arrays/objects into a separate collection\n\t\t// and only store references in the worker-task-requests doc. This avoids hitting the 16MB BSON limit.\n\t\tlet MAX_DOCUMENT_SIZE = 1024 * 1024 * 8; // 8MB as a threshold before we chunk (just an example threshold)\n\t\tlet serializedData = JSON.stringify(functionMethodData);\n\n\t\tif (this._isWorkersEnabled && \n\t\t\t!this._isWorkerInstance && \n\t\t\tBuffer.byteLength(serializedData, 'utf8') < MAX_DOCUMENT_SIZE &&\n\t\t\tmethod !== 'insertSubscriptionLog' && \n\t\t\tmethod !== 'countQuery' && method !== 'incCounter' && \n\t\t\tmethod !== 'supportCreateBillingUser' &&\n\t\t\tmethod !== 'find' &&\n\t\t\tmethod !== 'insertDocument' &&\n\t\t\tmethod !== 'countWithQuery' &&\n\t\t\tmethod !== 'findOne' &&\n\t\t\tmethod !== 'updateDocumentProps' &&\n\t\t\tmethod !== 'findWithOptions' &&\n\t\t\tmethod !== 'getSignedUrl' &&\n\t\t\tmethod !== 'updateDocument' &&\n\t\t\tmethod !== 'insertErrorLog' &&\n\t\t\tmethod !== 'getSignedUrls' &&\n\t\t\tmethod !== 'removeDocument' &&\n\t\t\tmethod !== 'getSignedUrlWithId' &&\n\t\t\tmethod !== 'incorrectUser' &&\n\t\t\tmethod !== 'reloadWS' &&\n\t\t\tmethod !== 'reconnectWS' &&\n\t\t\tmethod !== 'disconnectWS'\n\t\t) {\t\t\t\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Internal Method', method, this['user'] || '', '', functionMethodData);\n\n\t\t\t// Push task to worker-task-reqs collection\n\t\t\tconst taskId = objectIdHexString();\n\n\t\t\t// Watch worker-task-resps for result\n\t\t\tpromise = new Promise((resolve, reject) => {\n\t\t\t\tlet changeStream = WorkerTaskResponses.watchCollection([{ $match: { 'fullDocument.id_request': taskId } }], { fullDocument: 'updateLookup' });\n\n\t\t\t\tchangeStream.on('change', (change) => {\n\t\t\t\t\tif (change.operationType === 'insert') {\n\t\t\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\t\t\tconst taskResponse = change.fullDocument;\n\n\t\t\t\t\t\tif (taskResponse.has_error) {\n\t\t\t\t\t\t\treject(taskResponse.data); // Task failed, return error\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(taskResponse.data); // Task succeeded, return result\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchangeStream.close(); // Close the cursor after receiving response\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tchangeStream.on('error', error => {\n\t\t\t\t\tconsole.error('Error watching worker responses:', error);\n\t\t\t\t\treject(error);\n\t\t\t\t\tchangeStream.close();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tWorkerTaskRequests.create({\n\t\t\t\t_id: taskId,\n\t\t\t\tmethod: method,\n\t\t\t\tparams: functionMethodData,\n\t\t\t\tstatus: 'pending',\n\t\t\t\tid_user: this['id_user'],\n\t\t\t\tuser: this['user'],\n\t\t\t\tid_ws: this['id_socket']\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Internal Method', method, this['user'] || '', '', functionMethodData);\n\t\t\tpromise = this._methods[method].function.call(Object.assign({}, this, MethodManager.prototype), ...functionMethodData)\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t\t\treturn res;\n\t\t\t\t},\n\t\t\t\tmethodErrs => {\n\t\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'Error Detected During Method ' + method + ' - (callMethodInternal)\\n\\nData \\n' + JSON.stringify(methodData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(methodErrs, null, 2));\n\t\t\t\t\treturn methodErrs;\n\t\t\t\t});\n\t\t}\n\n\t\tif (methodData[methodData.length - 1] && typeof(methodData[methodData.length - 1]) === 'function') {\n\t\t\tpromise.then(res => methodData[methodData.length - 1](null, res), err => methodData[methodData.length - 1](err, null));\n\t\t}\n\t\t\n\t\treturn promise;\n\t}\n\n\tprivate sendWS(ws: WebSocket, messageDate: Date, method: string, methodData: any[], data: ServerResponseModel) {\n\t\tthis._websocketManager.send(ws, data);\n\n\t\tif (\n\t\t\tmethod !== 'reportBuilderGetResults' &&\n\t\t\tmethod !== 'reportBuilderGetDistinctValue' &&\n\t\t\tmethod !== 'reportBuilderBuildTree' &&\n\t\t\tmethod !== 'generatePDF' &&\n\t\t\tmethod !== 'getWOOfflineData' &&\n\t\t\tmethod !== 'countQuery' &&\n\t\t\tmethod !== 'countWithQuery' &&\n\t\t\tmethod !== 'countCollectionWithQuery' &&\n\t\t\tmethod !== 'find' &&\n\t\t\tmethod !== 'findOne' &&\n\t\t\tmethod !== 'findWithOptions' &&\n\t\t\tmethod !== 'uploadFileAndSave' &&\n\t\t\tmethod !== 'getDrivers' &&\n\t\t\tmethod !== 'processAirdropDistribution'\n\t\t) {\n\t\t\tLogs.insertOne({\n\t\t\t\t_id: objectIdHexString(),\n\t\t\t\ttype: 'client-response',\n\t\t\t\tcollection: '',\n\t\t\t\tid_document: '',\n\t\t\t\tpayload:\n\t\t\t\t\tgetBinarySize(JSON.stringify([methodData, data])) < 200000\n\t\t\t\t\t\t? JSON.stringify([methodData, data], null, 2)\n\t\t\t\t\t\t: 'Too Big',\n\t\t\t\tmethod: method,\n\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\tuser: ws['user'] || '',\n\t\t\t\tmessageId: data.messageId,\n\t\t\t\troute: ''\n\t\t\t});\n\t\t}\n\n\t\t// MethodResponses.create({\n\t\t// \t_id: objectIdHexString(),\n\t\t// \t__v: 0,\n\t\t// \tid_user: ws['id_user'] || '',\n\t\t// \tmessage_id: data.messageId,\n\t\t// \tresponse: getBinarySize(JSON.stringify(data)) < 200000 ? data : { error: 'Too Big' },\n\t\t// \tmethod: method,\n\t\t// \tdate: messageDate\n\t\t// });\n\t}\n\n\tasync setupEmailWatcher() {\n\t\tconst changeStream = EmailHistories.watchCollection([]);\n\n\t\tchangeStream.on('change', async (change) => {\n\t\t\tif (change.operationType === 'insert' && change.fullDocument && change.fullDocument.status === 'pending') {\n\t\t\t\tthis.emailQueue.add(change.fullDocument._id.toString());\n\t\t\t\tthis.tryProcessEmail();\n\t\t\t}\n\t\t\telse if (change.operationType === 'update' || change.operationType === 'replace') {\n\t\t\t\tconst updatedEmail = change.fullDocument;\n\t\t\t\tif (updatedEmail && updatedEmail.status !== 'pending' && this.emailQueue.has(updatedEmail._id.toString())) {\n\t\t\t\t\tthis.emailQueue.delete(updatedEmail._id.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\t.on('error', err => {\n\t\t\tconsole.error('Email history changestream error', err);\n\t\t\tchangeStream.close();\n\t\t})\n\t\t.on('close', () => {\n\t\t\tthis.setupEmailWatcher();\n\t\t});\n\n\t\tawait this.loadPendingEmails();\n\t}\n\n\tasync loadPendingEmails() {\n\t\t// Load any pending emails on startup\n\t\tconst pendingEmails = await EmailHistories.find({ status: 'pending' }, {sort: {_id: 1}});\n\t\tfor (const email of pendingEmails) {\n\t\t\tthis.emailQueue.add(email._id.toString());\n\t\t}\n\t\t// Try to process emails\n\t\tthis.tryProcessEmail();\n\t}\n\n\tasync tryProcessEmail() {\n\t\tif (this.isEmailProcessing || this.emailQueue.size === 0) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tthis.isEmailProcessing = true;\n\t\n\t\ttry {\n\t\t\twhile (this.emailQueue.size > 0) {\n\t\t\t\tconst emailId = this.emailQueue.values().next().value;\n\t\t\t\tthis.emailQueue.delete(emailId);\n\t\n\t\t\t\tconst emailHistory = await EmailHistories.findOneAndUpdate(\n\t\t\t\t\t{\n\t\t\t\t\t\t_id: emailId,\n\t\t\t\t\t\tstatus: 'pending',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t$set: { status: 'processing', processingAt: new Date() },\n\t\t\t\t\t}\n\t\t\t\t);\n\t\n\t\t\t\tif (!emailHistory) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\n\t\t\t\t// Fetch and process attachments\n\t\t\t\tif (emailHistory.attachments && emailHistory.attachments.length > 0) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (let att of emailHistory.attachments) {\n\t\t\t\t\t\t\tif (att.path && att.path.startsWith('http')) {\n\t\t\t\t\t\t\t\tconst response = await fetch(att.path);\n\t\t\t\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`Failed to fetch attachment: ${att.path}`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst arrayBuffer = await response.arrayBuffer();\n\t\t\t\t\t\t\t\tconst buffer = Buffer.from(arrayBuffer);\n\t\n\t\t\t\t\t\t\t\t// Check the size of the attachment\n\t\t\t\t\t\t\t\tconst maxSize = 20 * 1024 * 1024; // 20MB in bytes\n\t\t\t\t\t\t\t\tif (buffer.length <= maxSize) {\n\t\t\t\t\t\t\t\t\t// Attachment is within size limits, include it\n\t\t\t\t\t\t\t\t\tatt.content = buffer;\n\t\t\t\t\t\t\t\t\tdelete att.path;\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\tcatch (err) {\n\t\t\t\t\t\tconsole.error('Failed to fetch attachment:', err);\n\t\n\t\t\t\t\t\tawait EmailHistories.updateOne(\n\t\t\t\t\t\t\t{ _id: emailHistory._id },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\t\t\tstatus: 'failed',\n\t\t\t\t\t\t\t\t\terror: typeof err === 'string' ? err : this.safeStringify(err),\n\t\t\t\t\t\t\t\t\tcompletedAt: new Date(),\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\t// Skip to the next email\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Prepare email options\n\t\t\t\tconst mailOptions: any = {\n\t\t\t\t\treplyTo: emailHistory.reply_to || (ResolveIOServer.getServerConfig()['MAIL_REPLY_TO'] || undefined),\n\t\t\t\t\tfrom: emailHistory.send_from || ResolveIOServer.getServerConfig().MAIL_FROM,\n\t\t\t\t\tto: emailHistory.email,\n\t\t\t\t\tsubject:\n\t\t\t\t\t\t(ResolveIOServer.getServerConfig()['ROOT_URL'].match(/https:\\/\\/dev\\./) ||\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'].match(/https:\\/\\/www\\.dev\\./)\n\t\t\t\t\t\t\t? '(DEV SERVER) - '\n\t\t\t\t\t\t\t: '') + emailHistory.subject,\n\t\t\t\t\ttext: typeof emailHistory.text === 'string' ? emailHistory.text : '',\n\t\t\t\t\thtml: typeof emailHistory.html === 'string' ? emailHistory.html : '',\n\t\t\t\t\tattachments: emailHistory.attachments || [],\n\t\t\t\t};\n\t\n\t\t\t\t// Process attachments before sending\n\t\t\t\tif (mailOptions.attachments && mailOptions.attachments.length > 0) {\n\t\t\t\t\tmailOptions.attachments = mailOptions.attachments.map((att) => {\n\t\t\t\t\t\tconst newAtt = { ...att };\n\t\t\t\t\t\t// Handle attachments stored as BinData or Buffer\n\t\t\t\t\t\tif (newAtt.content && typeof newAtt.content === 'object' && !(newAtt.content instanceof Buffer)) {\n\t\t\t\t\t\t\t// Convert MongoDB's Binary data to Buffer\n\t\t\t\t\t\t\tif (newAtt.content._bsontype === 'Binary' && newAtt.content.sub_type === 0) {\n\t\t\t\t\t\t\t\tnewAtt.content = Buffer.from(newAtt.content.buffer);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t// Handle other types if necessary\n\t\t\t\t\t\t\t\tnewAtt.content = Buffer.from(newAtt.content);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Handle attachments stored as Base64 strings\n\t\t\t\t\t\telse if (typeof newAtt.content === 'string' && newAtt.encoding === 'base64') {\n\t\t\t\t\t\t\tnewAtt.content = Buffer.from(newAtt.content, 'base64');\n\t\t\t\t\t\t\tdelete newAtt.encoding;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Ensure the content is a Buffer\n\t\t\t\t\t\telse if (typeof newAtt.content === 'string') {\n\t\t\t\t\t\t\tnewAtt.content = Buffer.from(newAtt.content);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn newAtt;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\n\t\t\t\t// Send the email\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tthis._mailer.sendMail(mailOptions, async (err, info) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\tconsole.error('Failed to send email:', err);\n\t\t\t\t\t\t\t\tEmailHistories.updateOne(\n\t\t\t\t\t\t\t\t\t{ _id: emailHistory._id },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\t\t\t\t\tstatus: 'failed',\n\t\t\t\t\t\t\t\t\t\t\terror: typeof err === 'string' ? err : this.safeStringify(err),\n\t\t\t\t\t\t\t\t\t\t\tcompletedAt: new Date(),\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\telse {\n\t\t\t\t\t\t\t\tif (emailHistory.email === 'dev@resolveio.com') {\n\t\t\t\t\t\t\t\t\tEmailHistories.deleteOne({ _id: emailHistory._id });\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\tEmailHistories.updateOne(\n\t\t\t\t\t\t\t\t\t\t{ _id: emailHistory._id },\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\t\t\t\t\t\tstatus: 'completed',\n\t\t\t\t\t\t\t\t\t\t\t\tcompletedAt: new Date(),\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}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (error) {\n\t\t\t\t\t\t\tconsole.error('Error in sendMail callback:', error);\n\t\t\t\t\t\t\tEmailHistories.updateOne(\n\t\t\t\t\t\t\t\t{ _id: emailHistory._id },\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\t\t\t\tstatus: 'failed',\n\t\t\t\t\t\t\t\t\t\terror: typeof error === 'string' ? error : this.safeStringify(error),\n\t\t\t\t\t\t\t\t\t\tcompletedAt: new Date(),\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} finally {\n\t\t\t\t\t\t\tresolve(); // Continue processing the queue\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\n\t\t\t\t// Wait for at least one second before sending the next email\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Error processing email queue:', err);\n\t\t}\n\t\tfinally {\n\t\t\tthis.isEmailProcessing = false;\n\t\t\t// Check if new emails arrived while processing\n\t\t\tif (this.emailQueue.size > 0) {\n\t\t\t\tthis.tryProcessEmail();\n\t\t\t}\n\t\t}\n\t}\n\n\tsafeStringify(obj)\n\t{\n\t\ttry\n\t\t{\n\t\t\treturn JSON.stringify(obj, this.getCircularReplacer());\n\t\t}\n\t\tcatch (e)\n\t\t{\n\t\t\treturn `Error in JSON stringifying: ${e.message}`;\n\t\t}\n\t}\n\n\tgetCircularReplacer()\n\t{\n\t\tconst seen = new WeakSet();\n\t\treturn (key, value) =>\n\t\t{\n\t\t\tif (typeof value === \"object\" && value !== null)\n\t\t\t{\n\t\t\t\tif (seen.has(value))\n\t\t\t\t{\n\t\t\t\t\treturn \"[Circular]\";\n\t\t\t\t}\n\t\t\t\tseen.add(value);\n\t\t\t}\n\t\t\treturn value;\n\t\t};\n\t}\n\n\tpublic sendEmail(\n\t\tsendTo: string,\n\t\tsubject: string,\n\t\ttext?: string,\n\t\thtml?: string,\n\t\tattachments?: any[],\n\t\tsend_from?: string,\n\t\treply_to?: string,\n\t\tlocal_override = false\n\t) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t// Modify sendTo in development environments\n\t\t\tif (\n\t\t\t\t(ResolveIOServer.getServerConfig()['ROOT_URL'].match(/https:\\/\\/dev\\./) ||\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'].match(/https:\\/\\/www\\.dev\\./) ||\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] === 'http://localhost:4200') &&\n\t\t\t\t!sendTo.match(/\\@resolveio\\.com/)\n\t\t\t) {\n\t\t\t\tsendTo = 'dev@resolveio.com';\n\t\t\t}\n\t\n\t\t\tif (sendTo) {\n\t\t\t\tif (\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200' ||\n\t\t\t\t\tlocal_override\n\t\t\t\t) {\n\t\t\t\t\tif (!attachments) {\n\t\t\t\t\t\tattachments = [];\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!Array.isArray(attachments)) {\n\t\t\t\t\t\tattachments = [attachments];\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Process attachments before saving\n\t\t\t\t\tattachments = attachments.map((att) => {\n\t\t\t\t\t\tconst newAtt = { ...att };\n\t\t\t\t\t\tif (Buffer.isBuffer(newAtt.content)) {\n\t\t\t\t\t\t\tnewAtt.content = newAtt.content.toString('base64');\n\t\t\t\t\t\t\tnewAtt.encoding = 'base64';\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn newAtt;\n\t\t\t\t\t});\n\t\n\t\t\t\t\t// Queue the email in MongoDB\n\t\t\t\t\tconst emailHistory: EmailHistoryModel = {\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\tdate: new Date(),\n\t\t\t\t\t\tid_user: this['id_user'] || '',\n\t\t\t\t\t\tuser: this['user'] || '',\n\t\t\t\t\t\temail: sendTo,\n\t\t\t\t\t\tsubject: subject || '',\n\t\t\t\t\t\ttext: text || '',\n\t\t\t\t\t\thtml: html || '',\n\t\t\t\t\t\tattachments: attachments || [],\n\t\t\t\t\t\tsend_from: send_from || '',\n\t\t\t\t\t\treply_to: reply_to || '',\n\t\t\t\t\t\tstatus: 'pending',\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t};\n\t\n\t\t\t\t\tEmailHistories.insertOne(emailHistory).then(\n\t\t\t\t\t\t(history) => resolve(history),\n\t\t\t\t\t\t(err) => {\n\t\t\t\t\t\t\tconsole.error('Failed to queue email:', err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'Send email',\n\t\t\t\t\t\tsendTo,\n\t\t\t\t\t\tsubject,\n\t\t\t\t\t\ttext,\n\t\t\t\t\t\thtml,\n\t\t\t\t\t\tattachments,\n\t\t\t\t\t\tsend_from\n\t\t\t\t\t);\n\t\t\t\t\tresolve(true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tresolve(true);\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic getAWS(): AWS {\n\t\treturn this._aws;\n\t}\n\n\tpublic readFile(fileName) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (fs.existsSync(path.join(__dirname, ('../private/' + fileName)))) {\n\t\t\t\tfs.readFile(path.join(__dirname, ('../private/' + fileName)), 'utf-8', (err, res) => { \n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (fs.existsSync(path.join(ResolveIOServer.getClientDir(), ('./private/' + fileName)))) {\n\t\t\t\t\tfs.readFile(path.join(ResolveIOServer.getClientDir(), ('./private/' + fileName)), 'utf-8', (err, res) => { \n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic readImage(fileName) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (fs.existsSync(path.join(__dirname, ('../private/' + fileName)))) {\n\t\t\t\tfs.readFile(path.join(__dirname, ('../private/' + fileName)), 'base64', (err, res) => { \n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (fs.existsSync(path.join(ResolveIOServer.getClientDir(), ('./private/' + fileName)))) {\n\t\t\t\t\tfs.readFile(path.join(ResolveIOServer.getClientDir(), ('./private/' + fileName)), 'base64', (err, res) => { \n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}"]}
1
+ {"version":3,"sources":["../../src/managers/method.manager.ts"],"names":["collections_1","require","logs_1","counters_1","pdf_1","aws_1","path","fs","nodemailer","sesTransport","accounts_1","init_1","cron_jobs_1","cron_jobs_2","flags_1","common_1","log_collection_1","log_method_latency_collection_1","moment","report_builder_1","support_1","monitor_1","email_history_collection_1","client_s3_1","worker_task_request_collection_1","worker_task_response_collection_1","flag_updates_1","resolveio_server_app_1","AWS","this","_s3","_s3USEast1","prototype","s3","S3","credentials","accessKeyId","process","env","AWS_ACCESS_KEY","secretAccessKey","AWS_SECRET_ACCESS_KEY","region","AWS_REGION","apiVersion","s3USEast1","MethodManager","exports","monitorManagerFunction","isWorkersEnabled","isWorkerInstance","_this","_methods","_isWorkersEnabled","_isWorkerInstance","emailQueue","Set","isEmailProcessing","_debugCallMethodInternalHits","_debugCallMethodHits","_debugCallMethodCronJobHits","_debugSendQueueHits","clientDir","serverConfig","_websocketManager","ResolveIOServer","getMainServer","getWebSocketManager","_monitorManagerFunction","getClientDir","getServerConfig","IS_WORKERS_ENABLED","IS_WORKER_INSTANCE","WORKER_INDEX","NODE_APP_INSTANCE","setTimeout","console","log","Date","loadServerInit","loadServerCronJobs","loadAccountMethods","loadAWSMethods","loadCollectionMethods","loadCounterMethods","loadLogMethods","loadPDFMethods","loadCronJobMethods","loadFlagMethods","loadFlagUpdatesMethods","loadReportBuilderMethods","loadSupportMethods","loadMonitorMethods","_aws","getSESMail","_mailer","createTransport","AWS_SES_REGION","host","port","secure","auth","user","pass","tls","ciphers","setInterval","getSubscriptionManager","getEnableDebug","setupEmailWatcher","methods","method","Object","assign","callMethodCron","methodData","_i","arguments","length","skipValidation","check","error","sendEmail","_schema","valObj","rootKeys","keys","filter","a","includes","i","validate","errors","JSON","stringify","monitor_2","taskId_1","monitor_3","promise","serializedData","Buffer","byteLength","startMonitorFunction","objectIdHexString","Promise","resolve","reject","changeStream","WorkerTaskResponses","watchCollection","$match","fullDocument.id_request","fullDocument","on","change","operationType","finishMonitorFunction","taskResponse","has_error","data","close","WorkerTaskRequests","create","_id","params","status","id_user","id_ws","_a","function","call","apply","__spreadArray","__read","then","res","methodErrs","callMethod","id_methodLatency","ws","messageDate","messageId","sendWS","serverRes","hasError","LogMethodLatencies","deleteOne","monitor_4","changeStream_1","monitor_5","taskId","__awaiter","findById","latency","sent","updateOne","$set","date_end","latency_ms","diff","date_start","err","callMethodInternal","Logs","insertOne","type","collection","id_document","payload","getBinarySize","route","monitor_6","taskId_2","monitor_7","functionMethodData","slice","send","EmailHistories","add","toString","tryProcessEmail","updatedEmail","has","delete","loadPendingEmails","find","sort","pendingEmails","_b","pendingEmails_1","__values","pendingEmails_1_1","next","done","email","value","size","emailId","this_1","values","findOneAndUpdate","processingAt","emailHistory","_e","attachments","e_2","_c","att","startsWith","fetch","response","ok","arrayBuffer","Error","concat","buffer","from","content","err_2","safeStringify","completedAt","mailOptions","replyTo","reply_to","undefined","send_from","MAIL_FROM","to","subject","match","text","html","map","newAtt","__assign","encoding","_bsontype","sub_type","sendMail","info","err_1","obj","getCircularReplacer","e","message","seen","WeakSet","key","sendTo","local_override","Array","isArray","isBuffer","__v","date","history","getAWS","readFile","fileName","existsSync","join","__dirname","readImage"],"mappings":"ihFACAA,e,gGAAAC,QAAA,wBAAA,GAEAC,OAAAD,QAAA,iBAAA,EACAE,WAAAF,QAAA,qBAAA,EACAG,MAAAH,QAAA,gBAAA,EACAI,MAAAJ,QAAA,gBAAA,EACAK,KAAAL,QAAA,MAAA,EACAM,GAAAN,QAAA,IAAA,EACAO,WAAAP,QAAA,YAAA,EACAQ,aAAAR,QAAA,0BAAA,EACAS,WAAAT,QAAA,qBAAA,EACAU,OAAAV,QAAA,kBAAA,EACAW,YAAAX,QAAA,uBAAA,EACAY,YAAAZ,QAAA,sBAAA,EACAa,QAAAb,QAAA,kBAAA,EACAc,SAAAd,QAAA,gBAAA,EACAe,iBAAAf,QAAA,+BAAA,EACAgB,gCAAAhB,QAAA,8CAAA,EACAiB,OAAAjB,QAAA,iBAAA,EACAkB,iBAAAlB,QAAA,2BAAA,EACAmB,UAAAnB,QAAA,oBAAA,EACAoB,UAAApB,QAAA,oBAAA,EACAqB,2BAAArB,QAAA,yCAAA,EAEAsB,YAAAtB,QAAA,oBAAA,EACAuB,iCAAAvB,QAAA,+CAAA,EACAwB,kCAAAxB,QAAA,gDAAA,EAGAyB,eAAAzB,QAAA,yBAAA,EAEA0B,uBAAA1B,QAAA,yBAAA,EAEA2B,IAAA,WAIC,SAAAA,MAHQC,KAAAC,IAAU,KACVD,KAAAE,WAAiB,IAIzB,CAwCD,OAtCQH,IAAAI,UAAAC,GAAP,WAcC,OAbIJ,KAAKC,MAITD,KAAKC,IAAM,IAAIP,YAAAW,GAAG,CACjBC,YAAa,CACZC,YAAaC,QAAQC,IAAIC,eACzBC,gBAAiBH,QAAQC,IAAIG,qB,EAE9BC,OAAQL,QAAQC,IAAIK,WACpBC,WAAY,Y,CACZ,GAEMf,KAAKC,GACb,EAEOF,IAAAI,UAAAa,UAAP,WACC,MAA+B,cAA3BR,QAAQC,IAAIK,WACRd,KAAKI,GAAE,GAGVJ,KAAKE,aAITF,KAAKE,WAAa,IAAIR,YAAAW,GAAG,CACxBC,YAAa,CACZC,YAAaC,QAAQC,IAAIC,eACzBC,gBAAiBH,QAAQC,IAAIG,qB,EAE9BC,OAAQ,YACRE,WAAY,Y,CACZ,GAEMf,KAAKE,WAEd,EACDH,GAAA,EAAC,EAEDkB,eAhDaC,QAAAnB,IAAAA,IAgDb,WAoBC,SAAAkB,cAAYE,EAAgDC,EAAkBC,GAA9E,IAAAC,EAAAtB,KAlBOA,KAAAuB,SAAwB,GAIvBvB,KAAAwB,kBAAoB,CAAA,EACpBxB,KAAAyB,kBAAoB,CAAA,EAEpBzB,KAAA0B,WAA0B,IAAIC,IAC9B3B,KAAA4B,kBAAoB,CAAA,EAEpB5B,KAAA6B,6BAA+B,EAC/B7B,KAAA8B,qBAAuB,EACvB9B,KAAA+B,4BAA8B,EAC9B/B,KAAAgC,oBAAsB,EAEvBhC,KAAAiC,UAAY,GACZjC,KAAAkC,aAAe,GAGrBlC,KAAKmC,kBAAoBrC,uBAAAsC,gBAAgBC,cAAa,EAAGC,oBAAmB,EAC5EtC,KAAKuC,wBAA0BpB,EAC/BnB,KAAKwB,kBAAoBJ,EACzBpB,KAAKyB,kBAAoBJ,EAEzBrB,KAAKiC,UAAYnC,uBAAAsC,gBAAgBI,aAAY,EAC7CxC,KAAKkC,aAAepC,uBAAAsC,gBAAgBK,gBAAe,EAGZ,UAAnCjC,QAAQC,IAAIiC,qBAAsE,SAAnClC,QAAQC,IAAIkC,oBAA8D,MAA7BnC,QAAQC,IAAImC,eACtGpC,QAAQC,IAAIoC,mBAAuD,MAAlCrC,QAAQC,IAAIoC,mBACjDC,WAAW,WACVC,QAAQC,IAAI,IAAIC,KAAQ,sBAAsB,GAC9C,EAAAnE,OAAAoE,gBAAc,EACdH,QAAQC,IAAI,IAAIC,KAAQ,oBAAoB,CAC7C,EAAG,GAAI,GAIT,EAAAlE,YAAAoE,oBAAkB,GAGlB,EAAAtE,WAAAuE,oBAAmBpD,IAAI,GACvB,EAAAxB,MAAA6E,gBAAerD,IAAI,GACnB,EAAA7B,cAAAmF,uBAAsBtD,IAAI,GAC1B,EAAA1B,WAAAiF,oBAAmBvD,IAAI,GACvB,EAAA3B,OAAAmF,gBAAexD,IAAI,GACnB,EAAAzB,MAAAkF,gBAAezD,IAAI,GACnB,EAAAhB,YAAA0E,oBAAmB1D,IAAI,GACvB,EAAAf,QAAA0E,iBAAgB3D,IAAI,GACpB,EAAAH,eAAA+D,wBAAuB5D,IAAI,GAC3B,EAAAV,iBAAAuE,0BAAyB7D,IAAI,GAC7B,EAAAT,UAAAuE,oBAAmB9D,IAAI,GACvB,EAAAR,UAAAuE,oBAAmB/D,IAAI,EAEvBA,KAAKgE,KAAO,IAAIjE,IAEZD,uBAAAsC,gBAAgB6B,WAAU,EAC7BjE,KAAKkE,QAAUvF,WAAWwF,gBAAgBvF,aAAa,CACtD2B,YAAaC,QAAQC,IAAIC,eACzBC,gBAAiBH,QAAQC,IAAIG,sBAC7BC,OAAQL,QAAQC,IAAI2D,c,CACpB,CAAC,EAGFpE,KAAKkE,QAAUvF,WAAWwF,gBAAgB,CACzCE,KAAMvE,uBAAAsC,gBAAgBK,gBAAe,EAAc,UACnD6B,KAAMxE,uBAAAsC,gBAAgBK,gBAAe,EAAc,UACnD8B,OAAQ,CAAA,EACRC,KAAM,CACLC,KAAM3E,uBAAAsC,gBAAgBK,gBAAe,EAAkB,cACvDiC,KAAM5E,uBAAAsC,gBAAgBK,gBAAe,EAAkB,a,EAExDkC,IAAK,CACJC,QAAS,O,EAEV,EAGFC,YAAY,WACP/E,uBAAAsC,gBAAgBC,cAAa,EAAGyC,uBAAsB,GAAMhF,uBAAAsC,gBAAgBC,cAAa,EAAGyC,uBAAsB,EAAGC,eAAc,IACtIhC,QAAQC,IAAI,IAAIC,KAAQ,iBAAkB,kBAAmB3B,EAAKU,mBAAmB,EACrFe,QAAQC,IAAI,IAAIC,KAAQ,iBAAkB,4BAA6B3B,EAAKO,4BAA4B,EACxGkB,QAAQC,IAAI,IAAIC,KAAQ,iBAAkB,mBAAoB3B,EAAKQ,oBAAoB,EACvFiB,QAAQC,IAAI,IAAIC,KAAQ,iBAAkB,wBAAyB3B,EAAKS,2BAA2B,GAGpGT,EAAKO,6BAA+B,EACpCP,EAAKQ,qBAAuB,EAC5BR,EAAKS,4BAA8B,EACnCT,EAAKU,oBAAsB,CAC5B,EAAG,GAAK,EAEHhC,KAAKwB,mBAAqBxB,CAAAA,KAAKyB,mBACnCzB,KAAKgF,kBAAiB,CAExB,CAs6BD,OAn6BQ/D,cAAAd,UAAA8E,QAAP,SAAeC,GACdlF,KAAKuB,SAAW4D,OAAOC,OAAOpF,KAAKuB,SAAU2D,CAAM,CACpD,EAEOjE,cAAAd,UAAAkF,eAAP,SAAsBH,G,QAAtB5D,EAAAtB,KAAsCsF,EAAA,GAAAC,EAAA,EAAAA,EAAAC,UAAAC,OAAAF,CAAA,GAAAD,EAAAC,EAAA,GAAAC,UAAAD,GAGrC,GAFAvF,KAAK+B,6BAA+B,EAE/B/B,KAAKuB,SAAS2D,GAAnB,CAQA,IAAyB,EAApBI,EAAWG,QAAcH,EAAW,KAAO,CAACtF,KAAKuB,SAAS2D,GAAQQ,eAAgB,CACtF,GAAK1F,CAAAA,KAAKuB,SAAS2D,GAAQS,MAK1B,OAJA5C,QAAQ6C,MAAM,IAAI3C,KAAQ,gCAAkCiC,CAAM,EAAlEnC,KAEA/C,KAAK6F,UAAU,oBAAqB,6BAA+B/F,uBAAAsC,gBAAgBK,gBAAe,EAAgB,YAAG,gCAAkCyC,CAAM,EAIzJ,GAAKlF,CAAAA,KAAKuB,SAAS2D,GAAQS,MAAMG,QAKrC,OAJA/C,QAAQ6C,MAAM,IAAI3C,KAAQ,8BAAgCiC,CAAM,EAAhEnC,KAEA/C,KAAK6F,UAAU,oBAAqB,6BAA+B/F,uBAAAsC,gBAAgBK,gBAAe,EAAgB,YAAG,gCAAkCyC,CAAM,EAU7J,IALA,IAAIa,EAAS,GAGTC,EAFUb,OAAOc,KAAKjG,KAAKuB,SAAS2D,GAAQS,MAAMG,OAAO,EAEtCI,OAAO,SAAAC,GAAK,MAAA,CAACA,EAAEC,SAAS,GAAG,CAAf,CAAgB,EAE1CC,EAAI,EAAGA,EAAIf,EAAWG,OAAQY,CAAC,GACvCN,EAAOC,EAASK,IAAMf,EAAWe,GAGlC,IACCrG,KAAKuB,SAAS2D,GAAQS,MAAMW,SAASP,CAAM,C,CAE5C,MAAOQ,GACN,GAAIA,EAKH,OAJAxD,QAAQ6C,MAAM,IAAI3C,KAAQ,0BAA4BiC,EAAS,IAAKqB,CAAM,EAA1ExD,KAEA/C,KAAK6F,UAAU,oBAAqB,6BAA+B/F,uBAAAsC,gBAAgBK,gBAAe,EAAgB,YAAG,yBAA2ByC,EAAS,2BAA6BsB,KAAKC,UAAUV,EAAQ,KAAM,CAAC,EAAI,eAAiBS,KAAKC,UAAUF,EAAQ,KAAM,CAAC,CAAC,C,EAQ5Q,IAiCKG,EAGEC,EAyCFC,EA7EDC,EAAU,KAMVC,EAAiBN,KAAKC,UAAUnB,CAAU,EAmF9C,OAhFItF,KAAKwB,mBACR,CAACxB,KAAKyB,mBACNsF,OAAOC,WAAWF,EAAgB,MAAM,EANjB,SAOZ,0BAAX5B,GACW,eAAXA,GACW,eAAXA,GACW,6BAAXA,GACW,SAAXA,GACW,mBAAXA,GACW,mBAAXA,GACW,YAAXA,GACW,wBAAXA,GACW,oBAAXA,GACW,iBAAXA,GACW,mBAAXA,GACW,mBAAXA,GACW,kBAAXA,GACW,mBAAXA,GACW,uBAAXA,GACW,kBAAXA,GACW,aAAXA,GACW,gBAAXA,GACW,iBAAXA,GAEIwB,EAAU1G,KAAKuC,wBAAwB0E,qBAAqB,cAAe/B,EAAQ,GAAI,GAAII,CAAU,EAGnGqB,GAAS,EAAAzH,SAAAgI,mBAAiB,EAGhCL,EAAU,IAAIM,QAAQ,SAACC,EAASC,GAC/B,IAAIC,EAAe1H,kCAAA2H,oBAAoBC,gBAAgB,CAAC,CAAEC,OAAQ,CAAEC,0BAA2Bf,CAAM,CAAE,GAAK,CAAEgB,aAAc,cAAc,CAAE,EAE5IL,EAAaM,GAAG,SAAU,SAAAC,GACI,WAAzBA,EAAOC,gBACVxG,EAAKiB,wBAAwBwF,sBAAsBrB,CAAO,IAEpDsB,EAAeH,EAAOF,cAEXM,UAChBZ,EAGAD,GAHOY,EAAaE,IAAI,EAMzBZ,EAAaa,MAAK,EAEpB,CAAC,EAEDb,EAAaM,GAAG,QAAS,SAAAhC,GACxB7C,QAAQ6C,MAAM,mCAAoCA,CAAK,EACvDyB,EAAOzB,CAAK,EACZ0B,EAAaa,MAAK,CACnB,CAAC,CACF,CAAC,EAEDxI,iCAAAyI,mBAAmBC,OAAO,CACzBC,IAAK3B,EACLzB,OAAQA,EACRqD,OAAQjD,EACRkD,OAAQ,UACRC,QAASzI,KAAc,QACvByE,KAAMzE,KAAW,KACjB0I,MAAO1I,KAAgB,S,CACvB,IAGG4G,EAAU5G,KAAKuC,wBAAwB0E,qBAAqB,cAAe/B,EAAQ,GAAI,GAAII,CAAU,EACzGuB,GAAU8B,EAAA3I,KAAKuB,SAAS2D,GAAQ0D,UAASC,KAAIC,MAAAH,EAAAI,cAAA,CAAC5D,OAAOC,OAAO,GAAIpF,KAAMiB,cAAcd,UAAW,CAACsI,QAAS,GAAIhE,KAAM,GAAIiE,MAAO,EAAE,CAAC,GAACM,OAAK1D,CAAU,EAAA,CAAA,CAAA,CAAA,EAChJ2D,KAAK,SAAAC,GAEL,OADA5H,EAAKiB,wBAAwBwF,sBAAsBnB,CAAO,EACnDsC,CACR,EAAG,SAAAC,GAGF,OAFA7H,EAAKiB,wBAAwBwF,sBAAsBnB,CAAO,EAC1DtF,EAAKuE,UAAU,oBAAqB,6BAA+B/F,uBAAAsC,gBAAgBK,gBAAe,EAAgB,YAAG,gCAAkCyC,EAAS,iCAAmCsB,KAAKC,UAAUnB,EAAY,KAAM,CAAC,EAAI,eAAiBkB,KAAKC,UAAU0C,EAAY,KAAM,CAAC,CAAC,EACtRA,CACR,CAAC,GAGKtC,C,CAxIN9D,QAAQC,IAAI,cAAgBkC,CAAM,EAElClF,KAAK6F,UAAU,oBAAqB,6BAA+B/F,uBAAAsC,gBAAgBK,gBAAe,EAAgB,YAAG,cAAgByC,CAAM,CAuI7I,EAGOjE,cAAAd,UAAAiJ,WAAP,SAAkBC,EAA0BC,EAAeC,EAAmBC,EAAmBtE,G,QAAjG5D,EAAAtB,KAAiHsF,EAAA,GAAAC,EAAA,EAAAA,EAAAC,UAAAC,OAAAF,CAAA,GAAAD,EAAAC,EAAA,GAAAC,UAAAD,GAGhH,GAFAvF,KAAK8B,sBAAwB,EAExB9B,KAAKuB,SAAS2D,GAAnB,CAmBA,IAAyB,EAApBI,EAAWG,QAAcH,EAAW,KAAO,CAACtF,KAAKuB,SAAS2D,GAAQQ,eAAgB,CACtF,GAAK1F,CAAAA,KAAKuB,SAAS2D,GAAQS,MAgB1B,OAfA5C,QAAQ6C,MAAM,IAAI3C,KAAQ,gCAAkCiC,CAAM,EAClElF,KAAK6F,UAAU,oBAAqB,6BAA+B/F,uBAAAsC,gBAAgBK,gBAAe,EAAgB,YAAG,gCAAkCyC,CAAM,EAQ7JlF,KAAKyJ,OAAOH,EAAIC,EAAarE,EAAQI,EANjCoE,EAAiC,CACpCF,UAAWA,EACXG,SAAU,CAAA,EACVzB,KAAM,gB,CAGmD,EAA1DlI,KAEIqJ,GACHjK,gCAAAwK,mBAAmBC,UAAU,CAAEvB,IAAKe,CAAgB,CAAE,GAKnD,GAAKrJ,CAAAA,KAAKuB,SAAS2D,GAAQS,MAAMG,QAgBrC,OAfA/C,QAAQ6C,MAAM,IAAI3C,KAAQ,8BAAgCiC,CAAM,EAChElF,KAAK6F,UAAU,oBAAqB,6BAA+B/F,uBAAAsC,gBAAgBK,gBAAe,EAAgB,YAAG,8BAAgCyC,CAAM,EAEvJwE,EAAiC,CACpCF,UAAWA,EACXG,SAAU,CAAA,EACVzB,KAAM,gB,EAGHmB,GACHjK,gCAAAwK,mBAAmBC,UAAU,CAAEvB,IAAKe,CAAgB,CAAE,EADvD,KAIArJ,KAAKyJ,OAAOH,EAAIC,EAAarE,EAAQI,EAAYoE,CAAS,EAU1D,IALA,IAoBMA,EApBF3D,EAAS,GAGTC,EAFUb,OAAOc,KAAKjG,KAAKuB,SAAS2D,GAAQS,MAAMG,OAAO,EAEtCI,OAAO,SAAAC,GAAK,MAAA,CAACA,EAAEC,SAAS,GAAG,CAAf,CAAgB,EAE1CC,EAAI,EAAGA,EAAIf,EAAWG,OAAQY,CAAC,GACvCN,EAAOC,EAASK,IAAMf,EAAWe,GAGlC,IACCrG,KAAKuB,SAAS2D,GAAQS,MAAMW,SAASP,CAAM,C,CAE5C,MAAOQ,GACN,GAAIA,EAmBH,OAlBAxD,QAAQ6C,MAAM,IAAI3C,KAAQ,0BAA4BiC,EAAS,IAAKqB,CAAM,EAE3D,+BAAXrB,GACHlF,KAAK6F,UAAU,oBAAqB,6BAA+B/F,uBAAAsC,gBAAgBK,gBAAe,EAAgB,YAAG,yBAA2ByC,EAAS,2BAA6BsB,KAAKC,UAAUV,EAAQ,KAAM,CAAC,EAAI,eAAiBS,KAAKC,UAAUF,EAAQ,KAAM,CAAC,CAAC,EASzQvG,KAAKyJ,OAAOH,EAAIC,EAAarE,EAAQI,EANjCoE,EAAiC,CACpCF,UAAWA,EACXG,SAAU,CAAA,EACVzB,KAAM,gB,CAGmD,EAA1DlI,KAEIqJ,GACHjK,gCAAAwK,mBAAmBC,UAAU,CAAEvB,IAAKe,CAAgB,CAAE,E,EAY3D,IA4BKS,EAIAC,EA2CAC,EA1EDlD,EAAiBN,KAAKC,UAAUnB,CAAU,EAG1CtF,KAAKwB,mBACR,CAACxB,KAAKyB,mBACNsF,OAAOC,WAAWF,EAAgB,MAAM,EANjB,SAOZ,0BAAX5B,GACW,eAAXA,GAAsC,eAAXA,GAChB,6BAAXA,GACW,SAAXA,GACW,mBAAXA,GACW,mBAAXA,GACW,YAAXA,GACW,wBAAXA,GACW,oBAAXA,GACW,iBAAXA,GACW,mBAAXA,GACW,mBAAXA,GACW,kBAAXA,GACW,mBAAXA,GACW,uBAAXA,GACW,kBAAXA,GACW,aAAXA,GACW,gBAAXA,GACW,iBAAXA,GAGI4E,EAAU9J,KAAKuC,wBAAwB0E,qBAAqB,SAAU/B,EAAQoE,EAAS,MAAK,GAAIA,EAAc,WAAK,GAAIhE,CAAU,EAE/H2E,GAAS,EAAA/K,SAAAgI,mBAAiB,GAE5B6C,EAAenK,kCAAA2H,oBAAoBC,gBAAgB,CAAC,CAAEC,OAAQ,CAAEC,0BAA2BuC,CAAM,CAAE,GAAK,CAAEtC,aAAc,cAAc,CAAE,GAE/HC,GAAG,SAAU,SAAMC,GAAM,OAAAqC,UAAA5I,EAAA,KAAA,EAAA,KAAA,EAAA,W,uEACR,WAAzBuG,EAAOC,cAAP,CAAA,EAAA,IACH9H,KAAKuC,wBAAwBwF,sBAAsB+B,CAAO,EAEpD9B,EAAeH,EAAOF,aAExB+B,EAAiC,CACpCF,UAAWA,EACXG,SAAU3B,EAAaC,UACvBC,KAAMF,EAAaE,I,EAGpBlI,KAAKyJ,OAAOH,EAAI,IAAIrG,KAAQiC,EAAQI,EAAYoE,CAAS,EAErDL,EACW,CAAA,EAAMjK,gCAAAwK,mBAAmBO,SAASd,CAAgB,GAD7D,CAAA,EAAA,I,QACCe,EAAUzB,EAAA0B,KAAA,IAEbjL,gCAAAwK,mBAAmBU,UAAU,CAAChC,IAAKe,CAAgB,EAAG,CAACkB,KAAM,CAACC,SAAU,IAAIvH,KAAQwH,WAAYpL,OAAM,EAAGqL,KAAKrL,OAAO+K,EAAQO,UAAU,EAAG,eAAgB,CAAA,CAAI,CAAC,CAAC,CAAC,E,iBAInKZ,EAAa5B,MAAK,E,gCAEnB,EAED4B,EAAanC,GAAG,QAAS,SAAAhC,GACxB7C,QAAQ6C,MAAM,mCAAoCA,CAAK,EACvDmE,EAAa5B,MAAK,CACnB,CAAC,EAEDxI,iCAAAyI,mBAAmBC,OAAO,CACzBC,IAAK2B,EACL/E,OAAQA,EACRqD,OAAQjD,EACRkD,OAAQ,UACRC,QAASa,EAAY,QACrB7E,KAAM6E,EAAS,KACfZ,MAAOY,EAAc,S,CACrB,IAGGU,EAAUhK,KAAKuC,wBAAwB0E,qBAAqB,SAAU/B,EAAQoE,EAAS,MAAK,GAAIA,EAAc,WAAK,GAAIhE,CAAU,GACrIqD,EAAA3I,KAAKuB,SAAS2D,GAAQ0D,UAASC,KAAIC,MAAAH,EAAAI,cAAA,CAAC5D,OAAOC,OAAO,GAAIpF,KAAMiB,cAAcd,UAAW,CAACsI,QAASa,EAAY,QAAG7E,KAAM6E,EAAS,KAAGZ,MAAOY,EAAc,SAAC,CAAC,GAACN,OAAK1D,CAAU,EAAA,CAAA,CAAA,CAAA,EACtK2D,KAAK,SAAOC,GAAG,OAAAgB,UAAA5I,EAAA,KAAA,EAAA,KAAA,EAAA,W,wEACftB,KAAKuC,wBAAwBwF,sBAAsBiC,CAAO,EAEtDN,EAAiC,CACpCF,UAAWA,EACXG,SAAU,CAAA,EACVzB,KAAMgB,C,EAGPlJ,KAAKyJ,OAAOH,EAAIC,EAAarE,EAAQI,EAAYoE,CAAS,EAEtDL,GACW,CAAA,EAAMjK,gCAAAwK,mBAAmBO,SAASd,CAAgB,GAD7D,CAAA,EAAA,G,QACCe,EAAUzB,EAAA0B,KAAA,IAEbjL,gCAAAwK,mBAAmBU,UAAU,CAAChC,IAAKe,CAAgB,EAAG,CAACkB,KAAM,CAACC,SAAU,IAAIvH,KAAQwH,WAAYpL,OAAM,EAAGqL,KAAKrL,OAAO+K,EAAQO,UAAU,EAAG,eAAgB,CAAA,CAAI,CAAC,CAAC,CAAC,E,iCAIpK,SAAAC,GACCtJ,EAAKiB,wBAAwBwF,sBAAsBiC,CAAO,EAO1D1I,EAAKmI,OAAOH,EAAIC,EAAarE,EAAQI,EANA,CACpCkE,UAAWA,EACXG,SAAU,CAAA,EACVzB,KAAM0C,C,CAGmD,EAEtDvB,GACHjK,gCAAAwK,mBAAmBC,UAAU,CAACvB,IAAKe,CAAgB,CAAC,EAGtC,+BAAXnE,GACH5D,EAAKuE,UAAU,oBAAqB,6BAA+B/F,uBAAAsC,gBAAgBK,gBAAe,EAAgB,YAAG,gCAAkCyC,EAAS,6BAA+BsB,KAAKC,UAAUnB,EAAY,KAAM,CAAC,EAAI,eAAiBkB,KAAKC,UAAUmE,EAAK,KAAM,CAAC,CAAC,CAEpR,CAAC,E,MAjND7H,QAAQC,IAAI,cAAgBkC,CAAM,EAClClF,KAAK6F,UAAU,oBAAqB,6BAA+B/F,uBAAAsC,gBAAgBK,gBAAe,EAAgB,YAAG,cAAgByC,CAAM,EAEvIwE,EAAiC,CACpCF,UAAWA,EACXG,SAAU,CAAA,EACVzB,KAAM,gB,EAGPlI,KAAKyJ,OAAOH,EAAI,IAAIrG,KAAQiC,EAAQI,EAAYoE,CAAS,EAErDL,GACHjK,gCAAAwK,mBAAmBC,UAAU,CAACvB,IAAKe,CAAgB,CAAC,CAuMvD,EAGOpI,cAAAd,UAAA0K,mBAAP,SAA0B3F,G,QAA1B5D,EAAAtB,KAA0CsF,EAAA,GAAAC,EAAA,EAAAA,EAAAC,UAAAC,OAAAF,CAAA,GAAAD,EAAAC,EAAA,GAAAC,UAAAD,GAGzC,GAFAvF,KAAK6B,8BAAgC,EAEjC,CAAC7B,KAAKuB,SAAS2D,GAElB,OADAnC,QAAQC,IAAI,cAAgBkC,CAAM,EAC3B,KAGR,IAAyB,EAApBI,EAAWG,QAAeH,EAAW,IAA+B,YAAzB,OAAOA,EAAW,KAAuB,CAACtF,KAAKuB,SAAS2D,GAAQQ,eAAgB,CAC/H,GAAK1F,CAAAA,KAAKuB,SAAS2D,GAAQS,MAE1B,OADA5C,QAAQ6C,MAAM,IAAI3C,KAAQ,gCAAkCiC,CAAM,EAC3D,KAEH,GAAI,CAAClF,KAAKuB,SAAS2D,GAAQS,MAAMG,QAErC,OADA/C,QAAQ6C,MAAM,IAAI3C,KAAQ,8BAAgCiC,CAAM,EACzD,I,CAIM,0BAAXA,GAAiD,sBAAXA,GAA6C,+BAAXA,GAAsD,eAAXA,GAAsC,6BAAXA,GAAoD,6BAAXA,GAC1L/F,iBAAA2L,KAAKC,UAAU,CACdzC,KAAK,EAAApJ,SAAAgI,mBAAiB,EACtB8D,KAAM,qBACNC,WAAY,GACZC,YAAa,GACbC,SAAS,EAAAjM,SAAAkM,eAAc5E,KAAKC,UAAU,CAACnB,EAAW,CAAC,EAAI,IAASkB,KAAKC,UAAU,CAACnB,GAAa,KAAM,CAAC,EAAI,UACxGJ,OAAQA,EACRuD,QAASzI,KAAc,SAAK,GAC5ByE,KAAMzE,KAAW,MAAK,GACtBwJ,UAAW,EACX6B,MAAO,E,CACP,EAGF,IAgCKC,EAGEC,EAyCFC,EA5EDC,EAAmE,YAA9C,OAAOnG,EAAWA,EAAWG,OAAS,GAAqBH,EAAWoG,MAAM,EAAG,CAAC,CAAC,EAAIpG,EAC1GuB,EAAU,KAMVC,EAAiBN,KAAKC,UAAUgF,CAAkB,EAsFtD,OApFIzL,KAAKwB,mBACR,CAACxB,KAAKyB,mBACNsF,OAAOC,WAAWF,EAAgB,MAAM,EALjB,SAMZ,0BAAX5B,GACW,eAAXA,GAAsC,eAAXA,GAChB,6BAAXA,GACW,SAAXA,GACW,mBAAXA,GACW,mBAAXA,GACW,YAAXA,GACW,wBAAXA,GACW,oBAAXA,GACW,iBAAXA,GACW,mBAAXA,GACW,mBAAXA,GACW,kBAAXA,GACW,mBAAXA,GACW,uBAAXA,GACW,kBAAXA,GACW,aAAXA,GACW,gBAAXA,GACW,iBAAXA,GAEIoG,EAAUtL,KAAKuC,wBAAwB0E,qBAAqB,kBAAmB/B,EAAQlF,KAAW,MAAK,GAAI,GAAIyL,CAAkB,EAG/HF,GAAS,EAAArM,SAAAgI,mBAAiB,EAGhCL,EAAU,IAAIM,QAAQ,SAACC,EAASC,GAC/B,IAAIC,EAAe1H,kCAAA2H,oBAAoBC,gBAAgB,CAAC,CAAEC,OAAQ,CAAEC,0BAA2B6D,CAAM,CAAE,GAAK,CAAE5D,aAAc,cAAc,CAAE,EAE5IL,EAAaM,GAAG,SAAU,SAACC,GACG,WAAzBA,EAAOC,gBACVxG,EAAKiB,wBAAwBwF,sBAAsBuD,CAAO,IAEpDtD,EAAeH,EAAOF,cAEXM,UAChBZ,EAGAD,GAHOY,EAAaE,IAAI,EAMzBZ,EAAaa,MAAK,EAEpB,CAAC,EAEDb,EAAaM,GAAG,QAAS,SAAAhC,GACxB7C,QAAQ6C,MAAM,mCAAoCA,CAAK,EACvDyB,EAAOzB,CAAK,EACZ0B,EAAaa,MAAK,CACnB,CAAC,CACF,CAAC,EAEDxI,iCAAAyI,mBAAmBC,OAAO,CACzBC,IAAKiD,EACLrG,OAAQA,EACRqD,OAAQkD,EACRjD,OAAQ,UACRC,QAASzI,KAAc,QACvByE,KAAMzE,KAAW,KACjB0I,MAAO1I,KAAgB,S,CACvB,IAGGwL,EAAUxL,KAAKuC,wBAAwB0E,qBAAqB,kBAAmB/B,EAAQlF,KAAW,MAAK,GAAI,GAAIyL,CAAkB,EACrI5E,GAAU8B,EAAA3I,KAAKuB,SAAS2D,GAAQ0D,UAASC,KAAIC,MAAAH,EAAAI,cAAA,CAAC5D,OAAOC,OAAO,GAAIpF,KAAMiB,cAAcd,SAAS,GAAC6I,OAAKyC,CAAkB,EAAA,CAAA,CAAA,CAAA,EACnHxC,KAAK,SAAAC,GAEL,OADA5H,EAAKiB,wBAAwBwF,sBAAsByD,CAAO,EACnDtC,CACR,EACA,SAAAC,GAGC,OAFA7H,EAAKiB,wBAAwBwF,sBAAsByD,CAAO,EAC1DlK,EAAKuE,UAAU,oBAAqB,6BAA+B/F,uBAAAsC,gBAAgBK,gBAAe,EAAgB,YAAG,gCAAkCyC,EAAS,qCAAuCsB,KAAKC,UAAUnB,EAAY,KAAM,CAAC,EAAI,eAAiBkB,KAAKC,UAAU0C,EAAY,KAAM,CAAC,CAAC,EAC1RA,CACR,CAAC,GAGC7D,EAAWA,EAAWG,OAAS,IAAoD,YAA9C,OAAOH,EAAWA,EAAWG,OAAS,IAC9EoB,EAAQoC,KAAK,SAAAC,GAAO,OAAA5D,EAAWA,EAAWG,OAAS,GAAG,KAAMyD,CAAG,CAA3C,EAA8C,SAAA0B,GAAO,OAAAtF,EAAWA,EAAWG,OAAS,GAAGmF,EAAK,IAAI,CAA3C,CAA4C,EAG/G/D,CACR,EAEQ5F,cAAAd,UAAAsJ,OAAR,SAAeH,EAAeC,EAAmBrE,EAAgBI,EAAmB4C,GACnFlI,KAAKmC,kBAAkBwJ,KAAKrC,EAAIpB,CAAI,EAGxB,4BAAXhD,GACW,kCAAXA,GACW,2BAAXA,GACW,gBAAXA,GACW,qBAAXA,GACW,eAAXA,GACW,mBAAXA,GACW,6BAAXA,GACW,SAAXA,GACW,YAAXA,GACW,oBAAXA,GACW,sBAAXA,GACW,eAAXA,GACW,+BAAXA,GAEA/F,iBAAA2L,KAAKC,UAAU,CACdzC,KAAK,EAAApJ,SAAAgI,mBAAiB,EACtB8D,KAAM,kBACNC,WAAY,GACZC,YAAa,GACbC,SACC,EAAAjM,SAAAkM,eAAc5E,KAAKC,UAAU,CAACnB,EAAY4C,EAAK,CAAC,EAAI,IACjD1B,KAAKC,UAAU,CAACnB,EAAY4C,GAAO,KAAM,CAAC,EAC1C,UACJhD,OAAQA,EACRuD,QAASa,EAAY,SAAK,GAC1B7E,KAAM6E,EAAS,MAAK,GACpBE,UAAWtB,EAAKsB,UAChB6B,MAAO,E,CACP,CAYH,EAEMpK,cAAAd,UAAA6E,kBAAN,W,uHAuBC,OAtBMsC,EAAe7H,2BAAAmM,eAAepE,gBAAgB,EAAE,GAEzCI,GAAG,SAAU,SAAOC,GAAM,OAAAqC,UAAA5I,EAAA,KAAA,EAAA,KAAA,EAAA,W,gDACT,WAAzBuG,EAAOC,eAA8BD,EAAOF,cAA+C,YAA/BE,EAAOF,aAAaa,QACnFxI,KAAK0B,WAAWmK,IAAIhE,EAAOF,aAAaW,IAAIwD,SAAQ,CAAE,EACtD9L,KAAK+L,gBAAe,GAEa,WAAzBlE,EAAOC,eAAuD,YAAzBD,EAAOC,gBAC9CkE,EAAenE,EAAOF,eACgB,YAAxBqE,EAAaxD,QAAwBxI,KAAK0B,WAAWuK,IAAID,EAAa1D,IAAIwD,SAAQ,CAAE,GACvG9L,KAAK0B,WAAWwK,OAAOF,EAAa1D,IAAIwD,SAAQ,CAAE,E,QAGpD,EACAlE,GAAG,QAAS,SAAAgD,GACZ7H,QAAQ6C,MAAM,mCAAoCgF,CAAG,EACrDtD,EAAaa,MAAK,CACnB,CAAC,EACAP,GAAG,QAAS,WACZtG,EAAK0D,kBAAiB,CACvB,CAAC,EAED,CAAA,EAAMhF,KAAKmM,kBAAiB,G,cAA5BxD,EAAA0B,KAAA,E,UAGKpJ,cAAAd,UAAAgM,kBAAN,W,0HAEuB,MAAA,CAAA,EAAM1M,2BAAAmM,eAAeQ,KAAK,CAAE5D,OAAQ,SAAS,EAAI,CAAC6D,KAAM,CAAC/D,IAAK,CAAC,CAAC,CAAC,G,OAAjFgE,EAAgBC,EAAAlC,KAAA,E,IACtB,IAAoBmC,EAAAC,SAAAH,CAAa,EAAAI,EAAAF,EAAAG,KAAA,EAAA,CAAAD,EAAAE,KAAAF,EAAAF,EAAAG,KAAA,EAAtBE,EAAKH,EAAAI,MACf9M,KAAK0B,WAAWmK,IAAIgB,EAAMvE,IAAIwD,SAAQ,CAAE,C,yGAGzC9L,KAAK+L,gBAAe,E,UAGf9K,cAAAd,UAAA4L,gBAAN,W,2HACC,GAAI/L,KAAK4B,mBAA8C,IAAzB5B,KAAK0B,WAAWqL,KAC7C,MAAA,CAAA,GAGD/M,KAAK4B,kBAAoB,CAAA,E,wIAOF,OAHfoL,EAAUC,EAAKvL,WAAWwL,OAAM,EAAGP,KAAI,EAAGG,MAChDG,EAAKvL,WAAWwK,OAAOc,CAAO,EAET,CAAA,EAAMvN,2BAAAmM,eAAeuB,iBACzC,CACC7E,IAAK0E,EACLxE,OAAQ,S,EAET,CACC+B,KAAM,CAAE/B,OAAQ,aAAc4E,aAAc,IAAInK,IAAM,C,CACtD,G,OAGF,GAAI,EAVEoK,EAAeC,EAAAjD,KAAA,G,0BAejBgD,EAAaE,aAAiD,EAAlCF,EAAaE,YAAY9H,QAArD,MAAA,CAAA,EAAA,I,mFAEc+H,EAAA,KAAA,EAAAjB,EAAAE,SAAAY,EAAaE,WAAW,EAAAE,EAAAlB,EAAAI,KAAA,E,sCAA/Be,EAAGD,EAAAX,OACHrO,MAAQiP,EAAIjP,KAAKkP,WAAW,MAAM,EACxB,CAAA,EAAMC,MAAMF,EAAIjP,IAAI,GADlC,CAAA,EAAA,G,OAEH,IADMoP,EAAWP,EAAAjD,KAAA,GACHyD,GAGM,MAAA,CAAA,EAAMD,EAASE,YAAW,GAF7C,MAAM,IAAIC,MAAM,+BAAAC,OAA+BP,EAAIjP,IAAI,CAAE,E,OAEpDsP,EAAcT,EAAAjD,KAAA,EACd6D,EAASnH,OAAOoH,KAAKJ,CAAW,EAIlCG,EAAOzI,QADK,WAGfiI,EAAIU,QAAUF,EACd,OAAOR,EAAIjP,M,2NAQd,O,WAFAsE,QAAQ6C,MAAM,8BAA+ByI,CAAG,EAEhD,CAAA,EAAM5O,2BAAAmM,eAAetB,UACpB,CAAEhC,IAAK+E,EAAa/E,GAAG,EACvB,CACCiC,KAAM,CACL/B,OAAQ,SACR5C,MAAsB,UAAf,OAAOyI,EAAmBA,EAAMpB,EAAKqB,cAAcD,CAAG,EAC7DE,YAAa,IAAItL,I,EAElB,G,eARFqK,EAAAjD,KAAA,E,uBA2DF,OA3CMmE,EAAmB,CACxBC,QAASpB,EAAaqB,UAAa5O,uBAAAsC,gBAAgBK,gBAAe,EAAkB,eAAKkM,KAAAA,EACzFR,KAAMd,EAAauB,WAAa9O,uBAAAsC,gBAAgBK,gBAAe,EAAGoM,UAClEC,GAAIzB,EAAaR,MACjBkC,SACEjP,uBAAAsC,gBAAgBK,gBAAe,EAAa,SAAEuM,MAAM,iBAAiB,GACtElP,uBAAAsC,gBAAgBK,gBAAe,EAAa,SAAEuM,MAAM,sBAAsB,EACvE,kBACA,IAAM3B,EAAa0B,QACvBE,KAAmC,UAA7B,OAAO5B,EAAa4B,KAAoB5B,EAAa4B,KAAO,GAClEC,KAAmC,UAA7B,OAAO7B,EAAa6B,KAAoB7B,EAAa6B,KAAO,GAClE3B,YAAaF,EAAaE,aAAe,E,GAI1BA,aAAgD,EAAjCiB,EAAYjB,YAAY9H,SACtD+I,EAAYjB,YAAciB,EAAYjB,YAAY4B,IAAI,SAACzB,GAChD0B,EAAMC,SAAA,GAAQ3B,CAAG,EAqBvB,MAnBI0B,CAAAA,EAAOhB,SAAqC,UAA1B,OAAOgB,EAAOhB,SAA0BgB,EAAOhB,mBAAmBrH,OAWrD,UAA1B,OAAOqI,EAAOhB,SAA4C,WAApBgB,EAAOE,UACrDF,EAAOhB,QAAUrH,OAAOoH,KAAKiB,EAAOhB,QAAS,QAAQ,EACrD,OAAOgB,EAAOE,UAGoB,UAA1B,OAAOF,EAAOhB,UACtBgB,EAAOhB,QAAUrH,OAAOoH,KAAKiB,EAAOhB,OAAO,GAfV,WAA7BgB,EAAOhB,QAAQmB,WAAsD,IAA5BH,EAAOhB,QAAQoB,SAC3DJ,EAAOhB,QAAUrH,OAAOoH,KAAKiB,EAAOhB,QAAQF,MAAM,EAIlDkB,EAAOhB,QAAUrH,OAAOoH,KAAKiB,EAAOhB,OAAO,EAYtCgB,CACR,CAAC,GAIF,CAAA,EAAM,IAAIjI,QAAc,SAACC,GACxB9F,EAAK4C,QAAQuL,SAASjB,EAAa,SAAO5D,EAAK8E,GAAI,OAAAxF,UAAA5I,EAAA,KAAA,EAAA,KAAA,EAAA,W,oCAClD,IACKsJ,GACH7H,QAAQ6C,MAAM,wBAAyBgF,CAAG,EAC1CnL,2BAAAmM,eAAetB,UACd,CAAEhC,IAAK+E,EAAa/E,GAAG,EACvB,CACCiC,KAAM,CACL/B,OAAQ,SACR5C,MAAsB,UAAf,OAAOgF,EAAmBA,EAAM5K,KAAKsO,cAAc1D,CAAG,EAC7D2D,YAAa,IAAItL,I,EAElB,GAIyB,sBAAvBoK,EAAaR,MAChBpN,2BAAAmM,eAAe/B,UAAU,CAAEvB,IAAK+E,EAAa/E,GAAG,CAAE,EAGlD7I,2BAAAmM,eAAetB,UACd,CAAEhC,IAAK+E,EAAa/E,GAAG,EACvB,CACCiC,KAAM,CACL/B,OAAQ,YACR+F,YAAa,IAAItL,I,EAElB,C,CAKL,MAAO2C,GACN7C,QAAQ6C,MAAM,8BAA+BA,CAAK,EAClDnG,2BAAAmM,eAAetB,UACd,CAAEhC,IAAK+E,EAAa/E,GAAG,EACvB,CACCiC,KAAM,CACL/B,OAAQ,SACR5C,MAAwB,UAAjB,OAAOA,EAAqBA,EAAQ5F,KAAKsO,cAAc1I,CAAK,EACnE2I,YAAa,IAAItL,I,EAElB,C,SAGFmE,EAAO,C,eAER,CACF,CAAC,G,QAGD,OApDAkG,EAAAjD,KAAA,EAoDA,CAAA,EAAM,IAAIlD,QAAQ,SAACC,GAAY,OAAAtE,WAAWsE,EAAS,GAAI,CAAxB,CAAyB,G,eAAxDkG,EAAAjD,KAAA,E,uCA1J6B,EAAvBrK,KAAK0B,WAAWqL,K,QAAQ,CAAA,EAAA,G,yEA8J/BhK,QAAQ6C,MAAM,gCAAiC+J,CAAG,E,oBAGlD3P,KAAK4B,kBAAoB,CAAA,EAEE,EAAvB5B,KAAK0B,WAAWqL,MACnB/M,KAAK+L,gBAAe,E,2BAKvB9K,cAAAd,UAAAmO,cAAA,SAAcsB,GAEb,IAEC,OAAOpJ,KAAKC,UAAUmJ,EAAK5P,KAAK6P,oBAAmB,CAAE,C,CAEtD,MAAOC,GAEN,MAAO,+BAAA7B,OAA+B6B,EAAEC,OAAO,C,CAEjD,EAEA9O,cAAAd,UAAA0P,oBAAA,WAEC,IAAMG,EAAO,IAAIC,QACjB,OAAO,SAACC,EAAKpD,GAEZ,GAAqB,UAAjB,OAAOA,GAAgC,OAAVA,EACjC,CACC,GAAIkD,EAAK/D,IAAIa,CAAK,EAEjB,MAAO,aAERkD,EAAKnE,IAAIiB,CAAK,C,CAEf,OAAOA,CACR,CACD,EAEO7L,cAAAd,UAAA0F,UAAP,SACCsK,EACApB,EACAE,EACAC,EACA3B,EACAqB,EACAF,EACA0B,GARD,IAAA9O,EAAAtB,KAUC,OAFA,KAAA,IAAAoQ,IAAAA,EAAA,CAAA,GAEO,IAAIjJ,QAAQ,SAAOC,EAASC,GAAM,OAAA6C,UAAA5I,EAAA,KAAA,EAAA,KAAA,EAAA,W,iDAQvC6O,EALCrQ,CAAAA,uBAAAsC,gBAAgBK,gBAAe,EAAa,SAAEuM,MAAM,iBAAiB,GACrElP,CAAAA,uBAAAsC,gBAAgBK,gBAAe,EAAa,SAAEuM,MAAM,sBAAsB,GACxB,0BAAlDlP,uBAAAsC,gBAAgBK,gBAAe,EAAa,UAC5C0N,EAAOnB,MAAM,kBAAkB,EAK7BmB,EAHM,qBAK0C,0BAAlDrQ,uBAAAsC,gBAAgBK,gBAAe,EAAa,UAC5C2N,GAEK7C,EAAAA,GACU,GAQfA,GAJCA,EADI8C,MAAMC,QAAQ/C,CAAW,EAKhBA,EAJC,CAACA,IAIU4B,IAAI,SAACzB,GACxB0B,EAAMC,SAAA,GAAQ3B,CAAG,EAKvB,OAJI3G,OAAOwJ,SAASnB,EAAOhB,OAAO,IACjCgB,EAAOhB,QAAUgB,EAAOhB,QAAQtC,SAAS,QAAQ,EACjDsD,EAAOE,SAAW,UAEZF,CACR,CAAC,EAGK/B,EAAkC,CACvC/E,KAAK,EAAApJ,SAAAgI,mBAAiB,EACtBsJ,IAAK,EACLC,KAAM,IAAIxN,KACVwF,QAASzI,KAAc,SAAK,GAC5ByE,KAAMzE,KAAW,MAAK,GACtB6M,MAAOsD,EACPpB,QAASA,GAAW,GACpBE,KAAMA,GAAQ,GACdC,KAAMA,GAAQ,GACd3B,YAAaA,GAAe,GAC5BqB,UAAWA,GAAa,GACxBF,SAAUA,GAAY,GACtBlG,OAAQ,UACR5C,MAAO,E,EAGRnG,2BAAAmM,eAAeb,UAAUsC,CAAY,EAAEpE,KACtC,SAACyH,GAAY,OAAAtJ,EAAQsJ,CAAO,CAAf,EACb,SAAC9F,GACA7H,QAAQ6C,MAAM,yBAA0BgF,CAAG,EAC3CvD,EAAOuD,CAAG,CACX,CAAC,IAIF7H,QAAQC,IACP,aACAmN,EACApB,EACAE,EACAC,EACA3B,EACAqB,CAAS,EAEVxH,EAAQ,CAAA,CAAI,GAIbA,EAAQ,CAAA,CAAI,E,QAEb,CACF,EAEOnG,cAAAd,UAAAwQ,OAAP,WACC,OAAO3Q,KAAKgE,IACb,EAEO/C,cAAAd,UAAAyQ,SAAP,SAAgBC,GACf,OAAO,IAAI1J,QAAQ,SAACC,EAASC,GACxB3I,GAAGoS,WAAWrS,KAAKsS,KAAKC,UAAY,cAAgBH,CAAS,CAAC,EACjEnS,GAAGkS,SAASnS,KAAKsS,KAAKC,UAAY,cAAgBH,CAAS,EAAG,QAAS,SAACjG,EAAK1B,GACxE0B,EACHvD,EAAOuD,CAAG,EAGVxD,EAAQ8B,CAAG,CAEb,CAAC,EAGGxK,GAAGoS,WAAWrS,KAAKsS,KAAKjR,uBAAAsC,gBAAgBI,aAAY,EAAK,aAAeqO,CAAS,CAAC,GACrFnS,GAAGkS,SAASnS,KAAKsS,KAAKjR,uBAAAsC,gBAAgBI,aAAY,EAAK,aAAeqO,CAAS,EAAG,QAAS,SAACjG,EAAK1B,GAC5F0B,EACHvD,EAAOuD,CAAG,EAGVxD,EAAQ8B,CAAG,CAEb,CAAC,CAGJ,CAAC,CACF,EAEOjI,cAAAd,UAAA8Q,UAAP,SAAiBJ,GAChB,OAAO,IAAI1J,QAAQ,SAACC,EAASC,GACxB3I,GAAGoS,WAAWrS,KAAKsS,KAAKC,UAAY,cAAgBH,CAAS,CAAC,EACjEnS,GAAGkS,SAASnS,KAAKsS,KAAKC,UAAY,cAAgBH,CAAS,EAAG,SAAU,SAACjG,EAAK1B,GACzE0B,EACHvD,EAAOuD,CAAG,EAGVxD,EAAQ8B,CAAG,CAEb,CAAC,EAGGxK,GAAGoS,WAAWrS,KAAKsS,KAAKjR,uBAAAsC,gBAAgBI,aAAY,EAAK,aAAeqO,CAAS,CAAC,GACrFnS,GAAGkS,SAASnS,KAAKsS,KAAKjR,uBAAAsC,gBAAgBI,aAAY,EAAK,aAAeqO,CAAS,EAAG,SAAU,SAACjG,EAAK1B,GAC7F0B,EACHvD,EAAOuD,CAAG,EAGVxD,EAAQ8B,CAAG,CAEb,CAAC,CAGJ,CAAC,CACF,EACDjI,aAAA,EAAC,GAvgCYC,QAAAD,cAAAA","file":"method.manager.js","sourcesContent":["import { ServerResponseModel } from '../models/server-response.model';\nimport { loadCollectionMethods } from '../methods/collections';\nimport { MethodModel } from '../models/method.model';\nimport { loadLogMethods } from '../methods/logs';\nimport { loadCounterMethods } from '../methods/counters';\nimport { loadPDFMethods } from '../methods/pdf';\nimport { loadAWSMethods } from '../methods/aws';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport * as nodemailer from 'nodemailer';\nimport * as sesTransport from 'nodemailer-ses-transport';\nimport { loadAccountMethods } from '../methods/accounts';\nimport { loadServerInit } from '../fixtures/init';\nimport { loadServerCronJobs } from '../fixtures/cron-jobs';\nimport { loadCronJobMethods } from '../methods/cron-jobs';\nimport { loadFlagMethods } from '../methods/flags';\nimport { getBinarySize, objectIdHexString } from '../util/common';\nimport { Logs } from '../collections/log.collection';\nimport { LogMethodLatencies } from '../collections/log-method-latency.collection';\nimport * as moment from 'moment-timezone';\nimport { loadReportBuilderMethods } from '../methods/report-builder';\nimport { loadSupportMethods } from '../methods/support';\nimport { loadMonitorMethods } from '../methods/monitor';\nimport { EmailHistories } from '../collections/email-history.collection';\nimport { MonitorManagerFunction } from './monitor.manager';\nimport { S3 } from '@aws-sdk/client-s3';\nimport { WorkerTaskRequests } from '../collections/worker-task-request.collection';\nimport { WorkerTaskResponses } from '../collections/worker-task-response.collection';\nimport { WebSocketManager } from './websocket.manager';\nimport * as WebSocket from 'ws';\nimport { loadFlagUpdatesMethods } from '../methods/flag-updates';\nimport { EmailHistoryModel } from '../models/email-history.model';\nimport { ResolveIOServer } from '../resolveio-server-app';\n\nexport class AWS {\n\tprivate _s3: S3 = null;\n\tprivate _s3USEast1: S3 = null;\n\n\tconstructor() {\n\n\t}\n\n\tpublic s3(): S3 {\n\t\tif (this._s3) {\n\t\t\treturn this._s3;\n\t\t}\n\n\t\tthis._s3 = new S3({\n\t\t\tcredentials: {\n\t\t\t\taccessKeyId: process.env.AWS_ACCESS_KEY,\n\t\t\t\tsecretAccessKey: process.env.AWS_SECRET_ACCESS_KEY\n\t\t\t},\n\t\t\tregion: process.env.AWS_REGION,\n\t\t\tapiVersion: '2006-03-01'\n\t\t});\n\n\t\treturn this._s3;\n\t}\n\n\tpublic s3USEast1(): S3 {\n\t\tif (process.env.AWS_REGION === 'us-east-1') {\n\t\t\treturn this.s3();\n\t\t}\n\t\telse {\n\t\t\tif (this._s3USEast1) {\n\t\t\t\treturn this._s3USEast1;\n\t\t\t}\n\t\t\t\n\t\t\tthis._s3USEast1 = new S3({\n\t\t\t\tcredentials: {\n\t\t\t\t\taccessKeyId: process.env.AWS_ACCESS_KEY,\n\t\t\t\t\tsecretAccessKey: process.env.AWS_SECRET_ACCESS_KEY\n\t\t\t\t},\n\t\t\t\tregion: 'us-east-1',\n\t\t\t\tapiVersion: '2006-03-01'\n\t\t\t});\n\t\n\t\t\treturn this._s3USEast1;\n\t\t}\n\t}\n}\n\nexport class MethodManager {\n\tprivate _websocketManager: WebSocketManager;\n\tpublic _methods: MethodModel = {};\n\tprivate _mailer: nodemailer.Transporter;\n\tprivate _aws: AWS;\n\tprivate _monitorManagerFunction: MonitorManagerFunction;\n\tprivate _isWorkersEnabled = false;\n\tprivate _isWorkerInstance = false;\n\n\tprivate emailQueue: Set<string> = new Set(); // Set to store pending email IDs\n\tprivate isEmailProcessing = false;\n\n\tprivate _debugCallMethodInternalHits = 0;\n\tprivate _debugCallMethodHits = 0;\n\tprivate _debugCallMethodCronJobHits = 0;\n\tprivate _debugSendQueueHits = 0;\n\n\tpublic clientDir = '';\n\tpublic serverConfig = '';\n\n\tconstructor(monitorManagerFunction: MonitorManagerFunction, isWorkersEnabled, isWorkerInstance) {\n\t\tthis._websocketManager = ResolveIOServer.getMainServer().getWebSocketManager();\n\t\tthis._monitorManagerFunction = monitorManagerFunction;\n\t\tthis._isWorkersEnabled = isWorkersEnabled;\n\t\tthis._isWorkerInstance = isWorkerInstance;\n\n\t\tthis.clientDir = ResolveIOServer.getClientDir();\n\t\tthis.serverConfig = ResolveIOServer.getServerConfig();\n\n\t\t// Fixtures\n\t\tif (process.env.IS_WORKERS_ENABLED === 'false' || (process.env.IS_WORKER_INSTANCE === 'true' && process.env.WORKER_INDEX === '0')) {\n\t\t\tif (!process.env.NODE_APP_INSTANCE || process.env.NODE_APP_INSTANCE === '0') {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconsole.log(new Date(), 'Start Server Fixture');\n\t\t\t\t\tloadServerInit();\n\t\t\t\t\tconsole.log(new Date(), 'End Server Fixture');\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t}\n\n\t\tloadServerCronJobs();\n\n\t\t// Methods\n\t\tloadAccountMethods(this);\n\t\tloadAWSMethods(this);\n\t\tloadCollectionMethods(this);\n\t\tloadCounterMethods(this);\n\t\tloadLogMethods(this);\n\t\tloadPDFMethods(this);\n\t\tloadCronJobMethods(this);\n\t\tloadFlagMethods(this);\n\t\tloadFlagUpdatesMethods(this);\n\t\tloadReportBuilderMethods(this);\n\t\tloadSupportMethods(this);\n\t\tloadMonitorMethods(this);\n\n\t\tthis._aws = new AWS();\n\n\t\tif (ResolveIOServer.getSESMail()) {\n\t\t\tthis._mailer = nodemailer.createTransport(sesTransport({\n\t\t\t\taccessKeyId: process.env.AWS_ACCESS_KEY,\n\t\t\t\tsecretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n\t\t\t\tregion: process.env.AWS_SES_REGION\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tthis._mailer = nodemailer.createTransport({\n\t\t\t\thost: ResolveIOServer.getServerConfig()['MAIL_HOST'], // 'smtp.office365.com', // Office 365 server\n\t\t\t\tport: ResolveIOServer.getServerConfig()['MAIL_PORT'], //587, // secure SMTP\n\t\t\t\tsecure: false, // false for TLS - as a boolean not string - but the default is false so just remove this completely\n\t\t\t\tauth: {\n\t\t\t\t\tuser: ResolveIOServer.getServerConfig()['MAIL_USERNAME'],\n\t\t\t\t\tpass: ResolveIOServer.getServerConfig()['MAIL_PASSWORD']\n\t\t\t\t},\n\t\t\t\ttls: {\n\t\t\t\t\tciphers: 'SSLv3'\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tsetInterval(() => {\n\t\t\tif (ResolveIOServer.getMainServer().getSubscriptionManager() && ResolveIOServer.getMainServer().getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Method Manager', 'Send Queue Hits', this._debugSendQueueHits);\n\t\t\t\tconsole.log(new Date(), 'Method Manager', 'Call Method Internal Hits', this._debugCallMethodInternalHits);\n\t\t\t\tconsole.log(new Date(), 'Method Manager', 'Call Method Hits', this._debugCallMethodHits);\n\t\t\t\tconsole.log(new Date(), 'Method Manager', 'Call Method Cron Hits', this._debugCallMethodCronJobHits);\n\t\t\t}\n\n\t\t\tthis._debugCallMethodInternalHits = 0;\n\t\t\tthis._debugCallMethodHits = 0;\n\t\t\tthis._debugCallMethodCronJobHits = 0;\n\t\t\tthis._debugSendQueueHits = 0;\n\t\t}, 60000);\n\n\t\tif (!this._isWorkersEnabled || this._isWorkerInstance) {\n\t\t\tthis.setupEmailWatcher();\n\t\t}\n\t}\n\n\t// Add methods to private methods object\n\tpublic methods(method: MethodModel) {\n\t\tthis._methods = Object.assign(this._methods, method);\n\t}\n\n\tpublic callMethodCron(method: string, ...methodData: any[]) {\n\t\tthis._debugCallMethodCronJobHits += 1;\n\n\t\tif (!this._methods[method]) {\n\t\t\tconsole.log('No Method: ' + method);\n\n\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Method: ' + method);\n\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((methodData.length > 1 || methodData[0]) && !this._methods[method].skipValidation) {\n\t\t\tif (!this._methods[method].check) {\n\t\t\t\tconsole.error(new Date(), 'No Check Function For Method ' + method);\n\n\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Check Function For Method ' + method);\n\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (!this._methods[method].check._schema) {\n\t\t\t\tconsole.error(new Date(), 'No Check Schema For Method ' + method);\n\n\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Check Function For Method ' + method);\n\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet valObj = {};\n\t\t\t\tlet valKeys = Object.keys(this._methods[method].check._schema);\n\n\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\t\t\t\t\n\t\t\t\tfor (let i = 0; i < methodData.length; i++) {\n\t\t\t\t\tvalObj[rootKeys[i]] = methodData[i];\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tthis._methods[method].check.validate(valObj);\n\t\t\t\t}\n\t\t\t\tcatch (errors) {\n\t\t\t\t\tif (errors) {\n\t\t\t\t\t\tconsole.error(new Date(), 'Error in Method Check (' + method + ')', errors);\n\n\t\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'Match Error On Method ' + method + '\\n\\nData Being Checked\\n' + JSON.stringify(valObj, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(errors, null, 2));\n\t\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet promise = null;\n\n\t\t// To prevent extremely large data being inserted, let's split it up into references if needed\n\t\t// For example, if `methodData` is huge, we can store large arrays/objects into a separate collection\n\t\t// and only store references in the worker-task-requests doc. This avoids hitting the 16MB BSON limit.\n\t\tlet MAX_DOCUMENT_SIZE = 1024 * 1024 * 8; // 8MB as a threshold before we chunk (just an example threshold)\n\t\tlet serializedData = JSON.stringify(methodData);\n\n\t\t// Check if workers are enabled and this is not a worker instance\n\t\tif (this._isWorkersEnabled && \n\t\t\t!this._isWorkerInstance && \n\t\t\tBuffer.byteLength(serializedData, 'utf8') < MAX_DOCUMENT_SIZE &&\n\t\t\tmethod !== 'insertSubscriptionLog' && \n\t\t\tmethod !== 'countQuery' &&\n\t\t\tmethod !== 'incCounter' && \n\t\t\tmethod !== 'supportCreateBillingUser' &&\n\t\t\tmethod !== 'find' &&\n\t\t\tmethod !== 'insertDocument' &&\n\t\t\tmethod !== 'countWithQuery' &&\n\t\t\tmethod !== 'findOne' &&\n\t\t\tmethod !== 'updateDocumentProps' &&\n\t\t\tmethod !== 'findWithOptions' &&\n\t\t\tmethod !== 'getSignedUrl' &&\n\t\t\tmethod !== 'updateDocument' &&\n\t\t\tmethod !== 'insertErrorLog' &&\n\t\t\tmethod !== 'getSignedUrls' &&\n\t\t\tmethod !== 'removeDocument' &&\n\t\t\tmethod !== 'getSignedUrlWithId' &&\n\t\t\tmethod !== 'incorrectUser' &&\n\t\t\tmethod !== 'reloadWS' &&\n\t\t\tmethod !== 'reconnectWS' &&\n\t\t\tmethod !== 'disconnectWS'\n\t\t) {\t\t\t\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Cron Method', method, '', '', methodData);\n\n\t\t\t// Push task to worker-task-reqs collection\n\t\t\tconst taskId = objectIdHexString();\n\n\t\t\t// Watch worker-task-resps for result\n\t\t\tpromise = new Promise((resolve, reject) => {\n\t\t\t\tlet changeStream = WorkerTaskResponses.watchCollection([{ $match: { 'fullDocument.id_request': taskId } }], { fullDocument: 'updateLookup' });\n\n\t\t\t\tchangeStream.on('change', change => {\n\t\t\t\t\tif (change.operationType === 'insert') {\n\t\t\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\t\t\tconst taskResponse = change.fullDocument;\n\n\t\t\t\t\t\tif (taskResponse.has_error) {\n\t\t\t\t\t\t\treject(taskResponse.data); // Task failed, return error\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(taskResponse.data); // Task succeeded, return result\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchangeStream.close(); // Close the cursor after receiving response\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tchangeStream.on('error', error => {\n\t\t\t\t\tconsole.error('Error watching worker responses:', error);\n\t\t\t\t\treject(error);\n\t\t\t\t\tchangeStream.close();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tWorkerTaskRequests.create({\n\t\t\t\t_id: taskId,\n\t\t\t\tmethod: method,\n\t\t\t\tparams: methodData,\n\t\t\t\tstatus: 'pending',\n\t\t\t\tid_user: this['id_user'],\n\t\t\t\tuser: this['user'],\n\t\t\t\tid_ws: this['id_socket']\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Cron Method', method, '', '', methodData);\n\t\t\tpromise = this._methods[method].function.call(Object.assign({}, this, MethodManager.prototype, {id_user: '', user: '', id_ws: ''}), ...methodData)\n\t\t\t.then(res => {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t\treturn res;\n\t\t\t}, methodErrs => {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'Error Detected During Method ' + method + ' - (callMethodCron)\\n\\nData \\n' + JSON.stringify(methodData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(methodErrs, null, 2));\n\t\t\t\treturn methodErrs;\n\t\t\t});\n\t\t}\n\n\t\treturn promise;\n\t}\n\n\t// Call/run method (Emit on Socket)\n\tpublic callMethod(id_methodLatency: string, ws: WebSocket, messageDate: Date, messageId: number, method: string, ...methodData: any[]) {\n\t\tthis._debugCallMethodHits += 1;\n\t\n\t\tif (!this._methods[method]) {\n\t\t\tconsole.log('No Method: ' + method);\n\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Method: ' + method);\n\t\n\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: true,\n\t\t\t\tdata: 'Internal Error'\n\t\t\t};\n\t\n\t\t\tthis.sendWS(ws, new Date(), method, methodData, serverRes);\n\t\n\t\t\tif (id_methodLatency) {\n\t\t\t\tLogMethodLatencies.deleteOne({_id: id_methodLatency});\n\t\t\t}\n\t\n\t\t\treturn;\n\t\t}\n\t\n\t\tif ((methodData.length > 1 || methodData[0]) && !this._methods[method].skipValidation) {\n\t\t\tif (!this._methods[method].check) {\n\t\t\t\tconsole.error(new Date(), 'No Check Function For Method ' + method);\n\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Check Function For Method ' + method);\n\t\t\t\t\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: 'Internal Error'\n\t\t\t\t};\n\t\n\t\t\t\tthis.sendWS(ws, messageDate, method, methodData, serverRes);\n\t\n\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\tLogMethodLatencies.deleteOne({ _id: id_methodLatency });\n\t\t\t\t}\n\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (!this._methods[method].check._schema) {\n\t\t\t\tconsole.error(new Date(), 'No Check Schema For Method ' + method);\n\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'No Check Schema For Method ' + method);\n\t\t\t\t\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: 'Internal Error'\n\t\t\t\t};\n\t\n\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\tLogMethodLatencies.deleteOne({ _id: id_methodLatency });\n\t\t\t\t}\n\t\n\t\t\t\tthis.sendWS(ws, messageDate, method, methodData, serverRes);\n\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet valObj = {};\n\t\t\t\tlet valKeys = Object.keys(this._methods[method].check._schema);\n\t\n\t\t\t\tlet rootKeys = valKeys.filter(a => !a.includes('.'));\n\t\n\t\t\t\tfor (let i = 0; i < methodData.length; i++) {\n\t\t\t\t\tvalObj[rootKeys[i]] = methodData[i];\n\t\t\t\t}\n\t\n\t\t\t\ttry {\n\t\t\t\t\tthis._methods[method].check.validate(valObj);\n\t\t\t\t}\n\t\t\t\tcatch (errors) {\n\t\t\t\t\tif (errors) {\n\t\t\t\t\t\tconsole.error(new Date(), 'Error in Method Check (' + method + ')', errors);\n\t\n\t\t\t\t\t\tif (method !== 'processAirdropDistribution') {\n\t\t\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'Match Error On Method ' + method + '\\n\\nData Being Checked\\n' + JSON.stringify(valObj, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(errors, null, 2));\n\t\t\t\t\t\t}\n\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: true,\n\t\t\t\t\t\t\tdata: 'Internal Error'\n\t\t\t\t\t\t};\n\t\n\t\t\t\t\t\tthis.sendWS(ws, messageDate, method, methodData, serverRes);\n\t\n\t\t\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\t\t\tLogMethodLatencies.deleteOne({ _id: id_methodLatency });\n\t\t\t\t\t\t}\n\t\t\t\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// To prevent extremely large data being inserted, let's split it up into references if needed\n\t\t// For example, if `methodData` is huge, we can store large arrays/objects into a separate collection\n\t\t// and only store references in the worker-task-requests doc. This avoids hitting the 16MB BSON limit.\n\t\tlet MAX_DOCUMENT_SIZE = 1024 * 1024 * 8; // 8MB as a threshold before we chunk (just an example threshold)\n\t\tlet serializedData = JSON.stringify(methodData);\n\t\n\t\t// Check if workers are enabled and this is not a worker instance\n\t\tif (this._isWorkersEnabled && \n\t\t\t!this._isWorkerInstance && \n\t\t\tBuffer.byteLength(serializedData, 'utf8') < MAX_DOCUMENT_SIZE &&\n\t\t\tmethod !== 'insertSubscriptionLog' && \n\t\t\tmethod !== 'countQuery' && method !== 'incCounter' && \n\t\t\tmethod !== 'supportCreateBillingUser' &&\n\t\t\tmethod !== 'find' &&\n\t\t\tmethod !== 'insertDocument' &&\n\t\t\tmethod !== 'countWithQuery' &&\n\t\t\tmethod !== 'findOne' &&\n\t\t\tmethod !== 'updateDocumentProps' &&\n\t\t\tmethod !== 'findWithOptions' &&\n\t\t\tmethod !== 'getSignedUrl' &&\n\t\t\tmethod !== 'updateDocument' &&\n\t\t\tmethod !== 'insertErrorLog' &&\n\t\t\tmethod !== 'getSignedUrls' &&\n\t\t\tmethod !== 'removeDocument' &&\n\t\t\tmethod !== 'getSignedUrlWithId' &&\n\t\t\tmethod !== 'incorrectUser' &&\n\t\t\tmethod !== 'reloadWS' &&\n\t\t\tmethod !== 'reconnectWS' &&\n\t\t\tmethod !== 'disconnectWS'\n\t\t) {\t\n\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Method', method, ws['user'] || '', ws['id_socket'] || '', methodData);\n\t\t\t\n\t\t\tconst taskId = objectIdHexString();\n\t\n\t\t\tlet changeStream = WorkerTaskResponses.watchCollection([{ $match: { 'fullDocument.id_request': taskId } }], { fullDocument: 'updateLookup' });\n\t\n\t\t\tchangeStream.on('change', async change => {\n\t\t\t\tif (change.operationType === 'insert') {\n\t\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\n\t\t\t\t\tconst taskResponse = change.fullDocument;\n\t\n\t\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\t\thasError: taskResponse.has_error,\n\t\t\t\t\t\tdata: taskResponse.data\n\t\t\t\t\t};\n\t\n\t\t\t\t\tthis.sendWS(ws, new Date(), method, methodData, serverRes);\n\t\n\t\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\t\tlet latency = await LogMethodLatencies.findById(id_methodLatency);\n\t\t\t\t\t\tif (latency) {\n\t\t\t\t\t\t\tLogMethodLatencies.updateOne({_id: id_methodLatency}, {$set: {date_end: new Date(), latency_ms: moment().diff(moment(latency.date_start), 'milliseconds', true)}});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\n\t\t\t\t\tchangeStream.close();\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\tchangeStream.on('error', error => {\n\t\t\t\tconsole.error('Error watching worker responses:', error);\n\t\t\t\tchangeStream.close();\n\t\t\t});\n\t\n\t\t\tWorkerTaskRequests.create({\n\t\t\t\t_id: taskId,\n\t\t\t\tmethod: method,\n\t\t\t\tparams: methodData,\n\t\t\t\tstatus: 'pending',\n\t\t\t\tid_user: ws['id_user'],\n\t\t\t\tuser: ws['user'],\n\t\t\t\tid_ws: ws['id_socket']\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Method', method, ws['user'] || '', ws['id_socket'] || '', methodData);\n\t\t\tthis._methods[method].function.call(Object.assign({}, this, MethodManager.prototype, {id_user: ws['id_user'], user: ws['user'], id_ws: ws['id_socket']}), ...methodData)\n\t\t\t.then(async (res) => {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: res\n\t\t\t\t};\n\t\n\t\t\t\tthis.sendWS(ws, messageDate, method, methodData, serverRes);\n\t\n\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\tlet latency = await LogMethodLatencies.findById(id_methodLatency);\n\t\t\t\t\tif (latency) {\n\t\t\t\t\t\tLogMethodLatencies.updateOne({_id: id_methodLatency}, {$set: {date_end: new Date(), latency_ms: moment().diff(moment(latency.date_start), 'milliseconds', true)}});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\terr => {\n\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t\tlet serverRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: err\n\t\t\t\t};\n\t\n\t\t\t\tthis.sendWS(ws, messageDate, method, methodData, serverRes);\n\t\n\t\t\t\tif (id_methodLatency) {\n\t\t\t\t\tLogMethodLatencies.deleteOne({_id: id_methodLatency});\n\t\t\t\t}\n\t\n\t\t\t\tif (method !== 'processAirdropDistribution') {\n\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'Error Detected During Method ' + method + ' - (callMethod)\\n\\nData \\n' + JSON.stringify(methodData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(err, null, 2));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Call/run method internal (No Emit on Socket)\n\tpublic callMethodInternal(method: string, ...methodData: any[]): Promise<any> {\n\t\tthis._debugCallMethodInternalHits += 1;\n\n\t\tif (!this._methods[method]) {\n\t\t\tconsole.log('No Method: ' + method);\n\t\t\treturn null;\n\t\t}\n\n\t\tif ((methodData.length > 1 || (methodData[0] && typeof methodData[0] !== 'function')) && !this._methods[method].skipValidation) {\n\t\t\tif (!this._methods[method].check) {\n\t\t\t\tconsole.error(new Date(), 'No Check Function For Method ' + method);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\telse if (!this._methods[method].check._schema) {\n\t\t\t\tconsole.error(new Date(), 'No Check Schema For Method ' + method);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tif (method !== 'insertSubscriptionLog' && method !== 'getDataURIfromURL' && method !== 'processAirdropDistribution' && method !== 'incCounter' && method !== 'supportCreateBillingUser' && method !== 'countCollectionWithQuery') {\n\t\t\tLogs.insertOne({\n\t\t\t\t_id: objectIdHexString(),\n\t\t\t\ttype: 'callMethodInternal',\n\t\t\t\tcollection: '',\n\t\t\t\tid_document: '',\n\t\t\t\tpayload: getBinarySize(JSON.stringify([methodData])) < 200000 ? JSON.stringify([methodData], null, 2) : 'Too Big',\n\t\t\t\tmethod: method,\n\t\t\t\tid_user: this['id_user'] || '',\n\t\t\t\tuser: this['user'] || '',\n\t\t\t\tmessageId: 0,\n\t\t\t\troute: ''\n\t\t\t});\n\t\t}\n\n\t\tlet functionMethodData = typeof(methodData[methodData.length - 1]) === 'function' ? methodData.slice(0, -1) : methodData;\n\t\tlet promise = null;\n\n\t\t// To prevent extremely large data being inserted, let's split it up into references if needed\n\t\t// For example, if `methodData` is huge, we can store large arrays/objects into a separate collection\n\t\t// and only store references in the worker-task-requests doc. This avoids hitting the 16MB BSON limit.\n\t\tlet MAX_DOCUMENT_SIZE = 1024 * 1024 * 8; // 8MB as a threshold before we chunk (just an example threshold)\n\t\tlet serializedData = JSON.stringify(functionMethodData);\n\n\t\tif (this._isWorkersEnabled && \n\t\t\t!this._isWorkerInstance && \n\t\t\tBuffer.byteLength(serializedData, 'utf8') < MAX_DOCUMENT_SIZE &&\n\t\t\tmethod !== 'insertSubscriptionLog' && \n\t\t\tmethod !== 'countQuery' && method !== 'incCounter' && \n\t\t\tmethod !== 'supportCreateBillingUser' &&\n\t\t\tmethod !== 'find' &&\n\t\t\tmethod !== 'insertDocument' &&\n\t\t\tmethod !== 'countWithQuery' &&\n\t\t\tmethod !== 'findOne' &&\n\t\t\tmethod !== 'updateDocumentProps' &&\n\t\t\tmethod !== 'findWithOptions' &&\n\t\t\tmethod !== 'getSignedUrl' &&\n\t\t\tmethod !== 'updateDocument' &&\n\t\t\tmethod !== 'insertErrorLog' &&\n\t\t\tmethod !== 'getSignedUrls' &&\n\t\t\tmethod !== 'removeDocument' &&\n\t\t\tmethod !== 'getSignedUrlWithId' &&\n\t\t\tmethod !== 'incorrectUser' &&\n\t\t\tmethod !== 'reloadWS' &&\n\t\t\tmethod !== 'reconnectWS' &&\n\t\t\tmethod !== 'disconnectWS'\n\t\t) {\t\t\t\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Internal Method', method, this['user'] || '', '', functionMethodData);\n\n\t\t\t// Push task to worker-task-reqs collection\n\t\t\tconst taskId = objectIdHexString();\n\n\t\t\t// Watch worker-task-resps for result\n\t\t\tpromise = new Promise((resolve, reject) => {\n\t\t\t\tlet changeStream = WorkerTaskResponses.watchCollection([{ $match: { 'fullDocument.id_request': taskId } }], { fullDocument: 'updateLookup' });\n\n\t\t\t\tchangeStream.on('change', (change) => {\n\t\t\t\t\tif (change.operationType === 'insert') {\n\t\t\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\n\t\t\t\t\t\tconst taskResponse = change.fullDocument;\n\n\t\t\t\t\t\tif (taskResponse.has_error) {\n\t\t\t\t\t\t\treject(taskResponse.data); // Task failed, return error\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(taskResponse.data); // Task succeeded, return result\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchangeStream.close(); // Close the cursor after receiving response\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tchangeStream.on('error', error => {\n\t\t\t\t\tconsole.error('Error watching worker responses:', error);\n\t\t\t\t\treject(error);\n\t\t\t\t\tchangeStream.close();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tWorkerTaskRequests.create({\n\t\t\t\t_id: taskId,\n\t\t\t\tmethod: method,\n\t\t\t\tparams: functionMethodData,\n\t\t\t\tstatus: 'pending',\n\t\t\t\tid_user: this['id_user'],\n\t\t\t\tuser: this['user'],\n\t\t\t\tid_ws: this['id_socket']\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tlet monitor = this._monitorManagerFunction.startMonitorFunction('Internal Method', method, this['user'] || '', '', functionMethodData);\n\t\t\tpromise = this._methods[method].function.call(Object.assign({}, this, MethodManager.prototype), ...functionMethodData)\n\t\t\t\t.then(res => {\n\t\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t\t\treturn res;\n\t\t\t\t},\n\t\t\t\tmethodErrs => {\n\t\t\t\t\tthis._monitorManagerFunction.finishMonitorFunction(monitor);\n\t\t\t\t\tthis.sendEmail('dev@resolveio.com', 'SERVER - Error Detected - ' + ResolveIOServer.getServerConfig()['CLIENT_NAME'], 'Error Detected During Method ' + method + ' - (callMethodInternal)\\n\\nData \\n' + JSON.stringify(methodData, null, 2) + '\\n\\nErrors\\n' + JSON.stringify(methodErrs, null, 2));\n\t\t\t\t\treturn methodErrs;\n\t\t\t\t});\n\t\t}\n\n\t\tif (methodData[methodData.length - 1] && typeof(methodData[methodData.length - 1]) === 'function') {\n\t\t\tpromise.then(res => methodData[methodData.length - 1](null, res), err => methodData[methodData.length - 1](err, null));\n\t\t}\n\t\t\n\t\treturn promise;\n\t}\n\n\tprivate sendWS(ws: WebSocket, messageDate: Date, method: string, methodData: any[], data: ServerResponseModel) {\n\t\tthis._websocketManager.send(ws, data);\n\n\t\tif (\n\t\t\tmethod !== 'reportBuilderGetResults' &&\n\t\t\tmethod !== 'reportBuilderGetDistinctValue' &&\n\t\t\tmethod !== 'reportBuilderBuildTree' &&\n\t\t\tmethod !== 'generatePDF' &&\n\t\t\tmethod !== 'getWOOfflineData' &&\n\t\t\tmethod !== 'countQuery' &&\n\t\t\tmethod !== 'countWithQuery' &&\n\t\t\tmethod !== 'countCollectionWithQuery' &&\n\t\t\tmethod !== 'find' &&\n\t\t\tmethod !== 'findOne' &&\n\t\t\tmethod !== 'findWithOptions' &&\n\t\t\tmethod !== 'uploadFileAndSave' &&\n\t\t\tmethod !== 'getDrivers' &&\n\t\t\tmethod !== 'processAirdropDistribution'\n\t\t) {\n\t\t\tLogs.insertOne({\n\t\t\t\t_id: objectIdHexString(),\n\t\t\t\ttype: 'client-response',\n\t\t\t\tcollection: '',\n\t\t\t\tid_document: '',\n\t\t\t\tpayload:\n\t\t\t\t\tgetBinarySize(JSON.stringify([methodData, data])) < 200000\n\t\t\t\t\t\t? JSON.stringify([methodData, data], null, 2)\n\t\t\t\t\t\t: 'Too Big',\n\t\t\t\tmethod: method,\n\t\t\t\tid_user: ws['id_user'] || '',\n\t\t\t\tuser: ws['user'] || '',\n\t\t\t\tmessageId: data.messageId,\n\t\t\t\troute: ''\n\t\t\t});\n\t\t}\n\n\t\t// MethodResponses.create({\n\t\t// \t_id: objectIdHexString(),\n\t\t// \t__v: 0,\n\t\t// \tid_user: ws['id_user'] || '',\n\t\t// \tmessage_id: data.messageId,\n\t\t// \tresponse: getBinarySize(JSON.stringify(data)) < 200000 ? data : { error: 'Too Big' },\n\t\t// \tmethod: method,\n\t\t// \tdate: messageDate\n\t\t// });\n\t}\n\n\tasync setupEmailWatcher() {\n\t\tconst changeStream = EmailHistories.watchCollection([]);\n\n\t\tchangeStream.on('change', async (change) => {\n\t\t\tif (change.operationType === 'insert' && change.fullDocument && change.fullDocument.status === 'pending') {\n\t\t\t\tthis.emailQueue.add(change.fullDocument._id.toString());\n\t\t\t\tthis.tryProcessEmail();\n\t\t\t}\n\t\t\telse if (change.operationType === 'update' || change.operationType === 'replace') {\n\t\t\t\tconst updatedEmail = change.fullDocument;\n\t\t\t\tif (updatedEmail && updatedEmail.status !== 'pending' && this.emailQueue.has(updatedEmail._id.toString())) {\n\t\t\t\t\tthis.emailQueue.delete(updatedEmail._id.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\t.on('error', err => {\n\t\t\tconsole.error('Email history changestream error', err);\n\t\t\tchangeStream.close();\n\t\t})\n\t\t.on('close', () => {\n\t\t\tthis.setupEmailWatcher();\n\t\t});\n\n\t\tawait this.loadPendingEmails();\n\t}\n\n\tasync loadPendingEmails() {\n\t\t// Load any pending emails on startup\n\t\tconst pendingEmails = await EmailHistories.find({ status: 'pending' }, {sort: {_id: 1}});\n\t\tfor (const email of pendingEmails) {\n\t\t\tthis.emailQueue.add(email._id.toString());\n\t\t}\n\t\t// Try to process emails\n\t\tthis.tryProcessEmail();\n\t}\n\n\tasync tryProcessEmail() {\n\t\tif (this.isEmailProcessing || this.emailQueue.size === 0) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tthis.isEmailProcessing = true;\n\t\n\t\ttry {\n\t\t\twhile (this.emailQueue.size > 0) {\n\t\t\t\tconst emailId = this.emailQueue.values().next().value;\n\t\t\t\tthis.emailQueue.delete(emailId);\n\t\n\t\t\t\tconst emailHistory = await EmailHistories.findOneAndUpdate(\n\t\t\t\t\t{\n\t\t\t\t\t\t_id: emailId,\n\t\t\t\t\t\tstatus: 'pending',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t$set: { status: 'processing', processingAt: new Date() },\n\t\t\t\t\t}\n\t\t\t\t);\n\t\n\t\t\t\tif (!emailHistory) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\n\t\t\t\t// Fetch and process attachments\n\t\t\t\tif (emailHistory.attachments && emailHistory.attachments.length > 0) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (let att of emailHistory.attachments) {\n\t\t\t\t\t\t\tif (att.path && att.path.startsWith('http')) {\n\t\t\t\t\t\t\t\tconst response = await fetch(att.path);\n\t\t\t\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`Failed to fetch attachment: ${att.path}`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst arrayBuffer = await response.arrayBuffer();\n\t\t\t\t\t\t\t\tconst buffer = Buffer.from(arrayBuffer);\n\t\n\t\t\t\t\t\t\t\t// Check the size of the attachment\n\t\t\t\t\t\t\t\tconst maxSize = 20 * 1024 * 1024; // 20MB in bytes\n\t\t\t\t\t\t\t\tif (buffer.length <= maxSize) {\n\t\t\t\t\t\t\t\t\t// Attachment is within size limits, include it\n\t\t\t\t\t\t\t\t\tatt.content = buffer;\n\t\t\t\t\t\t\t\t\tdelete att.path;\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\tcatch (err) {\n\t\t\t\t\t\tconsole.error('Failed to fetch attachment:', err);\n\t\n\t\t\t\t\t\tawait EmailHistories.updateOne(\n\t\t\t\t\t\t\t{ _id: emailHistory._id },\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\t\t\tstatus: 'failed',\n\t\t\t\t\t\t\t\t\terror: typeof err === 'string' ? err : this.safeStringify(err),\n\t\t\t\t\t\t\t\t\tcompletedAt: new Date(),\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\t// Skip to the next email\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Prepare email options\n\t\t\t\tconst mailOptions: any = {\n\t\t\t\t\treplyTo: emailHistory.reply_to || (ResolveIOServer.getServerConfig()['MAIL_REPLY_TO'] || undefined),\n\t\t\t\t\tfrom: emailHistory.send_from || ResolveIOServer.getServerConfig().MAIL_FROM,\n\t\t\t\t\tto: emailHistory.email,\n\t\t\t\t\tsubject:\n\t\t\t\t\t\t(ResolveIOServer.getServerConfig()['ROOT_URL'].match(/https:\\/\\/dev\\./) ||\n\t\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'].match(/https:\\/\\/www\\.dev\\./)\n\t\t\t\t\t\t\t? '(DEV SERVER) - '\n\t\t\t\t\t\t\t: '') + emailHistory.subject,\n\t\t\t\t\ttext: typeof emailHistory.text === 'string' ? emailHistory.text : '',\n\t\t\t\t\thtml: typeof emailHistory.html === 'string' ? emailHistory.html : '',\n\t\t\t\t\tattachments: emailHistory.attachments || [],\n\t\t\t\t};\n\t\n\t\t\t\t// Process attachments before sending\n\t\t\t\tif (mailOptions.attachments && mailOptions.attachments.length > 0) {\n\t\t\t\t\tmailOptions.attachments = mailOptions.attachments.map((att) => {\n\t\t\t\t\t\tconst newAtt = { ...att };\n\t\t\t\t\t\t// Handle attachments stored as BinData or Buffer\n\t\t\t\t\t\tif (newAtt.content && typeof newAtt.content === 'object' && !(newAtt.content instanceof Buffer)) {\n\t\t\t\t\t\t\t// Convert MongoDB's Binary data to Buffer\n\t\t\t\t\t\t\tif (newAtt.content._bsontype === 'Binary' && newAtt.content.sub_type === 0) {\n\t\t\t\t\t\t\t\tnewAtt.content = Buffer.from(newAtt.content.buffer);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t// Handle other types if necessary\n\t\t\t\t\t\t\t\tnewAtt.content = Buffer.from(newAtt.content);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Handle attachments stored as Base64 strings\n\t\t\t\t\t\telse if (typeof newAtt.content === 'string' && newAtt.encoding === 'base64') {\n\t\t\t\t\t\t\tnewAtt.content = Buffer.from(newAtt.content, 'base64');\n\t\t\t\t\t\t\tdelete newAtt.encoding;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Ensure the content is a Buffer\n\t\t\t\t\t\telse if (typeof newAtt.content === 'string') {\n\t\t\t\t\t\t\tnewAtt.content = Buffer.from(newAtt.content);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn newAtt;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\n\t\t\t\t// Send the email\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tthis._mailer.sendMail(mailOptions, async (err, info) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\tconsole.error('Failed to send email:', err);\n\t\t\t\t\t\t\t\tEmailHistories.updateOne(\n\t\t\t\t\t\t\t\t\t{ _id: emailHistory._id },\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\t\t\t\t\tstatus: 'failed',\n\t\t\t\t\t\t\t\t\t\t\terror: typeof err === 'string' ? err : this.safeStringify(err),\n\t\t\t\t\t\t\t\t\t\t\tcompletedAt: new Date(),\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\telse {\n\t\t\t\t\t\t\t\tif (emailHistory.email === 'dev@resolveio.com') {\n\t\t\t\t\t\t\t\t\tEmailHistories.deleteOne({ _id: emailHistory._id });\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\tEmailHistories.updateOne(\n\t\t\t\t\t\t\t\t\t\t{ _id: emailHistory._id },\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\t\t\t\t\t\tstatus: 'completed',\n\t\t\t\t\t\t\t\t\t\t\t\tcompletedAt: new Date(),\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}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (error) {\n\t\t\t\t\t\t\tconsole.error('Error in sendMail callback:', error);\n\t\t\t\t\t\t\tEmailHistories.updateOne(\n\t\t\t\t\t\t\t\t{ _id: emailHistory._id },\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$set: {\n\t\t\t\t\t\t\t\t\t\tstatus: 'failed',\n\t\t\t\t\t\t\t\t\t\terror: typeof error === 'string' ? error : this.safeStringify(error),\n\t\t\t\t\t\t\t\t\t\tcompletedAt: new Date(),\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} finally {\n\t\t\t\t\t\t\tresolve(); // Continue processing the queue\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\n\t\t\t\t// Wait for at least one second before sending the next email\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1000));\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Error processing email queue:', err);\n\t\t}\n\t\tfinally {\n\t\t\tthis.isEmailProcessing = false;\n\t\t\t// Check if new emails arrived while processing\n\t\t\tif (this.emailQueue.size > 0) {\n\t\t\t\tthis.tryProcessEmail();\n\t\t\t}\n\t\t}\n\t}\n\n\tsafeStringify(obj)\n\t{\n\t\ttry\n\t\t{\n\t\t\treturn JSON.stringify(obj, this.getCircularReplacer());\n\t\t}\n\t\tcatch (e)\n\t\t{\n\t\t\treturn `Error in JSON stringifying: ${e.message}`;\n\t\t}\n\t}\n\n\tgetCircularReplacer()\n\t{\n\t\tconst seen = new WeakSet();\n\t\treturn (key, value) =>\n\t\t{\n\t\t\tif (typeof value === \"object\" && value !== null)\n\t\t\t{\n\t\t\t\tif (seen.has(value))\n\t\t\t\t{\n\t\t\t\t\treturn \"[Circular]\";\n\t\t\t\t}\n\t\t\t\tseen.add(value);\n\t\t\t}\n\t\t\treturn value;\n\t\t};\n\t}\n\n\tpublic sendEmail(\n\t\tsendTo: string,\n\t\tsubject: string,\n\t\ttext?: string,\n\t\thtml?: string,\n\t\tattachments?: any[],\n\t\tsend_from?: string,\n\t\treply_to?: string,\n\t\tlocal_override = false\n\t) {\n\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t// Modify sendTo in development environments\n\t\t\tif (\n\t\t\t\t(ResolveIOServer.getServerConfig()['ROOT_URL'].match(/https:\\/\\/dev\\./) ||\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'].match(/https:\\/\\/www\\.dev\\./) ||\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] === 'http://localhost:4200') &&\n\t\t\t\t!sendTo.match(/\\@resolveio\\.com/)\n\t\t\t) {\n\t\t\t\tsendTo = 'dev@resolveio.com';\n\t\t\t}\n\t\n\t\t\tif (sendTo) {\n\t\t\t\tif (\n\t\t\t\t\tResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200' ||\n\t\t\t\t\tlocal_override\n\t\t\t\t) {\n\t\t\t\t\tif (!attachments) {\n\t\t\t\t\t\tattachments = [];\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif (!Array.isArray(attachments)) {\n\t\t\t\t\t\tattachments = [attachments];\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Process attachments before saving\n\t\t\t\t\tattachments = attachments.map((att) => {\n\t\t\t\t\t\tconst newAtt = { ...att };\n\t\t\t\t\t\tif (Buffer.isBuffer(newAtt.content)) {\n\t\t\t\t\t\t\tnewAtt.content = newAtt.content.toString('base64');\n\t\t\t\t\t\t\tnewAtt.encoding = 'base64';\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn newAtt;\n\t\t\t\t\t});\n\t\n\t\t\t\t\t// Queue the email in MongoDB\n\t\t\t\t\tconst emailHistory: EmailHistoryModel = {\n\t\t\t\t\t\t_id: objectIdHexString(),\n\t\t\t\t\t\t__v: 0,\n\t\t\t\t\t\tdate: new Date(),\n\t\t\t\t\t\tid_user: this['id_user'] || '',\n\t\t\t\t\t\tuser: this['user'] || '',\n\t\t\t\t\t\temail: sendTo,\n\t\t\t\t\t\tsubject: subject || '',\n\t\t\t\t\t\ttext: text || '',\n\t\t\t\t\t\thtml: html || '',\n\t\t\t\t\t\tattachments: attachments || [],\n\t\t\t\t\t\tsend_from: send_from || '',\n\t\t\t\t\t\treply_to: reply_to || '',\n\t\t\t\t\t\tstatus: 'pending',\n\t\t\t\t\t\terror: ''\n\t\t\t\t\t};\n\t\n\t\t\t\t\tEmailHistories.insertOne(emailHistory).then(\n\t\t\t\t\t\t(history) => resolve(history),\n\t\t\t\t\t\t(err) => {\n\t\t\t\t\t\t\tconsole.error('Failed to queue email:', err);\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'Send email',\n\t\t\t\t\t\tsendTo,\n\t\t\t\t\t\tsubject,\n\t\t\t\t\t\ttext,\n\t\t\t\t\t\thtml,\n\t\t\t\t\t\tattachments,\n\t\t\t\t\t\tsend_from\n\t\t\t\t\t);\n\t\t\t\t\tresolve(true);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tresolve(true);\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic getAWS(): AWS {\n\t\treturn this._aws;\n\t}\n\n\tpublic readFile(fileName) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (fs.existsSync(path.join(__dirname, ('../private/' + fileName)))) {\n\t\t\t\tfs.readFile(path.join(__dirname, ('../private/' + fileName)), 'utf-8', (err, res) => { \n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (fs.existsSync(path.join(ResolveIOServer.getClientDir(), ('./private/' + fileName)))) {\n\t\t\t\t\tfs.readFile(path.join(ResolveIOServer.getClientDir(), ('./private/' + fileName)), 'utf-8', (err, res) => { \n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic readImage(fileName) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (fs.existsSync(path.join(__dirname, ('../private/' + fileName)))) {\n\t\t\t\tfs.readFile(path.join(__dirname, ('../private/' + fileName)), 'base64', (err, res) => { \n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (fs.existsSync(path.join(ResolveIOServer.getClientDir(), ('./private/' + fileName)))) {\n\t\t\t\t\tfs.readFile(path.join(ResolveIOServer.getClientDir(), ('./private/' + fileName)), 'base64', (err, res) => { \n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tresolve(res);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "20.5.7",
3
+ "version": "20.5.9",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",