event-driven
Version:
makes building event-driven-architecture easy
75 lines (74 loc) • 3.42 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.getFail = exports.createSubscriptionError = exports.SubscriptionError = exports.__NO_ACK__ = void 0;
const mongoose_1 = require("mongoose");
exports.__NO_ACK__ = '__NO_ACK__';
const SubscriptionErrorSchema = new mongoose_1.Schema({
parentIds: [{ type: mongoose_1.Types.ObjectId, required: true }],
durableName: { type: String, required: true },
clientGroup: { type: String, required: true },
subject: { type: String, required: true },
errorCount: { type: Number, required: true },
error: [
{
message: String,
stack: String,
createdAt: { type: Date, required: true },
},
],
isResolved: { type: Boolean, required: true },
}, { timestamps: true, strict: false });
exports.SubscriptionError = mongoose_1.model('SubscriptionEventError', SubscriptionErrorSchema);
const createSubscriptionError = (data) => __awaiter(void 0, void 0, void 0, function* () {
const error = { message: JSON.stringify(data.error.message), stack: data.error.stack, createdAt: new Date() };
const subscriptionError = yield exports.SubscriptionError.findOneAndUpdate({
parentIds: { $in: data.parentIds },
durableName: data.durableName,
}, {
$push: { error },
$inc: { errorCount: 1 },
isResolved: false,
}, { new: true });
if (subscriptionError)
return subscriptionError.toObject();
const newEventError = yield new exports.SubscriptionError({
parentIds: data.parentIds,
durableName: data.durableName,
clientGroup: data.clientGroup,
subject: data.subject,
errorCount: 1,
error: [error],
isResolved: false,
}).save();
return newEventError;
});
exports.createSubscriptionError = createSubscriptionError;
const getFail = ({ parentIds, ack, nak, durableName, clientGroup, subject, eventHandlerOrder, maxRetryCount, showError, }) => (error) => __awaiter(void 0, void 0, void 0, function* () {
const eventError = yield exports.createSubscriptionError({
parentIds,
durableName,
clientGroup,
subject,
error,
});
const { errorCount } = eventError;
console.error('\x1b[31m%s\x1b[0m', `Failed ${errorCount} times, durableName: ${durableName}, errMsg: ${error.message}`);
if (showError)
console.error('\x1b[31m%s\x1b[0m', `${durableName}`, error.stack);
if (errorCount >= maxRetryCount || error.message === exports.__NO_ACK__) {
console.log('\x1b[41m%s\x1b[0m', `Error added to dead letter queue`);
ack();
}
else
nak((errorCount - 1) * 5000);
});
exports.getFail = getFail;