readiness-manager
Version:
👨💼 Define when your app is ready
126 lines • 6.74 kB
JavaScript
"use strict";
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _ReadinessManagerImpl_instances, _ReadinessManagerImpl_beacons, _ReadinessManagerImpl_callbacks, _ReadinessManagerImpl_errorHandler, _ReadinessManagerImpl_execute, _ReadinessManagerImpl_updateBeacon, _ReadinessManagerImpl_trackBeaconUpdate;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActionExecutionError = void 0;
const obs_1 = require("@fiverr-private/obs");
const error_1 = require("./error");
Object.defineProperty(exports, "ActionExecutionError", { enumerable: true, get: function () { return error_1.ActionExecutionError; } });
let readyState = false;
class ReadinessManagerImpl {
constructor() {
_ReadinessManagerImpl_instances.add(this);
_ReadinessManagerImpl_beacons.set(this, void 0);
_ReadinessManagerImpl_callbacks.set(this, void 0);
_ReadinessManagerImpl_errorHandler.set(this, void 0);
__classPrivateFieldSet(this, _ReadinessManagerImpl_beacons, {}, "f");
__classPrivateFieldSet(this, _ReadinessManagerImpl_callbacks, [], "f");
__classPrivateFieldSet(this, _ReadinessManagerImpl_errorHandler, error_1.defaultErrorHandler, "f");
}
get ready() {
return readyState;
}
status() {
return Object.values(__classPrivateFieldGet(this, _ReadinessManagerImpl_beacons, "f")).reduce((acc, { name, status }) => {
const current = acc[status] || [];
return Object.assign(acc, { [status]: [...current, name] });
}, {});
}
register(name, action, debug = false) {
if (this.ready) {
return;
}
if (__classPrivateFieldGet(this, _ReadinessManagerImpl_beacons, "f")[name]) {
throw new Error(error_1.ERRORS.BEACON_ALREADY_EXISTS);
}
const beacon = {
name,
action,
callbacks: [],
status: 'not_started',
debug,
};
Object.assign(__classPrivateFieldGet(this, _ReadinessManagerImpl_beacons, "f"), { [name]: beacon });
}
run() {
readyState = false;
Object.values(__classPrivateFieldGet(this, _ReadinessManagerImpl_beacons, "f")).forEach((beacon) => __classPrivateFieldGet(this, _ReadinessManagerImpl_instances, "m", _ReadinessManagerImpl_execute).call(this, beacon));
return this;
}
onReady(callback) {
if (readyState) {
callback();
return this;
}
__classPrivateFieldGet(this, _ReadinessManagerImpl_callbacks, "f").push(callback);
return this;
}
onActionReady(name, callback) {
const beacon = __classPrivateFieldGet(this, _ReadinessManagerImpl_beacons, "f")[name];
if (!beacon) {
throw new Error(error_1.ERRORS.BEACON_DOES_NOT_EXISTS);
}
if (beacon.status === 'resolved') {
callback();
return this;
}
__classPrivateFieldGet(this, _ReadinessManagerImpl_beacons, "f")[name].callbacks.push(callback);
return this;
}
onError(errorHandler) {
__classPrivateFieldSet(this, _ReadinessManagerImpl_errorHandler, errorHandler, "f");
return this;
}
}
_ReadinessManagerImpl_beacons = new WeakMap(), _ReadinessManagerImpl_callbacks = new WeakMap(), _ReadinessManagerImpl_errorHandler = new WeakMap(), _ReadinessManagerImpl_instances = new WeakSet(), _ReadinessManagerImpl_execute = async function _ReadinessManagerImpl_execute(beacon, attempt = 1) {
const { name, action, debug } = beacon;
const update = (status) => __classPrivateFieldGet(this, _ReadinessManagerImpl_instances, "m", _ReadinessManagerImpl_updateBeacon).call(this, name, status);
update('pending');
const startTime = debug ? Date.now() : null;
try {
const result = action();
if (result instanceof Promise) {
await result;
}
if (debug && startTime !== null) {
const duration = Date.now() - startTime;
obs_1.logger.debug(`[ReadinessManager] Action "${name}" completed in ${duration}ms`);
}
update('resolved');
}
catch (error) {
if (debug && startTime !== null) {
const duration = Date.now() - startTime;
obs_1.logger.debug(`[ReadinessManager] Action "${name}" failed after ${duration}ms`);
}
update('rejected');
__classPrivateFieldGet(this, _ReadinessManagerImpl_errorHandler, "f").call(this, new error_1.ActionExecutionError(name, attempt, error), () => __classPrivateFieldGet(this, _ReadinessManagerImpl_instances, "m", _ReadinessManagerImpl_execute).call(this, beacon, attempt + 1));
}
}, _ReadinessManagerImpl_updateBeacon = function _ReadinessManagerImpl_updateBeacon(name, status) {
Object.assign(__classPrivateFieldGet(this, _ReadinessManagerImpl_beacons, "f")[name], { status });
if (status === 'resolved') {
__classPrivateFieldGet(this, _ReadinessManagerImpl_beacons, "f")[name].callbacks.forEach((callback) => callback());
}
__classPrivateFieldGet(this, _ReadinessManagerImpl_instances, "m", _ReadinessManagerImpl_trackBeaconUpdate).call(this);
}, _ReadinessManagerImpl_trackBeaconUpdate = function _ReadinessManagerImpl_trackBeaconUpdate() {
if (readyState) {
return;
}
readyState = Object.values(__classPrivateFieldGet(this, _ReadinessManagerImpl_beacons, "f")).every((beacon) => beacon.status === 'resolved');
if (readyState) {
__classPrivateFieldGet(this, _ReadinessManagerImpl_callbacks, "f").forEach((callback) => callback());
}
};
const manager = new ReadinessManagerImpl();
exports.default = manager;
//# sourceMappingURL=index.js.map