event-driven
Version:
makes building event-driven-architecture easy
89 lines (88 loc) • 3.75 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.autoGroupAckOrFail = exports.autoAckOrFail = exports.groupByFn = exports.filterConvertedMsgs = exports.convertJsMsg = exports.getDurableName = void 0;
const nats_1 = require("nats");
const mongoose_1 = require("mongoose");
const backend_1 = require("../backend");
const __1 = require("..");
const sc = nats_1.StringCodec();
const getDurableName = (clientGroup, subject, i, type) => {
const durableName = `${clientGroup}=${subject.replace(/\./g, '-')}=${type}=${i}`;
const exists = __1.durableNames.find((name) => name === durableName);
if (exists)
throw new Error(`Duplicate Subscription on same clientGroup(${clientGroup}) & subject(${subject}) & type(${type}) pair`);
else
__1.durableNames.push(durableName);
return durableName;
};
exports.getDurableName = getDurableName;
const convertJsMsg = (jsMsg) => {
jsMsg.info;
const headers = jsMsg.headers;
const eventId = headers === null || headers === void 0 ? void 0 : headers.get('eventId');
const parentId = new mongoose_1.Types.ObjectId(eventId);
const msgData = JSON.parse(sc.decode(jsMsg.data));
const retryingDurableName = headers === null || headers === void 0 ? void 0 : headers.get('retryingDurableName');
return { jsMsg, parentId, msgData, retryingDurableName };
};
exports.convertJsMsg = convertJsMsg;
const filterConvertedMsgs = (clientGroup, subject, eventHandlerOrder, showError, durableName, maxRetryCount) => (args) => {
if (args.retryingDurableName && args.retryingDurableName !== durableName) {
args.jsMsg.ack();
return false;
}
else if (args.jsMsg.info.redeliveryCount > maxRetryCount) {
backend_1.getFail({
ack: () => args.jsMsg.ack(),
nak: (delay) => args.jsMsg.nak(delay),
parentIds: [args.parentId],
durableName,
clientGroup,
subject,
eventHandlerOrder,
maxRetryCount,
showError,
})(new Error(backend_1.__NO_ACK__));
return false;
}
else
return true;
};
exports.filterConvertedMsgs = filterConvertedMsgs;
const groupByFn = (list, getKey) => Object.values(list.reduce((previous, currentItem) => {
const group = getKey(currentItem);
if (!previous[group])
previous[group] = [];
previous[group].push(currentItem);
return previous;
}, {}));
exports.groupByFn = groupByFn;
const autoAckOrFail = (fn) => (events) => Promise.all(events.map((event) => __awaiter(void 0, void 0, void 0, function* () {
try {
yield fn(event);
event.ack();
}
catch (err) {
event.fail(err);
}
})));
exports.autoAckOrFail = autoAckOrFail;
const autoGroupAckOrFail = (fn) => (events) => Promise.all(events.map((event) => __awaiter(void 0, void 0, void 0, function* () {
try {
yield fn(event);
event.ack();
}
catch (err) {
event.fail(err);
}
})));
exports.autoGroupAckOrFail = autoGroupAckOrFail;