UNPKG

@vtexlab/planner-message-bus

Version:

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

145 lines (144 loc) 7.59 kB
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()); }); }; import { SchedulerClient, CreateScheduleCommand, UpdateScheduleCommand, DeleteScheduleCommand, GetScheduleCommand, } from '@aws-sdk/client-scheduler'; import { SpanKind, SpanStatusCode } from '@opentelemetry/api'; import { startSpan } from "../utils/opentelemetry/observability"; import { TOPIC_ARN_TEMPLATE } from "../utils/constants"; export class EBScheduler extends SchedulerClient { schedule(params, callback, errorCallback) { return __awaiter(this, void 0, void 0, function* () { const { id, message, scheduleDate, topicName } = params; message.RuleId = id; const span = startSpan(this.schedule.name, 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 CreateScheduleCommand({ Name: id, Description: 'Schedule a message', Target: { Arn: 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: 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 = startSpan(this.get.name, SpanKind.SERVER); span === null || span === void 0 ? void 0 : span.setAttributes({ ruleId: id }); try { const command = new 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 = startSpan(this.updateSchedule.name, 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 UpdateScheduleCommand({ Name: id, Description: 'Schedule a message', ScheduleExpression: `at(${scheduleDate.toISOString().split(".")[0]})`, Target: { Arn: 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: 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 = startSpan(this.deleteSchedule.name, SpanKind.SERVER); try { span === null || span === void 0 ? void 0 : span.setAttributes({ ruleId: id }); const response = yield this.send(new 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: 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(); } }); } }