@mondart/nestjs-common-module 2.3.4 → 2.4.0

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 (34) hide show
  1. package/dist/decorators/swagger-api-response.decorator.d.ts +1 -0
  2. package/dist/decorators/swagger-api-response.decorator.js +5 -0
  3. package/dist/dto/request/base-request.dto.js +5 -0
  4. package/dist/dto/response/index.d.ts +1 -0
  5. package/dist/dto/response/index.js +1 -0
  6. package/dist/dto/response/paginate-metadata-response.dto.d.ts +12 -0
  7. package/dist/dto/response/paginate-metadata-response.dto.js +43 -0
  8. package/dist/dto/response/success-response.dto.d.ts +5 -5
  9. package/dist/lib/bottleneck/bottleneck.module.d.ts +8 -0
  10. package/dist/lib/bottleneck/bottleneck.module.js +109 -0
  11. package/dist/lib/bottleneck/constants/bottleneck.const.d.ts +3 -0
  12. package/dist/lib/bottleneck/constants/bottleneck.const.js +6 -0
  13. package/dist/lib/bottleneck/cqrs-wrapper/queued-command-bus.d.ts +8 -0
  14. package/dist/lib/bottleneck/cqrs-wrapper/queued-command-bus.js +31 -0
  15. package/dist/lib/bottleneck/cqrs-wrapper/queued-query-bus.d.ts +8 -0
  16. package/dist/lib/bottleneck/cqrs-wrapper/queued-query-bus.js +31 -0
  17. package/dist/lib/bottleneck/decorators/config-bottleneck.decorator.d.ts +2 -0
  18. package/dist/lib/bottleneck/decorators/config-bottleneck.decorator.js +7 -0
  19. package/dist/lib/bottleneck/decorators/skip-bottleneck.decorator.d.ts +1 -0
  20. package/dist/lib/bottleneck/decorators/skip-bottleneck.decorator.js +7 -0
  21. package/dist/lib/bottleneck/decorators/use-bottleneck.decorator.d.ts +1 -0
  22. package/dist/lib/bottleneck/decorators/use-bottleneck.decorator.js +7 -0
  23. package/dist/lib/bottleneck/index.d.ts +10 -0
  24. package/dist/lib/bottleneck/index.js +26 -0
  25. package/dist/lib/bottleneck/interceptors/bottleneck.interceptor.d.ts +12 -0
  26. package/dist/lib/bottleneck/interceptors/bottleneck.interceptor.js +82 -0
  27. package/dist/lib/bottleneck/interfaces/bottleneck-options.interface.d.ts +39 -0
  28. package/dist/lib/bottleneck/interfaces/bottleneck-options.interface.js +4 -0
  29. package/dist/lib/bottleneck/services/bottleneck.service.d.ts +14 -0
  30. package/dist/lib/bottleneck/services/bottleneck.service.js +93 -0
  31. package/dist/lib/index.d.ts +1 -0
  32. package/dist/lib/index.js +1 -0
  33. package/dist/tsconfig.tsbuildinfo +1 -1
  34. package/package.json +2 -1
@@ -3,6 +3,7 @@ export declare function CustomApiResponse({ options, }: {
3
3
  status: number;
4
4
  description: string;
5
5
  responseDto: any;
6
+ metadata?: any;
6
7
  isArray?: boolean;
7
8
  };
8
9
  }): (target: any, key?: string, descriptor?: PropertyDescriptor) => void;
@@ -27,6 +27,11 @@ function CustomApiResponse({ options, }) {
27
27
  {
28
28
  properties: {
29
29
  data: dataSchema,
30
+ metadata: options.metadata
31
+ ? {
32
+ $ref: (0, swagger_1.getSchemaPath)(options.metadata),
33
+ }
34
+ : undefined,
30
35
  },
31
36
  },
32
37
  ],
@@ -21,3 +21,8 @@ __decorate([
21
21
  (0, class_validator_1.IsOptional)(),
22
22
  __metadata("design:type", Boolean)
23
23
  ], BaseRequest.prototype, "isActive", void 0);
24
+ __decorate([
25
+ (0, swagger_1.ApiProperty)({ example: {} }),
26
+ (0, class_validator_1.IsOptional)(),
27
+ __metadata("design:type", Object)
28
+ ], BaseRequest.prototype, "metadata", void 0);
@@ -6,3 +6,4 @@ export * from './validation.dto';
6
6
  export * from './kafka-success-response.dto';
7
7
  export * from './kafka-failed-response.dto';
8
8
  export * from './iam-context.dto';
9
+ export * from './paginate-metadata-response.dto';
@@ -22,3 +22,4 @@ __exportStar(require("./validation.dto"), exports);
22
22
  __exportStar(require("./kafka-success-response.dto"), exports);
23
23
  __exportStar(require("./kafka-failed-response.dto"), exports);
24
24
  __exportStar(require("./iam-context.dto"), exports);
25
+ __exportStar(require("./paginate-metadata-response.dto"), exports);
@@ -0,0 +1,12 @@
1
+ import { PaginatedMetaDocumented } from 'nestjs-paginate';
2
+ declare class PaginatedMetadataLinksDocumented {
3
+ first?: string;
4
+ previous?: string;
5
+ current: string;
6
+ next?: string;
7
+ last?: string;
8
+ }
9
+ export declare class PaginateMetadataResponseDto extends PaginatedMetaDocumented<any> {
10
+ links: PaginatedMetadataLinksDocumented;
11
+ }
12
+ export {};
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PaginateMetadataResponseDto = void 0;
13
+ const nestjs_paginate_1 = require("nestjs-paginate");
14
+ const swagger_1 = require("@nestjs/swagger");
15
+ class PaginatedMetadataLinksDocumented {
16
+ }
17
+ __decorate([
18
+ (0, swagger_1.ApiResponseProperty)({ type: String }),
19
+ __metadata("design:type", String)
20
+ ], PaginatedMetadataLinksDocumented.prototype, "first", void 0);
21
+ __decorate([
22
+ (0, swagger_1.ApiResponseProperty)({ type: String }),
23
+ __metadata("design:type", String)
24
+ ], PaginatedMetadataLinksDocumented.prototype, "previous", void 0);
25
+ __decorate([
26
+ (0, swagger_1.ApiResponseProperty)({ type: String }),
27
+ __metadata("design:type", String)
28
+ ], PaginatedMetadataLinksDocumented.prototype, "current", void 0);
29
+ __decorate([
30
+ (0, swagger_1.ApiResponseProperty)({ type: String }),
31
+ __metadata("design:type", String)
32
+ ], PaginatedMetadataLinksDocumented.prototype, "next", void 0);
33
+ __decorate([
34
+ (0, swagger_1.ApiResponseProperty)({ type: String }),
35
+ __metadata("design:type", String)
36
+ ], PaginatedMetadataLinksDocumented.prototype, "last", void 0);
37
+ class PaginateMetadataResponseDto extends nestjs_paginate_1.PaginatedMetaDocumented {
38
+ }
39
+ exports.PaginateMetadataResponseDto = PaginateMetadataResponseDto;
40
+ __decorate([
41
+ (0, swagger_1.ApiResponseProperty)({ type: PaginatedMetadataLinksDocumented }),
42
+ __metadata("design:type", PaginatedMetadataLinksDocumented)
43
+ ], PaginateMetadataResponseDto.prototype, "links", void 0);
@@ -1,9 +1,9 @@
1
- export declare class BaseSuccessResponse<type> {
2
- data: type;
3
- metadata: object;
1
+ export declare class BaseSuccessResponse<dataType, metaType = any> {
2
+ data: dataType;
3
+ metadata: metaType;
4
4
  message: string;
5
5
  status: number;
6
6
  }
7
- export declare class SuccessResponse<type> extends BaseSuccessResponse<type> {
8
- constructor(data: type, message?: string, status?: number, metadata?: any);
7
+ export declare class SuccessResponse<dataType, metaType = any> extends BaseSuccessResponse<dataType, metaType> {
8
+ constructor(data: dataType, message?: string, status?: number, metadata?: metaType);
9
9
  }
@@ -0,0 +1,8 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { BottleneckModuleAsyncOptions, BottleneckModuleOptions } from './interfaces/bottleneck-options.interface';
3
+ export declare class BottleneckModule {
4
+ static register(options: BottleneckModuleOptions): DynamicModule;
5
+ static registerAsync(options: BottleneckModuleAsyncOptions): DynamicModule;
6
+ private static createAsyncOptionsProvider;
7
+ private static createAsyncProviders;
8
+ }
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var BottleneckModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.BottleneckModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const bottleneck_service_1 = require("./services/bottleneck.service");
13
+ const bottleneck_options_interface_1 = require("./interfaces/bottleneck-options.interface");
14
+ const bottleneck_interceptor_1 = require("./interceptors/bottleneck.interceptor");
15
+ const core_1 = require("@nestjs/core");
16
+ const queued_command_bus_1 = require("./cqrs-wrapper/queued-command-bus");
17
+ const queued_query_bus_1 = require("./cqrs-wrapper/queued-query-bus");
18
+ const cqrs_1 = require("@nestjs/cqrs");
19
+ let BottleneckModule = BottleneckModule_1 = class BottleneckModule {
20
+ static register(options) {
21
+ return {
22
+ module: BottleneckModule_1,
23
+ imports: [cqrs_1.CqrsModule],
24
+ providers: [
25
+ bottleneck_service_1.BottleneckService,
26
+ queued_command_bus_1.QueuedCommandBus,
27
+ queued_query_bus_1.QueuedQueryBus,
28
+ {
29
+ provide: core_1.APP_INTERCEPTOR,
30
+ useClass: bottleneck_interceptor_1.BottleneckInterceptor,
31
+ },
32
+ {
33
+ provide: bottleneck_options_interface_1.BOTTLENECK_MODULE_OPTIONS,
34
+ useValue: options,
35
+ },
36
+ ],
37
+ controllers: [],
38
+ exports: [],
39
+ };
40
+ }
41
+ static registerAsync(options) {
42
+ const asyncOptionsProvider = this.createAsyncOptionsProvider(options);
43
+ return {
44
+ module: BottleneckModule_1,
45
+ imports: [...(options.imports || []), asyncOptionsProvider],
46
+ providers: [],
47
+ controllers: [],
48
+ exports: [],
49
+ };
50
+ }
51
+ static createAsyncOptionsProvider(options) {
52
+ const providers = this.createAsyncProviders(options);
53
+ return {
54
+ module: BottleneckModule_1,
55
+ imports: [cqrs_1.CqrsModule],
56
+ providers,
57
+ exports: [bottleneck_options_interface_1.BOTTLENECK_MODULE_OPTIONS, queued_command_bus_1.QueuedCommandBus, queued_query_bus_1.QueuedQueryBus],
58
+ };
59
+ }
60
+ static createAsyncProviders(options) {
61
+ if (options.useFactory) {
62
+ return [
63
+ bottleneck_service_1.BottleneckService,
64
+ queued_command_bus_1.QueuedCommandBus,
65
+ queued_query_bus_1.QueuedQueryBus,
66
+ {
67
+ provide: core_1.APP_INTERCEPTOR,
68
+ useClass: bottleneck_interceptor_1.BottleneckInterceptor,
69
+ },
70
+ {
71
+ provide: bottleneck_options_interface_1.BOTTLENECK_MODULE_OPTIONS,
72
+ useFactory: options.useFactory,
73
+ inject: options.inject || [],
74
+ },
75
+ ];
76
+ }
77
+ const useClass = options.useClass || options.useExisting;
78
+ if (useClass) {
79
+ return [
80
+ bottleneck_service_1.BottleneckService,
81
+ queued_command_bus_1.QueuedCommandBus,
82
+ queued_query_bus_1.QueuedQueryBus,
83
+ {
84
+ provide: bottleneck_options_interface_1.BOTTLENECK_MODULE_OPTIONS,
85
+ useFactory: async (optionsFactory) => await optionsFactory.createModuleOptions(),
86
+ inject: [options.useExisting || options.useClass],
87
+ },
88
+ {
89
+ provide: core_1.APP_INTERCEPTOR,
90
+ useClass: bottleneck_interceptor_1.BottleneckInterceptor,
91
+ },
92
+ ...(options.useClass
93
+ ? [
94
+ {
95
+ provide: options.useClass,
96
+ useClass: options.useClass,
97
+ },
98
+ ]
99
+ : []),
100
+ ];
101
+ }
102
+ throw new Error('Invalid BottleneckModuleAsyncOptions');
103
+ }
104
+ };
105
+ exports.BottleneckModule = BottleneckModule;
106
+ exports.BottleneckModule = BottleneckModule = BottleneckModule_1 = __decorate([
107
+ (0, common_1.Global)(),
108
+ (0, common_1.Module)({})
109
+ ], BottleneckModule);
@@ -0,0 +1,3 @@
1
+ export declare const SKIP_CART_BOTTLENECK_KEY = "skipCartBottleneck";
2
+ export declare const USE_CART_BOTTLENECK_KEY = "useCartBottleneck";
3
+ export declare const CONFIG_CART_BOTTLENECK_KEY = "configCartBottleneck";
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG_CART_BOTTLENECK_KEY = exports.USE_CART_BOTTLENECK_KEY = exports.SKIP_CART_BOTTLENECK_KEY = void 0;
4
+ exports.SKIP_CART_BOTTLENECK_KEY = 'skipCartBottleneck';
5
+ exports.USE_CART_BOTTLENECK_KEY = 'useCartBottleneck';
6
+ exports.CONFIG_CART_BOTTLENECK_KEY = 'configCartBottleneck';
@@ -0,0 +1,8 @@
1
+ import { CommandBus } from '@nestjs/cqrs';
2
+ import { BottleneckService } from '../services/bottleneck.service';
3
+ export declare class QueuedCommandBus {
4
+ private readonly commandBus;
5
+ private readonly bottleneckService;
6
+ constructor(commandBus: CommandBus, bottleneckService: BottleneckService);
7
+ execute<TCommand, TResult = any>(command: TCommand): Promise<TResult>;
8
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QueuedCommandBus = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const cqrs_1 = require("@nestjs/cqrs");
15
+ const bottleneck_service_1 = require("../services/bottleneck.service");
16
+ let QueuedCommandBus = class QueuedCommandBus {
17
+ constructor(commandBus, bottleneckService) {
18
+ this.commandBus = commandBus;
19
+ this.bottleneckService = bottleneckService;
20
+ }
21
+ async execute(command) {
22
+ const key = `${command.constructor.name}:${JSON.stringify(command)}`;
23
+ return this.bottleneckService.runQueuedTask(key, async () => this.commandBus.execute(command));
24
+ }
25
+ };
26
+ exports.QueuedCommandBus = QueuedCommandBus;
27
+ exports.QueuedCommandBus = QueuedCommandBus = __decorate([
28
+ (0, common_1.Injectable)(),
29
+ __metadata("design:paramtypes", [cqrs_1.CommandBus,
30
+ bottleneck_service_1.BottleneckService])
31
+ ], QueuedCommandBus);
@@ -0,0 +1,8 @@
1
+ import { QueryBus } from '@nestjs/cqrs';
2
+ import { BottleneckService } from '../services/bottleneck.service';
3
+ export declare class QueuedQueryBus {
4
+ private readonly queryBus;
5
+ private readonly bottleneckService;
6
+ constructor(queryBus: QueryBus, bottleneckService: BottleneckService);
7
+ execute<TCommand, TResult = any>(command: TCommand): Promise<TResult>;
8
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QueuedQueryBus = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const cqrs_1 = require("@nestjs/cqrs");
15
+ const bottleneck_service_1 = require("../services/bottleneck.service");
16
+ let QueuedQueryBus = class QueuedQueryBus {
17
+ constructor(queryBus, bottleneckService) {
18
+ this.queryBus = queryBus;
19
+ this.bottleneckService = bottleneckService;
20
+ }
21
+ async execute(command) {
22
+ const key = `${command.constructor.name}:${JSON.stringify(command)}`;
23
+ return this.bottleneckService.runQueuedTask(key, async () => this.queryBus.execute(command));
24
+ }
25
+ };
26
+ exports.QueuedQueryBus = QueuedQueryBus;
27
+ exports.QueuedQueryBus = QueuedQueryBus = __decorate([
28
+ (0, common_1.Injectable)(),
29
+ __metadata("design:paramtypes", [cqrs_1.QueryBus,
30
+ bottleneck_service_1.BottleneckService])
31
+ ], QueuedQueryBus);
@@ -0,0 +1,2 @@
1
+ import { BottleneckModuleOptions } from '../interfaces/bottleneck-options.interface';
2
+ export declare const ConfigBottleneckDecorator: (config?: BottleneckModuleOptions) => import("@nestjs/common").CustomDecorator<string>;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigBottleneckDecorator = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const bottleneck_const_1 = require("../constants/bottleneck.const");
6
+ const ConfigBottleneckDecorator = (config) => (0, common_1.SetMetadata)(bottleneck_const_1.CONFIG_CART_BOTTLENECK_KEY, config);
7
+ exports.ConfigBottleneckDecorator = ConfigBottleneckDecorator;
@@ -0,0 +1 @@
1
+ export declare const SkipBottleneckDecorator: () => import("@nestjs/common").CustomDecorator<string>;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SkipBottleneckDecorator = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const bottleneck_const_1 = require("../constants/bottleneck.const");
6
+ const SkipBottleneckDecorator = () => (0, common_1.SetMetadata)(bottleneck_const_1.SKIP_CART_BOTTLENECK_KEY, true);
7
+ exports.SkipBottleneckDecorator = SkipBottleneckDecorator;
@@ -0,0 +1 @@
1
+ export declare const UseBottleneckDecorator: () => import("@nestjs/common").CustomDecorator<string>;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UseBottleneckDecorator = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const bottleneck_const_1 = require("../constants/bottleneck.const");
6
+ const UseBottleneckDecorator = () => (0, common_1.SetMetadata)(bottleneck_const_1.USE_CART_BOTTLENECK_KEY, true);
7
+ exports.UseBottleneckDecorator = UseBottleneckDecorator;
@@ -0,0 +1,10 @@
1
+ export * from './bottleneck.module';
2
+ export * from './services/bottleneck.service';
3
+ export * from './interceptors/bottleneck.interceptor';
4
+ export * from './constants/bottleneck.const';
5
+ export * from './interfaces/bottleneck-options.interface';
6
+ export * from './decorators/config-bottleneck.decorator';
7
+ export * from './cqrs-wrapper/queued-command-bus';
8
+ export * from './cqrs-wrapper/queued-query-bus';
9
+ export * from './decorators/skip-bottleneck.decorator';
10
+ export * from './decorators/use-bottleneck.decorator';
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./bottleneck.module"), exports);
18
+ __exportStar(require("./services/bottleneck.service"), exports);
19
+ __exportStar(require("./interceptors/bottleneck.interceptor"), exports);
20
+ __exportStar(require("./constants/bottleneck.const"), exports);
21
+ __exportStar(require("./interfaces/bottleneck-options.interface"), exports);
22
+ __exportStar(require("./decorators/config-bottleneck.decorator"), exports);
23
+ __exportStar(require("./cqrs-wrapper/queued-command-bus"), exports);
24
+ __exportStar(require("./cqrs-wrapper/queued-query-bus"), exports);
25
+ __exportStar(require("./decorators/skip-bottleneck.decorator"), exports);
26
+ __exportStar(require("./decorators/use-bottleneck.decorator"), exports);
@@ -0,0 +1,12 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { BottleneckService } from '../services/bottleneck.service';
3
+ import { Reflector } from '@nestjs/core';
4
+ import { BottleneckModuleOptions } from '../interfaces/bottleneck-options.interface';
5
+ export declare class BottleneckInterceptor implements NestInterceptor {
6
+ private readonly options;
7
+ private readonly bottleneckService;
8
+ private readonly reflector;
9
+ private readonly logger;
10
+ constructor(options: BottleneckModuleOptions, bottleneckService: BottleneckService, reflector: Reflector);
11
+ intercept(ctx: ExecutionContext, next: CallHandler): import("rxjs").Observable<any>;
12
+ }
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var BottleneckInterceptor_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.BottleneckInterceptor = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const rxjs_1 = require("rxjs");
19
+ const bottleneck_service_1 = require("../services/bottleneck.service");
20
+ const core_1 = require("@nestjs/core");
21
+ const bottleneck_const_1 = require("../constants/bottleneck.const");
22
+ const bottleneck_options_interface_1 = require("../interfaces/bottleneck-options.interface");
23
+ let BottleneckInterceptor = BottleneckInterceptor_1 = class BottleneckInterceptor {
24
+ constructor(options, bottleneckService, reflector) {
25
+ this.options = options;
26
+ this.bottleneckService = bottleneckService;
27
+ this.reflector = reflector;
28
+ this.logger = new common_1.Logger(BottleneckInterceptor_1.name);
29
+ }
30
+ intercept(ctx, next) {
31
+ const host = ctx.getType();
32
+ if (host !== 'http') {
33
+ return next.handle();
34
+ }
35
+ const skip = this.reflector.getAllAndOverride(bottleneck_const_1.SKIP_CART_BOTTLENECK_KEY, [ctx.getHandler(), ctx.getClass()]);
36
+ const useBottleneck = this.reflector.getAllAndOverride(bottleneck_const_1.USE_CART_BOTTLENECK_KEY, [ctx.getHandler(), ctx.getClass()]);
37
+ const config = this.reflector.getAllAndOverride(bottleneck_const_1.CONFIG_CART_BOTTLENECK_KEY, [ctx.getHandler(), ctx.getClass()]);
38
+ const { basePath, paramKey, useGlobal, maxConcurrent, minTime, ...rest } = {
39
+ ...this.options,
40
+ ...config,
41
+ };
42
+ const url = ctx?.switchToHttp()?.getRequest()?.url;
43
+ if (skip || !(useBottleneck || useGlobal)) {
44
+ this.logger.debug(`🚀 Skipping Bottleneck for request: ${url}`);
45
+ return next.handle();
46
+ }
47
+ const req = ctx.switchToHttp().getRequest();
48
+ const param = req.params?.[paramKey];
49
+ if (!param) {
50
+ throw new common_1.ServiceUnavailableException(`${paramKey} is required in request: ${url}`);
51
+ }
52
+ const key = `${basePath}/${paramKey}:${param}`;
53
+ const bottleneckOptions = {
54
+ maxQueueSize: 100,
55
+ maxConcurrent: maxConcurrent || 1,
56
+ minTime: minTime || 0,
57
+ ...rest,
58
+ };
59
+ const method = req.method || 'UNKNOWN';
60
+ const start = Date.now();
61
+ this.logger.debug(`🔁 [Bottleneck] Scheduling job for key="${key}" method=${method} url=${url}`);
62
+ return (0, rxjs_1.from)(this.bottleneckService
63
+ .scheduleForKey(key, async () => (0, rxjs_1.lastValueFrom)(next.handle()), bottleneckOptions)
64
+ .catch((err) => {
65
+ if (String(err?.message || '').includes('This limiter is at max capacity')) {
66
+ throw new common_1.ServiceUnavailableException('Too many requests queued for this order. Try again soon.');
67
+ }
68
+ throw err;
69
+ })
70
+ .finally(() => {
71
+ const duration = Date.now() - start;
72
+ this.logger.debug(`✅ [Bottleneck] Finished job for key="${key}" method=${method} url=${url} duration=${duration}ms`);
73
+ }));
74
+ }
75
+ };
76
+ exports.BottleneckInterceptor = BottleneckInterceptor;
77
+ exports.BottleneckInterceptor = BottleneckInterceptor = BottleneckInterceptor_1 = __decorate([
78
+ (0, common_1.Injectable)(),
79
+ __param(0, (0, common_1.Inject)(bottleneck_options_interface_1.BOTTLENECK_MODULE_OPTIONS)),
80
+ __metadata("design:paramtypes", [Object, bottleneck_service_1.BottleneckService,
81
+ core_1.Reflector])
82
+ ], BottleneckInterceptor);
@@ -0,0 +1,39 @@
1
+ import { ModuleMetadata, Type } from '@nestjs/common';
2
+ export declare const BOTTLENECK_MODULE_OPTIONS = "BOTTLENECK_MODULE_OPTIONS";
3
+ export interface BottleneckModuleOptions {
4
+ appName?: string;
5
+ basePath?: string;
6
+ paramKey?: string;
7
+ useGlobal?: boolean;
8
+ maxConcurrent?: number | null;
9
+ minTime?: number | null;
10
+ highWater?: number | null;
11
+ penalty?: number | null;
12
+ reservoir?: number | null;
13
+ reservoirRefreshInterval?: number | null;
14
+ reservoirRefreshAmount?: number | null;
15
+ reservoirIncreaseAmount?: number | null;
16
+ reservoirIncreaseInterval?: number | null;
17
+ reservoirIncreaseMaximum?: number | null;
18
+ rejectOnDrop?: boolean | null;
19
+ trackDoneStatus?: boolean | null;
20
+ useRedis?: boolean;
21
+ redis?: {
22
+ host: string;
23
+ port: number;
24
+ username?: string;
25
+ password?: string;
26
+ database?: number;
27
+ ttl?: number;
28
+ tls?: boolean;
29
+ };
30
+ }
31
+ export interface BottleneckModuleFactory {
32
+ createModuleOptions: () => Promise<BottleneckModuleOptions> | BottleneckModuleOptions;
33
+ }
34
+ export interface BottleneckModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
35
+ inject?: any[];
36
+ useClass?: Type<BottleneckModuleFactory>;
37
+ useExisting?: Type<BottleneckModuleFactory>;
38
+ useFactory?: (...args: any[]) => Promise<BottleneckModuleOptions> | BottleneckModuleOptions;
39
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BOTTLENECK_MODULE_OPTIONS = void 0;
4
+ exports.BOTTLENECK_MODULE_OPTIONS = 'BOTTLENECK_MODULE_OPTIONS';
@@ -0,0 +1,14 @@
1
+ import { OnModuleDestroy } from '@nestjs/common';
2
+ import Bottleneck from 'bottleneck';
3
+ import { BottleneckModuleOptions } from '../interfaces/bottleneck-options.interface';
4
+ export declare class BottleneckService implements OnModuleDestroy {
5
+ private readonly options;
6
+ private readonly logger;
7
+ private readonly group;
8
+ private readonly cache;
9
+ constructor(options: BottleneckModuleOptions);
10
+ private getLimiter;
11
+ scheduleForKey<T>(key: string, task: () => Promise<T>, opts?: Bottleneck.ConstructorOptions): Promise<T>;
12
+ runQueuedTask<T>(key: string, fn: () => Promise<T>): Promise<T>;
13
+ onModuleDestroy(): Promise<void>;
14
+ }