@openfeature/web-sdk 1.6.1 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +59 -2
- package/dist/cjs/index.js +542 -24
- package/dist/cjs/index.js.map +4 -4
- package/dist/esm/index.js +524 -6
- package/dist/esm/index.js.map +4 -4
- package/dist/global/index.js +527 -8
- package/dist/global/index.js.map +4 -4
- package/dist/global/index.min.js +1 -1
- package/dist/global/index.min.js.map +4 -4
- package/dist/types.d.ts +145 -3
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../node_modules/eventemitter3/index.js", "../../src/index.ts", "../../../shared/src/hooks/hook-data.ts", "../../../shared/src/evaluation/evaluation.ts", "../../../shared/src/errors/open-feature-error-abstract.ts", "../../../shared/src/errors/flag-not-found-error.ts", "../../../shared/src/errors/general-error.ts", "../../../shared/src/errors/invalid-context-error.ts", "../../../shared/src/errors/parse-error.ts", "../../../shared/src/errors/provider-fatal-error.ts", "../../../shared/src/errors/provider-not-ready-error.ts", "../../../shared/src/errors/targeting-key-missing-error.ts", "../../../shared/src/errors/type-mismatch-error.ts", "../../../shared/src/errors/index.ts", "../../../shared/src/provider/provider.ts", "../../../shared/src/events/events.ts", "../../../shared/src/events/event-utils.ts", "../../../shared/src/logger/default-logger.ts", "../../../shared/src/logger/safe-logger.ts", "../../../shared/src/events/generic-event-emitter.ts", "../../../shared/src/telemetry/attributes.ts", "../../../shared/src/telemetry/flag-metadata.ts", "../../../shared/src/telemetry/evaluation-event.ts", "../../../shared/src/type-guards.ts", "../../../shared/src/filter.ts", "../../../shared/src/open-feature.ts", "../../src/provider/no-op-provider.ts", "../../../../node_modules/eventemitter3/index.mjs", "../../src/events/open-feature-event-emitter.ts", "../../src/provider/in-memory-provider/variant-not-found-error.ts", "../../src/provider/in-memory-provider/in-memory-provider.ts", "../../src/client/internal/open-feature-client.ts", "../../src/open-feature.ts"],
|
|
4
|
-
"sourcesContent": ["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n", "export * from './client';\nexport * from './provider';\nexport * from './evaluation';\nexport * from './open-feature';\nexport * from './events';\nexport * from './hooks';\nexport * from './tracking';\nexport * from '@openfeature/core';\n", "/**\n * A mutable data structure for hooks to maintain state across their lifecycle.\n * Each hook instance gets its own isolated data store that persists for the\n * duration of a single flag evaluation.\n * @template TData - A record type that defines the shape of the stored data\n */\nexport interface HookData<TData = Record<string, unknown>> {\n /**\n * Sets a value in the hook data store.\n * @param key The key to store the value under\n * @param value The value to store\n */\n set<K extends keyof TData>(key: K, value: TData[K]): void;\n set(key: string, value: unknown): void;\n\n /**\n * Gets a value from the hook data store.\n * @param key The key to retrieve the value for\n * @returns The stored value, or undefined if not found\n */\n get<K extends keyof TData>(key: K): TData[K] | undefined;\n get(key: string): unknown;\n\n /**\n * Checks if a key exists in the hook data store.\n * @param key The key to check\n * @returns True if the key exists, false otherwise\n */\n has<K extends keyof TData>(key: K): boolean;\n has(key: string): boolean;\n\n /**\n * Deletes a value from the hook data store.\n * @param key The key to delete\n * @returns True if the key was deleted, false if it didn't exist\n */\n delete<K extends keyof TData>(key: K): boolean;\n delete(key: string): boolean;\n\n /**\n * Clears all values from the hook data store.\n */\n clear(): void;\n}\n\n/**\n * Default implementation of HookData using a Map.\n * @template TData - A record type that defines the shape of the stored data\n */\nexport class MapHookData<TData = Record<string, unknown>> implements HookData<TData> {\n private readonly data = new Map<keyof TData, TData[keyof TData]>();\n\n set<K extends keyof TData>(key: K, value: TData[K]): void {\n this.data.set(key, value);\n }\n\n get<K extends keyof TData>(key: K): TData[K] | undefined {\n return this.data.get(key) as TData[K] | undefined;\n }\n\n has<K extends keyof TData>(key: K): boolean {\n return this.data.has(key);\n }\n\n delete<K extends keyof TData>(key: K): boolean {\n return this.data.delete(key);\n }\n\n clear(): void {\n this.data.clear();\n }\n}", "import type { JsonValue } from '../types/structure';\n\nexport type FlagValueType = 'boolean' | 'string' | 'number' | 'object';\n\n/**\n * Represents a JSON node value.\n */\nexport type FlagValue = boolean | string | number | JsonValue;\n\nexport type ResolutionReason = keyof typeof StandardResolutionReasons | (string & Record<never, never>);\n\n/**\n * A structure which supports definition of arbitrary properties, with keys of type string, and values of type boolean, string, or number.\n *\n * This structure is populated by a provider for use by an Application Author (via the Evaluation API) or an Application Integrator (via hooks).\n */\nexport type FlagMetadata = Record<string, string | number | boolean>;\n\nexport type ResolutionDetails<U> = {\n value: U;\n variant?: string;\n flagMetadata?: FlagMetadata;\n reason?: ResolutionReason;\n errorCode?: ErrorCode;\n errorMessage?: string;\n};\n\nexport type EvaluationDetails<T extends FlagValue> = {\n flagKey: string;\n flagMetadata: Readonly<FlagMetadata>;\n} & ResolutionDetails<T>;\n\nexport const StandardResolutionReasons = {\n /**\n * The resolved value is static (no dynamic evaluation).\n */\n STATIC: 'STATIC',\n\n /**\n * The resolved value was configured statically, or otherwise fell back to a pre-configured value.\n */\n DEFAULT: 'DEFAULT',\n\n /**\n * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.\n */\n TARGETING_MATCH: 'TARGETING_MATCH',\n\n /**\n * The resolved value was the result of pseudorandom assignment.\n */\n SPLIT: 'SPLIT',\n\n /**\n * The resolved value was retrieved from cache.\n */\n CACHED: 'CACHED',\n\n /**\n * The resolved value was the result of the flag being disabled in the management system.\n */\n DISABLED: 'DISABLED',\n\n /**\n * The reason for the resolved value could not be determined.\n */\n UNKNOWN: 'UNKNOWN',\n\n /**\n * The resolved value is non-authoritative or possibly out of date.\n */\n STALE: 'STALE',\n\n /**\n * The resolved value was the result of an error.\n *\n * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.\n */\n ERROR: 'ERROR',\n} as const;\n\nexport enum ErrorCode {\n /**\n * The value was resolved before the provider was ready.\n */\n PROVIDER_NOT_READY = 'PROVIDER_NOT_READY',\n\n /**\n * The provider has entered an irrecoverable error state.\n */\n PROVIDER_FATAL = 'PROVIDER_FATAL',\n\n /**\n * The flag could not be found.\n */\n FLAG_NOT_FOUND = 'FLAG_NOT_FOUND',\n\n /**\n * An error was encountered parsing data, such as a flag configuration.\n */\n PARSE_ERROR = 'PARSE_ERROR',\n\n /**\n * The type of the flag value does not match the expected type.\n */\n TYPE_MISMATCH = 'TYPE_MISMATCH',\n\n /**\n * The provider requires a targeting key and one was not provided in the evaluation context.\n */\n TARGETING_KEY_MISSING = 'TARGETING_KEY_MISSING',\n\n /**\n * The evaluation context does not meet provider requirements.\n */\n INVALID_CONTEXT = 'INVALID_CONTEXT',\n\n /**\n * An error with an unspecified code.\n */\n GENERAL = 'GENERAL',\n}\n", "import type { ErrorCode } from '../evaluation';\n\n/**\n * Error Options were added in ES2022. Manually adding the type so that an\n * earlier target can be used.\n */\nexport type ErrorOptions = {\n cause?: unknown\n};\n\nexport abstract class OpenFeatureError extends Error {\n abstract code: ErrorCode;\n cause?: unknown;\n constructor(message?: string, options?: ErrorOptions) {\n super(message);\n Object.setPrototypeOf(this, OpenFeatureError.prototype);\n this.name = 'OpenFeatureError';\n this.cause = options?.cause;\n }\n}\n\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class FlagNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, FlagNotFoundError.prototype);\n this.name = 'FlagNotFoundError';\n this.code = ErrorCode.FLAG_NOT_FOUND;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class GeneralError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, GeneralError.prototype);\n this.name = 'GeneralError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class InvalidContextError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, InvalidContextError.prototype);\n this.name = 'InvalidContextError';\n this.code = ErrorCode.INVALID_CONTEXT;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class ParseError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, ParseError.prototype);\n this.name = 'ParseError';\n this.code = ErrorCode.PARSE_ERROR;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class ProviderFatalError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, ProviderFatalError.prototype);\n this.name = 'ProviderFatalError';\n this.code = ErrorCode.PROVIDER_FATAL;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class ProviderNotReadyError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, ProviderNotReadyError.prototype);\n this.name = 'ProviderNotReadyError';\n this.code = ErrorCode.PROVIDER_NOT_READY;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class TargetingKeyMissingError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);\n this.name = 'TargetingKeyMissingError';\n this.code = ErrorCode.TARGETING_KEY_MISSING;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class TypeMismatchError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, TypeMismatchError.prototype);\n this.name = 'TypeMismatchError';\n this.code = ErrorCode.TYPE_MISMATCH;\n }\n}\n", "import { ErrorCode } from '../evaluation';\n\nimport { FlagNotFoundError } from './flag-not-found-error';\nimport { GeneralError } from './general-error';\nimport { InvalidContextError } from './invalid-context-error';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ParseError } from './parse-error';\nimport { ProviderFatalError } from './provider-fatal-error';\nimport { ProviderNotReadyError } from './provider-not-ready-error';\nimport { TargetingKeyMissingError } from './targeting-key-missing-error';\nimport { TypeMismatchError } from './type-mismatch-error';\n\nconst instantiateErrorByErrorCode = (errorCode: ErrorCode, message?: string): OpenFeatureError => {\n switch (errorCode) {\n case ErrorCode.FLAG_NOT_FOUND:\n return new FlagNotFoundError(message);\n case ErrorCode.PARSE_ERROR:\n return new ParseError(message);\n case ErrorCode.TYPE_MISMATCH:\n return new TypeMismatchError(message);\n case ErrorCode.TARGETING_KEY_MISSING:\n return new TargetingKeyMissingError(message);\n case ErrorCode.INVALID_CONTEXT:\n return new InvalidContextError(message);\n case ErrorCode.PROVIDER_NOT_READY:\n return new ProviderNotReadyError(message);\n case ErrorCode.PROVIDER_FATAL:\n return new ProviderFatalError(message);\n default:\n return new GeneralError(message);\n }\n};\n\nexport {\n FlagNotFoundError,\n GeneralError,\n InvalidContextError,\n ParseError,\n ProviderFatalError,\n ProviderNotReadyError,\n TargetingKeyMissingError,\n TypeMismatchError,\n OpenFeatureError,\n instantiateErrorByErrorCode,\n};\n", "import type { EvaluationContext } from '../evaluation';\nimport type { AnyProviderEvent, ProviderEventEmitter } from '../events';\nimport type { TrackingEventDetails } from '../tracking';\nimport type { Metadata, Paradigm } from '../types';\n\n// TODO: with TypeScript 5+, we can use computed string properties,\n// so we can extract all of these into a shared set of string consts and use that in both enums\n// for now we have duplicated them.\n\n/**\n * The state of the provider.\n * Note that the provider's state is handled by the SDK.\n */\nexport enum ServerProviderStatus {\n /**\n * The provider has not been initialized and cannot yet evaluate flags.\n */\n NOT_READY = 'NOT_READY',\n\n /**\n * The provider is ready to resolve flags.\n */\n READY = 'READY',\n\n /**\n * The provider is in an error state and unable to evaluate flags.\n */\n ERROR = 'ERROR',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n STALE = 'STALE',\n\n /**\n * The provider has entered an irrecoverable error state.\n */\n FATAL = 'FATAL',\n}\n\n/**\n * The state of the provider.\n * Note that the provider's state is handled by the SDK.\n */\nexport enum ClientProviderStatus {\n /**\n * The provider has not been initialized and cannot yet evaluate flags.\n */\n NOT_READY = 'NOT_READY',\n\n /**\n * The provider is ready to resolve flags.\n */\n READY = 'READY',\n\n /**\n * The provider is in an error state and unable to evaluate flags.\n */\n ERROR = 'ERROR',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n STALE = 'STALE',\n\n /**\n * The provider has entered an irrecoverable error state.\n */\n FATAL = 'FATAL',\n\n /**\n * The provider is reconciling its state with a context change.\n */\n RECONCILING = 'RECONCILING',\n}\n\n/**\n * A type representing any possible ProviderStatus (server or client side).\n * In most cases, you probably want to import `ProviderStatus` from the respective SDK.\n */\nexport { ClientProviderStatus as AllProviderStatus };\n\n/**\n * Static data about the provider.\n */\nexport interface ProviderMetadata extends Readonly<Metadata> {\n readonly name: string;\n}\n\nexport interface CommonProvider<S extends ClientProviderStatus | ServerProviderStatus> {\n readonly metadata: ProviderMetadata;\n\n /**\n * Represents where the provider is intended to be run. If defined,\n * the SDK will enforce that the defined paradigm at runtime.\n */\n readonly runsOn?: Paradigm;\n\n // TODO: in the future we could make this a never to force provider to remove it.\n /**\n * @deprecated the SDK now maintains the provider's state; there's no need for providers to implement this field.\n * Returns a representation of the current readiness of the provider.\n *\n * _Providers which do not implement this method are assumed to be ready immediately._\n */\n readonly status?: S;\n\n /**\n * An event emitter for ProviderEvents.\n * @see ProviderEvents\n */\n events?: ProviderEventEmitter<AnyProviderEvent>;\n\n /**\n * A function used to shut down the provider.\n * Called when this provider is replaced with a new one, or when the OpenFeature is shut down.\n */\n onClose?(): Promise<void>;\n\n /**\n * A function used to setup the provider.\n * Called by the SDK after the provider is set if the provider's status is NOT_READY.\n * When the returned promise resolves, the SDK fires the ProviderEvents.Ready event.\n * If the returned promise rejects, the SDK fires the ProviderEvents.Error event.\n * Use this function to perform any context-dependent setup within the provider.\n * @param context\n */\n initialize?(context?: EvaluationContext): Promise<void>;\n\n /**\n * Track a user action or application state, usually representing a business objective or outcome.\n * @param trackingEventName\n * @param context\n * @param trackingEventDetails\n */\n track?(trackingEventName: string, context: EvaluationContext, trackingEventDetails: TrackingEventDetails): void;\n}\n", "// TODO: with TypeScript 5+, we can use computed string properties,\n// so we can extract all of these into a shared set of string consts and use that in both enums\n// for now we have duplicated them.\n\n/**\n * An enumeration of possible events for server-sdk providers.\n */\nexport enum ServerProviderEvents {\n /**\n * The provider is ready to evaluate flags.\n */\n Ready = 'PROVIDER_READY',\n\n /**\n * The provider is in an error state.\n */\n Error = 'PROVIDER_ERROR',\n\n /**\n * The flag configuration in the source-of-truth has changed.\n */\n ConfigurationChanged = 'PROVIDER_CONFIGURATION_CHANGED',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n Stale = 'PROVIDER_STALE',\n}\n\n/**\n * An enumeration of possible events for web-sdk providers.\n */\nexport enum ClientProviderEvents {\n /**\n * The provider is ready to evaluate flags.\n */\n Ready = 'PROVIDER_READY',\n\n /**\n * The provider is in an error state.\n */\n Error = 'PROVIDER_ERROR',\n\n /**\n * The flag configuration in the source-of-truth has changed.\n */\n ConfigurationChanged = 'PROVIDER_CONFIGURATION_CHANGED',\n\n /**\n * The context associated with the provider has changed, and the provider has reconciled it's associated state.\n */\n ContextChanged = 'PROVIDER_CONTEXT_CHANGED',\n\n /**\n * The context associated with the provider has changed, and the provider has not yet reconciled its associated state.\n */\n Reconciling = 'PROVIDER_RECONCILING',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n Stale = 'PROVIDER_STALE',\n}\n\n\n/* alias because in many cases, we iterate over all possible events in code,\nso we have to do this on ClientProviderEvents to be exhaustive */\nexport { ClientProviderEvents as AllProviderEvents };\n\n/**\n * A type representing any possible ProviderEvent (server or client side).\n * In most cases, you probably want to import `ProviderEvents` from the respective SDK.\n */\nexport type AnyProviderEvent = ServerProviderEvents | ClientProviderEvents;\n", "import type { ClientProviderStatus, ServerProviderStatus } from '../provider';\nimport { AllProviderStatus } from '../provider';\nimport type { AnyProviderEvent } from './events';\nimport { AllProviderEvents } from './events';\n\nconst eventStatusMap = {\n [AllProviderStatus.READY]: AllProviderEvents.Ready,\n [AllProviderStatus.ERROR]: AllProviderEvents.Error,\n [AllProviderStatus.FATAL]: AllProviderEvents.Error,\n [AllProviderStatus.STALE]: AllProviderEvents.Stale,\n [AllProviderStatus.RECONCILING]: AllProviderEvents.Reconciling,\n [AllProviderStatus.NOT_READY]: undefined,\n};\n\n/**\n * Returns true if the provider's status corresponds to the event.\n * If the provider's status is not defined, it matches READY.\n * @param {AnyProviderEvent} event event to match\n * @param {ClientProviderStatus | ServerProviderStatus} status status of provider\n * @returns {boolean} boolean indicating if the provider status corresponds to the event.\n */\nexport const statusMatchesEvent = <T extends AnyProviderEvent>(event: T, status?: ClientProviderStatus | ServerProviderStatus): boolean => {\n return (!status && event === AllProviderEvents.Ready) || eventStatusMap[status!] === event;\n};", "/* eslint-disable @typescript-eslint/no-empty-function */\n\nimport type { Logger } from './logger';\n\nexport class DefaultLogger implements Logger {\n error(...args: unknown[]): void {\n console.error(...args);\n }\n\n warn(...args: unknown[]): void {\n console.warn(...args);\n }\n\n info(): void {}\n\n debug(): void {}\n}\n", "import type { Logger } from './logger';\nimport { DefaultLogger } from './default-logger';\n\nexport const LOG_LEVELS: Array<keyof Logger> = ['error', 'warn', 'info', 'debug'];\n\nexport class SafeLogger implements Logger {\n private readonly logger: Logger;\n private readonly fallbackLogger = new DefaultLogger();\n\n constructor(logger: Logger) {\n try {\n for (const level of LOG_LEVELS) {\n if (!logger[level] || typeof logger[level] !== 'function') {\n throw new Error(`The provided logger is missing the ${level} method.`);\n }\n }\n this.logger = logger;\n } catch (err) {\n console.error(err);\n console.error('Falling back to the default logger.');\n this.logger = this.fallbackLogger;\n }\n }\n\n error(...args: unknown[]): void {\n this.log('error', ...args);\n }\n\n warn(...args: unknown[]): void {\n this.log('warn', ...args);\n }\n\n info(...args: unknown[]): void {\n this.log('info', ...args);\n }\n\n debug(...args: unknown[]): void {\n this.log('debug', ...args);\n }\n\n private log(level: keyof Logger, ...args: unknown[]) {\n try {\n this.logger[level](...args);\n } catch (error) {\n this.fallbackLogger[level](...args);\n }\n }\n}\n", "import type { Logger, ManageLogger} from '../logger';\nimport { SafeLogger } from '../logger';\nimport type { ProviderEventEmitter } from './provider-event-emitter';\nimport type { EventContext, EventDetails, EventHandler } from './eventing';\nimport type { AnyProviderEvent } from './events';\nimport { AllProviderEvents } from './events';\n\n/**\n * The GenericEventEmitter should only be used within the SDK. It supports additional properties that can be included\n * in the event details.\n */\nexport abstract class GenericEventEmitter<\n E extends AnyProviderEvent,\n AdditionalContext extends Record<string, unknown> = Record<string, unknown>,\n >\n implements ProviderEventEmitter<E>, ManageLogger<GenericEventEmitter<E, AdditionalContext>>\n{\n protected abstract readonly eventEmitter: PlatformEventEmitter;\n\n private readonly _handlers: { [key in AnyProviderEvent]: WeakMap<EventHandler, EventHandler[]> } = {\n [AllProviderEvents.ConfigurationChanged]: new WeakMap<EventHandler, EventHandler[]>(),\n [AllProviderEvents.ContextChanged]: new WeakMap<EventHandler, EventHandler[]>(),\n [AllProviderEvents.Ready]: new WeakMap<EventHandler, EventHandler[]>(),\n [AllProviderEvents.Error]: new WeakMap<EventHandler, EventHandler[]>(),\n [AllProviderEvents.Stale]: new WeakMap<EventHandler, EventHandler[]>(),\n [AllProviderEvents.Reconciling]: new WeakMap<EventHandler, EventHandler[]>(),\n };\n private _eventLogger?: Logger;\n\n constructor(private readonly globalLogger?: () => Logger) {}\n\n // here we use E, to restrict the events a provider can manually emit (PROVIDER_CONTEXT_CHANGED is emitted by the SDK)\n emit(eventType: E, context?: EventContext): void {\n this.eventEmitter.emit(eventType, context);\n }\n\n addHandler(eventType: AnyProviderEvent, handler: EventHandler): void {\n // The handlers have to be wrapped with an async function because if a synchronous functions throws an error,\n // the other handlers will not run.\n const asyncHandler = async (details?: EventDetails) => {\n try {\n await handler(details);\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n };\n // The async handler has to be written to the map, because we need to get the wrapper function when deleting a listener\n const existingAsyncHandlers = this._handlers[eventType].get(handler);\n\n // we allow duplicate event handlers, similar to node,\n // see: https://nodejs.org/api/events.html#emitteroneventname-listener\n // and https://nodejs.org/api/events.html#emitterremovelistenereventname-listener\n this._handlers[eventType].set(handler, [...(existingAsyncHandlers || []), asyncHandler]);\n this.eventEmitter.on(eventType, asyncHandler);\n }\n\n removeHandler(eventType: AnyProviderEvent, handler: EventHandler): void {\n // Get the wrapper function for this handler, to delete it from the event emitter\n const existingAsyncHandlers = this._handlers[eventType].get(handler);\n\n if (existingAsyncHandlers) {\n const removedAsyncHandler = existingAsyncHandlers.pop();\n if (removedAsyncHandler) {\n this.eventEmitter.removeListener(eventType, removedAsyncHandler);\n }\n }\n }\n\n removeAllHandlers(eventType?: AnyProviderEvent): void {\n // If giving undefined, the listeners are not removed, so we have to check explicitly\n if (eventType) {\n this.eventEmitter.removeAllListeners(eventType);\n } else {\n this.eventEmitter.removeAllListeners();\n }\n }\n\n getHandlers(eventType: AnyProviderEvent): EventHandler[] {\n return this.eventEmitter.listeners(eventType) as EventHandler[];\n }\n\n setLogger(logger: Logger): this {\n this._eventLogger = new SafeLogger(logger);\n return this;\n }\n\n protected get _logger() {\n return this._eventLogger ?? this.globalLogger?.();\n }\n}\n\n/**\n * This is an un-exported type that corresponds to NodeJS.EventEmitter.\n * We can't use that type here, because this module is used in both the browser, and the server.\n * In the server, node (or whatever server runtime) provides an implementation for this.\n * In the browser, we bundle in the popular 'EventEmitter3' package, which is a polyfill of NodeJS.EventEmitter.\n */\n/* eslint-disable */\ninterface PlatformEventEmitter {\n addListener(eventName: string | symbol, listener: (...args: any[]) => void): this;\n on(eventName: string | symbol, listener: (...args: any[]) => void): this;\n once(eventName: string | symbol, listener: (...args: any[]) => void): this;\n removeListener(eventName: string | symbol, listener: (...args: any[]) => void): this;\n off(eventName: string | symbol, listener: (...args: any[]) => void): this;\n removeAllListeners(event?: string | symbol): this;\n listeners(eventName: string | symbol): Function[];\n emit(eventName: string | symbol, ...args: any[]): boolean;\n listenerCount(eventName: string | symbol, listener?: Function): number;\n eventNames(): Array<string | symbol>;\n}\n", "/**\n * The attributes of an OpenTelemetry compliant event for flag evaluation.\n * @see https://opentelemetry.io/docs/specs/semconv/feature-flags/feature-flags-logs/\n */\nexport const TelemetryAttribute = {\n /**\n * The lookup key of the feature flag.\n *\n * - type: `string`\n * - requirement level: `required`\n * - example: `logo-color`\n */\n KEY: 'feature_flag.key',\n /**\n * Describes a class of error the operation ended with.\n *\n * - type: `string`\n * - requirement level: `conditionally required`\n * - condition: `reason` is `error`\n * - example: `flag_not_found`\n */\n ERROR_CODE: 'error.type',\n /**\n * A message explaining the nature of an error occurring during flag evaluation.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `Flag not found`\n */\n ERROR_MESSAGE: 'error.message',\n /**\n * A semantic identifier for an evaluated flag value.\n *\n * - type: `string`\n * - requirement level: `conditionally required`\n * - condition: variant is defined on the evaluation details\n * - example: `blue`; `on`; `true`\n */\n VARIANT: 'feature_flag.result.variant',\n /**\n * The evaluated value of the feature flag.\n *\n * - type: `undefined`\n * - requirement level: `conditionally required`\n * - condition: variant is not defined on the evaluation details\n * - example: `#ff0000`; `1`; `true`\n */\n VALUE: 'feature_flag.result.value',\n /**\n * The unique identifier for the flag evaluation context. For example, the targeting key.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `5157782b-2203-4c80-a857-dbbd5e7761db`\n */\n CONTEXT_ID: 'feature_flag.context.id',\n /**\n * The reason code which shows how a feature flag value was determined.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `targeting_match`\n */\n REASON: 'feature_flag.result.reason',\n /**\n * Describes a class of error the operation ended with.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `flag_not_found`\n */\n PROVIDER: 'feature_flag.provider.name',\n /**\n * The identifier of the flag set to which the feature flag belongs.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `proj-1`; `ab98sgs`; `service1/dev`\n */\n FLAG_SET_ID: 'feature_flag.set.id',\n /**\n * The version of the ruleset used during the evaluation. This may be any stable value which uniquely identifies the ruleset.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `1.0.0`; `2021-01-01`\n */\n VERSION: 'feature_flag.version',\n} as const;\n", "/**\n * Well-known flag metadata attributes for telemetry events.\n * @see https://openfeature.dev/specification/appendix-d#flag-metadata\n */\nexport const TelemetryFlagMetadata = {\n /**\n * The context identifier returned in the flag metadata uniquely identifies\n * the subject of the flag evaluation. If not available, the targeting key\n * should be used.\n */\n CONTEXT_ID: 'contextId',\n /**\n * \tA logical identifier for the flag set.\n */\n FLAG_SET_ID: 'flagSetId',\n /**\n * \tA version string (format unspecified) for the flag or flag set.\n */\n VERSION: 'version',\n} as const;\n", "import { ErrorCode, StandardResolutionReasons, type EvaluationDetails, type FlagValue } from '../evaluation/evaluation';\nimport type { HookContext } from '../hooks/hooks';\nimport { TelemetryAttribute } from './attributes';\nimport { TelemetryFlagMetadata } from './flag-metadata';\n\ntype EvaluationEvent = {\n /**\n * The name of the feature flag evaluation event.\n */\n name: string;\n /**\n * The attributes of an OpenTelemetry compliant event for flag evaluation.\n * @experimental The attributes are subject to change.\n * @see https://opentelemetry.io/docs/specs/semconv/feature-flags/feature-flags-logs/\n */\n attributes: Record<string, string | number | boolean | FlagValue>;\n};\n\nconst FLAG_EVALUATION_EVENT_NAME = 'feature_flag.evaluation';\n\n/**\n * Returns an OpenTelemetry compliant event for flag evaluation.\n * @param {HookContext} hookContext Contextual information about the flag evaluation\n * @param {EvaluationDetails} evaluationDetails The details of the flag evaluation\n * @returns {EvaluationEvent} An evaluation event object containing the event name and attributes\n */\nexport function createEvaluationEvent(\n hookContext: Readonly<HookContext<FlagValue>>,\n evaluationDetails: EvaluationDetails<FlagValue>,\n): EvaluationEvent {\n const attributes: EvaluationEvent['attributes'] = {\n [TelemetryAttribute.KEY]: hookContext.flagKey,\n [TelemetryAttribute.PROVIDER]: hookContext.providerMetadata.name,\n [TelemetryAttribute.REASON]: (evaluationDetails.reason ?? StandardResolutionReasons.UNKNOWN).toLowerCase(),\n };\n\n if (evaluationDetails.variant) {\n attributes[TelemetryAttribute.VARIANT] = evaluationDetails.variant;\n } else {\n attributes[TelemetryAttribute.VALUE] = evaluationDetails.value;\n }\n\n const contextId =\n evaluationDetails.flagMetadata[TelemetryFlagMetadata.CONTEXT_ID] || hookContext.context.targetingKey;\n if (contextId) {\n attributes[TelemetryAttribute.CONTEXT_ID] = contextId;\n }\n\n const setId = evaluationDetails.flagMetadata[TelemetryFlagMetadata.FLAG_SET_ID];\n if (setId) {\n attributes[TelemetryAttribute.FLAG_SET_ID] = setId;\n }\n\n const version = evaluationDetails.flagMetadata[TelemetryFlagMetadata.VERSION];\n if (version) {\n attributes[TelemetryAttribute.VERSION] = version;\n }\n\n if (evaluationDetails.reason === StandardResolutionReasons.ERROR) {\n attributes[TelemetryAttribute.ERROR_CODE] = (evaluationDetails.errorCode ?? ErrorCode.GENERAL).toLowerCase();\n if (evaluationDetails.errorMessage) {\n attributes[TelemetryAttribute.ERROR_MESSAGE] = evaluationDetails.errorMessage;\n }\n }\n\n return {\n name: FLAG_EVALUATION_EVENT_NAME,\n attributes,\n };\n}\n", "/**\n * Checks whether the parameter is a string.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is a string\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Returns the parameter if it is a string, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {string|undefined} The parameter if it is a string, otherwise undefined\n */\nexport function stringOrUndefined(value: unknown): string | undefined {\n return isString(value) ? value : undefined;\n}\n\n/**\n * Checks whether the parameter is an object.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is an object\n */\nexport function isObject<T extends object>(value: unknown): value is T {\n return typeof value === 'object';\n}\n\n/**\n * Returns the parameter if it is an object, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {object|undefined} The parameter if it is an object, otherwise undefined\n */\nexport function objectOrUndefined<T extends object>(value: unknown): T | undefined {\n return isObject<T>(value) ? value : undefined;\n}\n", "/**\n * Checks if a value is not null or undefined and returns it as type assertion\n * @template T\n * @param {T} input The value to check\n * @returns {T} If the value is not null or undefined\n */\nexport function isDefined<T>(input?: T | null | undefined): input is T {\n return typeof input !== 'undefined' && input !== null;\n}\n", "import type { OpenFeatureError } from './errors';\nimport { GeneralError } from './errors';\nimport type { EvaluationContext } from './evaluation';\nimport { ErrorCode } from './evaluation';\nimport type {\n AnyProviderEvent,\n EventDetails,\n EventHandler,\n Eventing,\n EventOptions,\n GenericEventEmitter,\n} from './events';\nimport { AllProviderEvents, statusMatchesEvent } from './events';\nimport { isDefined } from './filter';\nimport type { BaseHook, EvaluationLifeCycle } from './hooks';\nimport type { Logger, ManageLogger } from './logger';\nimport { DefaultLogger, SafeLogger } from './logger';\nimport type { ClientProviderStatus, CommonProvider, ProviderMetadata, ServerProviderStatus } from './provider';\nimport { objectOrUndefined, stringOrUndefined } from './type-guards';\nimport type { Paradigm } from './types';\n\ntype AnyProviderStatus = ClientProviderStatus | ServerProviderStatus;\n\n/**\n * A provider and its current status.\n * For internal use only.\n */\nexport class ProviderWrapper<P extends CommonProvider<AnyProviderStatus>, S extends AnyProviderStatus> {\n private _pendingContextChanges = 0;\n\n constructor(\n private _provider: P,\n private _status: S,\n _statusEnumType: typeof ClientProviderStatus | typeof ServerProviderStatus,\n ) {\n // update the providers status with events\n _provider.events?.addHandler(AllProviderEvents.Ready, () => {\n // These casts are due to the face we don't \"know\" what status enum we are dealing with here (client or server).\n // We could abstract this an implement it in the client/server libs to fix this, but the value is low.\n this._status = _statusEnumType.READY as S;\n });\n _provider.events?.addHandler(AllProviderEvents.Stale, () => {\n this._status = _statusEnumType.STALE as S;\n });\n _provider.events?.addHandler(AllProviderEvents.Error, (details) => {\n if (details?.errorCode === ErrorCode.PROVIDER_FATAL) {\n this._status = _statusEnumType.FATAL as S;\n } else {\n this._status = _statusEnumType.ERROR as S;\n }\n });\n }\n\n get provider(): P {\n return this._provider;\n }\n\n set provider(provider: P) {\n this._provider = provider;\n }\n\n get status(): S {\n return this._status;\n }\n\n set status(status: S) {\n this._status = status;\n }\n\n get allContextChangesSettled() {\n return this._pendingContextChanges === 0;\n }\n\n incrementPendingContextChanges() {\n this._pendingContextChanges++;\n }\n\n decrementPendingContextChanges() {\n this._pendingContextChanges--;\n }\n}\n\nexport abstract class OpenFeatureCommonAPI<\n S extends AnyProviderStatus,\n P extends CommonProvider<S> = CommonProvider<S>,\n H extends BaseHook = BaseHook,\n >\n implements\n Eventing<AnyProviderEvent>,\n EvaluationLifeCycle<OpenFeatureCommonAPI<S, P>>,\n ManageLogger<OpenFeatureCommonAPI<S, P>>\n{\n // accessor for the type of the ProviderStatus enum (client or server)\n protected abstract readonly _statusEnumType: typeof ClientProviderStatus | typeof ServerProviderStatus;\n protected abstract _createEventEmitter(): GenericEventEmitter<AnyProviderEvent>;\n protected abstract _defaultProvider: ProviderWrapper<P, AnyProviderStatus>;\n protected abstract readonly _domainScopedProviders: Map<string, ProviderWrapper<P, AnyProviderStatus>>;\n protected abstract readonly _apiEmitter: GenericEventEmitter<AnyProviderEvent>;\n\n protected _hooks: H[] = [];\n protected _context: EvaluationContext = {};\n protected _logger: Logger = new DefaultLogger();\n\n private readonly _clientEventHandlers: Map<string | undefined, [AnyProviderEvent, EventHandler][]> = new Map();\n protected _domainScopedContext: Map<string, EvaluationContext> = new Map();\n protected _clientEvents: Map<string | undefined, GenericEventEmitter<AnyProviderEvent>> = new Map();\n protected _runsOn: Paradigm;\n\n constructor(category: Paradigm) {\n this._runsOn = category;\n }\n\n addHooks(...hooks: H[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): H[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n setLogger(logger: Logger): this {\n this._logger = new SafeLogger(logger);\n return this;\n }\n\n /**\n * Get metadata about the default provider.\n * @returns {ProviderMetadata} Provider Metadata\n */\n get providerMetadata(): ProviderMetadata {\n return this.getProviderMetadata();\n }\n\n /**\n * Get metadata about a registered provider using the client name.\n * An unbound or empty client name will return metadata from the default provider.\n * @param {string} domain An identifier which logically binds clients with providers\n * @returns {ProviderMetadata} Provider Metadata\n */\n getProviderMetadata(domain?: string): ProviderMetadata {\n return this.getProviderForClient(domain).metadata;\n }\n\n /**\n * Adds a handler for the given provider event type.\n * The handlers are called in the order they have been added.\n * API (global) events run for all providers.\n * @param {AnyProviderEvent} eventType The provider event type to listen to\n * @param {EventHandler} handler The handler to run on occurrence of the event type\n * @param {EventOptions} options Optional options such as signal for aborting\n */\n addHandler<T extends AnyProviderEvent>(eventType: T, handler: EventHandler, options?: EventOptions): void {\n [...new Map([[undefined, this._defaultProvider]]), ...this._domainScopedProviders].forEach((keyProviderTuple) => {\n const domain = keyProviderTuple[0];\n const provider = keyProviderTuple[1].provider;\n const status = keyProviderTuple[1].status;\n const shouldRunNow = statusMatchesEvent(eventType, status);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({ domain, providerName: provider.metadata.name });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n });\n\n this._apiEmitter.addHandler(eventType, handler);\n if (options?.signal && typeof options.signal.addEventListener === 'function') {\n options.signal.addEventListener('abort', () => {\n this.removeHandler(eventType, handler);\n });\n }\n }\n\n /**\n * Removes a handler for the given provider event type.\n * @param {AnyProviderEvent} eventType The provider event type to remove the listener for\n * @param {EventHandler} handler The handler to remove for the provider event type\n */\n removeHandler<T extends AnyProviderEvent>(eventType: T, handler: EventHandler): void {\n this._apiEmitter.removeHandler(eventType, handler);\n }\n\n /**\n * Removes all event handlers.\n */\n clearHandlers(): void {\n this._apiEmitter.removeAllHandlers();\n }\n\n /**\n * Gets the current handlers for the given provider event type.\n * @param {AnyProviderEvent} eventType The provider event type to get the current handlers for\n * @returns {EventHandler[]} The handlers currently attached to the given provider event type\n */\n getHandlers<T extends AnyProviderEvent>(eventType: T): EventHandler[] {\n return this._apiEmitter.getHandlers(eventType);\n }\n\n abstract setProviderAndWait(\n clientOrProvider?: string | P,\n providerContextOrUndefined?: P | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Promise<void>;\n\n abstract setProvider(\n clientOrProvider?: string | P,\n providerContextOrUndefined?: P | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): this;\n\n protected setAwaitableProvider(domainOrProvider?: string | P, providerOrUndefined?: P): Promise<void> | void {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = objectOrUndefined<P>(domainOrProvider) ?? objectOrUndefined<P>(providerOrUndefined);\n\n if (!provider) {\n this._logger.debug('No provider defined, ignoring setProvider call');\n return;\n }\n\n const oldProvider = this.getProviderForClient(domain);\n const providerName = provider.metadata.name;\n\n // ignore no-ops\n if (oldProvider === provider) {\n this._logger.debug('Provider is already set, ignoring setProvider call');\n return;\n }\n\n if (!provider.runsOn) {\n this._logger.debug(`Provider '${provider.metadata.name}' has not defined its intended use.`);\n } else if (provider.runsOn !== this._runsOn) {\n throw new GeneralError(`Provider '${provider.metadata.name}' is intended for use on the ${provider.runsOn}.`);\n }\n\n const emitters = this.getAssociatedEventEmitters(domain);\n\n let initializationPromise: Promise<void> | void = undefined;\n const wrappedProvider = new ProviderWrapper<P, AnyProviderStatus>(\n provider,\n this._statusEnumType.NOT_READY,\n this._statusEnumType,\n );\n\n // initialize the provider if it implements \"initialize\" and it's not already registered\n if (typeof provider.initialize === 'function' && !this.allProviders.includes(provider)) {\n initializationPromise = provider\n .initialize?.(domain ? (this._domainScopedContext.get(domain) ?? this._context) : this._context)\n ?.then(() => {\n wrappedProvider.status = this._statusEnumType.READY;\n // fetch the most recent event emitters, some may have been added during init\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(AllProviderEvents.Ready, { clientName: domain, domain, providerName });\n });\n this._apiEmitter?.emit(AllProviderEvents.Ready, { clientName: domain, domain, providerName });\n })\n ?.catch((error) => {\n // if this is a fatal error, transition to FATAL status\n if ((error as OpenFeatureError)?.code === ErrorCode.PROVIDER_FATAL) {\n wrappedProvider.status = this._statusEnumType.FATAL;\n } else {\n wrappedProvider.status = this._statusEnumType.ERROR;\n }\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(AllProviderEvents.Error, {\n clientName: domain,\n domain,\n providerName,\n message: error?.message,\n });\n });\n this._apiEmitter?.emit(AllProviderEvents.Error, {\n clientName: domain,\n domain,\n providerName,\n message: error?.message,\n });\n // rethrow after emitting error events, so that public methods can control error handling\n throw error;\n });\n } else {\n wrappedProvider.status = this._statusEnumType.READY;\n emitters.forEach((emitter) => {\n emitter?.emit(AllProviderEvents.Ready, { clientName: domain, domain, providerName });\n });\n this._apiEmitter?.emit(AllProviderEvents.Ready, { clientName: domain, domain, providerName });\n }\n\n if (domain) {\n this._domainScopedProviders.set(domain, wrappedProvider);\n } else {\n this._defaultProvider = wrappedProvider;\n }\n\n this.transferListeners(oldProvider, provider, domain, emitters);\n\n // Do not close a provider that is bound to any client\n if (!this.allProviders.includes(oldProvider)) {\n oldProvider?.onClose?.()?.catch((err: Error | undefined) => {\n this._logger.error(`error closing provider: ${err?.message}, ${err?.stack}`);\n });\n }\n\n return initializationPromise;\n }\n\n protected getProviderForClient(domain?: string): P {\n if (!domain) {\n return this._defaultProvider.provider;\n }\n\n return this._domainScopedProviders.get(domain)?.provider ?? this._defaultProvider.provider;\n }\n\n protected buildAndCacheEventEmitterForClient(domain?: string): GenericEventEmitter<AnyProviderEvent> {\n const emitter = this._clientEvents.get(domain);\n\n if (emitter) {\n return emitter;\n }\n\n // lazily add the event emitters\n const newEmitter = this._createEventEmitter();\n this._clientEvents.set(domain, newEmitter);\n\n const clientProvider = this.getProviderForClient(domain);\n Object.values<AllProviderEvents>(AllProviderEvents).forEach((eventType) =>\n clientProvider.events?.addHandler(eventType, async (details) => {\n newEmitter.emit(eventType, {\n ...details,\n clientName: domain,\n domain,\n providerName: clientProvider.metadata.name,\n });\n }),\n );\n\n return newEmitter;\n }\n\n private getUnboundEmitters(): GenericEventEmitter<AnyProviderEvent>[] {\n const domainScopedProviders = [...this._domainScopedProviders.keys()];\n const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);\n const unboundEmitterNames = eventEmitterNames.filter((name) => !domainScopedProviders.includes(name));\n return [\n // all unbound, named emitters\n ...unboundEmitterNames.map((name) => this._clientEvents.get(name)),\n // the default emitter\n this._clientEvents.get(undefined),\n ].filter(isDefined);\n }\n\n protected getAssociatedEventEmitters(domain: string | undefined) {\n return domain ? [this.buildAndCacheEventEmitterForClient(domain)] : this.getUnboundEmitters();\n }\n\n private transferListeners(\n oldProvider: P,\n newProvider: P,\n domain: string | undefined,\n emitters: (GenericEventEmitter<AnyProviderEvent> | undefined)[],\n ) {\n this._clientEventHandlers\n .get(domain)\n ?.forEach((eventHandler) => oldProvider.events?.removeHandler(...eventHandler));\n\n // iterate over the event types\n const newClientHandlers = Object.values(AllProviderEvents).map<[AllProviderEvents, EventHandler]>((eventType) => {\n const handler = async (details?: EventDetails) => {\n // on each event type, fire the associated handlers\n emitters.forEach((emitter) => {\n emitter?.emit(eventType, { ...details, clientName: domain, domain, providerName: newProvider.metadata.name });\n });\n this._apiEmitter.emit(eventType, {\n ...details,\n clientName: domain,\n domain,\n providerName: newProvider.metadata.name,\n });\n };\n\n return [eventType, handler];\n });\n\n this._clientEventHandlers.set(domain, newClientHandlers);\n newClientHandlers.forEach((eventHandler) => newProvider.events?.addHandler(...eventHandler));\n }\n\n async close(): Promise<void> {\n try {\n await this?._defaultProvider.provider?.onClose?.();\n } catch (err) {\n this.handleShutdownError(this._defaultProvider.provider, err);\n }\n\n const wrappers = Array.from(this._domainScopedProviders);\n\n await Promise.all(\n wrappers.map(async ([, wrapper]) => {\n try {\n await wrapper?.provider.onClose?.();\n } catch (err) {\n this.handleShutdownError(wrapper?.provider, err);\n }\n }),\n );\n }\n\n protected async clearProvidersAndSetDefault(defaultProvider: P): Promise<void> {\n try {\n await this.close();\n } catch (err) {\n this._logger.error('Unable to cleanly close providers. Resetting to the default configuration.');\n } finally {\n this._domainScopedProviders.clear();\n this._defaultProvider = new ProviderWrapper<P, AnyProviderStatus>(\n defaultProvider,\n this._statusEnumType.NOT_READY,\n this._statusEnumType,\n );\n }\n }\n\n private get allProviders(): P[] {\n return [\n ...[...this._domainScopedProviders.values()].map((wrappers) => wrappers.provider),\n this._defaultProvider.provider,\n ];\n }\n\n private handleShutdownError(provider: P, err: unknown) {\n this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);\n this._logger.error((err as Error)?.stack);\n }\n}\n", "import type { JsonValue, ResolutionDetails } from '@openfeature/core';\nimport type { Provider } from './provider';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): ResolutionDetails<boolean> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): ResolutionDetails<string> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): ResolutionDetails<number> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): ResolutionDetails<T> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return {\n value: defaultValue,\n reason: REASON_NO_OP,\n };\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n", "import { GenericEventEmitter } from '@openfeature/core';\nimport { EventEmitter } from 'eventemitter3';\nimport type { ProviderEmittableEvents } from './events';\n\n/**\n * The OpenFeatureEventEmitter can be used by provider developers to emit\n * events at various parts of the provider lifecycle.\n *\n * NOTE: Ready and error events are automatically emitted by the SDK based on\n * the result of the initialize method.\n */\nexport class OpenFeatureEventEmitter extends GenericEventEmitter<ProviderEmittableEvents> {\n protected readonly eventEmitter = new EventEmitter();\n\n constructor() {\n super();\n }\n}\n", "import { ErrorCode, OpenFeatureError } from '@openfeature/core';\n\n/**\n * A custom error for the in-memory provider.\n * Indicates the resolved or default variant doesn't exist.\n */\nexport class VariantNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, VariantNotFoundError.prototype);\n this.name = 'VariantNotFoundError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import type {\n EvaluationContext,\n FlagValueType,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n FlagNotFoundError,\n GeneralError,\n OpenFeatureError,\n StandardResolutionReasons,\n TypeMismatchError,\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport { OpenFeatureEventEmitter, ProviderEvents } from '../../events';\nimport type { FlagConfiguration, Flag } from './flag-configuration';\nimport { VariantNotFoundError } from './variant-not-found-error';\n\n/**\n * A simple OpenFeature provider intended for demos and as a test stub.\n */\nexport class InMemoryProvider implements Provider {\n public readonly events = new OpenFeatureEventEmitter();\n public readonly runsOn = 'client';\n readonly metadata = {\n name: 'in-memory',\n } as const;\n private _flagConfiguration: FlagConfiguration;\n private _context: EvaluationContext | undefined;\n\n constructor(flagConfiguration: FlagConfiguration = {}) {\n this._flagConfiguration = { ...flagConfiguration };\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n */\n async putConfiguration(flagConfiguration: FlagConfiguration) {\n try {\n const flagsChanged = Object.entries({...flagConfiguration, ...this._flagConfiguration})\n .map(([key]) => key);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n } catch (err) {\n this.events.emit(ProviderEvents.Error);\n throw err;\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<boolean> {\n return this.resolveAndCheckFlag<boolean>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<number> {\n return this.resolveAndCheckFlag<number>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<string> {\n return this.resolveAndCheckFlag<string>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n return this.resolveAndCheckFlag<T>(flagKey, defaultValue, context || this._context, logger);\n }\n\n private resolveAndCheckFlag<T extends JsonValue | FlagValueType>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n if (!(flagKey in this._flagConfiguration)) {\n const message = `no flag found with key ${flagKey}`;\n logger?.debug(message);\n throw new FlagNotFoundError(message);\n }\n\n if (this._flagConfiguration[flagKey].disabled) {\n return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };\n }\n\n const resolvedFlag = this.resolveFlagWithReason(flagKey, context) as ResolutionDetails<T>;\n\n if (resolvedFlag.value === undefined) {\n const message = `no value associated with variant provided for ${flagKey} found`;\n logger?.error(message);\n throw new VariantNotFoundError(message);\n }\n\n if (typeof resolvedFlag.value != typeof defaultValue) {\n throw new TypeMismatchError();\n }\n\n return resolvedFlag;\n }\n\n private resolveFlagWithReason<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n try {\n const resolutionResult = this.lookupFlagValue<T>(flagKey, ctx);\n\n return resolutionResult;\n } catch (error: unknown) {\n if (!(error instanceof OpenFeatureError)) {\n throw new GeneralError((error as Error)?.message || 'unknown error');\n }\n throw error;\n }\n }\n\n private lookupFlagValue<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n const flagSpec: Flag = this._flagConfiguration[flagKey];\n\n const isContextEval = ctx && flagSpec?.contextEvaluator;\n const variant = isContextEval ? flagSpec.contextEvaluator?.(ctx) : flagSpec.defaultVariant;\n\n const value = variant && flagSpec?.variants[variant];\n\n const reason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;\n\n return {\n value: value as T,\n ...(variant && { variant }),\n reason,\n };\n }\n}\n", "import type {\n ClientMetadata,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n TrackingEventDetails,\n OpenFeatureError,\n FlagMetadata,\n ResolutionDetails,\n EventOptions,\n} from '@openfeature/core';\nimport {\n ErrorCode,\n ProviderFatalError,\n ProviderNotReadyError,\n SafeLogger,\n StandardResolutionReasons,\n instantiateErrorByErrorCode,\n statusMatchesEvent,\n MapHookData,\n} from '@openfeature/core';\nimport type { FlagEvaluationOptions } from '../../evaluation';\nimport type { ProviderEvents } from '../../events';\nimport type { InternalEventEmitter } from '../../events/internal/internal-event-emitter';\nimport type { Hook } from '../../hooks';\nimport type { Provider } from '../../provider';\nimport { ProviderStatus } from '../../provider';\nimport type { Client } from './../client';\n\ntype OpenFeatureClientOptions = {\n /**\n * @deprecated Use `domain` instead.\n */\n name?: string;\n domain?: string;\n version?: string;\n};\n\n/**\n * This implementation of the {@link Client} is meant to only be instantiated by the SDK.\n * It should not be used outside the SDK and so should not be exported.\n * @internal\n */\nexport class OpenFeatureClient implements Client {\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n private readonly providerAccessor: () => Provider,\n private readonly providerStatusAccessor: () => ProviderStatus,\n private readonly emitterAccessor: () => InternalEventEmitter,\n private readonly apiContextAccessor: (domain?: string) => EvaluationContext,\n private readonly apiHooksAccessor: () => Hook[],\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n // Use domain if name is not provided\n name: this.options.domain ?? this.options.name,\n domain: this.options.domain ?? this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n get providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler, options: EventOptions): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const shouldRunNow = statusMatchesEvent(eventType, this.providerStatus);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({\n clientName: this.metadata.name,\n domain: this.metadata.domain,\n providerName: this._provider.metadata.name,\n });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n\n if (options?.signal && typeof options.signal.addEventListener === 'function') {\n options.signal.addEventListener('abort', () => {\n this.removeHandler(eventType, handler);\n });\n }\n }\n\n removeHandler(notificationType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().removeHandler(notificationType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): this {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(flagKey, this._provider.resolveBooleanEvaluation, defaultValue, 'boolean', options);\n }\n\n getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'string',\n options,\n );\n }\n\n getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'number',\n options,\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n track(occurrenceKey: string, occurrenceDetails: TrackingEventDetails = {}): void {\n try {\n this.shortCircuitIfNotReady();\n\n if (typeof this._provider.track === 'function') {\n // copy and freeze the context\n const frozenContext = Object.freeze({\n ...this.apiContextAccessor(this?.options?.domain),\n });\n return this._provider.track?.(occurrenceKey, frozenContext, occurrenceDetails);\n } else {\n this._logger.debug('Provider does not support the track function; will no-op.');\n }\n } catch (err) {\n this._logger.debug('Error recording tracking event.', err);\n }\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\n options: FlagEvaluationOptions = {},\n ): EvaluationDetails<T> {\n // merge global, client, and evaluation context\n\n const allHooks = [\n ...this.apiHooksAccessor(),\n ...this.getHooks(),\n ...(options.hooks || []),\n ...(this._provider.hooks || []),\n ];\n const allHooksReversed = [...allHooks].reverse();\n\n const context = {\n ...this.apiContextAccessor(this?.options?.domain),\n };\n\n // Create hook context instances for each hook (stable object references for the entire evaluation)\n // This ensures hooks can use WeakMaps with hookContext as keys across lifecycle methods\n // NOTE: Uses the reversed order to reduce the number of times we have to calculate the index.\n const hookContexts = allHooksReversed.map<HookContext>(() =>\n Object.freeze({\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: this._provider.metadata,\n context,\n logger: this._logger,\n hookData: new MapHookData(),\n }),\n );\n\n let evaluationDetails: EvaluationDetails<T>;\n\n try {\n this.beforeHooks(allHooks, hookContexts, options);\n\n this.shortCircuitIfNotReady();\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);\n\n const resolutionDetails = {\n ...resolution,\n flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),\n flagKey,\n };\n\n if (resolutionDetails.errorCode) {\n const err = instantiateErrorByErrorCode(resolutionDetails.errorCode, resolutionDetails.errorMessage);\n this.errorHooks(allHooksReversed, hookContexts, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata);\n } else {\n this.afterHooks(allHooksReversed, hookContexts, resolutionDetails, options);\n evaluationDetails = resolutionDetails;\n }\n } catch (err: unknown) {\n this.errorHooks(allHooksReversed, hookContexts, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err);\n }\n this.finallyHooks(allHooksReversed, hookContexts, evaluationDetails, options);\n return evaluationDetails;\n }\n\n private beforeHooks(hooks: Hook[], hookContexts: HookContext[], options: FlagEvaluationOptions) {\n for (const [index, hook] of hooks.entries()) {\n const hookContextIndex = hooks.length - 1 - index; // reverse index for before hooks\n const hookContext = hookContexts[hookContextIndex];\n Object.freeze(hookContext);\n Object.freeze(hookContext.context);\n hook?.before?.(hookContext, Object.freeze(options.hookHints));\n }\n }\n\n private afterHooks(\n hooks: Hook[],\n hookContexts: HookContext[],\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"after\" hooks sequentially\n for (const [index, hook] of hooks.entries()) {\n const hookContext = hookContexts[index];\n hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private errorHooks(hooks: Hook[], hookContexts: HookContext[], err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const [index, hook] of hooks.entries()) {\n try {\n const hookContext = hookContexts[index];\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(\n hooks: Hook[],\n hookContexts: HookContext[],\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"finally\" hooks sequentially\n for (const [index, hook] of hooks.entries()) {\n try {\n const hookContext = hookContexts[index];\n hook?.finally?.(hookContext, evaluationDetails, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private get _provider(): Provider {\n return this.providerAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n\n private shortCircuitIfNotReady() {\n // short circuit evaluation entirely if provider is in a bad state\n if (this.providerStatus === ProviderStatus.NOT_READY) {\n throw new ProviderNotReadyError('provider has not yet initialized');\n } else if (this.providerStatus === ProviderStatus.FATAL) {\n throw new ProviderFatalError('provider is in an irrecoverable error state');\n }\n }\n\n private getErrorEvaluationDetails<T extends FlagValue>(\n flagKey: string,\n defaultValue: T,\n err: unknown,\n flagMetadata: FlagMetadata = {},\n ): EvaluationDetails<T> {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze(flagMetadata),\n flagKey,\n };\n }\n}\n", "import type {\n ClientProviderStatus,\n EvaluationContext,\n GenericEventEmitter,\n ManageContext} from '@openfeature/core';\nimport {\n OpenFeatureCommonAPI,\n ProviderWrapper,\n objectOrUndefined,\n stringOrUndefined,\n} from '@openfeature/core';\nimport type { Client } from './client';\nimport { OpenFeatureClient } from './client/internal/open-feature-client';\nimport { OpenFeatureEventEmitter, ProviderEvents } from './events';\nimport type { Hook } from './hooks';\nimport type { Provider} from './provider';\nimport { NOOP_PROVIDER, ProviderStatus } from './provider';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/web-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\ntype DomainRecord = {\n domain?: string;\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>;\n};\n\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI\n extends OpenFeatureCommonAPI<ClientProviderStatus, Provider, Hook>\n implements ManageContext<Promise<void>>\n{\n protected _statusEnumType: typeof ProviderStatus = ProviderStatus;\n protected _apiEmitter: GenericEventEmitter<ProviderEvents> = new OpenFeatureEventEmitter();\n protected _defaultProvider: ProviderWrapper<Provider, ClientProviderStatus> = new ProviderWrapper(\n NOOP_PROVIDER,\n ProviderStatus.NOT_READY,\n this._statusEnumType,\n );\n protected _domainScopedProviders: Map<string, ProviderWrapper<Provider, ClientProviderStatus>> = new Map();\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n private constructor() {\n super('client');\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n private getProviderStatus(domain?: string): ProviderStatus {\n if (!domain) {\n return this._defaultProvider.status;\n }\n\n return this._domainScopedProviders.get(domain)?.status ?? this._defaultProvider.status;\n }\n\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws {Error} If the provider throws an exception during initialization.\n */\n setProviderAndWait(provider: Provider): Promise<void>;\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws {Error} If the provider throws an exception during initialization.\n */\n setProviderAndWait(provider: Provider, context: EvaluationContext): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws {Error} If the provider throws an exception during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws {Error} If the provider throws an exception during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider, context: EvaluationContext): Promise<void>;\n async setProviderAndWait(\n clientOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Promise<void> {\n const domain = stringOrUndefined(clientOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(clientOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n await this.setAwaitableProvider(domain, provider);\n }\n\n /**\n * Sets the default provider for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider): this;\n /**\n * Sets the default provider and evaluation context for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider, context: EvaluationContext): this;\n /**\n * Sets the provider for flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider): this;\n /**\n * Sets the provider and evaluation context flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider, context: EvaluationContext): this;\n setProvider(\n domainOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): this {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(domainOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n const maybePromise = this.setAwaitableProvider(domain, provider);\n\n // The setProvider method doesn't return a promise so we need to catch and\n // log any errors that occur during provider initialization to avoid having\n // an unhandled promise rejection.\n Promise.resolve(maybePromise).catch((err) => {\n this._logger.error('Error during provider initialization:', err);\n });\n return this;\n }\n\n /**\n * Get the default provider.\n *\n * Note that it isn't recommended to interact with the provider directly, but rather through\n * an OpenFeature client.\n * @returns {Provider} Default Provider\n */\n getProvider(): Provider;\n /**\n * Get the provider bound to the specified domain.\n *\n * Note that it isn't recommended to interact with the provider directly, but rather through\n * an OpenFeature client.\n * @param {string} domain An identifier which logically binds clients with providers\n * @returns {Provider} Domain-scoped provider\n */\n getProvider(domain?: string): Provider;\n getProvider(domain?: string): Provider {\n return this.getProviderForClient(domain);\n }\n\n /**\n * Sets the evaluation context globally.\n * This will be used by all providers that have not bound to a domain.\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext({ region: \"us\" });\n */\n async setContext(context: EvaluationContext): Promise<void>;\n /**\n * Sets the evaluation context for a specific provider.\n * This will only affect providers bound to a domain.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext(\"test\", { scope: \"provider\" });\n * OpenFeature.setProvider(new MyProvider()) // Uses the default context\n * OpenFeature.setProvider(\"test\", new MyProvider()) // Uses context: { scope: \"provider\" }\n */\n async setContext(domain: string, context: EvaluationContext): Promise<void>;\n async setContext<T extends EvaluationContext>(domainOrContext: T | string, contextOrUndefined?: T): Promise<void> {\n const domain = stringOrUndefined(domainOrContext);\n const context = objectOrUndefined<T>(domainOrContext) ?? objectOrUndefined(contextOrUndefined) ?? {};\n\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.set(domain, context);\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, context);\n } else {\n this._domainScopedContext.set(domain, context);\n }\n } else {\n const oldContext = this._context;\n this._context = context;\n\n // collect all providers that are using the default context (not bound to a domain)\n const unboundProviders: DomainRecord[] = Array.from(this._domainScopedProviders.entries())\n .filter(([domain]) => !this._domainScopedContext.has(domain))\n .reduce<DomainRecord[]>((acc, [domain, wrapper]) => {\n acc.push({ domain, wrapper });\n return acc;\n }, []);\n\n const allDomainRecords: DomainRecord[] = [\n // add in the default (no domain)\n { domain: undefined, wrapper: this._defaultProvider },\n ...unboundProviders,\n ];\n await Promise.all(\n allDomainRecords.map((dm) => this.runProviderContextChangeHandler(dm.domain, dm.wrapper, oldContext, context)),\n );\n }\n }\n\n /**\n * Access the global evaluation context.\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(): EvaluationContext;\n /**\n * Access the evaluation context for a specific named client.\n * The global evaluation context is returned if a matching named client is not found.\n * @param {string} domain An identifier which logically binds clients with providers\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(domain?: string | undefined): EvaluationContext;\n getContext(domainOrUndefined?: string): EvaluationContext {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const context = this._domainScopedContext.get(domain);\n if (context) {\n return context;\n } else {\n this._logger.debug(`Unable to find context for '${domain}'.`);\n }\n }\n return this._context;\n }\n\n /**\n * Resets the global evaluation context to an empty object.\n */\n clearContext(): Promise<void>;\n /**\n * Removes the evaluation context for a specific named client.\n * @param {string} domain An identifier which logically binds clients with providers\n */\n clearContext(domain: string): Promise<void>;\n async clearContext(domainOrUndefined?: string): Promise<void> {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.delete(domain);\n const newContext = this.getContext();\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, newContext);\n } else {\n this._domainScopedContext.delete(domain);\n }\n } else {\n return this.setContext({});\n }\n }\n\n /**\n * Resets the global evaluation context and removes the evaluation context for\n * all domains.\n */\n async clearContexts(): Promise<void> {\n // Default context must be cleared first to avoid calling the onContextChange\n // handler multiple times for clients bound to a domain.\n await this.clearContext();\n\n // Use allSettled so a promise rejection doesn't affect others\n await Promise.allSettled(Array.from(this._domainScopedProviders.keys()).map((domain) => this.clearContext(domain)));\n }\n\n /**\n * A factory function for creating new domain-scoped OpenFeature clients. Clients\n * can contain their own state (e.g. logger, hook, context). Multiple domains\n * can be used to segment feature flag configuration.\n *\n * If there is already a provider bound to this name via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that name.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(domain?: string, version?: string): Client {\n return new OpenFeatureClient(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n () => this.getProviderForClient(domain),\n () => this.getProviderStatus(domain),\n () => this.buildAndCacheEventEmitterForClient(domain),\n (domain?: string) => this.getContext(domain),\n () => this.getHooks(),\n () => this._logger,\n { domain, version },\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n async clearProviders(): Promise<void> {\n await super.clearProvidersAndSetDefault(NOOP_PROVIDER);\n this._domainScopedContext.clear();\n }\n\n private async runProviderContextChangeHandler(\n domain: string | undefined,\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>,\n oldContext: EvaluationContext,\n newContext: EvaluationContext,\n ): Promise<void> {\n // this should always be set according to the typings, but let's be defensive considering JS\n const providerName = wrapper.provider?.metadata?.name || 'unnamed-provider';\n\n try {\n if (typeof wrapper.provider.onContextChange === 'function') {\n const maybePromise = wrapper.provider.onContextChange(oldContext, newContext);\n\n // only reconcile if the onContextChange method returns a promise\n if (typeof maybePromise?.then === 'function') {\n wrapper.incrementPendingContextChanges();\n wrapper.status = this._statusEnumType.RECONCILING;\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n\n await maybePromise;\n wrapper.decrementPendingContextChanges();\n }\n }\n // only run the event handlers, and update the state if the onContextChange method succeeded\n wrapper.status = this._statusEnumType.READY;\n if (wrapper.allContextChangesSettled) {\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n }\n } catch (err) {\n // run error handlers instead\n wrapper.decrementPendingContextChanges();\n wrapper.status = this._statusEnumType.ERROR;\n if (wrapper.allContextChangesSettled) {\n const error = err as Error | undefined;\n const message = `Error running ${providerName}'s context change handler: ${error?.message}`;\n this._logger?.error(`${message}`, err);\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n });\n this._apiEmitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n }\n }\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["require_eventemitter3", "__commonJSMin", "exports", "module", "has", "prefix", "Events", "EE", "fn", "context", "once", "addListener", "emitter", "event", "listener", "evt", "clearEvent", "EventEmitter", "names", "events", "name", "handlers", "i", "l", "ee", "listeners", "a1", "a2", "a3", "a4", "a5", "len", "args", "length", "j", "index_exports", "__export", "ClientProviderEvents", "ClientProviderStatus", "DefaultLogger", "ErrorCode", "FlagNotFoundError", "GeneralError", "GenericEventEmitter", "InMemoryProvider", "InvalidContextError", "LOG_LEVELS", "MapHookData", "NOOP_PROVIDER", "OpenFeature", "OpenFeatureAPI", "OpenFeatureCommonAPI", "OpenFeatureError", "OpenFeatureEventEmitter", "ParseError", "ProviderFatalError", "ProviderNotReadyError", "ProviderWrapper", "SafeLogger", "ServerProviderEvents", "ServerProviderStatus", "StandardResolutionReasons", "TargetingKeyMissingError", "TelemetryAttribute", "TelemetryFlagMetadata", "TypeMismatchError", "createEvaluationEvent", "instantiateErrorByErrorCode", "isObject", "isString", "objectOrUndefined", "statusMatchesEvent", "stringOrUndefined", "MapHookData", "key", "value", "StandardResolutionReasons", "ErrorCode", "OpenFeatureError", "_OpenFeatureError", "message", "options", "FlagNotFoundError", "_FlagNotFoundError", "OpenFeatureError", "message", "options", "GeneralError", "_GeneralError", "OpenFeatureError", "message", "options", "InvalidContextError", "_InvalidContextError", "OpenFeatureError", "message", "options", "ParseError", "_ParseError", "OpenFeatureError", "message", "options", "ProviderFatalError", "_ProviderFatalError", "OpenFeatureError", "message", "options", "ProviderNotReadyError", "_ProviderNotReadyError", "OpenFeatureError", "message", "options", "TargetingKeyMissingError", "_TargetingKeyMissingError", "OpenFeatureError", "message", "options", "TypeMismatchError", "_TypeMismatchError", "OpenFeatureError", "message", "options", "instantiateErrorByErrorCode", "errorCode", "message", "FlagNotFoundError", "ParseError", "TypeMismatchError", "TargetingKeyMissingError", "InvalidContextError", "ProviderNotReadyError", "ProviderFatalError", "GeneralError", "ServerProviderStatus", "ClientProviderStatus", "ServerProviderEvents", "ClientProviderEvents", "eventStatusMap", "statusMatchesEvent", "event", "status", "DefaultLogger", "args", "LOG_LEVELS", "SafeLogger", "logger", "DefaultLogger", "level", "err", "args", "error", "GenericEventEmitter", "globalLogger", "eventType", "context", "handler", "asyncHandler", "details", "__async", "_a", "err", "existingAsyncHandlers", "removedAsyncHandler", "logger", "SafeLogger", "_b", "TelemetryAttribute", "TelemetryFlagMetadata", "FLAG_EVALUATION_EVENT_NAME", "createEvaluationEvent", "hookContext", "evaluationDetails", "_a", "_b", "attributes", "TelemetryAttribute", "StandardResolutionReasons", "contextId", "TelemetryFlagMetadata", "setId", "version", "isString", "value", "stringOrUndefined", "isObject", "objectOrUndefined", "isDefined", "input", "ProviderWrapper", "_provider", "_status", "_statusEnumType", "_a", "_b", "_c", "details", "provider", "status", "OpenFeatureCommonAPI", "category", "DefaultLogger", "hooks", "logger", "SafeLogger", "domain", "eventType", "handler", "options", "keyProviderTuple", "statusMatchesEvent", "err", "domainOrProvider", "providerOrUndefined", "_d", "_e", "_f", "_g", "_h", "stringOrUndefined", "objectOrUndefined", "oldProvider", "providerName", "GeneralError", "emitters", "initializationPromise", "wrappedProvider", "emitter", "error", "newEmitter", "clientProvider", "ClientProviderEvents", "__async", "__spreadProps", "__spreadValues", "domainScopedProviders", "isDefined", "name", "newProvider", "eventHandler", "newClientHandlers", "wrappers", "_0", "wrapper", "defaultProvider", "REASON_NO_OP", "NoopFeatureProvider", "_", "defaultValue", "NOOP_PROVIDER", "import_index", "OpenFeatureEventEmitter", "GenericEventEmitter", "EventEmitter", "VariantNotFoundError", "_VariantNotFoundError", "OpenFeatureError", "message", "InMemoryProvider", "flagConfiguration", "OpenFeatureEventEmitter", "__spreadValues", "__async", "flagsChanged", "key", "err", "flagKey", "defaultValue", "context", "logger", "message", "FlagNotFoundError", "StandardResolutionReasons", "resolvedFlag", "VariantNotFoundError", "TypeMismatchError", "ctx", "error", "OpenFeatureError", "GeneralError", "_a", "flagSpec", "isContextEval", "variant", "value", "reason", "__spreadProps", "OpenFeatureClient", "providerAccessor", "providerStatusAccessor", "emitterAccessor", "apiContextAccessor", "apiHooksAccessor", "globalLogger", "options", "_a", "_b", "eventType", "handler", "statusMatchesEvent", "err", "notificationType", "logger", "SafeLogger", "hooks", "flagKey", "defaultValue", "occurrenceKey", "occurrenceDetails", "_c", "frozenContext", "__spreadValues", "resolver", "flagType", "allHooks", "allHooksReversed", "context", "hookContexts", "MapHookData", "evaluationDetails", "resolution", "resolutionDetails", "__spreadProps", "instantiateErrorByErrorCode", "index", "hook", "hookContextIndex", "hookContext", "ProviderNotReadyError", "ProviderFatalError", "flagMetadata", "errorMessage", "StandardResolutionReasons", "GLOBAL_OPENFEATURE_API_KEY", "_globalThis", "OpenFeatureAPI", "_OpenFeatureAPI", "OpenFeatureCommonAPI", "ClientProviderStatus", "OpenFeatureEventEmitter", "ProviderWrapper", "NOOP_PROVIDER", "globalApi", "instance", "domain", "_a", "_b", "clientOrProvider", "providerContextOrUndefined", "contextOrUndefined", "__async", "stringOrUndefined", "provider", "objectOrUndefined", "context", "domainOrProvider", "maybePromise", "err", "domainOrContext", "wrapper", "oldContext", "unboundProviders", "acc", "allDomainRecords", "dm", "domainOrUndefined", "newContext", "version", "OpenFeatureClient", "__superGet", "_c", "_d", "_e", "_f", "providerName", "emitter", "error", "message", "OpenFeature"]
|
|
3
|
+
"sources": ["../../../../node_modules/eventemitter3/index.js", "../../src/index.ts", "../../../shared/src/hooks/hook-data.ts", "../../../shared/src/evaluation/evaluation.ts", "../../../shared/src/errors/open-feature-error-abstract.ts", "../../../shared/src/errors/flag-not-found-error.ts", "../../../shared/src/errors/general-error.ts", "../../../shared/src/errors/invalid-context-error.ts", "../../../shared/src/errors/parse-error.ts", "../../../shared/src/errors/provider-fatal-error.ts", "../../../shared/src/errors/provider-not-ready-error.ts", "../../../shared/src/errors/targeting-key-missing-error.ts", "../../../shared/src/errors/type-mismatch-error.ts", "../../../shared/src/errors/index.ts", "../../../shared/src/provider/provider.ts", "../../../shared/src/events/events.ts", "../../../shared/src/events/event-utils.ts", "../../../shared/src/logger/default-logger.ts", "../../../shared/src/logger/safe-logger.ts", "../../../shared/src/events/generic-event-emitter.ts", "../../../shared/src/telemetry/attributes.ts", "../../../shared/src/telemetry/flag-metadata.ts", "../../../shared/src/telemetry/evaluation-event.ts", "../../../shared/src/type-guards.ts", "../../../shared/src/filter.ts", "../../../shared/src/open-feature.ts", "../../src/provider/no-op-provider.ts", "../../../../node_modules/eventemitter3/index.mjs", "../../src/events/open-feature-event-emitter.ts", "../../src/provider/in-memory-provider/variant-not-found-error.ts", "../../src/provider/in-memory-provider/in-memory-provider.ts", "../../src/provider/multi-provider/hook-executor.ts", "../../src/provider/multi-provider/errors.ts", "../../src/provider/multi-provider/strategies/base-evaluation-strategy.ts", "../../src/provider/multi-provider/strategies/first-match-strategy.ts", "../../src/provider/multi-provider/strategies/first-successful-strategy.ts", "../../src/provider/multi-provider/strategies/comparison-strategy.ts", "../../src/provider/multi-provider/status-tracker.ts", "../../src/provider/multi-provider/multi-provider-web.ts", "../../src/client/internal/open-feature-client.ts", "../../src/open-feature.ts"],
|
|
4
|
+
"sourcesContent": ["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n", "export * from './client';\nexport * from './provider';\nexport * from './evaluation';\nexport * from './open-feature';\nexport * from './events';\nexport * from './hooks';\nexport * from './tracking';\nexport * from '@openfeature/core';\n", "/**\n * A mutable data structure for hooks to maintain state across their lifecycle.\n * Each hook instance gets its own isolated data store that persists for the\n * duration of a single flag evaluation.\n * @template TData - A record type that defines the shape of the stored data\n */\nexport interface HookData<TData = Record<string, unknown>> {\n /**\n * Sets a value in the hook data store.\n * @param key The key to store the value under\n * @param value The value to store\n */\n set<K extends keyof TData>(key: K, value: TData[K]): void;\n set(key: string, value: unknown): void;\n\n /**\n * Gets a value from the hook data store.\n * @param key The key to retrieve the value for\n * @returns The stored value, or undefined if not found\n */\n get<K extends keyof TData>(key: K): TData[K] | undefined;\n get(key: string): unknown;\n\n /**\n * Checks if a key exists in the hook data store.\n * @param key The key to check\n * @returns True if the key exists, false otherwise\n */\n has<K extends keyof TData>(key: K): boolean;\n has(key: string): boolean;\n\n /**\n * Deletes a value from the hook data store.\n * @param key The key to delete\n * @returns True if the key was deleted, false if it didn't exist\n */\n delete<K extends keyof TData>(key: K): boolean;\n delete(key: string): boolean;\n\n /**\n * Clears all values from the hook data store.\n */\n clear(): void;\n}\n\n/**\n * Default implementation of HookData using a Map.\n * @template TData - A record type that defines the shape of the stored data\n */\nexport class MapHookData<TData = Record<string, unknown>> implements HookData<TData> {\n private readonly data = new Map<keyof TData, TData[keyof TData]>();\n\n set<K extends keyof TData>(key: K, value: TData[K]): void {\n this.data.set(key, value);\n }\n\n get<K extends keyof TData>(key: K): TData[K] | undefined {\n return this.data.get(key) as TData[K] | undefined;\n }\n\n has<K extends keyof TData>(key: K): boolean {\n return this.data.has(key);\n }\n\n delete<K extends keyof TData>(key: K): boolean {\n return this.data.delete(key);\n }\n\n clear(): void {\n this.data.clear();\n }\n}", "import type { JsonValue } from '../types/structure';\n\nexport type FlagValueType = 'boolean' | 'string' | 'number' | 'object';\n\n/**\n * Represents a JSON node value.\n */\nexport type FlagValue = boolean | string | number | JsonValue;\n\nexport type ResolutionReason = keyof typeof StandardResolutionReasons | (string & Record<never, never>);\n\n/**\n * A structure which supports definition of arbitrary properties, with keys of type string, and values of type boolean, string, or number.\n *\n * This structure is populated by a provider for use by an Application Author (via the Evaluation API) or an Application Integrator (via hooks).\n */\nexport type FlagMetadata = Record<string, string | number | boolean>;\n\nexport type ResolutionDetails<U> = {\n value: U;\n variant?: string;\n flagMetadata?: FlagMetadata;\n reason?: ResolutionReason;\n errorCode?: ErrorCode;\n errorMessage?: string;\n};\n\nexport type EvaluationDetails<T extends FlagValue> = {\n flagKey: string;\n flagMetadata: Readonly<FlagMetadata>;\n} & ResolutionDetails<T>;\n\nexport const StandardResolutionReasons = {\n /**\n * The resolved value is static (no dynamic evaluation).\n */\n STATIC: 'STATIC',\n\n /**\n * The resolved value was configured statically, or otherwise fell back to a pre-configured value.\n */\n DEFAULT: 'DEFAULT',\n\n /**\n * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.\n */\n TARGETING_MATCH: 'TARGETING_MATCH',\n\n /**\n * The resolved value was the result of pseudorandom assignment.\n */\n SPLIT: 'SPLIT',\n\n /**\n * The resolved value was retrieved from cache.\n */\n CACHED: 'CACHED',\n\n /**\n * The resolved value was the result of the flag being disabled in the management system.\n */\n DISABLED: 'DISABLED',\n\n /**\n * The reason for the resolved value could not be determined.\n */\n UNKNOWN: 'UNKNOWN',\n\n /**\n * The resolved value is non-authoritative or possibly out of date.\n */\n STALE: 'STALE',\n\n /**\n * The resolved value was the result of an error.\n *\n * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.\n */\n ERROR: 'ERROR',\n} as const;\n\nexport enum ErrorCode {\n /**\n * The value was resolved before the provider was ready.\n */\n PROVIDER_NOT_READY = 'PROVIDER_NOT_READY',\n\n /**\n * The provider has entered an irrecoverable error state.\n */\n PROVIDER_FATAL = 'PROVIDER_FATAL',\n\n /**\n * The flag could not be found.\n */\n FLAG_NOT_FOUND = 'FLAG_NOT_FOUND',\n\n /**\n * An error was encountered parsing data, such as a flag configuration.\n */\n PARSE_ERROR = 'PARSE_ERROR',\n\n /**\n * The type of the flag value does not match the expected type.\n */\n TYPE_MISMATCH = 'TYPE_MISMATCH',\n\n /**\n * The provider requires a targeting key and one was not provided in the evaluation context.\n */\n TARGETING_KEY_MISSING = 'TARGETING_KEY_MISSING',\n\n /**\n * The evaluation context does not meet provider requirements.\n */\n INVALID_CONTEXT = 'INVALID_CONTEXT',\n\n /**\n * An error with an unspecified code.\n */\n GENERAL = 'GENERAL',\n}\n", "import type { ErrorCode } from '../evaluation';\n\n/**\n * Error Options were added in ES2022. Manually adding the type so that an\n * earlier target can be used.\n */\nexport type ErrorOptions = {\n cause?: unknown\n};\n\nexport abstract class OpenFeatureError extends Error {\n abstract code: ErrorCode;\n cause?: unknown;\n constructor(message?: string, options?: ErrorOptions) {\n super(message);\n Object.setPrototypeOf(this, OpenFeatureError.prototype);\n this.name = 'OpenFeatureError';\n this.cause = options?.cause;\n }\n}\n\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class FlagNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, FlagNotFoundError.prototype);\n this.name = 'FlagNotFoundError';\n this.code = ErrorCode.FLAG_NOT_FOUND;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class GeneralError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, GeneralError.prototype);\n this.name = 'GeneralError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class InvalidContextError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, InvalidContextError.prototype);\n this.name = 'InvalidContextError';\n this.code = ErrorCode.INVALID_CONTEXT;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class ParseError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, ParseError.prototype);\n this.name = 'ParseError';\n this.code = ErrorCode.PARSE_ERROR;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class ProviderFatalError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, ProviderFatalError.prototype);\n this.name = 'ProviderFatalError';\n this.code = ErrorCode.PROVIDER_FATAL;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class ProviderNotReadyError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, ProviderNotReadyError.prototype);\n this.name = 'ProviderNotReadyError';\n this.code = ErrorCode.PROVIDER_NOT_READY;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class TargetingKeyMissingError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);\n this.name = 'TargetingKeyMissingError';\n this.code = ErrorCode.TARGETING_KEY_MISSING;\n }\n}\n", "import type { ErrorOptions} from './open-feature-error-abstract';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ErrorCode } from '../evaluation';\n\nexport class TypeMismatchError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, TypeMismatchError.prototype);\n this.name = 'TypeMismatchError';\n this.code = ErrorCode.TYPE_MISMATCH;\n }\n}\n", "import { ErrorCode } from '../evaluation';\n\nimport { FlagNotFoundError } from './flag-not-found-error';\nimport { GeneralError } from './general-error';\nimport { InvalidContextError } from './invalid-context-error';\nimport { OpenFeatureError } from './open-feature-error-abstract';\nimport { ParseError } from './parse-error';\nimport { ProviderFatalError } from './provider-fatal-error';\nimport { ProviderNotReadyError } from './provider-not-ready-error';\nimport { TargetingKeyMissingError } from './targeting-key-missing-error';\nimport { TypeMismatchError } from './type-mismatch-error';\n\nconst instantiateErrorByErrorCode = (errorCode: ErrorCode, message?: string): OpenFeatureError => {\n switch (errorCode) {\n case ErrorCode.FLAG_NOT_FOUND:\n return new FlagNotFoundError(message);\n case ErrorCode.PARSE_ERROR:\n return new ParseError(message);\n case ErrorCode.TYPE_MISMATCH:\n return new TypeMismatchError(message);\n case ErrorCode.TARGETING_KEY_MISSING:\n return new TargetingKeyMissingError(message);\n case ErrorCode.INVALID_CONTEXT:\n return new InvalidContextError(message);\n case ErrorCode.PROVIDER_NOT_READY:\n return new ProviderNotReadyError(message);\n case ErrorCode.PROVIDER_FATAL:\n return new ProviderFatalError(message);\n default:\n return new GeneralError(message);\n }\n};\n\nexport {\n FlagNotFoundError,\n GeneralError,\n InvalidContextError,\n ParseError,\n ProviderFatalError,\n ProviderNotReadyError,\n TargetingKeyMissingError,\n TypeMismatchError,\n OpenFeatureError,\n instantiateErrorByErrorCode,\n};\n", "import type { EvaluationContext } from '../evaluation';\nimport type { AnyProviderEvent, ProviderEventEmitter } from '../events';\nimport type { TrackingEventDetails } from '../tracking';\nimport type { Metadata, Paradigm } from '../types';\n\n// TODO: with TypeScript 5+, we can use computed string properties,\n// so we can extract all of these into a shared set of string consts and use that in both enums\n// for now we have duplicated them.\n\n/**\n * The state of the provider.\n * Note that the provider's state is handled by the SDK.\n */\nexport enum ServerProviderStatus {\n /**\n * The provider has not been initialized and cannot yet evaluate flags.\n */\n NOT_READY = 'NOT_READY',\n\n /**\n * The provider is ready to resolve flags.\n */\n READY = 'READY',\n\n /**\n * The provider is in an error state and unable to evaluate flags.\n */\n ERROR = 'ERROR',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n STALE = 'STALE',\n\n /**\n * The provider has entered an irrecoverable error state.\n */\n FATAL = 'FATAL',\n}\n\n/**\n * The state of the provider.\n * Note that the provider's state is handled by the SDK.\n */\nexport enum ClientProviderStatus {\n /**\n * The provider has not been initialized and cannot yet evaluate flags.\n */\n NOT_READY = 'NOT_READY',\n\n /**\n * The provider is ready to resolve flags.\n */\n READY = 'READY',\n\n /**\n * The provider is in an error state and unable to evaluate flags.\n */\n ERROR = 'ERROR',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n STALE = 'STALE',\n\n /**\n * The provider has entered an irrecoverable error state.\n */\n FATAL = 'FATAL',\n\n /**\n * The provider is reconciling its state with a context change.\n */\n RECONCILING = 'RECONCILING',\n}\n\n/**\n * A type representing any possible ProviderStatus (server or client side).\n * In most cases, you probably want to import `ProviderStatus` from the respective SDK.\n */\nexport { ClientProviderStatus as AllProviderStatus };\n\n/**\n * Static data about the provider.\n */\nexport interface ProviderMetadata extends Readonly<Metadata> {\n readonly name: string;\n}\n\nexport interface CommonProvider<S extends ClientProviderStatus | ServerProviderStatus> {\n readonly metadata: ProviderMetadata;\n\n /**\n * Represents where the provider is intended to be run. If defined,\n * the SDK will enforce that the defined paradigm at runtime.\n */\n readonly runsOn?: Paradigm;\n\n // TODO: in the future we could make this a never to force provider to remove it.\n /**\n * @deprecated the SDK now maintains the provider's state; there's no need for providers to implement this field.\n * Returns a representation of the current readiness of the provider.\n *\n * _Providers which do not implement this method are assumed to be ready immediately._\n */\n readonly status?: S;\n\n /**\n * An event emitter for ProviderEvents.\n * @see ProviderEvents\n */\n events?: ProviderEventEmitter<AnyProviderEvent>;\n\n /**\n * A function used to shut down the provider.\n * Called when this provider is replaced with a new one, or when the OpenFeature is shut down.\n */\n onClose?(): Promise<void>;\n\n /**\n * A function used to setup the provider.\n * Called by the SDK after the provider is set if the provider's status is NOT_READY.\n * When the returned promise resolves, the SDK fires the ProviderEvents.Ready event.\n * If the returned promise rejects, the SDK fires the ProviderEvents.Error event.\n * Use this function to perform any context-dependent setup within the provider.\n * @param context\n */\n initialize?(context?: EvaluationContext): Promise<void>;\n\n /**\n * Track a user action or application state, usually representing a business objective or outcome.\n * @param trackingEventName\n * @param context\n * @param trackingEventDetails\n */\n track?(trackingEventName: string, context: EvaluationContext, trackingEventDetails: TrackingEventDetails): void;\n}\n", "// TODO: with TypeScript 5+, we can use computed string properties,\n// so we can extract all of these into a shared set of string consts and use that in both enums\n// for now we have duplicated them.\n\n/**\n * An enumeration of possible events for server-sdk providers.\n */\nexport enum ServerProviderEvents {\n /**\n * The provider is ready to evaluate flags.\n */\n Ready = 'PROVIDER_READY',\n\n /**\n * The provider is in an error state.\n */\n Error = 'PROVIDER_ERROR',\n\n /**\n * The flag configuration in the source-of-truth has changed.\n */\n ConfigurationChanged = 'PROVIDER_CONFIGURATION_CHANGED',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n Stale = 'PROVIDER_STALE',\n}\n\n/**\n * An enumeration of possible events for web-sdk providers.\n */\nexport enum ClientProviderEvents {\n /**\n * The provider is ready to evaluate flags.\n */\n Ready = 'PROVIDER_READY',\n\n /**\n * The provider is in an error state.\n */\n Error = 'PROVIDER_ERROR',\n\n /**\n * The flag configuration in the source-of-truth has changed.\n */\n ConfigurationChanged = 'PROVIDER_CONFIGURATION_CHANGED',\n\n /**\n * The context associated with the provider has changed, and the provider has reconciled it's associated state.\n */\n ContextChanged = 'PROVIDER_CONTEXT_CHANGED',\n\n /**\n * The context associated with the provider has changed, and the provider has not yet reconciled its associated state.\n */\n Reconciling = 'PROVIDER_RECONCILING',\n\n /**\n * The provider's cached state is no longer valid and may not be up-to-date with the source of truth.\n */\n Stale = 'PROVIDER_STALE',\n}\n\n\n/* alias because in many cases, we iterate over all possible events in code,\nso we have to do this on ClientProviderEvents to be exhaustive */\nexport { ClientProviderEvents as AllProviderEvents };\n\n/**\n * A type representing any possible ProviderEvent (server or client side).\n * In most cases, you probably want to import `ProviderEvents` from the respective SDK.\n */\nexport type AnyProviderEvent = ServerProviderEvents | ClientProviderEvents;\n", "import type { ClientProviderStatus, ServerProviderStatus } from '../provider';\nimport { AllProviderStatus } from '../provider';\nimport type { AnyProviderEvent } from './events';\nimport { AllProviderEvents } from './events';\n\nconst eventStatusMap = {\n [AllProviderStatus.READY]: AllProviderEvents.Ready,\n [AllProviderStatus.ERROR]: AllProviderEvents.Error,\n [AllProviderStatus.FATAL]: AllProviderEvents.Error,\n [AllProviderStatus.STALE]: AllProviderEvents.Stale,\n [AllProviderStatus.RECONCILING]: AllProviderEvents.Reconciling,\n [AllProviderStatus.NOT_READY]: undefined,\n};\n\n/**\n * Returns true if the provider's status corresponds to the event.\n * If the provider's status is not defined, it matches READY.\n * @param {AnyProviderEvent} event event to match\n * @param {ClientProviderStatus | ServerProviderStatus} status status of provider\n * @returns {boolean} boolean indicating if the provider status corresponds to the event.\n */\nexport const statusMatchesEvent = <T extends AnyProviderEvent>(event: T, status?: ClientProviderStatus | ServerProviderStatus): boolean => {\n return (!status && event === AllProviderEvents.Ready) || eventStatusMap[status!] === event;\n};", "/* eslint-disable @typescript-eslint/no-empty-function */\n\nimport type { Logger } from './logger';\n\nexport class DefaultLogger implements Logger {\n error(...args: unknown[]): void {\n console.error(...args);\n }\n\n warn(...args: unknown[]): void {\n console.warn(...args);\n }\n\n info(): void {}\n\n debug(): void {}\n}\n", "import type { Logger } from './logger';\nimport { DefaultLogger } from './default-logger';\n\nexport const LOG_LEVELS: Array<keyof Logger> = ['error', 'warn', 'info', 'debug'];\n\nexport class SafeLogger implements Logger {\n private readonly logger: Logger;\n private readonly fallbackLogger = new DefaultLogger();\n\n constructor(logger: Logger) {\n try {\n for (const level of LOG_LEVELS) {\n if (!logger[level] || typeof logger[level] !== 'function') {\n throw new Error(`The provided logger is missing the ${level} method.`);\n }\n }\n this.logger = logger;\n } catch (err) {\n console.error(err);\n console.error('Falling back to the default logger.');\n this.logger = this.fallbackLogger;\n }\n }\n\n error(...args: unknown[]): void {\n this.log('error', ...args);\n }\n\n warn(...args: unknown[]): void {\n this.log('warn', ...args);\n }\n\n info(...args: unknown[]): void {\n this.log('info', ...args);\n }\n\n debug(...args: unknown[]): void {\n this.log('debug', ...args);\n }\n\n private log(level: keyof Logger, ...args: unknown[]) {\n try {\n this.logger[level](...args);\n } catch (error) {\n this.fallbackLogger[level](...args);\n }\n }\n}\n", "import type { Logger, ManageLogger} from '../logger';\nimport { SafeLogger } from '../logger';\nimport type { ProviderEventEmitter } from './provider-event-emitter';\nimport type { EventContext, EventDetails, EventHandler } from './eventing';\nimport type { AnyProviderEvent } from './events';\nimport { AllProviderEvents } from './events';\n\n/**\n * The GenericEventEmitter should only be used within the SDK. It supports additional properties that can be included\n * in the event details.\n */\nexport abstract class GenericEventEmitter<\n E extends AnyProviderEvent,\n AdditionalContext extends Record<string, unknown> = Record<string, unknown>,\n >\n implements ProviderEventEmitter<E>, ManageLogger<GenericEventEmitter<E, AdditionalContext>>\n{\n protected abstract readonly eventEmitter: PlatformEventEmitter;\n\n private readonly _handlers: { [key in AnyProviderEvent]: WeakMap<EventHandler, EventHandler[]> } = {\n [AllProviderEvents.ConfigurationChanged]: new WeakMap<EventHandler, EventHandler[]>(),\n [AllProviderEvents.ContextChanged]: new WeakMap<EventHandler, EventHandler[]>(),\n [AllProviderEvents.Ready]: new WeakMap<EventHandler, EventHandler[]>(),\n [AllProviderEvents.Error]: new WeakMap<EventHandler, EventHandler[]>(),\n [AllProviderEvents.Stale]: new WeakMap<EventHandler, EventHandler[]>(),\n [AllProviderEvents.Reconciling]: new WeakMap<EventHandler, EventHandler[]>(),\n };\n private _eventLogger?: Logger;\n\n constructor(private readonly globalLogger?: () => Logger) {}\n\n // here we use E, to restrict the events a provider can manually emit (PROVIDER_CONTEXT_CHANGED is emitted by the SDK)\n emit(eventType: E, context?: EventContext): void {\n this.eventEmitter.emit(eventType, context);\n }\n\n addHandler(eventType: AnyProviderEvent, handler: EventHandler): void {\n // The handlers have to be wrapped with an async function because if a synchronous functions throws an error,\n // the other handlers will not run.\n const asyncHandler = async (details?: EventDetails) => {\n try {\n await handler(details);\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n };\n // The async handler has to be written to the map, because we need to get the wrapper function when deleting a listener\n const existingAsyncHandlers = this._handlers[eventType].get(handler);\n\n // we allow duplicate event handlers, similar to node,\n // see: https://nodejs.org/api/events.html#emitteroneventname-listener\n // and https://nodejs.org/api/events.html#emitterremovelistenereventname-listener\n this._handlers[eventType].set(handler, [...(existingAsyncHandlers || []), asyncHandler]);\n this.eventEmitter.on(eventType, asyncHandler);\n }\n\n removeHandler(eventType: AnyProviderEvent, handler: EventHandler): void {\n // Get the wrapper function for this handler, to delete it from the event emitter\n const existingAsyncHandlers = this._handlers[eventType].get(handler);\n\n if (existingAsyncHandlers) {\n const removedAsyncHandler = existingAsyncHandlers.pop();\n if (removedAsyncHandler) {\n this.eventEmitter.removeListener(eventType, removedAsyncHandler);\n }\n }\n }\n\n removeAllHandlers(eventType?: AnyProviderEvent): void {\n // If giving undefined, the listeners are not removed, so we have to check explicitly\n if (eventType) {\n this.eventEmitter.removeAllListeners(eventType);\n } else {\n this.eventEmitter.removeAllListeners();\n }\n }\n\n getHandlers(eventType: AnyProviderEvent): EventHandler[] {\n return this.eventEmitter.listeners(eventType) as EventHandler[];\n }\n\n setLogger(logger: Logger): this {\n this._eventLogger = new SafeLogger(logger);\n return this;\n }\n\n protected get _logger() {\n return this._eventLogger ?? this.globalLogger?.();\n }\n}\n\n/**\n * This is an un-exported type that corresponds to NodeJS.EventEmitter.\n * We can't use that type here, because this module is used in both the browser, and the server.\n * In the server, node (or whatever server runtime) provides an implementation for this.\n * In the browser, we bundle in the popular 'EventEmitter3' package, which is a polyfill of NodeJS.EventEmitter.\n */\n/* eslint-disable */\ninterface PlatformEventEmitter {\n addListener(eventName: string | symbol, listener: (...args: any[]) => void): this;\n on(eventName: string | symbol, listener: (...args: any[]) => void): this;\n once(eventName: string | symbol, listener: (...args: any[]) => void): this;\n removeListener(eventName: string | symbol, listener: (...args: any[]) => void): this;\n off(eventName: string | symbol, listener: (...args: any[]) => void): this;\n removeAllListeners(event?: string | symbol): this;\n listeners(eventName: string | symbol): Function[];\n emit(eventName: string | symbol, ...args: any[]): boolean;\n listenerCount(eventName: string | symbol, listener?: Function): number;\n eventNames(): Array<string | symbol>;\n}\n", "/**\n * The attributes of an OpenTelemetry compliant event for flag evaluation.\n * @see https://opentelemetry.io/docs/specs/semconv/feature-flags/feature-flags-logs/\n */\nexport const TelemetryAttribute = {\n /**\n * The lookup key of the feature flag.\n *\n * - type: `string`\n * - requirement level: `required`\n * - example: `logo-color`\n */\n KEY: 'feature_flag.key',\n /**\n * Describes a class of error the operation ended with.\n *\n * - type: `string`\n * - requirement level: `conditionally required`\n * - condition: `reason` is `error`\n * - example: `flag_not_found`\n */\n ERROR_CODE: 'error.type',\n /**\n * A message explaining the nature of an error occurring during flag evaluation.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `Flag not found`\n */\n ERROR_MESSAGE: 'error.message',\n /**\n * A semantic identifier for an evaluated flag value.\n *\n * - type: `string`\n * - requirement level: `conditionally required`\n * - condition: variant is defined on the evaluation details\n * - example: `blue`; `on`; `true`\n */\n VARIANT: 'feature_flag.result.variant',\n /**\n * The evaluated value of the feature flag.\n *\n * - type: `undefined`\n * - requirement level: `conditionally required`\n * - example: `#ff0000`; `1`; `true`\n */\n VALUE: 'feature_flag.result.value',\n /**\n * The unique identifier for the flag evaluation context. For example, the targeting key.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `5157782b-2203-4c80-a857-dbbd5e7761db`\n */\n CONTEXT_ID: 'feature_flag.context.id',\n /**\n * The reason code which shows how a feature flag value was determined.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `targeting_match`\n */\n REASON: 'feature_flag.result.reason',\n /**\n * Describes a class of error the operation ended with.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `flag_not_found`\n */\n PROVIDER: 'feature_flag.provider.name',\n /**\n * The identifier of the flag set to which the feature flag belongs.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `proj-1`; `ab98sgs`; `service1/dev`\n */\n FLAG_SET_ID: 'feature_flag.set.id',\n /**\n * The version of the ruleset used during the evaluation. This may be any stable value which uniquely identifies the ruleset.\n *\n * - type: `string`\n * - requirement level: `recommended`\n * - example: `1.0.0`; `2021-01-01`\n */\n VERSION: 'feature_flag.version',\n} as const;\n", "/**\n * Well-known flag metadata attributes for telemetry events.\n * @see https://openfeature.dev/specification/appendix-d#flag-metadata\n */\nexport const TelemetryFlagMetadata = {\n /**\n * The context identifier returned in the flag metadata uniquely identifies\n * the subject of the flag evaluation. If not available, the targeting key\n * should be used.\n */\n CONTEXT_ID: 'contextId',\n /**\n * \tA logical identifier for the flag set.\n */\n FLAG_SET_ID: 'flagSetId',\n /**\n * \tA version string (format unspecified) for the flag or flag set.\n */\n VERSION: 'version',\n} as const;\n", "import { ErrorCode, StandardResolutionReasons, type EvaluationDetails, type FlagValue } from '../evaluation';\nimport type { HookContext } from '../hooks';\nimport { TelemetryAttribute } from './attributes';\nimport { TelemetryFlagMetadata } from './flag-metadata';\n\n/**\n * Attribute types for OpenTelemetry.\n * @see https://github.com/open-telemetry/opentelemetry-js/blob/fbbce6e1c0de86e4c504b5788d876fae4d3bc254/api/src/common/Attributes.ts#L35\n */\nexport declare type AttributeValue =\n | string\n | number\n | boolean\n | string[]\n | number[]\n | boolean[];\n\ntype EvaluationEvent = {\n /**\n * The name of the feature flag evaluation event.\n */\n name: string;\n /**\n * The attributes of an OpenTelemetry compliant event for flag evaluation.\n * @experimental The attributes are subject to change.\n * @see https://opentelemetry.io/docs/specs/semconv/feature-flags/feature-flags-logs/\n */\n attributes: Record<string, AttributeValue | undefined>;\n};\n\nconst FLAG_EVALUATION_EVENT_NAME = 'feature_flag.evaluation';\n\n/**\n * Returns an OpenTelemetry compliant event for flag evaluation.\n * @param {HookContext} hookContext Contextual information about the flag evaluation\n * @param {EvaluationDetails} evaluationDetails The details of the flag evaluation\n * @returns {EvaluationEvent} An evaluation event object containing the event name and attributes\n */\nexport function createEvaluationEvent(\n hookContext: Readonly<HookContext<FlagValue>>,\n evaluationDetails: EvaluationDetails<FlagValue>,\n): EvaluationEvent {\n const attributes: EvaluationEvent['attributes'] = {\n [TelemetryAttribute.KEY]: hookContext.flagKey,\n [TelemetryAttribute.PROVIDER]: hookContext.providerMetadata.name,\n [TelemetryAttribute.REASON]: (evaluationDetails.reason ?? StandardResolutionReasons.UNKNOWN).toLowerCase(),\n };\n\n if (evaluationDetails.variant) {\n attributes[TelemetryAttribute.VARIANT] = evaluationDetails.variant;\n }\n\n if (evaluationDetails.value !== null) {\n if (typeof evaluationDetails.value !== 'object') {\n attributes[TelemetryAttribute.VALUE] = evaluationDetails.value;\n } else {\n try {\n // Objects are not valid attribute values, so we convert them to a JSON string\n attributes[TelemetryAttribute.VALUE] = JSON.stringify(evaluationDetails.value);\n } catch {\n // We ignore non serializable values\n }\n }\n }\n\n const contextId =\n evaluationDetails.flagMetadata[TelemetryFlagMetadata.CONTEXT_ID] ?? hookContext.context.targetingKey;\n if (contextId) {\n attributes[TelemetryAttribute.CONTEXT_ID] = contextId;\n }\n\n const setId = evaluationDetails.flagMetadata[TelemetryFlagMetadata.FLAG_SET_ID];\n if (setId) {\n attributes[TelemetryAttribute.FLAG_SET_ID] = setId;\n }\n\n const version = evaluationDetails.flagMetadata[TelemetryFlagMetadata.VERSION];\n if (version) {\n attributes[TelemetryAttribute.VERSION] = version;\n }\n\n if (evaluationDetails.reason === StandardResolutionReasons.ERROR) {\n attributes[TelemetryAttribute.ERROR_CODE] = (evaluationDetails.errorCode ?? ErrorCode.GENERAL).toLowerCase();\n if (evaluationDetails.errorMessage) {\n attributes[TelemetryAttribute.ERROR_MESSAGE] = evaluationDetails.errorMessage;\n }\n }\n\n return {\n name: FLAG_EVALUATION_EVENT_NAME,\n attributes,\n };\n}\n", "/**\n * Checks whether the parameter is a string.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is a string\n */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/**\n * Returns the parameter if it is a string, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {string|undefined} The parameter if it is a string, otherwise undefined\n */\nexport function stringOrUndefined(value: unknown): string | undefined {\n return isString(value) ? value : undefined;\n}\n\n/**\n * Checks whether the parameter is an object.\n * @param {unknown} value The value to check\n * @returns {value is string} True if the value is an object\n */\nexport function isObject<T extends object>(value: unknown): value is T {\n return typeof value === 'object';\n}\n\n/**\n * Returns the parameter if it is an object, otherwise returns undefined.\n * @param {unknown} value The value to check\n * @returns {object|undefined} The parameter if it is an object, otherwise undefined\n */\nexport function objectOrUndefined<T extends object>(value: unknown): T | undefined {\n return isObject<T>(value) ? value : undefined;\n}\n", "/**\n * Checks if a value is not null or undefined and returns it as type assertion\n * @template T\n * @param {T} input The value to check\n * @returns {T} If the value is not null or undefined\n */\nexport function isDefined<T>(input?: T | null | undefined): input is T {\n return typeof input !== 'undefined' && input !== null;\n}\n", "import type { OpenFeatureError } from './errors';\nimport { GeneralError } from './errors';\nimport type { EvaluationContext } from './evaluation';\nimport { ErrorCode } from './evaluation';\nimport type {\n AnyProviderEvent,\n EventDetails,\n EventHandler,\n Eventing,\n EventOptions,\n GenericEventEmitter,\n} from './events';\nimport { AllProviderEvents, statusMatchesEvent } from './events';\nimport { isDefined } from './filter';\nimport type { BaseHook, EvaluationLifeCycle } from './hooks';\nimport type { Logger, ManageLogger } from './logger';\nimport { DefaultLogger, SafeLogger } from './logger';\nimport type { ClientProviderStatus, CommonProvider, ProviderMetadata, ServerProviderStatus } from './provider';\nimport { objectOrUndefined, stringOrUndefined } from './type-guards';\nimport type { Paradigm } from './types';\n\ntype AnyProviderStatus = ClientProviderStatus | ServerProviderStatus;\n\n/**\n * A provider and its current status.\n * For internal use only.\n */\nexport class ProviderWrapper<P extends CommonProvider<AnyProviderStatus>, S extends AnyProviderStatus> {\n private _pendingContextChanges = 0;\n\n constructor(\n private _provider: P,\n private _status: S,\n _statusEnumType: typeof ClientProviderStatus | typeof ServerProviderStatus,\n ) {\n // update the providers status with events\n _provider.events?.addHandler(AllProviderEvents.Ready, () => {\n // These casts are due to the face we don't \"know\" what status enum we are dealing with here (client or server).\n // We could abstract this an implement it in the client/server libs to fix this, but the value is low.\n this._status = _statusEnumType.READY as S;\n });\n _provider.events?.addHandler(AllProviderEvents.Stale, () => {\n this._status = _statusEnumType.STALE as S;\n });\n _provider.events?.addHandler(AllProviderEvents.Error, (details) => {\n if (details?.errorCode === ErrorCode.PROVIDER_FATAL) {\n this._status = _statusEnumType.FATAL as S;\n } else {\n this._status = _statusEnumType.ERROR as S;\n }\n });\n }\n\n get provider(): P {\n return this._provider;\n }\n\n set provider(provider: P) {\n this._provider = provider;\n }\n\n get status(): S {\n return this._status;\n }\n\n set status(status: S) {\n this._status = status;\n }\n\n get allContextChangesSettled() {\n return this._pendingContextChanges === 0;\n }\n\n incrementPendingContextChanges() {\n this._pendingContextChanges++;\n }\n\n decrementPendingContextChanges() {\n this._pendingContextChanges--;\n }\n}\n\nexport abstract class OpenFeatureCommonAPI<\n S extends AnyProviderStatus,\n P extends CommonProvider<S> = CommonProvider<S>,\n H extends BaseHook = BaseHook,\n >\n implements\n Eventing<AnyProviderEvent>,\n EvaluationLifeCycle<OpenFeatureCommonAPI<S, P>>,\n ManageLogger<OpenFeatureCommonAPI<S, P>>\n{\n // accessor for the type of the ProviderStatus enum (client or server)\n protected abstract readonly _statusEnumType: typeof ClientProviderStatus | typeof ServerProviderStatus;\n protected abstract _createEventEmitter(): GenericEventEmitter<AnyProviderEvent>;\n protected abstract _defaultProvider: ProviderWrapper<P, AnyProviderStatus>;\n protected abstract readonly _domainScopedProviders: Map<string, ProviderWrapper<P, AnyProviderStatus>>;\n protected abstract readonly _apiEmitter: GenericEventEmitter<AnyProviderEvent>;\n\n protected _hooks: H[] = [];\n protected _context: EvaluationContext = {};\n protected _logger: Logger = new DefaultLogger();\n\n private readonly _clientEventHandlers: Map<string | undefined, [AnyProviderEvent, EventHandler][]> = new Map();\n protected _domainScopedContext: Map<string, EvaluationContext> = new Map();\n protected _clientEvents: Map<string | undefined, GenericEventEmitter<AnyProviderEvent>> = new Map();\n protected _runsOn: Paradigm;\n\n constructor(category: Paradigm) {\n this._runsOn = category;\n }\n\n addHooks(...hooks: H[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): H[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n setLogger(logger: Logger): this {\n this._logger = new SafeLogger(logger);\n return this;\n }\n\n /**\n * Get metadata about the default provider.\n * @returns {ProviderMetadata} Provider Metadata\n */\n get providerMetadata(): ProviderMetadata {\n return this.getProviderMetadata();\n }\n\n /**\n * Get metadata about a registered provider using the client name.\n * An unbound or empty client name will return metadata from the default provider.\n * @param {string} domain An identifier which logically binds clients with providers\n * @returns {ProviderMetadata} Provider Metadata\n */\n getProviderMetadata(domain?: string): ProviderMetadata {\n return this.getProviderForClient(domain).metadata;\n }\n\n /**\n * Adds a handler for the given provider event type.\n * The handlers are called in the order they have been added.\n * API (global) events run for all providers.\n * @param {AnyProviderEvent} eventType The provider event type to listen to\n * @param {EventHandler} handler The handler to run on occurrence of the event type\n * @param {EventOptions} options Optional options such as signal for aborting\n */\n addHandler<T extends AnyProviderEvent>(eventType: T, handler: EventHandler, options?: EventOptions): void {\n [...new Map([[undefined, this._defaultProvider]]), ...this._domainScopedProviders].forEach((keyProviderTuple) => {\n const domain = keyProviderTuple[0];\n const provider = keyProviderTuple[1].provider;\n const status = keyProviderTuple[1].status;\n const shouldRunNow = statusMatchesEvent(eventType, status);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({ domain, providerName: provider.metadata.name });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n });\n\n this._apiEmitter.addHandler(eventType, handler);\n if (options?.signal && typeof options.signal.addEventListener === 'function') {\n options.signal.addEventListener('abort', () => {\n this.removeHandler(eventType, handler);\n });\n }\n }\n\n /**\n * Removes a handler for the given provider event type.\n * @param {AnyProviderEvent} eventType The provider event type to remove the listener for\n * @param {EventHandler} handler The handler to remove for the provider event type\n */\n removeHandler<T extends AnyProviderEvent>(eventType: T, handler: EventHandler): void {\n this._apiEmitter.removeHandler(eventType, handler);\n }\n\n /**\n * Removes all event handlers.\n */\n clearHandlers(): void {\n this._apiEmitter.removeAllHandlers();\n }\n\n /**\n * Gets the current handlers for the given provider event type.\n * @param {AnyProviderEvent} eventType The provider event type to get the current handlers for\n * @returns {EventHandler[]} The handlers currently attached to the given provider event type\n */\n getHandlers<T extends AnyProviderEvent>(eventType: T): EventHandler[] {\n return this._apiEmitter.getHandlers(eventType);\n }\n\n abstract setProviderAndWait(\n clientOrProvider?: string | P,\n providerContextOrUndefined?: P | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Promise<void>;\n\n abstract setProvider(\n clientOrProvider?: string | P,\n providerContextOrUndefined?: P | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): this;\n\n protected setAwaitableProvider(domainOrProvider?: string | P, providerOrUndefined?: P): Promise<void> | void {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = objectOrUndefined<P>(domainOrProvider) ?? objectOrUndefined<P>(providerOrUndefined);\n\n if (!provider) {\n this._logger.debug('No provider defined, ignoring setProvider call');\n return;\n }\n\n const oldProvider = this.getProviderForClient(domain);\n const providerName = provider.metadata.name;\n\n // ignore no-ops\n if (oldProvider === provider) {\n this._logger.debug('Provider is already set, ignoring setProvider call');\n return;\n }\n\n if (!provider.runsOn) {\n this._logger.debug(`Provider '${provider.metadata.name}' has not defined its intended use.`);\n } else if (provider.runsOn !== this._runsOn) {\n throw new GeneralError(`Provider '${provider.metadata.name}' is intended for use on the ${provider.runsOn}.`);\n }\n\n const emitters = this.getAssociatedEventEmitters(domain);\n\n let initializationPromise: Promise<void> | void = undefined;\n const wrappedProvider = new ProviderWrapper<P, AnyProviderStatus>(\n provider,\n this._statusEnumType.NOT_READY,\n this._statusEnumType,\n );\n\n // initialize the provider if it implements \"initialize\" and it's not already registered\n if (typeof provider.initialize === 'function' && !this.allProviders.includes(provider)) {\n initializationPromise = provider\n .initialize?.(domain ? (this._domainScopedContext.get(domain) ?? this._context) : this._context)\n ?.then(() => {\n wrappedProvider.status = this._statusEnumType.READY;\n // fetch the most recent event emitters, some may have been added during init\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(AllProviderEvents.Ready, { clientName: domain, domain, providerName });\n });\n this._apiEmitter?.emit(AllProviderEvents.Ready, { clientName: domain, domain, providerName });\n })\n ?.catch((error) => {\n // if this is a fatal error, transition to FATAL status\n if ((error as OpenFeatureError)?.code === ErrorCode.PROVIDER_FATAL) {\n wrappedProvider.status = this._statusEnumType.FATAL;\n } else {\n wrappedProvider.status = this._statusEnumType.ERROR;\n }\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(AllProviderEvents.Error, {\n clientName: domain,\n domain,\n providerName,\n message: error?.message,\n });\n });\n this._apiEmitter?.emit(AllProviderEvents.Error, {\n clientName: domain,\n domain,\n providerName,\n message: error?.message,\n });\n // rethrow after emitting error events, so that public methods can control error handling\n throw error;\n });\n } else {\n wrappedProvider.status = this._statusEnumType.READY;\n emitters.forEach((emitter) => {\n emitter?.emit(AllProviderEvents.Ready, { clientName: domain, domain, providerName });\n });\n this._apiEmitter?.emit(AllProviderEvents.Ready, { clientName: domain, domain, providerName });\n }\n\n if (domain) {\n this._domainScopedProviders.set(domain, wrappedProvider);\n } else {\n this._defaultProvider = wrappedProvider;\n }\n\n this.transferListeners(oldProvider, provider, domain, emitters);\n\n // Do not close a provider that is bound to any client\n if (!this.allProviders.includes(oldProvider)) {\n oldProvider?.onClose?.()?.catch((err: Error | undefined) => {\n this._logger.error(`error closing provider: ${err?.message}, ${err?.stack}`);\n });\n }\n\n return initializationPromise;\n }\n\n protected getProviderForClient(domain?: string): P {\n if (!domain) {\n return this._defaultProvider.provider;\n }\n\n return this._domainScopedProviders.get(domain)?.provider ?? this._defaultProvider.provider;\n }\n\n protected buildAndCacheEventEmitterForClient(domain?: string): GenericEventEmitter<AnyProviderEvent> {\n const emitter = this._clientEvents.get(domain);\n\n if (emitter) {\n return emitter;\n }\n\n // lazily add the event emitters\n const newEmitter = this._createEventEmitter();\n this._clientEvents.set(domain, newEmitter);\n\n const clientProvider = this.getProviderForClient(domain);\n Object.values<AllProviderEvents>(AllProviderEvents).forEach((eventType) =>\n clientProvider.events?.addHandler(eventType, async (details) => {\n newEmitter.emit(eventType, {\n ...details,\n clientName: domain,\n domain,\n providerName: clientProvider.metadata.name,\n });\n }),\n );\n\n return newEmitter;\n }\n\n private getUnboundEmitters(): GenericEventEmitter<AnyProviderEvent>[] {\n const domainScopedProviders = [...this._domainScopedProviders.keys()];\n const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);\n const unboundEmitterNames = eventEmitterNames.filter((name) => !domainScopedProviders.includes(name));\n return [\n // all unbound, named emitters\n ...unboundEmitterNames.map((name) => this._clientEvents.get(name)),\n // the default emitter\n this._clientEvents.get(undefined),\n ].filter(isDefined);\n }\n\n protected getAssociatedEventEmitters(domain: string | undefined) {\n return domain ? [this.buildAndCacheEventEmitterForClient(domain)] : this.getUnboundEmitters();\n }\n\n private transferListeners(\n oldProvider: P,\n newProvider: P,\n domain: string | undefined,\n emitters: (GenericEventEmitter<AnyProviderEvent> | undefined)[],\n ) {\n this._clientEventHandlers\n .get(domain)\n ?.forEach((eventHandler) => oldProvider.events?.removeHandler(...eventHandler));\n\n // iterate over the event types\n const newClientHandlers = Object.values(AllProviderEvents).map<[AllProviderEvents, EventHandler]>((eventType) => {\n const handler = async (details?: EventDetails) => {\n // on each event type, fire the associated handlers\n emitters.forEach((emitter) => {\n emitter?.emit(eventType, { ...details, clientName: domain, domain, providerName: newProvider.metadata.name });\n });\n this._apiEmitter.emit(eventType, {\n ...details,\n clientName: domain,\n domain,\n providerName: newProvider.metadata.name,\n });\n };\n\n return [eventType, handler];\n });\n\n this._clientEventHandlers.set(domain, newClientHandlers);\n newClientHandlers.forEach((eventHandler) => newProvider.events?.addHandler(...eventHandler));\n }\n\n async close(): Promise<void> {\n try {\n await this?._defaultProvider.provider?.onClose?.();\n } catch (err) {\n this.handleShutdownError(this._defaultProvider.provider, err);\n }\n\n const wrappers = Array.from(this._domainScopedProviders);\n\n await Promise.all(\n wrappers.map(async ([, wrapper]) => {\n try {\n await wrapper?.provider.onClose?.();\n } catch (err) {\n this.handleShutdownError(wrapper?.provider, err);\n }\n }),\n );\n }\n\n protected async clearProvidersAndSetDefault(defaultProvider: P): Promise<void> {\n try {\n await this.close();\n } catch (err) {\n this._logger.error('Unable to cleanly close providers. Resetting to the default configuration.');\n } finally {\n this._domainScopedProviders.clear();\n this._defaultProvider = new ProviderWrapper<P, AnyProviderStatus>(\n defaultProvider,\n this._statusEnumType.NOT_READY,\n this._statusEnumType,\n );\n }\n }\n\n private get allProviders(): P[] {\n return [\n ...[...this._domainScopedProviders.values()].map((wrappers) => wrappers.provider),\n this._defaultProvider.provider,\n ];\n }\n\n private handleShutdownError(provider: P, err: unknown) {\n this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);\n this._logger.error((err as Error)?.stack);\n }\n}\n", "import type { JsonValue, ResolutionDetails } from '@openfeature/core';\nimport type { Provider } from './provider';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): ResolutionDetails<boolean> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): ResolutionDetails<string> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): ResolutionDetails<number> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): ResolutionDetails<T> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return {\n value: defaultValue,\n reason: REASON_NO_OP,\n };\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n", "import { GenericEventEmitter } from '@openfeature/core';\nimport { EventEmitter } from 'eventemitter3';\nimport type { ProviderEmittableEvents } from './events';\n\n/**\n * The OpenFeatureEventEmitter can be used by provider developers to emit\n * events at various parts of the provider lifecycle.\n *\n * NOTE: Ready and error events are automatically emitted by the SDK based on\n * the result of the initialize method.\n */\nexport class OpenFeatureEventEmitter extends GenericEventEmitter<ProviderEmittableEvents> {\n protected readonly eventEmitter = new EventEmitter();\n\n constructor() {\n super();\n }\n}\n", "import { ErrorCode, OpenFeatureError } from '@openfeature/core';\n\n/**\n * A custom error for the in-memory provider.\n * Indicates the resolved or default variant doesn't exist.\n */\nexport class VariantNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, VariantNotFoundError.prototype);\n this.name = 'VariantNotFoundError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import type {\n EvaluationContext,\n FlagValueType,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n FlagNotFoundError,\n GeneralError,\n OpenFeatureError,\n StandardResolutionReasons,\n TypeMismatchError,\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport { OpenFeatureEventEmitter, ProviderEvents } from '../../events';\nimport type { FlagConfiguration, Flag } from './flag-configuration';\nimport { VariantNotFoundError } from './variant-not-found-error';\n\n/**\n * A simple OpenFeature provider intended for demos and as a test stub.\n */\nexport class InMemoryProvider implements Provider {\n public readonly events = new OpenFeatureEventEmitter();\n public readonly runsOn = 'client';\n readonly metadata = {\n name: 'in-memory',\n } as const;\n private _flagConfiguration: FlagConfiguration;\n private _context: EvaluationContext | undefined;\n\n constructor(flagConfiguration: FlagConfiguration = {}) {\n this._flagConfiguration = { ...flagConfiguration };\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n */\n async putConfiguration(flagConfiguration: FlagConfiguration) {\n try {\n const flagsChanged = Object.entries({...flagConfiguration, ...this._flagConfiguration})\n .map(([key]) => key);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n } catch (err) {\n this.events.emit(ProviderEvents.Error);\n throw err;\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<boolean> {\n return this.resolveAndCheckFlag<boolean>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<number> {\n return this.resolveAndCheckFlag<number>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<string> {\n return this.resolveAndCheckFlag<string>(flagKey, defaultValue, context || this._context, logger);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n return this.resolveAndCheckFlag<T>(flagKey, defaultValue, context || this._context, logger);\n }\n\n private resolveAndCheckFlag<T extends JsonValue | FlagValueType>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): ResolutionDetails<T> {\n if (!(flagKey in this._flagConfiguration)) {\n const message = `no flag found with key ${flagKey}`;\n logger?.debug(message);\n throw new FlagNotFoundError(message);\n }\n\n if (this._flagConfiguration[flagKey].disabled) {\n return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };\n }\n\n const resolvedFlag = this.resolveFlagWithReason(flagKey, context) as ResolutionDetails<T>;\n\n if (resolvedFlag.value === undefined) {\n const message = `no value associated with variant provided for ${flagKey} found`;\n logger?.error(message);\n throw new VariantNotFoundError(message);\n }\n\n if (typeof resolvedFlag.value != typeof defaultValue) {\n throw new TypeMismatchError();\n }\n\n return resolvedFlag;\n }\n\n private resolveFlagWithReason<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n try {\n const resolutionResult = this.lookupFlagValue<T>(flagKey, ctx);\n\n return resolutionResult;\n } catch (error: unknown) {\n if (!(error instanceof OpenFeatureError)) {\n throw new GeneralError((error as Error)?.message || 'unknown error');\n }\n throw error;\n }\n }\n\n private lookupFlagValue<T extends JsonValue | FlagValueType>(\n flagKey: string,\n ctx?: EvaluationContext,\n ): ResolutionDetails<T> {\n const flagSpec: Flag = this._flagConfiguration[flagKey];\n\n const isContextEval = ctx && flagSpec?.contextEvaluator;\n const variant = isContextEval ? flagSpec.contextEvaluator?.(ctx) : flagSpec.defaultVariant;\n\n const value = variant && flagSpec?.variants[variant];\n\n const reason = isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC;\n\n return {\n value: value as T,\n ...(variant && { variant }),\n reason,\n };\n }\n}\n", "import type { EvaluationDetails, FlagValue, HookContext, HookHints, Logger } from '@openfeature/core';\nimport type { Hook } from '../../hooks';\n\n/**\n * Utility for executing a set of hooks of each type. Implementation is largely copied from the main OpenFeature SDK.\n */\nexport class HookExecutor {\n constructor(private logger: Logger) {}\n\n beforeHooks(hooks: Hook[] | undefined, hookContext: HookContext, hints: HookHints) {\n for (const hook of hooks ?? []) {\n hook?.before?.(hookContext, Object.freeze(hints));\n }\n }\n\n afterHooks(\n hooks: Hook[] | undefined,\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n hints: HookHints,\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks ?? []) {\n hook?.after?.(hookContext, evaluationDetails, hints);\n }\n }\n\n errorHooks(hooks: Hook[] | undefined, hookContext: HookContext, err: unknown, hints: HookHints) {\n // run \"error\" hooks sequentially\n for (const hook of hooks ?? []) {\n try {\n hook?.error?.(hookContext, err, hints);\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 }\n }\n }\n\n finallyHooks(\n hooks: Hook[] | undefined,\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n hints: HookHints,\n ) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks ?? []) {\n try {\n hook?.finally?.(hookContext, evaluationDetails, hints);\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 }\n }\n }\n}\n", "import type { ErrorCode } from '@openfeature/core';\nimport { GeneralError, OpenFeatureError } from '@openfeature/core';\nimport type { RegisteredProvider } from './types';\n\nexport class ErrorWithCode extends OpenFeatureError {\n constructor(\n public code: ErrorCode,\n message: string,\n ) {\n super(message);\n }\n}\n\nexport class AggregateError extends GeneralError {\n constructor(\n message: string,\n public originalErrors: { source: string; error: unknown }[],\n ) {\n super(message);\n }\n}\n\nexport const constructAggregateError = (providerErrors: { error: unknown; providerName: string }[]) => {\n const errorsWithSource = providerErrors\n .map(({ providerName, error }) => {\n return { source: providerName, error };\n })\n .flat();\n\n // log first error in the message for convenience, but include all errors in the error object for completeness\n return new AggregateError(\n `Provider errors occurred: ${errorsWithSource[0].source}: ${errorsWithSource[0].error}`,\n errorsWithSource,\n );\n};\n\nexport const throwAggregateErrorFromPromiseResults = (\n result: PromiseSettledResult<unknown>[],\n providerEntries: RegisteredProvider[],\n) => {\n const errors = result\n .map((r, i) => {\n if (r.status === 'rejected') {\n return { error: r.reason, providerName: providerEntries[i].name };\n }\n return null;\n })\n .filter((val): val is { error: unknown; providerName: string } => Boolean(val));\n\n if (errors.length) {\n throw constructAggregateError(errors);\n }\n};\n", "import type {\n ErrorCode,\n EvaluationContext,\n FlagValue,\n FlagValueType,\n OpenFeatureError,\n ResolutionDetails,\n TrackingEventDetails,\n} from '@openfeature/core';\nimport type { Provider } from '../../provider';\nimport { ProviderStatus } from '../../provider';\nimport { ErrorWithCode } from '../errors';\n\nexport type StrategyEvaluationContext = {\n flagKey: string;\n flagType: FlagValueType;\n};\nexport type StrategyProviderContext = {\n provider: Provider;\n providerName: string;\n providerStatus: ProviderStatus;\n};\nexport type StrategyPerProviderContext = StrategyEvaluationContext & StrategyProviderContext;\n\ntype ProviderResolutionResultBase = {\n provider: Provider;\n providerName: string;\n};\n\nexport type ProviderResolutionSuccessResult<T extends FlagValue> = ProviderResolutionResultBase & {\n details: ResolutionDetails<T>;\n};\n\nexport type ProviderResolutionErrorResult = ProviderResolutionResultBase & {\n thrownError: unknown;\n};\n\nexport type ProviderResolutionResult<T extends FlagValue> =\n | ProviderResolutionSuccessResult<T>\n | ProviderResolutionErrorResult;\n\nexport type FinalResult<T extends FlagValue> = {\n details?: ResolutionDetails<T>;\n provider?: Provider;\n providerName?: string;\n errors?: {\n providerName: string;\n error: unknown;\n }[];\n};\n\n/**\n * Base strategy to inherit from. Not directly usable, as strategies must implement the \"determineResult\" method\n * Contains default implementations for `shouldEvaluateThisProvider` and `shouldEvaluateNextProvider`\n */\nexport abstract class BaseEvaluationStrategy {\n shouldEvaluateThisProvider(strategyContext: StrategyPerProviderContext, _evalContext: EvaluationContext): boolean {\n if (\n strategyContext.providerStatus === ProviderStatus.NOT_READY ||\n strategyContext.providerStatus === ProviderStatus.FATAL\n ) {\n return false;\n }\n return true;\n }\n\n shouldEvaluateNextProvider<T extends FlagValue>(\n _strategyContext: StrategyPerProviderContext,\n _context: EvaluationContext,\n _result: ProviderResolutionResult<T>,\n ): boolean {\n return true;\n }\n\n shouldTrackWithThisProvider(\n strategyContext: StrategyProviderContext,\n _context: EvaluationContext,\n _trackingEventName: string,\n _trackingEventDetails: TrackingEventDetails,\n ): boolean {\n if (\n strategyContext.providerStatus === ProviderStatus.NOT_READY ||\n strategyContext.providerStatus === ProviderStatus.FATAL\n ) {\n return false;\n }\n return true;\n }\n\n abstract determineFinalResult<T extends FlagValue>(\n strategyContext: StrategyEvaluationContext,\n context: EvaluationContext,\n resolutions: ProviderResolutionResult<T>[],\n ): FinalResult<T>;\n\n protected hasError(resolution: ProviderResolutionResult<FlagValue>): resolution is\n | ProviderResolutionErrorResult\n | (ProviderResolutionSuccessResult<FlagValue> & {\n details: ResolutionDetails<FlagValue> & { errorCode: ErrorCode };\n }) {\n return 'thrownError' in resolution || !!resolution.details.errorCode;\n }\n\n protected hasErrorWithCode(resolution: ProviderResolutionResult<FlagValue>, code: ErrorCode): boolean {\n return 'thrownError' in resolution\n ? (resolution.thrownError as OpenFeatureError)?.code === code\n : resolution.details.errorCode === code;\n }\n\n protected collectProviderErrors<T extends FlagValue>(resolutions: ProviderResolutionResult<T>[]): FinalResult<T> {\n const errors: FinalResult<FlagValue>['errors'] = [];\n for (const resolution of resolutions) {\n if ('thrownError' in resolution) {\n errors.push({ providerName: resolution.providerName, error: resolution.thrownError });\n } else if (resolution.details.errorCode) {\n errors.push({\n providerName: resolution.providerName,\n error: new ErrorWithCode(resolution.details.errorCode, resolution.details.errorMessage ?? 'unknown error'),\n });\n }\n }\n return { errors };\n }\n\n protected resolutionToFinalResult<T extends FlagValue>(resolution: ProviderResolutionSuccessResult<T>) {\n return { details: resolution.details, provider: resolution.provider, providerName: resolution.providerName };\n }\n}\n", "import type { FinalResult, ProviderResolutionResult, StrategyPerProviderContext } from './base-evaluation-strategy';\nimport { BaseEvaluationStrategy } from './base-evaluation-strategy';\nimport type { EvaluationContext, FlagValue } from '@openfeature/core';\nimport { ErrorCode } from '@openfeature/core';\n\n/**\n * Return the first result that did not indicate \"flag not found\".\n * If any provider in the course of evaluation returns or throws an error, throw that error\n */\nexport class FirstMatchStrategy extends BaseEvaluationStrategy {\n override shouldEvaluateNextProvider<T extends FlagValue>(\n strategyContext: StrategyPerProviderContext,\n context: EvaluationContext,\n result: ProviderResolutionResult<T>,\n ): boolean {\n if (this.hasErrorWithCode(result, ErrorCode.FLAG_NOT_FOUND)) {\n return true;\n }\n if (this.hasError(result)) {\n return false;\n }\n return false;\n }\n\n override determineFinalResult<T extends FlagValue>(\n strategyContext: StrategyPerProviderContext,\n context: EvaluationContext,\n resolutions: ProviderResolutionResult<T>[],\n ): FinalResult<T> {\n const finalResolution = resolutions[resolutions.length - 1];\n if (this.hasError(finalResolution)) {\n return this.collectProviderErrors(resolutions);\n }\n return this.resolutionToFinalResult(finalResolution);\n }\n}\n", "import type { FinalResult, ProviderResolutionResult, StrategyPerProviderContext } from './base-evaluation-strategy';\nimport { BaseEvaluationStrategy } from './base-evaluation-strategy';\nimport type { EvaluationContext, FlagValue } from '@openfeature/core';\n\n/**\n * Return the first result that did NOT result in an error\n * If any provider in the course of evaluation returns or throws an error, ignore it as long as there is a successful result\n * If there is no successful result, throw all errors\n */\nexport class FirstSuccessfulStrategy extends BaseEvaluationStrategy {\n override shouldEvaluateNextProvider<T extends FlagValue>(\n strategyContext: StrategyPerProviderContext,\n context: EvaluationContext,\n result: ProviderResolutionResult<T>,\n ): boolean {\n // evaluate next only if there was an error\n return this.hasError(result);\n }\n\n override determineFinalResult<T extends FlagValue>(\n strategyContext: StrategyPerProviderContext,\n context: EvaluationContext,\n resolutions: ProviderResolutionResult<T>[],\n ): FinalResult<T> {\n const finalResolution = resolutions[resolutions.length - 1];\n if (this.hasError(finalResolution)) {\n return this.collectProviderErrors(resolutions);\n }\n return this.resolutionToFinalResult(finalResolution);\n }\n}\n", "import type {\n FinalResult,\n ProviderResolutionResult,\n ProviderResolutionSuccessResult,\n StrategyPerProviderContext,\n} from './base-evaluation-strategy';\nimport { BaseEvaluationStrategy } from './base-evaluation-strategy';\nimport type { EvaluationContext, FlagValue } from '@openfeature/core';\nimport type { Provider } from '../../provider';\nimport { GeneralError } from '@openfeature/core';\n\n/**\n * Evaluate all providers and compare the results.\n * If the values agree, return the value\n * If the values disagree, return the value from the configured \"fallback provider\" and execute the \"onMismatch\"\n * callback if defined\n */\nexport class ComparisonStrategy extends BaseEvaluationStrategy {\n constructor(\n private fallbackProvider: Provider,\n private onMismatch?: (resolutions: ProviderResolutionResult<FlagValue>[]) => void,\n ) {\n super();\n }\n\n override determineFinalResult<T extends FlagValue>(\n strategyContext: StrategyPerProviderContext,\n context: EvaluationContext,\n resolutions: ProviderResolutionResult<T>[],\n ): FinalResult<T> {\n let value: T | undefined;\n let fallbackResolution: ProviderResolutionSuccessResult<T> | undefined;\n let finalResolution: ProviderResolutionSuccessResult<T> | undefined;\n let mismatch = false;\n for (const [i, resolution] of resolutions.entries()) {\n if (this.hasError(resolution)) {\n return this.collectProviderErrors(resolutions);\n }\n if (resolution.provider === this.fallbackProvider) {\n fallbackResolution = resolution;\n }\n if (i === 0) {\n finalResolution = resolution;\n }\n if (typeof value !== 'undefined' && value !== resolution.details.value) {\n mismatch = true;\n } else {\n value = resolution.details.value;\n }\n }\n\n if (!fallbackResolution) {\n throw new GeneralError('Fallback provider not found in resolution results');\n }\n\n if (!finalResolution) {\n throw new GeneralError('Final resolution not found in resolution results');\n }\n\n if (mismatch) {\n this.onMismatch?.(resolutions);\n return {\n details: fallbackResolution.details,\n provider: fallbackResolution.provider,\n };\n }\n\n return this.resolutionToFinalResult(finalResolution);\n }\n}\n", "import type { EventDetails } from '@openfeature/core';\nimport type { OpenFeatureEventEmitter } from '../../events';\nimport { ProviderEvents } from '../../events';\nimport { ProviderStatus } from '../provider';\nimport type { RegisteredProvider } from './types';\n\n/**\n * Tracks each individual provider's status by listening to emitted events\n * Maintains an overall \"status\" for the multi provider which represents the \"most critical\" status out of all providers\n */\nexport class StatusTracker {\n private readonly providerStatuses: Record<string, ProviderStatus> = {};\n\n constructor(private events: OpenFeatureEventEmitter) {}\n\n wrapEventHandler(providerEntry: RegisteredProvider) {\n const provider = providerEntry.provider;\n provider.events?.addHandler(ProviderEvents.Error, (details?: EventDetails) => {\n this.changeProviderStatus(providerEntry.name, ProviderStatus.ERROR, details);\n });\n\n provider.events?.addHandler(ProviderEvents.Stale, (details?: EventDetails) => {\n this.changeProviderStatus(providerEntry.name, ProviderStatus.STALE, details);\n });\n\n provider.events?.addHandler(ProviderEvents.ConfigurationChanged, (details?: EventDetails) => {\n this.events.emit(ProviderEvents.ConfigurationChanged, details);\n });\n\n provider.events?.addHandler(ProviderEvents.Ready, (details?: EventDetails) => {\n this.changeProviderStatus(providerEntry.name, ProviderStatus.READY, details);\n });\n\n provider.events?.addHandler(ProviderEvents.Reconciling, (details?: EventDetails) => {\n this.changeProviderStatus(providerEntry.name, ProviderStatus.RECONCILING, details);\n });\n }\n\n providerStatus(name: string) {\n return this.providerStatuses[name];\n }\n\n private getStatusFromProviderStatuses() {\n const statuses = Object.values(this.providerStatuses);\n if (statuses.includes(ProviderStatus.FATAL)) {\n return ProviderStatus.FATAL;\n } else if (statuses.includes(ProviderStatus.NOT_READY)) {\n return ProviderStatus.NOT_READY;\n } else if (statuses.includes(ProviderStatus.ERROR)) {\n return ProviderStatus.ERROR;\n } else if (statuses.includes(ProviderStatus.STALE)) {\n return ProviderStatus.STALE;\n } else if (statuses.includes(ProviderStatus.RECONCILING)) {\n return ProviderStatus.RECONCILING;\n }\n return ProviderStatus.READY;\n }\n\n private changeProviderStatus(name: string, status: ProviderStatus, details?: EventDetails) {\n const currentStatus = this.getStatusFromProviderStatuses();\n this.providerStatuses[name] = status;\n const newStatus = this.getStatusFromProviderStatuses();\n if (currentStatus !== newStatus) {\n if (newStatus === ProviderStatus.FATAL || newStatus === ProviderStatus.ERROR) {\n this.events.emit(ProviderEvents.Error, details);\n } else if (newStatus === ProviderStatus.STALE) {\n this.events.emit(ProviderEvents.Stale, details);\n } else if (newStatus === ProviderStatus.READY) {\n this.events.emit(ProviderEvents.Ready, details);\n } else if (newStatus === ProviderStatus.RECONCILING) {\n this.events.emit(ProviderEvents.Reconciling, details);\n }\n }\n }\n}\n", "import type {\n EvaluationContext,\n FlagValueType,\n HookContext,\n HookHints,\n JsonValue,\n Logger,\n ProviderMetadata,\n BeforeHookContext,\n ResolutionDetails,\n FlagMetadata,\n EvaluationDetails,\n FlagValue,\n OpenFeatureError,\n TrackingEventDetails,\n} from '@openfeature/core';\nimport type { Provider } from '../../provider';\nimport type { Hook } from '../../hooks';\nimport { OpenFeatureEventEmitter } from '../../events';\nimport { DefaultLogger, GeneralError, ErrorCode, StandardResolutionReasons } from '@openfeature/core';\nimport { HookExecutor } from './hook-executor';\nimport { constructAggregateError, throwAggregateErrorFromPromiseResults } from './errors';\nimport type { BaseEvaluationStrategy, ProviderResolutionResult } from './strategies';\nimport { FirstMatchStrategy } from './strategies';\nimport { StatusTracker } from './status-tracker';\nimport type { ProviderEntryInput, RegisteredProvider } from './types';\n\nexport class MultiProvider implements Provider {\n readonly runsOn = 'client';\n\n public readonly events = new OpenFeatureEventEmitter();\n\n private hookContexts: WeakMap<EvaluationContext, HookContext> = new WeakMap<EvaluationContext, HookContext>();\n private hookHints: WeakMap<EvaluationContext, HookHints> = new WeakMap<EvaluationContext, HookHints>();\n\n metadata: ProviderMetadata;\n\n providerEntries: RegisteredProvider[] = [];\n private providerEntriesByName: Record<string, RegisteredProvider> = {};\n\n private hookExecutor: HookExecutor;\n private statusTracker = new StatusTracker(this.events);\n\n constructor(\n readonly constructorProviders: ProviderEntryInput[],\n private readonly evaluationStrategy: BaseEvaluationStrategy = new FirstMatchStrategy(),\n private readonly logger: Logger = new DefaultLogger(),\n ) {\n this.hookExecutor = new HookExecutor(this.logger);\n\n this.registerProviders(constructorProviders);\n\n const aggregateMetadata = Object.keys(this.providerEntriesByName).reduce((acc, name) => {\n return { ...acc, [name]: this.providerEntriesByName[name].provider.metadata };\n }, {});\n\n this.metadata = {\n ...aggregateMetadata,\n name: MultiProvider.name,\n };\n }\n\n private registerProviders(constructorProviders: ProviderEntryInput[]) {\n const providersByName: Record<string, Provider[]> = {};\n\n for (const constructorProvider of constructorProviders) {\n const providerName = constructorProvider.provider.metadata.name;\n const candidateName = constructorProvider.name ?? providerName;\n\n if (constructorProvider.name && providersByName[constructorProvider.name]) {\n throw new Error('Provider names must be unique');\n }\n\n providersByName[candidateName] ??= [];\n providersByName[candidateName].push(constructorProvider.provider);\n }\n\n for (const name of Object.keys(providersByName)) {\n const useIndexedNames = providersByName[name].length > 1;\n for (let i = 0; i < providersByName[name].length; i++) {\n const indexedName = useIndexedNames ? `${name}-${i + 1}` : name;\n this.providerEntriesByName[indexedName] = { provider: providersByName[name][i], name: indexedName };\n this.providerEntries.push(this.providerEntriesByName[indexedName]);\n this.statusTracker.wrapEventHandler(this.providerEntriesByName[indexedName]);\n }\n }\n\n // just make sure we don't accidentally modify these later\n Object.freeze(this.providerEntries);\n Object.freeze(this.providerEntriesByName);\n }\n\n async initialize(context?: EvaluationContext): Promise<void> {\n const result = await Promise.allSettled(\n this.providerEntries.map((provider) => provider.provider.initialize?.(context)),\n );\n throwAggregateErrorFromPromiseResults(result, this.providerEntries);\n }\n\n async onClose() {\n const result = await Promise.allSettled(this.providerEntries.map((provider) => provider.provider.onClose?.()));\n throwAggregateErrorFromPromiseResults(result, this.providerEntries);\n }\n\n async onContextChange(oldContext: EvaluationContext, newContext: EvaluationContext) {\n for (const providerEntry of this.providerEntries) {\n await providerEntry.provider.onContextChange?.(oldContext, newContext);\n }\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n ): ResolutionDetails<boolean> {\n return this.flagResolutionProxy<boolean>(flagKey, 'boolean', defaultValue, context);\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n ): ResolutionDetails<string> {\n return this.flagResolutionProxy(flagKey, 'string', defaultValue, context);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n ): ResolutionDetails<number> {\n return this.flagResolutionProxy(flagKey, 'number', defaultValue, context);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n ): ResolutionDetails<T> {\n return this.flagResolutionProxy(flagKey, 'object', defaultValue, context);\n }\n\n track(trackingEventName: string, context: EvaluationContext, trackingEventDetails: TrackingEventDetails): void {\n for (const providerEntry of this.providerEntries) {\n if (!providerEntry.provider.track) {\n continue;\n }\n\n const strategyContext = {\n provider: providerEntry.provider,\n providerName: providerEntry.name,\n providerStatus: this.statusTracker.providerStatus(providerEntry.name),\n };\n\n if (\n this.evaluationStrategy.shouldTrackWithThisProvider(\n strategyContext,\n context,\n trackingEventName,\n trackingEventDetails,\n )\n ) {\n try {\n providerEntry.provider.track?.(trackingEventName, context, trackingEventDetails);\n } catch (error) {\n this.logger.error(\n `Error tracking event \"${trackingEventName}\" with provider \"${providerEntry.name}\":`,\n error,\n );\n }\n }\n }\n }\n\n private flagResolutionProxy<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n flagType: FlagValueType,\n defaultValue: T,\n context: EvaluationContext,\n ): ResolutionDetails<T> {\n const hookContext = this.hookContexts.get(context);\n const hookHints = this.hookHints.get(context);\n\n if (!hookContext || !hookHints) {\n throw new GeneralError('Hook context not available for evaluation');\n }\n\n const results = [] as (ProviderResolutionResult<T> | null)[];\n\n for (const providerEntry of this.providerEntries) {\n const [shouldEvaluateNext, result] = this.evaluateProviderEntry(\n flagKey,\n flagType,\n defaultValue,\n providerEntry,\n hookContext,\n hookHints,\n context,\n );\n\n results.push(result);\n\n if (!shouldEvaluateNext) {\n break;\n }\n }\n\n const resolutions = results.filter((r): r is ProviderResolutionResult<T> => Boolean(r));\n const finalResult = this.evaluationStrategy.determineFinalResult({ flagKey, flagType }, context, resolutions);\n\n if (finalResult.errors?.length) {\n throw constructAggregateError(finalResult.errors);\n }\n\n if (!finalResult.details) {\n throw new GeneralError('No result was returned from any provider');\n }\n\n return finalResult.details;\n }\n\n private evaluateProviderEntry<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n flagType: FlagValueType,\n defaultValue: T,\n providerEntry: RegisteredProvider,\n hookContext: HookContext,\n hookHints: HookHints,\n context: EvaluationContext,\n ): [boolean, ProviderResolutionResult<T> | null] {\n let evaluationResult: ResolutionDetails<T> | undefined = undefined;\n const provider = providerEntry.provider;\n const strategyContext = {\n flagKey,\n flagType,\n provider,\n providerName: providerEntry.name,\n providerStatus: this.statusTracker.providerStatus(providerEntry.name),\n };\n\n if (!this.evaluationStrategy.shouldEvaluateThisProvider(strategyContext, context)) {\n return [true, null];\n }\n\n let resolution: ProviderResolutionResult<T>;\n\n try {\n evaluationResult = this.evaluateProviderAndHooks(flagKey, defaultValue, provider, hookContext, hookHints);\n resolution = {\n details: evaluationResult,\n provider: provider,\n providerName: providerEntry.name,\n };\n } catch (error: unknown) {\n resolution = {\n thrownError: error,\n provider: provider,\n providerName: providerEntry.name,\n };\n }\n\n return [this.evaluationStrategy.shouldEvaluateNextProvider(strategyContext, context, resolution), resolution];\n }\n\n private evaluateProviderAndHooks<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n defaultValue: T,\n provider: Provider,\n hookContext: HookContext,\n hookHints: HookHints,\n ) {\n let evaluationDetails: EvaluationDetails<T>;\n\n try {\n this.hookExecutor.beforeHooks(provider.hooks, hookContext, hookHints);\n\n const resolutionDetails = this.callProviderResolve<T>(\n provider,\n flagKey,\n defaultValue,\n hookContext.context,\n ) as ResolutionDetails<T>;\n\n evaluationDetails = {\n ...resolutionDetails,\n flagMetadata: Object.freeze(resolutionDetails.flagMetadata ?? {}),\n flagKey,\n };\n\n this.hookExecutor.afterHooks(provider.hooks, hookContext, evaluationDetails, hookHints);\n } catch (error: unknown) {\n this.hookExecutor.errorHooks(provider.hooks, hookContext, error, hookHints);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, error);\n }\n this.hookExecutor.finallyHooks(provider.hooks, hookContext, evaluationDetails, hookHints);\n return evaluationDetails;\n }\n\n private callProviderResolve<T extends boolean | string | number | JsonValue>(\n provider: Provider,\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n ) {\n switch (typeof defaultValue) {\n case 'string':\n return provider.resolveStringEvaluation(flagKey, defaultValue, context, this.logger);\n case 'number':\n return provider.resolveNumberEvaluation(flagKey, defaultValue, context, this.logger);\n case 'object':\n return provider.resolveObjectEvaluation(flagKey, defaultValue, context, this.logger);\n case 'boolean':\n return provider.resolveBooleanEvaluation(flagKey, defaultValue, context, this.logger);\n default:\n throw new GeneralError('Invalid flag evaluation type');\n }\n }\n\n public get hooks(): Hook[] {\n return [\n {\n before: (hookContext: BeforeHookContext, hints: HookHints): EvaluationContext => {\n this.hookContexts.set(hookContext.context, hookContext);\n this.hookHints.set(hookContext.context, hints ?? {});\n return hookContext.context;\n },\n },\n ];\n }\n\n private getErrorEvaluationDetails<T extends FlagValue>(\n flagKey: string,\n defaultValue: T,\n err: unknown,\n flagMetadata: FlagMetadata = {},\n ): EvaluationDetails<T> {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze(flagMetadata),\n flagKey,\n };\n }\n}\n", "import type {\n ClientMetadata,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n TrackingEventDetails,\n OpenFeatureError,\n FlagMetadata,\n ResolutionDetails,\n EventOptions,\n} from '@openfeature/core';\nimport {\n ErrorCode,\n ProviderFatalError,\n ProviderNotReadyError,\n SafeLogger,\n StandardResolutionReasons,\n instantiateErrorByErrorCode,\n statusMatchesEvent,\n MapHookData,\n} from '@openfeature/core';\nimport type { FlagEvaluationOptions } from '../../evaluation';\nimport type { ProviderEvents } from '../../events';\nimport type { InternalEventEmitter } from '../../events/internal/internal-event-emitter';\nimport type { Hook } from '../../hooks';\nimport type { Provider } from '../../provider';\nimport { ProviderStatus } from '../../provider';\nimport type { Client } from './../client';\n\ntype OpenFeatureClientOptions = {\n /**\n * @deprecated Use `domain` instead.\n */\n name?: string;\n domain?: string;\n version?: string;\n};\n\n/**\n * This implementation of the {@link Client} is meant to only be instantiated by the SDK.\n * It should not be used outside the SDK and so should not be exported.\n * @internal\n */\nexport class OpenFeatureClient implements Client {\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n private readonly providerAccessor: () => Provider,\n private readonly providerStatusAccessor: () => ProviderStatus,\n private readonly emitterAccessor: () => InternalEventEmitter,\n private readonly apiContextAccessor: (domain?: string) => EvaluationContext,\n private readonly apiHooksAccessor: () => Hook[],\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n ) {}\n\n get metadata(): ClientMetadata {\n return {\n // Use domain if name is not provided\n name: this.options.domain ?? this.options.name,\n domain: this.options.domain ?? this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n get providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler, options: EventOptions): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const shouldRunNow = statusMatchesEvent(eventType, this.providerStatus);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({\n clientName: this.metadata.name,\n domain: this.metadata.domain,\n providerName: this._provider.metadata.name,\n });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n\n if (options?.signal && typeof options.signal.addEventListener === 'function') {\n options.signal.addEventListener('abort', () => {\n this.removeHandler(eventType, handler);\n });\n }\n }\n\n removeHandler(notificationType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().removeHandler(notificationType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): this {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(flagKey, this._provider.resolveBooleanEvaluation, defaultValue, 'boolean', options);\n }\n\n getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'string',\n options,\n );\n }\n\n getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'number',\n options,\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions,\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n track(occurrenceKey: string, occurrenceDetails: TrackingEventDetails = {}): void {\n try {\n this.shortCircuitIfNotReady();\n\n if (typeof this._provider.track === 'function') {\n // copy and freeze the context\n const frozenContext = Object.freeze({\n ...this.apiContextAccessor(this?.options?.domain),\n });\n return this._provider.track?.(occurrenceKey, frozenContext, occurrenceDetails);\n } else {\n this._logger.debug('Provider does not support the track function; will no-op.');\n }\n } catch (err) {\n this._logger.debug('Error recording tracking event.', err);\n }\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\n options: FlagEvaluationOptions = {},\n ): EvaluationDetails<T> {\n // merge global, client, and evaluation context\n\n const allHooks = [\n ...this.apiHooksAccessor(),\n ...this.getHooks(),\n ...(options.hooks || []),\n ...(this._provider.hooks || []),\n ];\n const allHooksReversed = [...allHooks].reverse();\n\n const context = {\n ...this.apiContextAccessor(this?.options?.domain),\n };\n\n // Create hook context instances for each hook (stable object references for the entire evaluation)\n // This ensures hooks can use WeakMaps with hookContext as keys across lifecycle methods\n // NOTE: Uses the reversed order to reduce the number of times we have to calculate the index.\n const hookContexts = allHooksReversed.map<HookContext>(() =>\n Object.freeze({\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: this._provider.metadata,\n context,\n logger: this._logger,\n hookData: new MapHookData(),\n }),\n );\n\n let evaluationDetails: EvaluationDetails<T>;\n\n try {\n this.beforeHooks(allHooks, hookContexts, options);\n\n this.shortCircuitIfNotReady();\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, context, this._logger);\n\n const resolutionDetails = {\n ...resolution,\n flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),\n flagKey,\n };\n\n if (resolutionDetails.errorCode) {\n const err = instantiateErrorByErrorCode(resolutionDetails.errorCode, resolutionDetails.errorMessage);\n this.errorHooks(allHooksReversed, hookContexts, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata);\n } else {\n this.afterHooks(allHooksReversed, hookContexts, resolutionDetails, options);\n evaluationDetails = resolutionDetails;\n }\n } catch (err: unknown) {\n this.errorHooks(allHooksReversed, hookContexts, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err);\n }\n this.finallyHooks(allHooksReversed, hookContexts, evaluationDetails, options);\n return evaluationDetails;\n }\n\n private beforeHooks(hooks: Hook[], hookContexts: HookContext[], options: FlagEvaluationOptions) {\n for (const [index, hook] of hooks.entries()) {\n const hookContextIndex = hooks.length - 1 - index; // reverse index for before hooks\n const hookContext = hookContexts[hookContextIndex];\n Object.freeze(hookContext);\n Object.freeze(hookContext.context);\n hook?.before?.(hookContext, Object.freeze(options.hookHints));\n }\n }\n\n private afterHooks(\n hooks: Hook[],\n hookContexts: HookContext[],\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"after\" hooks sequentially\n for (const [index, hook] of hooks.entries()) {\n const hookContext = hookContexts[index];\n hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private errorHooks(hooks: Hook[], hookContexts: HookContext[], err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const [index, hook] of hooks.entries()) {\n try {\n const hookContext = hookContexts[index];\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(\n hooks: Hook[],\n hookContexts: HookContext[],\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"finally\" hooks sequentially\n for (const [index, hook] of hooks.entries()) {\n try {\n const hookContext = hookContexts[index];\n hook?.finally?.(hookContext, evaluationDetails, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private get _provider(): Provider {\n return this.providerAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n\n private shortCircuitIfNotReady() {\n // short circuit evaluation entirely if provider is in a bad state\n if (this.providerStatus === ProviderStatus.NOT_READY) {\n throw new ProviderNotReadyError('provider has not yet initialized');\n } else if (this.providerStatus === ProviderStatus.FATAL) {\n throw new ProviderFatalError('provider is in an irrecoverable error state');\n }\n }\n\n private getErrorEvaluationDetails<T extends FlagValue>(\n flagKey: string,\n defaultValue: T,\n err: unknown,\n flagMetadata: FlagMetadata = {},\n ): EvaluationDetails<T> {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze(flagMetadata),\n flagKey,\n };\n }\n}\n", "import type {\n ClientProviderStatus,\n EvaluationContext,\n GenericEventEmitter,\n ManageContext} from '@openfeature/core';\nimport {\n OpenFeatureCommonAPI,\n ProviderWrapper,\n objectOrUndefined,\n stringOrUndefined,\n} from '@openfeature/core';\nimport type { Client } from './client';\nimport { OpenFeatureClient } from './client/internal/open-feature-client';\nimport { OpenFeatureEventEmitter, ProviderEvents } from './events';\nimport type { Hook } from './hooks';\nimport type { Provider} from './provider';\nimport { NOOP_PROVIDER, ProviderStatus } from './provider';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/web-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\ntype DomainRecord = {\n domain?: string;\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>;\n};\n\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI\n extends OpenFeatureCommonAPI<ClientProviderStatus, Provider, Hook>\n implements ManageContext<Promise<void>>\n{\n protected _statusEnumType: typeof ProviderStatus = ProviderStatus;\n protected _apiEmitter: GenericEventEmitter<ProviderEvents> = new OpenFeatureEventEmitter();\n protected _defaultProvider: ProviderWrapper<Provider, ClientProviderStatus> = new ProviderWrapper(\n NOOP_PROVIDER,\n ProviderStatus.NOT_READY,\n this._statusEnumType,\n );\n protected _domainScopedProviders: Map<string, ProviderWrapper<Provider, ClientProviderStatus>> = new Map();\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n private constructor() {\n super('client');\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n private getProviderStatus(domain?: string): ProviderStatus {\n if (!domain) {\n return this._defaultProvider.status;\n }\n\n return this._domainScopedProviders.get(domain)?.status ?? this._defaultProvider.status;\n }\n\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws {Error} If the provider throws an exception during initialization.\n */\n setProviderAndWait(provider: Provider): Promise<void>;\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws {Error} If the provider throws an exception during initialization.\n */\n setProviderAndWait(provider: Provider, context: EvaluationContext): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws {Error} If the provider throws an exception during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param {EvaluationContext} context The evaluation context to use for flag evaluations.\n * @returns {Promise<void>}\n * @throws {Error} If the provider throws an exception during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider, context: EvaluationContext): Promise<void>;\n async setProviderAndWait(\n clientOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Promise<void> {\n const domain = stringOrUndefined(clientOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(clientOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n await this.setAwaitableProvider(domain, provider);\n }\n\n /**\n * Sets the default provider for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider): this;\n /**\n * Sets the default provider and evaluation context for flag evaluations.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(provider: Provider, context: EvaluationContext): this;\n /**\n * Sets the provider for flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider): this;\n /**\n * Sets the provider and evaluation context flag evaluations of providers with the given name.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @param context {EvaluationContext} The evaluation context to use for flag evaluations.\n * @returns {this} OpenFeature API\n */\n setProvider(domain: string, provider: Provider, context: EvaluationContext): this;\n setProvider(\n domainOrProvider?: string | Provider,\n providerContextOrUndefined?: Provider | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): this {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerContextOrUndefined)\n : objectOrUndefined<Provider>(domainOrProvider);\n const context = domain\n ? objectOrUndefined<EvaluationContext>(contextOrUndefined)\n : objectOrUndefined<EvaluationContext>(providerContextOrUndefined);\n\n if (context) {\n // synonymously setting context prior to provider initialization.\n // No context change event will be emitted.\n if (domain) {\n this._domainScopedContext.set(domain, context);\n } else {\n this._context = context;\n }\n }\n\n const maybePromise = this.setAwaitableProvider(domain, provider);\n\n // The setProvider method doesn't return a promise so we need to catch and\n // log any errors that occur during provider initialization to avoid having\n // an unhandled promise rejection.\n Promise.resolve(maybePromise).catch((err) => {\n this._logger.error('Error during provider initialization:', err);\n });\n return this;\n }\n\n /**\n * Get the default provider.\n *\n * Note that it isn't recommended to interact with the provider directly, but rather through\n * an OpenFeature client.\n * @returns {Provider} Default Provider\n */\n getProvider(): Provider;\n /**\n * Get the provider bound to the specified domain.\n *\n * Note that it isn't recommended to interact with the provider directly, but rather through\n * an OpenFeature client.\n * @param {string} domain An identifier which logically binds clients with providers\n * @returns {Provider} Domain-scoped provider\n */\n getProvider(domain?: string): Provider;\n getProvider(domain?: string): Provider {\n return this.getProviderForClient(domain);\n }\n\n /**\n * Sets the evaluation context globally.\n * This will be used by all providers that have not bound to a domain.\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext({ region: \"us\" });\n */\n async setContext(context: EvaluationContext): Promise<void>;\n /**\n * Sets the evaluation context for a specific provider.\n * This will only affect providers bound to a domain.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {EvaluationContext} context Evaluation context\n * @example\n * await OpenFeature.setContext(\"test\", { scope: \"provider\" });\n * OpenFeature.setProvider(new MyProvider()) // Uses the default context\n * OpenFeature.setProvider(\"test\", new MyProvider()) // Uses context: { scope: \"provider\" }\n */\n async setContext(domain: string, context: EvaluationContext): Promise<void>;\n async setContext<T extends EvaluationContext>(domainOrContext: T | string, contextOrUndefined?: T): Promise<void> {\n const domain = stringOrUndefined(domainOrContext);\n const context = objectOrUndefined<T>(domainOrContext) ?? objectOrUndefined(contextOrUndefined) ?? {};\n\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.set(domain, context);\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, context);\n } else {\n this._domainScopedContext.set(domain, context);\n }\n } else {\n const oldContext = this._context;\n this._context = context;\n\n // collect all providers that are using the default context (not bound to a domain)\n const unboundProviders: DomainRecord[] = Array.from(this._domainScopedProviders.entries())\n .filter(([domain]) => !this._domainScopedContext.has(domain))\n .reduce<DomainRecord[]>((acc, [domain, wrapper]) => {\n acc.push({ domain, wrapper });\n return acc;\n }, []);\n\n const allDomainRecords: DomainRecord[] = [\n // add in the default (no domain)\n { domain: undefined, wrapper: this._defaultProvider },\n ...unboundProviders,\n ];\n await Promise.all(\n allDomainRecords.map((dm) => this.runProviderContextChangeHandler(dm.domain, dm.wrapper, oldContext, context)),\n );\n }\n }\n\n /**\n * Access the global evaluation context.\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(): EvaluationContext;\n /**\n * Access the evaluation context for a specific named client.\n * The global evaluation context is returned if a matching named client is not found.\n * @param {string} domain An identifier which logically binds clients with providers\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(domain?: string | undefined): EvaluationContext;\n getContext(domainOrUndefined?: string): EvaluationContext {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const context = this._domainScopedContext.get(domain);\n if (context) {\n return context;\n } else {\n this._logger.debug(`Unable to find context for '${domain}'.`);\n }\n }\n return this._context;\n }\n\n /**\n * Resets the global evaluation context to an empty object.\n */\n clearContext(): Promise<void>;\n /**\n * Removes the evaluation context for a specific named client.\n * @param {string} domain An identifier which logically binds clients with providers\n */\n clearContext(domain: string): Promise<void>;\n async clearContext(domainOrUndefined?: string): Promise<void> {\n const domain = stringOrUndefined(domainOrUndefined);\n if (domain) {\n const wrapper = this._domainScopedProviders.get(domain);\n if (wrapper) {\n const oldContext = this.getContext(domain);\n this._domainScopedContext.delete(domain);\n const newContext = this.getContext();\n await this.runProviderContextChangeHandler(domain, wrapper, oldContext, newContext);\n } else {\n this._domainScopedContext.delete(domain);\n }\n } else {\n return this.setContext({});\n }\n }\n\n /**\n * Resets the global evaluation context and removes the evaluation context for\n * all domains.\n */\n async clearContexts(): Promise<void> {\n // Default context must be cleared first to avoid calling the onContextChange\n // handler multiple times for clients bound to a domain.\n await this.clearContext();\n\n // Use allSettled so a promise rejection doesn't affect others\n await Promise.allSettled(Array.from(this._domainScopedProviders.keys()).map((domain) => this.clearContext(domain)));\n }\n\n /**\n * A factory function for creating new domain-scoped OpenFeature clients. Clients\n * can contain their own state (e.g. logger, hook, context). Multiple domains\n * can be used to segment feature flag configuration.\n *\n * If there is already a provider bound to this name via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that name.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {string} version The version of the client (only used for metadata)\n * @returns {Client} OpenFeature Client\n */\n getClient(domain?: string, version?: string): Client {\n return new OpenFeatureClient(\n // functions are passed here to make sure that these values are always up to date,\n // and so we don't have to make these public properties on the API class.\n () => this.getProviderForClient(domain),\n () => this.getProviderStatus(domain),\n () => this.buildAndCacheEventEmitterForClient(domain),\n (domain?: string) => this.getContext(domain),\n () => this.getHooks(),\n () => this._logger,\n { domain, version },\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n async clearProviders(): Promise<void> {\n await super.clearProvidersAndSetDefault(NOOP_PROVIDER);\n this._domainScopedContext.clear();\n }\n\n private async runProviderContextChangeHandler(\n domain: string | undefined,\n wrapper: ProviderWrapper<Provider, ClientProviderStatus>,\n oldContext: EvaluationContext,\n newContext: EvaluationContext,\n ): Promise<void> {\n // this should always be set according to the typings, but let's be defensive considering JS\n const providerName = wrapper.provider?.metadata?.name || 'unnamed-provider';\n\n try {\n if (typeof wrapper.provider.onContextChange === 'function') {\n const maybePromise = wrapper.provider.onContextChange(oldContext, newContext);\n\n // only reconcile if the onContextChange method returns a promise\n if (maybePromise && typeof maybePromise?.then === 'function') {\n wrapper.incrementPendingContextChanges();\n wrapper.status = this._statusEnumType.RECONCILING;\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.Reconciling, { domain, providerName });\n\n await maybePromise;\n wrapper.decrementPendingContextChanges();\n }\n }\n // only run the event handlers, and update the state if the onContextChange method succeeded\n wrapper.status = this._statusEnumType.READY;\n if (wrapper.allContextChangesSettled) {\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n });\n this._apiEmitter?.emit(ProviderEvents.ContextChanged, { clientName: domain, domain, providerName });\n }\n } catch (err) {\n // run error handlers instead\n wrapper.decrementPendingContextChanges();\n wrapper.status = this._statusEnumType.ERROR;\n if (wrapper.allContextChangesSettled) {\n const error = err as Error | undefined;\n const message = `Error running ${providerName}'s context change handler: ${error?.message}`;\n this._logger?.error(`${message}`, err);\n this.getAssociatedEventEmitters(domain).forEach((emitter) => {\n emitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n });\n this._apiEmitter?.emit(ProviderEvents.Error, { clientName: domain, domain, providerName, message });\n }\n }\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["require_eventemitter3", "__commonJSMin", "exports", "module", "has", "prefix", "Events", "EE", "fn", "context", "once", "addListener", "emitter", "event", "listener", "evt", "clearEvent", "EventEmitter", "names", "events", "name", "handlers", "i", "l", "ee", "listeners", "a1", "a2", "a3", "a4", "a5", "len", "args", "length", "j", "index_exports", "__export", "AggregateError", "ClientProviderEvents", "ClientProviderStatus", "BaseEvaluationStrategy", "ComparisonStrategy", "DefaultLogger", "ErrorCode", "ErrorWithCode", "FirstMatchStrategy", "FirstSuccessfulStrategy", "FlagNotFoundError", "GeneralError", "GenericEventEmitter", "InMemoryProvider", "InvalidContextError", "LOG_LEVELS", "MapHookData", "MultiProvider", "NOOP_PROVIDER", "OpenFeature", "OpenFeatureAPI", "OpenFeatureCommonAPI", "OpenFeatureError", "OpenFeatureEventEmitter", "ParseError", "ProviderFatalError", "ProviderNotReadyError", "ProviderWrapper", "SafeLogger", "ServerProviderEvents", "ServerProviderStatus", "StandardResolutionReasons", "TargetingKeyMissingError", "TelemetryAttribute", "TelemetryFlagMetadata", "TypeMismatchError", "constructAggregateError", "createEvaluationEvent", "instantiateErrorByErrorCode", "isObject", "isString", "objectOrUndefined", "statusMatchesEvent", "stringOrUndefined", "throwAggregateErrorFromPromiseResults", "MapHookData", "key", "value", "StandardResolutionReasons", "ErrorCode", "OpenFeatureError", "_OpenFeatureError", "message", "options", "FlagNotFoundError", "_FlagNotFoundError", "OpenFeatureError", "message", "options", "GeneralError", "_GeneralError", "OpenFeatureError", "message", "options", "InvalidContextError", "_InvalidContextError", "OpenFeatureError", "message", "options", "ParseError", "_ParseError", "OpenFeatureError", "message", "options", "ProviderFatalError", "_ProviderFatalError", "OpenFeatureError", "message", "options", "ProviderNotReadyError", "_ProviderNotReadyError", "OpenFeatureError", "message", "options", "TargetingKeyMissingError", "_TargetingKeyMissingError", "OpenFeatureError", "message", "options", "TypeMismatchError", "_TypeMismatchError", "OpenFeatureError", "message", "options", "instantiateErrorByErrorCode", "errorCode", "message", "FlagNotFoundError", "ParseError", "TypeMismatchError", "TargetingKeyMissingError", "InvalidContextError", "ProviderNotReadyError", "ProviderFatalError", "GeneralError", "ServerProviderStatus", "ClientProviderStatus", "ServerProviderEvents", "ClientProviderEvents", "eventStatusMap", "statusMatchesEvent", "event", "status", "DefaultLogger", "args", "LOG_LEVELS", "SafeLogger", "logger", "DefaultLogger", "level", "err", "args", "error", "GenericEventEmitter", "globalLogger", "eventType", "context", "handler", "asyncHandler", "details", "__async", "_a", "err", "existingAsyncHandlers", "removedAsyncHandler", "logger", "SafeLogger", "_b", "TelemetryAttribute", "TelemetryFlagMetadata", "FLAG_EVALUATION_EVENT_NAME", "createEvaluationEvent", "hookContext", "evaluationDetails", "_a", "_b", "_c", "attributes", "TelemetryAttribute", "StandardResolutionReasons", "e", "contextId", "TelemetryFlagMetadata", "setId", "version", "isString", "value", "stringOrUndefined", "isObject", "objectOrUndefined", "isDefined", "input", "ProviderWrapper", "_provider", "_status", "_statusEnumType", "_a", "_b", "_c", "details", "provider", "status", "OpenFeatureCommonAPI", "category", "DefaultLogger", "hooks", "logger", "SafeLogger", "domain", "eventType", "handler", "options", "keyProviderTuple", "statusMatchesEvent", "err", "domainOrProvider", "providerOrUndefined", "_d", "_e", "_f", "_g", "_h", "stringOrUndefined", "objectOrUndefined", "oldProvider", "providerName", "GeneralError", "emitters", "initializationPromise", "wrappedProvider", "emitter", "error", "newEmitter", "clientProvider", "ClientProviderEvents", "__async", "__spreadProps", "__spreadValues", "domainScopedProviders", "isDefined", "name", "newProvider", "eventHandler", "newClientHandlers", "wrappers", "_0", "wrapper", "defaultProvider", "REASON_NO_OP", "NoopFeatureProvider", "_", "defaultValue", "NOOP_PROVIDER", "import_index", "OpenFeatureEventEmitter", "GenericEventEmitter", "EventEmitter", "VariantNotFoundError", "_VariantNotFoundError", "OpenFeatureError", "message", "InMemoryProvider", "flagConfiguration", "OpenFeatureEventEmitter", "__spreadValues", "__async", "flagsChanged", "key", "err", "flagKey", "defaultValue", "context", "logger", "message", "FlagNotFoundError", "StandardResolutionReasons", "resolvedFlag", "VariantNotFoundError", "TypeMismatchError", "ctx", "error", "OpenFeatureError", "GeneralError", "_a", "flagSpec", "isContextEval", "variant", "value", "reason", "__spreadProps", "HookExecutor", "logger", "hooks", "hookContext", "hints", "_a", "hook", "evaluationDetails", "err", "ErrorWithCode", "OpenFeatureError", "code", "message", "AggregateError", "GeneralError", "originalErrors", "constructAggregateError", "providerErrors", "errorsWithSource", "providerName", "error", "throwAggregateErrorFromPromiseResults", "result", "providerEntries", "errors", "i", "val", "BaseEvaluationStrategy", "strategyContext", "_evalContext", "_strategyContext", "_context", "_result", "_trackingEventName", "_trackingEventDetails", "resolution", "code", "_a", "resolutions", "errors", "ErrorWithCode", "FirstMatchStrategy", "BaseEvaluationStrategy", "strategyContext", "context", "result", "resolutions", "finalResolution", "FirstSuccessfulStrategy", "BaseEvaluationStrategy", "strategyContext", "context", "result", "resolutions", "finalResolution", "ComparisonStrategy", "BaseEvaluationStrategy", "fallbackProvider", "onMismatch", "strategyContext", "context", "resolutions", "_a", "value", "fallbackResolution", "finalResolution", "mismatch", "i", "resolution", "GeneralError", "StatusTracker", "events", "providerEntry", "_a", "_b", "_c", "_d", "_e", "provider", "details", "name", "statuses", "status", "currentStatus", "newStatus", "MultiProvider", "_MultiProvider", "constructorProviders", "evaluationStrategy", "FirstMatchStrategy", "logger", "DefaultLogger", "OpenFeatureEventEmitter", "StatusTracker", "HookExecutor", "aggregateMetadata", "acc", "name", "__spreadProps", "__spreadValues", "_a", "_b", "providersByName", "constructorProvider", "providerName", "candidateName", "useIndexedNames", "i", "indexedName", "context", "__async", "result", "provider", "throwAggregateErrorFromPromiseResults", "oldContext", "newContext", "providerEntry", "flagKey", "defaultValue", "trackingEventName", "trackingEventDetails", "strategyContext", "error", "flagType", "hookContext", "hookHints", "GeneralError", "results", "shouldEvaluateNext", "resolutions", "r", "finalResult", "constructAggregateError", "evaluationResult", "resolution", "evaluationDetails", "resolutionDetails", "hints", "err", "flagMetadata", "errorMessage", "StandardResolutionReasons", "OpenFeatureClient", "providerAccessor", "providerStatusAccessor", "emitterAccessor", "apiContextAccessor", "apiHooksAccessor", "globalLogger", "options", "_a", "_b", "eventType", "handler", "statusMatchesEvent", "err", "notificationType", "logger", "SafeLogger", "hooks", "flagKey", "defaultValue", "occurrenceKey", "occurrenceDetails", "_c", "frozenContext", "__spreadValues", "resolver", "flagType", "allHooks", "allHooksReversed", "context", "hookContexts", "MapHookData", "evaluationDetails", "resolution", "resolutionDetails", "__spreadProps", "instantiateErrorByErrorCode", "index", "hook", "hookContextIndex", "hookContext", "ProviderNotReadyError", "ProviderFatalError", "flagMetadata", "errorMessage", "StandardResolutionReasons", "GLOBAL_OPENFEATURE_API_KEY", "_globalThis", "OpenFeatureAPI", "_OpenFeatureAPI", "OpenFeatureCommonAPI", "ClientProviderStatus", "OpenFeatureEventEmitter", "ProviderWrapper", "NOOP_PROVIDER", "globalApi", "instance", "domain", "_a", "_b", "clientOrProvider", "providerContextOrUndefined", "contextOrUndefined", "__async", "stringOrUndefined", "provider", "objectOrUndefined", "context", "domainOrProvider", "maybePromise", "err", "domainOrContext", "wrapper", "oldContext", "unboundProviders", "acc", "allDomainRecords", "dm", "domainOrUndefined", "newContext", "version", "OpenFeatureClient", "__superGet", "_c", "_d", "_e", "_f", "providerName", "emitter", "error", "message", "OpenFeature"]
|
|
7
7
|
}
|