@splitsoftware/splitio-commons
Version:
Split JavaScript SDK common components
105 lines (104 loc) • 4.82 kB
JavaScript
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;
;