nestjs-power-queues 1.0.10 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,2 +1,144 @@
1
- # NestjsPowerQueues
2
- ## NestJS wrapper for PowerQueues.
1
+ # nestjs-power-queues — Secure, Scalable & Production‑Ready power-queues Integration for NestJS
2
+
3
+ This module is a **dedicated, production-ready NestJS wrapper around `power-queues`** — a high‑performance Redis abstraction layer for Node.js.
4
+
5
+ It is a **structured, type-safe, and feature-rich integration** designed specifically to bring all the power of `power-queues` into the NestJS ecosystem with zero friction.
6
+
7
+ # 📦 Installation
8
+
9
+ ```bash
10
+ npm install nestjs-power-queues
11
+ ```
12
+
13
+ # 🧪 Quick Start Example
14
+
15
+ ## For example, you need to specify 2 connections: `queues1` and `queues2`
16
+
17
+ ### 1. 🔐 Environment Variables (power-redis -Friendly)
18
+
19
+ Everything is configured using environment variables:
20
+
21
+ ```env
22
+ REDIS_<NAME>_HOST=127.0.0.1
23
+ REDIS_<NAME>_PORT=6379
24
+ REDIS_<NAME>_PASSWORD=pass
25
+ REDIS_<NAME>_DATABASE=0
26
+
27
+ # TLS
28
+ REDIS_<NAME>_TLS_CRT=/etc/ssl/client.crt
29
+ REDIS_<NAME>_TLS_KEY=/etc/ssl/client.key
30
+ REDIS_<NAME>_TLS_CA_CRT=/etc/ssl/ca.crt
31
+ ```
32
+
33
+ Instead of `<NAME>` you need to specify a custom connection name and then specify these names in `QueueModule.forRoot` (allowed in lowercase).
34
+ For example:
35
+
36
+ ```env
37
+ REDIS_QUEUES1_HOST=127.0.0.1
38
+ REDIS_QUEUES1_PORT=6379
39
+ REDIS_QUEUES1_PASSWORD=
40
+ REDIS_QUEUES1_DATABASE=0
41
+
42
+ REDIS_QUEUES2_HOST=127.0.0.1
43
+ REDIS_QUEUES2_PORT=6379
44
+ REDIS_QUEUES2_PASSWORD=
45
+ REDIS_QUEUES2_DATABASE=0
46
+ ```
47
+
48
+ TLS fields are optional.
49
+
50
+ ---
51
+
52
+ ### 2. Register module with multiple Redis clients
53
+
54
+ ```ts
55
+ import { QueueModule } from 'nestjs-power-queues';
56
+
57
+ @Module({
58
+ imports: [
59
+ QueueModule.forRoot([ 'queues1', 'queues2' ]),
60
+ ],
61
+ })
62
+ export class AppModule {}
63
+ ```
64
+
65
+ ---
66
+
67
+ ### 3. Inject in a service
68
+
69
+ ```ts
70
+ import { Injectable } from '@nestjs/common';
71
+ import {
72
+ InjectQueue,
73
+ QueueService,
74
+ } from 'nestjs-power-queues';
75
+
76
+ @Injectable()
77
+ export class MyService {
78
+ constructor(
79
+ @InjectQueue('queues1') private readonly queueService1: QueueService,
80
+ @InjectQueue('queues2') private readonly queueService2: QueueService,
81
+ ) {}
82
+
83
+ async test() {
84
+ await this.queueService1.addTasks('example:jobs', [
85
+ { payload },
86
+ ]);
87
+ }
88
+ }
89
+ ```
90
+
91
+ ### 3. Create job processor
92
+
93
+ ```ts
94
+ import { Injectable } from '@nestjs/common';
95
+ import {
96
+ InjectRedis,
97
+ RedisService,
98
+ } from 'nestjs-power-redis';
99
+ import { QueueService } from 'nestjs-power-queues';
100
+
101
+ @Injectable()
102
+ export class MyService extends QueueService {
103
+ public readonly stream: string = `example:jobs`;
104
+ public readonly workerBatchTasksCount: number = 8192;
105
+ public readonly runOnInit: boolean = true;
106
+ public readonly executeBatchAtOnce: boolean = true;
107
+
108
+ constructor(
109
+ @InjectRedis('queues1') public readonly redisService: RedisService,
110
+ ) {}
111
+
112
+ async onExecute(id, payload) {
113
+ // business-logic
114
+ }
115
+ }
116
+ ```
117
+
118
+ The `runOnInit` parameter determines whether queue processing should start immediately after the application starts.
119
+
120
+ ---
121
+
122
+ ## 🏗️ How It Works Internally
123
+
124
+ ### queueRoot()
125
+ Loads all Redis configurations based on environment variables, applies TLS if present, and sets reconnection strategies.
126
+
127
+ ### RedisModule.forRoot()
128
+ Creates dynamic providers for each Redis connection:
129
+ ```
130
+ RedisQueue_queues1
131
+ RedisQueue_queues2
132
+ ```
133
+
134
+ These providers are available through:
135
+ ```ts
136
+ @InjectQueue('queues1')
137
+ @InjectQueue('queues2')
138
+ ```
139
+
140
+ ---
141
+
142
+ ## 📜 License
143
+
144
+ MIT - free for commercial and private use.
package/dist/index.cjs CHANGED
@@ -23,44 +23,38 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
23
23
  // src/index.ts
24
24
  var index_exports = {};
25
25
  __export(index_exports, {
26
+ InjectQueue: () => InjectQueue,
26
27
  QueueModule: () => QueueModule,
27
28
  QueueService: () => QueueService,
28
- redisRoot: () => import_nestjs_power_redis3.redisRoot
29
+ getQueueToken: () => getQueueToken,
30
+ queueRoot: () => import_nestjs_power_redis2.redisRoot
29
31
  });
30
32
  module.exports = __toCommonJS(index_exports);
31
- var import_nestjs_power_redis3 = require("nestjs-power-redis");
33
+ var import_nestjs_power_redis2 = require("nestjs-power-redis");
34
+
35
+ // src/InjectQueue.ts
36
+ var import_common = require("@nestjs/common");
37
+ var getQueueToken = /* @__PURE__ */ __name((name) => `QueueService_${name}`, "getQueueToken");
38
+ var InjectQueue = /* @__PURE__ */ __name((name) => (0, import_common.Inject)(getQueueToken(name)), "InjectQueue");
32
39
 
33
40
  // src/QueueModule.ts
34
- var import_common2 = require("@nestjs/common");
35
- var import_nestjs_power_redis2 = require("nestjs-power-redis");
41
+ var import_common3 = require("@nestjs/common");
42
+ var import_nestjs_power_redis = require("nestjs-power-redis");
36
43
 
37
44
  // src/QueueService.ts
38
- var import_common = require("@nestjs/common");
45
+ var import_common2 = require("@nestjs/common");
39
46
  var import_power_queues = require("power-queues");
40
- var import_nestjs_power_redis = require("nestjs-power-redis");
41
- function _ts_decorate(decorators, target, key, desc) {
42
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
43
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
44
- 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;
45
- return c > 3 && r && Object.defineProperty(target, key, r), r;
46
- }
47
- __name(_ts_decorate, "_ts_decorate");
48
- function _ts_metadata(k, v) {
49
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
50
- }
51
- __name(_ts_metadata, "_ts_metadata");
52
47
  var _QueueService = class _QueueService extends import_power_queues.PowerQueues {
53
48
  constructor(redisService) {
54
49
  super();
55
50
  __publicField(this, "redisService");
56
- __publicField(this, "logger", new import_common.Logger("QueueService"));
51
+ __publicField(this, "logger", new import_common2.Logger("QueueService"));
57
52
  __publicField(this, "runOnInit", false);
58
53
  __publicField(this, "redis");
59
- __publicField(this, "abort", new AbortController());
60
54
  this.redisService = redisService;
55
+ this.redis = redisService.redis;
61
56
  }
62
57
  async onModuleInit() {
63
- this.redis = this.redisService.redis;
64
58
  await this.loadScripts(this.runOnInit);
65
59
  if (this.runOnInit) {
66
60
  await this.runQueue();
@@ -74,48 +68,51 @@ var _QueueService = class _QueueService extends import_power_queues.PowerQueues
74
68
  };
75
69
  __name(_QueueService, "QueueService");
76
70
  var QueueService = _QueueService;
77
- QueueService = _ts_decorate([
78
- (0, import_common.Injectable)(),
79
- _ts_metadata("design:type", Function),
80
- _ts_metadata("design:paramtypes", [
81
- typeof import_nestjs_power_redis.RedisService === "undefined" ? Object : import_nestjs_power_redis.RedisService
82
- ])
83
- ], QueueService);
84
71
 
85
72
  // src/QueueModule.ts
86
- function _ts_decorate2(decorators, target, key, desc) {
73
+ function _ts_decorate(decorators, target, key, desc) {
87
74
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
88
75
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
89
76
  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;
90
77
  return c > 3 && r && Object.defineProperty(target, key, r), r;
91
78
  }
92
- __name(_ts_decorate2, "_ts_decorate");
79
+ __name(_ts_decorate, "_ts_decorate");
93
80
  var _QueueModule = class _QueueModule {
94
81
  static forRoot(names) {
82
+ const queueProviders = names.map((name) => ({
83
+ provide: getQueueToken(name),
84
+ useFactory: /* @__PURE__ */ __name((redisService) => {
85
+ return new QueueService(redisService);
86
+ }, "useFactory"),
87
+ inject: [
88
+ (0, import_nestjs_power_redis.getRedisToken)(name)
89
+ ]
90
+ }));
95
91
  return {
96
92
  module: _QueueModule,
97
93
  imports: [
98
- ...(0, import_nestjs_power_redis2.redisRoot)(names)
94
+ import_nestjs_power_redis.RedisModule.forRoot(names)
99
95
  ],
100
96
  providers: [
101
- import_nestjs_power_redis2.RedisService,
102
- QueueService
97
+ ...queueProviders
103
98
  ],
104
99
  exports: [
105
- import_nestjs_power_redis2.RedisService,
106
- QueueService
100
+ ...queueProviders,
101
+ import_nestjs_power_redis.RedisModule
107
102
  ]
108
103
  };
109
104
  }
110
105
  };
111
106
  __name(_QueueModule, "QueueModule");
112
107
  var QueueModule = _QueueModule;
113
- QueueModule = _ts_decorate2([
114
- (0, import_common2.Module)({})
108
+ QueueModule = _ts_decorate([
109
+ (0, import_common3.Module)({})
115
110
  ], QueueModule);
116
111
  // Annotate the CommonJS export names for ESM import in node:
117
112
  0 && (module.exports = {
113
+ InjectQueue,
118
114
  QueueModule,
119
115
  QueueService,
120
- redisRoot
116
+ getQueueToken,
117
+ queueRoot
121
118
  });
package/dist/index.d.cts CHANGED
@@ -1,9 +1,12 @@
1
1
  import { RedisService } from 'nestjs-power-redis';
2
- export { redisRoot } from 'nestjs-power-redis';
2
+ export { redisRoot as queueRoot } from 'nestjs-power-redis';
3
3
  import { DynamicModule, OnModuleInit, OnModuleDestroy, Logger } from '@nestjs/common';
4
4
  import { IORedisLike } from 'power-redis';
5
5
  import { PowerQueues } from 'power-queues';
6
6
 
7
+ declare const getQueueToken: (name: string) => string;
8
+ declare const InjectQueue: (name: string) => PropertyDecorator & ParameterDecorator;
9
+
7
10
  declare class QueueModule {
8
11
  static forRoot(names: string[]): DynamicModule;
9
12
  }
@@ -13,10 +16,9 @@ declare class QueueService extends PowerQueues implements OnModuleInit, OnModule
13
16
  readonly logger: Logger;
14
17
  readonly runOnInit: boolean;
15
18
  redis: IORedisLike;
16
- abort: AbortController;
17
19
  constructor(redisService: RedisService);
18
20
  onModuleInit(): Promise<void>;
19
21
  onModuleDestroy(): Promise<void>;
20
22
  }
21
23
 
22
- export { QueueModule, QueueService };
24
+ export { InjectQueue, QueueModule, QueueService, getQueueToken };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,12 @@
1
1
  import { RedisService } from 'nestjs-power-redis';
2
- export { redisRoot } from 'nestjs-power-redis';
2
+ export { redisRoot as queueRoot } from 'nestjs-power-redis';
3
3
  import { DynamicModule, OnModuleInit, OnModuleDestroy, Logger } from '@nestjs/common';
4
4
  import { IORedisLike } from 'power-redis';
5
5
  import { PowerQueues } from 'power-queues';
6
6
 
7
+ declare const getQueueToken: (name: string) => string;
8
+ declare const InjectQueue: (name: string) => PropertyDecorator & ParameterDecorator;
9
+
7
10
  declare class QueueModule {
8
11
  static forRoot(names: string[]): DynamicModule;
9
12
  }
@@ -13,10 +16,9 @@ declare class QueueService extends PowerQueues implements OnModuleInit, OnModule
13
16
  readonly logger: Logger;
14
17
  readonly runOnInit: boolean;
15
18
  redis: IORedisLike;
16
- abort: AbortController;
17
19
  constructor(redisService: RedisService);
18
20
  onModuleInit(): Promise<void>;
19
21
  onModuleDestroy(): Promise<void>;
20
22
  }
21
23
 
22
- export { QueueModule, QueueService };
24
+ export { InjectQueue, QueueModule, QueueService, getQueueToken };
package/dist/index.js CHANGED
@@ -4,27 +4,20 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
 
6
6
  // src/index.ts
7
- import { redisRoot as redisRoot2 } from "nestjs-power-redis";
7
+ import { redisRoot as queueRoot } from "nestjs-power-redis";
8
+
9
+ // src/InjectQueue.ts
10
+ import { Inject } from "@nestjs/common";
11
+ var getQueueToken = /* @__PURE__ */ __name((name) => `QueueService_${name}`, "getQueueToken");
12
+ var InjectQueue = /* @__PURE__ */ __name((name) => Inject(getQueueToken(name)), "InjectQueue");
8
13
 
9
14
  // src/QueueModule.ts
10
15
  import { Module } from "@nestjs/common";
11
- import { redisRoot, RedisService as RedisService2 } from "nestjs-power-redis";
16
+ import { RedisModule, getRedisToken } from "nestjs-power-redis";
12
17
 
13
18
  // src/QueueService.ts
14
- import { Injectable, Logger } from "@nestjs/common";
19
+ import { Logger } from "@nestjs/common";
15
20
  import { PowerQueues } from "power-queues";
16
- import { RedisService } from "nestjs-power-redis";
17
- function _ts_decorate(decorators, target, key, desc) {
18
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
19
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
20
- 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;
21
- return c > 3 && r && Object.defineProperty(target, key, r), r;
22
- }
23
- __name(_ts_decorate, "_ts_decorate");
24
- function _ts_metadata(k, v) {
25
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
26
- }
27
- __name(_ts_metadata, "_ts_metadata");
28
21
  var _QueueService = class _QueueService extends PowerQueues {
29
22
  constructor(redisService) {
30
23
  super();
@@ -32,11 +25,10 @@ var _QueueService = class _QueueService extends PowerQueues {
32
25
  __publicField(this, "logger", new Logger("QueueService"));
33
26
  __publicField(this, "runOnInit", false);
34
27
  __publicField(this, "redis");
35
- __publicField(this, "abort", new AbortController());
36
28
  this.redisService = redisService;
29
+ this.redis = redisService.redis;
37
30
  }
38
31
  async onModuleInit() {
39
- this.redis = this.redisService.redis;
40
32
  await this.loadScripts(this.runOnInit);
41
33
  if (this.runOnInit) {
42
34
  await this.runQueue();
@@ -50,47 +42,50 @@ var _QueueService = class _QueueService extends PowerQueues {
50
42
  };
51
43
  __name(_QueueService, "QueueService");
52
44
  var QueueService = _QueueService;
53
- QueueService = _ts_decorate([
54
- Injectable(),
55
- _ts_metadata("design:type", Function),
56
- _ts_metadata("design:paramtypes", [
57
- typeof RedisService === "undefined" ? Object : RedisService
58
- ])
59
- ], QueueService);
60
45
 
61
46
  // src/QueueModule.ts
62
- function _ts_decorate2(decorators, target, key, desc) {
47
+ function _ts_decorate(decorators, target, key, desc) {
63
48
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
64
49
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
65
50
  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;
66
51
  return c > 3 && r && Object.defineProperty(target, key, r), r;
67
52
  }
68
- __name(_ts_decorate2, "_ts_decorate");
53
+ __name(_ts_decorate, "_ts_decorate");
69
54
  var _QueueModule = class _QueueModule {
70
55
  static forRoot(names) {
56
+ const queueProviders = names.map((name) => ({
57
+ provide: getQueueToken(name),
58
+ useFactory: /* @__PURE__ */ __name((redisService) => {
59
+ return new QueueService(redisService);
60
+ }, "useFactory"),
61
+ inject: [
62
+ getRedisToken(name)
63
+ ]
64
+ }));
71
65
  return {
72
66
  module: _QueueModule,
73
67
  imports: [
74
- ...redisRoot(names)
68
+ RedisModule.forRoot(names)
75
69
  ],
76
70
  providers: [
77
- RedisService2,
78
- QueueService
71
+ ...queueProviders
79
72
  ],
80
73
  exports: [
81
- RedisService2,
82
- QueueService
74
+ ...queueProviders,
75
+ RedisModule
83
76
  ]
84
77
  };
85
78
  }
86
79
  };
87
80
  __name(_QueueModule, "QueueModule");
88
81
  var QueueModule = _QueueModule;
89
- QueueModule = _ts_decorate2([
82
+ QueueModule = _ts_decorate([
90
83
  Module({})
91
84
  ], QueueModule);
92
85
  export {
86
+ InjectQueue,
93
87
  QueueModule,
94
88
  QueueService,
95
- redisRoot2 as redisRoot
89
+ getQueueToken,
90
+ queueRoot
96
91
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nestjs-power-queues",
3
- "version": "1.0.10",
3
+ "version": "1.0.12",
4
4
  "description": "NestJS wrapper for PowerQueues.",
5
5
  "author": "ihor-bielchenko",
6
6
  "license": "MIT",
@@ -87,8 +87,8 @@
87
87
  "dependencies": {
88
88
  "@nestjs-labs/nestjs-ioredis": "^11.0.4",
89
89
  "@nestjs/common": "^11.1.8",
90
- "full-utils": "^2.0.3",
91
- "nestjs-power-redis": "^1.0.4",
92
- "power-queues": "^2.0.12"
90
+ "full-utils": "^2.0.5",
91
+ "nestjs-power-redis": "^1.0.8",
92
+ "power-queues": "^2.0.16"
93
93
  }
94
94
  }