UNPKG

@nest-kr/integration

Version:

```cli npm i @nest-kr/integration ```

130 lines (129 loc) 5.71 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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const common_1 = require("@nestjs/common"); const object_case_converter_1 = require("@ridi/object-case-converter"); const SqsSubscriber_1 = require("../../infra/sqs/SqsSubscriber"); const IntegrationEventBus_1 = require("./IntegrationEventBus"); const UnsignedIntegrationEvent_1 = require("../../domain/UnsignedIntegrationEvent"); const IntegrationSignature_1 = require("../../IntegrationSignature"); let IntegrationEventSubscriber = class IntegrationEventSubscriber { constructor(sqsSubscriber, integrationEventBus) { this.sqsSubscriber = sqsSubscriber; this.integrationEventBus = integrationEventBus; this.initialized = false; this.middlewares = []; } use(func) { this.middlewares.push(func); } init(subscriberOptions, onHandleError) { const sqsOptions = subscriberOptions; this.sqsSubscriber.init(sqsOptions, (dto) => __awaiter(this, void 0, void 0, function* () { // set integration event this.setMetadata(dto); return new Promise((resolve, reject) => { this.dispatch(dto, (err) => __awaiter(this, void 0, void 0, function* () { if (err) { reject(err); } const { integrationEvent, subject, message } = dto; if (integrationEvent) { resolve(this.integrationEventBus.handle(integrationEvent)); } else { const unsignedIntegrationEvent = new UnsignedIntegrationEvent_1.UnsignedIntegrationEvent(subject, message); resolve(this.integrationEventBus.handleUnsignedIntegrationEvent(unsignedIntegrationEvent)); } })); }); }), (error) => { if (onHandleError) { onHandleError(error); } }); this.initialized = true; } run() { return __awaiter(this, void 0, void 0, function* () { if (!this.initialized) { throw new Error('IntegrationEventSubscriber is not initialized'); } yield this.sqsSubscriber.run(); }); } setMetadata(dto) { const { message } = dto; try { const jsonMessage = JSON.parse(message); if (jsonMessage.signature !== IntegrationSignature_1.INTEGRATION_SIGNATURE) { throw new Error('Unsigned integration event'); } const convertedMessage = object_case_converter_1.camelize(jsonMessage, { recursive: true }); dto.integrationEvent = { id: convertedMessage.id, topicArn: convertedMessage.topicArn, subject: convertedMessage.subject, headers: convertedMessage.headers, data: convertedMessage.data, publishedAt: convertedMessage.publishedAt, createdAt: convertedMessage.createdAt, signature: convertedMessage.signature, }; } catch (e) { } } stop() { return __awaiter(this, void 0, void 0, function* () { yield this.sqsSubscriber.stop(); }); } get isRunning() { return this.sqsSubscriber.isRunning; } dispatch(snsMessage, done) { let idx = 0; const { middlewares } = this; function next(err) { return __awaiter(this, void 0, void 0, function* () { if (err) { return done(err); } const cur = middlewares[idx]; idx += 1; if (!cur) { return done(); } try { return cur(snsMessage, next); } catch (err) { return done(err); } }); } next(); } }; IntegrationEventSubscriber = __decorate([ common_1.Injectable(), __metadata("design:paramtypes", [SqsSubscriber_1.SqsSubscriber, IntegrationEventBus_1.IntegrationEventBus]) ], IntegrationEventSubscriber); exports.IntegrationEventSubscriber = IntegrationEventSubscriber;