@anchan828/nest-cloud-run-queue-worker 1.0.3-next.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 anchan828
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # @anchan828/nest-cloud-run-queue-worker
2
+
3
+ ## Install
4
+
5
+ ```shell
6
+ npm i @anchan828/nest-cloud-run-queue-worker
7
+ ```
8
+
9
+ ## Usage
10
+
11
+ See [https://github.com/anchan828/nest-cloud-run-queue#readme](https://github.com/anchan828/nest-cloud-run-queue#readme)
@@ -0,0 +1,8 @@
1
+ export declare const QUEUE_WORKER_MODULE_OPTIONS = "QUEUE_WORKER_MODULE_OPTIONS";
2
+ export declare const QUEUE_WORKER_DECORATOR = "QUEUE_WORKER_DECORATOR";
3
+ export declare const QUEUE_WORKER_PROCESS_DECORATOR = "QUEUE_WORKER_PROCESS_DECORATOR";
4
+ export declare const ERROR_INVALID_MESSAGE_FORMAT = "Invalid message format.";
5
+ export declare const ERROR_QUEUE_WORKER_NAME_NOT_FOUND = "QueueWorker name not found.";
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";
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ALL_WORKERS_QUEUE_WORKER_NAME = exports.UNHANDLED_QUEUE_WORKER_NAME = 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
+ exports.QUEUE_WORKER_MODULE_OPTIONS = "QUEUE_WORKER_MODULE_OPTIONS";
5
+ exports.QUEUE_WORKER_DECORATOR = "QUEUE_WORKER_DECORATOR";
6
+ exports.QUEUE_WORKER_PROCESS_DECORATOR = "QUEUE_WORKER_PROCESS_DECORATOR";
7
+ // errors
8
+ exports.ERROR_INVALID_MESSAGE_FORMAT = "Invalid message format.";
9
+ exports.ERROR_QUEUE_WORKER_NAME_NOT_FOUND = "QueueWorker name not found.";
10
+ const ERROR_WORKER_NOT_FOUND = (name) => `QueueWorker '${name}' not found.`;
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";
@@ -0,0 +1,18 @@
1
+ import { QueueWorkerName } from "@anchan828/nest-cloud-run-queue-common";
2
+ /**
3
+ * Define worker
4
+ *
5
+ * @export
6
+ * @param {QueueWorkerName} name
7
+ * @param {number} [priority=0] Highest priority is 0, and lower the larger integer you use.
8
+ * @returns {ClassDecorator}
9
+ */
10
+ export declare function QueueWorker(name: QueueWorkerName, priority?: number): ClassDecorator;
11
+ /**
12
+ * Define worker processor
13
+ *
14
+ * @export
15
+ * @param {number} [priority=0] Highest priority is 0, and lower the larger integer you use.
16
+ * @returns {MethodDecorator}
17
+ */
18
+ export declare function QueueWorkerProcess(priority?: number): MethodDecorator;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueueWorkerProcess = exports.QueueWorker = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const constants_1 = require("./constants");
6
+ /**
7
+ * Define worker
8
+ *
9
+ * @export
10
+ * @param {QueueWorkerName} name
11
+ * @param {number} [priority=0] Highest priority is 0, and lower the larger integer you use.
12
+ * @returns {ClassDecorator}
13
+ */
14
+ function QueueWorker(name, priority = 0) {
15
+ return (0, common_1.SetMetadata)(constants_1.QUEUE_WORKER_DECORATOR, { name, priority });
16
+ }
17
+ exports.QueueWorker = QueueWorker;
18
+ /**
19
+ * Define worker processor
20
+ *
21
+ * @export
22
+ * @param {number} [priority=0] Highest priority is 0, and lower the larger integer you use.
23
+ * @returns {MethodDecorator}
24
+ */
25
+ function QueueWorkerProcess(priority = 0) {
26
+ return (0, common_1.SetMetadata)(constants_1.QUEUE_WORKER_PROCESS_DECORATOR, { priority });
27
+ }
28
+ exports.QueueWorkerProcess = QueueWorkerProcess;
@@ -0,0 +1,11 @@
1
+ import { DiscoveryService } from "@nestjs/core";
2
+ import { MetadataScanner } from "@nestjs/core/metadata-scanner";
3
+ import { QueueWorkerMetadata } from "./interfaces";
4
+ export declare class QueueWorkerExplorerService {
5
+ private readonly discoveryService;
6
+ private readonly metadataScanner;
7
+ constructor(discoveryService: DiscoveryService, metadataScanner: MetadataScanner);
8
+ explore(): QueueWorkerMetadata[];
9
+ private getWorkers;
10
+ private getQueueWorkerProcessors;
11
+ }
@@ -0,0 +1,66 @@
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.QueueWorkerExplorerService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ const metadata_scanner_1 = require("@nestjs/core/metadata-scanner");
16
+ const constants_1 = require("./constants");
17
+ let QueueWorkerExplorerService = class QueueWorkerExplorerService {
18
+ constructor(discoveryService, metadataScanner) {
19
+ this.discoveryService = discoveryService;
20
+ this.metadataScanner = metadataScanner;
21
+ }
22
+ explore() {
23
+ const workers = this.getWorkers();
24
+ for (const worker of workers) {
25
+ worker.processors = this.getQueueWorkerProcessors(worker);
26
+ }
27
+ return workers;
28
+ }
29
+ getWorkers() {
30
+ const metadata = [];
31
+ for (const classInstanceWrapper of this.discoveryService
32
+ .getProviders()
33
+ .filter((instanceWrapper) => { var _a; return (_a = instanceWrapper.instance) === null || _a === void 0 ? void 0 : _a.constructor; })) {
34
+ const args = Reflect.getMetadata(constants_1.QUEUE_WORKER_DECORATOR, classInstanceWrapper.instance.constructor);
35
+ if (args) {
36
+ metadata.push({
37
+ instance: classInstanceWrapper.instance,
38
+ name: args.name,
39
+ priority: args.priority || 0,
40
+ processors: [],
41
+ });
42
+ }
43
+ }
44
+ return metadata;
45
+ }
46
+ getQueueWorkerProcessors(worker) {
47
+ const metadata = [];
48
+ const instance = worker.instance;
49
+ const prototype = Object.getPrototypeOf(instance);
50
+ for (const methodName of this.metadataScanner.getAllFilteredMethodNames(prototype)) {
51
+ const args = Reflect.getMetadata(constants_1.QUEUE_WORKER_PROCESS_DECORATOR, prototype[methodName]);
52
+ if (args) {
53
+ metadata.push({
54
+ priority: args.priority || 0,
55
+ processor: prototype[methodName].bind(instance),
56
+ });
57
+ }
58
+ }
59
+ return metadata;
60
+ }
61
+ };
62
+ QueueWorkerExplorerService = __decorate([
63
+ (0, common_1.Injectable)(),
64
+ __metadata("design:paramtypes", [core_1.DiscoveryService, metadata_scanner_1.MetadataScanner])
65
+ ], QueueWorkerExplorerService);
66
+ exports.QueueWorkerExplorerService = QueueWorkerExplorerService;
@@ -0,0 +1,5 @@
1
+ export { ALL_WORKERS_QUEUE_WORKER_NAME as ALL_QUEUE_WORKERS, UNHANDLED_QUEUE_WORKER_NAME as UNHANDLED_QUEUE_WORKER, } from "./constants";
2
+ export { QueueWorker, QueueWorkerProcess } from "./decorators";
3
+ export { QueueWorkerModuleAsyncOptions, QueueWorkerModuleOptions, QueueWorkerModuleOptionsFactory, QueueWorkerProcessor, QueueWorkerProcessorStatus, QueueWorkerExtraConfig, QueueWorkerRawMessage, QueueWorkerControllerInterface, QueueWorkerControllerMetadata, } from "./interfaces";
4
+ export { QueueWorkerModule } from "./worker.module";
5
+ export { QueueWorkerService } from "./worker.service";
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueueWorkerService = exports.QueueWorkerModule = exports.QueueWorkerProcessorStatus = exports.QueueWorkerProcess = exports.QueueWorker = exports.UNHANDLED_QUEUE_WORKER = exports.ALL_QUEUE_WORKERS = void 0;
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; } });
7
+ var decorators_1 = require("./decorators");
8
+ Object.defineProperty(exports, "QueueWorker", { enumerable: true, get: function () { return decorators_1.QueueWorker; } });
9
+ 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
+ var worker_module_1 = require("./worker.module");
13
+ Object.defineProperty(exports, "QueueWorkerModule", { enumerable: true, get: function () { return worker_module_1.QueueWorkerModule; } });
14
+ var worker_service_1 = require("./worker.service");
15
+ Object.defineProperty(exports, "QueueWorkerService", { enumerable: true, get: function () { return worker_service_1.QueueWorkerService; } });
@@ -0,0 +1,90 @@
1
+ /// <reference types="node" />
2
+ import { QueueWorkerName, ModuleAsyncOptions, ModuleOptions, ModuleOptionsFactory } from "@anchan828/nest-cloud-run-queue-common";
3
+ import { RequestMappingMetadata } from "@nestjs/common";
4
+ import { Injectable } from "@nestjs/common/interfaces";
5
+ export interface QueueWorkerModuleOptions extends ModuleOptions {
6
+ /**
7
+ * Whether to return 4xx codes when throw error about nest-cloud-run-queue-pubsub module. Default is false.
8
+ * ex, Returns 204 instead of 400 when worker name not found. Returns 204 instead of 400 when message data is invalid.
9
+ * @type {boolean}
10
+ * @memberof QueueWorkerModuleOptions
11
+ */
12
+ throwModuleError?: boolean;
13
+ /**
14
+ * Max number of processor retry attempts. If an error occurs in a processor, it will try again.
15
+ *
16
+ * @type {number}
17
+ * @memberof QueueWorkerModuleOptions
18
+ */
19
+ maxRetryAttempts?: number;
20
+ /**
21
+ * extra config
22
+ *
23
+ * @type {QueueWorkerExtraConfig}
24
+ * @memberof QueueWorkerModuleOptions
25
+ */
26
+ extraConfig?: QueueWorkerExtraConfig;
27
+ /**
28
+ * Define a Route for the controller.
29
+ * Default: POST /
30
+ * @type {QueueWorkerControllerMetadata}
31
+ * @memberof QueueWorkerModuleOptions
32
+ */
33
+ workerController?: QueueWorkerControllerMetadata;
34
+ }
35
+ export declare type QueueWorkerModuleAsyncOptions = ModuleAsyncOptions<Omit<QueueWorkerModuleOptions, "workerController">> & Pick<QueueWorkerModuleOptions, "workerController">;
36
+ export declare type QueueWorkerModuleOptionsFactory = ModuleOptionsFactory<Omit<QueueWorkerModuleOptions, "workerController">> & Pick<QueueWorkerModuleOptions, "workerController">;
37
+ export declare type QueueWorkerProcessor = <T>(message: T, rawMessage: QueueWorkerRawMessage) => Promise<void> | void;
38
+ export interface QueueWorkerMetadata extends QueueWorkerDecoratorArgs {
39
+ instance: Injectable;
40
+ processors: QueueWorkerProcessorMetadata[];
41
+ }
42
+ export interface QueueWorkerProcessorMetadata extends QueueWorkerProcessDecoratorArgs {
43
+ processor: QueueWorkerProcessor;
44
+ }
45
+ export declare enum QueueWorkerProcessorStatus {
46
+ IN_PROGRESS = 0,
47
+ SKIP = 1
48
+ }
49
+ export declare type QueueWorkerExtraConfig = {
50
+ preProcessor?: (name: string, ...args: Parameters<QueueWorkerProcessor>) => (QueueWorkerProcessorStatus | undefined | void) | Promise<QueueWorkerProcessorStatus | undefined | void>;
51
+ postProcessor?: (name: string, ...args: Parameters<QueueWorkerProcessor>) => void | Promise<void>;
52
+ };
53
+ export interface QueueWorkerDecoratorArgs {
54
+ name: QueueWorkerName;
55
+ /**
56
+ * Highest priority is 0, and lower the larger integer you use.
57
+ *
58
+ * @type {number}
59
+ * @memberof QueueWorkerDecoratorArgs
60
+ */
61
+ priority: number;
62
+ }
63
+ export interface QueueWorkerProcessDecoratorArgs {
64
+ /**
65
+ * Highest priority is 0, and lower the larger integer you use.
66
+ *
67
+ * @type {number}
68
+ * @memberof QueueWorkerProcessDecoratorArgs
69
+ */
70
+ priority: number;
71
+ }
72
+ export declare type QueueWorkerRawMessage<T = Record<string, any>> = {
73
+ readonly data?: string | Uint8Array | Buffer | null;
74
+ readonly headers?: Record<string, string>;
75
+ } & T;
76
+ export declare type ReceivedMessage = {
77
+ readonly message: QueueWorkerRawMessage;
78
+ };
79
+ export interface QueueWorkerControllerMetadata extends RequestMappingMetadata {
80
+ /**
81
+ * Default: 200
82
+ *
83
+ * @type {number}
84
+ * @memberof QueueWorkerControllerMetadata
85
+ */
86
+ statusCode?: number;
87
+ }
88
+ export interface QueueWorkerControllerInterface {
89
+ execute(body: ReceivedMessage, headers: Record<string, string>): Promise<void>;
90
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
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 || (exports.QueueWorkerProcessorStatus = {}));
package/dist/util.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * parse json string to javascript object.
3
+ * JSON.parse has receiver for Date.parse.
4
+ * @param json
5
+ */
6
+ export declare const parseJSON: <T>(json: string) => T;
7
+ /**
8
+ * sort array by priority prop
9
+ *
10
+ * @export
11
+ * @template T
12
+ * @param {T[]} items
13
+ * @returns {T[]}
14
+ */
15
+ export declare function sortByPriority<T extends {
16
+ priority: number;
17
+ }>(items: T[]): T[];
package/dist/util.js ADDED
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sortByPriority = exports.parseJSON = void 0;
4
+ const dateRegExp = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
5
+ /**
6
+ * parse json string to javascript object.
7
+ * JSON.parse has receiver for Date.parse.
8
+ * @param json
9
+ */
10
+ const parseJSON = (json) => {
11
+ return JSON.parse(json, (_, value) => {
12
+ if (typeof value === "string" && value.length === 24 && dateRegExp.test(value)) {
13
+ const date = new Date(value);
14
+ if (+date === +date) {
15
+ return date;
16
+ }
17
+ }
18
+ return value;
19
+ });
20
+ };
21
+ exports.parseJSON = parseJSON;
22
+ /**
23
+ * sort array by priority prop
24
+ *
25
+ * @export
26
+ * @template T
27
+ * @param {T[]} items
28
+ * @returns {T[]}
29
+ */
30
+ function sortByPriority(items) {
31
+ return items.sort((x, y) => x.priority - y.priority);
32
+ }
33
+ exports.sortByPriority = sortByPriority;
@@ -0,0 +1,3 @@
1
+ import { Type } from "@nestjs/common";
2
+ import { QueueWorkerControllerInterface, QueueWorkerControllerMetadata } from "./interfaces";
3
+ export declare function getWorkerController(metadata?: QueueWorkerControllerMetadata): Type<QueueWorkerControllerInterface>;
@@ -0,0 +1,55 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.getWorkerController = void 0;
25
+ const common_1 = require("@nestjs/common");
26
+ const worker_service_1 = require("./worker.service");
27
+ function getWorkerController(metadata) {
28
+ const path = metadata === null || metadata === void 0 ? void 0 : metadata.path;
29
+ const method = (metadata === null || metadata === void 0 ? void 0 : metadata.method) || common_1.RequestMethod.POST;
30
+ let WorkerController = class WorkerController {
31
+ constructor(service) {
32
+ this.service = service;
33
+ }
34
+ execute(body, headers) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ yield this.service.execute(Object.assign(Object.assign({}, body.message), { headers }));
37
+ });
38
+ }
39
+ };
40
+ __decorate([
41
+ (0, common_1.RequestMapping)({ method, path }),
42
+ (0, common_1.HttpCode)((metadata === null || metadata === void 0 ? void 0 : metadata.statusCode) || 200),
43
+ __param(0, (0, common_1.Body)()),
44
+ __param(1, (0, common_1.Headers)()),
45
+ __metadata("design:type", Function),
46
+ __metadata("design:paramtypes", [Object, Object]),
47
+ __metadata("design:returntype", Promise)
48
+ ], WorkerController.prototype, "execute", null);
49
+ WorkerController = __decorate([
50
+ (0, common_1.Controller)(),
51
+ __metadata("design:paramtypes", [worker_service_1.QueueWorkerService])
52
+ ], WorkerController);
53
+ return WorkerController;
54
+ }
55
+ exports.getWorkerController = getWorkerController;
@@ -0,0 +1,6 @@
1
+ import { DynamicModule } from "@nestjs/common";
2
+ import { QueueWorkerModuleAsyncOptions, QueueWorkerModuleOptions } from "./interfaces";
3
+ export declare class QueueWorkerModule {
4
+ static register(options?: QueueWorkerModuleOptions): DynamicModule;
5
+ static registerAsync(options: QueueWorkerModuleAsyncOptions): DynamicModule;
6
+ }
@@ -0,0 +1,54 @@
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 QueueWorkerModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.QueueWorkerModule = void 0;
11
+ const nest_cloud_run_queue_common_1 = require("@anchan828/nest-cloud-run-queue-common");
12
+ const common_1 = require("@nestjs/common");
13
+ const core_1 = require("@nestjs/core");
14
+ const metadata_scanner_1 = require("@nestjs/core/metadata-scanner");
15
+ const constants_1 = require("./constants");
16
+ const explorer_service_1 = require("./explorer.service");
17
+ const worker_controller_1 = require("./worker.controller");
18
+ const worker_service_1 = require("./worker.service");
19
+ let QueueWorkerModule = QueueWorkerModule_1 = class QueueWorkerModule {
20
+ static register(options = {}) {
21
+ const WorkerController = (0, worker_controller_1.getWorkerController)(options.workerController);
22
+ const providers = [(0, nest_cloud_run_queue_common_1.createOptionProvider)(constants_1.QUEUE_WORKER_MODULE_OPTIONS, options)];
23
+ return {
24
+ controllers: [WorkerController],
25
+ global: true,
26
+ module: QueueWorkerModule_1,
27
+ providers,
28
+ };
29
+ }
30
+ static registerAsync(options) {
31
+ const WorkerController = (0, worker_controller_1.getWorkerController)(options.workerController);
32
+ const providers = [...(0, nest_cloud_run_queue_common_1.createAsyncProviders)(constants_1.QUEUE_WORKER_MODULE_OPTIONS, options)];
33
+ return {
34
+ controllers: [WorkerController],
35
+ global: true,
36
+ imports: [...(options.imports || [])],
37
+ module: QueueWorkerModule_1,
38
+ providers,
39
+ };
40
+ }
41
+ };
42
+ QueueWorkerModule = QueueWorkerModule_1 = __decorate([
43
+ (0, common_1.Module)({
44
+ exports: [worker_service_1.QueueWorkerService],
45
+ imports: [core_1.DiscoveryModule],
46
+ providers: [
47
+ metadata_scanner_1.MetadataScanner,
48
+ explorer_service_1.QueueWorkerExplorerService,
49
+ worker_service_1.QueueWorkerService,
50
+ { provide: common_1.Logger, useValue: new common_1.Logger("QueueWorkerModule") },
51
+ ],
52
+ })
53
+ ], QueueWorkerModule);
54
+ exports.QueueWorkerModule = QueueWorkerModule;
@@ -0,0 +1,14 @@
1
+ import { Logger } from "@nestjs/common";
2
+ import { QueueWorkerModuleOptions } from "./interfaces";
3
+ import { QueueWorkerExplorerService } from "./explorer.service";
4
+ import { QueueWorkerRawMessage } from "./interfaces";
5
+ export declare class QueueWorkerService {
6
+ #private;
7
+ private readonly options;
8
+ private readonly logger;
9
+ private readonly explorerService;
10
+ constructor(options: QueueWorkerModuleOptions, logger: Logger, explorerService: QueueWorkerExplorerService);
11
+ execute(message: QueueWorkerRawMessage): Promise<void>;
12
+ private execProcessor;
13
+ private decodeData;
14
+ }
@@ -0,0 +1,140 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
24
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
25
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
26
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
27
+ };
28
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
29
+ if (kind === "m") throw new TypeError("Private method is not writable");
30
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
31
+ 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");
32
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
33
+ };
34
+ var _QueueWorkerService_allWorkers;
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.QueueWorkerService = void 0;
37
+ const common_1 = require("@nestjs/common");
38
+ const class_validator_1 = require("class-validator");
39
+ const constants_1 = require("./constants");
40
+ const explorer_service_1 = require("./explorer.service");
41
+ const interfaces_1 = require("./interfaces");
42
+ const util_1 = require("./util");
43
+ let QueueWorkerService = class QueueWorkerService {
44
+ constructor(options, logger, explorerService) {
45
+ this.options = options;
46
+ this.logger = logger;
47
+ this.explorerService = explorerService;
48
+ _QueueWorkerService_allWorkers.set(this, void 0);
49
+ }
50
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
51
+ execute(message) {
52
+ var _a, _b, _c, _d, _e, _f;
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ if (!__classPrivateFieldGet(this, _QueueWorkerService_allWorkers, "f")) {
55
+ __classPrivateFieldSet(this, _QueueWorkerService_allWorkers, this.explorerService.explore(), "f");
56
+ }
57
+ const maxRetryAttempts = (_a = this.options.maxRetryAttempts) !== null && _a !== void 0 ? _a : 1;
58
+ const workers = [];
59
+ const spetialWorkers = [];
60
+ let data = { name: "" };
61
+ try {
62
+ data = this.decodeData(message.data);
63
+ if (!data.name) {
64
+ throw new Error(constants_1.ERROR_QUEUE_WORKER_NAME_NOT_FOUND);
65
+ }
66
+ workers.push(...__classPrivateFieldGet(this, _QueueWorkerService_allWorkers, "f").filter((worker) => data.name === worker.name));
67
+ spetialWorkers.push(...__classPrivateFieldGet(this, _QueueWorkerService_allWorkers, "f").filter((worker) => [constants_1.ALL_WORKERS_QUEUE_WORKER_NAME, constants_1.UNHANDLED_QUEUE_WORKER_NAME].includes(worker.name)));
68
+ if (workers.length === 0) {
69
+ throw new Error((0, constants_1.ERROR_WORKER_NOT_FOUND)(data.name));
70
+ }
71
+ }
72
+ catch (error) {
73
+ this.logger.error(error.message);
74
+ if (((_b = this.options) === null || _b === void 0 ? void 0 : _b.throwModuleError) && spetialWorkers.length === 0) {
75
+ throw new common_1.BadRequestException(error.message);
76
+ }
77
+ }
78
+ const processors = (0, util_1.sortByPriority)(workers)
79
+ .map((w) => (0, util_1.sortByPriority)(w.processors))
80
+ .flat();
81
+ const spetialProcessors = (0, util_1.sortByPriority)(spetialWorkers)
82
+ .map((w) => (0, util_1.sortByPriority)(w.processors))
83
+ .flat();
84
+ const processorStatus = yield ((_d = (_c = this.options.extraConfig) === null || _c === void 0 ? void 0 : _c.preProcessor) === null || _d === void 0 ? void 0 : _d.call(_c, data.name, data.data, message));
85
+ if (processorStatus !== interfaces_1.QueueWorkerProcessorStatus.SKIP) {
86
+ for (const processor of processors) {
87
+ yield this.execProcessor(processor.processor, maxRetryAttempts, data.data, message);
88
+ }
89
+ for (const processor of spetialProcessors) {
90
+ yield this.execProcessor(processor.processor, maxRetryAttempts, data, message);
91
+ }
92
+ }
93
+ yield ((_f = (_e = this.options.extraConfig) === null || _e === void 0 ? void 0 : _e.postProcessor) === null || _f === void 0 ? void 0 : _f.call(_e, data.name, data.data, message));
94
+ });
95
+ }
96
+ execProcessor(processor, maxRetryAttempts, data, rawMessage) {
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ for (let i = 0; i < maxRetryAttempts; i++) {
99
+ try {
100
+ yield processor(data, rawMessage);
101
+ i = maxRetryAttempts;
102
+ }
103
+ catch (error) {
104
+ this.logger.error(error.message);
105
+ }
106
+ }
107
+ });
108
+ }
109
+ decodeData(data) {
110
+ if (!data) {
111
+ throw new Error(constants_1.ERROR_INVALID_MESSAGE_FORMAT);
112
+ }
113
+ if (Buffer.isBuffer(data)) {
114
+ data = data.toString();
115
+ }
116
+ if (data instanceof Uint8Array) {
117
+ data = new TextDecoder("utf8").decode(data);
118
+ }
119
+ if ((0, class_validator_1.isBase64)(data)) {
120
+ data = Buffer.from(data, "base64").toString();
121
+ }
122
+ try {
123
+ if (typeof data === "string") {
124
+ return (0, util_1.parseJSON)(data);
125
+ }
126
+ return data;
127
+ }
128
+ catch (_a) {
129
+ throw new Error(constants_1.ERROR_INVALID_MESSAGE_FORMAT);
130
+ }
131
+ }
132
+ };
133
+ _QueueWorkerService_allWorkers = new WeakMap();
134
+ QueueWorkerService = __decorate([
135
+ (0, common_1.Injectable)(),
136
+ __param(0, (0, common_1.Inject)(constants_1.QUEUE_WORKER_MODULE_OPTIONS)),
137
+ __metadata("design:paramtypes", [Object, common_1.Logger,
138
+ explorer_service_1.QueueWorkerExplorerService])
139
+ ], QueueWorkerService);
140
+ exports.QueueWorkerService = QueueWorkerService;
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@anchan828/nest-cloud-run-queue-worker",
3
+ "version": "1.0.3-next.0",
4
+ "description": "> TODO: description",
5
+ "homepage": "https://github.com/anchan828/nest-cloud-run-queue/tree/master/packages/worker#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/anchan828/nest-cloud-run-queue/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/anchan828/nest-cloud-run-queue.git"
12
+ },
13
+ "license": "MIT",
14
+ "author": "anchan828 <anchan828@gmail.com>",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "directories": {
18
+ "dist": "dist"
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc -p tsconfig.build.json",
25
+ "build:watch": "tsc --watch",
26
+ "copy:license": "cp ../../LICENSE ./",
27
+ "lint": "eslint --ignore-path ../../.eslintignore '**/*.ts'",
28
+ "lint:fix": "npm run lint -- --fix",
29
+ "prepublishOnly": "rm -rf dist && npm run build && rm -f dist/*.tsbuildinfo && npm run copy:license",
30
+ "test": "jest --coverage --logHeapUsage --runInBand",
31
+ "test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand --logHeapUsage",
32
+ "test:watch": "jest --watch",
33
+ "watch": "tsc -w"
34
+ },
35
+ "dependencies": {
36
+ "@anchan828/nest-cloud-run-queue-common": "^1.0.3-next.0",
37
+ "class-validator": "0.13.2"
38
+ },
39
+ "devDependencies": {
40
+ "@nestjs/common": "8.4.4",
41
+ "rxjs": "7.5.5"
42
+ },
43
+ "peerDependencies": {
44
+ "@nestjs/common": "^8.0.0"
45
+ },
46
+ "publishConfig": {
47
+ "access": "public"
48
+ },
49
+ "gitHead": "470341e04eead0d62396245ff1a3fe0c7ad4143e"
50
+ }