@triproject/nestjs-core 1.0.29 → 1.0.31

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 (68) hide show
  1. package/dist/bootstrap.js +39 -1
  2. package/dist/config.js +257 -1
  3. package/dist/controllers/controller.js +53 -1
  4. package/dist/drivers/cache/cache.js +79 -1
  5. package/dist/drivers/cache/cache.module.js +30 -1
  6. package/dist/drivers/cache/index.js +14 -1
  7. package/dist/drivers/cache/redis.js +76 -1
  8. package/dist/drivers/db/db.helper.d.ts +1 -1
  9. package/dist/drivers/db/db.helper.js +276 -1
  10. package/dist/drivers/db/db.module.js +64 -1
  11. package/dist/drivers/db/db.service.js +52 -1
  12. package/dist/drivers/db/index.js +14 -1
  13. package/dist/drivers/db/migration.js +119 -1
  14. package/dist/drivers/db/repository.js +258 -1
  15. package/dist/drivers/encryptions/encryption.js +55 -1
  16. package/dist/drivers/encryptions/encryption.module.js +34 -1
  17. package/dist/drivers/encryptions/index.js +14 -1
  18. package/dist/drivers/encryptions/jwt.js +62 -1
  19. package/dist/drivers/encryptions/password-hash.js +48 -1
  20. package/dist/drivers/encryptions/snap.signature.js +111 -1
  21. package/dist/drivers/logger/app.logger.js +121 -2
  22. package/dist/drivers/logger/cloudwatch.js +73 -1
  23. package/dist/drivers/logger/index.js +12 -1
  24. package/dist/drivers/logger/logger.contract.js +29 -1
  25. package/dist/drivers/logger/logger.driver.js +49 -1
  26. package/dist/drivers/logger/slack.logger.js +42 -1
  27. package/dist/drivers/mail/index.js +14 -1
  28. package/dist/drivers/mail/mail-template.js +39 -6
  29. package/dist/drivers/mail/mail.config.js +10 -1
  30. package/dist/drivers/mail/mail.js +58 -13
  31. package/dist/drivers/mail/mail.module.js +36 -1
  32. package/dist/drivers/mail/mail.queue.js +45 -1
  33. package/dist/drivers/mail/mailer.js +64 -1
  34. package/dist/drivers/message-broker/index.js +14 -1
  35. package/dist/drivers/message-broker/kafka.js +104 -1
  36. package/dist/drivers/message-broker/message-broker.contract.js +24 -1
  37. package/dist/drivers/message-broker/message-broker.module.js +28 -1
  38. package/dist/drivers/message-broker/message.broker.js +67 -1
  39. package/dist/drivers/message-broker/rabbitmq.js +115 -1
  40. package/dist/drivers/notifications/index.js +14 -1
  41. package/dist/drivers/notifications/notification.config.js +10 -1
  42. package/dist/drivers/notifications/notification.module.js +34 -1
  43. package/dist/drivers/notifications/notification.queue.js +45 -1
  44. package/dist/drivers/notifications/push-notification.js +81 -1
  45. package/dist/drivers/notifications/slack.js +74 -1
  46. package/dist/drivers/queues/app.queue.js +77 -1
  47. package/dist/drivers/queues/index.js +14 -1
  48. package/dist/drivers/queues/queue.module.js +51 -1
  49. package/dist/drivers/secret-manager/aws-secret-manager.js +40 -1
  50. package/dist/drivers/secret-manager/index.js +50 -1
  51. package/dist/drivers/storage/csv.storage.js +71 -1
  52. package/dist/drivers/storage/excel.storage.js +57 -1
  53. package/dist/drivers/storage/index.js +14 -1
  54. package/dist/drivers/storage/local.storage.js +94 -1
  55. package/dist/drivers/storage/minio.storage.js +82 -1
  56. package/dist/drivers/storage/s3-storage.js +122 -1
  57. package/dist/drivers/storage/storage.contract.js +31 -1
  58. package/dist/drivers/storage/storage.module.js +32 -1
  59. package/dist/drivers/storage/storage.service.js +59 -1
  60. package/dist/helpers/exception.helper.js +132 -1
  61. package/dist/helpers/http.helper.js +163 -1
  62. package/dist/helpers/swagger.helper.js +474 -1
  63. package/dist/index.js +14 -1
  64. package/dist/types.d.js +4 -1
  65. package/dist/utils/redlock.js +51 -1
  66. package/dist/utils/throttle.js +68 -1
  67. package/dist/utils/totp.js +56 -1
  68. package/package.json +32 -29
@@ -1 +1,258 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"Repository",{enumerable:!0,get:function(){return Repository}});let _common=require("@nestjs/common"),_helpers=require("@triproject/helpers"),_sequelize=require("sequelize"),_sequelizetypescript=require("sequelize-typescript"),_exceptionhelper=require("../../helpers/exception.helper"),_logger=require("../logger");let Repository=class Repository{logger=new _logger.AppLogger(this.constructor.name);Model;db;excludeParamsFromFilter=["attributes","include","where","orWhere","andWhere","q","searchKey","page","perPage","orderBy","sort","groupBy","order"];get attributes(){return Object.keys(this.Model.getAttributes())}get attributesTypes(){let attributes=this.Model.getAttributes();return Object.keys(attributes).map(attr=>({name:attr,type:attributes[attr].type}))}getTrueKey(key){return key.replace("min_","").replace("max_","").replace("start_","").replace("end_","")}parsedBetweenData(where,key,value){let col=this.getTrueKey(key),operation=key.startsWith("start_")||key.startsWith("min_")?"gte":"lte";if(value=key.startsWith("_start")||key.startsWith("end_")?(0,_helpers.dateUtil)(value).utc().format("YYYY-MM-DD HH:mm:ss"):value,void 0===where[col])return{[_sequelize.Op[operation]]:value};let beforeValue=where[col][_sequelize.Op["gte"==operation?"lte":"gte"]];return beforeValue=key.startsWith("_start")||key.startsWith("end_")?(0,_helpers.dateUtil)(beforeValue).utc().format("YYYY-MM-DD HH:mm:ss"):beforeValue,{[_sequelize.Op.between]:"gte"===operation?[value,beforeValue]:[beforeValue,value]}}mapFilter(filter,cols){let where={};for(let key of Object.keys(filter)){let isSpecialKey=key.includes("$")||key.includes(".");if(!cols.includes(this.getTrueKey(key))&&!isSpecialKey)continue;let value=filter[key],col=this.getTrueKey(key);if(void 0!==value&&""!==value){if(key.startsWith("min_")||key.startsWith("start_")||key.startsWith("max_")||key.startsWith("end_")){where[col]=this.parsedBetweenData(where,key,value);continue}if("string"==typeof value&&value.includes(",")){where[col]=value.split(",");continue}if("object"==typeof value&&!Array.isArray(value)){where[col]={...value};continue}where[col]=value}}return where}_getOptions(params){let fields=this.attributes,where=this.mapFilter({...params.where,...(0,_helpers.omit)(params,this.excludeParamsFromFilter)},fields);if(params.q&&params.searchKey){let searchConditions=Array.isArray(params.searchKey)?params.searchKey.map(key=>({[key]:{[_sequelize.Op.like]:`%${params.q}%`}})):[{[params.searchKey]:{[_sequelize.Op.like]:`%${params.q}%`}}];where={...where,[_sequelize.Op.and]:[...params.andWhere||[],{[_sequelize.Op.or]:[...searchConditions,...params.orWhere||[]]}]}}(params.orWhere||params.andWhere)&&(where={...where,[_sequelize.Op.and]:[...params.andWhere||[],{[_sequelize.Op.or]:params.orWhere||[]}]});let order=[];params?.orderBy&&fields.includes(params?.orderBy)&&order.push([params?.orderBy,params?.sort??"DESC"]),params?.order&&order.push(...params.order,["id","ASC"]);let attributes=params.attributes?params.attributes.filter(d=>"string"!=typeof d||fields.includes(d)):void 0;return{where,order,group:params?.groupBy,...attributes&&{attributes},include:params.include}}async findForPublic(params,mapInto){let options=this._getOptions(params),limit=+(params?.perPage??20);return(await this.findAll({...options,limit})).map(d=>mapInto(d))}async paginate(params,mapInto){let options=this._getOptions(params),limit=+(params?.perPage??20),page=+(params?.page??1),data=await this.findAndCountAll({limit,offset:page>1?limit*(page-1):0,...options,distinct:!0});data.count=Array.isArray(data.count)?data.count.length:data.count;let totalPage=Math.ceil(data.count/limit);return{data:mapInto?data.rows.map(d=>mapInto(d)):data.rows,timestamp:(0,_helpers.dateUtil)().utc().toISOString(),meta:{perPage:limit,page:page,totalPage:totalPage,total:data.count,prevPage:page>1?page-1:null,nextPage:page<totalPage?page+1:null}}}async export(params,mapInto){let options=this._getOptions(params),data=await this.findAll(options);return mapInto?data.map(d=>mapInto(d)):data}async updateOrCreate(values,whereOptions,options){let data=await this.findOne({where:whereOptions});return data?(await this.update(data,values,options),data):await this.create(values,options)}async findAll(options){return await this.Model.findAll(options)}async findAndCountAll(options){return await this.Model.findAndCountAll(options)}async findOne(options){return await this.Model.findOne(options)}async create(values,options){return await this.Model.create(values,options)}async update(entity,values,options){if("string"==typeof entity&&(entity=await this.findOne({where:{id:entity},attributes:["id"]})),!entity)throw new _exceptionhelper.AppNotFoundException;return await entity.update(values,{...options})}async upsert(values,options){return await this.Model.upsert(values,{...options})}async bulkUpdate(values,options){return await this.Model.update(values,{...options})}async bulkCreate(values,options){let idAttribute=this.attributesTypes.find(attr=>"id"===attr.name);return idAttribute&&"BIGINT"!==idAttribute.type&&(values=values.map(val=>(val.id||(val.id=generateId()),val))),await this.Model.bulkCreate(values,options)}async destroy(options){return await this.Model.destroy(options)}async sum(field,options){return await this.Model.sum(field,options)}async sumField(params,field){let options=this._getOptions(params);return await this.sum(field,options)}async sumCol(params,fieldToSum,expectedField){let options=this._getOptions(params);return options.attributes=[[(0,_sequelize.fn)("sum",(0,_sequelize.col)(fieldToSum)),expectedField]],(await this.Model.findAll(options)).reduce((total,row)=>total+parseFloat(String(row.get(expectedField))||"0"),0)}async count(options){return await this.Model.count(options)}async filteredFindAll(params){let options=this._getOptions(params);return await this.Model.findAll(options)}};!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,_common.Inject)(_sequelizetypescript.Sequelize),function(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}("design:type",void 0===_sequelizetypescript.Sequelize?Object:_sequelizetypescript.Sequelize)],Repository.prototype,"db",void 0);
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: !0
4
+ }), Object.defineProperty(exports, "Repository", {
5
+ enumerable: !0,
6
+ get: function() {
7
+ return Repository;
8
+ }
9
+ });
10
+ let _common = require("@nestjs/common"), _helpers = require("@triproject/helpers"), _sequelize = require("sequelize"), _sequelizetypescript = require("sequelize-typescript"), _exceptionhelper = require("../../helpers/exception.helper"), _logger = require("../logger");
11
+ let Repository = class Repository {
12
+ logger = new _logger.AppLogger(this.constructor.name);
13
+ Model;
14
+ db;
15
+ excludeParamsFromFilter = [
16
+ 'attributes',
17
+ 'include',
18
+ 'where',
19
+ 'orWhere',
20
+ 'andWhere',
21
+ 'q',
22
+ 'searchKey',
23
+ 'page',
24
+ 'perPage',
25
+ 'orderBy',
26
+ 'sort',
27
+ 'groupBy',
28
+ 'order'
29
+ ];
30
+ get attributes() {
31
+ return Object.keys(this.Model.getAttributes());
32
+ }
33
+ get attributesTypes() {
34
+ let attributes = this.Model.getAttributes();
35
+ return Object.keys(attributes).map((attr)=>({
36
+ name: attr,
37
+ type: attributes[attr].type
38
+ }));
39
+ }
40
+ getTrueKey(key) {
41
+ return key.replace('min_', '').replace('max_', '').replace('start_', '').replace('end_', '');
42
+ }
43
+ parsedBetweenData(where, key, value) {
44
+ let col = this.getTrueKey(key), operation = key.startsWith('start_') || key.startsWith('min_') ? 'gte' : 'lte';
45
+ if (value = key.startsWith('_start') || key.startsWith('end_') ? (0, _helpers.dateUtil)(value).utc().format('YYYY-MM-DD HH:mm:ss') : value, void 0 === where[col]) return {
46
+ [_sequelize.Op[operation]]: value
47
+ };
48
+ let beforeValue = where[col][_sequelize.Op['gte' == operation ? 'lte' : 'gte']];
49
+ return beforeValue = key.startsWith('_start') || key.startsWith('end_') ? (0, _helpers.dateUtil)(beforeValue).utc().format('YYYY-MM-DD HH:mm:ss') : beforeValue, {
50
+ [_sequelize.Op.between]: 'gte' === operation ? [
51
+ value,
52
+ beforeValue
53
+ ] : [
54
+ beforeValue,
55
+ value
56
+ ]
57
+ };
58
+ }
59
+ mapFilter(filter, cols) {
60
+ let where = {};
61
+ for (let key of Object.keys(filter)){
62
+ let isSpecialKey = key.includes('$') || key.includes('.');
63
+ if (!cols.includes(this.getTrueKey(key)) && !isSpecialKey) continue;
64
+ let value = filter[key], col = this.getTrueKey(key);
65
+ if (void 0 !== value && '' !== value) {
66
+ if (key.startsWith('min_') || key.startsWith('start_') || key.startsWith('max_') || key.startsWith('end_')) {
67
+ where[col] = this.parsedBetweenData(where, key, value);
68
+ continue;
69
+ }
70
+ if ('string' == typeof value && value.includes(',')) {
71
+ where[col] = value.split(',');
72
+ continue;
73
+ }
74
+ if ('object' == typeof value && !Array.isArray(value)) {
75
+ where[col] = {
76
+ ...value
77
+ };
78
+ continue;
79
+ }
80
+ where[col] = value;
81
+ }
82
+ }
83
+ return where;
84
+ }
85
+ _getOptions(params) {
86
+ let fields = this.attributes, where = this.mapFilter({
87
+ ...params.where,
88
+ ...(0, _helpers.omit)(params, this.excludeParamsFromFilter)
89
+ }, fields);
90
+ if (params.q && params.searchKey) {
91
+ let searchConditions = Array.isArray(params.searchKey) ? params.searchKey.map((key)=>({
92
+ [key]: {
93
+ [_sequelize.Op.like]: `%${params.q}%`
94
+ }
95
+ })) : [
96
+ {
97
+ [params.searchKey]: {
98
+ [_sequelize.Op.like]: `%${params.q}%`
99
+ }
100
+ }
101
+ ];
102
+ where = {
103
+ ...where,
104
+ [_sequelize.Op.and]: [
105
+ ...params.andWhere || [],
106
+ {
107
+ [_sequelize.Op.or]: [
108
+ ...searchConditions,
109
+ ...params.orWhere || []
110
+ ]
111
+ }
112
+ ]
113
+ };
114
+ }
115
+ (params.orWhere || params.andWhere) && (where = {
116
+ ...where,
117
+ [_sequelize.Op.and]: [
118
+ ...params.andWhere || [],
119
+ {
120
+ [_sequelize.Op.or]: params.orWhere || []
121
+ }
122
+ ]
123
+ });
124
+ let order = [];
125
+ params?.orderBy && fields.includes(params?.orderBy) && order.push([
126
+ params?.orderBy,
127
+ params?.sort ?? 'DESC'
128
+ ]), params?.order && order.push(...params.order, [
129
+ 'id',
130
+ 'ASC'
131
+ ]);
132
+ let attributes = params.attributes ? params.attributes.filter((d)=>'string' != typeof d || fields.includes(d)) : void 0;
133
+ return {
134
+ where,
135
+ order,
136
+ group: params?.groupBy,
137
+ ...attributes && {
138
+ attributes
139
+ },
140
+ include: params.include
141
+ };
142
+ }
143
+ async findForPublic(params, mapInto) {
144
+ let options = this._getOptions(params), limit = +(params?.perPage ?? 20);
145
+ return (await this.findAll({
146
+ ...options,
147
+ limit
148
+ })).map((d)=>mapInto(d));
149
+ }
150
+ async paginate(params, mapInto) {
151
+ let options = this._getOptions(params), limit = +(params?.perPage ?? 20), page = +(params?.page ?? 1), data = await this.findAndCountAll({
152
+ limit,
153
+ offset: page > 1 ? limit * (page - 1) : 0,
154
+ ...options,
155
+ distinct: !0
156
+ });
157
+ data.count = Array.isArray(data.count) ? data.count.length : data.count;
158
+ let totalPage = Math.ceil(data.count / limit);
159
+ return {
160
+ data: mapInto ? data.rows.map((d)=>mapInto(d)) : data.rows,
161
+ timestamp: (0, _helpers.dateUtil)().utc().toISOString(),
162
+ meta: {
163
+ perPage: limit,
164
+ page: page,
165
+ totalPage: totalPage,
166
+ total: data.count,
167
+ prevPage: page > 1 ? page - 1 : null,
168
+ nextPage: page < totalPage ? page + 1 : null
169
+ }
170
+ };
171
+ }
172
+ async export(params, mapInto) {
173
+ let options = this._getOptions(params), data = await this.findAll(options);
174
+ return mapInto ? data.map((d)=>mapInto(d)) : data;
175
+ }
176
+ async updateOrCreate(values, whereOptions, options) {
177
+ let data = await this.findOne({
178
+ where: whereOptions
179
+ });
180
+ return data ? (await this.update(data, values, options), data) : await this.create(values, options);
181
+ }
182
+ async findAll(options) {
183
+ return await this.Model.findAll(options);
184
+ }
185
+ async findAndCountAll(options) {
186
+ return await this.Model.findAndCountAll(options);
187
+ }
188
+ async findOne(options) {
189
+ return await this.Model.findOne(options);
190
+ }
191
+ async create(values, options) {
192
+ return await this.Model.create(values, options);
193
+ }
194
+ async update(entity, values, options) {
195
+ if ('string' == typeof entity && (entity = await this.findOne({
196
+ where: {
197
+ id: entity
198
+ },
199
+ attributes: [
200
+ 'id'
201
+ ]
202
+ })), !entity) throw new _exceptionhelper.AppNotFoundException();
203
+ return await entity.update(values, {
204
+ ...options
205
+ });
206
+ }
207
+ async upsert(values, options) {
208
+ return await this.Model.upsert(values, {
209
+ ...options
210
+ });
211
+ }
212
+ async bulkUpdate(values, options) {
213
+ return await this.Model.update(values, {
214
+ ...options
215
+ });
216
+ }
217
+ async bulkCreate(values, options) {
218
+ let idAttribute = this.attributesTypes.find((attr)=>'id' === attr.name);
219
+ return idAttribute && 'BIGINT' !== idAttribute.type && (values = values.map((val)=>(val.id || (val.id = generateId()), val))), await this.Model.bulkCreate(values, options);
220
+ }
221
+ async destroy(options) {
222
+ return await this.Model.destroy(options);
223
+ }
224
+ async sum(field, options) {
225
+ return await this.Model.sum(field, options);
226
+ }
227
+ async sumField(params, field) {
228
+ let options = this._getOptions(params);
229
+ return await this.sum(field, options);
230
+ }
231
+ async sumCol(params, fieldToSum, expectedField) {
232
+ let options = this._getOptions(params);
233
+ return options.attributes = [
234
+ [
235
+ (0, _sequelize.fn)('sum', (0, _sequelize.col)(fieldToSum)),
236
+ expectedField
237
+ ]
238
+ ], (await this.Model.findAll(options)).reduce((total, row)=>total + parseFloat(String(row.get(expectedField)) || '0'), 0);
239
+ }
240
+ async count(options) {
241
+ return await this.Model.count(options);
242
+ }
243
+ async filteredFindAll(params) {
244
+ let options = this._getOptions(params);
245
+ return await this.Model.findAll(options);
246
+ }
247
+ };
248
+ !function(decorators, target, key, desc) {
249
+ var d, c = arguments.length, r = c < 3 ? target : null === desc ? desc = Object.getOwnPropertyDescriptor(target, key) : desc;
250
+ if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) r = Reflect.decorate(decorators, target, key, desc);
251
+ 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);
252
+ c > 3 && r && Object.defineProperty(target, key, r);
253
+ }([
254
+ (0, _common.Inject)(_sequelizetypescript.Sequelize),
255
+ function(k, v) {
256
+ if ("object" == typeof Reflect && "function" == typeof Reflect.metadata) return Reflect.metadata(k, v);
257
+ }("design:type", void 0 === _sequelizetypescript.Sequelize ? Object : _sequelizetypescript.Sequelize)
258
+ ], Repository.prototype, "db", void 0);
@@ -1 +1,55 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"Encryption",{enumerable:!0,get:function(){return Encryption}});let _common=require("@nestjs/common"),_crypto=require("crypto"),_exceptionhelper=require("../../helpers/exception.helper"),_secretmanager=require("../secret-manager");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let Encryption=class Encryption{keyEncoding="hex";encoding="hex";algorithm="aes-256-gcm";ENCRYPTION_KEY;constructor(){(0,_secretmanager.getSecret)().then(secret=>{secret.ENCRYPTION_KEY&&(this.ENCRYPTION_KEY=secret.ENCRYPTION_KEY)})}_generateEncryptionIV(){return(0,_crypto.randomBytes)(16).toString(this.keyEncoding)}encrypt(text){if(!this.ENCRYPTION_KEY)throw new _exceptionhelper.AppUnprocessableEntityException("ENCRYPTION_KEY is not defined");let iv=this._generateEncryptionIV(),cipher=(0,_crypto.createCipheriv)(this.algorithm,Buffer.from(this.ENCRYPTION_KEY,this.keyEncoding),Buffer.from(iv,this.keyEncoding)),encrypted=cipher.update(text,"utf8",this.encoding)+cipher.final(this.encoding),data=[iv,cipher.getAuthTag().toString(this.encoding),encrypted].join(";;");return Buffer.from(data).toString("base64")}decrypt(encryptedData){if(!this.ENCRYPTION_KEY)throw new _exceptionhelper.AppUnprocessableEntityException("ENCRYPTION_KEY is not defined");try{let[iv,tag,encrypted]=Buffer.from(encryptedData,"base64").toString().split(";;"),decipher=(0,_crypto.createDecipheriv)(this.algorithm,Buffer.from(this.ENCRYPTION_KEY,this.keyEncoding),Buffer.from(iv,this.keyEncoding));return decipher.setAuthTag(Buffer.from(tag,this.encoding)),decipher.update(encrypted,this.encoding,"utf8")+decipher.final("utf8")}catch(error){throw new _exceptionhelper.AppInternalServerErrorException("Error while decrypting data")}}};Encryption=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",[])],Encryption);
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: !0
4
+ }), Object.defineProperty(exports, "Encryption", {
5
+ enumerable: !0,
6
+ get: function() {
7
+ return Encryption;
8
+ }
9
+ });
10
+ let _common = require("@nestjs/common"), _crypto = require("crypto"), _exceptionhelper = require("../../helpers/exception.helper"), _secretmanager = require("../secret-manager");
11
+ function _ts_metadata(k, v) {
12
+ if ("object" == typeof Reflect && "function" == typeof Reflect.metadata) return Reflect.metadata(k, v);
13
+ }
14
+ let Encryption = class Encryption {
15
+ keyEncoding = 'hex';
16
+ encoding = 'hex';
17
+ algorithm = 'aes-256-gcm';
18
+ ENCRYPTION_KEY;
19
+ constructor(){
20
+ (0, _secretmanager.getSecret)().then((secret)=>{
21
+ secret.ENCRYPTION_KEY && (this.ENCRYPTION_KEY = secret.ENCRYPTION_KEY);
22
+ });
23
+ }
24
+ _generateEncryptionIV() {
25
+ return (0, _crypto.randomBytes)(16).toString(this.keyEncoding);
26
+ }
27
+ encrypt(text) {
28
+ if (!this.ENCRYPTION_KEY) throw new _exceptionhelper.AppUnprocessableEntityException('ENCRYPTION_KEY is not defined');
29
+ let iv = this._generateEncryptionIV(), cipher = (0, _crypto.createCipheriv)(this.algorithm, Buffer.from(this.ENCRYPTION_KEY, this.keyEncoding), Buffer.from(iv, this.keyEncoding)), encrypted = cipher.update(text, 'utf8', this.encoding) + cipher.final(this.encoding), data = [
30
+ iv,
31
+ cipher.getAuthTag().toString(this.encoding),
32
+ encrypted
33
+ ].join(';;');
34
+ return Buffer.from(data).toString('base64');
35
+ }
36
+ decrypt(encryptedData) {
37
+ if (!this.ENCRYPTION_KEY) throw new _exceptionhelper.AppUnprocessableEntityException('ENCRYPTION_KEY is not defined');
38
+ try {
39
+ let [iv, tag, encrypted] = Buffer.from(encryptedData, 'base64').toString().split(';;'), decipher = (0, _crypto.createDecipheriv)(this.algorithm, Buffer.from(this.ENCRYPTION_KEY, this.keyEncoding), Buffer.from(iv, this.keyEncoding));
40
+ return decipher.setAuthTag(Buffer.from(tag, this.encoding)), decipher.update(encrypted, this.encoding, 'utf8') + decipher.final('utf8');
41
+ } catch (error) {
42
+ throw new _exceptionhelper.AppInternalServerErrorException('Error while decrypting data');
43
+ }
44
+ }
45
+ };
46
+ Encryption = function(decorators, target, key, desc) {
47
+ var d, c = arguments.length, r = c < 3 ? target : null === desc ? desc = Object.getOwnPropertyDescriptor(target, key) : desc;
48
+ if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) r = Reflect.decorate(decorators, target, key, desc);
49
+ 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);
50
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
51
+ }([
52
+ (0, _common.Injectable)(),
53
+ _ts_metadata("design:type", Function),
54
+ _ts_metadata("design:paramtypes", [])
55
+ ], Encryption);
@@ -1 +1,34 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"EncryptionModule",{enumerable:!0,get:function(){return EncryptionModule}});let _common=require("@nestjs/common"),_encryption=require("./encryption"),_jwt=require("./jwt"),_passwordhash=require("./password-hash"),_snapsignature=require("./snap.signature");let EncryptionModule=class EncryptionModule{};EncryptionModule=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:[_passwordhash.PasswordHash,_jwt.Jwt,_encryption.Encryption,_snapsignature.SnapSignature],exports:[_passwordhash.PasswordHash,_jwt.Jwt,_encryption.Encryption,_snapsignature.SnapSignature]})],EncryptionModule);
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: !0
4
+ }), Object.defineProperty(exports, "EncryptionModule", {
5
+ enumerable: !0,
6
+ get: function() {
7
+ return EncryptionModule;
8
+ }
9
+ });
10
+ let _common = require("@nestjs/common"), _encryption = require("./encryption"), _jwt = require("./jwt"), _passwordhash = require("./password-hash"), _snapsignature = require("./snap.signature");
11
+ let EncryptionModule = class EncryptionModule {
12
+ };
13
+ EncryptionModule = function(decorators, target, key, desc) {
14
+ var d, c = arguments.length, r = c < 3 ? target : null === desc ? desc = Object.getOwnPropertyDescriptor(target, key) : desc;
15
+ if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) r = Reflect.decorate(decorators, target, key, desc);
16
+ 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);
17
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
18
+ }([
19
+ (0, _common.Global)(),
20
+ (0, _common.Module)({
21
+ providers: [
22
+ _passwordhash.PasswordHash,
23
+ _jwt.Jwt,
24
+ _encryption.Encryption,
25
+ _snapsignature.SnapSignature
26
+ ],
27
+ exports: [
28
+ _passwordhash.PasswordHash,
29
+ _jwt.Jwt,
30
+ _encryption.Encryption,
31
+ _snapsignature.SnapSignature
32
+ ]
33
+ })
34
+ ], EncryptionModule);
@@ -1 +1,14 @@
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("./encryption.module"),exports),_export_star(require("./jwt"),exports),_export_star(require("./password-hash"),exports);
1
+ "use strict";
2
+ function _export_star(from, to) {
3
+ return Object.keys(from).forEach(function(k) {
4
+ "default" === k || Object.prototype.hasOwnProperty.call(to, k) || Object.defineProperty(to, k, {
5
+ enumerable: !0,
6
+ get: function() {
7
+ return from[k];
8
+ }
9
+ });
10
+ }), from;
11
+ }
12
+ Object.defineProperty(exports, "__esModule", {
13
+ value: !0
14
+ }), _export_star(require("./encryption.module"), exports), _export_star(require("./jwt"), exports), _export_star(require("./password-hash"), exports);
@@ -1 +1,62 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"Jwt",{enumerable:!0,get:function(){return Jwt}});let _common=require("@nestjs/common"),_helpers=require("@triproject/helpers"),_jsonwebtoken=require("jsonwebtoken"),_exceptionhelper=require("../../helpers/exception.helper"),_secretmanager=require("../secret-manager");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let Jwt=class Jwt{jwtAlgorithms=["RS512"];JWT_PRIVATE_KEY;JWT_PUBLIC_KEY;constructor(){(0,_secretmanager.getSecret)().then(secret=>{secret.JWT_PRIVATE_KEY&&(this.JWT_PRIVATE_KEY=(0,_helpers.parsedKeyPair)(secret.JWT_PRIVATE_KEY)),secret.JWT_PUBLIC_KEY&&(this.JWT_PUBLIC_KEY=(0,_helpers.parsedKeyPair)(secret.JWT_PUBLIC_KEY))})}verify(token){try{return(0,_jsonwebtoken.verify)(token,this.JWT_PUBLIC_KEY,{algorithms:this.jwtAlgorithms})}catch(error){throw new _exceptionhelper.AppUnauthorizedException("Invalid or expired JWT token.")}}sign(data,expiresIn=15e3){try{let key="string"==typeof this.JWT_PRIVATE_KEY&&this.JWT_PRIVATE_KEY?Buffer.from(this.JWT_PRIVATE_KEY):{key:this.JWT_PRIVATE_KEY,passphrase:""};return(0,_jsonwebtoken.sign)({...data},key,{algorithm:this.jwtAlgorithms[0],expiresIn,allowInsecureKeySizes:!1,encoding:"utf-8"})}catch(error){throw new _exceptionhelper.AppInternalServerErrorException("Failed to sign JWT token.")}}};Jwt=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",[])],Jwt);
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: !0
4
+ }), Object.defineProperty(exports, "Jwt", {
5
+ enumerable: !0,
6
+ get: function() {
7
+ return Jwt;
8
+ }
9
+ });
10
+ let _common = require("@nestjs/common"), _helpers = require("@triproject/helpers"), _jsonwebtoken = require("jsonwebtoken"), _exceptionhelper = require("../../helpers/exception.helper"), _secretmanager = require("../secret-manager");
11
+ function _ts_metadata(k, v) {
12
+ if ("object" == typeof Reflect && "function" == typeof Reflect.metadata) return Reflect.metadata(k, v);
13
+ }
14
+ let Jwt = class Jwt {
15
+ jwtAlgorithms = [
16
+ 'RS512'
17
+ ];
18
+ JWT_PRIVATE_KEY;
19
+ JWT_PUBLIC_KEY;
20
+ constructor(){
21
+ (0, _secretmanager.getSecret)().then((secret)=>{
22
+ secret.JWT_PRIVATE_KEY && (this.JWT_PRIVATE_KEY = (0, _helpers.parsedKeyPair)(secret.JWT_PRIVATE_KEY)), secret.JWT_PUBLIC_KEY && (this.JWT_PUBLIC_KEY = (0, _helpers.parsedKeyPair)(secret.JWT_PUBLIC_KEY));
23
+ });
24
+ }
25
+ verify(token) {
26
+ try {
27
+ return (0, _jsonwebtoken.verify)(token, this.JWT_PUBLIC_KEY, {
28
+ algorithms: this.jwtAlgorithms
29
+ });
30
+ } catch (error) {
31
+ throw new _exceptionhelper.AppUnauthorizedException('Invalid or expired JWT token.');
32
+ }
33
+ }
34
+ sign(data, expiresIn = 15_000) {
35
+ try {
36
+ let key = 'string' == typeof this.JWT_PRIVATE_KEY && this.JWT_PRIVATE_KEY ? Buffer.from(this.JWT_PRIVATE_KEY) : {
37
+ key: this.JWT_PRIVATE_KEY,
38
+ passphrase: ''
39
+ };
40
+ return (0, _jsonwebtoken.sign)({
41
+ ...data
42
+ }, key, {
43
+ algorithm: this.jwtAlgorithms[0],
44
+ expiresIn,
45
+ allowInsecureKeySizes: !1,
46
+ encoding: 'utf-8'
47
+ });
48
+ } catch (error) {
49
+ throw new _exceptionhelper.AppInternalServerErrorException('Failed to sign JWT token.');
50
+ }
51
+ }
52
+ };
53
+ Jwt = function(decorators, target, key, desc) {
54
+ var d, c = arguments.length, r = c < 3 ? target : null === desc ? desc = Object.getOwnPropertyDescriptor(target, key) : desc;
55
+ if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) r = Reflect.decorate(decorators, target, key, desc);
56
+ 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);
57
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
58
+ }([
59
+ (0, _common.Injectable)(),
60
+ _ts_metadata("design:type", Function),
61
+ _ts_metadata("design:paramtypes", [])
62
+ ], Jwt);
@@ -1 +1,48 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"PasswordHash",{enumerable:!0,get:function(){return PasswordHash}});let _common=require("@nestjs/common"),_crypto=require("crypto"),_secretmanager=require("../secret-manager");function _ts_metadata(k,v){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(k,v)}let PasswordHash=class PasswordHash{DIGEST="sha512";ITERATIONS=1e5;KEYLEN=64;SALT_LENGTH=8;HASH_ENCODING="base64";HASH_DELIMITER=".";PASSWORD_HASH_SECRET;constructor(){(0,_secretmanager.getSecret)().then(secret=>{secret.PASSWORD_HASH_SECRET&&(this.PASSWORD_HASH_SECRET=secret.PASSWORD_HASH_SECRET)})}_hash(password,salt){return(0,_crypto.pbkdf2Sync)(this.PASSWORD_HASH_SECRET+password,salt,this.ITERATIONS,this.KEYLEN,this.DIGEST)}sign(password){let salt=(0,_crypto.randomBytes)(this.SALT_LENGTH).toString("hex"),key=this._hash(password,salt).toString(this.HASH_ENCODING);return`$${salt}${this.HASH_DELIMITER}$${key}`}verify(password,passwordHash){let[salt,key]=passwordHash.replace("$","").split(this.HASH_DELIMITER),derivedKey=this._hash(password,salt),storedHashBuffer=Buffer.from(key,this.HASH_ENCODING);return(0,_crypto.timingSafeEqual)(storedHashBuffer,derivedKey)}};PasswordHash=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",[])],PasswordHash);
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: !0
4
+ }), Object.defineProperty(exports, "PasswordHash", {
5
+ enumerable: !0,
6
+ get: function() {
7
+ return PasswordHash;
8
+ }
9
+ });
10
+ let _common = require("@nestjs/common"), _crypto = require("crypto"), _secretmanager = require("../secret-manager");
11
+ function _ts_metadata(k, v) {
12
+ if ("object" == typeof Reflect && "function" == typeof Reflect.metadata) return Reflect.metadata(k, v);
13
+ }
14
+ let PasswordHash = class PasswordHash {
15
+ DIGEST = 'sha512';
16
+ ITERATIONS = 100000;
17
+ KEYLEN = 64;
18
+ SALT_LENGTH = 8;
19
+ HASH_ENCODING = 'base64';
20
+ HASH_DELIMITER = '.';
21
+ PASSWORD_HASH_SECRET;
22
+ constructor(){
23
+ (0, _secretmanager.getSecret)().then((secret)=>{
24
+ secret.PASSWORD_HASH_SECRET && (this.PASSWORD_HASH_SECRET = secret.PASSWORD_HASH_SECRET);
25
+ });
26
+ }
27
+ _hash(password, salt) {
28
+ return (0, _crypto.pbkdf2Sync)(this.PASSWORD_HASH_SECRET + password, salt, this.ITERATIONS, this.KEYLEN, this.DIGEST);
29
+ }
30
+ sign(password) {
31
+ let salt = (0, _crypto.randomBytes)(this.SALT_LENGTH).toString('hex'), key = this._hash(password, salt).toString(this.HASH_ENCODING);
32
+ return `$${salt}${this.HASH_DELIMITER}$${key}`;
33
+ }
34
+ verify(password, passwordHash) {
35
+ let [salt, key] = passwordHash.replace('$', '').split(this.HASH_DELIMITER), derivedKey = this._hash(password, salt), storedHashBuffer = Buffer.from(key, this.HASH_ENCODING);
36
+ return (0, _crypto.timingSafeEqual)(storedHashBuffer, derivedKey);
37
+ }
38
+ };
39
+ PasswordHash = function(decorators, target, key, desc) {
40
+ var d, c = arguments.length, r = c < 3 ? target : null === desc ? desc = Object.getOwnPropertyDescriptor(target, key) : desc;
41
+ if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) r = Reflect.decorate(decorators, target, key, desc);
42
+ 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);
43
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
44
+ }([
45
+ (0, _common.Injectable)(),
46
+ _ts_metadata("design:type", Function),
47
+ _ts_metadata("design:paramtypes", [])
48
+ ], PasswordHash);
@@ -1 +1,111 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var target=exports,all={get SnapSignature(){return SnapSignature},get snapSignature(){return snapSignature}};for(var name in all)Object.defineProperty(target,name,{enumerable:!0,get:Object.getOwnPropertyDescriptor(all,name).get});let _helpers=require("@triproject/helpers"),_crypto=require("crypto");let SnapSignature=class SnapSignature{sha256Encoding="base64";sha512Encoding="hex";minifiedObjectEncoding="hex";_signSHA256(stringToSign,privateKey){let signer=(0,_crypto.createSign)("SHA256");return signer.update(stringToSign),signer.sign((0,_helpers.parsedKeyPair)(privateKey),this.sha256Encoding)}_verifySHA256WithRSA(stringToVerify,signature,publicKey){let verifier=(0,_crypto.createVerify)("SHA256");return verifier.update(stringToVerify),verifier.verify({key:(0,_helpers.parsedKeyPair)(publicKey),padding:_crypto.constants.RSA_PKCS1_PSS_PADDING,saltLength:32},signature,this.sha256Encoding)}_verifySHA256(stringToVerify,signature,publicKey){try{let verifier=(0,_crypto.createVerify)("SHA256");if(verifier.update(stringToVerify),verifier.verify((0,_helpers.parsedKeyPair)(publicKey),signature,this.sha256Encoding))return!0;return this._verifySHA256WithRSA(stringToVerify,signature,publicKey)}catch(error){return!1}}_signSHA512(stringToSign,secret){try{let hmac=(0,_crypto.createHmac)("sha512",secret);return hmac.update(stringToSign),hmac.digest(this.sha256Encoding)}catch(error){throw Error("Error while signing data")}}_verifySHA512(stringToVerify,signature,secret){let hmac=(0,_crypto.createHmac)("sha512",secret);return hmac.update(stringToVerify),hmac.digest(this.sha512Encoding)===signature}_reqBodySignatureString(params){return[params?.method??"POST",params.url,params.accessToken,this._minifyParams(params.body),params.timestamp].filter(d=>d).join(":")}_minifyParams(object){let minifiedRequestBody="object"==typeof object?JSON.stringify(object):object?.toString()??"",sha256Hash=(0,_crypto.createHash)("SHA256");return sha256Hash.update(minifiedRequestBody),sha256Hash.digest(this.minifiedObjectEncoding).toLowerCase()}signBodySignature(params,secret){return this._signSHA512(this._reqBodySignatureString(params),secret)}_verifyBodySignature(params,signature,secret){return this._verifySHA512(this._reqBodySignatureString(params),signature,secret)}signAccessTokenSignature(params,secretKey){let{client_id,timestamp}=params;return this._signSHA256([client_id,timestamp].join("|"),secretKey)}_verifyAccessTokenSignature(params,publicKey){let{client_id,timestamp,signature}=params;return!!signature&&this._verifySHA256([client_id,timestamp].join("|"),signature,publicKey)}middleware(secret,req){if(!["POST","GET"].includes(req.method))throw Error("Invalid request method");if(req.path?.includes("/access-token/b2b")){let{"client-id":client_id,"x-timestamp":timestamp,"x-signature":signature}=req.headers;if(!this._verifyAccessTokenSignature({client_id,timestamp,signature},secret))throw Error("Invalid signature")}let{"x-timestamp":timestamp,"x-signature":signature,accessToken}=req.headers;if(!this._verifyBodySignature({url:req.path,body:req.body,timestamp,method:req.method,accessToken:(accessToken??"")?.replace("Bearer ","")},signature,secret))throw Error("Invalid signature")}};let snapSignature=new SnapSignature;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: !0
4
+ });
5
+ var target = exports, all = {
6
+ get SnapSignature () {
7
+ return SnapSignature;
8
+ },
9
+ get snapSignature () {
10
+ return snapSignature;
11
+ }
12
+ };
13
+ for(var name in all)Object.defineProperty(target, name, {
14
+ enumerable: !0,
15
+ get: Object.getOwnPropertyDescriptor(all, name).get
16
+ });
17
+ let _helpers = require("@triproject/helpers"), _crypto = require("crypto");
18
+ let SnapSignature = class SnapSignature {
19
+ sha256Encoding = 'base64';
20
+ sha512Encoding = 'hex';
21
+ minifiedObjectEncoding = 'hex';
22
+ _signSHA256(stringToSign, privateKey) {
23
+ let signer = (0, _crypto.createSign)('SHA256');
24
+ return signer.update(stringToSign), signer.sign((0, _helpers.parsedKeyPair)(privateKey), this.sha256Encoding);
25
+ }
26
+ _verifySHA256WithRSA(stringToVerify, signature, publicKey) {
27
+ let verifier = (0, _crypto.createVerify)('SHA256');
28
+ return verifier.update(stringToVerify), verifier.verify({
29
+ key: (0, _helpers.parsedKeyPair)(publicKey),
30
+ padding: _crypto.constants.RSA_PKCS1_PSS_PADDING,
31
+ saltLength: 32
32
+ }, signature, this.sha256Encoding);
33
+ }
34
+ _verifySHA256(stringToVerify, signature, publicKey) {
35
+ try {
36
+ let verifier = (0, _crypto.createVerify)('SHA256');
37
+ if (verifier.update(stringToVerify), verifier.verify((0, _helpers.parsedKeyPair)(publicKey), signature, this.sha256Encoding)) return !0;
38
+ return this._verifySHA256WithRSA(stringToVerify, signature, publicKey);
39
+ } catch (error) {
40
+ return !1;
41
+ }
42
+ }
43
+ _signSHA512(stringToSign, secret) {
44
+ try {
45
+ let hmac = (0, _crypto.createHmac)('sha512', secret);
46
+ return hmac.update(stringToSign), hmac.digest(this.sha256Encoding);
47
+ } catch (error) {
48
+ throw Error('Error while signing data');
49
+ }
50
+ }
51
+ _verifySHA512(stringToVerify, signature, secret) {
52
+ let hmac = (0, _crypto.createHmac)('sha512', secret);
53
+ return hmac.update(stringToVerify), hmac.digest(this.sha512Encoding) === signature;
54
+ }
55
+ _reqBodySignatureString(params) {
56
+ return [
57
+ params?.method ?? 'POST',
58
+ params.url,
59
+ params.accessToken,
60
+ this._minifyParams(params.body),
61
+ params.timestamp
62
+ ].filter((d)=>d).join(':');
63
+ }
64
+ _minifyParams(object) {
65
+ let minifiedRequestBody = 'object' == typeof object ? JSON.stringify(object) : object?.toString() ?? '', sha256Hash = (0, _crypto.createHash)('SHA256');
66
+ return sha256Hash.update(minifiedRequestBody), sha256Hash.digest(this.minifiedObjectEncoding).toLowerCase();
67
+ }
68
+ signBodySignature(params, secret) {
69
+ return this._signSHA512(this._reqBodySignatureString(params), secret);
70
+ }
71
+ _verifyBodySignature(params, signature, secret) {
72
+ return this._verifySHA512(this._reqBodySignatureString(params), signature, secret);
73
+ }
74
+ signAccessTokenSignature(params, secretKey) {
75
+ let { client_id, timestamp } = params;
76
+ return this._signSHA256([
77
+ client_id,
78
+ timestamp
79
+ ].join('|'), secretKey);
80
+ }
81
+ _verifyAccessTokenSignature(params, publicKey) {
82
+ let { client_id, timestamp, signature } = params;
83
+ return !!signature && this._verifySHA256([
84
+ client_id,
85
+ timestamp
86
+ ].join('|'), signature, publicKey);
87
+ }
88
+ middleware(secret, req) {
89
+ if (![
90
+ 'POST',
91
+ 'GET'
92
+ ].includes(req.method)) throw Error('Invalid request method');
93
+ if (req.path?.includes('/access-token/b2b')) {
94
+ let { 'client-id': client_id, 'x-timestamp': timestamp, 'x-signature': signature } = req.headers;
95
+ if (!this._verifyAccessTokenSignature({
96
+ client_id,
97
+ timestamp,
98
+ signature
99
+ }, secret)) throw Error('Invalid signature');
100
+ }
101
+ let { 'x-timestamp': timestamp, 'x-signature': signature, accessToken } = req.headers;
102
+ if (!this._verifyBodySignature({
103
+ url: req.path,
104
+ body: req.body,
105
+ timestamp,
106
+ method: req.method,
107
+ accessToken: (accessToken ?? '')?.replace('Bearer ', '')
108
+ }, signature, secret)) throw Error('Invalid signature');
109
+ }
110
+ };
111
+ let snapSignature = new SnapSignature();