@selfage/service_handler
Version:
Http-based service handlers on top of expressjs.
56 lines • 7.6 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProcessTaskHandlerWrapper = void 0;
const promClient = require("prom-client");
const events_1 = __importDefault(require("events"));
const http_error_1 = require("@selfage/http_error");
let TOTAL_COUNTER = new promClient.Counter({
name: "processing_tasks_total",
help: "The total number of tasks being processed.",
labelNames: ["path"],
});
let FAILURE_COUNTER = new promClient.Counter({
name: "processing_tasks_failure",
help: "The number of task failed processing.",
labelNames: ["path", "errorCode"],
});
class ProcessTaskHandlerWrapper extends events_1.default {
static create(descriptor, initialBackoffTimeMs, maxBackkoffTimeMs) {
return new ProcessTaskHandlerWrapper(descriptor, initialBackoffTimeMs, maxBackkoffTimeMs);
}
constructor(descriptor, initialBackoffTimeMs, maxBackkoffTimeMs) {
super();
this.descriptor = descriptor;
this.initialBackoffTimeMs = initialBackoffTimeMs;
this.maxBackkoffTimeMs = maxBackkoffTimeMs;
}
getBackoffTime(retryCount) {
return Math.min(2 ** retryCount * this.initialBackoffTimeMs, this.maxBackkoffTimeMs);
}
async wrap(loggingPrefix, claimTaskFn, processFn) {
await claimTaskFn();
// Not awaiting here and let the actual processing happen asynchronously.
this.processAndCatchError(loggingPrefix, processFn);
}
async processAndCatchError(loggingPrefix, processFn) {
let path = this.descriptor.service.path + this.descriptor.path;
TOTAL_COUNTER.inc({ path });
try {
await processFn();
this.emit("done");
}
catch (e) {
console.error(`${loggingPrefix} ${e.stack ?? e.message ?? e}`);
FAILURE_COUNTER.inc({
path,
errorCode: e.statusCode ?? http_error_1.StatusCode.InternalServerError,
});
this.emit("done", e);
}
}
}
exports.ProcessTaskHandlerWrapper = ProcessTaskHandlerWrapper;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc190YXNrX2hhbmRsZXJfd3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInByb2Nlc3NfdGFza19oYW5kbGVyX3dyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMENBQTJDO0FBQzNDLG9EQUFrQztBQUNsQyxvREFBaUQ7QUFHakQsSUFBSSxhQUFhLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDO0lBQ3pDLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsSUFBSSxFQUFFLDRDQUE0QztJQUNsRCxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7Q0FDckIsQ0FBQyxDQUFDO0FBQ0gsSUFBSSxlQUFlLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDO0lBQzNDLElBQUksRUFBRSwwQkFBMEI7SUFDaEMsSUFBSSxFQUFFLHVDQUF1QztJQUM3QyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO0NBQ2xDLENBQUMsQ0FBQztBQU1ILE1BQWEseUJBQTBCLFNBQVEsZ0JBQVk7SUFDbEQsTUFBTSxDQUFDLE1BQU0sQ0FDbEIsVUFBZ0MsRUFDaEMsb0JBQTRCLEVBQzVCLGlCQUF5QjtRQUV6QixPQUFPLElBQUkseUJBQXlCLENBQ2xDLFVBQVUsRUFDVixvQkFBb0IsRUFDcEIsaUJBQWlCLENBQ2xCLENBQUM7SUFDSixDQUFDO0lBRUQsWUFDVSxVQUFnQyxFQUNoQyxvQkFBNEIsRUFDNUIsaUJBQXlCO1FBRWpDLEtBQUssRUFBRSxDQUFDO1FBSkEsZUFBVSxHQUFWLFVBQVUsQ0FBc0I7UUFDaEMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFRO1FBQzVCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBUTtJQUduQyxDQUFDO0lBRU0sY0FBYyxDQUFDLFVBQWtCO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FDYixDQUFDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFDM0MsSUFBSSxDQUFDLGlCQUFpQixDQUN2QixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQ2YsYUFBcUIsRUFDckIsV0FBZ0MsRUFDaEMsU0FBOEI7UUFFOUIsTUFBTSxXQUFXLEVBQUUsQ0FBQztRQUNwQix5RUFBeUU7UUFDekUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUNoQyxhQUFxQixFQUNyQixTQUE4QjtRQUU5QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDL0QsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLGFBQWEsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRCxlQUFlLENBQUMsR0FBRyxDQUFDO2dCQUNsQixJQUFJO2dCQUNKLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxJQUFJLHVCQUFVLENBQUMsbUJBQW1CO2FBQzFELENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF4REQsOERBd0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHByb21DbGllbnQgPSByZXF1aXJlKFwicHJvbS1jbGllbnRcIik7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCJldmVudHNcIjtcbmltcG9ydCB7IFN0YXR1c0NvZGUgfSBmcm9tIFwiQHNlbGZhZ2UvaHR0cF9lcnJvclwiO1xuaW1wb3J0IHsgUmVtb3RlQ2FsbERlc2NyaXB0b3IgfSBmcm9tIFwiQHNlbGZhZ2Uvc2VydmljZV9kZXNjcmlwdG9yXCI7XG5cbmxldCBUT1RBTF9DT1VOVEVSID0gbmV3IHByb21DbGllbnQuQ291bnRlcih7XG4gIG5hbWU6IFwicHJvY2Vzc2luZ190YXNrc190b3RhbFwiLFxuICBoZWxwOiBcIlRoZSB0b3RhbCBudW1iZXIgb2YgdGFza3MgYmVpbmcgcHJvY2Vzc2VkLlwiLFxuICBsYWJlbE5hbWVzOiBbXCJwYXRoXCJdLFxufSk7XG5sZXQgRkFJTFVSRV9DT1VOVEVSID0gbmV3IHByb21DbGllbnQuQ291bnRlcih7XG4gIG5hbWU6IFwicHJvY2Vzc2luZ190YXNrc19mYWlsdXJlXCIsXG4gIGhlbHA6IFwiVGhlIG51bWJlciBvZiB0YXNrIGZhaWxlZCBwcm9jZXNzaW5nLlwiLFxuICBsYWJlbE5hbWVzOiBbXCJwYXRoXCIsIFwiZXJyb3JDb2RlXCJdLFxufSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc1Rhc2tIYW5kbGVyV3JhcHBlciB7XG4gIG9uKGV2ZW50OiBcImRvbmVcIiwgY2FsbGJhY2tGbjogKGVycm9yPzogRXJyb3IpID0+IHZvaWQpOiB0aGlzO1xufVxuXG5leHBvcnQgY2xhc3MgUHJvY2Vzc1Rhc2tIYW5kbGVyV3JhcHBlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKFxuICAgIGRlc2NyaXB0b3I6IFJlbW90ZUNhbGxEZXNjcmlwdG9yLFxuICAgIGluaXRpYWxCYWNrb2ZmVGltZU1zOiBudW1iZXIsXG4gICAgbWF4QmFja2tvZmZUaW1lTXM6IG51bWJlcixcbiAgKTogUHJvY2Vzc1Rhc2tIYW5kbGVyV3JhcHBlciB7XG4gICAgcmV0dXJuIG5ldyBQcm9jZXNzVGFza0hhbmRsZXJXcmFwcGVyKFxuICAgICAgZGVzY3JpcHRvcixcbiAgICAgIGluaXRpYWxCYWNrb2ZmVGltZU1zLFxuICAgICAgbWF4QmFja2tvZmZUaW1lTXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlc2NyaXB0b3I6IFJlbW90ZUNhbGxEZXNjcmlwdG9yLFxuICAgIHByaXZhdGUgaW5pdGlhbEJhY2tvZmZUaW1lTXM6IG51bWJlcixcbiAgICBwcml2YXRlIG1heEJhY2trb2ZmVGltZU1zOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmFja29mZlRpbWUocmV0cnlDb3VudDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5taW4oXG4gICAgICAyICoqIHJldHJ5Q291bnQgKiB0aGlzLmluaXRpYWxCYWNrb2ZmVGltZU1zLFxuICAgICAgdGhpcy5tYXhCYWNra29mZlRpbWVNcyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHdyYXAoXG4gICAgbG9nZ2luZ1ByZWZpeDogc3RyaW5nLFxuICAgIGNsYWltVGFza0ZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIHByb2Nlc3NGbjogKCkgPT4gUHJvbWlzZTx2b2lkPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgY2xhaW1UYXNrRm4oKTtcbiAgICAvLyBOb3QgYXdhaXRpbmcgaGVyZSBhbmQgbGV0IHRoZSBhY3R1YWwgcHJvY2Vzc2luZyBoYXBwZW4gYXN5bmNocm9ub3VzbHkuXG4gICAgdGhpcy5wcm9jZXNzQW5kQ2F0Y2hFcnJvcihsb2dnaW5nUHJlZml4LCBwcm9jZXNzRm4pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzQW5kQ2F0Y2hFcnJvcihcbiAgICBsb2dnaW5nUHJlZml4OiBzdHJpbmcsXG4gICAgcHJvY2Vzc0ZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcGF0aCA9IHRoaXMuZGVzY3JpcHRvci5zZXJ2aWNlLnBhdGggKyB0aGlzLmRlc2NyaXB0b3IucGF0aDtcbiAgICBUT1RBTF9DT1VOVEVSLmluYyh7IHBhdGggfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHByb2Nlc3NGbigpO1xuICAgICAgdGhpcy5lbWl0KFwiZG9uZVwiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke2xvZ2dpbmdQcmVmaXh9ICR7ZS5zdGFjayA/PyBlLm1lc3NhZ2UgPz8gZX1gKTtcbiAgICAgIEZBSUxVUkVfQ09VTlRFUi5pbmMoe1xuICAgICAgICBwYXRoLFxuICAgICAgICBlcnJvckNvZGU6IGUuc3RhdHVzQ29kZSA/PyBTdGF0dXNDb2RlLkludGVybmFsU2VydmVyRXJyb3IsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZW1pdChcImRvbmVcIiwgZSk7XG4gICAgfVxuICB9XG59XG4iXX0=