UNPKG

@selfage/service_handler

Version:

Http-based service handlers on top of expressjs.

56 lines 7.6 kB
"use strict"; 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=