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