@openfeature/js-sdk
Advanced tools
Comparing version
@@ -348,2 +348,7 @@ "use strict"; | ||
// ../shared/src/filter.ts | ||
function isDefined(input) { | ||
return typeof input !== "undefined" && input !== null; | ||
} | ||
// ../shared/src/open-feature.ts | ||
@@ -356,2 +361,3 @@ var OpenFeatureCommonAPI = class { | ||
this._events = new OpenFeatureEventEmitter(() => this._logger); | ||
this._clientEventHandlers = /* @__PURE__ */ new Map(); | ||
this._clientProviders = /* @__PURE__ */ new Map(); | ||
@@ -411,15 +417,21 @@ this._clientEvents = /* @__PURE__ */ new Map(); | ||
} | ||
const clientEmitter = this.getEventEmitterForClient(clientName); | ||
const emitters = clientName ? [this.getAndCacheEventEmitterForClient(clientName)] : this.getUnboundEmitters(); | ||
if (typeof provider.initialize === "function") { | ||
(_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => { | ||
var _a2; | ||
clientEmitter.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
emitters.forEach((emitter) => { | ||
emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
}); | ||
(_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
})) == null ? void 0 : _d.catch((error) => { | ||
var _a2; | ||
clientEmitter.emit("PROVIDER_ERROR" /* Error */, { clientName, message: error.message }); | ||
emitters.forEach((emitter) => { | ||
emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, { clientName, message: error.message }); | ||
}); | ||
(_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */, { clientName, message: error.message }); | ||
}); | ||
} else { | ||
clientEmitter.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
emitters.forEach((emitter) => { | ||
emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
}); | ||
(_e = this._events) == null ? void 0 : _e.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
@@ -432,3 +444,3 @@ } | ||
} | ||
this.transferListeners(oldProvider, provider, clientName, clientEmitter); | ||
this.transferListeners(oldProvider, provider, clientName, emitters); | ||
if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) { | ||
@@ -446,3 +458,3 @@ (_f = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _f.call(oldProvider); | ||
} | ||
getEventEmitterForClient(name) { | ||
getAndCacheEventEmitterForClient(name) { | ||
const emitter = this._clientEvents.get(name); | ||
@@ -454,16 +466,41 @@ if (emitter) { | ||
this._clientEvents.set(name, newEmitter); | ||
const clientProvider = this.getProviderForClient(name); | ||
Object.values(ProviderEvents).forEach( | ||
(eventType) => { | ||
var _a; | ||
return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () { | ||
newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: name })); | ||
})); | ||
} | ||
); | ||
return newEmitter; | ||
} | ||
transferListeners(oldProvider, newProvider, clientName, clientEmitter) { | ||
getUnboundEmitters() { | ||
const namedProviders = [...this._clientProviders.keys()]; | ||
const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined); | ||
const unboundEmitterNames = eventEmitterNames.filter((name) => !namedProviders.includes(name)); | ||
return unboundEmitterNames.map((name) => this._clientEvents.get(name)).filter(isDefined); | ||
} | ||
transferListeners(oldProvider, newProvider, clientName, emitters) { | ||
var _a; | ||
(_a = oldProvider.events) == null ? void 0 : _a.removeAllHandlers(); | ||
Object.values(ProviderEvents).forEach( | ||
(_a = this._clientEventHandlers.get(clientName)) == null ? void 0 : _a.forEach((eventHandler) => { | ||
var _a2; | ||
return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler); | ||
}); | ||
const newClientHandlers = Object.values(ProviderEvents).map( | ||
(eventType) => { | ||
var _a2; | ||
return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(eventType, (details) => __async(this, null, function* () { | ||
clientEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName })); | ||
const handler = (details) => __async(this, null, function* () { | ||
emitters.forEach((emitter) => { | ||
emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName })); | ||
}); | ||
this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName })); | ||
})); | ||
}); | ||
return [eventType, handler]; | ||
} | ||
); | ||
this._clientEventHandlers.set(clientName, newClientHandlers); | ||
newClientHandlers.forEach((eventHandler) => { | ||
var _a2; | ||
return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler); | ||
}); | ||
} | ||
@@ -598,4 +635,4 @@ close() { | ||
return new OpenFeatureClient( | ||
() => this.getProviderForClient.bind(this)(name), | ||
() => this.getEventEmitterForClient(name), | ||
() => this.getProviderForClient(name), | ||
() => this.getAndCacheEventEmitterForClient(name), | ||
() => this._logger, | ||
@@ -611,5 +648,5 @@ { name, version }, | ||
var OpenFeatureClient = class { | ||
constructor(providerAccessor, events, globalLogger, options, context = {}) { | ||
constructor(providerAccessor, emitterAccessor, globalLogger, options, context = {}) { | ||
this.providerAccessor = providerAccessor; | ||
this.events = events; | ||
this.emitterAccessor = emitterAccessor; | ||
this.globalLogger = globalLogger; | ||
@@ -628,13 +665,18 @@ this.options = options; | ||
addHandler(eventType, handler) { | ||
this.events().addHandler(eventType, handler); | ||
var _a; | ||
this.emitterAccessor().addHandler(eventType, handler); | ||
const providerReady = !this._provider.status || this._provider.status === "READY" /* READY */; | ||
if (eventType === "PROVIDER_READY" /* Ready */ && providerReady) { | ||
handler({ clientName: this.metadata.name }); | ||
try { | ||
handler({ clientName: this.metadata.name }); | ||
} catch (err) { | ||
(_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err); | ||
} | ||
} | ||
} | ||
removeHandler(eventType, handler) { | ||
this.events().removeHandler(eventType, handler); | ||
this.emitterAccessor().removeHandler(eventType, handler); | ||
} | ||
getHandlers(eventType) { | ||
return this.events().getHandlers(eventType); | ||
return this.emitterAccessor().getHandlers(eventType); | ||
} | ||
@@ -641,0 +683,0 @@ setLogger(logger) { |
@@ -296,2 +296,7 @@ var __defProp = Object.defineProperty; | ||
// ../shared/src/filter.ts | ||
function isDefined(input) { | ||
return typeof input !== "undefined" && input !== null; | ||
} | ||
// ../shared/src/open-feature.ts | ||
@@ -304,2 +309,3 @@ var OpenFeatureCommonAPI = class { | ||
this._events = new OpenFeatureEventEmitter(() => this._logger); | ||
this._clientEventHandlers = /* @__PURE__ */ new Map(); | ||
this._clientProviders = /* @__PURE__ */ new Map(); | ||
@@ -359,15 +365,21 @@ this._clientEvents = /* @__PURE__ */ new Map(); | ||
} | ||
const clientEmitter = this.getEventEmitterForClient(clientName); | ||
const emitters = clientName ? [this.getAndCacheEventEmitterForClient(clientName)] : this.getUnboundEmitters(); | ||
if (typeof provider.initialize === "function") { | ||
(_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => { | ||
var _a2; | ||
clientEmitter.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
emitters.forEach((emitter) => { | ||
emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
}); | ||
(_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
})) == null ? void 0 : _d.catch((error) => { | ||
var _a2; | ||
clientEmitter.emit("PROVIDER_ERROR" /* Error */, { clientName, message: error.message }); | ||
emitters.forEach((emitter) => { | ||
emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, { clientName, message: error.message }); | ||
}); | ||
(_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */, { clientName, message: error.message }); | ||
}); | ||
} else { | ||
clientEmitter.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
emitters.forEach((emitter) => { | ||
emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
}); | ||
(_e = this._events) == null ? void 0 : _e.emit("PROVIDER_READY" /* Ready */, { clientName }); | ||
@@ -380,3 +392,3 @@ } | ||
} | ||
this.transferListeners(oldProvider, provider, clientName, clientEmitter); | ||
this.transferListeners(oldProvider, provider, clientName, emitters); | ||
if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) { | ||
@@ -394,3 +406,3 @@ (_f = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _f.call(oldProvider); | ||
} | ||
getEventEmitterForClient(name) { | ||
getAndCacheEventEmitterForClient(name) { | ||
const emitter = this._clientEvents.get(name); | ||
@@ -402,16 +414,41 @@ if (emitter) { | ||
this._clientEvents.set(name, newEmitter); | ||
const clientProvider = this.getProviderForClient(name); | ||
Object.values(ProviderEvents).forEach( | ||
(eventType) => { | ||
var _a; | ||
return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () { | ||
newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: name })); | ||
})); | ||
} | ||
); | ||
return newEmitter; | ||
} | ||
transferListeners(oldProvider, newProvider, clientName, clientEmitter) { | ||
getUnboundEmitters() { | ||
const namedProviders = [...this._clientProviders.keys()]; | ||
const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined); | ||
const unboundEmitterNames = eventEmitterNames.filter((name) => !namedProviders.includes(name)); | ||
return unboundEmitterNames.map((name) => this._clientEvents.get(name)).filter(isDefined); | ||
} | ||
transferListeners(oldProvider, newProvider, clientName, emitters) { | ||
var _a; | ||
(_a = oldProvider.events) == null ? void 0 : _a.removeAllHandlers(); | ||
Object.values(ProviderEvents).forEach( | ||
(_a = this._clientEventHandlers.get(clientName)) == null ? void 0 : _a.forEach((eventHandler) => { | ||
var _a2; | ||
return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler); | ||
}); | ||
const newClientHandlers = Object.values(ProviderEvents).map( | ||
(eventType) => { | ||
var _a2; | ||
return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(eventType, (details) => __async(this, null, function* () { | ||
clientEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName })); | ||
const handler = (details) => __async(this, null, function* () { | ||
emitters.forEach((emitter) => { | ||
emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName })); | ||
}); | ||
this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName })); | ||
})); | ||
}); | ||
return [eventType, handler]; | ||
} | ||
); | ||
this._clientEventHandlers.set(clientName, newClientHandlers); | ||
newClientHandlers.forEach((eventHandler) => { | ||
var _a2; | ||
return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler); | ||
}); | ||
} | ||
@@ -546,4 +583,4 @@ close() { | ||
return new OpenFeatureClient( | ||
() => this.getProviderForClient.bind(this)(name), | ||
() => this.getEventEmitterForClient(name), | ||
() => this.getProviderForClient(name), | ||
() => this.getAndCacheEventEmitterForClient(name), | ||
() => this._logger, | ||
@@ -559,5 +596,5 @@ { name, version }, | ||
var OpenFeatureClient = class { | ||
constructor(providerAccessor, events, globalLogger, options, context = {}) { | ||
constructor(providerAccessor, emitterAccessor, globalLogger, options, context = {}) { | ||
this.providerAccessor = providerAccessor; | ||
this.events = events; | ||
this.emitterAccessor = emitterAccessor; | ||
this.globalLogger = globalLogger; | ||
@@ -576,13 +613,18 @@ this.options = options; | ||
addHandler(eventType, handler) { | ||
this.events().addHandler(eventType, handler); | ||
var _a; | ||
this.emitterAccessor().addHandler(eventType, handler); | ||
const providerReady = !this._provider.status || this._provider.status === "READY" /* READY */; | ||
if (eventType === "PROVIDER_READY" /* Ready */ && providerReady) { | ||
handler({ clientName: this.metadata.name }); | ||
try { | ||
handler({ clientName: this.metadata.name }); | ||
} catch (err) { | ||
(_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err); | ||
} | ||
} | ||
} | ||
removeHandler(eventType, handler) { | ||
this.events().removeHandler(eventType, handler); | ||
this.emitterAccessor().removeHandler(eventType, handler); | ||
} | ||
getHandlers(eventType) { | ||
return this.events().getHandlers(eventType); | ||
return this.emitterAccessor().getHandlers(eventType); | ||
} | ||
@@ -589,0 +631,0 @@ setLogger(logger) { |
@@ -368,2 +368,3 @@ type EventMetadata = { | ||
private readonly _events; | ||
private readonly _clientEventHandlers; | ||
protected _clientProviders: Map<string, P>; | ||
@@ -418,3 +419,4 @@ protected _clientEvents: Map<string | undefined, OpenFeatureEventEmitter>; | ||
protected getProviderForClient(name?: string): P; | ||
protected getEventEmitterForClient(name?: string): OpenFeatureEventEmitter; | ||
protected getAndCacheEventEmitterForClient(name?: string): OpenFeatureEventEmitter; | ||
private getUnboundEmitters; | ||
private transferListeners; | ||
@@ -672,3 +674,3 @@ close(): Promise<void>; | ||
private readonly providerAccessor; | ||
private readonly events; | ||
private readonly emitterAccessor; | ||
private readonly globalLogger; | ||
@@ -679,3 +681,3 @@ private readonly options; | ||
private _clientLogger?; | ||
constructor(providerAccessor: () => Provider, events: () => OpenFeatureEventEmitter, globalLogger: () => Logger, options: OpenFeatureClientOptions, context?: EvaluationContext); | ||
constructor(providerAccessor: () => Provider, emitterAccessor: () => OpenFeatureEventEmitter, globalLogger: () => Logger, options: OpenFeatureClientOptions, context?: EvaluationContext); | ||
get metadata(): ClientMetadata; | ||
@@ -682,0 +684,0 @@ addHandler(eventType: ProviderEvents, handler: EventHandler): void; |
{ | ||
"name": "@openfeature/js-sdk", | ||
"version": "1.3.1", | ||
"version": "1.3.2", | ||
"description": "OpenFeature SDK for JavaScript", | ||
@@ -5,0 +5,0 @@ "main": "./dist/cjs/index.js", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
241350
4.46%2431
3.58%