UNPKG

@vtexlab/planner-message-bus

Version:

A Message Bus that uses AWS SNS, AWS SQS, and AWS EventBridge

149 lines (148 loc) 7.88 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 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) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.EBScheduler = void 0; const client_scheduler_1 = require("@aws-sdk/client-scheduler"); const api_1 = require("@opentelemetry/api"); const observability_1 = require("../utils/opentelemetry/observability"); const constants_1 = require("../utils/constants"); class EBScheduler extends client_scheduler_1.SchedulerClient { schedule(params, callback, errorCallback) { return __awaiter(this, void 0, void 0, function* () { const { id, message, scheduleDate, topicName } = params; message.RuleId = id; const span = (0, observability_1.startSpan)(this.schedule.name, api_1.SpanKind.PRODUCER, { content: params.message, endpoint: params.topicName }); try { span === null || span === void 0 ? void 0 : span.setAttributes({ ruleId: id, scheduleDate: scheduleDate.toISOString() }); const response = yield this.send(new client_scheduler_1.CreateScheduleCommand({ Name: id, Description: 'Schedule a message', Target: { Arn: (0, constants_1.TOPIC_ARN_TEMPLATE)(topicName), RoleArn: process.env.PLANNER_ROLE_ARN, Input: JSON.stringify(message), }, FlexibleTimeWindow: { Mode: 'OFF', }, ScheduleExpression: `at(${scheduleDate.toISOString().split(".")[0]})`, })); span === null || span === void 0 ? void 0 : span.addEvent('messageScheduled'); callback === null || callback === void 0 ? void 0 : callback(response, span); return response; } catch (error) { span === null || span === void 0 ? void 0 : span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: error.message }); span === null || span === void 0 ? void 0 : span.recordException(error); errorCallback === null || errorCallback === void 0 ? void 0 : errorCallback(error, span); throw error; } finally { span === null || span === void 0 ? void 0 : span.end(); } }); } get(id, callback, errorCallback) { return __awaiter(this, void 0, void 0, function* () { var _a, _b, _c, _d, _e; const span = (0, observability_1.startSpan)(this.get.name, api_1.SpanKind.SERVER); span === null || span === void 0 ? void 0 : span.setAttributes({ ruleId: id }); try { const command = new client_scheduler_1.GetScheduleCommand({ Name: id }); const response = yield this.send(command); callback === null || callback === void 0 ? void 0 : callback(response, span); return { id, message: JSON.parse(((_a = response.Target) === null || _a === void 0 ? void 0 : _a.Input) || '{}'), scheduleDate: new Date((_c = (_b = response.ScheduleExpression) === null || _b === void 0 ? void 0 : _b.split('(')[1].split(')')[0]) !== null && _c !== void 0 ? _c : 'now'), topicName: ((_e = (_d = response.Target) === null || _d === void 0 ? void 0 : _d.Arn) === null || _e === void 0 ? void 0 : _e.split(':').pop()) || '' }; } catch (error) { errorCallback === null || errorCallback === void 0 ? void 0 : errorCallback(error, span); return undefined; } finally { span === null || span === void 0 ? void 0 : span.end(); } }); } updateSchedule(params, callback, errorCallback) { return __awaiter(this, void 0, void 0, function* () { const span = (0, observability_1.startSpan)(this.updateSchedule.name, api_1.SpanKind.PRODUCER, { content: params.message, endpoint: params.topicName }); const { id, message, scheduleDate, topicName } = params; try { span === null || span === void 0 ? void 0 : span.setAttributes({ ruleId: id, scheduleDate: scheduleDate.toISOString() }); const response = yield this.send(new client_scheduler_1.UpdateScheduleCommand({ Name: id, Description: 'Schedule a message', ScheduleExpression: `at(${scheduleDate.toISOString().split(".")[0]})`, Target: { Arn: (0, constants_1.TOPIC_ARN_TEMPLATE)(topicName), RoleArn: process.env.PLANNER_ROLE_ARN, Input: JSON.stringify(message), }, FlexibleTimeWindow: { Mode: 'OFF', }, })); span === null || span === void 0 ? void 0 : span.addEvent('scheduleUpdated'); callback === null || callback === void 0 ? void 0 : callback(response, span); return response; } catch (error) { span === null || span === void 0 ? void 0 : span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: error.message }); span === null || span === void 0 ? void 0 : span.recordException(error); errorCallback === null || errorCallback === void 0 ? void 0 : errorCallback(error, span); throw error; } finally { span === null || span === void 0 ? void 0 : span.end(); } }); } deleteSchedule(id, callback, errorCallback) { return __awaiter(this, void 0, void 0, function* () { const span = (0, observability_1.startSpan)(this.deleteSchedule.name, api_1.SpanKind.SERVER); try { span === null || span === void 0 ? void 0 : span.setAttributes({ ruleId: id }); const response = yield this.send(new client_scheduler_1.DeleteScheduleCommand({ Name: id, })); span === null || span === void 0 ? void 0 : span.addEvent('scheduleDeleted'); callback === null || callback === void 0 ? void 0 : callback(response, span); return response; } catch (error) { span === null || span === void 0 ? void 0 : span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: error.message }); span === null || span === void 0 ? void 0 : span.recordException(error); errorCallback === null || errorCallback === void 0 ? void 0 : errorCallback(error, span); throw error; } finally { span === null || span === void 0 ? void 0 : span.end(); } }); } } exports.EBScheduler = EBScheduler;