UNPKG

@mbc-cqrs-serverless/task

Version:
126 lines 6.22 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 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; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var TaskQueueEventHandler_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.TaskQueueEventHandler = void 0; const core_1 = require("@mbc-cqrs-serverless/core"); const common_1 = require("@nestjs/common"); const config_1 = require("@nestjs/config"); const core_2 = require("@nestjs/core"); const enums_1 = require("../enums"); const status_enum_1 = require("../enums/status.enum"); const task_module_definition_1 = require("../task.module-definition"); const task_service_1 = require("../task.service"); const task_queue_event_1 = require("./task.queue.event"); let TaskQueueEventHandler = TaskQueueEventHandler_1 = class TaskQueueEventHandler { constructor(moduleRef, taskService, eventFactory, configService, sfnService) { this.moduleRef = moduleRef; this.taskService = taskService; this.eventFactory = eventFactory; this.configService = configService; this.sfnService = sfnService; this.logger = new common_1.Logger(TaskQueueEventHandler_1.name); this.sfnTaskArn = this.configService.get('SFN_TASK_ARN', ''); } onModuleInit() { const enableEventSourceModule = process.env.EVENT_SOURCE_DISABLED !== 'true'; if (enableEventSourceModule) { this.eventBus = this.moduleRef.get(core_1.EventBus, { strict: false }); } } async execute(event) { this.logger.debug('task queue event executing::', event); if (event.taskEvent.taskKey.pk.startsWith(enums_1.TaskTypesEnum.SFN_TASK)) { await this.handleStepFunctionTask(event); } else { await this.handleTask(event); } } async handleTask(event) { const taskKey = event.taskEvent.taskKey; this.logger.debug('task key: ', taskKey); try { await this.taskService.updateStatus(taskKey, status_enum_1.TaskStatusEnum.PROCESSING); const events = await this.eventFactory.transformTask(event); const result = await Promise.all(events.map((event) => this.eventBus.execute(event))); // update status completed await this.taskService.updateStatus(taskKey, status_enum_1.TaskStatusEnum.COMPLETED, { result, }); } catch (error) { // update status failed this.logger.error(error); await Promise.all([ this.taskService.updateStatus(taskKey, status_enum_1.TaskStatusEnum.FAILED, { error, }), this.taskService.publishAlarm(event, error.stack), ]); throw error; } } async handleStepFunctionTask(event) { const taskKey = event.taskEvent.taskKey; this.logger.debug('step function task key: ', taskKey); try { this.logger.debug('step function task update PROCESSING status'); await this.taskService.updateStepFunctionTask(taskKey, {}, status_enum_1.TaskStatusEnum.PROCESSING); this.logger.debug('step function task create subtask'); const subTasks = await this.taskService.createSubTask(event); this.logger.debug('step function task has subtask = ', subTasks); this.logger.debug('step function task update subtask attr in parent task'); await this.taskService.updateStepFunctionTask(taskKey, { subTaskCount: subTasks.length, subTaskSucceedCount: 0, subTaskFailedCount: 0, subTaskRunningCount: 0, subTasks: subTasks.map((subTask) => ({ pk: subTask.pk, sk: subTask.sk, status: subTask.status, })), }, status_enum_1.TaskStatusEnum.PROCESSING); const ddbKey = event.taskEvent.taskKey; const ddbRecordId = `${ddbKey.pk || 'pk'}-${ddbKey.sk || 'sk'}` .replaceAll('#', '-') .replace('@', '-v') .replace(/[^0-9A-Za-z_-]+/g, `__${Math.random().toString(36).substring(2, 4)}__`); const sfnExecName = `${ddbRecordId}-${Date.now()}`; this.logger.debug('step function task sfn Exec Name', sfnExecName); await this.sfnService.startExecution(this.sfnTaskArn, subTasks, sfnExecName); } catch (error) { // update status failed this.logger.error(error); await Promise.all([ this.taskService.updateStatus(taskKey, status_enum_1.TaskStatusEnum.FAILED, { error: error.stack, }), this.taskService.publishAlarm(event, error.stack), ]); throw error; } } }; exports.TaskQueueEventHandler = TaskQueueEventHandler; exports.TaskQueueEventHandler = TaskQueueEventHandler = TaskQueueEventHandler_1 = __decorate([ (0, core_1.EventHandler)(task_queue_event_1.TaskQueueEvent), __param(2, (0, common_1.Inject)(task_module_definition_1.TASK_QUEUE_EVENT_FACTORY)), __metadata("design:paramtypes", [core_2.ModuleRef, task_service_1.TaskService, Object, config_1.ConfigService, core_1.StepFunctionService]) ], TaskQueueEventHandler); //# sourceMappingURL=task.queue.event.handler.js.map