@openfeature/web-sdk 1.2.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,8 +16,8 @@
16
16
  <img alt="Specification" src="https://img.shields.io/static/v1?label=specification&message=v0.8.0&color=yellow&style=for-the-badge" />
17
17
  </a>
18
18
  <!-- x-release-please-start-version -->
19
- <a href="https://github.com/open-feature/js-sdk/releases/tag/web-sdk-v1.2.4">
20
- <img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.2.4&color=blue&style=for-the-badge" />
19
+ <a href="https://github.com/open-feature/js-sdk/releases/tag/web-sdk-v1.3.0">
20
+ <img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.3.0&color=blue&style=for-the-badge" />
21
21
  </a>
22
22
  <!-- x-release-please-end -->
23
23
  <br/>
@@ -243,20 +243,20 @@ For more details, please refer to the [providers](#providers) section.
243
243
  #### Manage evaluation context for domains
244
244
 
245
245
  By default, domain-scoped clients use the global context.
246
- This can be overridden by explicitly setting context when registering the provider or by references the domain when updating context:
246
+ This can be overridden by explicitly setting context when registering the provider or by referencing the domain when updating context:
247
247
 
248
248
  ```ts
249
249
  OpenFeature.setProvider("my-domain", new NewCachedProvider(), { targetingKey: localStorage.getItem("targetingKey") });
250
250
  ```
251
251
 
252
- To change context after the provider has been registered, use `setContext` with a name:
252
+ To change context after the provider has been registered, use `setContext` with a domain:
253
253
 
254
254
  ```ts
255
255
  await OpenFeature.setContext("my-domain", { targetingKey: localStorage.getItem("targetingKey") })
256
256
  ```
257
257
 
258
- Once context has been defined for a named client, it will override the global context for all clients using the associated provider.
259
- Context can be cleared using for a named provider using `OpenFeature.clearContext("my-domain")` or call `OpenFeature.clearContexts()` to reset all context.
258
+ Once a domain's context has been defined, it will override the global context for all clients bound to the domain.
259
+ Context can be cleared for a domain by calling `OpenFeature.clearContext("my-domain")` or `OpenFeature.clearContexts()` to reset all context.
260
260
 
261
261
  ### Eventing
262
262
 
package/dist/cjs/index.js CHANGED
@@ -80,8 +80,7 @@ var require_eventemitter3 = __commonJS({
80
80
  }
81
81
  if (Object.create) {
82
82
  Events.prototype = /* @__PURE__ */ Object.create(null);
83
- if (!new Events().__proto__)
84
- prefix = false;
83
+ if (!new Events().__proto__) prefix = false;
85
84
  }
86
85
  function EE(fn, context, once) {
87
86
  this.fn = fn;
@@ -93,19 +92,14 @@ var require_eventemitter3 = __commonJS({
93
92
  throw new TypeError("The listener must be a function");
94
93
  }
95
94
  var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
96
- if (!emitter._events[evt])
97
- emitter._events[evt] = listener, emitter._eventsCount++;
98
- else if (!emitter._events[evt].fn)
99
- emitter._events[evt].push(listener);
100
- else
101
- emitter._events[evt] = [emitter._events[evt], listener];
95
+ if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
96
+ else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
97
+ else emitter._events[evt] = [emitter._events[evt], listener];
102
98
  return emitter;
103
99
  }
104
100
  function clearEvent(emitter, evt) {
105
- if (--emitter._eventsCount === 0)
106
- emitter._events = new Events();
107
- else
108
- delete emitter._events[evt];
101
+ if (--emitter._eventsCount === 0) emitter._events = new Events();
102
+ else delete emitter._events[evt];
109
103
  }
110
104
  function EventEmitter2() {
111
105
  this._events = new Events();
@@ -113,11 +107,9 @@ var require_eventemitter3 = __commonJS({
113
107
  }
114
108
  EventEmitter2.prototype.eventNames = function eventNames() {
115
109
  var names = [], events, name;
116
- if (this._eventsCount === 0)
117
- return names;
110
+ if (this._eventsCount === 0) return names;
118
111
  for (name in events = this._events) {
119
- if (has.call(events, name))
120
- names.push(prefix ? name.slice(1) : name);
112
+ if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
121
113
  }
122
114
  if (Object.getOwnPropertySymbols) {
123
115
  return names.concat(Object.getOwnPropertySymbols(events));
@@ -126,10 +118,8 @@ var require_eventemitter3 = __commonJS({
126
118
  };
127
119
  EventEmitter2.prototype.listeners = function listeners(event) {
128
120
  var evt = prefix ? prefix + event : event, handlers = this._events[evt];
129
- if (!handlers)
130
- return [];
131
- if (handlers.fn)
132
- return [handlers.fn];
121
+ if (!handlers) return [];
122
+ if (handlers.fn) return [handlers.fn];
133
123
  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
134
124
  ee[i] = handlers[i].fn;
135
125
  }
@@ -137,20 +127,16 @@ var require_eventemitter3 = __commonJS({
137
127
  };
138
128
  EventEmitter2.prototype.listenerCount = function listenerCount(event) {
139
129
  var evt = prefix ? prefix + event : event, listeners = this._events[evt];
140
- if (!listeners)
141
- return 0;
142
- if (listeners.fn)
143
- return 1;
130
+ if (!listeners) return 0;
131
+ if (listeners.fn) return 1;
144
132
  return listeners.length;
145
133
  };
146
134
  EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
147
135
  var evt = prefix ? prefix + event : event;
148
- if (!this._events[evt])
149
- return false;
136
+ if (!this._events[evt]) return false;
150
137
  var listeners = this._events[evt], len = arguments.length, args, i;
151
138
  if (listeners.fn) {
152
- if (listeners.once)
153
- this.removeListener(event, listeners.fn, void 0, true);
139
+ if (listeners.once) this.removeListener(event, listeners.fn, void 0, true);
154
140
  switch (len) {
155
141
  case 1:
156
142
  return listeners.fn.call(listeners.context), true;
@@ -172,8 +158,7 @@ var require_eventemitter3 = __commonJS({
172
158
  } else {
173
159
  var length = listeners.length, j;
174
160
  for (i = 0; i < length; i++) {
175
- if (listeners[i].once)
176
- this.removeListener(event, listeners[i].fn, void 0, true);
161
+ if (listeners[i].once) this.removeListener(event, listeners[i].fn, void 0, true);
177
162
  switch (len) {
178
163
  case 1:
179
164
  listeners[i].fn.call(listeners[i].context);
@@ -188,10 +173,9 @@ var require_eventemitter3 = __commonJS({
188
173
  listeners[i].fn.call(listeners[i].context, a1, a2, a3);
189
174
  break;
190
175
  default:
191
- if (!args)
192
- for (j = 1, args = new Array(len - 1); j < len; j++) {
193
- args[j - 1] = arguments[j];
194
- }
176
+ if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {
177
+ args[j - 1] = arguments[j];
178
+ }
195
179
  listeners[i].fn.apply(listeners[i].context, args);
196
180
  }
197
181
  }
@@ -206,8 +190,7 @@ var require_eventemitter3 = __commonJS({
206
190
  };
207
191
  EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {
208
192
  var evt = prefix ? prefix + event : event;
209
- if (!this._events[evt])
210
- return this;
193
+ if (!this._events[evt]) return this;
211
194
  if (!fn) {
212
195
  clearEvent(this, evt);
213
196
  return this;
@@ -223,10 +206,8 @@ var require_eventemitter3 = __commonJS({
223
206
  events.push(listeners[i]);
224
207
  }
225
208
  }
226
- if (events.length)
227
- this._events[evt] = events.length === 1 ? events[0] : events;
228
- else
229
- clearEvent(this, evt);
209
+ if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
210
+ else clearEvent(this, evt);
230
211
  }
231
212
  return this;
232
213
  };
@@ -234,8 +215,7 @@ var require_eventemitter3 = __commonJS({
234
215
  var evt;
235
216
  if (event) {
236
217
  evt = prefix ? prefix + event : event;
237
- if (this._events[evt])
238
- clearEvent(this, evt);
218
+ if (this._events[evt]) clearEvent(this, evt);
239
219
  } else {
240
220
  this._events = new Events();
241
221
  this._eventsCount = 0;
@@ -345,7 +325,7 @@ var InMemoryProvider = class {
345
325
  putConfiguration(flagConfiguration) {
346
326
  return __async(this, null, function* () {
347
327
  try {
348
- const flagsChanged = Object.entries(flagConfiguration).filter(([key, value]) => this._flagConfiguration[key] !== value).map(([key]) => key);
328
+ const flagsChanged = Object.entries(__spreadValues(__spreadValues({}, flagConfiguration), this._flagConfiguration)).map(([key]) => key);
349
329
  this._flagConfiguration = __spreadValues({}, flagConfiguration);
350
330
  this.events.emit(import_core3.ClientProviderEvents.ConfigurationChanged, { flagsChanged });
351
331
  } catch (err) {
@@ -418,10 +398,12 @@ var import_core7 = require("@openfeature/core");
418
398
  // src/client/internal/open-feature-client.ts
419
399
  var import_core6 = require("@openfeature/core");
420
400
  var OpenFeatureClient = class {
421
- constructor(providerAccessor, providerStatusAccessor, emitterAccessor, globalLogger, options) {
401
+ constructor(providerAccessor, providerStatusAccessor, emitterAccessor, apiContextAccessor, apiHooksAccessor, globalLogger, options) {
422
402
  this.providerAccessor = providerAccessor;
423
403
  this.providerStatusAccessor = providerStatusAccessor;
424
404
  this.emitterAccessor = emitterAccessor;
405
+ this.apiContextAccessor = apiContextAccessor;
406
+ this.apiHooksAccessor = apiHooksAccessor;
425
407
  this.globalLogger = globalLogger;
426
408
  this.options = options;
427
409
  this._hooks = [];
@@ -514,16 +496,30 @@ var OpenFeatureClient = class {
514
496
  getObjectDetails(flagKey, defaultValue, options) {
515
497
  return this.evaluate(flagKey, this._provider.resolveObjectEvaluation, defaultValue, "object", options);
516
498
  }
499
+ track(occurrenceKey, occurrenceDetails) {
500
+ var _a, _b, _c;
501
+ try {
502
+ this.shortCircuitIfNotReady();
503
+ if (typeof this._provider.track === "function") {
504
+ const frozenContext = Object.freeze(__spreadValues({}, this.apiContextAccessor((_a = this == null ? void 0 : this.options) == null ? void 0 : _a.domain)));
505
+ return (_c = (_b = this._provider).track) == null ? void 0 : _c.call(_b, occurrenceKey, frozenContext, occurrenceDetails);
506
+ } else {
507
+ this._logger.debug("Provider does not support the track function; will no-op.");
508
+ }
509
+ } catch (err) {
510
+ this._logger.debug("Error recording tracking event.", err);
511
+ }
512
+ }
517
513
  evaluate(flagKey, resolver, defaultValue, flagType, options = {}) {
518
514
  var _a, _b;
519
515
  const allHooks = [
520
- ...OpenFeature.getHooks(),
516
+ ...this.apiHooksAccessor(),
521
517
  ...this.getHooks(),
522
518
  ...options.hooks || [],
523
519
  ...this._provider.hooks || []
524
520
  ];
525
521
  const allHooksReversed = [...allHooks].reverse();
526
- const context = __spreadValues({}, OpenFeature.getContext((_a = this == null ? void 0 : this.options) == null ? void 0 : _a.domain));
522
+ const context = __spreadValues({}, this.apiContextAccessor((_a = this == null ? void 0 : this.options) == null ? void 0 : _a.domain));
527
523
  const hookContext = {
528
524
  flagKey,
529
525
  defaultValue,
@@ -535,11 +531,7 @@ var OpenFeatureClient = class {
535
531
  };
536
532
  try {
537
533
  this.beforeHooks(allHooks, hookContext, options);
538
- if (this.providerStatus === import_core.ClientProviderStatus.NOT_READY) {
539
- throw new import_core6.ProviderNotReadyError("provider has not yet initialized");
540
- } else if (this.providerStatus === import_core.ClientProviderStatus.FATAL) {
541
- throw new import_core6.ProviderFatalError("provider is in an irrecoverable error state");
542
- }
534
+ this.shortCircuitIfNotReady();
543
535
  const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);
544
536
  const evaluationDetails = __spreadProps(__spreadValues({}, resolution), {
545
537
  flagMetadata: Object.freeze((_b = resolution.flagMetadata) != null ? _b : {}),
@@ -614,6 +606,13 @@ var OpenFeatureClient = class {
614
606
  get _logger() {
615
607
  return this._clientLogger || this.globalLogger();
616
608
  }
609
+ shortCircuitIfNotReady() {
610
+ if (this.providerStatus === import_core.ClientProviderStatus.NOT_READY) {
611
+ throw new import_core6.ProviderNotReadyError("provider has not yet initialized");
612
+ } else if (this.providerStatus === import_core.ClientProviderStatus.FATAL) {
613
+ throw new import_core6.ProviderFatalError("provider is in an irrecoverable error state");
614
+ }
615
+ }
617
616
  };
618
617
 
619
618
  // src/open-feature.ts
@@ -775,6 +774,8 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends import_core7.OpenFeatureCommo
775
774
  () => this.getProviderForClient(domain),
776
775
  () => this.getProviderStatus(domain),
777
776
  () => this.buildAndCacheEventEmitterForClient(domain),
777
+ (domain2) => this.getContext(domain2),
778
+ () => this.getHooks(),
778
779
  () => this._logger,
779
780
  { domain, version }
780
781
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../node_modules/eventemitter3/index.js", "../../src/index.ts", "../../src/provider/provider.ts", "../../src/provider/no-op-provider.ts", "../../src/provider/in-memory-provider/in-memory-provider.ts", "../../src/events/open-feature-event-emitter.ts", "../../../../node_modules/eventemitter3/index.mjs", "../../src/events/events.ts", "../../src/provider/in-memory-provider/variant-not-found-error.ts", "../../src/open-feature.ts", "../../src/client/internal/open-feature-client.ts"],
4
- "sourcesContent": ["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n", "export * from './client';\nexport * from './provider';\nexport * from './evaluation';\nexport * from './open-feature';\nexport * from './events';\nexport * from './hooks';\nexport * from '@openfeature/core';\n", "import { ClientProviderStatus, CommonProvider, EvaluationContext, JsonValue, Logger, ResolutionDetails } from '@openfeature/core';\nimport { Hook } from '../hooks';\n\nexport { ClientProviderStatus as ProviderStatus };\n\n/**\n * Interface that providers must implement to resolve flag values for their particular\n * backend or vendor.\n *\n * Implementation for resolving all the required flag types must be defined.\n */\nexport interface Provider extends CommonProvider<ClientProviderStatus> {\n /**\n * A provider hook exposes a mechanism for provider authors to register hooks\n * to tap into various stages of the flag evaluation lifecycle. These hooks can\n * be used to perform side effects and mutate the context for purposes of the\n * provider. Provider hooks are not configured or controlled by the application author.\n */\n readonly hooks?: Hook[];\n\n /**\n * A handler function to reconcile changes made to the static context.\n * Called by the SDK when the context is changed.\n *\n * Returning a promise will put the provider in the RECONCILING state and\n * emit the ProviderEvents.Reconciling event.\n *\n * Return void will avoid putting the provider in the RECONCILING state and\n * **not** emit the ProviderEvents.Reconciling event.\n * @param oldContext\n * @param newContext\n */\n onContextChange?(oldContext: EvaluationContext, newContext: EvaluationContext): Promise<void> | void;\n\n /**\n * Resolve a boolean flag and its evaluation details.\n */\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<boolean>;\n\n /**\n * Resolve a string flag and its evaluation details.\n */\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<string>;\n\n /**\n * Resolve a numeric flag and its evaluation details.\n */\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<number>;\n\n /**\n * Resolve and parse an object flag and its evaluation details.\n */\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<T>;\n}\n", "import { JsonValue, ResolutionDetails } from '@openfeature/core';\nimport { Provider } from './provider';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): ResolutionDetails<boolean> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): ResolutionDetails<string> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): ResolutionDetails<number> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): ResolutionDetails<T> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return {\n value: defaultValue,\n reason: REASON_NO_OP,\n };\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import {\n EvaluationContext,\n FlagNotFoundError,\n FlagValueType,\n GeneralError,\n JsonValue,\n Logger,\n OpenFeatureError,\n ResolutionDetails,\n StandardResolutionReasons,\n TypeMismatchError,\n} from '@openfeature/core';\nimport { Provider } from '../provider';\nimport { OpenFeatureEventEmitter, ProviderEvents } from '../../events';\nimport { FlagConfiguration, Flag } from './flag-configuration';\nimport { VariantNotFoundError } from './variant-not-found-error';\n\n/**\n * A simple OpenFeature provider intended for demos and as a test stub.\n */\nexport class InMemoryProvider implements Provider {\n public readonly events = new OpenFeatureEventEmitter();\n public readonly runsOn = 'client';\n readonly metadata = {\n name: 'in-memory',\n } as const;\n private _flagConfiguration: FlagConfiguration;\n private _context: EvaluationContext | undefined;\n\n constructor(flagConfiguration: FlagConfiguration = {}) {\n this._flagConfiguration = { ...flagConfiguration };\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n */\n async putConfiguration(flagConfiguration: FlagConfiguration) {\n try {\n const flagsChanged = Object.entries(flagConfiguration)\n .filter(([key, value]) => this._flagConfiguration[key] !== value)\n .map(([key]) => key);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n } catch (err) {\n this.events.emit(ProviderEvents.Error);\n throw err;\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<boolean> {\n return this.resolveAndCheckFlag<boolean>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<number> {\n return this.resolveAndCheckFlag<number>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<string> {\n return this.resolveAndCheckFlag<string>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n return this.resolveAndCheckFlag<T>(flagKey, defaultValue, context || this._context, logger);\n }\n\n private resolveAndCheckFlag<T extends JsonValue | FlagValueType>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n if (!(flagKey in this._flagConfiguration)) {\n const message = `no flag found with key ${flagKey}`;\n logger?.debug(message);\n throw new FlagNotFoundError(message);\n }\n\n if (this._flagConfiguration[flagKey].disabled) {\n return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };\n }\n\n const resolvedFlag = this.resolveFlagWithReason(flagKey, context) as ResolutionDetails<T>;\n\n if (resolvedFlag.value === undefined) {\n const message = `no value associated with variant provided for ${flagKey} found`;\n logger?.error(message);\n throw new VariantNotFoundError(message);\n }\n\n if (typeof resolvedFlag.value != typeof defaultValue) {\n throw new TypeMismatchError();\n }\n\n return resolvedFlag;\n }\n\n private resolveFlagWithReason<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n try {\n const resolutionResult = this.lookupFlagValue<T>(flagKey, ctx);\n\n return resolutionResult;\n } catch (error: unknown) {\n if (!(error instanceof OpenFeatureError)) {\n throw new GeneralError((error as Error)?.message || 'unknown error');\n }\n throw error;\n }\n }\n\n private lookupFlagValue<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n const flagSpec: Flag = this._flagConfiguration[flagKey];\n\n const isContextEval = ctx && flagSpec?.contextEvaluator;\n const variant = isContextEval ? flagSpec.contextEvaluator?.(ctx) : flagSpec.defaultVariant;\n\n const value = variant && flagSpec?.variants[variant];\n\n const reason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;\n\n return {\n value: value as T,\n ...(variant && { variant }),\n reason,\n };\n }\n}\n", "import { GenericEventEmitter } from '@openfeature/core';\nimport { EventEmitter } from 'eventemitter3';\nimport { ProviderEmittableEvents } from './events';\n\n/**\n * The OpenFeatureEventEmitter can be used by provider developers to emit\n * events at various parts of the provider lifecycle.\n *\n * NOTE: Ready and error events are automatically emitted by the SDK based on\n * the result of the initialize method.\n */\nexport class OpenFeatureEventEmitter extends GenericEventEmitter<ProviderEmittableEvents> {\n protected readonly eventEmitter = new EventEmitter();\n\n constructor() {\n super();\n }\n}\n", "import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n", "import { ClientProviderEvents } from '@openfeature/core';\n\nexport { ClientProviderEvents as ProviderEvents};\n\n/**\n * A subset of events that can be directly emitted by providers.\n */\nexport type ProviderEmittableEvents = Exclude<ClientProviderEvents, ClientProviderEvents.ContextChanged>;", "import { ErrorCode, OpenFeatureError } from '@openfeature/core';\n\n/**\n * A custom error for the in-memory provider.\n * Indicates the resolved or default variant doesn't exist.\n */\nexport class VariantNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, VariantNotFoundError.prototype);\n this.name = 'VariantNotFoundError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import {\n ClientProviderStatus,\n EvaluationContext,\n GenericEventEmitter,\n ManageContext,\n OpenFeatureCommonAPI,\n ProviderWrapper,\n objectOrUndefined,\n stringOrUndefined,\n} from '@openfeature/core';\nimport { Client } from './client';\nimport { OpenFeatureClient } from './client/internal/open-feature-client';\nimport { OpenFeatureEventEmitter, ProviderEvents } from './events';\nimport { Hook } from './hooks';\nimport { NOOP_PROVIDER, Provider, ProviderStatus } from './provider';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/web-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\ntype DomainRecord = {\n domain?: string;\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>;\n};\n\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI\n extends OpenFeatureCommonAPI<ClientProviderStatus, Provider, Hook>\n implements ManageContext<Promise<void>>\n{\n protected _statusEnumType: typeof ProviderStatus = ProviderStatus;\n protected _apiEmitter: GenericEventEmitter<ProviderEvents> = new OpenFeatureEventEmitter();\n protected _defaultProvider: ProviderWrapper<Provider, ClientProviderStatus> = new ProviderWrapper(\n NOOP_PROVIDER,\n ProviderStatus.NOT_READY,\n this._statusEnumType,\n );\n protected _domainScopedProviders: Map<string, ProviderWrapper<Provider, ClientProviderStatus>> = new Map();\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n private constructor() {\n super('client');\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n private getProviderStatus(domain?: string): ProviderStatus {\n if (!domain) {\n return this._defaultProvider.status;\n }\n\n return this._domainScopedProviders.get(domain)?.status ?? this._defaultProvider.status;\n }\n\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(provider: Provider): Promise<void>;\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(provider: Provider, context: EvaluationContext): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider, context: EvaluationContext): Promise<void>;\n async setProviderAndWait(\n clientOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Promise<void> {\n const domain = stringOrUndefined(clientOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(clientOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n await this.setAwaitableProvider(domain, provider);\n }\n\n /**\n * Sets the default provider for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider): this;\n /**\n * Sets the default provider and evaluation context for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider, context: EvaluationContext): this;\n /**\n * Sets the provider for flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider): this;\n /**\n * Sets the provider and evaluation context flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider, context: EvaluationContext): this;\n setProvider(\n domainOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): this {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(domainOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n const maybePromise = this.setAwaitableProvider(domain, provider);\n\n // The setProvider method doesn't return a promise so we need to catch and\n // log any errors that occur during provider initialization to avoid having\n // an unhandled promise rejection.\n Promise.resolve(maybePromise).catch((err) => {\n this._logger.error('Error during provider initialization:', err);\n });\n return this;\n }\n\n /**\n * Sets the evaluation context globally.\n * This will be used by all providers that have not bound to a domain.\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext({ region: \"us\" });\n */\n async setContext(context: EvaluationContext): Promise<void>;\n /**\n * Sets the evaluation context for a specific provider.\n * This will only affect providers bound to a domain.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext(\"test\", { scope: \"provider\" });\n * OpenFeature.setProvider(new MyProvider()) // Uses the default context\n * OpenFeature.setProvider(\"test\", new MyProvider()) // Uses context: { scope: \"provider\" }\n */\n async setContext(domain: string, context: EvaluationContext): Promise<void>;\n async setContext<T extends EvaluationContext>(domainOrContext: T | string, contextOrUndefined?: T): Promise<void> {\n const domain = stringOrUndefined(domainOrContext);\n const context = objectOrUndefined<T>(domainOrContext) ?? objectOrUndefined(contextOrUndefined) ?? {};\n\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.set(domain, context);\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, context);\n } else {\n this._domainScopedContext.set(domain, context);\n }\n } else {\n const oldContext = this._context;\n this._context = context;\n\n // collect all providers that are using the default context (not bound to a domain)\n const unboundProviders: DomainRecord[] = Array.from(this._domainScopedProviders.entries())\n .filter(([domain]) => !this._domainScopedContext.has(domain))\n .reduce<DomainRecord[]>((acc, [domain, wrapper]) => {\n acc.push({ domain, wrapper });\n return acc;\n }, []);\n\n const allDomainRecords: DomainRecord[] = [\n // add in the default (no domain)\n { domain: undefined, wrapper: this._defaultProvider },\n ...unboundProviders,\n ];\n await Promise.all(\n allDomainRecords.map((dm) => this.runProviderContextChangeHandler(dm.domain, dm.wrapper, oldContext, context)),\n );\n }\n }\n\n /**\n * Access the global evaluation context.\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(): EvaluationContext;\n /**\n * Access the evaluation context for a specific named client.\n * The global evaluation context is returned if a matching named client is not found.\n * @param {string} domain An identifier which logically binds clients with providers\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(domain?: string | undefined): EvaluationContext;\n getContext(domainOrUndefined?: string): EvaluationContext {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const context = this._domainScopedContext.get(domain);\n if (context) {\n return context;\n } else {\n this._logger.debug(`Unable to find context for '${domain}'.`);\n }\n }\n return this._context;\n }\n\n /**\n * Resets the global evaluation context to an empty object.\n */\n clearContext(): Promise<void>;\n /**\n * Removes the evaluation context for a specific named client.\n * @param {string} domain An identifier which logically binds clients with providers\n */\n clearContext(domain: string): Promise<void>;\n async clearContext(domainOrUndefined?: string): Promise<void> {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.delete(domain);\n const newContext = this.getContext();\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, newContext);\n } else {\n this._domainScopedContext.delete(domain);\n }\n } else {\n return this.setContext({});\n }\n }\n\n /**\n * Resets the global evaluation context and removes the evaluation context for\n * all domains.\n */\n async clearContexts(): Promise<void> {\n // Default context must be cleared first to avoid calling the onContextChange\n // handler multiple times for clients bound to a domain.\n await this.clearContext();\n\n // Use allSettled so a promise rejection doesn't affect others\n await Promise.allSettled(Array.from(this._domainScopedProviders.keys()).map((domain) => this.clearContext(domain)));\n }\n\n /**\n * A factory function for creating new named OpenFeature clients. Clients can contain\n * their own state (e.g. logger, hook, context). Multiple clients can be used\n * to segment feature flag configuration.\n *\n * If there is already a provider bound to this name via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that name.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(domain?: string, version?: string): Client {\n return new OpenFeatureClient(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n () => this.getProviderForClient(domain),\n () => this.getProviderStatus(domain),\n () => this.buildAndCacheEventEmitterForClient(domain),\n () => this._logger,\n { domain, version },\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n async clearProviders(): Promise<void> {\n await super.clearProvidersAndSetDefault(NOOP_PROVIDER);\n this._domainScopedContext.clear();\n }\n\n private async runProviderContextChangeHandler(\n domain: string | undefined,\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>,\n oldContext: EvaluationContext,\n newContext: EvaluationContext,\n ): Promise<void> {\n // this should always be set according to the typings, but let's be defensive considering JS\n const providerName = wrapper.provider?.metadata?.name || 'unnamed-provider';\n\n try {\n if (typeof wrapper.provider.onContextChange === 'function') {\n const maybePromise = wrapper.provider.onContextChange(oldContext, newContext);\n\n // only reconcile if the onContextChange method returns a promise\n if (typeof maybePromise?.then === 'function') {\n wrapper.incrementPendingContextChanges();\n wrapper.status = this._statusEnumType.RECONCILING;\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n\n await maybePromise;\n wrapper.decrementPendingContextChanges();\n }\n }\n // only run the event handlers, and update the state if the onContextChange method succeeded\n wrapper.status = this._statusEnumType.READY;\n if (wrapper.allContextChangesSettled) {\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n }\n } catch (err) {\n // run error handlers instead\n wrapper.decrementPendingContextChanges();\n wrapper.status = this._statusEnumType.ERROR;\n if (wrapper.allContextChangesSettled) {\n const error = err as Error | undefined;\n const message = `Error running ${providerName}'s context change handler: ${error?.message}`;\n this._logger?.error(`${message}`, err);\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n });\n this._apiEmitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n }\n }\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import {\n ClientMetadata,\n ErrorCode,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n OpenFeatureError,\n ProviderFatalError,\n ProviderNotReadyError,\n ResolutionDetails,\n SafeLogger,\n StandardResolutionReasons,\n instantiateErrorByErrorCode,\n statusMatchesEvent,\n} from '@openfeature/core';\nimport { FlagEvaluationOptions } from '../../evaluation';\nimport { ProviderEvents } from '../../events';\nimport { InternalEventEmitter } from '../../events/internal/internal-event-emitter';\nimport { Hook } from '../../hooks';\nimport { OpenFeature } from '../../open-feature';\nimport { Provider, ProviderStatus } from '../../provider';\nimport { Client } from './../client';\n\ntype OpenFeatureClientOptions = {\n /**\n * @deprecated Use `domain` instead.\n */\n name?: string;\n domain?: string;\n version?: string;\n};\n\n/**\n * This implementation of the {@link Client} is meant to only be instantiated by the SDK.\n * It should not be used outside the SDK and so should not be exported.\n * @internal\n */\nexport class OpenFeatureClient implements Client {\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n private readonly providerAccessor: () => Provider,\n private readonly providerStatusAccessor: () => ProviderStatus,\n private readonly emitterAccessor: () => InternalEventEmitter,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n // Use domain if name is not provided\n name: this.options.domain ?? this.options.name,\n domain: this.options.domain ?? this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n get providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const shouldRunNow = statusMatchesEvent(eventType, this.providerStatus);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({\n clientName: this.metadata.name,\n domain: this.metadata.domain,\n providerName: this._provider.metadata.name,\n });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler(notificationType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().removeHandler(notificationType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): this {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(flagKey, this._provider.resolveBooleanEvaluation, defaultValue, 'boolean', options);\n }\n\n getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'string',\n options,\n );\n }\n\n getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'number',\n options,\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\n options: FlagEvaluationOptions = {},\n ): EvaluationDetails<T> {\n // merge global, client, and evaluation context\n\n const allHooks = [\n ...OpenFeature.getHooks(),\n ...this.getHooks(),\n ...(options.hooks || []),\n ...(this._provider.hooks || []),\n ];\n const allHooksReversed = [...allHooks].reverse();\n\n const context = {\n ...OpenFeature.getContext(this?.options?.domain),\n };\n\n // this reference cannot change during the course of evaluation\n // it may be used as a key in WeakMaps\n const hookContext: Readonly<HookContext> = {\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: this._provider.metadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\n\n // short circuit evaluation entirely if provider is in a bad state\n if (this.providerStatus === ProviderStatus.NOT_READY) {\n throw new ProviderNotReadyError('provider has not yet initialized');\n } else if (this.providerStatus === ProviderStatus.FATAL) {\n throw new ProviderFatalError('provider is in an irrecoverable error state');\n }\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);\n\n const evaluationDetails = {\n ...resolution,\n flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),\n flagKey,\n };\n\n if (evaluationDetails.errorCode) {\n throw instantiateErrorByErrorCode(evaluationDetails.errorCode);\n }\n\n this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);\n\n return evaluationDetails;\n } catch (err: unknown) {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n this.errorHooks(allHooksReversed, hookContext, err, options);\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze({}),\n flagKey,\n };\n } finally {\n this.finallyHooks(allHooksReversed, hookContext, options);\n }\n }\n\n private beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n Object.freeze(hookContext);\n Object.freeze(hookContext.context);\n\n for (const hook of hooks) {\n hook?.before?.(hookContext, Object.freeze(options.hookHints));\n }\n }\n\n private afterHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks) {\n hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.error?.(hookContext, err, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private finallyHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.finally?.(hookContext, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private get _provider(): Provider {\n return this.providerAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n", "export * from './client';\nexport * from './provider';\nexport * from './evaluation';\nexport * from './open-feature';\nexport * from './events';\nexport * from './hooks';\nexport * from './tracking';\nexport * from '@openfeature/core';\n", "import type {\n CommonProvider,\n EvaluationContext,\n JsonValue,\n Logger,\n ResolutionDetails,\n} from '@openfeature/core';\nimport { ClientProviderStatus } from '@openfeature/core';\nimport type { Hook } from '../hooks';\n\nexport { ClientProviderStatus as ProviderStatus };\n\n/**\n * Interface that providers must implement to resolve flag values for their particular\n * backend or vendor.\n *\n * Implementation for resolving all the required flag types must be defined.\n */\nexport interface Provider extends CommonProvider<ClientProviderStatus> {\n /**\n * A provider hook exposes a mechanism for provider authors to register hooks\n * to tap into various stages of the flag evaluation lifecycle. These hooks can\n * be used to perform side effects and mutate the context for purposes of the\n * provider. Provider hooks are not configured or controlled by the application author.\n */\n readonly hooks?: Hook[];\n\n /**\n * A handler function to reconcile changes made to the static context.\n * Called by the SDK when the context is changed.\n *\n * Returning a promise will put the provider in the RECONCILING state and\n * emit the ProviderEvents.Reconciling event.\n *\n * Return void will avoid putting the provider in the RECONCILING state and\n * **not** emit the ProviderEvents.Reconciling event.\n * @param oldContext\n * @param newContext\n */\n onContextChange?(oldContext: EvaluationContext, newContext: EvaluationContext): Promise<void> | void;\n\n /**\n * Resolve a boolean flag and its evaluation details.\n */\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<boolean>;\n\n /**\n * Resolve a string flag and its evaluation details.\n */\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<string>;\n\n /**\n * Resolve a numeric flag and its evaluation details.\n */\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<number>;\n\n /**\n * Resolve and parse an object flag and its evaluation details.\n */\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<T>;\n}\n", "import type { JsonValue, ResolutionDetails } from '@openfeature/core';\nimport type { Provider } from './provider';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): ResolutionDetails<boolean> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): ResolutionDetails<string> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): ResolutionDetails<number> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): ResolutionDetails<T> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return {\n value: defaultValue,\n reason: REASON_NO_OP,\n };\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import type {\n EvaluationContext,\n FlagValueType,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n FlagNotFoundError,\n GeneralError,\n OpenFeatureError,\n StandardResolutionReasons,\n TypeMismatchError,\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport { OpenFeatureEventEmitter, ProviderEvents } from '../../events';\nimport type { FlagConfiguration, Flag } from './flag-configuration';\nimport { VariantNotFoundError } from './variant-not-found-error';\n\n/**\n * A simple OpenFeature provider intended for demos and as a test stub.\n */\nexport class InMemoryProvider implements Provider {\n public readonly events = new OpenFeatureEventEmitter();\n public readonly runsOn = 'client';\n readonly metadata = {\n name: 'in-memory',\n } as const;\n private _flagConfiguration: FlagConfiguration;\n private _context: EvaluationContext | undefined;\n\n constructor(flagConfiguration: FlagConfiguration = {}) {\n this._flagConfiguration = { ...flagConfiguration };\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n */\n async putConfiguration(flagConfiguration: FlagConfiguration) {\n try {\n const flagsChanged = Object.entries({...flagConfiguration, ...this._flagConfiguration})\n .map(([key]) => key);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n } catch (err) {\n this.events.emit(ProviderEvents.Error);\n throw err;\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<boolean> {\n return this.resolveAndCheckFlag<boolean>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<number> {\n return this.resolveAndCheckFlag<number>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<string> {\n return this.resolveAndCheckFlag<string>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n return this.resolveAndCheckFlag<T>(flagKey, defaultValue, context || this._context, logger);\n }\n\n private resolveAndCheckFlag<T extends JsonValue | FlagValueType>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n if (!(flagKey in this._flagConfiguration)) {\n const message = `no flag found with key ${flagKey}`;\n logger?.debug(message);\n throw new FlagNotFoundError(message);\n }\n\n if (this._flagConfiguration[flagKey].disabled) {\n return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };\n }\n\n const resolvedFlag = this.resolveFlagWithReason(flagKey, context) as ResolutionDetails<T>;\n\n if (resolvedFlag.value === undefined) {\n const message = `no value associated with variant provided for ${flagKey} found`;\n logger?.error(message);\n throw new VariantNotFoundError(message);\n }\n\n if (typeof resolvedFlag.value != typeof defaultValue) {\n throw new TypeMismatchError();\n }\n\n return resolvedFlag;\n }\n\n private resolveFlagWithReason<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n try {\n const resolutionResult = this.lookupFlagValue<T>(flagKey, ctx);\n\n return resolutionResult;\n } catch (error: unknown) {\n if (!(error instanceof OpenFeatureError)) {\n throw new GeneralError((error as Error)?.message || 'unknown error');\n }\n throw error;\n }\n }\n\n private lookupFlagValue<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n const flagSpec: Flag = this._flagConfiguration[flagKey];\n\n const isContextEval = ctx && flagSpec?.contextEvaluator;\n const variant = isContextEval ? flagSpec.contextEvaluator?.(ctx) : flagSpec.defaultVariant;\n\n const value = variant && flagSpec?.variants[variant];\n\n const reason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;\n\n return {\n value: value as T,\n ...(variant && { variant }),\n reason,\n };\n }\n}\n", "import { GenericEventEmitter } from '@openfeature/core';\nimport { EventEmitter } from 'eventemitter3';\nimport type { ProviderEmittableEvents } from './events';\n\n/**\n * The OpenFeatureEventEmitter can be used by provider developers to emit\n * events at various parts of the provider lifecycle.\n *\n * NOTE: Ready and error events are automatically emitted by the SDK based on\n * the result of the initialize method.\n */\nexport class OpenFeatureEventEmitter extends GenericEventEmitter<ProviderEmittableEvents> {\n protected readonly eventEmitter = new EventEmitter();\n\n constructor() {\n super();\n }\n}\n", "import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n", "import { ClientProviderEvents } from '@openfeature/core';\n\nexport { ClientProviderEvents as ProviderEvents};\n\n/**\n * A subset of events that can be directly emitted by providers.\n */\nexport type ProviderEmittableEvents = Exclude<ClientProviderEvents, ClientProviderEvents.ContextChanged>;", "import { ErrorCode, OpenFeatureError } from '@openfeature/core';\n\n/**\n * A custom error for the in-memory provider.\n * Indicates the resolved or default variant doesn't exist.\n */\nexport class VariantNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, VariantNotFoundError.prototype);\n this.name = 'VariantNotFoundError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import type {\n ClientProviderStatus,\n EvaluationContext,\n GenericEventEmitter,\n ManageContext} from '@openfeature/core';\nimport {\n OpenFeatureCommonAPI,\n ProviderWrapper,\n objectOrUndefined,\n stringOrUndefined,\n} from '@openfeature/core';\nimport type { Client } from './client';\nimport { OpenFeatureClient } from './client/internal/open-feature-client';\nimport { OpenFeatureEventEmitter, ProviderEvents } from './events';\nimport type { Hook } from './hooks';\nimport type { Provider} from './provider';\nimport { NOOP_PROVIDER, ProviderStatus } from './provider';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/web-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\ntype DomainRecord = {\n domain?: string;\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>;\n};\n\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI\n extends OpenFeatureCommonAPI<ClientProviderStatus, Provider, Hook>\n implements ManageContext<Promise<void>>\n{\n protected _statusEnumType: typeof ProviderStatus = ProviderStatus;\n protected _apiEmitter: GenericEventEmitter<ProviderEvents> = new OpenFeatureEventEmitter();\n protected _defaultProvider: ProviderWrapper<Provider, ClientProviderStatus> = new ProviderWrapper(\n NOOP_PROVIDER,\n ProviderStatus.NOT_READY,\n this._statusEnumType,\n );\n protected _domainScopedProviders: Map<string, ProviderWrapper<Provider, ClientProviderStatus>> = new Map();\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n private constructor() {\n super('client');\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n private getProviderStatus(domain?: string): ProviderStatus {\n if (!domain) {\n return this._defaultProvider.status;\n }\n\n return this._domainScopedProviders.get(domain)?.status ?? this._defaultProvider.status;\n }\n\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(provider: Provider): Promise<void>;\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(provider: Provider, context: EvaluationContext): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider, context: EvaluationContext): Promise<void>;\n async setProviderAndWait(\n clientOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Promise<void> {\n const domain = stringOrUndefined(clientOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(clientOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n await this.setAwaitableProvider(domain, provider);\n }\n\n /**\n * Sets the default provider for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider): this;\n /**\n * Sets the default provider and evaluation context for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider, context: EvaluationContext): this;\n /**\n * Sets the provider for flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider): this;\n /**\n * Sets the provider and evaluation context flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider, context: EvaluationContext): this;\n setProvider(\n domainOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): this {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(domainOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n const maybePromise = this.setAwaitableProvider(domain, provider);\n\n // The setProvider method doesn't return a promise so we need to catch and\n // log any errors that occur during provider initialization to avoid having\n // an unhandled promise rejection.\n Promise.resolve(maybePromise).catch((err) => {\n this._logger.error('Error during provider initialization:', err);\n });\n return this;\n }\n\n /**\n * Sets the evaluation context globally.\n * This will be used by all providers that have not bound to a domain.\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext({ region: \"us\" });\n */\n async setContext(context: EvaluationContext): Promise<void>;\n /**\n * Sets the evaluation context for a specific provider.\n * This will only affect providers bound to a domain.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext(\"test\", { scope: \"provider\" });\n * OpenFeature.setProvider(new MyProvider()) // Uses the default context\n * OpenFeature.setProvider(\"test\", new MyProvider()) // Uses context: { scope: \"provider\" }\n */\n async setContext(domain: string, context: EvaluationContext): Promise<void>;\n async setContext<T extends EvaluationContext>(domainOrContext: T | string, contextOrUndefined?: T): Promise<void> {\n const domain = stringOrUndefined(domainOrContext);\n const context = objectOrUndefined<T>(domainOrContext) ?? objectOrUndefined(contextOrUndefined) ?? {};\n\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.set(domain, context);\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, context);\n } else {\n this._domainScopedContext.set(domain, context);\n }\n } else {\n const oldContext = this._context;\n this._context = context;\n\n // collect all providers that are using the default context (not bound to a domain)\n const unboundProviders: DomainRecord[] = Array.from(this._domainScopedProviders.entries())\n .filter(([domain]) => !this._domainScopedContext.has(domain))\n .reduce<DomainRecord[]>((acc, [domain, wrapper]) => {\n acc.push({ domain, wrapper });\n return acc;\n }, []);\n\n const allDomainRecords: DomainRecord[] = [\n // add in the default (no domain)\n { domain: undefined, wrapper: this._defaultProvider },\n ...unboundProviders,\n ];\n await Promise.all(\n allDomainRecords.map((dm) => this.runProviderContextChangeHandler(dm.domain, dm.wrapper, oldContext, context)),\n );\n }\n }\n\n /**\n * Access the global evaluation context.\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(): EvaluationContext;\n /**\n * Access the evaluation context for a specific named client.\n * The global evaluation context is returned if a matching named client is not found.\n * @param {string} domain An identifier which logically binds clients with providers\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(domain?: string | undefined): EvaluationContext;\n getContext(domainOrUndefined?: string): EvaluationContext {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const context = this._domainScopedContext.get(domain);\n if (context) {\n return context;\n } else {\n this._logger.debug(`Unable to find context for '${domain}'.`);\n }\n }\n return this._context;\n }\n\n /**\n * Resets the global evaluation context to an empty object.\n */\n clearContext(): Promise<void>;\n /**\n * Removes the evaluation context for a specific named client.\n * @param {string} domain An identifier which logically binds clients with providers\n */\n clearContext(domain: string): Promise<void>;\n async clearContext(domainOrUndefined?: string): Promise<void> {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.delete(domain);\n const newContext = this.getContext();\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, newContext);\n } else {\n this._domainScopedContext.delete(domain);\n }\n } else {\n return this.setContext({});\n }\n }\n\n /**\n * Resets the global evaluation context and removes the evaluation context for\n * all domains.\n */\n async clearContexts(): Promise<void> {\n // Default context must be cleared first to avoid calling the onContextChange\n // handler multiple times for clients bound to a domain.\n await this.clearContext();\n\n // Use allSettled so a promise rejection doesn't affect others\n await Promise.allSettled(Array.from(this._domainScopedProviders.keys()).map((domain) => this.clearContext(domain)));\n }\n\n /**\n * A factory function for creating new named OpenFeature clients. Clients can contain\n * their own state (e.g. logger, hook, context). Multiple clients can be used\n * to segment feature flag configuration.\n *\n * If there is already a provider bound to this name via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that name.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(domain?: string, version?: string): Client {\n return new OpenFeatureClient(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n () => this.getProviderForClient(domain),\n () => this.getProviderStatus(domain),\n () => this.buildAndCacheEventEmitterForClient(domain),\n (domain?: string) => this.getContext(domain),\n () => this.getHooks(),\n () => this._logger,\n { domain, version },\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n async clearProviders(): Promise<void> {\n await super.clearProvidersAndSetDefault(NOOP_PROVIDER);\n this._domainScopedContext.clear();\n }\n\n private async runProviderContextChangeHandler(\n domain: string | undefined,\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>,\n oldContext: EvaluationContext,\n newContext: EvaluationContext,\n ): Promise<void> {\n // this should always be set according to the typings, but let's be defensive considering JS\n const providerName = wrapper.provider?.metadata?.name || 'unnamed-provider';\n\n try {\n if (typeof wrapper.provider.onContextChange === 'function') {\n const maybePromise = wrapper.provider.onContextChange(oldContext, newContext);\n\n // only reconcile if the onContextChange method returns a promise\n if (typeof maybePromise?.then === 'function') {\n wrapper.incrementPendingContextChanges();\n wrapper.status = this._statusEnumType.RECONCILING;\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n\n await maybePromise;\n wrapper.decrementPendingContextChanges();\n }\n }\n // only run the event handlers, and update the state if the onContextChange method succeeded\n wrapper.status = this._statusEnumType.READY;\n if (wrapper.allContextChangesSettled) {\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n }\n } catch (err) {\n // run error handlers instead\n wrapper.decrementPendingContextChanges();\n wrapper.status = this._statusEnumType.ERROR;\n if (wrapper.allContextChangesSettled) {\n const error = err as Error | undefined;\n const message = `Error running ${providerName}'s context change handler: ${error?.message}`;\n this._logger?.error(`${message}`, err);\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n });\n this._apiEmitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n }\n }\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import type {\n ClientMetadata,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n TrackingEventDetails,\n OpenFeatureError,\n ResolutionDetails } from '@openfeature/core';\nimport {\n ErrorCode,\n ProviderFatalError,\n ProviderNotReadyError,\n SafeLogger,\n StandardResolutionReasons,\n instantiateErrorByErrorCode,\n statusMatchesEvent,\n} from '@openfeature/core';\nimport type { FlagEvaluationOptions } from '../../evaluation';\nimport type { ProviderEvents } from '../../events';\nimport type { InternalEventEmitter } from '../../events/internal/internal-event-emitter';\nimport type { Hook } from '../../hooks';\nimport type { Provider} from '../../provider';\nimport { ProviderStatus } from '../../provider';\nimport type { Client } from './../client';\n\ntype OpenFeatureClientOptions = {\n /**\n * @deprecated Use `domain` instead.\n */\n name?: string;\n domain?: string;\n version?: string;\n};\n\n/**\n * This implementation of the {@link Client} is meant to only be instantiated by the SDK.\n * It should not be used outside the SDK and so should not be exported.\n * @internal\n */\nexport class OpenFeatureClient implements Client {\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n private readonly providerAccessor: () => Provider,\n private readonly providerStatusAccessor: () => ProviderStatus,\n private readonly emitterAccessor: () => InternalEventEmitter,\n private readonly apiContextAccessor: (domain?: string) => EvaluationContext,\n private readonly apiHooksAccessor: () => Hook[],\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n // Use domain if name is not provided\n name: this.options.domain ?? this.options.name,\n domain: this.options.domain ?? this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n get providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const shouldRunNow = statusMatchesEvent(eventType, this.providerStatus);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({\n clientName: this.metadata.name,\n domain: this.metadata.domain,\n providerName: this._provider.metadata.name,\n });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler(notificationType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().removeHandler(notificationType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): this {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(flagKey, this._provider.resolveBooleanEvaluation, defaultValue, 'boolean', options);\n }\n\n getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'string',\n options,\n );\n }\n\n getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'number',\n options,\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n track(occurrenceKey: string, occurrenceDetails: TrackingEventDetails): void {\n try {\n this.shortCircuitIfNotReady();\n\n if (typeof this._provider.track === 'function') {\n // copy and freeze the context\n const frozenContext = Object.freeze({\n ...this.apiContextAccessor(this?.options?.domain),\n });\n return this._provider.track?.(occurrenceKey, frozenContext, occurrenceDetails);\n } else {\n this._logger.debug('Provider does not support the track function; will no-op.');\n }\n } catch (err) {\n this._logger.debug('Error recording tracking event.', err);\n }\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\n options: FlagEvaluationOptions = {},\n ): EvaluationDetails<T> {\n // merge global, client, and evaluation context\n\n const allHooks = [\n ...this.apiHooksAccessor(),\n ...this.getHooks(),\n ...(options.hooks || []),\n ...(this._provider.hooks || []),\n ];\n const allHooksReversed = [...allHooks].reverse();\n\n const context = {\n ...this.apiContextAccessor(this?.options?.domain),\n };\n\n // this reference cannot change during the course of evaluation\n // it may be used as a key in WeakMaps\n const hookContext: Readonly<HookContext> = {\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: this._provider.metadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\n\n this.shortCircuitIfNotReady();\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);\n\n const evaluationDetails = {\n ...resolution,\n flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),\n flagKey,\n };\n\n if (evaluationDetails.errorCode) {\n throw instantiateErrorByErrorCode(evaluationDetails.errorCode);\n }\n\n this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);\n\n return evaluationDetails;\n } catch (err: unknown) {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n this.errorHooks(allHooksReversed, hookContext, err, options);\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze({}),\n flagKey,\n };\n } finally {\n this.finallyHooks(allHooksReversed, hookContext, options);\n }\n }\n\n private beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n Object.freeze(hookContext);\n Object.freeze(hookContext.context);\n\n for (const hook of hooks) {\n hook?.before?.(hookContext, Object.freeze(options.hookHints));\n }\n }\n\n private afterHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks) {\n hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.error?.(hookContext, err, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private finallyHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.finally?.(hookContext, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private get _provider(): Provider {\n return this.providerAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n\n private shortCircuitIfNotReady() {\n // short circuit evaluation entirely if provider is in a bad state\n if (this.providerStatus === ProviderStatus.NOT_READY) {\n throw new ProviderNotReadyError('provider has not yet initialized');\n } else if (this.providerStatus === ProviderStatus.FATAL) {\n throw new ProviderFatalError('provider is in an irrecoverable error state');\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["module", "EventEmitter", "import_core", "import_core", "EventEmitter", "import_core", "import_core", "import_core", "import_core", "err", "domain"]
7
7
  }
package/dist/esm/index.js CHANGED
@@ -73,8 +73,7 @@ var require_eventemitter3 = __commonJS({
73
73
  }
74
74
  if (Object.create) {
75
75
  Events.prototype = /* @__PURE__ */ Object.create(null);
76
- if (!new Events().__proto__)
77
- prefix = false;
76
+ if (!new Events().__proto__) prefix = false;
78
77
  }
79
78
  function EE(fn, context, once) {
80
79
  this.fn = fn;
@@ -86,19 +85,14 @@ var require_eventemitter3 = __commonJS({
86
85
  throw new TypeError("The listener must be a function");
87
86
  }
88
87
  var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
89
- if (!emitter._events[evt])
90
- emitter._events[evt] = listener, emitter._eventsCount++;
91
- else if (!emitter._events[evt].fn)
92
- emitter._events[evt].push(listener);
93
- else
94
- emitter._events[evt] = [emitter._events[evt], listener];
88
+ if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
89
+ else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
90
+ else emitter._events[evt] = [emitter._events[evt], listener];
95
91
  return emitter;
96
92
  }
97
93
  function clearEvent(emitter, evt) {
98
- if (--emitter._eventsCount === 0)
99
- emitter._events = new Events();
100
- else
101
- delete emitter._events[evt];
94
+ if (--emitter._eventsCount === 0) emitter._events = new Events();
95
+ else delete emitter._events[evt];
102
96
  }
103
97
  function EventEmitter2() {
104
98
  this._events = new Events();
@@ -106,11 +100,9 @@ var require_eventemitter3 = __commonJS({
106
100
  }
107
101
  EventEmitter2.prototype.eventNames = function eventNames() {
108
102
  var names = [], events, name;
109
- if (this._eventsCount === 0)
110
- return names;
103
+ if (this._eventsCount === 0) return names;
111
104
  for (name in events = this._events) {
112
- if (has.call(events, name))
113
- names.push(prefix ? name.slice(1) : name);
105
+ if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
114
106
  }
115
107
  if (Object.getOwnPropertySymbols) {
116
108
  return names.concat(Object.getOwnPropertySymbols(events));
@@ -119,10 +111,8 @@ var require_eventemitter3 = __commonJS({
119
111
  };
120
112
  EventEmitter2.prototype.listeners = function listeners(event) {
121
113
  var evt = prefix ? prefix + event : event, handlers = this._events[evt];
122
- if (!handlers)
123
- return [];
124
- if (handlers.fn)
125
- return [handlers.fn];
114
+ if (!handlers) return [];
115
+ if (handlers.fn) return [handlers.fn];
126
116
  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
127
117
  ee[i] = handlers[i].fn;
128
118
  }
@@ -130,20 +120,16 @@ var require_eventemitter3 = __commonJS({
130
120
  };
131
121
  EventEmitter2.prototype.listenerCount = function listenerCount(event) {
132
122
  var evt = prefix ? prefix + event : event, listeners = this._events[evt];
133
- if (!listeners)
134
- return 0;
135
- if (listeners.fn)
136
- return 1;
123
+ if (!listeners) return 0;
124
+ if (listeners.fn) return 1;
137
125
  return listeners.length;
138
126
  };
139
127
  EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
140
128
  var evt = prefix ? prefix + event : event;
141
- if (!this._events[evt])
142
- return false;
129
+ if (!this._events[evt]) return false;
143
130
  var listeners = this._events[evt], len = arguments.length, args, i;
144
131
  if (listeners.fn) {
145
- if (listeners.once)
146
- this.removeListener(event, listeners.fn, void 0, true);
132
+ if (listeners.once) this.removeListener(event, listeners.fn, void 0, true);
147
133
  switch (len) {
148
134
  case 1:
149
135
  return listeners.fn.call(listeners.context), true;
@@ -165,8 +151,7 @@ var require_eventemitter3 = __commonJS({
165
151
  } else {
166
152
  var length = listeners.length, j;
167
153
  for (i = 0; i < length; i++) {
168
- if (listeners[i].once)
169
- this.removeListener(event, listeners[i].fn, void 0, true);
154
+ if (listeners[i].once) this.removeListener(event, listeners[i].fn, void 0, true);
170
155
  switch (len) {
171
156
  case 1:
172
157
  listeners[i].fn.call(listeners[i].context);
@@ -181,10 +166,9 @@ var require_eventemitter3 = __commonJS({
181
166
  listeners[i].fn.call(listeners[i].context, a1, a2, a3);
182
167
  break;
183
168
  default:
184
- if (!args)
185
- for (j = 1, args = new Array(len - 1); j < len; j++) {
186
- args[j - 1] = arguments[j];
187
- }
169
+ if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {
170
+ args[j - 1] = arguments[j];
171
+ }
188
172
  listeners[i].fn.apply(listeners[i].context, args);
189
173
  }
190
174
  }
@@ -199,8 +183,7 @@ var require_eventemitter3 = __commonJS({
199
183
  };
200
184
  EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {
201
185
  var evt = prefix ? prefix + event : event;
202
- if (!this._events[evt])
203
- return this;
186
+ if (!this._events[evt]) return this;
204
187
  if (!fn) {
205
188
  clearEvent(this, evt);
206
189
  return this;
@@ -216,10 +199,8 @@ var require_eventemitter3 = __commonJS({
216
199
  events.push(listeners[i]);
217
200
  }
218
201
  }
219
- if (events.length)
220
- this._events[evt] = events.length === 1 ? events[0] : events;
221
- else
222
- clearEvent(this, evt);
202
+ if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
203
+ else clearEvent(this, evt);
223
204
  }
224
205
  return this;
225
206
  };
@@ -227,8 +208,7 @@ var require_eventemitter3 = __commonJS({
227
208
  var evt;
228
209
  if (event) {
229
210
  evt = prefix ? prefix + event : event;
230
- if (this._events[evt])
231
- clearEvent(this, evt);
211
+ if (this._events[evt]) clearEvent(this, evt);
232
212
  } else {
233
213
  this._events = new Events();
234
214
  this._eventsCount = 0;
@@ -331,7 +311,7 @@ var InMemoryProvider = class {
331
311
  putConfiguration(flagConfiguration) {
332
312
  return __async(this, null, function* () {
333
313
  try {
334
- const flagsChanged = Object.entries(flagConfiguration).filter(([key, value]) => this._flagConfiguration[key] !== value).map(([key]) => key);
314
+ const flagsChanged = Object.entries(__spreadValues(__spreadValues({}, flagConfiguration), this._flagConfiguration)).map(([key]) => key);
335
315
  this._flagConfiguration = __spreadValues({}, flagConfiguration);
336
316
  this.events.emit(ClientProviderEvents.ConfigurationChanged, { flagsChanged });
337
317
  } catch (err) {
@@ -417,10 +397,12 @@ import {
417
397
  statusMatchesEvent
418
398
  } from "@openfeature/core";
419
399
  var OpenFeatureClient = class {
420
- constructor(providerAccessor, providerStatusAccessor, emitterAccessor, globalLogger, options) {
400
+ constructor(providerAccessor, providerStatusAccessor, emitterAccessor, apiContextAccessor, apiHooksAccessor, globalLogger, options) {
421
401
  this.providerAccessor = providerAccessor;
422
402
  this.providerStatusAccessor = providerStatusAccessor;
423
403
  this.emitterAccessor = emitterAccessor;
404
+ this.apiContextAccessor = apiContextAccessor;
405
+ this.apiHooksAccessor = apiHooksAccessor;
424
406
  this.globalLogger = globalLogger;
425
407
  this.options = options;
426
408
  this._hooks = [];
@@ -513,16 +495,30 @@ var OpenFeatureClient = class {
513
495
  getObjectDetails(flagKey, defaultValue, options) {
514
496
  return this.evaluate(flagKey, this._provider.resolveObjectEvaluation, defaultValue, "object", options);
515
497
  }
498
+ track(occurrenceKey, occurrenceDetails) {
499
+ var _a, _b, _c;
500
+ try {
501
+ this.shortCircuitIfNotReady();
502
+ if (typeof this._provider.track === "function") {
503
+ const frozenContext = Object.freeze(__spreadValues({}, this.apiContextAccessor((_a = this == null ? void 0 : this.options) == null ? void 0 : _a.domain)));
504
+ return (_c = (_b = this._provider).track) == null ? void 0 : _c.call(_b, occurrenceKey, frozenContext, occurrenceDetails);
505
+ } else {
506
+ this._logger.debug("Provider does not support the track function; will no-op.");
507
+ }
508
+ } catch (err) {
509
+ this._logger.debug("Error recording tracking event.", err);
510
+ }
511
+ }
516
512
  evaluate(flagKey, resolver, defaultValue, flagType, options = {}) {
517
513
  var _a, _b;
518
514
  const allHooks = [
519
- ...OpenFeature.getHooks(),
515
+ ...this.apiHooksAccessor(),
520
516
  ...this.getHooks(),
521
517
  ...options.hooks || [],
522
518
  ...this._provider.hooks || []
523
519
  ];
524
520
  const allHooksReversed = [...allHooks].reverse();
525
- const context = __spreadValues({}, OpenFeature.getContext((_a = this == null ? void 0 : this.options) == null ? void 0 : _a.domain));
521
+ const context = __spreadValues({}, this.apiContextAccessor((_a = this == null ? void 0 : this.options) == null ? void 0 : _a.domain));
526
522
  const hookContext = {
527
523
  flagKey,
528
524
  defaultValue,
@@ -534,11 +530,7 @@ var OpenFeatureClient = class {
534
530
  };
535
531
  try {
536
532
  this.beforeHooks(allHooks, hookContext, options);
537
- if (this.providerStatus === ClientProviderStatus.NOT_READY) {
538
- throw new ProviderNotReadyError("provider has not yet initialized");
539
- } else if (this.providerStatus === ClientProviderStatus.FATAL) {
540
- throw new ProviderFatalError("provider is in an irrecoverable error state");
541
- }
533
+ this.shortCircuitIfNotReady();
542
534
  const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);
543
535
  const evaluationDetails = __spreadProps(__spreadValues({}, resolution), {
544
536
  flagMetadata: Object.freeze((_b = resolution.flagMetadata) != null ? _b : {}),
@@ -613,6 +605,13 @@ var OpenFeatureClient = class {
613
605
  get _logger() {
614
606
  return this._clientLogger || this.globalLogger();
615
607
  }
608
+ shortCircuitIfNotReady() {
609
+ if (this.providerStatus === ClientProviderStatus.NOT_READY) {
610
+ throw new ProviderNotReadyError("provider has not yet initialized");
611
+ } else if (this.providerStatus === ClientProviderStatus.FATAL) {
612
+ throw new ProviderFatalError("provider is in an irrecoverable error state");
613
+ }
614
+ }
616
615
  };
617
616
 
618
617
  // src/open-feature.ts
@@ -774,6 +773,8 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends OpenFeatureCommonAPI {
774
773
  () => this.getProviderForClient(domain),
775
774
  () => this.getProviderStatus(domain),
776
775
  () => this.buildAndCacheEventEmitterForClient(domain),
776
+ (domain2) => this.getContext(domain2),
777
+ () => this.getHooks(),
777
778
  () => this._logger,
778
779
  { domain, version }
779
780
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../node_modules/eventemitter3/index.js", "../../src/provider/provider.ts", "../../src/provider/no-op-provider.ts", "../../src/provider/in-memory-provider/in-memory-provider.ts", "../../src/events/open-feature-event-emitter.ts", "../../../../node_modules/eventemitter3/index.mjs", "../../src/events/events.ts", "../../src/provider/in-memory-provider/variant-not-found-error.ts", "../../src/open-feature.ts", "../../src/client/internal/open-feature-client.ts", "../../src/index.ts"],
4
- "sourcesContent": ["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n", "import { ClientProviderStatus, CommonProvider, EvaluationContext, JsonValue, Logger, ResolutionDetails } from '@openfeature/core';\nimport { Hook } from '../hooks';\n\nexport { ClientProviderStatus as ProviderStatus };\n\n/**\n * Interface that providers must implement to resolve flag values for their particular\n * backend or vendor.\n *\n * Implementation for resolving all the required flag types must be defined.\n */\nexport interface Provider extends CommonProvider<ClientProviderStatus> {\n /**\n * A provider hook exposes a mechanism for provider authors to register hooks\n * to tap into various stages of the flag evaluation lifecycle. These hooks can\n * be used to perform side effects and mutate the context for purposes of the\n * provider. Provider hooks are not configured or controlled by the application author.\n */\n readonly hooks?: Hook[];\n\n /**\n * A handler function to reconcile changes made to the static context.\n * Called by the SDK when the context is changed.\n *\n * Returning a promise will put the provider in the RECONCILING state and\n * emit the ProviderEvents.Reconciling event.\n *\n * Return void will avoid putting the provider in the RECONCILING state and\n * **not** emit the ProviderEvents.Reconciling event.\n * @param oldContext\n * @param newContext\n */\n onContextChange?(oldContext: EvaluationContext, newContext: EvaluationContext): Promise<void> | void;\n\n /**\n * Resolve a boolean flag and its evaluation details.\n */\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<boolean>;\n\n /**\n * Resolve a string flag and its evaluation details.\n */\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<string>;\n\n /**\n * Resolve a numeric flag and its evaluation details.\n */\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<number>;\n\n /**\n * Resolve and parse an object flag and its evaluation details.\n */\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<T>;\n}\n", "import { JsonValue, ResolutionDetails } from '@openfeature/core';\nimport { Provider } from './provider';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): ResolutionDetails<boolean> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): ResolutionDetails<string> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): ResolutionDetails<number> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): ResolutionDetails<T> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return {\n value: defaultValue,\n reason: REASON_NO_OP,\n };\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import {\n EvaluationContext,\n FlagNotFoundError,\n FlagValueType,\n GeneralError,\n JsonValue,\n Logger,\n OpenFeatureError,\n ResolutionDetails,\n StandardResolutionReasons,\n TypeMismatchError,\n} from '@openfeature/core';\nimport { Provider } from '../provider';\nimport { OpenFeatureEventEmitter, ProviderEvents } from '../../events';\nimport { FlagConfiguration, Flag } from './flag-configuration';\nimport { VariantNotFoundError } from './variant-not-found-error';\n\n/**\n * A simple OpenFeature provider intended for demos and as a test stub.\n */\nexport class InMemoryProvider implements Provider {\n public readonly events = new OpenFeatureEventEmitter();\n public readonly runsOn = 'client';\n readonly metadata = {\n name: 'in-memory',\n } as const;\n private _flagConfiguration: FlagConfiguration;\n private _context: EvaluationContext | undefined;\n\n constructor(flagConfiguration: FlagConfiguration = {}) {\n this._flagConfiguration = { ...flagConfiguration };\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n */\n async putConfiguration(flagConfiguration: FlagConfiguration) {\n try {\n const flagsChanged = Object.entries(flagConfiguration)\n .filter(([key, value]) => this._flagConfiguration[key] !== value)\n .map(([key]) => key);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n } catch (err) {\n this.events.emit(ProviderEvents.Error);\n throw err;\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<boolean> {\n return this.resolveAndCheckFlag<boolean>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<number> {\n return this.resolveAndCheckFlag<number>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<string> {\n return this.resolveAndCheckFlag<string>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n return this.resolveAndCheckFlag<T>(flagKey, defaultValue, context || this._context, logger);\n }\n\n private resolveAndCheckFlag<T extends JsonValue | FlagValueType>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n if (!(flagKey in this._flagConfiguration)) {\n const message = `no flag found with key ${flagKey}`;\n logger?.debug(message);\n throw new FlagNotFoundError(message);\n }\n\n if (this._flagConfiguration[flagKey].disabled) {\n return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };\n }\n\n const resolvedFlag = this.resolveFlagWithReason(flagKey, context) as ResolutionDetails<T>;\n\n if (resolvedFlag.value === undefined) {\n const message = `no value associated with variant provided for ${flagKey} found`;\n logger?.error(message);\n throw new VariantNotFoundError(message);\n }\n\n if (typeof resolvedFlag.value != typeof defaultValue) {\n throw new TypeMismatchError();\n }\n\n return resolvedFlag;\n }\n\n private resolveFlagWithReason<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n try {\n const resolutionResult = this.lookupFlagValue<T>(flagKey, ctx);\n\n return resolutionResult;\n } catch (error: unknown) {\n if (!(error instanceof OpenFeatureError)) {\n throw new GeneralError((error as Error)?.message || 'unknown error');\n }\n throw error;\n }\n }\n\n private lookupFlagValue<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n const flagSpec: Flag = this._flagConfiguration[flagKey];\n\n const isContextEval = ctx && flagSpec?.contextEvaluator;\n const variant = isContextEval ? flagSpec.contextEvaluator?.(ctx) : flagSpec.defaultVariant;\n\n const value = variant && flagSpec?.variants[variant];\n\n const reason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;\n\n return {\n value: value as T,\n ...(variant && { variant }),\n reason,\n };\n }\n}\n", "import { GenericEventEmitter } from '@openfeature/core';\nimport { EventEmitter } from 'eventemitter3';\nimport { ProviderEmittableEvents } from './events';\n\n/**\n * The OpenFeatureEventEmitter can be used by provider developers to emit\n * events at various parts of the provider lifecycle.\n *\n * NOTE: Ready and error events are automatically emitted by the SDK based on\n * the result of the initialize method.\n */\nexport class OpenFeatureEventEmitter extends GenericEventEmitter<ProviderEmittableEvents> {\n protected readonly eventEmitter = new EventEmitter();\n\n constructor() {\n super();\n }\n}\n", "import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n", "import { ClientProviderEvents } from '@openfeature/core';\n\nexport { ClientProviderEvents as ProviderEvents};\n\n/**\n * A subset of events that can be directly emitted by providers.\n */\nexport type ProviderEmittableEvents = Exclude<ClientProviderEvents, ClientProviderEvents.ContextChanged>;", "import { ErrorCode, OpenFeatureError } from '@openfeature/core';\n\n/**\n * A custom error for the in-memory provider.\n * Indicates the resolved or default variant doesn't exist.\n */\nexport class VariantNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, VariantNotFoundError.prototype);\n this.name = 'VariantNotFoundError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import {\n ClientProviderStatus,\n EvaluationContext,\n GenericEventEmitter,\n ManageContext,\n OpenFeatureCommonAPI,\n ProviderWrapper,\n objectOrUndefined,\n stringOrUndefined,\n} from '@openfeature/core';\nimport { Client } from './client';\nimport { OpenFeatureClient } from './client/internal/open-feature-client';\nimport { OpenFeatureEventEmitter, ProviderEvents } from './events';\nimport { Hook } from './hooks';\nimport { NOOP_PROVIDER, Provider, ProviderStatus } from './provider';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/web-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\ntype DomainRecord = {\n domain?: string;\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>;\n};\n\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI\n extends OpenFeatureCommonAPI<ClientProviderStatus, Provider, Hook>\n implements ManageContext<Promise<void>>\n{\n protected _statusEnumType: typeof ProviderStatus = ProviderStatus;\n protected _apiEmitter: GenericEventEmitter<ProviderEvents> = new OpenFeatureEventEmitter();\n protected _defaultProvider: ProviderWrapper<Provider, ClientProviderStatus> = new ProviderWrapper(\n NOOP_PROVIDER,\n ProviderStatus.NOT_READY,\n this._statusEnumType,\n );\n protected _domainScopedProviders: Map<string, ProviderWrapper<Provider, ClientProviderStatus>> = new Map();\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n private constructor() {\n super('client');\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n private getProviderStatus(domain?: string): ProviderStatus {\n if (!domain) {\n return this._defaultProvider.status;\n }\n\n return this._domainScopedProviders.get(domain)?.status ?? this._defaultProvider.status;\n }\n\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(provider: Provider): Promise<void>;\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(provider: Provider, context: EvaluationContext): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider, context: EvaluationContext): Promise<void>;\n async setProviderAndWait(\n clientOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Promise<void> {\n const domain = stringOrUndefined(clientOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(clientOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n await this.setAwaitableProvider(domain, provider);\n }\n\n /**\n * Sets the default provider for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider): this;\n /**\n * Sets the default provider and evaluation context for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider, context: EvaluationContext): this;\n /**\n * Sets the provider for flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider): this;\n /**\n * Sets the provider and evaluation context flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider, context: EvaluationContext): this;\n setProvider(\n domainOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): this {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(domainOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n const maybePromise = this.setAwaitableProvider(domain, provider);\n\n // The setProvider method doesn't return a promise so we need to catch and\n // log any errors that occur during provider initialization to avoid having\n // an unhandled promise rejection.\n Promise.resolve(maybePromise).catch((err) => {\n this._logger.error('Error during provider initialization:', err);\n });\n return this;\n }\n\n /**\n * Sets the evaluation context globally.\n * This will be used by all providers that have not bound to a domain.\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext({ region: \"us\" });\n */\n async setContext(context: EvaluationContext): Promise<void>;\n /**\n * Sets the evaluation context for a specific provider.\n * This will only affect providers bound to a domain.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext(\"test\", { scope: \"provider\" });\n * OpenFeature.setProvider(new MyProvider()) // Uses the default context\n * OpenFeature.setProvider(\"test\", new MyProvider()) // Uses context: { scope: \"provider\" }\n */\n async setContext(domain: string, context: EvaluationContext): Promise<void>;\n async setContext<T extends EvaluationContext>(domainOrContext: T | string, contextOrUndefined?: T): Promise<void> {\n const domain = stringOrUndefined(domainOrContext);\n const context = objectOrUndefined<T>(domainOrContext) ?? objectOrUndefined(contextOrUndefined) ?? {};\n\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.set(domain, context);\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, context);\n } else {\n this._domainScopedContext.set(domain, context);\n }\n } else {\n const oldContext = this._context;\n this._context = context;\n\n // collect all providers that are using the default context (not bound to a domain)\n const unboundProviders: DomainRecord[] = Array.from(this._domainScopedProviders.entries())\n .filter(([domain]) => !this._domainScopedContext.has(domain))\n .reduce<DomainRecord[]>((acc, [domain, wrapper]) => {\n acc.push({ domain, wrapper });\n return acc;\n }, []);\n\n const allDomainRecords: DomainRecord[] = [\n // add in the default (no domain)\n { domain: undefined, wrapper: this._defaultProvider },\n ...unboundProviders,\n ];\n await Promise.all(\n allDomainRecords.map((dm) => this.runProviderContextChangeHandler(dm.domain, dm.wrapper, oldContext, context)),\n );\n }\n }\n\n /**\n * Access the global evaluation context.\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(): EvaluationContext;\n /**\n * Access the evaluation context for a specific named client.\n * The global evaluation context is returned if a matching named client is not found.\n * @param {string} domain An identifier which logically binds clients with providers\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(domain?: string | undefined): EvaluationContext;\n getContext(domainOrUndefined?: string): EvaluationContext {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const context = this._domainScopedContext.get(domain);\n if (context) {\n return context;\n } else {\n this._logger.debug(`Unable to find context for '${domain}'.`);\n }\n }\n return this._context;\n }\n\n /**\n * Resets the global evaluation context to an empty object.\n */\n clearContext(): Promise<void>;\n /**\n * Removes the evaluation context for a specific named client.\n * @param {string} domain An identifier which logically binds clients with providers\n */\n clearContext(domain: string): Promise<void>;\n async clearContext(domainOrUndefined?: string): Promise<void> {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.delete(domain);\n const newContext = this.getContext();\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, newContext);\n } else {\n this._domainScopedContext.delete(domain);\n }\n } else {\n return this.setContext({});\n }\n }\n\n /**\n * Resets the global evaluation context and removes the evaluation context for\n * all domains.\n */\n async clearContexts(): Promise<void> {\n // Default context must be cleared first to avoid calling the onContextChange\n // handler multiple times for clients bound to a domain.\n await this.clearContext();\n\n // Use allSettled so a promise rejection doesn't affect others\n await Promise.allSettled(Array.from(this._domainScopedProviders.keys()).map((domain) => this.clearContext(domain)));\n }\n\n /**\n * A factory function for creating new named OpenFeature clients. Clients can contain\n * their own state (e.g. logger, hook, context). Multiple clients can be used\n * to segment feature flag configuration.\n *\n * If there is already a provider bound to this name via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that name.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(domain?: string, version?: string): Client {\n return new OpenFeatureClient(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n () => this.getProviderForClient(domain),\n () => this.getProviderStatus(domain),\n () => this.buildAndCacheEventEmitterForClient(domain),\n () => this._logger,\n { domain, version },\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n async clearProviders(): Promise<void> {\n await super.clearProvidersAndSetDefault(NOOP_PROVIDER);\n this._domainScopedContext.clear();\n }\n\n private async runProviderContextChangeHandler(\n domain: string | undefined,\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>,\n oldContext: EvaluationContext,\n newContext: EvaluationContext,\n ): Promise<void> {\n // this should always be set according to the typings, but let's be defensive considering JS\n const providerName = wrapper.provider?.metadata?.name || 'unnamed-provider';\n\n try {\n if (typeof wrapper.provider.onContextChange === 'function') {\n const maybePromise = wrapper.provider.onContextChange(oldContext, newContext);\n\n // only reconcile if the onContextChange method returns a promise\n if (typeof maybePromise?.then === 'function') {\n wrapper.incrementPendingContextChanges();\n wrapper.status = this._statusEnumType.RECONCILING;\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n\n await maybePromise;\n wrapper.decrementPendingContextChanges();\n }\n }\n // only run the event handlers, and update the state if the onContextChange method succeeded\n wrapper.status = this._statusEnumType.READY;\n if (wrapper.allContextChangesSettled) {\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n }\n } catch (err) {\n // run error handlers instead\n wrapper.decrementPendingContextChanges();\n wrapper.status = this._statusEnumType.ERROR;\n if (wrapper.allContextChangesSettled) {\n const error = err as Error | undefined;\n const message = `Error running ${providerName}'s context change handler: ${error?.message}`;\n this._logger?.error(`${message}`, err);\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n });\n this._apiEmitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n }\n }\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import {\n ClientMetadata,\n ErrorCode,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n OpenFeatureError,\n ProviderFatalError,\n ProviderNotReadyError,\n ResolutionDetails,\n SafeLogger,\n StandardResolutionReasons,\n instantiateErrorByErrorCode,\n statusMatchesEvent,\n} from '@openfeature/core';\nimport { FlagEvaluationOptions } from '../../evaluation';\nimport { ProviderEvents } from '../../events';\nimport { InternalEventEmitter } from '../../events/internal/internal-event-emitter';\nimport { Hook } from '../../hooks';\nimport { OpenFeature } from '../../open-feature';\nimport { Provider, ProviderStatus } from '../../provider';\nimport { Client } from './../client';\n\ntype OpenFeatureClientOptions = {\n /**\n * @deprecated Use `domain` instead.\n */\n name?: string;\n domain?: string;\n version?: string;\n};\n\n/**\n * This implementation of the {@link Client} is meant to only be instantiated by the SDK.\n * It should not be used outside the SDK and so should not be exported.\n * @internal\n */\nexport class OpenFeatureClient implements Client {\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n private readonly providerAccessor: () => Provider,\n private readonly providerStatusAccessor: () => ProviderStatus,\n private readonly emitterAccessor: () => InternalEventEmitter,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n // Use domain if name is not provided\n name: this.options.domain ?? this.options.name,\n domain: this.options.domain ?? this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n get providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const shouldRunNow = statusMatchesEvent(eventType, this.providerStatus);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({\n clientName: this.metadata.name,\n domain: this.metadata.domain,\n providerName: this._provider.metadata.name,\n });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler(notificationType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().removeHandler(notificationType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): this {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(flagKey, this._provider.resolveBooleanEvaluation, defaultValue, 'boolean', options);\n }\n\n getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'string',\n options,\n );\n }\n\n getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'number',\n options,\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\n options: FlagEvaluationOptions = {},\n ): EvaluationDetails<T> {\n // merge global, client, and evaluation context\n\n const allHooks = [\n ...OpenFeature.getHooks(),\n ...this.getHooks(),\n ...(options.hooks || []),\n ...(this._provider.hooks || []),\n ];\n const allHooksReversed = [...allHooks].reverse();\n\n const context = {\n ...OpenFeature.getContext(this?.options?.domain),\n };\n\n // this reference cannot change during the course of evaluation\n // it may be used as a key in WeakMaps\n const hookContext: Readonly<HookContext> = {\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: this._provider.metadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\n\n // short circuit evaluation entirely if provider is in a bad state\n if (this.providerStatus === ProviderStatus.NOT_READY) {\n throw new ProviderNotReadyError('provider has not yet initialized');\n } else if (this.providerStatus === ProviderStatus.FATAL) {\n throw new ProviderFatalError('provider is in an irrecoverable error state');\n }\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);\n\n const evaluationDetails = {\n ...resolution,\n flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),\n flagKey,\n };\n\n if (evaluationDetails.errorCode) {\n throw instantiateErrorByErrorCode(evaluationDetails.errorCode);\n }\n\n this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);\n\n return evaluationDetails;\n } catch (err: unknown) {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n this.errorHooks(allHooksReversed, hookContext, err, options);\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze({}),\n flagKey,\n };\n } finally {\n this.finallyHooks(allHooksReversed, hookContext, options);\n }\n }\n\n private beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n Object.freeze(hookContext);\n Object.freeze(hookContext.context);\n\n for (const hook of hooks) {\n hook?.before?.(hookContext, Object.freeze(options.hookHints));\n }\n }\n\n private afterHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks) {\n hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.error?.(hookContext, err, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private finallyHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.finally?.(hookContext, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private get _provider(): Provider {\n return this.providerAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n}\n", "export * from './client';\nexport * from './provider';\nexport * from './evaluation';\nexport * from './open-feature';\nexport * from './events';\nexport * from './hooks';\nexport * from '@openfeature/core';\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n", "import type {\n CommonProvider,\n EvaluationContext,\n JsonValue,\n Logger,\n ResolutionDetails,\n} from '@openfeature/core';\nimport { ClientProviderStatus } from '@openfeature/core';\nimport type { Hook } from '../hooks';\n\nexport { ClientProviderStatus as ProviderStatus };\n\n/**\n * Interface that providers must implement to resolve flag values for their particular\n * backend or vendor.\n *\n * Implementation for resolving all the required flag types must be defined.\n */\nexport interface Provider extends CommonProvider<ClientProviderStatus> {\n /**\n * A provider hook exposes a mechanism for provider authors to register hooks\n * to tap into various stages of the flag evaluation lifecycle. These hooks can\n * be used to perform side effects and mutate the context for purposes of the\n * provider. Provider hooks are not configured or controlled by the application author.\n */\n readonly hooks?: Hook[];\n\n /**\n * A handler function to reconcile changes made to the static context.\n * Called by the SDK when the context is changed.\n *\n * Returning a promise will put the provider in the RECONCILING state and\n * emit the ProviderEvents.Reconciling event.\n *\n * Return void will avoid putting the provider in the RECONCILING state and\n * **not** emit the ProviderEvents.Reconciling event.\n * @param oldContext\n * @param newContext\n */\n onContextChange?(oldContext: EvaluationContext, newContext: EvaluationContext): Promise<void> | void;\n\n /**\n * Resolve a boolean flag and its evaluation details.\n */\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<boolean>;\n\n /**\n * Resolve a string flag and its evaluation details.\n */\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<string>;\n\n /**\n * Resolve a numeric flag and its evaluation details.\n */\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<number>;\n\n /**\n * Resolve and parse an object flag and its evaluation details.\n */\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ): ResolutionDetails<T>;\n}\n", "import type { JsonValue, ResolutionDetails } from '@openfeature/core';\nimport type { Provider } from './provider';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): ResolutionDetails<boolean> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): ResolutionDetails<string> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): ResolutionDetails<number> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): ResolutionDetails<T> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return {\n value: defaultValue,\n reason: REASON_NO_OP,\n };\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import type {\n EvaluationContext,\n FlagValueType,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n FlagNotFoundError,\n GeneralError,\n OpenFeatureError,\n StandardResolutionReasons,\n TypeMismatchError,\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport { OpenFeatureEventEmitter, ProviderEvents } from '../../events';\nimport type { FlagConfiguration, Flag } from './flag-configuration';\nimport { VariantNotFoundError } from './variant-not-found-error';\n\n/**\n * A simple OpenFeature provider intended for demos and as a test stub.\n */\nexport class InMemoryProvider implements Provider {\n public readonly events = new OpenFeatureEventEmitter();\n public readonly runsOn = 'client';\n readonly metadata = {\n name: 'in-memory',\n } as const;\n private _flagConfiguration: FlagConfiguration;\n private _context: EvaluationContext | undefined;\n\n constructor(flagConfiguration: FlagConfiguration = {}) {\n this._flagConfiguration = { ...flagConfiguration };\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n */\n async putConfiguration(flagConfiguration: FlagConfiguration) {\n try {\n const flagsChanged = Object.entries({...flagConfiguration, ...this._flagConfiguration})\n .map(([key]) => key);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n } catch (err) {\n this.events.emit(ProviderEvents.Error);\n throw err;\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<boolean> {\n return this.resolveAndCheckFlag<boolean>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<number> {\n return this.resolveAndCheckFlag<number>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<string> {\n return this.resolveAndCheckFlag<string>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n return this.resolveAndCheckFlag<T>(flagKey, defaultValue, context || this._context, logger);\n }\n\n private resolveAndCheckFlag<T extends JsonValue | FlagValueType>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n if (!(flagKey in this._flagConfiguration)) {\n const message = `no flag found with key ${flagKey}`;\n logger?.debug(message);\n throw new FlagNotFoundError(message);\n }\n\n if (this._flagConfiguration[flagKey].disabled) {\n return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };\n }\n\n const resolvedFlag = this.resolveFlagWithReason(flagKey, context) as ResolutionDetails<T>;\n\n if (resolvedFlag.value === undefined) {\n const message = `no value associated with variant provided for ${flagKey} found`;\n logger?.error(message);\n throw new VariantNotFoundError(message);\n }\n\n if (typeof resolvedFlag.value != typeof defaultValue) {\n throw new TypeMismatchError();\n }\n\n return resolvedFlag;\n }\n\n private resolveFlagWithReason<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n try {\n const resolutionResult = this.lookupFlagValue<T>(flagKey, ctx);\n\n return resolutionResult;\n } catch (error: unknown) {\n if (!(error instanceof OpenFeatureError)) {\n throw new GeneralError((error as Error)?.message || 'unknown error');\n }\n throw error;\n }\n }\n\n private lookupFlagValue<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n const flagSpec: Flag = this._flagConfiguration[flagKey];\n\n const isContextEval = ctx && flagSpec?.contextEvaluator;\n const variant = isContextEval ? flagSpec.contextEvaluator?.(ctx) : flagSpec.defaultVariant;\n\n const value = variant && flagSpec?.variants[variant];\n\n const reason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;\n\n return {\n value: value as T,\n ...(variant && { variant }),\n reason,\n };\n }\n}\n", "import { GenericEventEmitter } from '@openfeature/core';\nimport { EventEmitter } from 'eventemitter3';\nimport type { ProviderEmittableEvents } from './events';\n\n/**\n * The OpenFeatureEventEmitter can be used by provider developers to emit\n * events at various parts of the provider lifecycle.\n *\n * NOTE: Ready and error events are automatically emitted by the SDK based on\n * the result of the initialize method.\n */\nexport class OpenFeatureEventEmitter extends GenericEventEmitter<ProviderEmittableEvents> {\n protected readonly eventEmitter = new EventEmitter();\n\n constructor() {\n super();\n }\n}\n", "import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n", "import { ClientProviderEvents } from '@openfeature/core';\n\nexport { ClientProviderEvents as ProviderEvents};\n\n/**\n * A subset of events that can be directly emitted by providers.\n */\nexport type ProviderEmittableEvents = Exclude<ClientProviderEvents, ClientProviderEvents.ContextChanged>;", "import { ErrorCode, OpenFeatureError } from '@openfeature/core';\n\n/**\n * A custom error for the in-memory provider.\n * Indicates the resolved or default variant doesn't exist.\n */\nexport class VariantNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, VariantNotFoundError.prototype);\n this.name = 'VariantNotFoundError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import type {\n ClientProviderStatus,\n EvaluationContext,\n GenericEventEmitter,\n ManageContext} from '@openfeature/core';\nimport {\n OpenFeatureCommonAPI,\n ProviderWrapper,\n objectOrUndefined,\n stringOrUndefined,\n} from '@openfeature/core';\nimport type { Client } from './client';\nimport { OpenFeatureClient } from './client/internal/open-feature-client';\nimport { OpenFeatureEventEmitter, ProviderEvents } from './events';\nimport type { Hook } from './hooks';\nimport type { Provider} from './provider';\nimport { NOOP_PROVIDER, ProviderStatus } from './provider';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/web-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\ntype DomainRecord = {\n domain?: string;\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>;\n};\n\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI\n extends OpenFeatureCommonAPI<ClientProviderStatus, Provider, Hook>\n implements ManageContext<Promise<void>>\n{\n protected _statusEnumType: typeof ProviderStatus = ProviderStatus;\n protected _apiEmitter: GenericEventEmitter<ProviderEvents> = new OpenFeatureEventEmitter();\n protected _defaultProvider: ProviderWrapper<Provider, ClientProviderStatus> = new ProviderWrapper(\n NOOP_PROVIDER,\n ProviderStatus.NOT_READY,\n this._statusEnumType,\n );\n protected _domainScopedProviders: Map<string, ProviderWrapper<Provider, ClientProviderStatus>> = new Map();\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n private constructor() {\n super('client');\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n private getProviderStatus(domain?: string): ProviderStatus {\n if (!domain) {\n return this._defaultProvider.status;\n }\n\n return this._domainScopedProviders.get(domain)?.status ?? this._defaultProvider.status;\n }\n\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(provider: Provider): Promise<void>;\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(provider: Provider, context: EvaluationContext): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider, context: EvaluationContext): Promise<void>;\n async setProviderAndWait(\n clientOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Promise<void> {\n const domain = stringOrUndefined(clientOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(clientOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n await this.setAwaitableProvider(domain, provider);\n }\n\n /**\n * Sets the default provider for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider): this;\n /**\n * Sets the default provider and evaluation context for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider, context: EvaluationContext): this;\n /**\n * Sets the provider for flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider): this;\n /**\n * Sets the provider and evaluation context flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider, context: EvaluationContext): this;\n setProvider(\n domainOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): this {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(domainOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n const maybePromise = this.setAwaitableProvider(domain, provider);\n\n // The setProvider method doesn't return a promise so we need to catch and\n // log any errors that occur during provider initialization to avoid having\n // an unhandled promise rejection.\n Promise.resolve(maybePromise).catch((err) => {\n this._logger.error('Error during provider initialization:', err);\n });\n return this;\n }\n\n /**\n * Sets the evaluation context globally.\n * This will be used by all providers that have not bound to a domain.\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext({ region: \"us\" });\n */\n async setContext(context: EvaluationContext): Promise<void>;\n /**\n * Sets the evaluation context for a specific provider.\n * This will only affect providers bound to a domain.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext(\"test\", { scope: \"provider\" });\n * OpenFeature.setProvider(new MyProvider()) // Uses the default context\n * OpenFeature.setProvider(\"test\", new MyProvider()) // Uses context: { scope: \"provider\" }\n */\n async setContext(domain: string, context: EvaluationContext): Promise<void>;\n async setContext<T extends EvaluationContext>(domainOrContext: T | string, contextOrUndefined?: T): Promise<void> {\n const domain = stringOrUndefined(domainOrContext);\n const context = objectOrUndefined<T>(domainOrContext) ?? objectOrUndefined(contextOrUndefined) ?? {};\n\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.set(domain, context);\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, context);\n } else {\n this._domainScopedContext.set(domain, context);\n }\n } else {\n const oldContext = this._context;\n this._context = context;\n\n // collect all providers that are using the default context (not bound to a domain)\n const unboundProviders: DomainRecord[] = Array.from(this._domainScopedProviders.entries())\n .filter(([domain]) => !this._domainScopedContext.has(domain))\n .reduce<DomainRecord[]>((acc, [domain, wrapper]) => {\n acc.push({ domain, wrapper });\n return acc;\n }, []);\n\n const allDomainRecords: DomainRecord[] = [\n // add in the default (no domain)\n { domain: undefined, wrapper: this._defaultProvider },\n ...unboundProviders,\n ];\n await Promise.all(\n allDomainRecords.map((dm) => this.runProviderContextChangeHandler(dm.domain, dm.wrapper, oldContext, context)),\n );\n }\n }\n\n /**\n * Access the global evaluation context.\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(): EvaluationContext;\n /**\n * Access the evaluation context for a specific named client.\n * The global evaluation context is returned if a matching named client is not found.\n * @param {string} domain An identifier which logically binds clients with providers\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(domain?: string | undefined): EvaluationContext;\n getContext(domainOrUndefined?: string): EvaluationContext {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const context = this._domainScopedContext.get(domain);\n if (context) {\n return context;\n } else {\n this._logger.debug(`Unable to find context for '${domain}'.`);\n }\n }\n return this._context;\n }\n\n /**\n * Resets the global evaluation context to an empty object.\n */\n clearContext(): Promise<void>;\n /**\n * Removes the evaluation context for a specific named client.\n * @param {string} domain An identifier which logically binds clients with providers\n */\n clearContext(domain: string): Promise<void>;\n async clearContext(domainOrUndefined?: string): Promise<void> {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.delete(domain);\n const newContext = this.getContext();\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, newContext);\n } else {\n this._domainScopedContext.delete(domain);\n }\n } else {\n return this.setContext({});\n }\n }\n\n /**\n * Resets the global evaluation context and removes the evaluation context for\n * all domains.\n */\n async clearContexts(): Promise<void> {\n // Default context must be cleared first to avoid calling the onContextChange\n // handler multiple times for clients bound to a domain.\n await this.clearContext();\n\n // Use allSettled so a promise rejection doesn't affect others\n await Promise.allSettled(Array.from(this._domainScopedProviders.keys()).map((domain) => this.clearContext(domain)));\n }\n\n /**\n * A factory function for creating new named OpenFeature clients. Clients can contain\n * their own state (e.g. logger, hook, context). Multiple clients can be used\n * to segment feature flag configuration.\n *\n * If there is already a provider bound to this name via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that name.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(domain?: string, version?: string): Client {\n return new OpenFeatureClient(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n () => this.getProviderForClient(domain),\n () => this.getProviderStatus(domain),\n () => this.buildAndCacheEventEmitterForClient(domain),\n (domain?: string) => this.getContext(domain),\n () => this.getHooks(),\n () => this._logger,\n { domain, version },\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n async clearProviders(): Promise<void> {\n await super.clearProvidersAndSetDefault(NOOP_PROVIDER);\n this._domainScopedContext.clear();\n }\n\n private async runProviderContextChangeHandler(\n domain: string | undefined,\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>,\n oldContext: EvaluationContext,\n newContext: EvaluationContext,\n ): Promise<void> {\n // this should always be set according to the typings, but let's be defensive considering JS\n const providerName = wrapper.provider?.metadata?.name || 'unnamed-provider';\n\n try {\n if (typeof wrapper.provider.onContextChange === 'function') {\n const maybePromise = wrapper.provider.onContextChange(oldContext, newContext);\n\n // only reconcile if the onContextChange method returns a promise\n if (typeof maybePromise?.then === 'function') {\n wrapper.incrementPendingContextChanges();\n wrapper.status = this._statusEnumType.RECONCILING;\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n\n await maybePromise;\n wrapper.decrementPendingContextChanges();\n }\n }\n // only run the event handlers, and update the state if the onContextChange method succeeded\n wrapper.status = this._statusEnumType.READY;\n if (wrapper.allContextChangesSettled) {\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n }\n } catch (err) {\n // run error handlers instead\n wrapper.decrementPendingContextChanges();\n wrapper.status = this._statusEnumType.ERROR;\n if (wrapper.allContextChangesSettled) {\n const error = err as Error | undefined;\n const message = `Error running ${providerName}'s context change handler: ${error?.message}`;\n this._logger?.error(`${message}`, err);\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n });\n this._apiEmitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n }\n }\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import type {\n ClientMetadata,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n TrackingEventDetails,\n OpenFeatureError,\n ResolutionDetails } from '@openfeature/core';\nimport {\n ErrorCode,\n ProviderFatalError,\n ProviderNotReadyError,\n SafeLogger,\n StandardResolutionReasons,\n instantiateErrorByErrorCode,\n statusMatchesEvent,\n} from '@openfeature/core';\nimport type { FlagEvaluationOptions } from '../../evaluation';\nimport type { ProviderEvents } from '../../events';\nimport type { InternalEventEmitter } from '../../events/internal/internal-event-emitter';\nimport type { Hook } from '../../hooks';\nimport type { Provider} from '../../provider';\nimport { ProviderStatus } from '../../provider';\nimport type { Client } from './../client';\n\ntype OpenFeatureClientOptions = {\n /**\n * @deprecated Use `domain` instead.\n */\n name?: string;\n domain?: string;\n version?: string;\n};\n\n/**\n * This implementation of the {@link Client} is meant to only be instantiated by the SDK.\n * It should not be used outside the SDK and so should not be exported.\n * @internal\n */\nexport class OpenFeatureClient implements Client {\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n private readonly providerAccessor: () => Provider,\n private readonly providerStatusAccessor: () => ProviderStatus,\n private readonly emitterAccessor: () => InternalEventEmitter,\n private readonly apiContextAccessor: (domain?: string) => EvaluationContext,\n private readonly apiHooksAccessor: () => Hook[],\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n // Use domain if name is not provided\n name: this.options.domain ?? this.options.name,\n domain: this.options.domain ?? this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n get providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const shouldRunNow = statusMatchesEvent(eventType, this.providerStatus);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({\n clientName: this.metadata.name,\n domain: this.metadata.domain,\n providerName: this._provider.metadata.name,\n });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler(notificationType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().removeHandler(notificationType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): this {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(flagKey, this._provider.resolveBooleanEvaluation, defaultValue, 'boolean', options);\n }\n\n getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'string',\n options,\n );\n }\n\n getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'number',\n options,\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n track(occurrenceKey: string, occurrenceDetails: TrackingEventDetails): void {\n try {\n this.shortCircuitIfNotReady();\n\n if (typeof this._provider.track === 'function') {\n // copy and freeze the context\n const frozenContext = Object.freeze({\n ...this.apiContextAccessor(this?.options?.domain),\n });\n return this._provider.track?.(occurrenceKey, frozenContext, occurrenceDetails);\n } else {\n this._logger.debug('Provider does not support the track function; will no-op.');\n }\n } catch (err) {\n this._logger.debug('Error recording tracking event.', err);\n }\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\n options: FlagEvaluationOptions = {},\n ): EvaluationDetails<T> {\n // merge global, client, and evaluation context\n\n const allHooks = [\n ...this.apiHooksAccessor(),\n ...this.getHooks(),\n ...(options.hooks || []),\n ...(this._provider.hooks || []),\n ];\n const allHooksReversed = [...allHooks].reverse();\n\n const context = {\n ...this.apiContextAccessor(this?.options?.domain),\n };\n\n // this reference cannot change during the course of evaluation\n // it may be used as a key in WeakMaps\n const hookContext: Readonly<HookContext> = {\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: this._provider.metadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\n\n this.shortCircuitIfNotReady();\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);\n\n const evaluationDetails = {\n ...resolution,\n flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),\n flagKey,\n };\n\n if (evaluationDetails.errorCode) {\n throw instantiateErrorByErrorCode(evaluationDetails.errorCode);\n }\n\n this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);\n\n return evaluationDetails;\n } catch (err: unknown) {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n this.errorHooks(allHooksReversed, hookContext, err, options);\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze({}),\n flagKey,\n };\n } finally {\n this.finallyHooks(allHooksReversed, hookContext, options);\n }\n }\n\n private beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n Object.freeze(hookContext);\n Object.freeze(hookContext.context);\n\n for (const hook of hooks) {\n hook?.before?.(hookContext, Object.freeze(options.hookHints));\n }\n }\n\n private afterHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks) {\n hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.error?.(hookContext, err, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private finallyHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.finally?.(hookContext, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private get _provider(): Provider {\n return this.providerAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n\n private shortCircuitIfNotReady() {\n // short circuit evaluation entirely if provider is in a bad state\n if (this.providerStatus === ProviderStatus.NOT_READY) {\n throw new ProviderNotReadyError('provider has not yet initialized');\n } else if (this.providerStatus === ProviderStatus.FATAL) {\n throw new ProviderFatalError('provider is in an irrecoverable error state');\n }\n }\n}\n", "export * from './client';\nexport * from './provider';\nexport * from './evaluation';\nexport * from './open-feature';\nexport * from './events';\nexport * from './hooks';\nexport * from './tracking';\nexport * from '@openfeature/core';\n"],
5
+ "mappings": "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",
6
6
  "names": ["EventEmitter", "OpenFeatureError", "EventEmitter", "OpenFeatureError", "ErrorCode", "StandardResolutionReasons", "ErrorCode", "StandardResolutionReasons", "err", "domain"]
7
7
  }
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { BaseHook, HookHints, EvaluationDetails, JsonValue, FlagValue, CommonProvider, ClientProviderStatus, EvaluationContext, Logger, ResolutionDetails, ClientProviderEvents, GenericEventEmitter, EvaluationLifeCycle, ManageLogger, Eventing, ClientMetadata, OpenFeatureCommonAPI, ManageContext, ProviderWrapper } from '@openfeature/core';
1
+ import { BaseHook, HookHints, EvaluationDetails, JsonValue, FlagValue, CommonProvider, ClientProviderStatus, EvaluationContext, Logger, ResolutionDetails, ClientProviderEvents, GenericEventEmitter, TrackingEventDetails, EvaluationLifeCycle, ManageLogger, Eventing, ClientMetadata, OpenFeatureCommonAPI, ManageContext, ProviderWrapper } from '@openfeature/core';
2
2
  export * from '@openfeature/core';
3
3
  export { ClientProviderEvents as ProviderEvents, ClientProviderStatus as ProviderStatus } from '@openfeature/core';
4
4
 
@@ -357,7 +357,16 @@ declare class InMemoryProvider implements Provider {
357
357
  private lookupFlagValue;
358
358
  }
359
359
 
360
- interface Client extends EvaluationLifeCycle<Client>, Features, ManageLogger<Client>, Eventing<ClientProviderEvents> {
360
+ interface Tracking {
361
+ /**
362
+ * Track a user action or application state, usually representing a business objective or outcome.
363
+ * @param trackingEventName an identifier for the event
364
+ * @param trackingEventDetails the details of the tracking event
365
+ */
366
+ track(trackingEventName: string, trackingEventDetails?: TrackingEventDetails): void;
367
+ }
368
+
369
+ interface Client extends EvaluationLifeCycle<Client>, Features, ManageLogger<Client>, Eventing<ClientProviderEvents>, Tracking {
361
370
  readonly metadata: ClientMetadata;
362
371
  /**
363
372
  * Returns the status of the associated provider.
@@ -523,4 +532,4 @@ declare class OpenFeatureAPI extends OpenFeatureCommonAPI<ClientProviderStatus,
523
532
  */
524
533
  declare const OpenFeature: OpenFeatureAPI;
525
534
 
526
- export { Client, Features, FlagEvaluationOptions, Hook, InMemoryProvider, NOOP_PROVIDER, OpenFeature, OpenFeatureAPI, OpenFeatureEventEmitter, Provider, ProviderEmittableEvents };
535
+ export { type Client, type Features, type FlagEvaluationOptions, type Hook, InMemoryProvider, NOOP_PROVIDER, OpenFeature, OpenFeatureAPI, OpenFeatureEventEmitter, type Provider, type ProviderEmittableEvents, type Tracking };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openfeature/web-sdk",
3
- "version": "1.2.4",
3
+ "version": "1.3.0",
4
4
  "description": "OpenFeature SDK for Web",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "files": [
@@ -16,6 +16,7 @@
16
16
  "scripts": {
17
17
  "test": "jest --verbose",
18
18
  "lint": "eslint ./",
19
+ "lint:fix": "eslint ./ --fix",
19
20
  "clean": "shx rm -rf ./dist",
20
21
  "build:web-esm": "esbuild src/index.ts --bundle --external:@openfeature/core --sourcemap --target=es2015 --platform=browser --format=esm --outfile=./dist/esm/index.js --analyze",
21
22
  "build:web-cjs": "esbuild src/index.ts --bundle --external:@openfeature/core --sourcemap --target=es2015 --platform=browser --format=cjs --outfile=./dist/cjs/index.js --analyze",
@@ -49,6 +50,6 @@
49
50
  "@openfeature/core": "1.4.0"
50
51
  },
51
52
  "devDependencies": {
52
- "@openfeature/core": "1.4.0"
53
+ "@openfeature/core": "1.5.0"
53
54
  }
54
55
  }