@openfeature/web-sdk 0.4.6 → 0.4.8

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.7.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-v0.4.6">
20
- <img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v0.4.6&color=blue&style=for-the-badge" />
19
+ <a href="https://github.com/open-feature/js-sdk/releases/tag/web-sdk-v0.4.8">
20
+ <img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v0.4.8&color=blue&style=for-the-badge" />
21
21
  </a>
22
22
  <!-- x-release-please-end -->
23
23
  <br/>
package/dist/cjs/index.js CHANGED
@@ -9,6 +9,7 @@ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
9
  var __getProtoOf = Object.getPrototypeOf;
10
10
  var __hasOwnProp = Object.prototype.hasOwnProperty;
11
11
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __reflectGet = Reflect.get;
12
13
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
14
  var __spreadValues = (a, b) => {
14
15
  for (var prop in b || (b = {}))
@@ -47,6 +48,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
47
48
  mod
48
49
  ));
49
50
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
51
+ var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
50
52
  var __async = (__this, __arguments, generator) => {
51
53
  return new Promise((resolve, reject) => {
52
54
  var fulfilled = (value) => {
@@ -627,12 +629,12 @@ var InMemoryProvider = class {
627
629
  var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/web-sdk/api");
628
630
  var _globalThis = globalThis;
629
631
  var OpenFeatureAPI = class extends import_core5.OpenFeatureCommonAPI {
630
- // eslint-disable-next-line @typescript-eslint/no-empty-function
631
632
  constructor() {
632
633
  super("client");
633
634
  this._events = new OpenFeatureEventEmitter();
634
635
  this._defaultProvider = NOOP_PROVIDER;
635
636
  this._createEventEmitter = () => new OpenFeatureEventEmitter();
637
+ this._namedProviderContext = /* @__PURE__ */ new Map();
636
638
  }
637
639
  /**
638
640
  * Gets a singleton instance of the OpenFeature API.
@@ -648,26 +650,74 @@ var OpenFeatureAPI = class extends import_core5.OpenFeatureCommonAPI {
648
650
  _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;
649
651
  return instance;
650
652
  }
651
- setContext(context) {
653
+ setContext(nameOrContext, contextOrUndefined) {
652
654
  return __async(this, null, function* () {
653
- const oldContext = this._context;
654
- this._context = context;
655
- const allProviders = [this._defaultProvider, ...this._clientProviders.values()];
656
- yield Promise.all(
657
- allProviders.map((provider) => __async(this, null, function* () {
658
- var _a, _b;
659
- try {
660
- return yield (_a = provider.onContextChange) == null ? void 0 : _a.call(provider, oldContext, context);
661
- } catch (err) {
662
- (_b = this._logger) == null ? void 0 : _b.error(`Error running context change handler of provider ${provider.metadata.name}:`, err);
663
- }
664
- }))
665
- );
655
+ var _a, _b;
656
+ const clientName = (0, import_core5.stringOrUndefined)(nameOrContext);
657
+ const context = (_b = (_a = (0, import_core5.objectOrUndefined)(nameOrContext)) != null ? _a : (0, import_core5.objectOrUndefined)(contextOrUndefined)) != null ? _b : {};
658
+ if (clientName) {
659
+ const provider = this._clientProviders.get(clientName);
660
+ if (provider) {
661
+ const oldContext = this.getContext(clientName);
662
+ this._namedProviderContext.set(clientName, context);
663
+ yield this.runProviderContextChangeHandler(provider, oldContext, context);
664
+ } else {
665
+ this._namedProviderContext.set(clientName, context);
666
+ }
667
+ } else {
668
+ const oldContext = this._context;
669
+ this._context = context;
670
+ const providersWithoutContextOverride = Array.from(this._clientProviders.entries()).filter(([name]) => !this._namedProviderContext.has(name)).reduce((acc, [, provider]) => {
671
+ acc.push(provider);
672
+ return acc;
673
+ }, []);
674
+ const allProviders = [this._defaultProvider, ...providersWithoutContextOverride];
675
+ yield Promise.all(
676
+ allProviders.map((provider) => this.runProviderContextChangeHandler(provider, oldContext, context))
677
+ );
678
+ }
666
679
  });
667
680
  }
668
- getContext() {
681
+ getContext(nameOrUndefined) {
682
+ const clientName = (0, import_core5.stringOrUndefined)(nameOrUndefined);
683
+ if (clientName) {
684
+ const context = this._namedProviderContext.get(clientName);
685
+ if (context) {
686
+ return context;
687
+ } else {
688
+ this._logger.debug(`Unable to find context for '${clientName}'.`);
689
+ }
690
+ }
669
691
  return this._context;
670
692
  }
693
+ clearContext(nameOrUndefined) {
694
+ return __async(this, null, function* () {
695
+ const clientName = (0, import_core5.stringOrUndefined)(nameOrUndefined);
696
+ if (clientName) {
697
+ const provider = this._clientProviders.get(clientName);
698
+ if (provider) {
699
+ const oldContext = this.getContext(clientName);
700
+ this._namedProviderContext.delete(clientName);
701
+ const newContext = this.getContext();
702
+ yield this.runProviderContextChangeHandler(provider, oldContext, newContext);
703
+ } else {
704
+ this._namedProviderContext.delete(clientName);
705
+ }
706
+ } else {
707
+ return this.setContext({});
708
+ }
709
+ });
710
+ }
711
+ /**
712
+ * Resets the global evaluation context and removes the evaluation context for
713
+ * all named clients.
714
+ */
715
+ clearContexts() {
716
+ return __async(this, null, function* () {
717
+ yield this.clearContext();
718
+ yield Promise.allSettled(Array.from(this._clientProviders.keys()).map((name) => this.clearContext(name)));
719
+ });
720
+ }
671
721
  /**
672
722
  * A factory function for creating new named OpenFeature clients. Clients can contain
673
723
  * their own state (e.g. logger, hook, context). Multiple clients can be used
@@ -694,7 +744,20 @@ var OpenFeatureAPI = class extends import_core5.OpenFeatureCommonAPI {
694
744
  * @returns {Promise<void>}
695
745
  */
696
746
  clearProviders() {
697
- return super.clearProvidersAndSetDefault(NOOP_PROVIDER);
747
+ return __async(this, null, function* () {
748
+ yield __superGet(OpenFeatureAPI.prototype, this, "clearProvidersAndSetDefault").call(this, NOOP_PROVIDER);
749
+ this._namedProviderContext.clear();
750
+ });
751
+ }
752
+ runProviderContextChangeHandler(provider, oldContext, newContext) {
753
+ return __async(this, null, function* () {
754
+ var _a, _b;
755
+ try {
756
+ return yield (_a = provider.onContextChange) == null ? void 0 : _a.call(provider, oldContext, newContext);
757
+ } catch (err) {
758
+ (_b = this._logger) == null ? void 0 : _b.error(`Error running ${provider.metadata.name}'s context change handler:`, err);
759
+ }
760
+ });
698
761
  }
699
762
  };
700
763
  var OpenFeature = OpenFeatureAPI.getInstance();
@@ -715,11 +778,15 @@ var OpenFeatureClient = class {
715
778
  providerMetadata: this.providerAccessor().metadata
716
779
  };
717
780
  }
781
+ get providerStatus() {
782
+ var _a;
783
+ return ((_a = this.providerAccessor()) == null ? void 0 : _a.status) || import_core6.ProviderStatus.READY;
784
+ }
718
785
  addHandler(eventType, handler) {
719
786
  var _a;
720
787
  this.emitterAccessor().addHandler(eventType, handler);
721
- const providerReady = !this._provider.status || this._provider.status === import_core6.ProviderStatus.READY;
722
- if (eventType === import_core6.ProviderEvents.Ready && providerReady) {
788
+ const shouldRunNow = (0, import_core6.statusMatchesEvent)(eventType, this._provider.status);
789
+ if (shouldRunNow) {
723
790
  try {
724
791
  handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });
725
792
  } catch (err) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../node_modules/events/events.js", "../../src/index.ts", "../../src/client/open-feature-client.ts", "../../src/open-feature.ts", "../../src/provider/no-op-provider.ts", "../../src/provider/in-memory-provider/in-memory-provider.ts", "../../src/events/open-feature-event-emitter.ts", "../../src/provider/in-memory-provider/variant-not-found-error.ts"],
4
- "sourcesContent": ["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\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", "import {\n ClientMetadata,\n ErrorCode,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n OpenFeatureError,\n ProviderEvents,\n ProviderStatus,\n ResolutionDetails,\n SafeLogger,\n StandardResolutionReasons,\n} from '@openfeature/core';\nimport { FlagEvaluationOptions } from '../evaluation';\nimport { OpenFeature } from '../open-feature';\nimport { Provider } from '../provider';\nimport { InternalEventEmitter } from '../events/internal/internal-event-emitter';\nimport { Client } from './client';\nimport { Hook } from '../hooks';\n\ntype OpenFeatureClientOptions = {\n name?: string;\n version?: string;\n};\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 emitterAccessor: () => InternalEventEmitter,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n name: this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n addHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const providerReady = !this._provider.status || this._provider.status === ProviderStatus.READY;\n\n if (eventType === ProviderEvents.Ready && providerReady) {\n // run immediately, we're ready.\n try {\n handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler<T extends ProviderEvents>(notificationType: T, handler: EventHandler<T>): 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(),\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: OpenFeature.providerMetadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\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 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", "import { EvaluationContext, ManageContext, OpenFeatureCommonAPI } from '@openfeature/core';\nimport { Client, OpenFeatureClient } from './client';\nimport { NOOP_PROVIDER, Provider } from './provider';\nimport { OpenFeatureEventEmitter } from './events';\nimport { Hook } from './hooks';\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};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider, Hook> implements ManageContext<Promise<void>> {\n protected _events = new OpenFeatureEventEmitter();\n protected _defaultProvider: Provider = NOOP_PROVIDER;\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\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 async setContext(context: EvaluationContext): Promise<void> {\n const oldContext = this._context;\n this._context = context;\n\n const allProviders = [this._defaultProvider, ...this._clientProviders.values()];\n await Promise.all(\n allProviders.map(async (provider) => {\n try {\n return await provider.onContextChange?.(oldContext, context);\n } catch (err) {\n this._logger?.error(`Error running context change handler of provider ${provider.metadata.name}:`, err);\n }\n }),\n );\n }\n\n getContext(): EvaluationContext {\n return this._context;\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} name The name of the client\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(name?: 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(name),\n () => this.buildAndCacheEventEmitterForClient(name),\n () => this._logger,\n { name, version },\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n clearProviders(): Promise<void> {\n return super.clearProvidersAndSetDefault(NOOP_PROVIDER);\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 { JsonValue, ProviderStatus, 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 get status(): ProviderStatus {\n /**\n * This is due to the NoopProvider not being a real provider.\n * We do not want it to trigger the Ready event handlers, so we never set this to ready.\n * With the NoopProvider assigned, the client can be assumed to be uninitialized.\n * https://github.com/open-feature/js-sdk/pull/429#discussion_r1202642654\n */\n return ProviderStatus.NOT_READY;\n }\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 ProviderEvents,\n ResolutionDetails,\n StandardResolutionReasons,\n TypeMismatchError,\n ProviderStatus,\n} from '@openfeature/core';\nimport { Provider } from '../provider';\nimport { OpenFeatureEventEmitter } 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 status: ProviderStatus = ProviderStatus.NOT_READY;\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 async initialize(context?: EvaluationContext | undefined): Promise<void> {\n try {\n\n for (const key in this._flagConfiguration) {\n this.resolveFlagWithReason(key, context);\n }\n\n this._context = context;\n // set the provider's state, but don't emit events manually;\n // the SDK does this based on the resolution/rejection of the init promise\n this.status = ProviderStatus.READY;\n } catch (error) {\n this.status = ProviderStatus.ERROR;\n throw error;\n }\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n */\n async putConfiguration(flagConfiguration: FlagConfiguration) {\n const flagsChanged = Object.entries(flagConfiguration)\n .filter(([key, value]) => this._flagConfiguration[key] !== value)\n .map(([key]) => key);\n\n this.status = ProviderStatus.STALE;\n this.events.emit(ProviderEvents.Stale);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n\n try {\n await this.initialize(this._context);\n // we need to emit our own events in this case, since it's not part of the init flow.\n this.events.emit(ProviderEvents.Ready);\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>(flagKey: string,\n defaultValue: T, context?: EvaluationContext, logger?: Logger): 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 evalReason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;\n\n const reason = this.status === ProviderStatus.STALE ? StandardResolutionReasons.CACHED : evalReason;\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 '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 {\n protected readonly eventEmitter = new EventEmitter({ captureRejections: true });\n\n constructor() {\n super();\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n}\n", "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"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\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", "import {\n ClientMetadata,\n ErrorCode,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n OpenFeatureError,\n ProviderEvents,\n ProviderStatus,\n ResolutionDetails,\n SafeLogger,\n StandardResolutionReasons,\n statusMatchesEvent\n} from '@openfeature/core';\nimport { FlagEvaluationOptions } from '../evaluation';\nimport { InternalEventEmitter } from '../events/internal/internal-event-emitter';\nimport { Hook } from '../hooks';\nimport { OpenFeature } from '../open-feature';\nimport { Provider } from '../provider';\nimport { Client } from './client';\n\ntype OpenFeatureClientOptions = {\n name?: string;\n version?: string;\n};\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 emitterAccessor: () => InternalEventEmitter,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n name: this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n get providerStatus(): ProviderStatus {\n return this.providerAccessor()?.status || ProviderStatus.READY;\n }\n\n addHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const shouldRunNow = statusMatchesEvent(eventType, this._provider.status);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler<T extends ProviderEvents>(notificationType: T, handler: EventHandler<T>): 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(),\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: OpenFeature.providerMetadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\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 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", "import {\n EvaluationContext,\n ManageContext,\n OpenFeatureCommonAPI,\n objectOrUndefined,\n stringOrUndefined,\n} from '@openfeature/core';\nimport { Client, OpenFeatureClient } from './client';\nimport { NOOP_PROVIDER, Provider } from './provider';\nimport { OpenFeatureEventEmitter } from './events';\nimport { Hook } from './hooks';\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};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider, Hook> implements ManageContext<Promise<void>> {\n protected _events = new OpenFeatureEventEmitter();\n protected _defaultProvider: Provider = NOOP_PROVIDER;\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n protected _namedProviderContext: Map<string, EvaluationContext> = new Map();\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 /**\n * Sets the evaluation context globally.\n * This will be used by all providers that have not been overridden with a named client.\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 with a matching client name.\n * @param {string} clientName The name to identify the client\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(clientName: string, context: EvaluationContext): Promise<void>;\n async setContext<T extends EvaluationContext>(nameOrContext: T | string, contextOrUndefined?: T): Promise<void> {\n const clientName = stringOrUndefined(nameOrContext);\n const context = objectOrUndefined<T>(nameOrContext) ?? objectOrUndefined(contextOrUndefined) ?? {};\n\n if (clientName) {\n const provider = this._clientProviders.get(clientName);\n if (provider) {\n const oldContext = this.getContext(clientName);\n this._namedProviderContext.set(clientName, context);\n await this.runProviderContextChangeHandler(provider, oldContext, context);\n } else {\n this._namedProviderContext.set(clientName, context);\n }\n } else {\n const oldContext = this._context;\n this._context = context;\n\n const providersWithoutContextOverride = Array.from(this._clientProviders.entries())\n .filter(([name]) => !this._namedProviderContext.has(name))\n .reduce<Provider[]>((acc, [, provider]) => {\n acc.push(provider);\n return acc;\n }, []);\n\n const allProviders = [this._defaultProvider, ...providersWithoutContextOverride];\n await Promise.all(\n allProviders.map((provider) => this.runProviderContextChangeHandler(provider, 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} clientName The name to identify the client\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(clientName: string): EvaluationContext;\n getContext(nameOrUndefined?: string): EvaluationContext {\n const clientName = stringOrUndefined(nameOrUndefined);\n if (clientName) {\n const context = this._namedProviderContext.get(clientName);\n if (context) {\n return context;\n } else {\n this._logger.debug(`Unable to find context for '${clientName}'.`);\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} clientName The name to identify the client\n */\n clearContext(clientName: string): Promise<void>;\n async clearContext(nameOrUndefined?: string): Promise<void> {\n const clientName = stringOrUndefined(nameOrUndefined);\n if (clientName) {\n const provider = this._clientProviders.get(clientName);\n if (provider) {\n const oldContext = this.getContext(clientName);\n this._namedProviderContext.delete(clientName);\n const newContext = this.getContext();\n await this.runProviderContextChangeHandler(provider, oldContext, newContext);\n } else {\n this._namedProviderContext.delete(clientName);\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 named clients.\n */\n async clearContexts(): Promise<void> {\n // Default context must be cleared first to avoid calling the onContextChange\n // handler multiple times for named clients.\n await this.clearContext();\n\n // Use allSettled so a promise rejection doesn't affect others\n await Promise.allSettled(Array.from(this._clientProviders.keys()).map((name) => this.clearContext(name)));\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} name The name of the client\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(name?: 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(name),\n () => this.buildAndCacheEventEmitterForClient(name),\n () => this._logger,\n { name, 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._namedProviderContext.clear();\n }\n\n private async runProviderContextChangeHandler(\n provider: Provider,\n oldContext: EvaluationContext,\n newContext: EvaluationContext,\n ): Promise<void> {\n try {\n return await provider.onContextChange?.(oldContext, newContext);\n } catch (err) {\n this._logger?.error(`Error running ${provider.metadata.name}'s context change handler:`, err);\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 { JsonValue, ProviderStatus, 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 get status(): ProviderStatus {\n /**\n * This is due to the NoopProvider not being a real provider.\n * We do not want it to trigger the Ready event handlers, so we never set this to ready.\n * With the NoopProvider assigned, the client can be assumed to be uninitialized.\n * https://github.com/open-feature/js-sdk/pull/429#discussion_r1202642654\n */\n return ProviderStatus.NOT_READY;\n }\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 ProviderEvents,\n ResolutionDetails,\n StandardResolutionReasons,\n TypeMismatchError,\n ProviderStatus,\n} from '@openfeature/core';\nimport { Provider } from '../provider';\nimport { OpenFeatureEventEmitter } 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 status: ProviderStatus = ProviderStatus.NOT_READY;\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 async initialize(context?: EvaluationContext | undefined): Promise<void> {\n try {\n\n for (const key in this._flagConfiguration) {\n this.resolveFlagWithReason(key, context);\n }\n\n this._context = context;\n // set the provider's state, but don't emit events manually;\n // the SDK does this based on the resolution/rejection of the init promise\n this.status = ProviderStatus.READY;\n } catch (error) {\n this.status = ProviderStatus.ERROR;\n throw error;\n }\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n */\n async putConfiguration(flagConfiguration: FlagConfiguration) {\n const flagsChanged = Object.entries(flagConfiguration)\n .filter(([key, value]) => this._flagConfiguration[key] !== value)\n .map(([key]) => key);\n\n this.status = ProviderStatus.STALE;\n this.events.emit(ProviderEvents.Stale);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n\n try {\n await this.initialize(this._context);\n // we need to emit our own events in this case, since it's not part of the init flow.\n this.events.emit(ProviderEvents.Ready);\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>(flagKey: string,\n defaultValue: T, context?: EvaluationContext, logger?: Logger): 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 evalReason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;\n\n const reason = this.status === ProviderStatus.STALE ? StandardResolutionReasons.CACHED : evalReason;\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 '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 {\n protected readonly eventEmitter = new EventEmitter({ captureRejections: true });\n\n constructor() {\n super();\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n}\n", "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"],
5
+ "mappings": "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",
6
6
  "names": ["module", "ReflectApply", "ReflectOwnKeys", "NumberIsNaN", "EventEmitter", "once", "import_core", "import_core", "import_core", "import_core", "EventEmitter", "import_core", "err"]
7
7
  }
package/dist/esm/index.js CHANGED
@@ -8,6 +8,7 @@ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
8
  var __getProtoOf = Object.getPrototypeOf;
9
9
  var __hasOwnProp = Object.prototype.hasOwnProperty;
10
10
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
+ var __reflectGet = Reflect.get;
11
12
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
13
  var __spreadValues = (a, b) => {
13
14
  for (var prop in b || (b = {}))
@@ -40,6 +41,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
40
41
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
41
42
  mod
42
43
  ));
44
+ var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
43
45
  var __async = (__this, __arguments, generator) => {
44
46
  return new Promise((resolve, reject) => {
45
47
  var fulfilled = (value) => {
@@ -436,14 +438,18 @@ var require_events = __commonJS({
436
438
  // src/client/open-feature-client.ts
437
439
  import {
438
440
  ErrorCode as ErrorCode2,
439
- ProviderEvents as ProviderEvents2,
440
441
  ProviderStatus as ProviderStatus3,
441
442
  SafeLogger,
442
- StandardResolutionReasons as StandardResolutionReasons2
443
+ StandardResolutionReasons as StandardResolutionReasons2,
444
+ statusMatchesEvent
443
445
  } from "@openfeature/core";
444
446
 
445
447
  // src/open-feature.ts
446
- import { OpenFeatureCommonAPI } from "@openfeature/core";
448
+ import {
449
+ OpenFeatureCommonAPI,
450
+ objectOrUndefined,
451
+ stringOrUndefined
452
+ } from "@openfeature/core";
447
453
 
448
454
  // src/provider/no-op-provider.ts
449
455
  import { ProviderStatus } from "@openfeature/core";
@@ -622,12 +628,12 @@ var InMemoryProvider = class {
622
628
  var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/web-sdk/api");
623
629
  var _globalThis = globalThis;
624
630
  var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
625
- // eslint-disable-next-line @typescript-eslint/no-empty-function
626
631
  constructor() {
627
632
  super("client");
628
633
  this._events = new OpenFeatureEventEmitter();
629
634
  this._defaultProvider = NOOP_PROVIDER;
630
635
  this._createEventEmitter = () => new OpenFeatureEventEmitter();
636
+ this._namedProviderContext = /* @__PURE__ */ new Map();
631
637
  }
632
638
  /**
633
639
  * Gets a singleton instance of the OpenFeature API.
@@ -643,26 +649,74 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
643
649
  _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;
644
650
  return instance;
645
651
  }
646
- setContext(context) {
652
+ setContext(nameOrContext, contextOrUndefined) {
647
653
  return __async(this, null, function* () {
648
- const oldContext = this._context;
649
- this._context = context;
650
- const allProviders = [this._defaultProvider, ...this._clientProviders.values()];
651
- yield Promise.all(
652
- allProviders.map((provider) => __async(this, null, function* () {
653
- var _a, _b;
654
- try {
655
- return yield (_a = provider.onContextChange) == null ? void 0 : _a.call(provider, oldContext, context);
656
- } catch (err) {
657
- (_b = this._logger) == null ? void 0 : _b.error(`Error running context change handler of provider ${provider.metadata.name}:`, err);
658
- }
659
- }))
660
- );
654
+ var _a, _b;
655
+ const clientName = stringOrUndefined(nameOrContext);
656
+ const context = (_b = (_a = objectOrUndefined(nameOrContext)) != null ? _a : objectOrUndefined(contextOrUndefined)) != null ? _b : {};
657
+ if (clientName) {
658
+ const provider = this._clientProviders.get(clientName);
659
+ if (provider) {
660
+ const oldContext = this.getContext(clientName);
661
+ this._namedProviderContext.set(clientName, context);
662
+ yield this.runProviderContextChangeHandler(provider, oldContext, context);
663
+ } else {
664
+ this._namedProviderContext.set(clientName, context);
665
+ }
666
+ } else {
667
+ const oldContext = this._context;
668
+ this._context = context;
669
+ const providersWithoutContextOverride = Array.from(this._clientProviders.entries()).filter(([name]) => !this._namedProviderContext.has(name)).reduce((acc, [, provider]) => {
670
+ acc.push(provider);
671
+ return acc;
672
+ }, []);
673
+ const allProviders = [this._defaultProvider, ...providersWithoutContextOverride];
674
+ yield Promise.all(
675
+ allProviders.map((provider) => this.runProviderContextChangeHandler(provider, oldContext, context))
676
+ );
677
+ }
661
678
  });
662
679
  }
663
- getContext() {
680
+ getContext(nameOrUndefined) {
681
+ const clientName = stringOrUndefined(nameOrUndefined);
682
+ if (clientName) {
683
+ const context = this._namedProviderContext.get(clientName);
684
+ if (context) {
685
+ return context;
686
+ } else {
687
+ this._logger.debug(`Unable to find context for '${clientName}'.`);
688
+ }
689
+ }
664
690
  return this._context;
665
691
  }
692
+ clearContext(nameOrUndefined) {
693
+ return __async(this, null, function* () {
694
+ const clientName = stringOrUndefined(nameOrUndefined);
695
+ if (clientName) {
696
+ const provider = this._clientProviders.get(clientName);
697
+ if (provider) {
698
+ const oldContext = this.getContext(clientName);
699
+ this._namedProviderContext.delete(clientName);
700
+ const newContext = this.getContext();
701
+ yield this.runProviderContextChangeHandler(provider, oldContext, newContext);
702
+ } else {
703
+ this._namedProviderContext.delete(clientName);
704
+ }
705
+ } else {
706
+ return this.setContext({});
707
+ }
708
+ });
709
+ }
710
+ /**
711
+ * Resets the global evaluation context and removes the evaluation context for
712
+ * all named clients.
713
+ */
714
+ clearContexts() {
715
+ return __async(this, null, function* () {
716
+ yield this.clearContext();
717
+ yield Promise.allSettled(Array.from(this._clientProviders.keys()).map((name) => this.clearContext(name)));
718
+ });
719
+ }
666
720
  /**
667
721
  * A factory function for creating new named OpenFeature clients. Clients can contain
668
722
  * their own state (e.g. logger, hook, context). Multiple clients can be used
@@ -689,7 +743,20 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
689
743
  * @returns {Promise<void>}
690
744
  */
691
745
  clearProviders() {
692
- return super.clearProvidersAndSetDefault(NOOP_PROVIDER);
746
+ return __async(this, null, function* () {
747
+ yield __superGet(OpenFeatureAPI.prototype, this, "clearProvidersAndSetDefault").call(this, NOOP_PROVIDER);
748
+ this._namedProviderContext.clear();
749
+ });
750
+ }
751
+ runProviderContextChangeHandler(provider, oldContext, newContext) {
752
+ return __async(this, null, function* () {
753
+ var _a, _b;
754
+ try {
755
+ return yield (_a = provider.onContextChange) == null ? void 0 : _a.call(provider, oldContext, newContext);
756
+ } catch (err) {
757
+ (_b = this._logger) == null ? void 0 : _b.error(`Error running ${provider.metadata.name}'s context change handler:`, err);
758
+ }
759
+ });
693
760
  }
694
761
  };
695
762
  var OpenFeature = OpenFeatureAPI.getInstance();
@@ -710,11 +777,15 @@ var OpenFeatureClient = class {
710
777
  providerMetadata: this.providerAccessor().metadata
711
778
  };
712
779
  }
780
+ get providerStatus() {
781
+ var _a;
782
+ return ((_a = this.providerAccessor()) == null ? void 0 : _a.status) || ProviderStatus3.READY;
783
+ }
713
784
  addHandler(eventType, handler) {
714
785
  var _a;
715
786
  this.emitterAccessor().addHandler(eventType, handler);
716
- const providerReady = !this._provider.status || this._provider.status === ProviderStatus3.READY;
717
- if (eventType === ProviderEvents2.Ready && providerReady) {
787
+ const shouldRunNow = statusMatchesEvent(eventType, this._provider.status);
788
+ if (shouldRunNow) {
718
789
  try {
719
790
  handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });
720
791
  } catch (err) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../node_modules/events/events.js", "../../src/client/open-feature-client.ts", "../../src/open-feature.ts", "../../src/provider/no-op-provider.ts", "../../src/provider/in-memory-provider/in-memory-provider.ts", "../../src/events/open-feature-event-emitter.ts", "../../src/provider/in-memory-provider/variant-not-found-error.ts", "../../src/index.ts"],
4
- "sourcesContent": ["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\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 ProviderEvents,\n ProviderStatus,\n ResolutionDetails,\n SafeLogger,\n StandardResolutionReasons,\n} from '@openfeature/core';\nimport { FlagEvaluationOptions } from '../evaluation';\nimport { OpenFeature } from '../open-feature';\nimport { Provider } from '../provider';\nimport { InternalEventEmitter } from '../events/internal/internal-event-emitter';\nimport { Client } from './client';\nimport { Hook } from '../hooks';\n\ntype OpenFeatureClientOptions = {\n name?: string;\n version?: string;\n};\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 emitterAccessor: () => InternalEventEmitter,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n name: this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n addHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const providerReady = !this._provider.status || this._provider.status === ProviderStatus.READY;\n\n if (eventType === ProviderEvents.Ready && providerReady) {\n // run immediately, we're ready.\n try {\n handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler<T extends ProviderEvents>(notificationType: T, handler: EventHandler<T>): 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(),\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: OpenFeature.providerMetadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\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 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", "import { EvaluationContext, ManageContext, OpenFeatureCommonAPI } from '@openfeature/core';\nimport { Client, OpenFeatureClient } from './client';\nimport { NOOP_PROVIDER, Provider } from './provider';\nimport { OpenFeatureEventEmitter } from './events';\nimport { Hook } from './hooks';\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};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider, Hook> implements ManageContext<Promise<void>> {\n protected _events = new OpenFeatureEventEmitter();\n protected _defaultProvider: Provider = NOOP_PROVIDER;\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\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 async setContext(context: EvaluationContext): Promise<void> {\n const oldContext = this._context;\n this._context = context;\n\n const allProviders = [this._defaultProvider, ...this._clientProviders.values()];\n await Promise.all(\n allProviders.map(async (provider) => {\n try {\n return await provider.onContextChange?.(oldContext, context);\n } catch (err) {\n this._logger?.error(`Error running context change handler of provider ${provider.metadata.name}:`, err);\n }\n }),\n );\n }\n\n getContext(): EvaluationContext {\n return this._context;\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} name The name of the client\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(name?: 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(name),\n () => this.buildAndCacheEventEmitterForClient(name),\n () => this._logger,\n { name, version },\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n clearProviders(): Promise<void> {\n return super.clearProvidersAndSetDefault(NOOP_PROVIDER);\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 { JsonValue, ProviderStatus, 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 get status(): ProviderStatus {\n /**\n * This is due to the NoopProvider not being a real provider.\n * We do not want it to trigger the Ready event handlers, so we never set this to ready.\n * With the NoopProvider assigned, the client can be assumed to be uninitialized.\n * https://github.com/open-feature/js-sdk/pull/429#discussion_r1202642654\n */\n return ProviderStatus.NOT_READY;\n }\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 ProviderEvents,\n ResolutionDetails,\n StandardResolutionReasons,\n TypeMismatchError,\n ProviderStatus,\n} from '@openfeature/core';\nimport { Provider } from '../provider';\nimport { OpenFeatureEventEmitter } 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 status: ProviderStatus = ProviderStatus.NOT_READY;\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 async initialize(context?: EvaluationContext | undefined): Promise<void> {\n try {\n\n for (const key in this._flagConfiguration) {\n this.resolveFlagWithReason(key, context);\n }\n\n this._context = context;\n // set the provider's state, but don't emit events manually;\n // the SDK does this based on the resolution/rejection of the init promise\n this.status = ProviderStatus.READY;\n } catch (error) {\n this.status = ProviderStatus.ERROR;\n throw error;\n }\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n */\n async putConfiguration(flagConfiguration: FlagConfiguration) {\n const flagsChanged = Object.entries(flagConfiguration)\n .filter(([key, value]) => this._flagConfiguration[key] !== value)\n .map(([key]) => key);\n\n this.status = ProviderStatus.STALE;\n this.events.emit(ProviderEvents.Stale);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n\n try {\n await this.initialize(this._context);\n // we need to emit our own events in this case, since it's not part of the init flow.\n this.events.emit(ProviderEvents.Ready);\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>(flagKey: string,\n defaultValue: T, context?: EvaluationContext, logger?: Logger): 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 evalReason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;\n\n const reason = this.status === ProviderStatus.STALE ? StandardResolutionReasons.CACHED : evalReason;\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 '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 {\n protected readonly eventEmitter = new EventEmitter({ captureRejections: true });\n\n constructor() {\n super();\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n}\n", "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", "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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",
6
- "names": ["ReflectApply", "ReflectOwnKeys", "NumberIsNaN", "EventEmitter", "once", "ErrorCode", "ProviderEvents", "ProviderStatus", "StandardResolutionReasons", "OpenFeatureError", "ProviderStatus", "EventEmitter", "ProviderStatus", "OpenFeatureError", "ProviderStatus", "ProviderEvents", "ErrorCode", "StandardResolutionReasons", "err"]
4
+ "sourcesContent": ["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\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 ProviderEvents,\n ProviderStatus,\n ResolutionDetails,\n SafeLogger,\n StandardResolutionReasons,\n statusMatchesEvent\n} from '@openfeature/core';\nimport { FlagEvaluationOptions } from '../evaluation';\nimport { InternalEventEmitter } from '../events/internal/internal-event-emitter';\nimport { Hook } from '../hooks';\nimport { OpenFeature } from '../open-feature';\nimport { Provider } from '../provider';\nimport { Client } from './client';\n\ntype OpenFeatureClientOptions = {\n name?: string;\n version?: string;\n};\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 emitterAccessor: () => InternalEventEmitter,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n name: this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n get providerStatus(): ProviderStatus {\n return this.providerAccessor()?.status || ProviderStatus.READY;\n }\n\n addHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const shouldRunNow = statusMatchesEvent(eventType, this._provider.status);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({ clientName: this.metadata.name, providerName: this._provider.metadata.name });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler<T extends ProviderEvents>(notificationType: T, handler: EventHandler<T>): 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(),\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: OpenFeature.providerMetadata,\n context,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\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 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", "import {\n EvaluationContext,\n ManageContext,\n OpenFeatureCommonAPI,\n objectOrUndefined,\n stringOrUndefined,\n} from '@openfeature/core';\nimport { Client, OpenFeatureClient } from './client';\nimport { NOOP_PROVIDER, Provider } from './provider';\nimport { OpenFeatureEventEmitter } from './events';\nimport { Hook } from './hooks';\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};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider, Hook> implements ManageContext<Promise<void>> {\n protected _events = new OpenFeatureEventEmitter();\n protected _defaultProvider: Provider = NOOP_PROVIDER;\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n protected _namedProviderContext: Map<string, EvaluationContext> = new Map();\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 /**\n * Sets the evaluation context globally.\n * This will be used by all providers that have not been overridden with a named client.\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 with a matching client name.\n * @param {string} clientName The name to identify the client\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(clientName: string, context: EvaluationContext): Promise<void>;\n async setContext<T extends EvaluationContext>(nameOrContext: T | string, contextOrUndefined?: T): Promise<void> {\n const clientName = stringOrUndefined(nameOrContext);\n const context = objectOrUndefined<T>(nameOrContext) ?? objectOrUndefined(contextOrUndefined) ?? {};\n\n if (clientName) {\n const provider = this._clientProviders.get(clientName);\n if (provider) {\n const oldContext = this.getContext(clientName);\n this._namedProviderContext.set(clientName, context);\n await this.runProviderContextChangeHandler(provider, oldContext, context);\n } else {\n this._namedProviderContext.set(clientName, context);\n }\n } else {\n const oldContext = this._context;\n this._context = context;\n\n const providersWithoutContextOverride = Array.from(this._clientProviders.entries())\n .filter(([name]) => !this._namedProviderContext.has(name))\n .reduce<Provider[]>((acc, [, provider]) => {\n acc.push(provider);\n return acc;\n }, []);\n\n const allProviders = [this._defaultProvider, ...providersWithoutContextOverride];\n await Promise.all(\n allProviders.map((provider) => this.runProviderContextChangeHandler(provider, 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} clientName The name to identify the client\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(clientName: string): EvaluationContext;\n getContext(nameOrUndefined?: string): EvaluationContext {\n const clientName = stringOrUndefined(nameOrUndefined);\n if (clientName) {\n const context = this._namedProviderContext.get(clientName);\n if (context) {\n return context;\n } else {\n this._logger.debug(`Unable to find context for '${clientName}'.`);\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} clientName The name to identify the client\n */\n clearContext(clientName: string): Promise<void>;\n async clearContext(nameOrUndefined?: string): Promise<void> {\n const clientName = stringOrUndefined(nameOrUndefined);\n if (clientName) {\n const provider = this._clientProviders.get(clientName);\n if (provider) {\n const oldContext = this.getContext(clientName);\n this._namedProviderContext.delete(clientName);\n const newContext = this.getContext();\n await this.runProviderContextChangeHandler(provider, oldContext, newContext);\n } else {\n this._namedProviderContext.delete(clientName);\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 named clients.\n */\n async clearContexts(): Promise<void> {\n // Default context must be cleared first to avoid calling the onContextChange\n // handler multiple times for named clients.\n await this.clearContext();\n\n // Use allSettled so a promise rejection doesn't affect others\n await Promise.allSettled(Array.from(this._clientProviders.keys()).map((name) => this.clearContext(name)));\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} name The name of the client\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(name?: 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(name),\n () => this.buildAndCacheEventEmitterForClient(name),\n () => this._logger,\n { name, 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._namedProviderContext.clear();\n }\n\n private async runProviderContextChangeHandler(\n provider: Provider,\n oldContext: EvaluationContext,\n newContext: EvaluationContext,\n ): Promise<void> {\n try {\n return await provider.onContextChange?.(oldContext, newContext);\n } catch (err) {\n this._logger?.error(`Error running ${provider.metadata.name}'s context change handler:`, err);\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 { JsonValue, ProviderStatus, 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 get status(): ProviderStatus {\n /**\n * This is due to the NoopProvider not being a real provider.\n * We do not want it to trigger the Ready event handlers, so we never set this to ready.\n * With the NoopProvider assigned, the client can be assumed to be uninitialized.\n * https://github.com/open-feature/js-sdk/pull/429#discussion_r1202642654\n */\n return ProviderStatus.NOT_READY;\n }\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 ProviderEvents,\n ResolutionDetails,\n StandardResolutionReasons,\n TypeMismatchError,\n ProviderStatus,\n} from '@openfeature/core';\nimport { Provider } from '../provider';\nimport { OpenFeatureEventEmitter } 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 status: ProviderStatus = ProviderStatus.NOT_READY;\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 async initialize(context?: EvaluationContext | undefined): Promise<void> {\n try {\n\n for (const key in this._flagConfiguration) {\n this.resolveFlagWithReason(key, context);\n }\n\n this._context = context;\n // set the provider's state, but don't emit events manually;\n // the SDK does this based on the resolution/rejection of the init promise\n this.status = ProviderStatus.READY;\n } catch (error) {\n this.status = ProviderStatus.ERROR;\n throw error;\n }\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n */\n async putConfiguration(flagConfiguration: FlagConfiguration) {\n const flagsChanged = Object.entries(flagConfiguration)\n .filter(([key, value]) => this._flagConfiguration[key] !== value)\n .map(([key]) => key);\n\n this.status = ProviderStatus.STALE;\n this.events.emit(ProviderEvents.Stale);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n\n try {\n await this.initialize(this._context);\n // we need to emit our own events in this case, since it's not part of the init flow.\n this.events.emit(ProviderEvents.Ready);\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>(flagKey: string,\n defaultValue: T, context?: EvaluationContext, logger?: Logger): 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 evalReason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;\n\n const reason = this.status === ProviderStatus.STALE ? StandardResolutionReasons.CACHED : evalReason;\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 '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 {\n protected readonly eventEmitter = new EventEmitter({ captureRejections: true });\n\n constructor() {\n super();\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n}\n", "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", "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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",
6
+ "names": ["ReflectApply", "ReflectOwnKeys", "NumberIsNaN", "EventEmitter", "once", "ErrorCode", "ProviderStatus", "StandardResolutionReasons", "OpenFeatureError", "ProviderStatus", "EventEmitter", "ProviderStatus", "OpenFeatureError", "ProviderStatus", "ErrorCode", "StandardResolutionReasons", "err"]
7
7
  }
package/dist/types.d.ts CHANGED
@@ -250,7 +250,7 @@ declare class SafeLogger implements Logger {
250
250
  */
251
251
  declare abstract class GenericEventEmitter<AdditionalContext extends Record<string, unknown> = Record<string, unknown>> implements ManageLogger<GenericEventEmitter<AdditionalContext>> {
252
252
  private readonly globalLogger?;
253
- protected abstract readonly eventEmitter: NodeJS.EventEmitter;
253
+ protected abstract readonly eventEmitter: PlatformEventEmitter;
254
254
  private readonly _handlers;
255
255
  private _eventLogger?;
256
256
  constructor(globalLogger?: (() => Logger) | undefined);
@@ -262,6 +262,29 @@ declare abstract class GenericEventEmitter<AdditionalContext extends Record<stri
262
262
  setLogger(logger: Logger): this;
263
263
  protected get _logger(): Logger | undefined;
264
264
  }
265
+ /**
266
+ * This is an un-exported type that corresponds to NodeJS.EventEmitter.
267
+ * We can't use that type here, because this module is used in both the browser, and the server.
268
+ * In the server, node (or whatever server runtime) provides an implementation for this.
269
+ * In the browser, we bundle in the popular 'events' package, which is a polyfill of NodeJS.EventEmitter.
270
+ */
271
+ interface PlatformEventEmitter {
272
+ addListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
273
+ on(eventName: string | symbol, listener: (...args: any[]) => void): this;
274
+ once(eventName: string | symbol, listener: (...args: any[]) => void): this;
275
+ removeListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
276
+ off(eventName: string | symbol, listener: (...args: any[]) => void): this;
277
+ removeAllListeners(event?: string | symbol): this;
278
+ setMaxListeners(n: number): this;
279
+ getMaxListeners(): number;
280
+ listeners(eventName: string | symbol): Function[];
281
+ rawListeners(eventName: string | symbol): Function[];
282
+ emit(eventName: string | symbol, ...args: any[]): boolean;
283
+ listenerCount(eventName: string | symbol, listener?: Function): number;
284
+ prependListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
285
+ prependOnceListener(eventName: string | symbol, listener: (...args: any[]) => void): this;
286
+ eventNames(): Array<string | symbol>;
287
+ }
265
288
 
266
289
  interface Metadata {
267
290
  }
@@ -446,6 +469,11 @@ declare class InvalidContextError extends OpenFeatureError {
446
469
  constructor(message?: string);
447
470
  }
448
471
 
472
+ declare class ProviderNotReadyError extends OpenFeatureError {
473
+ code: ErrorCode;
474
+ constructor(message?: string);
475
+ }
476
+
449
477
  /**
450
478
  * Checks whether the parameter is a string.
451
479
  * @param {unknown} value The value to check
@@ -647,6 +675,18 @@ interface Features {
647
675
 
648
676
  interface Client extends EvaluationLifeCycle<Client>, Features, ManageLogger<Client>, Eventing {
649
677
  readonly metadata: ClientMetadata;
678
+ /**
679
+ * Returns the status of the associated provider.
680
+ */
681
+ readonly providerStatus: ProviderStatus;
682
+ }
683
+
684
+ /**
685
+ * The InternalEventEmitter is not exported publicly and should only be used within the SDK. It extends the
686
+ * OpenFeatureEventEmitter to include additional properties that can be included
687
+ * in the event details.
688
+ */
689
+ declare abstract class InternalEventEmitter extends GenericEventEmitter<CommonEventDetails> {
650
690
  }
651
691
 
652
692
  type Hook = BaseHook<FlagValue, void, void>;
@@ -780,14 +820,6 @@ declare class InMemoryProvider implements Provider {
780
820
  private lookupFlagValue;
781
821
  }
782
822
 
783
- /**
784
- * The InternalEventEmitter is not exported publicly and should only be used within the SDK. It extends the
785
- * OpenFeatureEventEmitter to include additional properties that can be included
786
- * in the event details.
787
- */
788
- declare abstract class InternalEventEmitter extends GenericEventEmitter<CommonEventDetails> {
789
- }
790
-
791
823
  type OpenFeatureClientOptions = {
792
824
  name?: string;
793
825
  version?: string;
@@ -801,6 +833,7 @@ declare class OpenFeatureClient implements Client {
801
833
  private _clientLogger?;
802
834
  constructor(providerAccessor: () => Provider, emitterAccessor: () => InternalEventEmitter, globalLogger: () => Logger, options: OpenFeatureClientOptions);
803
835
  get metadata(): ClientMetadata;
836
+ get providerStatus(): ProviderStatus;
804
837
  addHandler<T extends ProviderEvents>(eventType: T, handler: EventHandler<T>): void;
805
838
  removeHandler<T extends ProviderEvents>(notificationType: T, handler: EventHandler<T>): void;
806
839
  getHandlers(eventType: ProviderEvents): EventHandler<ProviderEvents>[];
@@ -829,6 +862,7 @@ declare class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider, Hook> implem
829
862
  protected _events: OpenFeatureEventEmitter;
830
863
  protected _defaultProvider: Provider;
831
864
  protected _createEventEmitter: () => OpenFeatureEventEmitter;
865
+ protected _namedProviderContext: Map<string, EvaluationContext>;
832
866
  private constructor();
833
867
  /**
834
868
  * Gets a singleton instance of the OpenFeature API.
@@ -836,8 +870,51 @@ declare class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider, Hook> implem
836
870
  * @returns {OpenFeatureAPI} OpenFeature API
837
871
  */
838
872
  static getInstance(): OpenFeatureAPI;
873
+ /**
874
+ * Sets the evaluation context globally.
875
+ * This will be used by all providers that have not been overridden with a named client.
876
+ * @param {EvaluationContext} context Evaluation context
877
+ * @example
878
+ * await OpenFeature.setContext({ region: "us" });
879
+ */
839
880
  setContext(context: EvaluationContext): Promise<void>;
881
+ /**
882
+ * Sets the evaluation context for a specific provider.
883
+ * This will only affect providers with a matching client name.
884
+ * @param {string} clientName The name to identify the client
885
+ * @param {EvaluationContext} context Evaluation context
886
+ * @example
887
+ * await OpenFeature.setContext("test", { scope: "provider" });
888
+ * OpenFeature.setProvider(new MyProvider()) // Uses the default context
889
+ * OpenFeature.setProvider("test", new MyProvider()) // Uses context: { scope: "provider" }
890
+ */
891
+ setContext(clientName: string, context: EvaluationContext): Promise<void>;
892
+ /**
893
+ * Access the global evaluation context.
894
+ * @returns {EvaluationContext} Evaluation context
895
+ */
840
896
  getContext(): EvaluationContext;
897
+ /**
898
+ * Access the evaluation context for a specific named client.
899
+ * The global evaluation context is returned if a matching named client is not found.
900
+ * @param {string} clientName The name to identify the client
901
+ * @returns {EvaluationContext} Evaluation context
902
+ */
903
+ getContext(clientName: string): EvaluationContext;
904
+ /**
905
+ * Resets the global evaluation context to an empty object.
906
+ */
907
+ clearContext(): Promise<void>;
908
+ /**
909
+ * Removes the evaluation context for a specific named client.
910
+ * @param {string} clientName The name to identify the client
911
+ */
912
+ clearContext(clientName: string): Promise<void>;
913
+ /**
914
+ * Resets the global evaluation context and removes the evaluation context for
915
+ * all named clients.
916
+ */
917
+ clearContexts(): Promise<void>;
841
918
  /**
842
919
  * A factory function for creating new named OpenFeature clients. Clients can contain
843
920
  * their own state (e.g. logger, hook, context). Multiple clients can be used
@@ -855,6 +932,7 @@ declare class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider, Hook> implem
855
932
  * @returns {Promise<void>}
856
933
  */
857
934
  clearProviders(): Promise<void>;
935
+ private runProviderContextChangeHandler;
858
936
  }
859
937
  /**
860
938
  * A singleton instance of the OpenFeature API.
@@ -862,4 +940,4 @@ declare class OpenFeatureAPI extends OpenFeatureCommonAPI<Provider, Hook> implem
862
940
  */
863
941
  declare const OpenFeature: OpenFeatureAPI;
864
942
 
865
- export { BaseHook, BeforeHookContext, Client, ClientMetadata, CommonEventDetails, CommonProvider, ConfigChangeEvent, DefaultLogger, ErrorCode, ErrorEvent, EvaluationContext, EvaluationContextValue, EvaluationDetails, EvaluationLifeCycle, EventContext, EventDetails, EventHandler, EventMetadata, Eventing, Features, FlagEvaluationOptions, FlagMetadata, FlagNotFoundError, FlagValue, FlagValueType, GeneralError, GenericEventEmitter, Hook, HookContext, HookHints, InMemoryProvider, InvalidContextError, JsonArray, JsonObject, JsonValue, LOG_LEVELS, Logger, ManageContext, ManageLogger, Metadata, NOOP_PROVIDER, OpenFeature, OpenFeatureAPI, OpenFeatureClient, OpenFeatureCommonAPI, OpenFeatureError, OpenFeatureEventEmitter, Paradigm, ParseError, PrimitiveValue, Provider, ProviderEvents, ProviderMetadata, ProviderStatus, ReadyEvent, ResolutionDetails, ResolutionReason, SafeLogger, StaleEvent, StandardResolutionReasons, TargetingKeyMissingError, TypeMismatchError, isObject, isString, objectOrUndefined, statusMatchesEvent, stringOrUndefined };
943
+ export { BaseHook, BeforeHookContext, Client, ClientMetadata, CommonEventDetails, CommonProvider, ConfigChangeEvent, DefaultLogger, ErrorCode, ErrorEvent, EvaluationContext, EvaluationContextValue, EvaluationDetails, EvaluationLifeCycle, EventContext, EventDetails, EventHandler, EventMetadata, Eventing, Features, FlagEvaluationOptions, FlagMetadata, FlagNotFoundError, FlagValue, FlagValueType, GeneralError, GenericEventEmitter, Hook, HookContext, HookHints, InMemoryProvider, InvalidContextError, JsonArray, JsonObject, JsonValue, LOG_LEVELS, Logger, ManageContext, ManageLogger, Metadata, NOOP_PROVIDER, OpenFeature, OpenFeatureAPI, OpenFeatureClient, OpenFeatureCommonAPI, OpenFeatureError, OpenFeatureEventEmitter, Paradigm, ParseError, PrimitiveValue, Provider, ProviderEvents, ProviderMetadata, ProviderNotReadyError, ProviderStatus, ReadyEvent, ResolutionDetails, ResolutionReason, SafeLogger, StaleEvent, StandardResolutionReasons, TargetingKeyMissingError, TypeMismatchError, isObject, isString, objectOrUndefined, statusMatchesEvent, stringOrUndefined };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openfeature/web-sdk",
3
- "version": "0.4.6",
3
+ "version": "0.4.8",
4
4
  "description": "OpenFeature SDK for Web",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "files": [
@@ -46,9 +46,9 @@
46
46
  },
47
47
  "homepage": "https://github.com/open-feature/js-sdk#readme",
48
48
  "peerDependencies": {
49
- "@openfeature/core": "0.0.19"
49
+ "@openfeature/core": "0.0.20"
50
50
  },
51
51
  "devDependencies": {
52
- "@openfeature/core": "0.0.19"
52
+ "@openfeature/core": "0.0.20"
53
53
  }
54
54
  }