@nest-boot/queue-api 0.0.0-stage → 8.1.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 (36) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +115 -2
  3. package/dist/connections/job.connection-definition.d.ts +9 -0
  4. package/dist/connections/job.connection-definition.js +50 -0
  5. package/dist/connections/job.connection-definition.js.map +1 -0
  6. package/dist/decorators/queue-visible.decorator.d.ts +14 -0
  7. package/dist/decorators/queue-visible.decorator.js +20 -0
  8. package/dist/decorators/queue-visible.decorator.js.map +1 -0
  9. package/dist/entities/index.d.ts +4 -0
  10. package/dist/entities/index.js +5 -0
  11. package/dist/entities/index.js.map +1 -0
  12. package/dist/entities/job.entity.d.ts +24 -0
  13. package/dist/entities/job.entity.js +128 -0
  14. package/dist/entities/job.entity.js.map +1 -0
  15. package/dist/enums/job-status.enum.d.ts +19 -0
  16. package/dist/enums/job-status.enum.js +23 -0
  17. package/dist/enums/job-status.enum.js.map +1 -0
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.js +8 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/processors/job.processor.d.ts +18 -0
  22. package/dist/processors/job.processor.js +111 -0
  23. package/dist/processors/job.processor.js.map +1 -0
  24. package/dist/queue-api.module.d.ts +3 -0
  25. package/dist/queue-api.module.js +25 -0
  26. package/dist/queue-api.module.js.map +1 -0
  27. package/dist/queues/job.queue.d.ts +32 -0
  28. package/dist/queues/job.queue.js +65 -0
  29. package/dist/queues/job.queue.js.map +1 -0
  30. package/dist/resolvers/job.resolver.d.ts +54 -0
  31. package/dist/resolvers/job.resolver.js +145 -0
  32. package/dist/resolvers/job.resolver.js.map +1 -0
  33. package/dist/services/job.service.d.ts +77 -0
  34. package/dist/services/job.service.js +276 -0
  35. package/dist/services/job.service.js.map +1 -0
  36. package/package.json +115 -3
@@ -0,0 +1,276 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var JobService_1;
11
+ import { EntityManager, raw } from "@mikro-orm/core";
12
+ import { API_KEY, User, UserService, WorkspaceService } from "@nest-boot/auth";
13
+ import { ConnectionManager, OrderDirection, } from "@nest-boot/graphql-connection";
14
+ import { QueueManager } from "@nest-boot/queue";
15
+ import { RequestContext } from "@nest-boot/request-context";
16
+ import { BadRequestException, ForbiddenException, Injectable, Logger, } from "@nestjs/common";
17
+ import { Job as BullmqJob } from "bullmq";
18
+ import { JobConnection } from "../connections/job.connection-definition.js";
19
+ import { isQueueVisible } from "../decorators/queue-visible.decorator.js";
20
+ import { Job as JobEntity } from "../entities/job.entity.js";
21
+ import { JobStatus } from "../enums/job-status.enum.js";
22
+ import { JobQueue } from "../queues/job.queue.js";
23
+ const jobStatuses = new Map(Object.values(JobStatus).map((status) => [status, status]));
24
+ /** Manages Job history queries and forwards Redis events to the persistence queue. */
25
+ let JobService = JobService_1 = class JobService {
26
+ em;
27
+ queue;
28
+ manager;
29
+ users;
30
+ workspaces;
31
+ logger = new Logger(JobService_1.name);
32
+ sources = [];
33
+ pending = new Set();
34
+ shutdown;
35
+ constructor(em, queue, manager, users, workspaces) {
36
+ this.em = em;
37
+ this.queue = queue;
38
+ this.manager = manager;
39
+ this.users = users;
40
+ this.workspaces = workspaces;
41
+ this.queue.on("error", (error) => {
42
+ this.logger.error(error);
43
+ });
44
+ }
45
+ /**
46
+ * Reads one task belonging to the current user.
47
+ * @param id - Database-generated Job UUID.
48
+ * @returns Matching record in the authorized scope, or null.
49
+ */
50
+ async getUserJob(id) {
51
+ return await this.getScopedJob(id, this.userFilter());
52
+ }
53
+ /**
54
+ * Paginates tasks belonging to the current user.
55
+ * @param args - Cursor pagination, filters and creation-time ordering.
56
+ * @param info - GraphQL selection used to shape the query.
57
+ * @returns Nodes and counts within the same authorized scope.
58
+ */
59
+ async getUserJobConnection(args, info) {
60
+ return await this.getScopedJobConnection(this.userFilter(), args, info);
61
+ }
62
+ /**
63
+ * Reads one task in the authenticated, selected workspace.
64
+ * @param id - Database-generated Job UUID.
65
+ * @returns Matching record in the authorized scope, or null.
66
+ */
67
+ async getWorkspaceJob(id) {
68
+ return await this.getScopedJob(id, this.workspaceFilter());
69
+ }
70
+ /**
71
+ * Paginates tasks in the authenticated, selected workspace.
72
+ * @param args - Cursor pagination, filters and creation-time ordering.
73
+ * @param info - GraphQL selection used to shape the query.
74
+ * @returns Nodes and counts within the same authorized scope.
75
+ */
76
+ async getWorkspaceJobConnection(args, info) {
77
+ return await this.getScopedJobConnection(this.workspaceFilter(), args, info);
78
+ }
79
+ /**
80
+ * Reads an unowned task after checking the current administrator session.
81
+ * @param id - Database-generated Job UUID.
82
+ * @returns Matching record in the authorized scope, or null.
83
+ */
84
+ async getSystemJob(id) {
85
+ return await this.getScopedJob(id, this.systemFilter());
86
+ }
87
+ /**
88
+ * Paginates unowned tasks after checking the current administrator session.
89
+ * @param args - Cursor pagination, filters and creation-time ordering.
90
+ * @param info - GraphQL selection used to shape the query.
91
+ * @returns Nodes and counts within the same authorized scope.
92
+ */
93
+ async getSystemJobConnection(args, info) {
94
+ return await this.getScopedJobConnection(this.systemFilter(), args, info);
95
+ }
96
+ currentUser() {
97
+ const user = RequestContext.isActive()
98
+ ? RequestContext.get(User)
99
+ : undefined;
100
+ if (!user?.id) {
101
+ throw new ForbiddenException("An authenticated user is required.");
102
+ }
103
+ return user;
104
+ }
105
+ userFilter() {
106
+ return {
107
+ [raw((alias) => `${alias}."data"->>'userId'`)]: this.currentUser().id,
108
+ };
109
+ }
110
+ workspaceFilter() {
111
+ const workspace = this.workspaces.getCurrentWorkspace();
112
+ if (!workspace?.id) {
113
+ throw new ForbiddenException("An authorized current workspace is required.");
114
+ }
115
+ return {
116
+ [raw((alias) => `${alias}."data"->>'workspaceId'`)]: workspace.id,
117
+ };
118
+ }
119
+ systemFilter() {
120
+ const user = this.currentUser();
121
+ // API credentials must not inherit their owner's administrator role.
122
+ if (RequestContext.get(API_KEY) || !this.users.isAdmin(user)) {
123
+ throw new ForbiddenException("An administrator session is required.");
124
+ }
125
+ return {
126
+ [raw((alias) => `${alias}."data"->>'userId'`)]: null,
127
+ [raw((alias) => `${alias}."data"->>'workspaceId'`)]: null,
128
+ };
129
+ }
130
+ async getScopedJob(id, where) {
131
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id)) {
132
+ return null;
133
+ }
134
+ return await this.em.findOne(JobEntity, { $and: [{ id }, this.visibleFilter(where)] }, { refresh: true });
135
+ }
136
+ async getScopedJobConnection(where, args, info) {
137
+ if (args.orderBy && args.orderBy.field !== "createdAt") {
138
+ throw new BadRequestException("Jobs can only be ordered by CREATED_AT.");
139
+ }
140
+ return await new ConnectionManager(this.em).find(JobConnection, {
141
+ ...args,
142
+ orderBy: args.orderBy ?? {
143
+ field: "createdAt",
144
+ direction: OrderDirection.DESC,
145
+ },
146
+ }, {
147
+ where: this.visibleFilter(where),
148
+ refresh: true,
149
+ ...(info && { info }),
150
+ });
151
+ }
152
+ visibleFilter(where) {
153
+ const names = this.manager
154
+ .getQueues()
155
+ .filter(isQueueVisible)
156
+ .map((queue) => queue.name);
157
+ return { $and: [where, { queue: { $in: names } }] };
158
+ }
159
+ /** Attaches history forwarding before QueueManager starts its event readers. */
160
+ async onModuleInit() {
161
+ await this.queue.upsertJobScheduler("cleanup", { pattern: "0 0 * * *", tz: "UTC" }, { name: "cleanup", data: {} });
162
+ for (const source of this.manager.getQueues()) {
163
+ if (source instanceof JobQueue) {
164
+ continue;
165
+ }
166
+ const events = source.queueEvents;
167
+ this.sources.push(source);
168
+ for (const state of [
169
+ "waiting",
170
+ "active",
171
+ "delayed",
172
+ "waiting-children",
173
+ "completed",
174
+ "failed",
175
+ "progress",
176
+ ]) {
177
+ events.on(state, (args, id) => {
178
+ const pending = this.forward(source, state, args, id)
179
+ .catch((error) => {
180
+ this.logger.error(error);
181
+ })
182
+ .finally(() => this.pending.delete(pending));
183
+ this.pending.add(pending);
184
+ });
185
+ }
186
+ }
187
+ }
188
+ async forward(source, state, args, eventId) {
189
+ const job = await BullmqJob.fromId(source, args.jobId);
190
+ const stateValue = state === "progress"
191
+ ? await job?.getState()
192
+ : state === "waiting" && job?.priority
193
+ ? "prioritized"
194
+ : state;
195
+ const status = jobStatuses.get(stateValue ?? "");
196
+ const data = {
197
+ ...(job
198
+ ? {
199
+ name: job.name,
200
+ data: job.data ?? {},
201
+ progress: job.progress,
202
+ returnValue: job.returnvalue ?? null,
203
+ failedReason: job.failedReason ?? null,
204
+ createdAt: job.timestamp,
205
+ startedAt: job.processedOn ?? null,
206
+ finishedAt: job.finishedOn ?? null,
207
+ }
208
+ : {}),
209
+ queue: source.name,
210
+ jobId: args.jobId,
211
+ ...(status && status !== JobStatus.UNKNOWN ? { status } : {}),
212
+ };
213
+ if (state === "completed") {
214
+ data.returnValue = args.returnvalue ?? null;
215
+ data.finishedAt = Number(eventId.split("-")[0]);
216
+ }
217
+ if (state === "failed") {
218
+ data.failedReason = args.failedReason;
219
+ data.finishedAt = Number(eventId.split("-")[0]);
220
+ }
221
+ if (state === "progress") {
222
+ data.progress = args.data;
223
+ }
224
+ await this.queue.add("sync", { eventId, data }, {
225
+ deduplication: {
226
+ id: JSON.stringify([source.qualifiedName, eventId]),
227
+ ttl: 24 * 60 * 60 * 1000,
228
+ },
229
+ });
230
+ }
231
+ async closeReaders() {
232
+ const results = await Promise.allSettled(this.sources.map(async (source) => {
233
+ await source.queueEvents.close();
234
+ }));
235
+ await Promise.all(this.pending);
236
+ const failed = results.find((result) => result.status === "rejected");
237
+ if (failed) {
238
+ throw failed.reason;
239
+ }
240
+ }
241
+ /**
242
+ * Drains source Workers, event forwarding, then the persistence Worker.
243
+ * @returns Shared completion of synchronization shutdown.
244
+ */
245
+ onModuleDestroy() {
246
+ return (this.shutdown ??= this.close());
247
+ }
248
+ async close() {
249
+ const failures = [];
250
+ for (const close of [
251
+ () => this.manager.stop(this.sources.map((source) => source.name)),
252
+ () => this.closeReaders(),
253
+ () => this.manager.stop([this.queue.name]),
254
+ ]) {
255
+ try {
256
+ await close();
257
+ }
258
+ catch (error) {
259
+ failures.push(error);
260
+ }
261
+ }
262
+ if (failures.length) {
263
+ throw new AggregateError(failures, "Failed to close Job synchronization.");
264
+ }
265
+ }
266
+ };
267
+ JobService = JobService_1 = __decorate([
268
+ Injectable(),
269
+ __metadata("design:paramtypes", [EntityManager,
270
+ JobQueue,
271
+ QueueManager,
272
+ UserService,
273
+ WorkspaceService])
274
+ ], JobService);
275
+ export { JobService };
276
+ //# sourceMappingURL=job.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job.service.js","sourceRoot":"","sources":["../../src/services/job.service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,118 @@
1
1
  {
2
2
  "name": "@nest-boot/queue-api",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "8.1.0",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/nest-boot/nest-boot.git",
7
+ "directory": "packages/queue-api"
8
+ },
9
+ "description": "Authenticated GraphQL queries and synchronized database records for Redis queues",
10
+ "author": {
11
+ "name": "Xudong Huang",
12
+ "email": "me@huangxudong.com",
13
+ "url": "https://www.huangxudong.com/"
14
+ },
15
+ "homepage": "",
16
+ "license": "MIT",
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "directories": {
20
+ "lib": "dist"
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "devDependencies": {
26
+ "@mikro-orm/core": "7.2.0",
27
+ "@mikro-orm/decorators": "7.2.0",
28
+ "@mikro-orm/postgresql": "7.2.0",
29
+ "@mikro-orm/sql": "7.2.0",
30
+ "@nestjs/common": "^12.0.1",
31
+ "@nestjs/core": "^12.0.1",
32
+ "@nestjs/graphql": "^14.0.3",
33
+ "@nestjs/platform-express": "^12.1.2",
34
+ "@nestjs/testing": "^12.0.1",
35
+ "@types/lodash-es": "^4.17.12",
36
+ "@types/node": "^24.0.0",
37
+ "@types/pg": "^8.15.6",
38
+ "@vitest/coverage-v8": "^4.1.11",
39
+ "bullmq": "^6.3.12",
40
+ "dotenv": "^17.2.3",
41
+ "eslint": "^9.39.3",
42
+ "graphql": "^16.11.0",
43
+ "reflect-metadata": "^0.2.2",
44
+ "rxjs": "^7.8.2",
45
+ "typescript": "^6.0.3",
46
+ "vite-tsconfig-paths": "^5.1.4",
47
+ "vitest": "^4.1.11",
48
+ "pg": "^8.16.3",
49
+ "zod": "^4.3.6",
50
+ "@types/express": "^5.0.6",
51
+ "@types/supertest": "^7.0.0",
52
+ "supertest": "^7.0.0",
53
+ "@nest-boot/graphql": "^8.0.4",
54
+ "@nest-boot/database": "^8.1.0",
55
+ "@nest-boot/eslint-plugin": "^8.1.0",
56
+ "@nest-boot/eslint-config": "^8.1.0",
57
+ "@nest-boot/request-context": "^8.0.4",
58
+ "@nest-boot/queue": "^8.2.0",
59
+ "@nest-boot/auth": "^8.1.0",
60
+ "@nest-boot/redis": "^8.0.5",
61
+ "@nest-boot/graphql-connection": "^8.1.0",
62
+ "@nest-boot/tsconfig": "^8.0.0"
63
+ },
64
+ "peerDependencies": {
65
+ "@mikro-orm/core": "^7.2.0",
66
+ "@mikro-orm/decorators": "^7.2.0",
67
+ "@mikro-orm/sql": "^7.2.0",
68
+ "@nestjs/common": "^12.0.0",
69
+ "@nestjs/core": "^12.0.0",
70
+ "@nestjs/graphql": "^14.0.3",
71
+ "bullmq": "^6.3.12",
72
+ "graphql": "^16.0.0",
73
+ "reflect-metadata": "^0.2.2",
74
+ "rxjs": "^7.0.0",
75
+ "zod": "^4.0.0",
76
+ "@nest-boot/database": "^8.1.0",
77
+ "@nest-boot/request-context": "^8.0.4",
78
+ "@nest-boot/graphql-connection": "^8.1.0",
79
+ "@nest-boot/graphql": "^8.0.4",
80
+ "@nest-boot/queue": "^8.2.0",
81
+ "@nest-boot/auth": "^8.1.0"
82
+ },
83
+ "publishConfig": {
84
+ "access": "public"
85
+ },
86
+ "lint-staged": {
87
+ "*.ts": [
88
+ "prettier --write",
89
+ "eslint --fix"
90
+ ]
91
+ },
92
+ "type": "module",
93
+ "engines": {
94
+ "node": ">=24.21.0"
95
+ },
96
+ "exports": {
97
+ ".": {
98
+ "types": "./dist/index.d.ts",
99
+ "import": "./dist/index.js"
100
+ },
101
+ "./package.json": "./package.json"
102
+ },
103
+ "dependencies": {
104
+ "lodash-es": "^4.18.1"
105
+ },
106
+ "scripts": {
107
+ "build": "tsc -p tsconfig.build.json",
108
+ "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
109
+ "dev": "tsc -w -p tsconfig.build.json",
110
+ "lint": "eslint \"{src,test}/**/*.ts\"",
111
+ "lint:fix": "eslint \"{src,test}/**/*.ts\" --fix",
112
+ "test": "vitest run",
113
+ "test:cov": "vitest run --coverage",
114
+ "test:e2e": "vitest run --config ./vitest.config.e2e.ts --coverage",
115
+ "test:watch": "vitest",
116
+ "test:debug": "vitest --inspect-brk --no-file-parallelism"
117
+ }
6
118
  }