nats-jobs
Version:
Background job processor using NATS
84 lines (83 loc) • 2.44 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.stopwatch = exports.repeater = exports.getNextBackoff = exports.defer = exports.expBackoff = exports.nanosToMs = exports.nanos = void 0;
const ms_1 = __importDefault(require("ms"));
const nanos = (x) => (0, ms_1.default)(x) * 1e6;
exports.nanos = nanos;
const nanosToMs = (x) => (x ? x / 1e6 : 0);
exports.nanosToMs = nanosToMs;
/**
* Given a starting backoff in ms, generate an array of doubling
* values with at most `numEntries` and repeating after
* `repeatAfter` entries.
*
* Note that `repeatAfter` defaults to `numEntries` and `numEntries`
* defaults to 5.
*/
const expBackoff = (startMs, options) => {
const numEntries = options?.numEntries || 5;
const repeatAfter = options?.repeatAfter || numEntries;
const vals = [];
let val = startMs;
for (let i = 0; i < numEntries; i++) {
vals.push(val);
val = i + 1 >= repeatAfter ? val : val * 2;
}
return vals;
};
exports.expBackoff = expBackoff;
function defer() {
// eslint-disable-next-line
let done = (value) => { };
const promise = new Promise((resolve) => {
// Swap original done fn with promise resolve fn
done = resolve;
});
return {
done,
promise,
};
}
exports.defer = defer;
/**
* Get the next backoff based on the redelivery count. If given
* an array and no item exists for the attempt number use the last
* backoff in the array.
*/
const getNextBackoff = (backoff, msg) => {
if (Array.isArray(backoff)) {
return backoff[msg.info.redeliveryCount - 1] || backoff.at(-1);
}
return backoff;
};
exports.getNextBackoff = getNextBackoff;
/**
* Call fn on an interval.
*/
const repeater = (fn, interval) => {
let timer;
const start = () => {
fn();
timer = setInterval(fn, interval);
};
const stop = () => {
clearInterval(timer);
};
return { start, stop };
};
exports.repeater = repeater;
/**
* Calculate elapsed time in milliseconds.
*/
const stopwatch = () => {
let startTime;
const start = () => {
startTime = new Date().getTime();
};
const stop = () => new Date().getTime() - startTime;
return { start, stop };
};
exports.stopwatch = stopwatch;