UNPKG

@splitsoftware/splitio-commons

Version:
105 lines (104 loc) 4.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.sdkReadinessManagerFactory = void 0; var objectAssign_1 = require("../utils/lang/objectAssign"); var wrapper_1 = require("../utils/promise/wrapper"); var readinessManager_1 = require("./readinessManager"); var constants_1 = require("./constants"); var constants_2 = require("../logger/constants"); var NEW_LISTENER_EVENT = 'newListener'; var REMOVE_LISTENER_EVENT = 'removeListener'; /** * SdkReadinessManager factory, which provides the public status API of SDK clients and manager: ready promise, readiness event emitter and constants (SDK_READY, etc). * It also updates logs related warnings and errors. * * @param readyTimeout - time in millis to emit SDK_READY_TIME_OUT event * @param readinessManager - optional readinessManager to use. only used internally for `shared` method */ function sdkReadinessManagerFactory(EventEmitter, settings, readinessManager) { if (readinessManager === void 0) { readinessManager = (0, readinessManager_1.readinessManagerFactory)(EventEmitter, settings); } var log = settings.log; /** Ready callback warning */ var internalReadyCbCount = 0; var readyCbCount = 0; readinessManager.gate.on(REMOVE_LISTENER_EVENT, function (event) { if (event === constants_1.SDK_READY) readyCbCount--; }); readinessManager.gate.on(NEW_LISTENER_EVENT, function (event) { if (event === constants_1.SDK_READY || event === constants_1.SDK_READY_TIMED_OUT) { if (readinessManager.isReady()) { log.error(constants_2.ERROR_CLIENT_LISTENER, [event === constants_1.SDK_READY ? 'SDK_READY' : 'SDK_READY_TIMED_OUT']); } else if (event === constants_1.SDK_READY) { readyCbCount++; } } }); /** Ready promise */ var readyPromise = generateReadyPromise(); readinessManager.gate.once(constants_1.SDK_READY_FROM_CACHE, function () { log.info(constants_2.CLIENT_READY_FROM_CACHE); }); // default onRejected handler, that just logs the error, if ready promise doesn't have one. function defaultOnRejected(err) { log.error(err && err.message); } function generateReadyPromise() { var promise = (0, wrapper_1.promiseWrapper)(new Promise(function (resolve, reject) { readinessManager.gate.once(constants_1.SDK_READY, function () { log.info(constants_2.CLIENT_READY); if (readyCbCount === internalReadyCbCount && !promise.hasOnFulfilled()) log.warn(constants_2.CLIENT_NO_LISTENER); resolve(); }); readinessManager.gate.once(constants_1.SDK_READY_TIMED_OUT, function (message) { reject(new Error(message)); }); }), defaultOnRejected); return promise; } return { readinessManager: readinessManager, shared: function () { return sdkReadinessManagerFactory(EventEmitter, settings, readinessManager.shared()); }, incInternalReadyCbCount: function () { internalReadyCbCount++; }, sdkStatus: (0, objectAssign_1.objectAssign)( // Expose Event Emitter functionality Object.create(readinessManager.gate), { // Expose the event constants without changing the interface Event: { SDK_READY: constants_1.SDK_READY, SDK_READY_FROM_CACHE: constants_1.SDK_READY_FROM_CACHE, SDK_UPDATE: constants_1.SDK_UPDATE, SDK_READY_TIMED_OUT: constants_1.SDK_READY_TIMED_OUT, }, ready: function () { if (readinessManager.hasTimedout()) { if (!readinessManager.isReady()) { return (0, wrapper_1.promiseWrapper)(Promise.reject(new Error('Split SDK has emitted SDK_READY_TIMED_OUT event.')), defaultOnRejected); } else { return Promise.resolve(); } } return readyPromise; }, __getStatus: function () { return { isReady: readinessManager.isReady(), isReadyFromCache: readinessManager.isReadyFromCache(), isTimedout: readinessManager.isTimedout(), hasTimedout: readinessManager.hasTimedout(), isDestroyed: readinessManager.isDestroyed(), isOperational: readinessManager.isOperational(), lastUpdate: readinessManager.lastUpdate(), }; }, }) }; } exports.sdkReadinessManagerFactory = sdkReadinessManagerFactory;