UNPKG

readiness-manager

Version:

👨‍💼 Define when your app is ready

126 lines 6.74 kB
"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