@anchan828/nest-cloud-run-queue-worker 2.4.1 → 3.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.
- package/dist/constants.d.ts +0 -2
- package/dist/constants.js +1 -3
- package/dist/explorer.service.js +3 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -6
- package/dist/interfaces.d.ts +13 -17
- package/dist/interfaces.js +0 -6
- package/dist/util.js +4 -3
- package/dist/worker.controller.js +7 -2
- package/dist/worker.d.ts +31 -0
- package/dist/worker.js +85 -0
- package/dist/worker.service.d.ts +11 -8
- package/dist/worker.service.js +23 -67
- package/package.json +3 -3
package/dist/constants.d.ts
CHANGED
|
@@ -4,5 +4,3 @@ export declare const QUEUE_WORKER_PROCESS_DECORATOR = "QUEUE_WORKER_PROCESS_DECO
|
|
|
4
4
|
export declare const ERROR_INVALID_MESSAGE_FORMAT = "Invalid message format.";
|
|
5
5
|
export declare const ERROR_QUEUE_WORKER_NAME_NOT_FOUND = "QueueWorker name not found.";
|
|
6
6
|
export declare const ERROR_WORKER_NOT_FOUND: (name: string) => string;
|
|
7
|
-
export declare const UNHANDLED_QUEUE_WORKER_NAME = "__unhandled_queue_worker";
|
|
8
|
-
export declare const ALL_WORKERS_QUEUE_WORKER_NAME = "__all_queue_workers";
|
package/dist/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.ERROR_WORKER_NOT_FOUND = exports.ERROR_QUEUE_WORKER_NAME_NOT_FOUND = exports.ERROR_INVALID_MESSAGE_FORMAT = exports.QUEUE_WORKER_PROCESS_DECORATOR = exports.QUEUE_WORKER_DECORATOR = exports.QUEUE_WORKER_MODULE_OPTIONS = void 0;
|
|
4
4
|
exports.QUEUE_WORKER_MODULE_OPTIONS = "QUEUE_WORKER_MODULE_OPTIONS";
|
|
5
5
|
exports.QUEUE_WORKER_DECORATOR = "QUEUE_WORKER_DECORATOR";
|
|
6
6
|
exports.QUEUE_WORKER_PROCESS_DECORATOR = "QUEUE_WORKER_PROCESS_DECORATOR";
|
|
@@ -9,5 +9,3 @@ exports.ERROR_INVALID_MESSAGE_FORMAT = "Invalid message format.";
|
|
|
9
9
|
exports.ERROR_QUEUE_WORKER_NAME_NOT_FOUND = "QueueWorker name not found.";
|
|
10
10
|
const ERROR_WORKER_NOT_FOUND = (name) => `QueueWorker '${name}' not found.`;
|
|
11
11
|
exports.ERROR_WORKER_NOT_FOUND = ERROR_WORKER_NOT_FOUND;
|
|
12
|
-
exports.UNHANDLED_QUEUE_WORKER_NAME = "__unhandled_queue_worker";
|
|
13
|
-
exports.ALL_WORKERS_QUEUE_WORKER_NAME = "__all_queue_workers";
|
package/dist/explorer.service.js
CHANGED
|
@@ -14,6 +14,7 @@ const common_1 = require("@nestjs/common");
|
|
|
14
14
|
const core_1 = require("@nestjs/core");
|
|
15
15
|
const metadata_scanner_1 = require("@nestjs/core/metadata-scanner");
|
|
16
16
|
const constants_1 = require("./constants");
|
|
17
|
+
const util_1 = require("./util");
|
|
17
18
|
let QueueWorkerExplorerService = class QueueWorkerExplorerService {
|
|
18
19
|
constructor(discoveryService, metadataScanner) {
|
|
19
20
|
this.discoveryService = discoveryService;
|
|
@@ -22,9 +23,9 @@ let QueueWorkerExplorerService = class QueueWorkerExplorerService {
|
|
|
22
23
|
explore() {
|
|
23
24
|
const workers = this.getWorkers();
|
|
24
25
|
for (const worker of workers) {
|
|
25
|
-
worker.processors = this.getQueueWorkerProcessors(worker);
|
|
26
|
+
worker.processors = (0, util_1.sortByPriority)(this.getQueueWorkerProcessors(worker));
|
|
26
27
|
}
|
|
27
|
-
return workers;
|
|
28
|
+
return (0, util_1.sortByPriority)(workers);
|
|
28
29
|
}
|
|
29
30
|
getWorkers() {
|
|
30
31
|
const metadata = [];
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { ALL_WORKERS_QUEUE_WORKER_NAME as ALL_QUEUE_WORKERS, UNHANDLED_QUEUE_WORKER_NAME as UNHANDLED_QUEUE_WORKER, } from "./constants";
|
|
2
1
|
export { QueueWorker, QueueWorkerProcess } from "./decorators";
|
|
3
|
-
export { QueueWorkerControllerInterface, QueueWorkerControllerMetadata, QueueWorkerDecodedMessage,
|
|
2
|
+
export { QueueWorkerControllerInterface, QueueWorkerControllerMetadata, QueueWorkerDecodedMessage, QueueWorkerModuleAsyncOptions, QueueWorkerModuleOptions, QueueWorkerModuleOptionsFactory, QueueWorkerOptions, QueueWorkerProcessFailureResult, QueueWorkerProcessOptions, QueueWorkerProcessResult, QueueWorkerProcessSuccessResult, QueueWorkerProcessor, QueueWorkerRawMessage, QueueWorkerReceivedMessage, } from "./interfaces";
|
|
4
3
|
export { decodeMessage } from "./util";
|
|
4
|
+
export { Processor, Worker } from "./worker";
|
|
5
5
|
export { QueueWorkerModule } from "./worker.module";
|
|
6
6
|
export { QueueWorkerService } from "./worker.service";
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.QueueWorkerService = exports.QueueWorkerModule = exports.
|
|
4
|
-
var constants_1 = require("./constants");
|
|
5
|
-
Object.defineProperty(exports, "ALL_QUEUE_WORKERS", { enumerable: true, get: function () { return constants_1.ALL_WORKERS_QUEUE_WORKER_NAME; } });
|
|
6
|
-
Object.defineProperty(exports, "UNHANDLED_QUEUE_WORKER", { enumerable: true, get: function () { return constants_1.UNHANDLED_QUEUE_WORKER_NAME; } });
|
|
3
|
+
exports.QueueWorkerService = exports.QueueWorkerModule = exports.Worker = exports.Processor = exports.decodeMessage = exports.QueueWorkerProcess = exports.QueueWorker = void 0;
|
|
7
4
|
var decorators_1 = require("./decorators");
|
|
8
5
|
Object.defineProperty(exports, "QueueWorker", { enumerable: true, get: function () { return decorators_1.QueueWorker; } });
|
|
9
6
|
Object.defineProperty(exports, "QueueWorkerProcess", { enumerable: true, get: function () { return decorators_1.QueueWorkerProcess; } });
|
|
10
|
-
var interfaces_1 = require("./interfaces");
|
|
11
|
-
Object.defineProperty(exports, "QueueWorkerProcessorStatus", { enumerable: true, get: function () { return interfaces_1.QueueWorkerProcessorStatus; } });
|
|
12
7
|
var util_1 = require("./util");
|
|
13
8
|
Object.defineProperty(exports, "decodeMessage", { enumerable: true, get: function () { return util_1.decodeMessage; } });
|
|
9
|
+
var worker_1 = require("./worker");
|
|
10
|
+
Object.defineProperty(exports, "Processor", { enumerable: true, get: function () { return worker_1.Processor; } });
|
|
11
|
+
Object.defineProperty(exports, "Worker", { enumerable: true, get: function () { return worker_1.Worker; } });
|
|
14
12
|
var worker_module_1 = require("./worker.module");
|
|
15
13
|
Object.defineProperty(exports, "QueueWorkerModule", { enumerable: true, get: function () { return worker_module_1.QueueWorkerModule; } });
|
|
16
14
|
var worker_service_1 = require("./worker.service");
|
package/dist/interfaces.d.ts
CHANGED
|
@@ -16,13 +16,6 @@ export interface QueueWorkerModuleOptions extends ModuleOptions {
|
|
|
16
16
|
* @memberof QueueWorkerModuleOptions
|
|
17
17
|
*/
|
|
18
18
|
maxRetryAttempts?: number;
|
|
19
|
-
/**
|
|
20
|
-
* extra config
|
|
21
|
-
*
|
|
22
|
-
* @type {QueueWorkerExtraConfig}
|
|
23
|
-
* @memberof QueueWorkerModuleOptions
|
|
24
|
-
*/
|
|
25
|
-
extraConfig?: QueueWorkerExtraConfig;
|
|
26
19
|
/**
|
|
27
20
|
* Define a Route for the controller.
|
|
28
21
|
* Default: POST /
|
|
@@ -47,14 +40,6 @@ export interface QueueWorkerProcessorMetadata extends QueueWorkerProcessDecorato
|
|
|
47
40
|
processorName: string;
|
|
48
41
|
processor: QueueWorkerProcessor;
|
|
49
42
|
}
|
|
50
|
-
export declare enum QueueWorkerProcessorStatus {
|
|
51
|
-
IN_PROGRESS = 0,
|
|
52
|
-
SKIP = 1
|
|
53
|
-
}
|
|
54
|
-
export type QueueWorkerExtraConfig = {
|
|
55
|
-
preProcessor?: (name: string, ...args: Parameters<QueueWorkerProcessor>) => (QueueWorkerProcessorStatus | undefined | void) | Promise<QueueWorkerProcessorStatus | undefined | void>;
|
|
56
|
-
postProcessor?: (name: string, ...args: Parameters<QueueWorkerProcessor>) => void | Promise<void>;
|
|
57
|
-
};
|
|
58
43
|
export interface QueueWorkerDecoratorArgs {
|
|
59
44
|
names: QueueWorkerName[];
|
|
60
45
|
/**
|
|
@@ -84,9 +69,17 @@ export interface QueueWorkerProcessDecoratorArgs {
|
|
|
84
69
|
}
|
|
85
70
|
export type QueueWorkerRawMessage<T = any> = {
|
|
86
71
|
readonly data?: string | null | Message<T>;
|
|
72
|
+
readonly messageId?: string;
|
|
87
73
|
readonly headers?: Record<string, string>;
|
|
88
74
|
} & Record<string, any>;
|
|
89
75
|
export type QueueWorkerDecodedMessage<T = any> = {
|
|
76
|
+
/**
|
|
77
|
+
* The message ID is a unique identifier.
|
|
78
|
+
* If controller recieve from Pub/Sub, it will be body.message.messageId.
|
|
79
|
+
* If controller recieve from Cloud Tasks, it will be body.message.headers["X-CloudTasks-TaskName"].
|
|
80
|
+
* If nothing is obtained, it will be an empty string.
|
|
81
|
+
*/
|
|
82
|
+
readonly id: string;
|
|
90
83
|
readonly data: Message<T>;
|
|
91
84
|
readonly headers?: Record<string, string>;
|
|
92
85
|
readonly raw: QueueWorkerRawMessage;
|
|
@@ -102,6 +95,10 @@ export interface QueueWorkerControllerMetadata extends RequestMappingMetadata {
|
|
|
102
95
|
* @memberof QueueWorkerControllerMetadata
|
|
103
96
|
*/
|
|
104
97
|
statusCode?: number;
|
|
98
|
+
/**
|
|
99
|
+
* Whether to throw the error as is when Processor throws an error. Default is true.
|
|
100
|
+
*/
|
|
101
|
+
throwError?: boolean;
|
|
105
102
|
}
|
|
106
103
|
export interface QueueWorkerControllerInterface {
|
|
107
104
|
execute(body: QueueWorkerReceivedMessage, headers: Record<string, string>): Promise<void>;
|
|
@@ -130,7 +127,7 @@ export interface QueueWorkerProcessOptions {
|
|
|
130
127
|
*/
|
|
131
128
|
enabled?: boolean;
|
|
132
129
|
}
|
|
133
|
-
type QueueWorkerProcessResultBase<T = any> = {
|
|
130
|
+
export type QueueWorkerProcessResultBase<T = any> = {
|
|
134
131
|
workerName: QueueWorkerName;
|
|
135
132
|
processorName: string;
|
|
136
133
|
data?: T;
|
|
@@ -144,4 +141,3 @@ export type QueueWorkerProcessFailureResult<T = any> = {
|
|
|
144
141
|
error: Error;
|
|
145
142
|
} & QueueWorkerProcessResultBase<T>;
|
|
146
143
|
export type QueueWorkerProcessResult<T = any> = QueueWorkerProcessSuccessResult<T> | QueueWorkerProcessFailureResult<T>;
|
|
147
|
-
export {};
|
package/dist/interfaces.js
CHANGED
|
@@ -1,8 +1,2 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.QueueWorkerProcessorStatus = void 0;
|
|
4
|
-
var QueueWorkerProcessorStatus;
|
|
5
|
-
(function (QueueWorkerProcessorStatus) {
|
|
6
|
-
QueueWorkerProcessorStatus[QueueWorkerProcessorStatus["IN_PROGRESS"] = 0] = "IN_PROGRESS";
|
|
7
|
-
QueueWorkerProcessorStatus[QueueWorkerProcessorStatus["SKIP"] = 1] = "SKIP";
|
|
8
|
-
})(QueueWorkerProcessorStatus || (exports.QueueWorkerProcessorStatus = QueueWorkerProcessorStatus = {}));
|
package/dist/util.js
CHANGED
|
@@ -70,15 +70,16 @@ function decodeMessage(message) {
|
|
|
70
70
|
// tasks / http
|
|
71
71
|
data = message;
|
|
72
72
|
}
|
|
73
|
-
if (!data.name) {
|
|
74
|
-
throw new common_1.BadRequestException(constants_1.ERROR_QUEUE_WORKER_NAME_NOT_FOUND);
|
|
75
|
-
}
|
|
76
73
|
return {
|
|
77
74
|
data,
|
|
78
75
|
headers: "headers" in message ? message.headers : undefined,
|
|
76
|
+
id: getMessageId(message),
|
|
79
77
|
raw: message,
|
|
80
78
|
};
|
|
81
79
|
}
|
|
80
|
+
function getMessageId(raw) {
|
|
81
|
+
return raw.messageId ?? raw.headers?.["x-cloudtasks-taskname"] ?? "";
|
|
82
|
+
}
|
|
82
83
|
function decodeData(data) {
|
|
83
84
|
if (!data) {
|
|
84
85
|
throw new common_1.BadRequestException(constants_1.ERROR_INVALID_MESSAGE_FORMAT);
|
|
@@ -18,13 +18,18 @@ const worker_service_1 = require("./worker.service");
|
|
|
18
18
|
function getWorkerController(metadata) {
|
|
19
19
|
const path = metadata?.path;
|
|
20
20
|
const method = metadata?.method || common_1.RequestMethod.POST;
|
|
21
|
+
const throwError = metadata?.throwError ?? true;
|
|
21
22
|
let WorkerController = class WorkerController {
|
|
22
23
|
constructor(service) {
|
|
23
24
|
this.service = service;
|
|
24
25
|
}
|
|
25
26
|
async execute(body, headers) {
|
|
26
|
-
this.service.execute({});
|
|
27
|
-
|
|
27
|
+
const results = await this.service.execute({ ...body.message, headers });
|
|
28
|
+
for (const result of results) {
|
|
29
|
+
if (!result.success && throwError) {
|
|
30
|
+
throw result.error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
28
33
|
}
|
|
29
34
|
};
|
|
30
35
|
__decorate([
|
package/dist/worker.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { QueueWorkerDecodedMessage, QueueWorkerMetadata, QueueWorkerModuleOptions, QueueWorkerProcessorMetadata, QueueWorkerProcessResult } from "./interfaces";
|
|
2
|
+
export declare class Worker<T> {
|
|
3
|
+
private readonly message;
|
|
4
|
+
private readonly metadata;
|
|
5
|
+
private readonly options;
|
|
6
|
+
get name(): string;
|
|
7
|
+
get priority(): number;
|
|
8
|
+
get className(): string;
|
|
9
|
+
constructor(message: QueueWorkerDecodedMessage<T>, metadata: QueueWorkerMetadata, options: QueueWorkerModuleOptions);
|
|
10
|
+
/**
|
|
11
|
+
* Execute all processors in the worker. If you want to execute a each processor, use `getProcessors` method.
|
|
12
|
+
*/
|
|
13
|
+
execute(): Promise<QueueWorkerProcessResult[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Get all processors in the worker. Use this method to execute manually when you want to execute only on specific conditions using metadata such as class name or processor name.
|
|
16
|
+
*/
|
|
17
|
+
getProcessors(): Processor<T>[];
|
|
18
|
+
}
|
|
19
|
+
export declare class Processor<T> {
|
|
20
|
+
private readonly message;
|
|
21
|
+
private readonly metadata;
|
|
22
|
+
private readonly options;
|
|
23
|
+
get name(): string;
|
|
24
|
+
get priority(): number;
|
|
25
|
+
get workerName(): string;
|
|
26
|
+
constructor(message: QueueWorkerDecodedMessage<T>, metadata: QueueWorkerProcessorMetadata, options: QueueWorkerModuleOptions);
|
|
27
|
+
/**
|
|
28
|
+
* Execute the processor.
|
|
29
|
+
*/
|
|
30
|
+
execute(): Promise<QueueWorkerProcessResult<T>>;
|
|
31
|
+
}
|
package/dist/worker.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Processor = exports.Worker = void 0;
|
|
4
|
+
class Worker {
|
|
5
|
+
get name() {
|
|
6
|
+
return this.metadata.name;
|
|
7
|
+
}
|
|
8
|
+
get priority() {
|
|
9
|
+
return this.metadata.priority;
|
|
10
|
+
}
|
|
11
|
+
get className() {
|
|
12
|
+
return this.metadata.className;
|
|
13
|
+
}
|
|
14
|
+
constructor(message, metadata, options) {
|
|
15
|
+
this.message = message;
|
|
16
|
+
this.metadata = metadata;
|
|
17
|
+
this.options = options;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Execute all processors in the worker. If you want to execute a each processor, use `getProcessors` method.
|
|
21
|
+
*/
|
|
22
|
+
async execute() {
|
|
23
|
+
const results = [];
|
|
24
|
+
const processors = this.getProcessors();
|
|
25
|
+
for (const processor of processors) {
|
|
26
|
+
results.push(await processor.execute());
|
|
27
|
+
}
|
|
28
|
+
return results;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get all processors in the worker. Use this method to execute manually when you want to execute only on specific conditions using metadata such as class name or processor name.
|
|
32
|
+
*/
|
|
33
|
+
getProcessors() {
|
|
34
|
+
return this.metadata.processors.map((processor) => new Processor(this.message, processor, this.options));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.Worker = Worker;
|
|
38
|
+
class Processor {
|
|
39
|
+
get name() {
|
|
40
|
+
return this.metadata.processorName;
|
|
41
|
+
}
|
|
42
|
+
get priority() {
|
|
43
|
+
return this.metadata.priority;
|
|
44
|
+
}
|
|
45
|
+
get workerName() {
|
|
46
|
+
return this.metadata.workerName;
|
|
47
|
+
}
|
|
48
|
+
constructor(message, metadata, options) {
|
|
49
|
+
this.message = message;
|
|
50
|
+
this.metadata = metadata;
|
|
51
|
+
this.options = options;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Execute the processor.
|
|
55
|
+
*/
|
|
56
|
+
async execute() {
|
|
57
|
+
const maxRetryAttempts = this.options.maxRetryAttempts ?? 1;
|
|
58
|
+
const resultBase = {
|
|
59
|
+
data: this.message.data.data,
|
|
60
|
+
processorName: this.metadata.processorName,
|
|
61
|
+
raw: this.message.raw,
|
|
62
|
+
workerName: this.metadata.workerName,
|
|
63
|
+
};
|
|
64
|
+
for (let i = 0; i < maxRetryAttempts; i++) {
|
|
65
|
+
try {
|
|
66
|
+
await this.metadata.processor(this.message.data.data, this.message.raw);
|
|
67
|
+
i = maxRetryAttempts;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (maxRetryAttempts === i + 1) {
|
|
71
|
+
return {
|
|
72
|
+
error,
|
|
73
|
+
success: false,
|
|
74
|
+
...resultBase,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
success: true,
|
|
81
|
+
...resultBase,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.Processor = Processor;
|
package/dist/worker.service.d.ts
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
1
|
-
import { Logger } from "@nestjs/common";
|
|
2
1
|
import { Message } from "@anchan828/nest-cloud-run-queue-common";
|
|
3
2
|
import { QueueWorkerExplorerService } from "./explorer.service";
|
|
4
3
|
import { QueueWorkerDecodedMessage, QueueWorkerModuleOptions, QueueWorkerProcessResult, QueueWorkerRawMessage } from "./interfaces";
|
|
4
|
+
import { Worker } from "./worker";
|
|
5
5
|
export declare class QueueWorkerService {
|
|
6
6
|
#private;
|
|
7
7
|
private readonly options;
|
|
8
|
-
private readonly logger;
|
|
9
8
|
private readonly explorerService;
|
|
10
|
-
constructor(options: QueueWorkerModuleOptions,
|
|
9
|
+
constructor(options: QueueWorkerModuleOptions, explorerService: QueueWorkerExplorerService);
|
|
10
|
+
/**
|
|
11
|
+
* Execute all workers that match the worker name. If you want to execute a each worker, use `getWorkers` method.
|
|
12
|
+
*/
|
|
13
|
+
execute<T = any>(meessage: QueueWorkerRawMessage<T>): Promise<QueueWorkerProcessResult<T>[]>;
|
|
11
14
|
execute<T = any>(meessage: Message<T>): Promise<QueueWorkerProcessResult<T>[]>;
|
|
12
15
|
execute<T = any>(meessage: QueueWorkerDecodedMessage<T>): Promise<QueueWorkerProcessResult<T>[]>;
|
|
13
|
-
execute<T = any>(meessage: QueueWorkerRawMessage<T>): Promise<QueueWorkerProcessResult<T>[]>;
|
|
14
16
|
/**
|
|
15
|
-
*
|
|
17
|
+
* Get all workers that match the worker name. Use this method to execute manually when you want to execute only on specific conditions using metadata such as class name or processor name.
|
|
18
|
+
* If you want to execute all workers simply, use `execute` method.
|
|
16
19
|
*/
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
getWorkers<T = any>(meessage: QueueWorkerRawMessage<T>): Worker<T>[];
|
|
21
|
+
getWorkers<T = any>(meessage: Message<T>): Worker<T>[];
|
|
22
|
+
getWorkers<T = any>(meessage: QueueWorkerDecodedMessage<T>): Worker<T>[];
|
|
19
23
|
private isDecodedMessage;
|
|
20
|
-
private executeProcessor;
|
|
21
24
|
}
|
package/dist/worker.service.js
CHANGED
|
@@ -22,88 +22,48 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
22
22
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
23
23
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
24
24
|
};
|
|
25
|
-
var _QueueWorkerService_instances, _QueueWorkerService__allWorkers, _QueueWorkerService_allWorkers_get
|
|
25
|
+
var _QueueWorkerService_instances, _QueueWorkerService__allWorkers, _QueueWorkerService_allWorkers_get;
|
|
26
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
27
|
exports.QueueWorkerService = void 0;
|
|
28
28
|
const common_1 = require("@nestjs/common");
|
|
29
29
|
const constants_1 = require("./constants");
|
|
30
30
|
const explorer_service_1 = require("./explorer.service");
|
|
31
|
-
const interfaces_1 = require("./interfaces");
|
|
32
31
|
const util_1 = require("./util");
|
|
32
|
+
const worker_1 = require("./worker");
|
|
33
33
|
let QueueWorkerService = class QueueWorkerService {
|
|
34
|
-
constructor(options,
|
|
34
|
+
constructor(options, explorerService) {
|
|
35
35
|
_QueueWorkerService_instances.add(this);
|
|
36
36
|
this.options = options;
|
|
37
|
-
this.logger = logger;
|
|
38
37
|
this.explorerService = explorerService;
|
|
39
38
|
_QueueWorkerService__allWorkers.set(this, void 0);
|
|
40
39
|
}
|
|
41
40
|
async execute(meessage) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return (0, util_1.decodeMessage)(message);
|
|
49
|
-
}
|
|
50
|
-
async runWorkers(decodedMessage) {
|
|
51
|
-
const maxRetryAttempts = this.options.maxRetryAttempts ?? 1;
|
|
52
|
-
const workers = [];
|
|
53
|
-
workers.push(...__classPrivateFieldGet(this, _QueueWorkerService_instances, "a", _QueueWorkerService_allWorkers_get).filter((worker) => decodedMessage.data.name === worker.name));
|
|
54
|
-
if (this.options?.throwModuleError && workers.length === 0 && __classPrivateFieldGet(this, _QueueWorkerService_instances, "a", _QueueWorkerService_spetialWorkers_get).length === 0) {
|
|
41
|
+
const decodedMessage = this.isDecodedMessage(meessage) ? meessage : (0, util_1.decodeMessage)(meessage);
|
|
42
|
+
if (this.options.throwModuleError && !decodedMessage.data.name) {
|
|
43
|
+
throw new common_1.BadRequestException(constants_1.ERROR_QUEUE_WORKER_NAME_NOT_FOUND);
|
|
44
|
+
}
|
|
45
|
+
const workers = await this.getWorkers(decodedMessage);
|
|
46
|
+
if (this.options.throwModuleError && workers.length === 0) {
|
|
55
47
|
throw new common_1.BadRequestException((0, constants_1.ERROR_WORKER_NOT_FOUND)(decodedMessage.data.name));
|
|
56
48
|
}
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
QueueWorkerProcessResults.push(await this.executeProcessor(processor, maxRetryAttempts, decodedMessage.data.data, decodedMessage.raw));
|
|
68
|
-
}
|
|
69
|
-
for (const processor of spetialProcessors) {
|
|
70
|
-
await this.executeProcessor(processor, maxRetryAttempts, decodedMessage.data, decodedMessage.raw);
|
|
71
|
-
}
|
|
49
|
+
const results = [];
|
|
50
|
+
for (const worker of workers) {
|
|
51
|
+
results.push(...(await worker.execute()));
|
|
52
|
+
}
|
|
53
|
+
return results;
|
|
54
|
+
}
|
|
55
|
+
getWorkers(meessage) {
|
|
56
|
+
const decodedMessage = this.isDecodedMessage(meessage) ? meessage : (0, util_1.decodeMessage)(meessage);
|
|
57
|
+
if (!decodedMessage.data.name) {
|
|
58
|
+
return [];
|
|
72
59
|
}
|
|
73
|
-
|
|
74
|
-
|
|
60
|
+
return __classPrivateFieldGet(this, _QueueWorkerService_instances, "a", _QueueWorkerService_allWorkers_get)
|
|
61
|
+
.filter((worker) => decodedMessage.data.name === worker.name)
|
|
62
|
+
.map((metadata) => new worker_1.Worker(decodedMessage, metadata, this.options));
|
|
75
63
|
}
|
|
76
64
|
isDecodedMessage(message) {
|
|
77
65
|
return "raw" in message;
|
|
78
66
|
}
|
|
79
|
-
async executeProcessor(processorMetadata, maxRetryAttempts, data, raw) {
|
|
80
|
-
for (let i = 0; i < maxRetryAttempts; i++) {
|
|
81
|
-
try {
|
|
82
|
-
await processorMetadata.processor(data, raw);
|
|
83
|
-
i = maxRetryAttempts;
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
this.logger.error(error.message);
|
|
87
|
-
if (maxRetryAttempts === i + 1) {
|
|
88
|
-
return {
|
|
89
|
-
data,
|
|
90
|
-
error,
|
|
91
|
-
processorName: processorMetadata.processorName,
|
|
92
|
-
raw,
|
|
93
|
-
success: false,
|
|
94
|
-
workerName: processorMetadata.workerName,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return {
|
|
100
|
-
data,
|
|
101
|
-
processorName: processorMetadata.processorName,
|
|
102
|
-
raw,
|
|
103
|
-
success: true,
|
|
104
|
-
workerName: processorMetadata.workerName,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
67
|
};
|
|
108
68
|
exports.QueueWorkerService = QueueWorkerService;
|
|
109
69
|
_QueueWorkerService__allWorkers = new WeakMap();
|
|
@@ -114,12 +74,8 @@ _QueueWorkerService_allWorkers_get = function _QueueWorkerService_allWorkers_get
|
|
|
114
74
|
}
|
|
115
75
|
return __classPrivateFieldGet(this, _QueueWorkerService__allWorkers, "f");
|
|
116
76
|
};
|
|
117
|
-
_QueueWorkerService_spetialWorkers_get = function _QueueWorkerService_spetialWorkers_get() {
|
|
118
|
-
return (__classPrivateFieldGet(this, _QueueWorkerService__allWorkers, "f") || []).filter((worker) => [constants_1.ALL_WORKERS_QUEUE_WORKER_NAME, constants_1.UNHANDLED_QUEUE_WORKER_NAME].includes(worker.name));
|
|
119
|
-
};
|
|
120
77
|
exports.QueueWorkerService = QueueWorkerService = __decorate([
|
|
121
78
|
(0, common_1.Injectable)(),
|
|
122
79
|
__param(0, (0, common_1.Inject)(constants_1.QUEUE_WORKER_MODULE_OPTIONS)),
|
|
123
|
-
__metadata("design:paramtypes", [Object,
|
|
124
|
-
explorer_service_1.QueueWorkerExplorerService])
|
|
80
|
+
__metadata("design:paramtypes", [Object, explorer_service_1.QueueWorkerExplorerService])
|
|
125
81
|
], QueueWorkerService);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anchan828/nest-cloud-run-queue-worker",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "> TODO: description",
|
|
5
5
|
"homepage": "https://github.com/anchan828/nest-cloud-run-queue/tree/master/packages/worker#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"watch": "tsc -w"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@anchan828/nest-cloud-run-queue-common": "^
|
|
36
|
+
"@anchan828/nest-cloud-run-queue-common": "^3.1.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@nestjs/common": "10.3.10",
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"access": "public"
|
|
47
47
|
},
|
|
48
48
|
"packageManager": "npm@10.8.1",
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "2cf06b0266993c6db926ddde524d4341d4d13668"
|
|
50
50
|
}
|