@triproject/nestjs-core 1.0.14 → 1.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +222 -2
  2. package/dist/config.d.ts +36 -1
  3. package/dist/config.js +1 -1
  4. package/dist/controllers/controller.js +1 -1
  5. package/dist/drivers/cache/cache.d.ts +1 -0
  6. package/dist/drivers/cache/cache.js +1 -1
  7. package/dist/drivers/cache/{cache.driver.js → cache.module.js} +1 -1
  8. package/dist/drivers/cache/index.d.ts +1 -1
  9. package/dist/drivers/cache/index.js +1 -1
  10. package/dist/drivers/cache/redis.d.ts +19 -4
  11. package/dist/drivers/cache/redis.js +1 -1
  12. package/dist/drivers/db/db.module.js +1 -1
  13. package/dist/drivers/db/db.service.js +1 -1
  14. package/dist/drivers/db/migration.d.ts +7 -7
  15. package/dist/drivers/db/migration.js +1 -1
  16. package/dist/drivers/encryptions/encryption.d.ts +2 -0
  17. package/dist/drivers/encryptions/encryption.js +1 -1
  18. package/dist/drivers/encryptions/jwt.d.ts +3 -0
  19. package/dist/drivers/encryptions/jwt.js +1 -1
  20. package/dist/drivers/encryptions/password-hash.d.ts +2 -0
  21. package/dist/drivers/encryptions/password-hash.js +1 -1
  22. package/dist/drivers/logger/app.logger.d.ts +2 -3
  23. package/dist/drivers/logger/app.logger.js +2 -2
  24. package/dist/drivers/logger/cloudwatch.d.ts +11 -14
  25. package/dist/drivers/logger/cloudwatch.js +1 -1
  26. package/dist/drivers/logger/index.d.ts +0 -1
  27. package/dist/drivers/logger/index.js +1 -1
  28. package/dist/drivers/logger/logger.contract.d.ts +24 -0
  29. package/dist/drivers/logger/logger.contract.js +1 -0
  30. package/dist/drivers/logger/logger.driver.d.ts +15 -0
  31. package/dist/drivers/logger/logger.driver.js +1 -0
  32. package/dist/drivers/logger/slack.logger.d.ts +8 -1
  33. package/dist/drivers/logger/slack.logger.js +1 -1
  34. package/dist/drivers/mail/mail.queue.d.ts +1 -1
  35. package/dist/drivers/mail/mail.queue.js +1 -1
  36. package/dist/drivers/mail/mailer.d.ts +1 -1
  37. package/dist/drivers/mail/mailer.js +1 -1
  38. package/dist/drivers/message-broker/index.d.ts +3 -0
  39. package/dist/drivers/message-broker/index.js +1 -0
  40. package/dist/drivers/message-broker/kafka.d.ts +15 -0
  41. package/dist/drivers/message-broker/kafka.js +1 -0
  42. package/dist/drivers/message-broker/message-broker.contract.d.ts +18 -0
  43. package/dist/drivers/message-broker/message-broker.contract.js +1 -0
  44. package/dist/drivers/message-broker/message-broker.module.d.ts +2 -0
  45. package/dist/drivers/message-broker/message-broker.module.js +1 -0
  46. package/dist/drivers/message-broker/message.broker.d.ts +13 -0
  47. package/dist/drivers/message-broker/message.broker.js +1 -0
  48. package/dist/drivers/message-broker/rabbitmq.d.ts +15 -0
  49. package/dist/drivers/message-broker/rabbitmq.js +1 -0
  50. package/dist/drivers/notifications/notification.queue.d.ts +1 -1
  51. package/dist/drivers/notifications/notification.queue.js +1 -1
  52. package/dist/drivers/notifications/push-notification.d.ts +3 -2
  53. package/dist/drivers/notifications/push-notification.js +1 -1
  54. package/dist/drivers/notifications/slack.d.ts +2 -1
  55. package/dist/drivers/queues/app.queue.d.ts +1 -1
  56. package/dist/drivers/queues/app.queue.js +1 -1
  57. package/dist/drivers/queues/queue.module.js +1 -1
  58. package/dist/drivers/secret-manager/aws-secret-manager.d.ts +7 -0
  59. package/dist/drivers/secret-manager/aws-secret-manager.js +1 -0
  60. package/dist/drivers/secret-manager/index.d.ts +2 -0
  61. package/dist/drivers/secret-manager/index.js +1 -0
  62. package/dist/drivers/storage/csv.storage.d.ts +23 -0
  63. package/dist/drivers/storage/csv.storage.js +1 -0
  64. package/dist/drivers/storage/excel.storage.d.ts +16 -0
  65. package/dist/drivers/storage/excel.storage.js +1 -0
  66. package/dist/drivers/storage/index.d.ts +3 -0
  67. package/dist/drivers/storage/index.js +1 -0
  68. package/dist/drivers/storage/local.storage.d.ts +15 -0
  69. package/dist/drivers/storage/local.storage.js +1 -0
  70. package/dist/drivers/storage/minio.storage.d.ts +14 -0
  71. package/dist/drivers/storage/minio.storage.js +1 -0
  72. package/dist/drivers/storage/s3-storage.d.ts +20 -0
  73. package/dist/drivers/storage/s3-storage.js +1 -0
  74. package/dist/drivers/storage/storage.contract.d.ts +13 -0
  75. package/dist/drivers/storage/storage.contract.js +1 -0
  76. package/dist/drivers/storage/storage.module.d.ts +2 -0
  77. package/dist/drivers/storage/storage.module.js +1 -0
  78. package/dist/drivers/storage/storage.service.d.ts +13 -0
  79. package/dist/drivers/storage/storage.service.js +1 -0
  80. package/dist/helpers/swagger.helper.d.ts +13 -0
  81. package/dist/helpers/swagger.helper.js +1 -1
  82. package/dist/index.d.ts +0 -1
  83. package/dist/index.js +1 -1
  84. package/dist/utils/redlock.d.ts +7 -0
  85. package/dist/utils/redlock.js +1 -0
  86. package/dist/utils/throttle.d.ts +7 -0
  87. package/dist/utils/throttle.js +1 -0
  88. package/dist/{helpers/totp.helper.d.ts → utils/totp.d.ts} +4 -5
  89. package/dist/utils/totp.js +1 -0
  90. package/package.json +86 -22
  91. package/.swcrc +0 -24
  92. package/dist/drivers/logger/cloudwatch.logger.d.ts +0 -1
  93. package/dist/drivers/logger/cloudwatch.logger.js +0 -1
  94. package/dist/helpers/totp.helper.js +0 -1
  95. /package/dist/drivers/cache/{cache.driver.d.ts → cache.module.d.ts} +0 -0
@@ -1,2 +1,2 @@
1
- "use strict";var obj;Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"AppLogger",{enumerable:!0,get:function(){return AppLogger}});let _common=require("@nestjs/common"),_helpers=require("@triproject/helpers"),_os=(obj=require("os"))&&obj.__esModule?obj:{default:obj},_util=require("util"),_config=require("../../config"),_slacklogger=require("./slack.logger"),bgLog=(option,log)=>(0,_util.styleText)("reset",(0,_util.styleText)("bold",(0,_util.styleText)(option,(0,_util.styleText)("black",` ${log} `)))),logError=log=>(0,_util.styleText)("red",log);let LoggerInit=class LoggerInit{host=_os.default.hostname();slackError;constructor(){_config.SLACK_ERROR_WEBHOOK_URL&&(this.slackError=new _slacklogger.SlackLogger(_config.SLACK_ERROR_WEBHOOK_URL))}};let loggerInit=new LoggerInit;let AppLogger=class AppLogger extends _common.ConsoleLogger{context;LOG_STACKS=3;constructor(context=""){super(context),this.context=context}_notifyError(...args){loggerInit.slackError&&loggerInit.slackError.send(args)}excludeContexts=["RoutesResolver","InstanceLoader","RouterExplorer","Nest Application","Module","NestApplication","NestFactory"];_excludeContext(context){return this.excludeContexts.includes(context)}_sanitizePolicyData(object){if(object)if(Array.isArray(object))return object.map(d=>"object"!=typeof d?d:this._sanitizePolicyData(d));else return Object.keys(object).reduce((acc,key)=>{let value=object[key];return _helpers.sanitizeRequests.includes(key)?value="***":"object"==typeof value&&(value=this._sanitizePolicyData(value)),{...acc,[key]:value}},{})}_formatBgLevel(level,...args){let msg=args.join(" ╱ ");switch(level){case"log":default:return bgLog("bgGreen",msg);case"warn":return bgLog("bgYellow",msg);case"error":case"fatal":return bgLog("bgRed",msg);case"debug":return bgLog("bgMagenta",msg)}}_formatException(error){let stacks=(error?.stack??"")?.split("\n").map(o=>o.trim().replace?.(error.name+": ","")).slice(0,"development"===_config.NODE_ENV?void 0:this.LOG_STACKS);return(error?.name??"UnknownErrorException")+" "+stacks.join(`
2
- `)}_parseMessage(arg){return arg instanceof Error?["error",this._formatException(arg)]:"object"==typeof arg?["object",JSON.stringify(this._sanitizePolicyData(arg),null,2)]:["string",arg?.toString()]}_mapLog(level,...args){if(this._excludeContext(this.context)||void 0!==args[1]&&this.excludeContexts.some(d=>args[1]===d))return;let message=[];for(let arg of args?.flat()?.flat())arg&&message.push(this._parseMessage(arg));return{level,env:_config.NODE_ENV.toUpperCase(),context:this.context??"App Logger",timestamp:(0,_helpers.dateUtil)().utc().format("YYYY-MM-DD HH:mm:ss.SSS"),host:loggerInit.host?.substring(0,20),message}}_formatConsoleError(error){return error.split("\n").map(d=>d.endsWith("Exception")?d.replace(/(.*)Exception(.*)/,bgLog("bgRed","$1Exception")+logError("$2")):logError(d)).join("\n ")}_console(logMeta){return console.log(this._formatBgLevel(logMeta.level,logMeta.timestamp,logMeta.host?.substring(0,20),"LOG"===logMeta.level.toUpperCase()?"INFO":logMeta.level.toUpperCase(),logMeta?.context)+(0,_util.styleText)("reset","\n ")+logMeta.message.map(d=>{if("error"===d[0])return logError(this._formatConsoleError(d[1]));if("object"===d[0]){let log;return log=bgLog("bgMagenta","Object")+" "+d[1].split("\n").join("\n "),(0,_util.styleText)("yellow",log)}return(0,_helpers.chunkArray)(d[1].split(" "),10).map(d=>d.join(" ")).join("\n ")}).join("\n "))}log(...args){let logMeta=this._mapLog("log",...args);logMeta&&this._console(logMeta)}error(...args){if("DEVELOPMENT"===_config.NODE_ENV.toUpperCase())return void console.error("\x1b[31m",...args);let logMeta=this._mapLog("error",...args);logMeta&&(this._console(logMeta),this._notifyError(logMeta))}fatal(...args){let logMeta=this._mapLog("fatal",...args);logMeta&&(this._console(logMeta),this._notifyError(args))}warn(...args){let logMeta=this._mapLog("warn",...args);logMeta&&this._console(logMeta)}debug(...args){let logMeta=this._mapLog("debug",...args);logMeta&&this._console(logMeta)}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"AppLogger",{enumerable:!0,get:function(){return AppLogger}});let _common=require("@nestjs/common"),_helpers=require("@triproject/helpers"),_util=require("util"),_config=require("../../config"),_loggercontract=require("./logger.contract"),_loggerdriver=require("./logger.driver");let AppLogger=class AppLogger extends _common.ConsoleLogger{context;LOG_STACKS=5;constructor(context=""){super(context),this.context=context}excludeContexts=["RoutesResolver","InstanceLoader","RouterExplorer","Nest Application","Module","NestApplication","NestFactory"];_excludeContext(context){return this.excludeContexts.includes(context)}_sanitizePolicyData(object){if(object)if(Array.isArray(object))return object.map(d=>"object"!=typeof d?d:this._sanitizePolicyData(d));else return Object.keys(object).reduce((acc,key)=>{let value=object[key];return _helpers.sanitizeRequests.includes(key)?value="***":"object"==typeof value&&(value=this._sanitizePolicyData(value)),{...acc,[key]:value}},{})}_formatBgLevel(level,...args){let msg=args.join(" ╱ ");switch(level){case"log":default:return(0,_loggercontract.logInfoBg)(msg);case"warn":return(0,_loggercontract.logWarnBg)(msg);case"error":case"fatal":return(0,_loggercontract.logErrorBg)(msg);case"debug":return(0,_loggercontract.logDebugBg)(msg)}}_formatException(error){let stacks=(error?.stack??"")?.split("\n").map(o=>o.trim().replace?.(error.name+": ","")).slice(0,"development"===_config.NODE_ENV?void 0:this.LOG_STACKS);return(error?.name??"UnknownErrorException")+" "+stacks.join(`
2
+ `)}_parseMessage(arg){return arg instanceof Error?["error",this._formatException(arg)]:"object"==typeof arg?["object",JSON.stringify(this._sanitizePolicyData(arg),null,2)]:["string",arg?.toString()]}_mapLog(level,...args){if(this._excludeContext(this.context)||void 0!==args[1]&&this.excludeContexts.some(d=>args[1]===d))return;let message=[];for(let arg of args?.flat()?.flat())arg&&message.push(this._parseMessage(arg));return{level,env:_config.NODE_ENV.toUpperCase(),context:this.context??"App Logger",timestamp:(0,_helpers.dateUtil)().utc().format("YYYY-MM-DD HH:mm:ss.SSS"),host:_loggerdriver.loggerDriver.host?.substring(0,20),message}}_formatConsoleError(error){return error.split("\n").map(d=>d.endsWith("Exception")?d.replace(/(.*)Exception(.*)/,(0,_loggercontract.logErrorBg)("$1Exception")+(0,_loggercontract.logError)("$2")):(0,_loggercontract.logError)(d)).join("\n ")}_console(logMeta){return console.log(this._formatBgLevel(logMeta.level,logMeta.timestamp,logMeta.host?.substring(0,20),"LOG"===logMeta.level.toUpperCase()?"INFO":logMeta.level.toUpperCase(),logMeta?.context)+(0,_util.styleText)("reset","\n ")+logMeta.message.map(d=>"error"===d[0]?(0,_loggercontract.logError)(this._formatConsoleError(d[1])):"object"===d[0]?(0,_loggercontract.logWarn)((0,_loggercontract.logDebugBg)("Object")+" "+d[1].split("\n").join("\n ")):(0,_helpers.chunkArray)(d[1].split(" "),10).map(d=>d.join(" ")).join("\n ")).join("\n "))}log(...args){let logMeta=this._mapLog("log",...args);logMeta&&(this._console(logMeta),_loggerdriver.loggerDriver.log(logMeta))}error(...args){if("DEVELOPMENT"===_config.NODE_ENV.toUpperCase())return void console.error("\x1b[31m",...args);let logMeta=this._mapLog("error",...args);logMeta&&(this._console(logMeta),_loggerdriver.loggerDriver.error(logMeta))}fatal(...args){if("DEVELOPMENT"===_config.NODE_ENV.toUpperCase())return void console.error("\x1b[31m",...args);let logMeta=this._mapLog("fatal",...args);logMeta&&(this._console(logMeta),_loggerdriver.loggerDriver.fatal(logMeta))}warn(...args){let logMeta=this._mapLog("warn",...args);logMeta&&(this._console(logMeta),_loggerdriver.loggerDriver.warn(logMeta))}debug(...args){let logMeta=this._mapLog("debug",...args);logMeta&&(this._console(logMeta),_loggerdriver.loggerDriver.debug(logMeta))}info(...args){let logMeta=this._mapLog("log",...args);logMeta&&(this._console(logMeta),_loggerdriver.loggerDriver.log(logMeta))}};
@@ -1,18 +1,15 @@
1
- interface CloudWatchConfig {
2
- region: string;
3
- logGroupName: string;
4
- logStreamName?: string;
5
- credentials?: {
6
- accessKeyId: string;
7
- secretAccessKey: string;
8
- };
9
- }
10
- export declare class Cloudwatch {
1
+ import { LoggerContract, LogMeta } from './logger.contract';
2
+ export declare class Cloudwatch implements LoggerContract {
11
3
  private client;
12
- private config;
13
4
  private sequenceToken;
14
- constructor(config: CloudWatchConfig);
5
+ private DEFAULT_LOG_CONFIG;
6
+ constructor();
15
7
  private _ensureLogStream;
16
- send(message: string): Promise<void>;
8
+ private _send;
9
+ log(message: LogMeta): void;
10
+ error(message: LogMeta): void;
11
+ fatal(message: LogMeta): void;
12
+ warn(message: LogMeta): void;
13
+ debug(message: LogMeta): void;
14
+ verbose(message: LogMeta): void;
17
15
  }
18
- export {};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"Cloudwatch",{enumerable:!0,get:function(){return Cloudwatch}});let _clientcloudwatchlogs=require("@aws-sdk/client-cloudwatch-logs"),_common=require("@nestjs/common");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let Cloudwatch=class Cloudwatch{client;config;sequenceToken;constructor(config){this.config={logStreamName:`app-${new Date().toISOString().split("T")[0]}`,...config},this.client=new _clientcloudwatchlogs.CloudWatchLogsClient({region:this.config.region,credentials:this.config.credentials}),this._ensureLogStream()}async _ensureLogStream(){try{let describeCommand=new _clientcloudwatchlogs.DescribeLogStreamsCommand({logGroupName:this.config.logGroupName,logStreamNamePrefix:this.config.logStreamName}),response=await this.client.send(describeCommand),logStream=response.logStreams?.[0];if(logStream)this.sequenceToken=logStream.uploadSequenceToken;else{let createCommand=new _clientcloudwatchlogs.CreateLogStreamCommand({logGroupName:this.config.logGroupName,logStreamName:this.config.logStreamName});await this.client.send(createCommand)}}catch(error){console.error("Error ensuring log stream:",error)}}async send(message){try{let params={logGroupName:this.config.logGroupName,logStreamName:this.config.logStreamName,logEvents:[{timestamp:Date.now(),message}],sequenceToken:this.sequenceToken},command=new _clientcloudwatchlogs.PutLogEventsCommand(params),response=await this.client.send(command);this.sequenceToken=response.nextSequenceToken}catch(error){console.error("Error sending log to CloudWatch:",error),"InvalidSequenceTokenException"===error.name&&(await this._ensureLogStream(),await this.send(message))}}};Cloudwatch=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Injectable)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",["u"<typeof CloudWatchConfig?Object:CloudWatchConfig])],Cloudwatch);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"Cloudwatch",{enumerable:!0,get:function(){return Cloudwatch}});let _clientcloudwatchlogs=require("@aws-sdk/client-cloudwatch-logs"),_exceptionhelper=require("../../helpers/exception.helper"),_secretmanager=require("../secret-manager");let Cloudwatch=class Cloudwatch{client;sequenceToken;DEFAULT_LOG_CONFIG;constructor(){(0,_secretmanager.getSecret)().then(secret=>{if(!(secret.CLOUDWATCH_REGION&&secret.ALLOWED_ORIGINS&&secret.CLOUDWATCH_ACCESS_KEY_ID&&secret.CLOUDWATCH_SECRET_ACCESS_KEY&&secret.ENABLE_CLOUDWATCH_LOGS))throw new _exceptionhelper.AppUnprocessableEntityException("CloudWatch configuration environment variables are missing.");this.client=new _clientcloudwatchlogs.CloudWatchLogsClient({region:secret.CLOUDWATCH_REGION,credentials:{accessKeyId:secret.CLOUDWATCH_ACCESS_KEY_ID,secretAccessKey:secret.CLOUDWATCH_SECRET_ACCESS_KEY}}),secret.CLOUDWATCH_LOG_GROUP&&secret.CLOUDWATCH_LOG_STREAM&&(this.DEFAULT_LOG_CONFIG={logGroupName:secret.CLOUDWATCH_LOG_GROUP,logStreamName:secret.CLOUDWATCH_LOG_STREAM}),this._ensureLogStream()})}async _ensureLogStream(){if(this.client&&this.DEFAULT_LOG_CONFIG)try{let describeCommand=new _clientcloudwatchlogs.DescribeLogStreamsCommand(this.DEFAULT_LOG_CONFIG),response=await this.client.send(describeCommand),logStream=response.logStreams?.[0];if(logStream)this.sequenceToken=logStream.uploadSequenceToken;else{let createCommand=new _clientcloudwatchlogs.CreateLogStreamCommand(this.DEFAULT_LOG_CONFIG);await this.client.send(createCommand)}}catch(error){console.error("Error ensuring log stream:",error)}}async _send(message){if(this.client&&this.DEFAULT_LOG_CONFIG)try{let command=new _clientcloudwatchlogs.PutLogEventsCommand({...this.DEFAULT_LOG_CONFIG,logEvents:[{timestamp:Date.now(),message:JSON.stringify(message,null,2)}],sequenceToken:this.sequenceToken}),response=await this.client.send(command);this.sequenceToken=response.nextSequenceToken}catch(error){console.error("Error sending log to CloudWatch:",error),"InvalidSequenceTokenException"===error.name&&(await this._ensureLogStream(),await this._send(message))}}log(message){this._send(message)}error(message){this._send(message)}fatal(message){this._send(message)}warn(message){this._send(message)}debug(message){}verbose(message){}};
@@ -1,2 +1 @@
1
1
  export * from './app.logger';
2
- export * from './slack.logger';
@@ -1 +1 @@
1
- "use strict";function _export_star(from,to){return Object.keys(from).forEach(function(k){"default"===k||Object.prototype.hasOwnProperty.call(to,k)||Object.defineProperty(to,k,{enumerable:!0,get:function(){return from[k]}})}),from}Object.defineProperty(exports,"__esModule",{value:!0}),_export_star(require("./app.logger"),exports),_export_star(require("./slack.logger"),exports);
1
+ "use strict";var from,to;Object.defineProperty(exports,"__esModule",{value:!0}),from=require("./app.logger"),to=exports,Object.keys(from).forEach(function(k){"default"===k||Object.prototype.hasOwnProperty.call(to,k)||Object.defineProperty(to,k,{enumerable:!0,get:function(){return from[k]}})});
@@ -0,0 +1,24 @@
1
+ import { LogLevel } from '@nestjs/common';
2
+ export type LogMessageType = string | object | Error | undefined | null | number | boolean;
3
+ export interface LogMeta {
4
+ level: LogLevel;
5
+ env: string;
6
+ context: string;
7
+ timestamp: string;
8
+ host: string;
9
+ message: ['error' | 'object' | 'string', string][];
10
+ }
11
+ export interface LoggerContract {
12
+ log(message: LogMeta): void;
13
+ error(message: LogMeta): void;
14
+ fatal(message: LogMeta): void;
15
+ warn(message: LogMeta): void;
16
+ debug(message: LogMeta): void;
17
+ verbose(message: LogMeta): void;
18
+ }
19
+ export declare const logWarnBg: (log: string) => string;
20
+ export declare const logErrorBg: (log: string) => string;
21
+ export declare const logInfoBg: (log: string) => string;
22
+ export declare const logDebugBg: (log: string) => string;
23
+ export declare const logWarn: (log: string) => string;
24
+ export declare const logError: (log: string) => string;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var target=exports,all={get logDebugBg(){return logDebugBg},get logError(){return logError},get logErrorBg(){return logErrorBg},get logInfoBg(){return logInfoBg},get logWarn(){return logWarn},get logWarnBg(){return logWarnBg}};for(var name in all)Object.defineProperty(target,name,{enumerable:!0,get:Object.getOwnPropertyDescriptor(all,name).get});let _util=require("util"),bgLog=(option,log)=>(0,_util.styleText)("reset",(0,_util.styleText)("bold",(0,_util.styleText)(option,(0,_util.styleText)("black",` ${log} `)))),logWarnBg=log=>bgLog("bgYellow",log),logErrorBg=log=>bgLog("bgRed",log),logInfoBg=log=>bgLog("bgGreen",log),logDebugBg=log=>bgLog("bgMagenta",log),logWarn=log=>(0,_util.styleText)("yellow",log),logError=log=>(0,_util.styleText)("red",log);
@@ -0,0 +1,15 @@
1
+ import { LoggerContract, LogMeta } from './logger.contract';
2
+ declare class LoggerDriver implements LoggerContract {
3
+ host: string;
4
+ private slackError;
5
+ private cloudwatch;
6
+ constructor();
7
+ error(message: LogMeta): void;
8
+ fatal(message: LogMeta): void;
9
+ log(message: LogMeta): void;
10
+ warn(message: LogMeta): void;
11
+ debug(message: LogMeta): void;
12
+ verbose(message: LogMeta): void;
13
+ }
14
+ export declare const loggerDriver: LoggerDriver;
15
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";var obj;Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"loggerDriver",{enumerable:!0,get:function(){return loggerDriver}});let _os=(obj=require("os"))&&obj.__esModule?obj:{default:obj},_secretmanager=require("../secret-manager");let LoggerDriver=class LoggerDriver{host=_os.default.hostname();slackError;cloudwatch;constructor(){(0,_secretmanager.getSecret)().then(secret=>{if(secret.SLACK_ERROR_WEBHOOK_URL){let{SlackLogger}=require("./slack.logger");this.slackError=new SlackLogger(secret.SLACK_ERROR_WEBHOOK_URL)}if(secret.ENABLE_CLOUDWATCH_LOGS){let{Cloudwatch}=require("./cloudwatch");this.cloudwatch=new Cloudwatch}})}error(message){this?.slackError&&this.slackError?.error(message),this?.cloudwatch&&this.cloudwatch?.log(message)}fatal(message){this?.slackError&&this.slackError?.fatal(message),this?.cloudwatch&&this.cloudwatch?.log(message)}log(message){this?.cloudwatch&&this.cloudwatch?.log(message)}warn(message){this?.cloudwatch&&this.cloudwatch?.log(message)}debug(message){this?.cloudwatch&&this.cloudwatch?.log(message)}verbose(message){this?.cloudwatch&&this.cloudwatch?.log(message)}};let loggerDriver=new LoggerDriver;
@@ -1,4 +1,11 @@
1
1
  import { Slack } from '../notifications/slack';
2
- export declare class SlackLogger extends Slack {
2
+ import { LoggerContract, LogMeta } from './logger.contract';
3
+ export declare class SlackLogger extends Slack implements LoggerContract {
3
4
  constructor(webhookUrl: string);
5
+ error(message: LogMeta): void;
6
+ fatal(message: LogMeta): void;
7
+ log(message: LogMeta): void;
8
+ warn(message: LogMeta): void;
9
+ debug(message: LogMeta): void;
10
+ verbose(message: LogMeta): void;
4
11
  }
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"SlackLogger",{enumerable:!0,get:function(){return SlackLogger}});let _common=require("@nestjs/common"),_slack=require("../notifications/slack");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let SlackLogger=class SlackLogger extends _slack.Slack{constructor(webhookUrl){super({webhookUrl})}};SlackLogger=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Injectable)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[String])],SlackLogger);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"SlackLogger",{enumerable:!0,get:function(){return SlackLogger}});let _common=require("@nestjs/common"),_slack=require("../notifications/slack");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let SlackLogger=class SlackLogger extends _slack.Slack{constructor(webhookUrl){super({webhookUrl})}error(message){this.send(`:x: ${message}`)}fatal(message){this.send(`:skull: ${message}`)}log(message){}warn(message){}debug(message){}verbose(message){}};SlackLogger=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Injectable)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[String])],SlackLogger);
@@ -1,4 +1,4 @@
1
- import { Job } from 'bull';
1
+ import { type Job } from 'bull';
2
2
  import { AppQueue } from '../queues/app.queue';
3
3
  import { SendEmailDto } from './mail.config';
4
4
  import { Mailer } from './mailer';
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"MailQueue",{enumerable:!0,get:function(){return MailQueue}});let _bull=require("@nestjs/bull"),_bull1=require("bull"),_appqueue=require("../queues/app.queue"),_mailconfig=require("./mail.config"),_mailer=require("./mailer");function _ts_decorate(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let MailQueue=class MailQueue extends _appqueue.AppQueue{mailer;constructor(mailer){super(),this.mailer=mailer}async addLog({data}){await this.mailer.send(data,!1)}};_ts_decorate([(0,_bull.Process)({name:_mailconfig.mailerQueue,concurrency:4}),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_bull1.Job?Object:_bull1.Job]),_ts_metadata("design:returntype",Promise)],MailQueue.prototype,"addLog",null),MailQueue=_ts_decorate([(0,_bull.Processor)(_mailconfig.mailerQueue),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_mailer.Mailer?Object:_mailer.Mailer])],MailQueue);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"MailQueue",{enumerable:!0,get:function(){return MailQueue}});let _bull=require("@nestjs/bull"),_appqueue=require("../queues/app.queue"),_mailconfig=require("./mail.config"),_mailer=require("./mailer");function _ts_decorate(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let MailQueue=class MailQueue extends _appqueue.AppQueue{mailer;constructor(mailer){super(),this.mailer=mailer}async addLog({data}){await this.mailer.send(data,!1)}};_ts_decorate([(0,_bull.Process)({name:_mailconfig.mailerQueue,concurrency:4}),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",["u"<typeof Job?Object:Job]),_ts_metadata("design:returntype",Promise)],MailQueue.prototype,"addLog",null),MailQueue=_ts_decorate([(0,_bull.Processor)(_mailconfig.mailerQueue),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_mailer.Mailer?Object:_mailer.Mailer])],MailQueue);
@@ -1,4 +1,4 @@
1
- import { Queue } from 'bull';
1
+ import { type Queue } from 'bull';
2
2
  import { MailTemplate } from './mail-template';
3
3
  import { MailerQueueDto, SendEmailDto } from './mail.config';
4
4
  export declare class Mailer {
@@ -1 +1 @@
1
- "use strict";var decorator;Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"Mailer",{enumerable:!0,get:function(){return Mailer}});let _bull=require("@nestjs/bull"),_common=require("@nestjs/common"),_helpers=require("@triproject/helpers"),_bull1=require("bull"),_nodemailer=require("nodemailer"),_config=require("../../config"),_mailtemplate=require("./mail-template"),_mailconfig=require("./mail.config");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let Mailer=class Mailer{mailTemplate;mailerQueue;EMAIL_FROM;mailer;constructor(mailTemplate,mailerQueue){this.mailTemplate=mailTemplate,this.mailerQueue=mailerQueue,this.EMAIL_FROM=_config.MAIL_FROM_EMAIL,this.mailer=(0,_nodemailer.createTransport)({host:_config.MAIL_HOST,port:_config.MAIL_PORT,auth:{user:_config.MAIL_USERNAME,pass:_config.MAIL_PASSWORD}})}async _queue(params){let data={from:this.EMAIL_FROM,to:`${params.name} <${params.email}>`,cc:params.cc,bcc:params.bcc,subject:params.subject,html:this.mailTemplate.html(params.mail.toString())};await this.mailerQueue.add(_mailconfig.mailerQueue,data,{jobId:(0,_helpers.generateId)()})}async send(params,shouldQueue=!0){return shouldQueue?await this._queue(params):await this.mailer.sendMail(params)}};Mailer=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Injectable)(),(decorator=(0,_bull.InjectQueue)(_mailconfig.mailerQueue),function(target,key){decorator(target,key,1)}),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_mailtemplate.MailTemplate?Object:_mailtemplate.MailTemplate,void 0===_bull1.Queue?Object:_bull1.Queue])],Mailer);
1
+ "use strict";var decorator;Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"Mailer",{enumerable:!0,get:function(){return Mailer}});let _bull=require("@nestjs/bull"),_common=require("@nestjs/common"),_helpers=require("@triproject/helpers"),_nodemailer=require("nodemailer"),_secretmanager=require("../secret-manager"),_mailtemplate=require("./mail-template"),_mailconfig=require("./mail.config");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let Mailer=class Mailer{mailTemplate;mailerQueue;EMAIL_FROM;mailer;constructor(mailTemplate,mailerQueue){this.mailTemplate=mailTemplate,this.mailerQueue=mailerQueue,(0,_secretmanager.getSecret)().then(secret=>{this.EMAIL_FROM=secret.MAIL_FROM_EMAIL,this.mailer=(0,_nodemailer.createTransport)({host:secret.MAIL_HOST,port:secret.MAIL_PORT,auth:{user:secret.MAIL_USERNAME,pass:secret.MAIL_PASSWORD}})})}async _queue(params){let data={from:this.EMAIL_FROM,to:`${params.name} <${params.email}>`,cc:params.cc,bcc:params.bcc,subject:params.subject,html:this.mailTemplate.html(params.mail.toString())};await this.mailerQueue.add(_mailconfig.mailerQueue,data,{jobId:(0,_helpers.generateId)()})}async send(params,shouldQueue=!0){return shouldQueue?await this._queue(params):await this.mailer.sendMail(params)}};Mailer=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Injectable)(),(decorator=(0,_bull.InjectQueue)(_mailconfig.mailerQueue),function(target,key){decorator(target,key,1)}),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_mailtemplate.MailTemplate?Object:_mailtemplate.MailTemplate,"u"<typeof Queue?Object:Queue])],Mailer);
@@ -0,0 +1,3 @@
1
+ export * from './message-broker.contract';
2
+ export * from './message-broker.module';
3
+ export * from './message.broker';
@@ -0,0 +1 @@
1
+ "use strict";function _export_star(from,to){return Object.keys(from).forEach(function(k){"default"===k||Object.prototype.hasOwnProperty.call(to,k)||Object.defineProperty(to,k,{enumerable:!0,get:function(){return from[k]}})}),from}Object.defineProperty(exports,"__esModule",{value:!0}),_export_star(require("./message-broker.contract"),exports),_export_star(require("./message-broker.module"),exports),_export_star(require("./message.broker"),exports);
@@ -0,0 +1,15 @@
1
+ import { MessageBrokerContract, type MessageBrokerListenerOptions } from './message-broker.contract';
2
+ export declare class Kafka implements MessageBrokerContract {
3
+ private logger;
4
+ private client;
5
+ private producers;
6
+ private consumers;
7
+ connect(): Promise<void>;
8
+ disconnect(): Promise<void>;
9
+ close(): Promise<void>;
10
+ private _createProducer;
11
+ private _createConsumer;
12
+ publish<T>(topic: string, message: T, routeKeys: string[]): Promise<void>;
13
+ subscribe<T>(topic: string, onMessage: (message: T) => Promise<void>, options?: MessageBrokerListenerOptions): Promise<void>;
14
+ private _rateLimiter;
15
+ }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"Kafka",{enumerable:!0,get:function(){return Kafka}});let _kafkajs=require("kafkajs"),_httphelper=require("../../helpers/http.helper"),_logger=require("../logger"),_secretmanager=require("../secret-manager");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let Kafka=class Kafka{logger=new _logger.AppLogger(Kafka.name);client;producers={};consumers={};async connect(){let conf=await (0,_secretmanager.getSecret)();this.client=new _kafkajs.Kafka({clientId:conf.KAFKA_CLIENT_ID,brokers:conf.KAFKA_BROKERS})}async disconnect(){await Promise.all(Object.values(this.producers).map(async producer=>{await producer.disconnect()})),await Promise.all(Object.values(this.consumers).map(async consumer=>{await consumer.disconnect()}))}async close(){throw Error("Method not implemented.")}async _createProducer(topic){if(this.producers[topic])return this.producers[topic];let producer=this.client.producer();return this.producers[topic]=producer,producer.on("producer.disconnect",err=>{this.logger.warn(`Kafka producer for topic ${topic} disconnected:`,err)}),producer.on("producer.connect",err=>{this.logger.log(`Kafka producer for topic ${topic} connected`)}),await producer.connect(),producer}async _createConsumer(topic){if(this.consumers[topic])return this.consumers[topic];let consumer=this.client.consumer({groupId:topic,heartbeatInterval:3e3});return this.consumers[topic]=consumer,consumer.on("consumer.disconnect",err=>{this.logger.warn(`Kafka consumer for topic ${topic} disconnected:`,err)}),consumer.on("consumer.connect",err=>{this.logger.log(`Kafka consumer for topic ${topic} connected`)}),await consumer.connect(),await consumer.subscribe({topic,fromBeginning:!1}),consumer}async publish(topic,message,routeKeys){let producer=await this._createProducer(topic);await producer.send({topic,messages:[{value:JSON.stringify(message)}]})}async subscribe(topic,onMessage,options){let{concurrency=1,queuesPerSecond=30}=options||{},consumer=await this._createConsumer(topic);await consumer.run({partitionsConsumedConcurrently:concurrency,eachMessage:async({message})=>{if(message?.value){let parsedMessage=JSON.parse(message.value.toString());await this._rateLimiter(()=>onMessage(parsedMessage),Math.ceil(queuesPerSecond/concurrency))}}})}async _rateLimiter(callback,queuesPerSecond){let startTime=new Date().getTime();await callback();let elapsedTime=new Date().getTime()-startTime,rateLimiterPerSecond=1e3/queuesPerSecond;elapsedTime<rateLimiterPerSecond&&await new Promise(resolve=>setTimeout(resolve,rateLimiterPerSecond-elapsedTime))}};!function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);c>3&&r&&Object.defineProperty(target,key,r)}([(0,_httphelper.CatchError)("Kafka subscribe error"),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[String,Function,"u"<typeof MessageBrokerListenerOptions?Object:MessageBrokerListenerOptions]),_ts_metadata("design:returntype",Promise)],Kafka.prototype,"subscribe",null);
@@ -0,0 +1,18 @@
1
+ export type MessageBrokerDriver = 'kafka' | 'rabbitmq' | 'nats' | 'sqs';
2
+ export interface MessageBrokerPayload<T> {
3
+ messageId: string;
4
+ timestamp: number;
5
+ data: T;
6
+ }
7
+ export type CallbackMessageBrokerPayload<T> = (payload: MessageBrokerPayload<T>, msg: string) => Promise<void> | void;
8
+ export type CallbackMessageBrokerType<T> = (payload: T) => Promise<void> | void;
9
+ export interface MessageBrokerListenerOptions {
10
+ concurrency?: number;
11
+ queuesPerSecond?: number;
12
+ }
13
+ export declare class MessageBrokerContract {
14
+ subscribe<T>(topic: string, onMessage: (message: MessageBrokerPayload<T>) => Promise<void>, options?: MessageBrokerListenerOptions): Promise<void>;
15
+ publish<T>(topic: string, message: T, routingKeys?: string[]): Promise<void>;
16
+ connect(): Promise<void>;
17
+ close(): Promise<void>;
18
+ }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"MessageBrokerContract",{enumerable:!0,get:function(){return MessageBrokerContract}});let _exceptionhelper=require("../../helpers/exception.helper");let MessageBrokerContract=class MessageBrokerContract{subscribe(topic,onMessage,options){throw new _exceptionhelper.AppUnprocessableEntityException("Method not implemented.")}publish(topic,message,routingKeys=[]){throw new _exceptionhelper.AppUnprocessableEntityException("Method not implemented.")}connect(){throw new _exceptionhelper.AppUnprocessableEntityException("Method not implemented.")}close(){throw new _exceptionhelper.AppUnprocessableEntityException("Method not implemented.")}};
@@ -0,0 +1,2 @@
1
+ export declare class MessageBrokerModule {
2
+ }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"MessageBrokerModule",{enumerable:!0,get:function(){return MessageBrokerModule}});let _common=require("@nestjs/common"),_messagebroker=require("./message.broker");let MessageBrokerModule=class MessageBrokerModule{};MessageBrokerModule=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Global)(),(0,_common.Module)({providers:[_messagebroker.MessageBroker],exports:[_messagebroker.MessageBroker]})],MessageBrokerModule);
@@ -0,0 +1,13 @@
1
+ import { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
2
+ import { MessageBrokerContract, MessageBrokerListenerOptions, MessageBrokerPayload } from './message-broker.contract';
3
+ export declare class MessageBroker implements MessageBrokerContract, OnModuleInit, OnModuleDestroy {
4
+ private logger;
5
+ private driver;
6
+ constructor();
7
+ onModuleInit(): void;
8
+ onModuleDestroy(): void;
9
+ connect(): Promise<void>;
10
+ close(): Promise<void>;
11
+ subscribe<T>(topic: string, onMessage: (message: MessageBrokerPayload<T>) => Promise<void>, options?: MessageBrokerListenerOptions): Promise<void>;
12
+ publish<T>(topic: string, message: T, routeKeys?: never[]): Promise<void>;
13
+ }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"MessageBroker",{enumerable:!0,get:function(){return MessageBroker}});let _common=require("@nestjs/common"),_exceptionhelper=require("../../helpers/exception.helper"),_logger=require("../logger"),_secretmanager=require("../secret-manager");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let MessageBroker=class MessageBroker{logger=new _logger.AppLogger(MessageBroker.name);driver;constructor(){(0,_secretmanager.getSecret)().then(secret=>{if(!secret.MESSAGE_BROKER_DRIVER)throw new _exceptionhelper.AppUnprocessableEntityException("Message broker driver is not set.");switch(secret.MESSAGE_BROKER_DRIVER){case"rabbitmq":let{RabbitMQ}=require("./rabbitmq");this.driver=new RabbitMQ;break;case"kafka":let{Kafka}=require("./kafka");this.driver=new Kafka}})}onModuleInit(){this.connect()}onModuleDestroy(){this.close()}async connect(){this.driver?await this.driver.connect():this.logger.error("Message broker driver is not set. Skipping connection establishment.")}async close(){this.driver?await this.driver.close():this.logger.error("Message broker driver is not set. Skipping connection closure.")}async subscribe(topic,onMessage,options){if(!this.driver)throw new _exceptionhelper.AppUnprocessableEntityException("Message broker driver is not set.");let{concurrency=1,queuesPerSecond=30}=options||{};await this.driver.subscribe(topic,async message=>(this.logger.log(`Message received from topic ${topic}`,message),await onMessage(message)),{concurrency,queuesPerSecond})}async publish(topic,message,routeKeys=[]){if(!this.driver)throw new _exceptionhelper.AppUnprocessableEntityException("Message broker driver is not set.");await this.driver.publish(topic,message,routeKeys).then(()=>{this.logger.log(`Message published to topic ${topic}`,message)})}};MessageBroker=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Injectable)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[])],MessageBroker);
@@ -0,0 +1,15 @@
1
+ import { AmqpConnectionManager } from 'amqp-connection-manager';
2
+ import { MessageBrokerContract, type MessageBrokerListenerOptions, MessageBrokerPayload } from './message-broker.contract';
3
+ export declare class RabbitMQ implements MessageBrokerContract {
4
+ private logger;
5
+ connection: AmqpConnectionManager;
6
+ private channels;
7
+ private exchanges;
8
+ connect(): Promise<void>;
9
+ private _parseConsumeData;
10
+ close(): Promise<void>;
11
+ private _createChannel;
12
+ publish<T>(channelName: string, message: T, routingKeys?: string[]): Promise<void>;
13
+ subscribe<T>(channelName: string, onMessage: (message: MessageBrokerPayload<T>) => Promise<void>, options?: MessageBrokerListenerOptions): Promise<void>;
14
+ private _rateLimiter;
15
+ }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"RabbitMQ",{enumerable:!0,get:function(){return RabbitMQ}});let _helpers=require("@triproject/helpers"),_amqpconnectionmanager=require("amqp-connection-manager"),_exceptionhelper=require("../../helpers/exception.helper"),_httphelper=require("../../helpers/http.helper"),_logger=require("../logger"),_secretmanager=require("../secret-manager");function _ts_decorate(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let RabbitMQ=class RabbitMQ{logger=new _logger.AppLogger(RabbitMQ.name);connection;channels={};exchanges={};async connect(){let conf=await (0,_secretmanager.getSecret)();this.connection=(0,_amqpconnectionmanager.connect)(conf.RABBITMQ_HOST,{heartbeatIntervalInSeconds:15,reconnectTimeInSeconds:5,connectionOptions:{keepAlive:!0}}),this.connection.on("error",err=>{this.logger.error("RabbitMQ connection error:",err)})}_parseConsumeData(msg){try{return JSON.parse(msg?.content?.toString())}catch(error){throw new _exceptionhelper.AppInternalServerErrorException("Invalid message format")}}async close(){await this.connection?.close()}async _createChannel(channelName,routeKeys=[]){this.connection||(await this.connect(),await new Promise(resolve=>setTimeout(resolve,1e3)));let isExchange=routeKeys.length>0;if(isExchange){if(this.exchanges[channelName])return this.exchanges[channelName]}else if(this.channels[channelName])return this.channels[channelName];let channel=this.connection?.createChannel({json:!0,setup:async channel=>isExchange?channel.assertExchange(channelName,"fanout",{durable:!0}).then(()=>{routeKeys.forEach(route=>{channel.assertQueue(route,{durable:!0}),channel.bindQueue(route,channelName,route)})}):channel.assertQueue(channelName,{durable:!0})});return channel.on("error",err=>{this.logger.error(`RabbitMQ ${isExchange?"exchange":"channel"} ${channelName}`,err)}),isExchange?this.exchanges[channelName]=channel:this.channels[channelName]=channel,await new Promise(resolve=>setTimeout(resolve,500)),channel}async publish(channelName,message,routingKeys=[]){let channel=await this._createChannel(channelName,routingKeys);if(!channel)throw this.logger.error(`RabbitMQ channel ${channelName} is not available`),new _exceptionhelper.AppInternalServerErrorException(`RabbitMQ channel ${channelName} is not available`);let data={messageId:(0,_helpers.generateId)(),timestamp:Date.now(),data:message};return routingKeys&&routingKeys?.length!==0||await channel.sendToQueue(channelName,data),await channel.publish(channelName,routingKeys.join(","),data).then()}async subscribe(channelName,onMessage,options){let{concurrency=1,queuesPerSecond=50}=options||{},channel=await this._createChannel(channelName);if(!channel)throw this.logger.error(`RabbitMQ channel ${channelName} is not available`),new _exceptionhelper.AppInternalServerErrorException(`RabbitMQ channel ${channelName} is not available`);await channel.addSetup(channel=>(channel.prefetch(concurrency,!1),channel.consume(channelName,async msg=>{msg&&await this._rateLimiter(()=>onMessage(this._parseConsumeData(msg)),Math.ceil(queuesPerSecond/concurrency))},{noAck:!1})))}async _rateLimiter(callback,queuesPerSecond){let startTime=new Date().getTime();await callback();let elapsedTime=new Date().getTime()-startTime,rateLimiterPerSecond=1e3/queuesPerSecond;elapsedTime<rateLimiterPerSecond&&await new Promise(resolve=>setTimeout(resolve,rateLimiterPerSecond-elapsedTime))}};_ts_decorate([(0,_httphelper.CatchError)("Failed to publish message to RabbitMQ"),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[String,"u"<typeof T?Object:T,Array]),_ts_metadata("design:returntype",Promise)],RabbitMQ.prototype,"publish",null),_ts_decorate([(0,_httphelper.CatchError)("RabbitMQ subscribe error"),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[String,Function,"u"<typeof MessageBrokerListenerOptions?Object:MessageBrokerListenerOptions]),_ts_metadata("design:returntype",Promise)],RabbitMQ.prototype,"subscribe",null);
@@ -1,4 +1,4 @@
1
- import { Job } from 'bull';
1
+ import { type Job } from 'bull';
2
2
  import { AppQueue } from '../queues/app.queue';
3
3
  import { SendNotificationDto } from './notification.config';
4
4
  import { PushNotification } from './push-notification';
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"NotificationQueue",{enumerable:!0,get:function(){return NotificationQueue}});let _bull=require("@nestjs/bull"),_bull1=require("bull"),_appqueue=require("../queues/app.queue"),_notificationconfig=require("./notification.config"),_pushnotification=require("./push-notification");function _ts_decorate(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let NotificationQueue=class NotificationQueue extends _appqueue.AppQueue{pushNotification;constructor(pushNotification){super(),this.pushNotification=pushNotification}async sendNotification({data}){await this.pushNotification.send(data,!1)}};_ts_decorate([(0,_bull.Process)({name:_notificationconfig.notificationQueue,concurrency:4}),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_bull1.Job?Object:_bull1.Job]),_ts_metadata("design:returntype",Promise)],NotificationQueue.prototype,"sendNotification",null),NotificationQueue=_ts_decorate([(0,_bull.Processor)(_notificationconfig.notificationQueue),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_pushnotification.PushNotification?Object:_pushnotification.PushNotification])],NotificationQueue);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"NotificationQueue",{enumerable:!0,get:function(){return NotificationQueue}});let _bull=require("@nestjs/bull"),_appqueue=require("../queues/app.queue"),_notificationconfig=require("./notification.config"),_pushnotification=require("./push-notification");function _ts_decorate(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let NotificationQueue=class NotificationQueue extends _appqueue.AppQueue{pushNotification;constructor(pushNotification){super(),this.pushNotification=pushNotification}async sendNotification({data}){await this.pushNotification.send(data,!1)}};_ts_decorate([(0,_bull.Process)({name:_notificationconfig.notificationQueue,concurrency:4}),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",["u"<typeof Job?Object:Job]),_ts_metadata("design:returntype",Promise)],NotificationQueue.prototype,"sendNotification",null),NotificationQueue=_ts_decorate([(0,_bull.Processor)(_notificationconfig.notificationQueue),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_pushnotification.PushNotification?Object:_pushnotification.PushNotification])],NotificationQueue);
@@ -1,3 +1,4 @@
1
+ import axios from 'axios';
1
2
  import { Queue } from 'bullmq';
2
3
  import { SendNotificationDto } from './notification.config';
3
4
  export declare class PushNotification {
@@ -5,6 +6,6 @@ export declare class PushNotification {
5
6
  private APP_ID;
6
7
  private client;
7
8
  constructor(notificationQueue: Queue);
8
- send(params: SendNotificationDto, shouldQueue?: boolean): Promise<import("axios").AxiosResponse<any, any, {}> | import("bullmq").Job<any, any, string>>;
9
- broadcast(params: Omit<SendNotificationDto, 'userId' | 'type'>, shouldQueue?: boolean): Promise<import("axios").AxiosResponse<any, any, {}> | import("bullmq").Job<any, any, string>>;
9
+ send(params: SendNotificationDto, shouldQueue?: boolean): Promise<axios.AxiosResponse<any, any, {}> | import("bullmq").Job<any, any, string>>;
10
+ broadcast(params: Omit<SendNotificationDto, 'userId' | 'type'>, shouldQueue?: boolean): Promise<axios.AxiosResponse<any, any, {}> | import("bullmq").Job<any, any, string>>;
10
11
  }
@@ -1 +1 @@
1
- "use strict";var decorator,obj;Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"PushNotification",{enumerable:!0,get:function(){return PushNotification}});let _bull=require("@nestjs/bull"),_common=require("@nestjs/common"),_helpers=require("@triproject/helpers"),_axios=(obj=require("axios"))&&obj.__esModule?obj:{default:obj},_bullmq=require("bullmq"),_config=require("../../config"),_notificationconfig=require("./notification.config");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let PushNotification=class PushNotification{notificationQueue;APP_ID;client;constructor(notificationQueue){this.notificationQueue=notificationQueue,this.APP_ID=_config.ONESIGNAL_APP_ID,this.client=_axios.default.create({baseURL:"https://api.onesignal.com",timeout:100,headers:{"Content-Type":"application/json; charset=utf-8",Authorization:`Key ${_config.ONESIGNAL_REST_API_KEY}`}})}async send(params,shouldQueue=!0){if(shouldQueue)return this.notificationQueue.add(_notificationconfig.notificationQueue,params,{jobId:(0,_helpers.generateId)()});let{userId,type,title,message,data}=params;return await this.client.post("notifications",{app_id:this.APP_ID,target_channel:"push",name:type,headings:{en:title},contents:{en:message},data,included_segments:[userId].filter(d=>d)})}broadcast(params,shouldQueue=!0){let{title,message,data}=params;return this.send({userId:"All",type:"broadcast",title,message,data},shouldQueue)}};PushNotification=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Injectable)(),(decorator=(0,_bull.InjectQueue)(_notificationconfig.notificationQueue),function(target,key){decorator(target,key,0)}),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_bullmq.Queue?Object:_bullmq.Queue])],PushNotification);
1
+ "use strict";var decorator,obj;Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"PushNotification",{enumerable:!0,get:function(){return PushNotification}});let _bull=require("@nestjs/bull"),_common=require("@nestjs/common"),_helpers=require("@triproject/helpers"),_axios=(obj=require("axios"))&&obj.__esModule?obj:{default:obj},_bullmq=require("bullmq"),_exceptionhelper=require("../../helpers/exception.helper"),_secretmanager=require("../secret-manager"),_notificationconfig=require("./notification.config");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let PushNotification=class PushNotification{notificationQueue;APP_ID;client;constructor(notificationQueue){this.notificationQueue=notificationQueue,(0,_secretmanager.getSecret)().then(secret=>{this.APP_ID=secret.ONESIGNAL_APP_ID,this.client=_axios.default.create({baseURL:"https://api.onesignal.com",timeout:100,headers:{"Content-Type":"application/json; charset=utf-8",Authorization:`Key ${secret.ONESIGNAL_REST_API_KEY}`}})})}async send(params,shouldQueue=!0){if(!this.client)throw new _exceptionhelper.AppInternalServerErrorException("PushNotification client not initialized yet");if(shouldQueue)return this.notificationQueue.add(_notificationconfig.notificationQueue,params,{jobId:(0,_helpers.generateId)()});let{userId,type,title,message,data}=params;return await this.client.post("notifications",{app_id:this.APP_ID,target_channel:"push",name:type,headings:{en:title},contents:{en:message},data,included_segments:[userId].filter(d=>d)})}broadcast(params,shouldQueue=!0){if(!this.client)throw new _exceptionhelper.AppInternalServerErrorException("PushNotification client not initialized yet");let{title,message,data}=params;return this.send({userId:"All",type:"broadcast",title,message,data},shouldQueue)}};PushNotification=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Injectable)(),(decorator=(0,_bull.InjectQueue)(_notificationconfig.notificationQueue),function(target,key){decorator(target,key,0)}),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_bullmq.Queue?Object:_bullmq.Queue])],PushNotification);
@@ -1,3 +1,4 @@
1
+ import axios from 'axios';
1
2
  import { AppLogger } from '../logger/app.logger';
2
3
  interface SlackConfig {
3
4
  webhookUrl: string;
@@ -10,6 +11,6 @@ export declare class Slack {
10
11
  constructor(config: SlackConfig);
11
12
  private _toggleBlocked;
12
13
  private _format;
13
- send(...messages: any): Promise<void | import("axios").AxiosResponse<any, any, {}>>;
14
+ send(...messages: any): Promise<void | axios.AxiosResponse<any, any, {}>>;
14
15
  }
15
16
  export {};
@@ -1,4 +1,4 @@
1
- import { Job } from 'bull';
1
+ import { type Job } from 'bull';
2
2
  import { AppLogger } from '../logger/app.logger';
3
3
  export declare class AppQueue {
4
4
  protected logger: AppLogger;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"AppQueue",{enumerable:!0,get:function(){return AppQueue}});let _bull=require("@nestjs/bull"),_bull1=require("bull"),_applogger=require("../logger/app.logger");function _ts_decorate(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let AppQueue=class AppQueue{logger=new _applogger.AppLogger(this.constructor.name);constructor(){this.logger.log(this.constructor.name+" is ready")}onProgress(job){this.logger.log(`Job ${job.id} in ${job.name} is active`,job.data)}onCompleted(job){this.logger.log(`Job ${job.id} in ${job.name} is completed`,job.data)}onStalled(job){this.logger.error(`Job ${job.id} in ${job.name} is stalled`,job.data)}onError(job){this.logger.error(`Job ${job.id} in ${job.name} is error`,job.data)}onFailed(job,error){this.logger.error(`Job ${job.id} in ${job.name} is failed`,job.data,error)}};_ts_decorate([(0,_bull.OnQueueProgress)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_bull1.Job?Object:_bull1.Job]),_ts_metadata("design:returntype",void 0)],AppQueue.prototype,"onProgress",null),_ts_decorate([(0,_bull.OnQueueCompleted)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_bull1.Job?Object:_bull1.Job]),_ts_metadata("design:returntype",void 0)],AppQueue.prototype,"onCompleted",null),_ts_decorate([(0,_bull.OnQueueStalled)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_bull1.Job?Object:_bull1.Job]),_ts_metadata("design:returntype",void 0)],AppQueue.prototype,"onStalled",null),_ts_decorate([(0,_bull.OnQueueError)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_bull1.Job?Object:_bull1.Job]),_ts_metadata("design:returntype",void 0)],AppQueue.prototype,"onError",null),_ts_decorate([(0,_bull.OnQueueFailed)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_bull1.Job?Object:_bull1.Job,Object]),_ts_metadata("design:returntype",void 0)],AppQueue.prototype,"onFailed",null);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"AppQueue",{enumerable:!0,get:function(){return AppQueue}});let _bull=require("@nestjs/bull"),_applogger=require("../logger/app.logger");function _ts_decorate(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let AppQueue=class AppQueue{logger=new _applogger.AppLogger(this.constructor.name);constructor(){this.logger.log(this.constructor.name+" is ready")}onProgress(job){this.logger.log(`Job ${job.id} in ${job.name} is active`,job.data)}onCompleted(job){this.logger.log(`Job ${job.id} in ${job.name} is completed`,job.data)}onStalled(job){this.logger.error(`Job ${job.id} in ${job.name} is stalled`,job.data)}onError(job){this.logger.error(`Job ${job.id} in ${job.name} is error`,job.data)}onFailed(job,error){this.logger.error(`Job ${job.id} in ${job.name} is failed`,job.data,error)}};_ts_decorate([(0,_bull.OnQueueProgress)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",["u"<typeof Job?Object:Job]),_ts_metadata("design:returntype",void 0)],AppQueue.prototype,"onProgress",null),_ts_decorate([(0,_bull.OnQueueCompleted)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",["u"<typeof Job?Object:Job]),_ts_metadata("design:returntype",void 0)],AppQueue.prototype,"onCompleted",null),_ts_decorate([(0,_bull.OnQueueStalled)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",["u"<typeof Job?Object:Job]),_ts_metadata("design:returntype",void 0)],AppQueue.prototype,"onStalled",null),_ts_decorate([(0,_bull.OnQueueError)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",["u"<typeof Job?Object:Job]),_ts_metadata("design:returntype",void 0)],AppQueue.prototype,"onError",null),_ts_decorate([(0,_bull.OnQueueFailed)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",["u"<typeof Job?Object:Job,Object]),_ts_metadata("design:returntype",void 0)],AppQueue.prototype,"onFailed",null);
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"QueueModule",{enumerable:!0,get:function(){return QueueModule}});let _bullmq=require("@nestjs/bullmq"),_common=require("@nestjs/common"),_config=require("../../config");let QueueModule=class QueueModule{};QueueModule=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Global)(),(0,_common.Module)({imports:[_bullmq.BullModule.forRootAsync({useFactory:async()=>({prefix:_config.APP_KEY+":JOBS:",defaultJobOptions:{delay:0,removeOnComplete:!0,removeOnFail:!1,backoff:{type:"exponential",delay:10},attempts:2},connection:{host:_config.REDIS_HOST,port:_config.REDIS_PORT,db:_config.REDIS_DB,password:_config.REDIS_PASSWORD,tls:_config.REDIS_TLS?{ca:""}:void 0}})})]})],QueueModule);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"QueueModule",{enumerable:!0,get:function(){return QueueModule}});let _bullmq=require("@nestjs/bullmq"),_common=require("@nestjs/common"),_secretmanager=require("../secret-manager");let QueueModule=class QueueModule{};QueueModule=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Global)(),(0,_common.Module)({imports:[_bullmq.BullModule.forRootAsync({useFactory:async()=>{let secret=await (0,_secretmanager.getSecret)();return{prefix:secret.APP_KEY+":JOBS:",defaultJobOptions:{delay:0,removeOnComplete:!0,removeOnFail:!1,backoff:{type:"exponential",delay:10},attempts:2},connection:{host:secret.REDIS_HOST,port:secret.REDIS_PORT,db:secret.REDIS_DB,password:secret.REDIS_PASSWORD,tls:secret.REDIS_TLS?{ca:""}:void 0}}}})]})],QueueModule);
@@ -0,0 +1,7 @@
1
+ export declare class AWSSecretManager {
2
+ private logger;
3
+ private secretManagerClient;
4
+ private secretData;
5
+ constructor();
6
+ get(): Promise<Record<string, any>>;
7
+ }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"AWSSecretManager",{enumerable:!0,get:function(){return AWSSecretManager}});let _clientsecretsmanager=require("@aws-sdk/client-secrets-manager"),_common=require("@nestjs/common"),_logger=require("@triproject/nestjs-core/logger"),_config=require("../../config");let AWSSecretManager=class AWSSecretManager{logger=new _logger.AppLogger(AWSSecretManager.name);secretManagerClient;secretData;constructor(){_config.AWS_SECRETS_MANAGER_ENABLED&&_config.AWS_SECRETS_MANAGER_REGION&&_config.AWS_SECRETS_MANAGER_VERSION_STAGE&&(this.secretManagerClient=new _clientsecretsmanager.SecretsManagerClient({region:_config.AWS_SECRETS_MANAGER_REGION,credentials:{accessKeyId:_config.AWS_SECRETS_MANAGER_ACCESS_KEY_ID,secretAccessKey:_config.AWS_SECRETS_MANAGER_SECRET_ACCESS_KEY}}))}async get(){if(!this.secretManagerClient)return{};try{if(this.secretData)return this.secretData;let responseData=await this.secretManagerClient.send(new _clientsecretsmanager.GetSecretValueCommand({SecretId:_config.AWS_SECRETS_MANAGER_SECRET_NAME,VersionStage:_config.AWS_SECRETS_MANAGER_VERSION_STAGE}));return this.secretData=JSON.parse(responseData.SecretString),this.secretData}catch(error){throw this.logger.error("Failed get secret data",{SecretId:_config.AWS_SECRETS_MANAGER_SECRET_NAME,VersionStage:_config.AWS_SECRETS_MANAGER_VERSION_STAGE},error),new _common.InternalServerErrorException("Failed get secret data from AWS Secret Manager")}}};
@@ -0,0 +1,2 @@
1
+ import * as conf from '../../config';
2
+ export declare const getSecret: <T extends typeof conf>(env?: T) => Promise<T & typeof conf>;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"getSecret",{enumerable:!0,get:function(){return getSecret}});let _config=/*#__PURE__*/function(obj,nodeInterop){if(obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(void 0);if(cache&&cache.has(obj))return cache.get(obj);var newObj={__proto__:null},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}return newObj.default=obj,cache&&cache.set(obj,newObj),newObj}(require("../../config"));function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}let getSecret=async env=>{env={..._config,...env??{}};try{if(!_config.AWS_SECRETS_MANAGER_ENABLED){let awsSecretManager=require("./aws-secret-manager");env={...env,...await new awsSecretManager.AWSSecretManager().get()}}return env}catch(error){return env}};
@@ -0,0 +1,23 @@
1
+ import { StorageService } from './storage.service';
2
+ interface CSVCreateParams {
3
+ path: string;
4
+ header: string[];
5
+ body: string[][];
6
+ delimiter?: string;
7
+ }
8
+ export declare class CsvStorage {
9
+ protected storageService: StorageService;
10
+ private readonly EXPIRES_IN;
11
+ constructor(storageService: StorageService);
12
+ private create;
13
+ upload(params: CSVCreateParams): Promise<import("./storage.contract").GetFileUrl>;
14
+ read(buffer: Buffer, delimiter?: string): Promise<string[][]>;
15
+ readWithHeaders<T extends {
16
+ new (): any;
17
+ csvHeader: () => string[];
18
+ }>(buffer: Buffer, dtoClass: T, delimiter?: string): Promise<any[]>;
19
+ private _parseCsvBuffer;
20
+ private _validateCsvHeaders;
21
+ private _mapRowsToObjects;
22
+ }
23
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"CsvStorage",{enumerable:!0,get:function(){return CsvStorage}});let _common=require("@nestjs/common"),_exceptionhelper=require("../../helpers/exception.helper"),_storageservice=require("./storage.service");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let CsvStorage=class CsvStorage{storageService;EXPIRES_IN=1800;constructor(storageService){this.storageService=storageService}async create({header,body,delimiter=","}){let result=[header];for(let b of body)result.push(b);return result.map(d=>d.map(o=>(o??"").includes(delimiter)?`"${o}"`:o).join(delimiter)).join("\n")}async upload(params){let file=await this.create(params);return await this.storageService.upload(params.path+".csv",file,this.EXPIRES_IN),await this.storageService.get(params.path+".csv")}async read(buffer,delimiter=","){let{rows}=this._parseCsvBuffer(buffer,delimiter);return rows.map(row=>row.split(delimiter).map(value=>value.trim()))}async readWithHeaders(buffer,dtoClass,delimiter=","){let{headers,rows}=this._parseCsvBuffer(buffer,delimiter);return this._validateCsvHeaders(headers,dtoClass),this._mapRowsToObjects(headers,rows,delimiter)}_parseCsvBuffer(buffer,delimiter){let[headerRow,...rows]=buffer.toString("utf-8").split("\n").filter(Boolean);return{headers:headerRow.split(delimiter).map(value=>value.trim()),rows}}_validateCsvHeaders(headers,dtoClass){let expectedHeaders=dtoClass.csvHeader(),missingHeaders=expectedHeaders.filter(field=>!headers.includes(field)),unexpectedHeaders=headers.filter(header=>!expectedHeaders.includes(header));if(missingHeaders.length||unexpectedHeaders.length){let parts=[];throw missingHeaders.length&&parts.push(`Missing headers: ${missingHeaders.join(", ")}`),unexpectedHeaders.length&&parts.push(`Unexpected headers: ${unexpectedHeaders.join(", ")}`),new _exceptionhelper.AppBadRequestException(parts.join("; "))}}_mapRowsToObjects(headers,rows,delimiter){return rows.map(row=>row.split(delimiter).reduce((acc,value,index)=>{let key=headers[index];return void 0!==key&&(acc[key]=value.trim()),acc},{}))}};CsvStorage=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Injectable)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_storageservice.StorageService?Object:_storageservice.StorageService])],CsvStorage);
@@ -0,0 +1,16 @@
1
+ import { Workbook } from 'exceljs';
2
+ import { StorageService } from './storage.service';
3
+ interface ExcelCreateParams {
4
+ title: string;
5
+ header: string[];
6
+ body: (string | number)[][];
7
+ }
8
+ export declare class ExcelService {
9
+ protected storageService: StorageService;
10
+ constructor(storageService: StorageService);
11
+ static validate(maxSize?: number): import("@nestjs/common").ParseFilePipe;
12
+ read(file: Buffer): Promise<Workbook>;
13
+ create({ title, header, body }: ExcelCreateParams): Promise<Buffer>;
14
+ upload(path: string, params: ExcelCreateParams): Promise<import("./storage.contract").GetFileUrl>;
15
+ }
16
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"ExcelService",{enumerable:!0,get:function(){return ExcelService}});let _common=require("@nestjs/common"),_exceljs=require("exceljs"),_storageservice=require("./storage.service");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let ExcelService=class ExcelService{storageService;constructor(storageService){this.storageService=storageService}static validate(maxSize=1024e3){return new _common.ParseFilePipeBuilder().addFileTypeValidator({fileType:".(vnd.openxmlformats-officedocument.spreadsheetml.sheet|xlsx)",skipMagicNumbersValidation:!0}).addMaxSizeValidator({maxSize,message:max=>`Max file size is ${Math.ceil(max/1024)} MB`}).build({errorHttpStatusCode:_common.HttpStatus.BAD_REQUEST})}async read(file){try{return await new _exceljs.Workbook().xlsx.load(file.buffer)}catch(err){throw new _common.UnsupportedMediaTypeException("File is not valid .xlsx")}}async create({title,header,body}){let wb=new _exceljs.Workbook,ws=wb.addWorksheet(title);return ws.addRow(header),body.length>0&&ws.addRows(body),await wb.xlsx.writeBuffer()}async upload(path,params){let file=await this.create(params);return await this.storageService.upload(path+".xlsx",file)}};ExcelService=function(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}([(0,_common.Injectable)(),_ts_metadata("design:type",Function),_ts_metadata("design:paramtypes",[void 0===_storageservice.StorageService?Object:_storageservice.StorageService])],ExcelService);
@@ -0,0 +1,3 @@
1
+ export * from './storage.contract';
2
+ export * from './storage.module';
3
+ export * from './storage.service';
@@ -0,0 +1 @@
1
+ "use strict";function _export_star(from,to){return Object.keys(from).forEach(function(k){"default"===k||Object.prototype.hasOwnProperty.call(to,k)||Object.defineProperty(to,k,{enumerable:!0,get:function(){return from[k]}})}),from}Object.defineProperty(exports,"__esModule",{value:!0}),_export_star(require("./storage.contract"),exports),_export_star(require("./storage.module"),exports),_export_star(require("./storage.service"),exports);
@@ -0,0 +1,15 @@
1
+ import { GetFileUrl, StorageContract } from './storage.contract';
2
+ export declare class LocalStorageService implements StorageContract {
3
+ expiresIn: number;
4
+ private BUCKET;
5
+ constructor();
6
+ private _getPath;
7
+ get(path: string): Promise<GetFileUrl>;
8
+ upload(filePath: string, file: Buffer | string): Promise<GetFileUrl>;
9
+ move(oldPath: string, newPath: string): Promise<boolean>;
10
+ delete(path: string): Promise<void>;
11
+ getBase64(filePath: string): Promise<string>;
12
+ private _getMimeType;
13
+ isExists(filePath: string): Promise<boolean>;
14
+ private _assertFileExists;
15
+ }
@@ -0,0 +1 @@
1
+ "use strict";var obj;Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"LocalStorageService",{enumerable:!0,get:function(){return LocalStorageService}});let _helpers=require("@triproject/helpers"),_fs=require("fs"),_path=(obj=require("path"))&&obj.__esModule?obj:{default:obj},_exceptionhelper=require("../../helpers/exception.helper"),_secretmanager=require("../secret-manager");let LocalStorageService=class LocalStorageService{expiresIn=3600;BUCKET;constructor(){(0,_secretmanager.getSecret)().then(conf=>{this.BUCKET=conf.S3_BUCKET})}_getPath(relativePath){return _path.default.join(this.BUCKET,relativePath)}async get(path){return{url:this._getPath(path),fileName:(0,_helpers.getFileName)(path)}}async upload(filePath,file){let fullFilePath=this._getPath(filePath);return(0,_fs.mkdirSync)(_path.default.dirname(fullFilePath),{recursive:!0}),(0,_fs.writeFileSync)(fullFilePath,file),this.get(filePath)}async move(oldPath,newPath){let oldFullPath=this._getPath(oldPath),newFullPath=this._getPath(newPath);try{if(await this.isExists(oldFullPath))return(0,_fs.mkdirSync)(_path.default.dirname(newFullPath),{recursive:!0}),(0,_fs.renameSync)(oldFullPath,newFullPath),!0;return!1}catch(error){throw new _exceptionhelper.AppUnprocessableEntityException(`Failed to rename file from ${oldPath} to ${newPath}: ${error?.message}`)}}delete(path){let fullFilePath=this._getPath(path);this._assertFileExists(fullFilePath);try{return(0,_fs.unlinkSync)(fullFilePath),Promise.resolve()}catch(error){throw new _exceptionhelper.AppUnprocessableEntityException(`Failed to delete file ${path}: ${error?.message}`)}}async getBase64(filePath){let fullFilePath=this._getPath(filePath);this._assertFileExists(fullFilePath);try{let base64=(0,_fs.readFileSync)(fullFilePath).toString("base64"),mimeType=this._getMimeType(filePath);return`data:${mimeType};base64,${base64}`}catch(error){throw new _exceptionhelper.AppUnprocessableEntityException(`Failed to get base64 for ${filePath}: ${error?.message}`)}}_getMimeType(filePath){let fullFilePath=this._getPath(filePath);this._assertFileExists(fullFilePath);try{switch(_path.default.extname(filePath).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";default:return"application/octet-stream"}}catch(error){throw new _exceptionhelper.AppUnprocessableEntityException(`Failed to get MIME type for ${filePath}: ${error?.message}`)}}async isExists(filePath){try{return(0,_fs.accessSync)(this._getPath(filePath)),!0}catch{return!1}}_assertFileExists(filePath){if(!this.isExists(filePath))throw new _exceptionhelper.AppUnprocessableEntityException(`File not found: ${filePath}`)}};
@@ -0,0 +1,14 @@
1
+ import { GetFileUrl, StorageContract } from './storage.contract';
2
+ export declare class MinioStorage implements StorageContract {
3
+ expiresIn?: number | undefined;
4
+ private client;
5
+ private BUCKET;
6
+ constructor();
7
+ get(fileName: string, expiresIn?: number): Promise<GetFileUrl>;
8
+ upload(fileName: string, file: Buffer | string, expiresIn?: number): Promise<GetFileUrl>;
9
+ delete(path: string): Promise<void>;
10
+ isExists(fileName: string): Promise<boolean>;
11
+ move(oldPath: string, newPath: string): Promise<boolean>;
12
+ getBase64(fileName: string): Promise<string>;
13
+ private stream;
14
+ }
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"MinioStorage",{enumerable:!0,get:function(){return MinioStorage}});let _helpers=require("@triproject/helpers"),_minio=require("minio"),_exceptionhelper=require("../../helpers/exception.helper"),_secretmanager=require("../secret-manager");let MinioStorage=class MinioStorage{expiresIn;client;BUCKET;constructor(){(0,_secretmanager.getSecret)().then(secret=>{this.BUCKET=this.BUCKET,this.client=new _minio.Client({endPoint:secret.MINIO_HOST,port:+secret.MINIO_PORT,useSSL:secret.MINIO_USE_SSL,accessKey:secret.S3_ACCESS_KEY_ID,secretKey:secret.S3_SECRET_ACCESS_KEY})})}async get(fileName,expiresIn=86400){if(!fileName)throw new _exceptionhelper.AppUnprocessableEntityException("File name is required to get URL.");let ext=(0,_helpers.getFileExtension)(fileName),isImage=["png","jpg","jpeg","gif","webp","svg","ico","jpeg","bmp"].includes(ext);return{url:await this.client.presignedUrl("GET",this.BUCKET,fileName,expiresIn,(0,_helpers.removeEmptyValues)({"Content-Type":isImage?"image":void 0,"Content-Disposition":isImage?`inline; filename="${fileName}"`:void 0,"response-content-type":isImage?"image/"+ext:void 0})).catch(()=>""),fileName:(0,_helpers.getFileName)(fileName)}}async upload(fileName,file,expiresIn){return await this.client.putObject(this.BUCKET,fileName,file),expiresIn&&await this.client.presignedPutObject(this.BUCKET,fileName,expiresIn),await this.get(fileName,expiresIn)}async delete(path){return await this.client.removeObject(this.BUCKET,path)}async isExists(fileName){return await this.client.getObject(this.BUCKET,fileName).then(()=>!0).catch(()=>!1)}async move(oldPath,newPath){let copyConditions=new _minio.CopyConditions;try{return await this.client.copyObject(this.BUCKET,newPath,`${this.BUCKET}/${oldPath}`,copyConditions),await this.client.removeObject(this.BUCKET,oldPath),!0}catch(error){return!1}}async getBase64(fileName){return this.stream(fileName,buffer=>`${buffer.toString("base64")}`)}async stream(fileName,processFn){try{let stream=await this.client.getObject(this.BUCKET,fileName),chunks=[],mimeType="application/octet-stream";return new Promise((resolve,reject)=>{stream.on("data",chunk=>chunks.push(chunk)),stream.on("end",()=>{let buffer=Buffer.concat(chunks);mimeType=stream.headers?.["content-type"]||mimeType,resolve(processFn(buffer,mimeType))}),stream.on("error",err=>reject(err))})}catch(error){throw Error(`Failed to process file ${fileName}: ${error.message}`)}}};
@@ -0,0 +1,20 @@
1
+ import { StorageContract } from './storage.contract';
2
+ export declare class S3Storage implements StorageContract {
3
+ private client;
4
+ private BUCKET;
5
+ expiresIn: number;
6
+ constructor();
7
+ get(path: string, ttl?: number): Promise<{
8
+ url: string;
9
+ fileName: string;
10
+ }>;
11
+ upload(path: string, file: Buffer | string, expiresIn?: number): Promise<{
12
+ url: string;
13
+ fileName: string;
14
+ }>;
15
+ delete(path: string): Promise<void>;
16
+ isExists(path: string): Promise<boolean>;
17
+ move(oldPath: string, newPath: string): Promise<boolean>;
18
+ private _getObjectStream;
19
+ getBase64(path: string): Promise<string>;
20
+ }