@vtexlab/planner-message-bus
Version:
A Message Bus that uses AWS SNS, AWS SQS, and AWS EventBridge
145 lines (144 loc) • 7.59 kB
JavaScript
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();
}
});
}
}