@openfeature/server-sdk 1.17.1 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,8 +16,8 @@
16
16
  <img alt="Specification" src="https://img.shields.io/static/v1?label=specification&message=v0.8.0&color=yellow&style=for-the-badge" />
17
17
  </a>
18
18
  <!-- x-release-please-start-version -->
19
- <a href="https://github.com/open-feature/js-sdk/releases/tag/server-sdk-v1.17.1">
20
- <img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.17.1&color=blue&style=for-the-badge" />
19
+ <a href="https://github.com/open-feature/js-sdk/releases/tag/server-sdk-v1.19.0">
20
+ <img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.19.0&color=blue&style=for-the-badge" />
21
21
  </a>
22
22
  <!-- x-release-please-end -->
23
23
  <br/>
@@ -75,7 +75,11 @@ yarn add @openfeature/server-sdk @openfeature/core
75
75
  import { OpenFeature } from '@openfeature/server-sdk';
76
76
 
77
77
  // Register your feature flag provider
78
- await OpenFeature.setProviderAndWait(new YourProviderOfChoice());
78
+ try {
79
+ await OpenFeature.setProviderAndWait(new YourProviderOfChoice());
80
+ } catch (error) {
81
+ console.error('Failed to initialize provider:', error);
82
+ }
79
83
 
80
84
  // create a new client
81
85
  const client = OpenFeature.getClient();
package/dist/cjs/index.js CHANGED
@@ -225,7 +225,7 @@ var OpenFeatureClient = class {
225
225
  get providerStatus() {
226
226
  return this.providerStatusAccessor();
227
227
  }
228
- addHandler(eventType, handler) {
228
+ addHandler(eventType, handler, options) {
229
229
  var _a;
230
230
  this.emitterAccessor().addHandler(eventType, handler);
231
231
  const shouldRunNow = (0, import_core4.statusMatchesEvent)(eventType, this._providerStatus);
@@ -240,6 +240,11 @@ var OpenFeatureClient = class {
240
240
  (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
241
241
  }
242
242
  }
243
+ if ((options == null ? void 0 : options.signal) && typeof options.signal.addEventListener === "function") {
244
+ options.signal.addEventListener("abort", () => {
245
+ this.removeHandler(eventType, handler);
246
+ });
247
+ }
243
248
  }
244
249
  removeHandler(eventType, handler) {
245
250
  this.emitterAccessor().removeHandler(eventType, handler);
@@ -349,18 +354,21 @@ var OpenFeatureClient = class {
349
354
  ];
350
355
  const allHooksReversed = [...allHooks].reverse();
351
356
  const mergedContext = this.mergeContexts(invocationContext);
352
- const hookContext = {
353
- flagKey,
354
- defaultValue,
355
- flagValueType: flagType,
356
- clientMetadata: this.metadata,
357
- providerMetadata: this._provider.metadata,
358
- context: mergedContext,
359
- logger: this._logger
360
- };
357
+ const hookContexts = allHooksReversed.map(
358
+ () => Object.freeze({
359
+ flagKey,
360
+ defaultValue,
361
+ flagValueType: flagType,
362
+ clientMetadata: this.metadata,
363
+ providerMetadata: this._provider.metadata,
364
+ context: mergedContext,
365
+ logger: this._logger,
366
+ hookData: new import_core4.MapHookData()
367
+ })
368
+ );
361
369
  let evaluationDetails;
362
370
  try {
363
- const frozenContext = yield this.beforeHooks(allHooks, hookContext, options);
371
+ const frozenContext = yield this.beforeHooks(allHooks, hookContexts, mergedContext, options);
364
372
  this.shortCircuitIfNotReady();
365
373
  const resolution = yield resolver.call(this._provider, flagKey, defaultValue, frozenContext, this._logger);
366
374
  const resolutionDetails = __spreadProps(__spreadValues({}, resolution), {
@@ -369,43 +377,54 @@ var OpenFeatureClient = class {
369
377
  });
370
378
  if (resolutionDetails.errorCode) {
371
379
  const err = (0, import_core4.instantiateErrorByErrorCode)(resolutionDetails.errorCode, resolutionDetails.errorMessage);
372
- yield this.errorHooks(allHooksReversed, hookContext, err, options);
380
+ yield this.errorHooks(allHooksReversed, hookContexts, err, options);
373
381
  evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata);
374
382
  } else {
375
- yield this.afterHooks(allHooksReversed, hookContext, resolutionDetails, options);
383
+ yield this.afterHooks(allHooksReversed, hookContexts, resolutionDetails, options);
376
384
  evaluationDetails = resolutionDetails;
377
385
  }
378
386
  } catch (err) {
379
- yield this.errorHooks(allHooksReversed, hookContext, err, options);
387
+ yield this.errorHooks(allHooksReversed, hookContexts, err, options);
380
388
  evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err);
381
389
  }
382
- yield this.finallyHooks(allHooksReversed, hookContext, evaluationDetails, options);
390
+ yield this.finallyHooks(allHooksReversed, hookContexts, evaluationDetails, options);
383
391
  return evaluationDetails;
384
392
  });
385
393
  }
386
- beforeHooks(hooks, hookContext, options) {
394
+ beforeHooks(hooks, hookContexts, mergedContext, options) {
387
395
  return __async(this, null, function* () {
388
396
  var _a;
389
- for (const hook of hooks) {
390
- Object.freeze(hookContext);
391
- Object.assign(hookContext.context, __spreadValues(__spreadValues({}, hookContext.context), yield (_a = hook == null ? void 0 : hook.before) == null ? void 0 : _a.call(hook, hookContext, Object.freeze(options.hookHints))));
397
+ let accumulatedContext = mergedContext;
398
+ for (const [index, hook] of hooks.entries()) {
399
+ const hookContextIndex = hooks.length - 1 - index;
400
+ const hookContext = hookContexts[hookContextIndex];
401
+ Object.assign(hookContext.context, accumulatedContext);
402
+ const hookResult = yield (_a = hook == null ? void 0 : hook.before) == null ? void 0 : _a.call(hook, hookContext, Object.freeze(options.hookHints));
403
+ if (hookResult) {
404
+ accumulatedContext = __spreadValues(__spreadValues({}, accumulatedContext), hookResult);
405
+ for (let i = 0; i < hooks.length; i++) {
406
+ Object.assign(hookContexts[hookContextIndex].context, accumulatedContext);
407
+ }
408
+ }
392
409
  }
393
- return Object.freeze(hookContext.context);
410
+ return Object.freeze(accumulatedContext);
394
411
  });
395
412
  }
396
- afterHooks(hooks, hookContext, evaluationDetails, options) {
413
+ afterHooks(hooks, hookContexts, evaluationDetails, options) {
397
414
  return __async(this, null, function* () {
398
415
  var _a;
399
- for (const hook of hooks) {
416
+ for (const [index, hook] of hooks.entries()) {
417
+ const hookContext = hookContexts[index];
400
418
  yield (_a = hook == null ? void 0 : hook.after) == null ? void 0 : _a.call(hook, hookContext, evaluationDetails, options.hookHints);
401
419
  }
402
420
  });
403
421
  }
404
- errorHooks(hooks, hookContext, err, options) {
422
+ errorHooks(hooks, hookContexts, err, options) {
405
423
  return __async(this, null, function* () {
406
424
  var _a;
407
- for (const hook of hooks) {
425
+ for (const [index, hook] of hooks.entries()) {
408
426
  try {
427
+ const hookContext = hookContexts[index];
409
428
  yield (_a = hook == null ? void 0 : hook.error) == null ? void 0 : _a.call(hook, hookContext, err, options.hookHints);
410
429
  } catch (err2) {
411
430
  this._logger.error(`Unhandled error during 'error' hook: ${err2}`);
@@ -417,11 +436,12 @@ var OpenFeatureClient = class {
417
436
  }
418
437
  });
419
438
  }
420
- finallyHooks(hooks, hookContext, evaluationDetails, options) {
439
+ finallyHooks(hooks, hookContexts, evaluationDetails, options) {
421
440
  return __async(this, null, function* () {
422
441
  var _a;
423
- for (const hook of hooks) {
442
+ for (const [index, hook] of hooks.entries()) {
424
443
  try {
444
+ const hookContext = hookContexts[index];
425
445
  yield (_a = hook == null ? void 0 : hook.finally) == null ? void 0 : _a.call(hook, hookContext, evaluationDetails, options.hookHints);
426
446
  } catch (err) {
427
447
  this._logger.error(`Unhandled error during 'finally' hook: ${err}`);
@@ -563,6 +583,9 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends import_core7.OpenFeatureCommo
563
583
  });
564
584
  return this;
565
585
  }
586
+ getProvider(domain) {
587
+ return this.getProviderForClient(domain);
588
+ }
566
589
  setContext(context) {
567
590
  this._context = context;
568
591
  return this;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts", "../../src/provider/provider.ts", "../../src/provider/no-op-provider.ts", "../../src/provider/in-memory-provider/in-memory-provider.ts", "../../src/provider/in-memory-provider/variant-not-found-error.ts", "../../src/open-feature.ts", "../../src/client/internal/open-feature-client.ts", "../../src/events/open-feature-event-emitter.ts", "../../src/events/events.ts", "../../src/transaction-context/no-op-transaction-context-propagator.ts", "../../src/transaction-context/async-local-storage-transaction-context-propagator.ts"],
4
- "sourcesContent": ["export * from './client';\nexport * from './provider';\nexport * from './evaluation';\nexport * from './open-feature';\nexport * from './transaction-context';\nexport * from './events';\nexport * from './hooks';\nexport * from './tracking';\nexport * from '@openfeature/core';\n", "import type {\n CommonProvider,\n EvaluationContext,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n ServerProviderStatus,\n} from '@openfeature/core';\nimport type { Hook } from '../hooks';\n\nexport { ServerProviderStatus as ProviderStatus };\n\n/**\n * Interface that providers must implement to resolve flag values for their particular\n * backend or vendor.\n *\n * Implementation for resolving all the required flag types must be defined.\n */\nexport interface Provider extends CommonProvider<ServerProviderStatus> {\n /**\n * A provider hook exposes a mechanism for provider authors to register hooks\n * to tap into various stages of the flag evaluation lifecycle. These hooks can\n * be used to perform side effects and mutate the context for purposes of the\n * provider. Provider hooks are not configured or controlled by the application author.\n */\n readonly hooks?: Hook[];\n\n /**\n * Resolve a boolean flag and its evaluation details.\n */\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<boolean>>;\n\n /**\n * Resolve a string flag and its evaluation details.\n */\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<string>>;\n\n /**\n * Resolve a numeric flag and its evaluation details.\n */\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<number>>;\n\n /**\n * Resolve and parse an object flag and its evaluation details.\n */\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<T>>;\n}\n", "import type { JsonValue, ResolutionDetails } from '@openfeature/core';\nimport type { Provider } from './provider';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): Promise<ResolutionDetails<boolean>> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): Promise<ResolutionDetails<string>> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): Promise<ResolutionDetails<number>> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): Promise<ResolutionDetails<T>> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return Promise.resolve({\n value: defaultValue,\n reason: REASON_NO_OP,\n });\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import type {\n EvaluationContext,\n FlagValueType,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n FlagNotFoundError,\n GeneralError,\n OpenFeatureError,\n StandardResolutionReasons,\n TypeMismatchError\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport type { Flag, FlagConfiguration } from './flag-configuration';\nimport { VariantFoundError } from './variant-not-found-error';\nimport { OpenFeatureEventEmitter, ProviderEvents } from '../..';\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 = 'server';\n readonly metadata = {\n name: 'in-memory',\n } as const;\n private _flagConfiguration: FlagConfiguration;\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 putConfiguration(flagConfiguration: FlagConfiguration) {\n const flagsChanged = Object.entries(flagConfiguration)\n .filter(([key, value]) => this._flagConfiguration[key] !== value)\n .map(([key]) => key);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<boolean>> {\n return this.resolveFlagWithReason<boolean>(flagKey, defaultValue, context, logger);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<number>> {\n return this.resolveFlagWithReason<number>(flagKey, defaultValue, context, logger);\n }\n\n async resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<string>> {\n return this.resolveFlagWithReason<string>(flagKey, defaultValue, context, logger);\n }\n\n async resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<T>> {\n return this.resolveFlagWithReason<T>(flagKey, defaultValue, context, logger);\n }\n\n private async resolveFlagWithReason<T extends JsonValue | FlagValueType>(\n flagKey: string,\n defaultValue: T,\n ctx?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<T>> {\n try {\n const resolutionResult = this.lookupFlagValue(flagKey, defaultValue, ctx, logger);\n\n if (typeof resolutionResult?.value != typeof defaultValue) {\n throw new TypeMismatchError();\n }\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 defaultValue: T,\n ctx?: 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 const flagSpec: Flag = this._flagConfiguration[flagKey];\n\n if (flagSpec.disabled) {\n return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };\n }\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 if (value === undefined) {\n const message = `no value associated with variant ${variant}`;\n logger?.error(message);\n throw new VariantFoundError(message);\n }\n\n return {\n value: value as T,\n ...(variant && { variant }),\n reason: isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC,\n };\n }\n}\n", "import { ErrorCode, OpenFeatureError } from '@openfeature/core';\n\n/**\n * A custom error for the in-memory provider.\n * Indicates the resolved or default variant doesn't exist.\n */\nexport class VariantFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, VariantFoundError.prototype);\n this.name = 'VariantFoundError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import type {\n EvaluationContext,\n ManageContext,\n ServerProviderStatus} 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 } from './events';\nimport type { Hook } from './hooks';\nimport type { Provider} from './provider';\nimport { NOOP_PROVIDER, ProviderStatus } from './provider';\nimport type {\n ManageTransactionContextPropagator,\n TransactionContext,\n TransactionContextPropagator} from './transaction-context';\nimport {\n NOOP_TRANSACTION_CONTEXT_PROPAGATOR\n} from './transaction-context';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/js-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI\n extends OpenFeatureCommonAPI<ServerProviderStatus, Provider, Hook>\n implements\n ManageContext<OpenFeatureAPI>,\n ManageTransactionContextPropagator<OpenFeatureCommonAPI<ServerProviderStatus, Provider>>\n{\n protected _statusEnumType: typeof ProviderStatus = ProviderStatus;\n protected _apiEmitter = new OpenFeatureEventEmitter();\n protected _defaultProvider: ProviderWrapper<Provider, ServerProviderStatus> = new ProviderWrapper(\n NOOP_PROVIDER,\n ProviderStatus.NOT_READY,\n this._statusEnumType,\n );\n protected _domainScopedProviders: Map<string, ProviderWrapper<Provider, ServerProviderStatus>> = new Map();\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n private _transactionContextPropagator: TransactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;\n\n private constructor() {\n super('server');\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n private getProviderStatus(domain?: string): ProviderStatus {\n if (!domain) {\n return this._defaultProvider.status;\n }\n\n return this._domainScopedProviders.get(domain)?.status ?? this._defaultProvider.status;\n }\n\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(provider: Provider): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider): Promise<void>;\n async setProviderAndWait(domainOrProvider?: string | Provider, providerOrUndefined?: Provider): Promise<void> {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerOrUndefined)\n : objectOrUndefined<Provider>(domainOrProvider);\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 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 setProvider(clientOrProvider?: string | Provider, providerOrUndefined?: Provider): this {\n const domain = stringOrUndefined(clientOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerOrUndefined)\n : objectOrUndefined<Provider>(clientOrProvider);\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\n return this;\n }\n\n setContext(context: EvaluationContext): this {\n this._context = context;\n return this;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n /**\n * A factory function for creating new domainless OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * All domainless or unbound clients use the default provider set via {@link this.setProvider setProvider}.\n * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(context?: EvaluationContext): Client;\n /**\n * A factory function for creating new domain scoped OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * If there is already a provider bound to this domain via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that domain.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(domain: string, context?: EvaluationContext): Client;\n /**\n * A factory function for creating new domain scoped OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * If there is already a provider bound to this domain via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that domain.\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 * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(domain: string, version: string, context?: EvaluationContext): Client;\n getClient(\n domainOrContext?: string | EvaluationContext,\n versionOrContext?: string | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Client {\n const domain = stringOrUndefined(domainOrContext);\n const version = stringOrUndefined(versionOrContext);\n const context =\n objectOrUndefined<EvaluationContext>(domainOrContext) ??\n objectOrUndefined<EvaluationContext>(versionOrContext) ??\n objectOrUndefined<EvaluationContext>(contextOrUndefined);\n\n return new OpenFeatureClient(\n () => this.getProviderForClient(domain),\n () => this.getProviderStatus(domain),\n () => this.buildAndCacheEventEmitterForClient(domain),\n () => this.getContext(),\n () => this.getHooks(),\n () => this.getTransactionContext(),\n () => this._logger,\n { domain, version },\n context,\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n clearProviders(): Promise<void> {\n return super.clearProvidersAndSetDefault(NOOP_PROVIDER);\n }\n\n setTransactionContextPropagator(\n transactionContextPropagator: TransactionContextPropagator,\n ): OpenFeatureCommonAPI<ServerProviderStatus, Provider> {\n const baseMessage = 'Invalid TransactionContextPropagator, will not be set: ';\n if (typeof transactionContextPropagator?.getTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);\n } else if (typeof transactionContextPropagator?.setTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);\n } else {\n this._transactionContextPropagator = transactionContextPropagator;\n }\n return this;\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n transactionContext: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);\n }\n\n getTransactionContext(): TransactionContext {\n try {\n return this._transactionContextPropagator.getTransactionContext();\n } catch (err: unknown) {\n const error = err as Error | undefined;\n this._logger.error(`Error getting transaction context: ${error?.message}, returning empty context.`);\n this._logger.error(error?.stack);\n return {};\n }\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import type {\n ClientMetadata,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n TrackingEventDetails,\n OpenFeatureError,\n FlagMetadata,\n ResolutionDetails,\n} from '@openfeature/core';\nimport {\n ErrorCode,\n ProviderFatalError,\n ProviderNotReadyError,\n SafeLogger,\n StandardResolutionReasons,\n instantiateErrorByErrorCode,\n statusMatchesEvent,\n} from '@openfeature/core';\nimport type { FlagEvaluationOptions } from '../../evaluation';\nimport type { ProviderEvents } from '../../events';\nimport type { InternalEventEmitter } from '../../events/internal/internal-event-emitter';\nimport type { Hook } from '../../hooks';\nimport type { Provider } from '../../provider';\nimport { ProviderStatus } from '../../provider';\nimport type { Client } from './../client';\n\ntype OpenFeatureClientOptions = {\n /**\n * @deprecated Use `domain` instead.\n */\n name?: string;\n domain?: string;\n version?: string;\n};\n\n/**\n * This implementation of the {@link Client} is meant to only be instantiated by the SDK.\n * It should not be used outside the SDK and so should not be exported.\n * @internal\n */\nexport class OpenFeatureClient implements Client {\n private _context: EvaluationContext;\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // we always want the client to use the current provider,\n // so pass a function to always access the currently registered one.\n private readonly providerAccessor: () => Provider,\n private readonly providerStatusAccessor: () => ProviderStatus,\n private readonly emitterAccessor: () => InternalEventEmitter,\n private readonly apiContextAccessor: () => EvaluationContext,\n private readonly apiHooksAccessor: () => Hook[],\n private readonly transactionContextAccessor: () => EvaluationContext,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n context: EvaluationContext = {},\n ) {\n this._context = context;\n }\n\n get metadata(): ClientMetadata {\n return {\n // Use domain if name is not provided\n name: this.options.domain ?? this.options.name,\n domain: this.options.domain ?? this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n get providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const shouldRunNow = statusMatchesEvent(eventType, this._providerStatus);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({\n clientName: this.metadata.name,\n domain: this.metadata.domain,\n providerName: this._provider.metadata.name,\n });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler(eventType: ProviderEvents, handler: EventHandler) {\n this.emitterAccessor().removeHandler(eventType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): OpenFeatureClient {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n setContext(context: EvaluationContext): OpenFeatureClient {\n this._context = context;\n return this;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n addHooks(...hooks: Hook[]): OpenFeatureClient {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook[] {\n return this._hooks;\n }\n\n clearHooks(): OpenFeatureClient {\n this._hooks = [];\n return this;\n }\n\n async getBooleanValue(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<boolean> {\n return (await this.getBooleanDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<boolean>> {\n return this.evaluate<boolean>(\n flagKey,\n this._provider.resolveBooleanEvaluation,\n defaultValue,\n 'boolean',\n context,\n options,\n );\n }\n\n async getStringValue<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getStringDetails<T>(flagKey, defaultValue, context, options)).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => Promise<EvaluationDetails<T>>,\n defaultValue,\n 'string',\n context,\n options,\n );\n }\n\n async getNumberValue<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getNumberDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => Promise<EvaluationDetails<T>>,\n defaultValue,\n 'number',\n context,\n options,\n );\n }\n\n async getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getObjectDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', context, options);\n }\n\n track(occurrenceKey: string, context: EvaluationContext = {}, occurrenceDetails: TrackingEventDetails = {}): void {\n try {\n this.shortCircuitIfNotReady();\n\n if (typeof this._provider.track === 'function') {\n // freeze the merged context\n const frozenContext = Object.freeze(this.mergeContexts(context));\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 async evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ) => Promise<ResolutionDetails<T>>,\n defaultValue: T,\n flagType: FlagValueType,\n invocationContext: EvaluationContext = {},\n options: FlagEvaluationOptions = {},\n ): Promise<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 mergedContext = this.mergeContexts(invocationContext);\n\n // this reference cannot change during the course of evaluation\n // it may be used as a key in WeakMaps\n const hookContext: Readonly<HookContext> = {\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: this._provider.metadata,\n context: mergedContext,\n logger: this._logger,\n };\n\n let evaluationDetails: EvaluationDetails<T>;\n\n try {\n const frozenContext = await this.beforeHooks(allHooks, hookContext, options);\n\n this.shortCircuitIfNotReady();\n\n // run the referenced resolver, binding the provider.\n const resolution = await resolver.call(this._provider, flagKey, defaultValue, frozenContext, 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 await this.errorHooks(allHooksReversed, hookContext, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata);\n } else {\n await this.afterHooks(allHooksReversed, hookContext, resolutionDetails, options);\n evaluationDetails = resolutionDetails;\n }\n } catch (err: unknown) {\n await this.errorHooks(allHooksReversed, hookContext, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err);\n }\n\n await this.finallyHooks(allHooksReversed, hookContext, evaluationDetails, options);\n return evaluationDetails;\n }\n\n private async beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n for (const hook of hooks) {\n // freeze the hookContext\n Object.freeze(hookContext);\n\n // use Object.assign to avoid modification of frozen hookContext\n Object.assign(hookContext.context, {\n ...hookContext.context,\n ...(await hook?.before?.(hookContext, Object.freeze(options.hookHints))),\n });\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(hookContext.context);\n }\n\n private async afterHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks) {\n await hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private async errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const hook of hooks) {\n try {\n await 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 async finallyHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks) {\n try {\n await 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 _providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n\n private mergeContexts(invocationContext: EvaluationContext) {\n // merge global and client contexts\n return {\n ...this.apiContextAccessor(),\n ...this.transactionContextAccessor(),\n ...this._context,\n ...invocationContext,\n };\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 { GenericEventEmitter } from '@openfeature/core';\nimport { EventEmitter } from 'node:events';\nimport type { ProviderEvents } 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<ProviderEvents> {\n protected readonly eventEmitter = new EventEmitter({ captureRejections: true });\n\n constructor() {\n super();\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n};", "import { ServerProviderEvents } from '@openfeature/core';\n\nexport { ServerProviderEvents as ProviderEvents };", "import type { EvaluationContext } from '@openfeature/core';\nimport type { TransactionContext, TransactionContextPropagator } from './transaction-context';\n\nclass NoopTransactionContextPropagator implements TransactionContextPropagator {\n getTransactionContext(): EvaluationContext {\n return {};\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n _: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n callback(...args);\n }\n}\n\nexport const NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();\n", "import type { EvaluationContext } from '@openfeature/core';\nimport type { TransactionContext, TransactionContextPropagator } from './transaction-context';\nimport { AsyncLocalStorage } from 'async_hooks';\n\nexport class AsyncLocalStorageTransactionContextPropagator implements TransactionContextPropagator {\n private asyncLocalStorage = new AsyncLocalStorage<EvaluationContext>();\n\n getTransactionContext(): EvaluationContext {\n return this.asyncLocalStorage.getStore() ?? {};\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n transactionContext: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n this.asyncLocalStorage.run(transactionContext, callback, ...args);\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export * from './client';\nexport * from './provider';\nexport * from './evaluation';\nexport * from './open-feature';\nexport * from './transaction-context';\nexport * from './events';\nexport * from './hooks';\nexport * from './tracking';\nexport * from '@openfeature/core';\n", "import type {\n CommonProvider,\n EvaluationContext,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n ServerProviderStatus,\n} from '@openfeature/core';\nimport type { Hook } from '../hooks';\n\nexport { ServerProviderStatus as ProviderStatus };\n\n/**\n * Interface that providers must implement to resolve flag values for their particular\n * backend or vendor.\n *\n * Implementation for resolving all the required flag types must be defined.\n */\nexport interface Provider extends CommonProvider<ServerProviderStatus> {\n /**\n * A provider hook exposes a mechanism for provider authors to register hooks\n * to tap into various stages of the flag evaluation lifecycle. These hooks can\n * be used to perform side effects and mutate the context for purposes of the\n * provider. Provider hooks are not configured or controlled by the application author.\n */\n readonly hooks?: Hook[];\n\n /**\n * Resolve a boolean flag and its evaluation details.\n */\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<boolean>>;\n\n /**\n * Resolve a string flag and its evaluation details.\n */\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<string>>;\n\n /**\n * Resolve a numeric flag and its evaluation details.\n */\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<number>>;\n\n /**\n * Resolve and parse an object flag and its evaluation details.\n */\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<T>>;\n}\n", "import type { JsonValue, ResolutionDetails } from '@openfeature/core';\nimport type { Provider } from './provider';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): Promise<ResolutionDetails<boolean>> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): Promise<ResolutionDetails<string>> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): Promise<ResolutionDetails<number>> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): Promise<ResolutionDetails<T>> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return Promise.resolve({\n value: defaultValue,\n reason: REASON_NO_OP,\n });\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import type {\n EvaluationContext,\n FlagValueType,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n FlagNotFoundError,\n GeneralError,\n OpenFeatureError,\n StandardResolutionReasons,\n TypeMismatchError\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport type { Flag, FlagConfiguration } from './flag-configuration';\nimport { VariantFoundError } from './variant-not-found-error';\nimport { OpenFeatureEventEmitter, ProviderEvents } from '../..';\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 = 'server';\n readonly metadata = {\n name: 'in-memory',\n } as const;\n private _flagConfiguration: FlagConfiguration;\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 putConfiguration(flagConfiguration: FlagConfiguration) {\n const flagsChanged = Object.entries(flagConfiguration)\n .filter(([key, value]) => this._flagConfiguration[key] !== value)\n .map(([key]) => key);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<boolean>> {\n return this.resolveFlagWithReason<boolean>(flagKey, defaultValue, context, logger);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<number>> {\n return this.resolveFlagWithReason<number>(flagKey, defaultValue, context, logger);\n }\n\n async resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<string>> {\n return this.resolveFlagWithReason<string>(flagKey, defaultValue, context, logger);\n }\n\n async resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<T>> {\n return this.resolveFlagWithReason<T>(flagKey, defaultValue, context, logger);\n }\n\n private async resolveFlagWithReason<T extends JsonValue | FlagValueType>(\n flagKey: string,\n defaultValue: T,\n ctx?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<T>> {\n try {\n const resolutionResult = this.lookupFlagValue(flagKey, defaultValue, ctx, logger);\n\n if (typeof resolutionResult?.value != typeof defaultValue) {\n throw new TypeMismatchError();\n }\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 defaultValue: T,\n ctx?: 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 const flagSpec: Flag = this._flagConfiguration[flagKey];\n\n if (flagSpec.disabled) {\n return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };\n }\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 if (value === undefined) {\n const message = `no value associated with variant ${variant}`;\n logger?.error(message);\n throw new VariantFoundError(message);\n }\n\n return {\n value: value as T,\n ...(variant && { variant }),\n reason: isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC,\n };\n }\n}\n", "import { ErrorCode, OpenFeatureError } from '@openfeature/core';\n\n/**\n * A custom error for the in-memory provider.\n * Indicates the resolved or default variant doesn't exist.\n */\nexport class VariantFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, VariantFoundError.prototype);\n this.name = 'VariantFoundError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import type {\n EvaluationContext,\n ManageContext,\n ServerProviderStatus} 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 } from './events';\nimport type { Hook } from './hooks';\nimport type { Provider} from './provider';\nimport { NOOP_PROVIDER, ProviderStatus } from './provider';\nimport type {\n ManageTransactionContextPropagator,\n TransactionContext,\n TransactionContextPropagator} from './transaction-context';\nimport {\n NOOP_TRANSACTION_CONTEXT_PROPAGATOR\n} from './transaction-context';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/js-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI\n extends OpenFeatureCommonAPI<ServerProviderStatus, Provider, Hook>\n implements\n ManageContext<OpenFeatureAPI>,\n ManageTransactionContextPropagator<OpenFeatureCommonAPI<ServerProviderStatus, Provider>>\n{\n protected _statusEnumType: typeof ProviderStatus = ProviderStatus;\n protected _apiEmitter = new OpenFeatureEventEmitter();\n protected _defaultProvider: ProviderWrapper<Provider, ServerProviderStatus> = new ProviderWrapper(\n NOOP_PROVIDER,\n ProviderStatus.NOT_READY,\n this._statusEnumType,\n );\n protected _domainScopedProviders: Map<string, ProviderWrapper<Provider, ServerProviderStatus>> = new Map();\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n private _transactionContextPropagator: TransactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;\n\n private constructor() {\n super('server');\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 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 async setProviderAndWait(domainOrProvider?: string | Provider, providerOrUndefined?: Provider): Promise<void> {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerOrUndefined)\n : objectOrUndefined<Provider>(domainOrProvider);\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 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 setProvider(clientOrProvider?: string | Provider, providerOrUndefined?: Provider): this {\n const domain = stringOrUndefined(clientOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerOrUndefined)\n : objectOrUndefined<Provider>(clientOrProvider);\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\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 setContext(context: EvaluationContext): this {\n this._context = context;\n return this;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n /**\n * A factory function for creating new domainless OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * All domainless or unbound clients use the default provider set via {@link this.setProvider setProvider}.\n * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(context?: EvaluationContext): Client;\n /**\n * A factory function for creating new domain scoped OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * If there is already a provider bound to this domain via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that domain.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(domain: string, context?: EvaluationContext): Client;\n /**\n * A factory function for creating new domain scoped OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * If there is already a provider bound to this domain via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that domain.\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 * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(domain: string, version: string, context?: EvaluationContext): Client;\n getClient(\n domainOrContext?: string | EvaluationContext,\n versionOrContext?: string | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Client {\n const domain = stringOrUndefined(domainOrContext);\n const version = stringOrUndefined(versionOrContext);\n const context =\n objectOrUndefined<EvaluationContext>(domainOrContext) ??\n objectOrUndefined<EvaluationContext>(versionOrContext) ??\n objectOrUndefined<EvaluationContext>(contextOrUndefined);\n\n return new OpenFeatureClient(\n () => this.getProviderForClient(domain),\n () => this.getProviderStatus(domain),\n () => this.buildAndCacheEventEmitterForClient(domain),\n () => this.getContext(),\n () => this.getHooks(),\n () => this.getTransactionContext(),\n () => this._logger,\n { domain, version },\n context,\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n clearProviders(): Promise<void> {\n return super.clearProvidersAndSetDefault(NOOP_PROVIDER);\n }\n\n setTransactionContextPropagator(\n transactionContextPropagator: TransactionContextPropagator,\n ): OpenFeatureCommonAPI<ServerProviderStatus, Provider> {\n const baseMessage = 'Invalid TransactionContextPropagator, will not be set: ';\n if (typeof transactionContextPropagator?.getTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);\n } else if (typeof transactionContextPropagator?.setTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);\n } else {\n this._transactionContextPropagator = transactionContextPropagator;\n }\n return this;\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n transactionContext: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);\n }\n\n getTransactionContext(): TransactionContext {\n try {\n return this._transactionContextPropagator.getTransactionContext();\n } catch (err: unknown) {\n const error = err as Error | undefined;\n this._logger.error(`Error getting transaction context: ${error?.message}, returning empty context.`);\n this._logger.error(error?.stack);\n return {};\n }\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import type {\n ClientMetadata,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n TrackingEventDetails,\n OpenFeatureError,\n 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 _context: EvaluationContext;\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // we always want the client to use the current provider,\n // so pass a function to always access the currently registered one.\n private readonly providerAccessor: () => Provider,\n private readonly providerStatusAccessor: () => ProviderStatus,\n private readonly emitterAccessor: () => InternalEventEmitter,\n private readonly apiContextAccessor: () => EvaluationContext,\n private readonly apiHooksAccessor: () => Hook[],\n private readonly transactionContextAccessor: () => EvaluationContext,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n context: EvaluationContext = {},\n ) {\n this._context = context;\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(eventType: ProviderEvents, handler: EventHandler) {\n this.emitterAccessor().removeHandler(eventType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): OpenFeatureClient {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n setContext(context: EvaluationContext): OpenFeatureClient {\n this._context = context;\n return this;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n addHooks(...hooks: Hook[]): OpenFeatureClient {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook[] {\n return this._hooks;\n }\n\n clearHooks(): OpenFeatureClient {\n this._hooks = [];\n return this;\n }\n\n async getBooleanValue(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<boolean> {\n return (await this.getBooleanDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<boolean>> {\n return this.evaluate<boolean>(\n flagKey,\n this._provider.resolveBooleanEvaluation,\n defaultValue,\n 'boolean',\n context,\n options,\n );\n }\n\n async getStringValue<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getStringDetails<T>(flagKey, defaultValue, context, options)).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => Promise<EvaluationDetails<T>>,\n defaultValue,\n 'string',\n context,\n options,\n );\n }\n\n async getNumberValue<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getNumberDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => Promise<EvaluationDetails<T>>,\n defaultValue,\n 'number',\n context,\n options,\n );\n }\n\n async getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getObjectDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', context, options);\n }\n\n track(occurrenceKey: string, context: EvaluationContext = {}, occurrenceDetails: TrackingEventDetails = {}): void {\n try {\n this.shortCircuitIfNotReady();\n\n if (typeof this._provider.track === 'function') {\n // freeze the merged context\n const frozenContext = Object.freeze(this.mergeContexts(context));\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 async evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ) => Promise<ResolutionDetails<T>>,\n defaultValue: T,\n flagType: FlagValueType,\n invocationContext: EvaluationContext = {},\n options: FlagEvaluationOptions = {},\n ): Promise<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 mergedContext = this.mergeContexts(invocationContext);\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: mergedContext,\n logger: this._logger,\n hookData: new MapHookData(),\n }),\n );\n\n let evaluationDetails: EvaluationDetails<T>;\n\n try {\n const frozenContext = await this.beforeHooks(allHooks, hookContexts, mergedContext, options);\n\n this.shortCircuitIfNotReady();\n\n // run the referenced resolver, binding the provider.\n const resolution = await resolver.call(this._provider, flagKey, defaultValue, frozenContext, 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 await this.errorHooks(allHooksReversed, hookContexts, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata);\n } else {\n await this.afterHooks(allHooksReversed, hookContexts, resolutionDetails, options);\n evaluationDetails = resolutionDetails;\n }\n } catch (err: unknown) {\n await this.errorHooks(allHooksReversed, hookContexts, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err);\n }\n\n await this.finallyHooks(allHooksReversed, hookContexts, evaluationDetails, options);\n return evaluationDetails;\n }\n\n private async beforeHooks(\n hooks: Hook[],\n hookContexts: HookContext[],\n mergedContext: EvaluationContext,\n options: FlagEvaluationOptions,\n ) {\n let accumulatedContext = mergedContext;\n\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\n // Update the context on the stable hook context object\n Object.assign(hookContext.context, accumulatedContext);\n\n const hookResult = await hook?.before?.(hookContext, Object.freeze(options.hookHints));\n if (hookResult) {\n accumulatedContext = {\n ...accumulatedContext,\n ...hookResult,\n };\n\n for (let i = 0; i < hooks.length; i++) {\n Object.assign(hookContexts[hookContextIndex].context, accumulatedContext);\n }\n }\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(accumulatedContext);\n }\n\n private async 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 await hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private async 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 await 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 async 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 await 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 _providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n\n private mergeContexts(invocationContext: EvaluationContext) {\n // merge global and client contexts\n return {\n ...this.apiContextAccessor(),\n ...this.transactionContextAccessor(),\n ...this._context,\n ...invocationContext,\n };\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 { GenericEventEmitter } from '@openfeature/core';\nimport { EventEmitter } from 'node:events';\nimport type { ProviderEvents } 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<ProviderEvents> {\n protected readonly eventEmitter = new EventEmitter({ captureRejections: true });\n\n constructor() {\n super();\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n};", "import { ServerProviderEvents } from '@openfeature/core';\n\nexport { ServerProviderEvents as ProviderEvents };", "import type { EvaluationContext } from '@openfeature/core';\nimport type { TransactionContext, TransactionContextPropagator } from './transaction-context';\n\nclass NoopTransactionContextPropagator implements TransactionContextPropagator {\n getTransactionContext(): EvaluationContext {\n return {};\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n _: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n callback(...args);\n }\n}\n\nexport const NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();\n", "import type { EvaluationContext } from '@openfeature/core';\nimport type { TransactionContext, TransactionContextPropagator } from './transaction-context';\nimport { AsyncLocalStorage } from 'async_hooks';\n\nexport class AsyncLocalStorageTransactionContextPropagator implements TransactionContextPropagator {\n private asyncLocalStorage = new AsyncLocalStorage<EvaluationContext>();\n\n getTransactionContext(): EvaluationContext {\n return this.asyncLocalStorage.getStore() ?? {};\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n transactionContext: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n this.asyncLocalStorage.run(transactionContext, callback, ...args);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_core", "import_core", "import_core", "import_core", "err", "import_core", "import_core"]
7
7
  }
package/dist/esm/index.js CHANGED
@@ -186,7 +186,8 @@ import {
186
186
  SafeLogger,
187
187
  StandardResolutionReasons as StandardResolutionReasons2,
188
188
  instantiateErrorByErrorCode,
189
- statusMatchesEvent
189
+ statusMatchesEvent,
190
+ MapHookData
190
191
  } from "@openfeature/core";
191
192
  var OpenFeatureClient = class {
192
193
  constructor(providerAccessor, providerStatusAccessor, emitterAccessor, apiContextAccessor, apiHooksAccessor, transactionContextAccessor, globalLogger, options, context = {}) {
@@ -214,7 +215,7 @@ var OpenFeatureClient = class {
214
215
  get providerStatus() {
215
216
  return this.providerStatusAccessor();
216
217
  }
217
- addHandler(eventType, handler) {
218
+ addHandler(eventType, handler, options) {
218
219
  var _a;
219
220
  this.emitterAccessor().addHandler(eventType, handler);
220
221
  const shouldRunNow = statusMatchesEvent(eventType, this._providerStatus);
@@ -229,6 +230,11 @@ var OpenFeatureClient = class {
229
230
  (_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
230
231
  }
231
232
  }
233
+ if ((options == null ? void 0 : options.signal) && typeof options.signal.addEventListener === "function") {
234
+ options.signal.addEventListener("abort", () => {
235
+ this.removeHandler(eventType, handler);
236
+ });
237
+ }
232
238
  }
233
239
  removeHandler(eventType, handler) {
234
240
  this.emitterAccessor().removeHandler(eventType, handler);
@@ -338,18 +344,21 @@ var OpenFeatureClient = class {
338
344
  ];
339
345
  const allHooksReversed = [...allHooks].reverse();
340
346
  const mergedContext = this.mergeContexts(invocationContext);
341
- const hookContext = {
342
- flagKey,
343
- defaultValue,
344
- flagValueType: flagType,
345
- clientMetadata: this.metadata,
346
- providerMetadata: this._provider.metadata,
347
- context: mergedContext,
348
- logger: this._logger
349
- };
347
+ const hookContexts = allHooksReversed.map(
348
+ () => Object.freeze({
349
+ flagKey,
350
+ defaultValue,
351
+ flagValueType: flagType,
352
+ clientMetadata: this.metadata,
353
+ providerMetadata: this._provider.metadata,
354
+ context: mergedContext,
355
+ logger: this._logger,
356
+ hookData: new MapHookData()
357
+ })
358
+ );
350
359
  let evaluationDetails;
351
360
  try {
352
- const frozenContext = yield this.beforeHooks(allHooks, hookContext, options);
361
+ const frozenContext = yield this.beforeHooks(allHooks, hookContexts, mergedContext, options);
353
362
  this.shortCircuitIfNotReady();
354
363
  const resolution = yield resolver.call(this._provider, flagKey, defaultValue, frozenContext, this._logger);
355
364
  const resolutionDetails = __spreadProps(__spreadValues({}, resolution), {
@@ -358,43 +367,54 @@ var OpenFeatureClient = class {
358
367
  });
359
368
  if (resolutionDetails.errorCode) {
360
369
  const err = instantiateErrorByErrorCode(resolutionDetails.errorCode, resolutionDetails.errorMessage);
361
- yield this.errorHooks(allHooksReversed, hookContext, err, options);
370
+ yield this.errorHooks(allHooksReversed, hookContexts, err, options);
362
371
  evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata);
363
372
  } else {
364
- yield this.afterHooks(allHooksReversed, hookContext, resolutionDetails, options);
373
+ yield this.afterHooks(allHooksReversed, hookContexts, resolutionDetails, options);
365
374
  evaluationDetails = resolutionDetails;
366
375
  }
367
376
  } catch (err) {
368
- yield this.errorHooks(allHooksReversed, hookContext, err, options);
377
+ yield this.errorHooks(allHooksReversed, hookContexts, err, options);
369
378
  evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err);
370
379
  }
371
- yield this.finallyHooks(allHooksReversed, hookContext, evaluationDetails, options);
380
+ yield this.finallyHooks(allHooksReversed, hookContexts, evaluationDetails, options);
372
381
  return evaluationDetails;
373
382
  });
374
383
  }
375
- beforeHooks(hooks, hookContext, options) {
384
+ beforeHooks(hooks, hookContexts, mergedContext, options) {
376
385
  return __async(this, null, function* () {
377
386
  var _a;
378
- for (const hook of hooks) {
379
- Object.freeze(hookContext);
380
- Object.assign(hookContext.context, __spreadValues(__spreadValues({}, hookContext.context), yield (_a = hook == null ? void 0 : hook.before) == null ? void 0 : _a.call(hook, hookContext, Object.freeze(options.hookHints))));
387
+ let accumulatedContext = mergedContext;
388
+ for (const [index, hook] of hooks.entries()) {
389
+ const hookContextIndex = hooks.length - 1 - index;
390
+ const hookContext = hookContexts[hookContextIndex];
391
+ Object.assign(hookContext.context, accumulatedContext);
392
+ const hookResult = yield (_a = hook == null ? void 0 : hook.before) == null ? void 0 : _a.call(hook, hookContext, Object.freeze(options.hookHints));
393
+ if (hookResult) {
394
+ accumulatedContext = __spreadValues(__spreadValues({}, accumulatedContext), hookResult);
395
+ for (let i = 0; i < hooks.length; i++) {
396
+ Object.assign(hookContexts[hookContextIndex].context, accumulatedContext);
397
+ }
398
+ }
381
399
  }
382
- return Object.freeze(hookContext.context);
400
+ return Object.freeze(accumulatedContext);
383
401
  });
384
402
  }
385
- afterHooks(hooks, hookContext, evaluationDetails, options) {
403
+ afterHooks(hooks, hookContexts, evaluationDetails, options) {
386
404
  return __async(this, null, function* () {
387
405
  var _a;
388
- for (const hook of hooks) {
406
+ for (const [index, hook] of hooks.entries()) {
407
+ const hookContext = hookContexts[index];
389
408
  yield (_a = hook == null ? void 0 : hook.after) == null ? void 0 : _a.call(hook, hookContext, evaluationDetails, options.hookHints);
390
409
  }
391
410
  });
392
411
  }
393
- errorHooks(hooks, hookContext, err, options) {
412
+ errorHooks(hooks, hookContexts, err, options) {
394
413
  return __async(this, null, function* () {
395
414
  var _a;
396
- for (const hook of hooks) {
415
+ for (const [index, hook] of hooks.entries()) {
397
416
  try {
417
+ const hookContext = hookContexts[index];
398
418
  yield (_a = hook == null ? void 0 : hook.error) == null ? void 0 : _a.call(hook, hookContext, err, options.hookHints);
399
419
  } catch (err2) {
400
420
  this._logger.error(`Unhandled error during 'error' hook: ${err2}`);
@@ -406,11 +426,12 @@ var OpenFeatureClient = class {
406
426
  }
407
427
  });
408
428
  }
409
- finallyHooks(hooks, hookContext, evaluationDetails, options) {
429
+ finallyHooks(hooks, hookContexts, evaluationDetails, options) {
410
430
  return __async(this, null, function* () {
411
431
  var _a;
412
- for (const hook of hooks) {
432
+ for (const [index, hook] of hooks.entries()) {
413
433
  try {
434
+ const hookContext = hookContexts[index];
414
435
  yield (_a = hook == null ? void 0 : hook.finally) == null ? void 0 : _a.call(hook, hookContext, evaluationDetails, options.hookHints);
415
436
  } catch (err) {
416
437
  this._logger.error(`Unhandled error during 'finally' hook: ${err}`);
@@ -552,6 +573,9 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends OpenFeatureCommonAPI {
552
573
  });
553
574
  return this;
554
575
  }
576
+ getProvider(domain) {
577
+ return this.getProviderForClient(domain);
578
+ }
555
579
  setContext(context) {
556
580
  this._context = context;
557
581
  return this;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/provider/provider.ts", "../../src/provider/no-op-provider.ts", "../../src/provider/in-memory-provider/in-memory-provider.ts", "../../src/provider/in-memory-provider/variant-not-found-error.ts", "../../src/open-feature.ts", "../../src/client/internal/open-feature-client.ts", "../../src/events/open-feature-event-emitter.ts", "../../src/events/events.ts", "../../src/transaction-context/no-op-transaction-context-propagator.ts", "../../src/transaction-context/async-local-storage-transaction-context-propagator.ts", "../../src/index.ts"],
4
- "sourcesContent": ["import type {\n CommonProvider,\n EvaluationContext,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n ServerProviderStatus,\n} from '@openfeature/core';\nimport type { Hook } from '../hooks';\n\nexport { ServerProviderStatus as ProviderStatus };\n\n/**\n * Interface that providers must implement to resolve flag values for their particular\n * backend or vendor.\n *\n * Implementation for resolving all the required flag types must be defined.\n */\nexport interface Provider extends CommonProvider<ServerProviderStatus> {\n /**\n * A provider hook exposes a mechanism for provider authors to register hooks\n * to tap into various stages of the flag evaluation lifecycle. These hooks can\n * be used to perform side effects and mutate the context for purposes of the\n * provider. Provider hooks are not configured or controlled by the application author.\n */\n readonly hooks?: Hook[];\n\n /**\n * Resolve a boolean flag and its evaluation details.\n */\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<boolean>>;\n\n /**\n * Resolve a string flag and its evaluation details.\n */\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<string>>;\n\n /**\n * Resolve a numeric flag and its evaluation details.\n */\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<number>>;\n\n /**\n * Resolve and parse an object flag and its evaluation details.\n */\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<T>>;\n}\n", "import type { JsonValue, ResolutionDetails } from '@openfeature/core';\nimport type { Provider } from './provider';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): Promise<ResolutionDetails<boolean>> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): Promise<ResolutionDetails<string>> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): Promise<ResolutionDetails<number>> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): Promise<ResolutionDetails<T>> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return Promise.resolve({\n value: defaultValue,\n reason: REASON_NO_OP,\n });\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import type {\n EvaluationContext,\n FlagValueType,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n FlagNotFoundError,\n GeneralError,\n OpenFeatureError,\n StandardResolutionReasons,\n TypeMismatchError\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport type { Flag, FlagConfiguration } from './flag-configuration';\nimport { VariantFoundError } from './variant-not-found-error';\nimport { OpenFeatureEventEmitter, ProviderEvents } from '../..';\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 = 'server';\n readonly metadata = {\n name: 'in-memory',\n } as const;\n private _flagConfiguration: FlagConfiguration;\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 putConfiguration(flagConfiguration: FlagConfiguration) {\n const flagsChanged = Object.entries(flagConfiguration)\n .filter(([key, value]) => this._flagConfiguration[key] !== value)\n .map(([key]) => key);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<boolean>> {\n return this.resolveFlagWithReason<boolean>(flagKey, defaultValue, context, logger);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<number>> {\n return this.resolveFlagWithReason<number>(flagKey, defaultValue, context, logger);\n }\n\n async resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<string>> {\n return this.resolveFlagWithReason<string>(flagKey, defaultValue, context, logger);\n }\n\n async resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<T>> {\n return this.resolveFlagWithReason<T>(flagKey, defaultValue, context, logger);\n }\n\n private async resolveFlagWithReason<T extends JsonValue | FlagValueType>(\n flagKey: string,\n defaultValue: T,\n ctx?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<T>> {\n try {\n const resolutionResult = this.lookupFlagValue(flagKey, defaultValue, ctx, logger);\n\n if (typeof resolutionResult?.value != typeof defaultValue) {\n throw new TypeMismatchError();\n }\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 defaultValue: T,\n ctx?: 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 const flagSpec: Flag = this._flagConfiguration[flagKey];\n\n if (flagSpec.disabled) {\n return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };\n }\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 if (value === undefined) {\n const message = `no value associated with variant ${variant}`;\n logger?.error(message);\n throw new VariantFoundError(message);\n }\n\n return {\n value: value as T,\n ...(variant && { variant }),\n reason: isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC,\n };\n }\n}\n", "import { ErrorCode, OpenFeatureError } from '@openfeature/core';\n\n/**\n * A custom error for the in-memory provider.\n * Indicates the resolved or default variant doesn't exist.\n */\nexport class VariantFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, VariantFoundError.prototype);\n this.name = 'VariantFoundError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import type {\n EvaluationContext,\n ManageContext,\n ServerProviderStatus} 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 } from './events';\nimport type { Hook } from './hooks';\nimport type { Provider} from './provider';\nimport { NOOP_PROVIDER, ProviderStatus } from './provider';\nimport type {\n ManageTransactionContextPropagator,\n TransactionContext,\n TransactionContextPropagator} from './transaction-context';\nimport {\n NOOP_TRANSACTION_CONTEXT_PROPAGATOR\n} from './transaction-context';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/js-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI\n extends OpenFeatureCommonAPI<ServerProviderStatus, Provider, Hook>\n implements\n ManageContext<OpenFeatureAPI>,\n ManageTransactionContextPropagator<OpenFeatureCommonAPI<ServerProviderStatus, Provider>>\n{\n protected _statusEnumType: typeof ProviderStatus = ProviderStatus;\n protected _apiEmitter = new OpenFeatureEventEmitter();\n protected _defaultProvider: ProviderWrapper<Provider, ServerProviderStatus> = new ProviderWrapper(\n NOOP_PROVIDER,\n ProviderStatus.NOT_READY,\n this._statusEnumType,\n );\n protected _domainScopedProviders: Map<string, ProviderWrapper<Provider, ServerProviderStatus>> = new Map();\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n private _transactionContextPropagator: TransactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;\n\n private constructor() {\n super('server');\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n private getProviderStatus(domain?: string): ProviderStatus {\n if (!domain) {\n return this._defaultProvider.status;\n }\n\n return this._domainScopedProviders.get(domain)?.status ?? this._defaultProvider.status;\n }\n\n /**\n * Sets the default provider for flag evaluations and returns a promise that resolves when the provider is ready.\n * This provider will be used by domainless clients and clients associated with domains to which no provider is bound.\n * Setting a provider supersedes the current provider used in new and existing unbound clients.\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(provider: Provider): Promise<void>;\n /**\n * Sets the provider that OpenFeature will use for flag evaluations on clients bound to the same domain.\n * A promise is returned that resolves when the provider is ready.\n * Setting a provider supersedes the current provider used in new and existing clients bound to the same domain.\n * @param {string} domain The name to identify the client\n * @param {Provider} provider The provider responsible for flag evaluations.\n * @returns {Promise<void>}\n * @throws Uncaught exceptions thrown by the provider during initialization.\n */\n setProviderAndWait(domain: string, provider: Provider): Promise<void>;\n async setProviderAndWait(domainOrProvider?: string | Provider, providerOrUndefined?: Provider): Promise<void> {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerOrUndefined)\n : objectOrUndefined<Provider>(domainOrProvider);\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 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 setProvider(clientOrProvider?: string | Provider, providerOrUndefined?: Provider): this {\n const domain = stringOrUndefined(clientOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerOrUndefined)\n : objectOrUndefined<Provider>(clientOrProvider);\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\n return this;\n }\n\n setContext(context: EvaluationContext): this {\n this._context = context;\n return this;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n /**\n * A factory function for creating new domainless OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * All domainless or unbound clients use the default provider set via {@link this.setProvider setProvider}.\n * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(context?: EvaluationContext): Client;\n /**\n * A factory function for creating new domain scoped OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * If there is already a provider bound to this domain via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that domain.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(domain: string, context?: EvaluationContext): Client;\n /**\n * A factory function for creating new domain scoped OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * If there is already a provider bound to this domain via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that domain.\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 * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(domain: string, version: string, context?: EvaluationContext): Client;\n getClient(\n domainOrContext?: string | EvaluationContext,\n versionOrContext?: string | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Client {\n const domain = stringOrUndefined(domainOrContext);\n const version = stringOrUndefined(versionOrContext);\n const context =\n objectOrUndefined<EvaluationContext>(domainOrContext) ??\n objectOrUndefined<EvaluationContext>(versionOrContext) ??\n objectOrUndefined<EvaluationContext>(contextOrUndefined);\n\n return new OpenFeatureClient(\n () => this.getProviderForClient(domain),\n () => this.getProviderStatus(domain),\n () => this.buildAndCacheEventEmitterForClient(domain),\n () => this.getContext(),\n () => this.getHooks(),\n () => this.getTransactionContext(),\n () => this._logger,\n { domain, version },\n context,\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n clearProviders(): Promise<void> {\n return super.clearProvidersAndSetDefault(NOOP_PROVIDER);\n }\n\n setTransactionContextPropagator(\n transactionContextPropagator: TransactionContextPropagator,\n ): OpenFeatureCommonAPI<ServerProviderStatus, Provider> {\n const baseMessage = 'Invalid TransactionContextPropagator, will not be set: ';\n if (typeof transactionContextPropagator?.getTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);\n } else if (typeof transactionContextPropagator?.setTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);\n } else {\n this._transactionContextPropagator = transactionContextPropagator;\n }\n return this;\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n transactionContext: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);\n }\n\n getTransactionContext(): TransactionContext {\n try {\n return this._transactionContextPropagator.getTransactionContext();\n } catch (err: unknown) {\n const error = err as Error | undefined;\n this._logger.error(`Error getting transaction context: ${error?.message}, returning empty context.`);\n this._logger.error(error?.stack);\n return {};\n }\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import type {\n ClientMetadata,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n TrackingEventDetails,\n OpenFeatureError,\n FlagMetadata,\n ResolutionDetails,\n} from '@openfeature/core';\nimport {\n ErrorCode,\n ProviderFatalError,\n ProviderNotReadyError,\n SafeLogger,\n StandardResolutionReasons,\n instantiateErrorByErrorCode,\n statusMatchesEvent,\n} from '@openfeature/core';\nimport type { FlagEvaluationOptions } from '../../evaluation';\nimport type { ProviderEvents } from '../../events';\nimport type { InternalEventEmitter } from '../../events/internal/internal-event-emitter';\nimport type { Hook } from '../../hooks';\nimport type { Provider } from '../../provider';\nimport { ProviderStatus } from '../../provider';\nimport type { Client } from './../client';\n\ntype OpenFeatureClientOptions = {\n /**\n * @deprecated Use `domain` instead.\n */\n name?: string;\n domain?: string;\n version?: string;\n};\n\n/**\n * This implementation of the {@link Client} is meant to only be instantiated by the SDK.\n * It should not be used outside the SDK and so should not be exported.\n * @internal\n */\nexport class OpenFeatureClient implements Client {\n private _context: EvaluationContext;\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // we always want the client to use the current provider,\n // so pass a function to always access the currently registered one.\n private readonly providerAccessor: () => Provider,\n private readonly providerStatusAccessor: () => ProviderStatus,\n private readonly emitterAccessor: () => InternalEventEmitter,\n private readonly apiContextAccessor: () => EvaluationContext,\n private readonly apiHooksAccessor: () => Hook[],\n private readonly transactionContextAccessor: () => EvaluationContext,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n context: EvaluationContext = {},\n ) {\n this._context = context;\n }\n\n get metadata(): ClientMetadata {\n return {\n // Use domain if name is not provided\n name: this.options.domain ?? this.options.name,\n domain: this.options.domain ?? this.options.name,\n version: this.options.version,\n providerMetadata: this.providerAccessor().metadata,\n };\n }\n\n get providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n addHandler(eventType: ProviderEvents, handler: EventHandler): void {\n this.emitterAccessor().addHandler(eventType, handler);\n const shouldRunNow = statusMatchesEvent(eventType, this._providerStatus);\n\n if (shouldRunNow) {\n // run immediately, we're in the matching state\n try {\n handler({\n clientName: this.metadata.name,\n domain: this.metadata.domain,\n providerName: this._provider.metadata.name,\n });\n } catch (err) {\n this._logger?.error('Error running event handler:', err);\n }\n }\n }\n\n removeHandler(eventType: ProviderEvents, handler: EventHandler) {\n this.emitterAccessor().removeHandler(eventType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): OpenFeatureClient {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n setContext(context: EvaluationContext): OpenFeatureClient {\n this._context = context;\n return this;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n addHooks(...hooks: Hook[]): OpenFeatureClient {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook[] {\n return this._hooks;\n }\n\n clearHooks(): OpenFeatureClient {\n this._hooks = [];\n return this;\n }\n\n async getBooleanValue(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<boolean> {\n return (await this.getBooleanDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<boolean>> {\n return this.evaluate<boolean>(\n flagKey,\n this._provider.resolveBooleanEvaluation,\n defaultValue,\n 'boolean',\n context,\n options,\n );\n }\n\n async getStringValue<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getStringDetails<T>(flagKey, defaultValue, context, options)).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => Promise<EvaluationDetails<T>>,\n defaultValue,\n 'string',\n context,\n options,\n );\n }\n\n async getNumberValue<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getNumberDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => Promise<EvaluationDetails<T>>,\n defaultValue,\n 'number',\n context,\n options,\n );\n }\n\n async getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getObjectDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', context, options);\n }\n\n track(occurrenceKey: string, context: EvaluationContext = {}, occurrenceDetails: TrackingEventDetails = {}): void {\n try {\n this.shortCircuitIfNotReady();\n\n if (typeof this._provider.track === 'function') {\n // freeze the merged context\n const frozenContext = Object.freeze(this.mergeContexts(context));\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 async evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ) => Promise<ResolutionDetails<T>>,\n defaultValue: T,\n flagType: FlagValueType,\n invocationContext: EvaluationContext = {},\n options: FlagEvaluationOptions = {},\n ): Promise<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 mergedContext = this.mergeContexts(invocationContext);\n\n // this reference cannot change during the course of evaluation\n // it may be used as a key in WeakMaps\n const hookContext: Readonly<HookContext> = {\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: this._provider.metadata,\n context: mergedContext,\n logger: this._logger,\n };\n\n let evaluationDetails: EvaluationDetails<T>;\n\n try {\n const frozenContext = await this.beforeHooks(allHooks, hookContext, options);\n\n this.shortCircuitIfNotReady();\n\n // run the referenced resolver, binding the provider.\n const resolution = await resolver.call(this._provider, flagKey, defaultValue, frozenContext, 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 await this.errorHooks(allHooksReversed, hookContext, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata);\n } else {\n await this.afterHooks(allHooksReversed, hookContext, resolutionDetails, options);\n evaluationDetails = resolutionDetails;\n }\n } catch (err: unknown) {\n await this.errorHooks(allHooksReversed, hookContext, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err);\n }\n\n await this.finallyHooks(allHooksReversed, hookContext, evaluationDetails, options);\n return evaluationDetails;\n }\n\n private async beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n for (const hook of hooks) {\n // freeze the hookContext\n Object.freeze(hookContext);\n\n // use Object.assign to avoid modification of frozen hookContext\n Object.assign(hookContext.context, {\n ...hookContext.context,\n ...(await hook?.before?.(hookContext, Object.freeze(options.hookHints))),\n });\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(hookContext.context);\n }\n\n private async afterHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks) {\n await hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private async errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const hook of hooks) {\n try {\n await 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 async finallyHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions,\n ) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks) {\n try {\n await 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 _providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n\n private mergeContexts(invocationContext: EvaluationContext) {\n // merge global and client contexts\n return {\n ...this.apiContextAccessor(),\n ...this.transactionContextAccessor(),\n ...this._context,\n ...invocationContext,\n };\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 { GenericEventEmitter } from '@openfeature/core';\nimport { EventEmitter } from 'node:events';\nimport type { ProviderEvents } 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<ProviderEvents> {\n protected readonly eventEmitter = new EventEmitter({ captureRejections: true });\n\n constructor() {\n super();\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n};", "import { ServerProviderEvents } from '@openfeature/core';\n\nexport { ServerProviderEvents as ProviderEvents };", "import type { EvaluationContext } from '@openfeature/core';\nimport type { TransactionContext, TransactionContextPropagator } from './transaction-context';\n\nclass NoopTransactionContextPropagator implements TransactionContextPropagator {\n getTransactionContext(): EvaluationContext {\n return {};\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n _: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n callback(...args);\n }\n}\n\nexport const NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();\n", "import type { EvaluationContext } from '@openfeature/core';\nimport type { TransactionContext, TransactionContextPropagator } from './transaction-context';\nimport { AsyncLocalStorage } from 'async_hooks';\n\nexport class AsyncLocalStorageTransactionContextPropagator implements TransactionContextPropagator {\n private asyncLocalStorage = new AsyncLocalStorage<EvaluationContext>();\n\n getTransactionContext(): EvaluationContext {\n return this.asyncLocalStorage.getStore() ?? {};\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n transactionContext: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n this.asyncLocalStorage.run(transactionContext, callback, ...args);\n }\n}\n", "export * from './client';\nexport * from './provider';\nexport * from './evaluation';\nexport * from './open-feature';\nexport * from './transaction-context';\nexport * from './events';\nexport * from './hooks';\nexport * from './tracking';\nexport * from '@openfeature/core';\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n CommonProvider,\n EvaluationContext,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n ServerProviderStatus,\n} from '@openfeature/core';\nimport type { Hook } from '../hooks';\n\nexport { ServerProviderStatus as ProviderStatus };\n\n/**\n * Interface that providers must implement to resolve flag values for their particular\n * backend or vendor.\n *\n * Implementation for resolving all the required flag types must be defined.\n */\nexport interface Provider extends CommonProvider<ServerProviderStatus> {\n /**\n * A provider hook exposes a mechanism for provider authors to register hooks\n * to tap into various stages of the flag evaluation lifecycle. These hooks can\n * be used to perform side effects and mutate the context for purposes of the\n * provider. Provider hooks are not configured or controlled by the application author.\n */\n readonly hooks?: Hook[];\n\n /**\n * Resolve a boolean flag and its evaluation details.\n */\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<boolean>>;\n\n /**\n * Resolve a string flag and its evaluation details.\n */\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<string>>;\n\n /**\n * Resolve a numeric flag and its evaluation details.\n */\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<number>>;\n\n /**\n * Resolve and parse an object flag and its evaluation details.\n */\n resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ): Promise<ResolutionDetails<T>>;\n}\n", "import type { JsonValue, ResolutionDetails } from '@openfeature/core';\nimport type { Provider } from './provider';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): Promise<ResolutionDetails<boolean>> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): Promise<ResolutionDetails<string>> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): Promise<ResolutionDetails<number>> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): Promise<ResolutionDetails<T>> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return Promise.resolve({\n value: defaultValue,\n reason: REASON_NO_OP,\n });\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import type {\n EvaluationContext,\n FlagValueType,\n JsonValue,\n Logger,\n ResolutionDetails} from '@openfeature/core';\nimport {\n FlagNotFoundError,\n GeneralError,\n OpenFeatureError,\n StandardResolutionReasons,\n TypeMismatchError\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport type { Flag, FlagConfiguration } from './flag-configuration';\nimport { VariantFoundError } from './variant-not-found-error';\nimport { OpenFeatureEventEmitter, ProviderEvents } from '../..';\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 = 'server';\n readonly metadata = {\n name: 'in-memory',\n } as const;\n private _flagConfiguration: FlagConfiguration;\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 putConfiguration(flagConfiguration: FlagConfiguration) {\n const flagsChanged = Object.entries(flagConfiguration)\n .filter(([key, value]) => this._flagConfiguration[key] !== value)\n .map(([key]) => key);\n\n this._flagConfiguration = { ...flagConfiguration };\n this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<boolean>> {\n return this.resolveFlagWithReason<boolean>(flagKey, defaultValue, context, logger);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<number>> {\n return this.resolveFlagWithReason<number>(flagKey, defaultValue, context, logger);\n }\n\n async resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<string>> {\n return this.resolveFlagWithReason<string>(flagKey, defaultValue, context, logger);\n }\n\n async resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<T>> {\n return this.resolveFlagWithReason<T>(flagKey, defaultValue, context, logger);\n }\n\n private async resolveFlagWithReason<T extends JsonValue | FlagValueType>(\n flagKey: string,\n defaultValue: T,\n ctx?: EvaluationContext,\n logger?: Logger,\n ): Promise<ResolutionDetails<T>> {\n try {\n const resolutionResult = this.lookupFlagValue(flagKey, defaultValue, ctx, logger);\n\n if (typeof resolutionResult?.value != typeof defaultValue) {\n throw new TypeMismatchError();\n }\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 defaultValue: T,\n ctx?: 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 const flagSpec: Flag = this._flagConfiguration[flagKey];\n\n if (flagSpec.disabled) {\n return { value: defaultValue, reason: StandardResolutionReasons.DISABLED };\n }\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 if (value === undefined) {\n const message = `no value associated with variant ${variant}`;\n logger?.error(message);\n throw new VariantFoundError(message);\n }\n\n return {\n value: value as T,\n ...(variant && { variant }),\n reason: isContextEval ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC,\n };\n }\n}\n", "import { ErrorCode, OpenFeatureError } from '@openfeature/core';\n\n/**\n * A custom error for the in-memory provider.\n * Indicates the resolved or default variant doesn't exist.\n */\nexport class VariantFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, VariantFoundError.prototype);\n this.name = 'VariantFoundError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import type {\n EvaluationContext,\n ManageContext,\n ServerProviderStatus} 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 } from './events';\nimport type { Hook } from './hooks';\nimport type { Provider} from './provider';\nimport { NOOP_PROVIDER, ProviderStatus } from './provider';\nimport type {\n ManageTransactionContextPropagator,\n TransactionContext,\n TransactionContextPropagator} from './transaction-context';\nimport {\n NOOP_TRANSACTION_CONTEXT_PROPAGATOR\n} from './transaction-context';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/js-sdk/api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI\n extends OpenFeatureCommonAPI<ServerProviderStatus, Provider, Hook>\n implements\n ManageContext<OpenFeatureAPI>,\n ManageTransactionContextPropagator<OpenFeatureCommonAPI<ServerProviderStatus, Provider>>\n{\n protected _statusEnumType: typeof ProviderStatus = ProviderStatus;\n protected _apiEmitter = new OpenFeatureEventEmitter();\n protected _defaultProvider: ProviderWrapper<Provider, ServerProviderStatus> = new ProviderWrapper(\n NOOP_PROVIDER,\n ProviderStatus.NOT_READY,\n this._statusEnumType,\n );\n protected _domainScopedProviders: Map<string, ProviderWrapper<Provider, ServerProviderStatus>> = new Map();\n protected _createEventEmitter = () => new OpenFeatureEventEmitter();\n\n private _transactionContextPropagator: TransactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;\n\n private constructor() {\n super('server');\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 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 async setProviderAndWait(domainOrProvider?: string | Provider, providerOrUndefined?: Provider): Promise<void> {\n const domain = stringOrUndefined(domainOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerOrUndefined)\n : objectOrUndefined<Provider>(domainOrProvider);\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 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 setProvider(clientOrProvider?: string | Provider, providerOrUndefined?: Provider): this {\n const domain = stringOrUndefined(clientOrProvider);\n const provider = domain\n ? objectOrUndefined<Provider>(providerOrUndefined)\n : objectOrUndefined<Provider>(clientOrProvider);\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\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 setContext(context: EvaluationContext): this {\n this._context = context;\n return this;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n /**\n * A factory function for creating new domainless OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * All domainless or unbound clients use the default provider set via {@link this.setProvider setProvider}.\n * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(context?: EvaluationContext): Client;\n /**\n * A factory function for creating new domain scoped OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * If there is already a provider bound to this domain via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that domain.\n * @param {string} domain An identifier which logically binds clients with providers\n * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(domain: string, context?: EvaluationContext): Client;\n /**\n * A factory function for creating new domain scoped OpenFeature clients.\n * Clients can contain their own state (e.g. logger, hook, context).\n * Multiple clients can be used to segment feature flag configuration.\n *\n * If there is already a provider bound to this domain via {@link this.setProvider setProvider}, this provider will be used.\n * Otherwise, the default provider is used until a provider is assigned to that domain.\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 * @param {EvaluationContext} context Evaluation context that should be set on the client to used during flag evaluations\n * @returns {Client} OpenFeature Client\n */\n getClient(domain: string, version: string, context?: EvaluationContext): Client;\n getClient(\n domainOrContext?: string | EvaluationContext,\n versionOrContext?: string | EvaluationContext,\n contextOrUndefined?: EvaluationContext,\n ): Client {\n const domain = stringOrUndefined(domainOrContext);\n const version = stringOrUndefined(versionOrContext);\n const context =\n objectOrUndefined<EvaluationContext>(domainOrContext) ??\n objectOrUndefined<EvaluationContext>(versionOrContext) ??\n objectOrUndefined<EvaluationContext>(contextOrUndefined);\n\n return new OpenFeatureClient(\n () => this.getProviderForClient(domain),\n () => this.getProviderStatus(domain),\n () => this.buildAndCacheEventEmitterForClient(domain),\n () => this.getContext(),\n () => this.getHooks(),\n () => this.getTransactionContext(),\n () => this._logger,\n { domain, version },\n context,\n );\n }\n\n /**\n * Clears all registered providers and resets the default provider.\n * @returns {Promise<void>}\n */\n clearProviders(): Promise<void> {\n return super.clearProvidersAndSetDefault(NOOP_PROVIDER);\n }\n\n setTransactionContextPropagator(\n transactionContextPropagator: TransactionContextPropagator,\n ): OpenFeatureCommonAPI<ServerProviderStatus, Provider> {\n const baseMessage = 'Invalid TransactionContextPropagator, will not be set: ';\n if (typeof transactionContextPropagator?.getTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);\n } else if (typeof transactionContextPropagator?.setTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);\n } else {\n this._transactionContextPropagator = transactionContextPropagator;\n }\n return this;\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n transactionContext: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);\n }\n\n getTransactionContext(): TransactionContext {\n try {\n return this._transactionContextPropagator.getTransactionContext();\n } catch (err: unknown) {\n const error = err as Error | undefined;\n this._logger.error(`Error getting transaction context: ${error?.message}, returning empty context.`);\n this._logger.error(error?.stack);\n return {};\n }\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import type {\n ClientMetadata,\n EvaluationContext,\n EvaluationDetails,\n EventHandler,\n FlagValue,\n FlagValueType,\n HookContext,\n JsonValue,\n Logger,\n TrackingEventDetails,\n OpenFeatureError,\n 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 _context: EvaluationContext;\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n\n constructor(\n // we always want the client to use the current provider,\n // so pass a function to always access the currently registered one.\n private readonly providerAccessor: () => Provider,\n private readonly providerStatusAccessor: () => ProviderStatus,\n private readonly emitterAccessor: () => InternalEventEmitter,\n private readonly apiContextAccessor: () => EvaluationContext,\n private readonly apiHooksAccessor: () => Hook[],\n private readonly transactionContextAccessor: () => EvaluationContext,\n private readonly globalLogger: () => Logger,\n private readonly options: OpenFeatureClientOptions,\n context: EvaluationContext = {},\n ) {\n this._context = context;\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(eventType: ProviderEvents, handler: EventHandler) {\n this.emitterAccessor().removeHandler(eventType, handler);\n }\n\n getHandlers(eventType: ProviderEvents) {\n return this.emitterAccessor().getHandlers(eventType);\n }\n\n setLogger(logger: Logger): OpenFeatureClient {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n setContext(context: EvaluationContext): OpenFeatureClient {\n this._context = context;\n return this;\n }\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n addHooks(...hooks: Hook[]): OpenFeatureClient {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook[] {\n return this._hooks;\n }\n\n clearHooks(): OpenFeatureClient {\n this._hooks = [];\n return this;\n }\n\n async getBooleanValue(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<boolean> {\n return (await this.getBooleanDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<boolean>> {\n return this.evaluate<boolean>(\n flagKey,\n this._provider.resolveBooleanEvaluation,\n defaultValue,\n 'boolean',\n context,\n options,\n );\n }\n\n async getStringValue<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getStringDetails<T>(flagKey, defaultValue, context, options)).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => Promise<EvaluationDetails<T>>,\n defaultValue,\n 'string',\n context,\n options,\n );\n }\n\n async getNumberValue<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getNumberDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => Promise<EvaluationDetails<T>>,\n defaultValue,\n 'number',\n context,\n options,\n );\n }\n\n async getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<T> {\n return (await this.getObjectDetails(flagKey, defaultValue, context, options)).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions,\n ): Promise<EvaluationDetails<T>> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', context, options);\n }\n\n track(occurrenceKey: string, context: EvaluationContext = {}, occurrenceDetails: TrackingEventDetails = {}): void {\n try {\n this.shortCircuitIfNotReady();\n\n if (typeof this._provider.track === 'function') {\n // freeze the merged context\n const frozenContext = Object.freeze(this.mergeContexts(context));\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 async evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger,\n ) => Promise<ResolutionDetails<T>>,\n defaultValue: T,\n flagType: FlagValueType,\n invocationContext: EvaluationContext = {},\n options: FlagEvaluationOptions = {},\n ): Promise<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 mergedContext = this.mergeContexts(invocationContext);\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: mergedContext,\n logger: this._logger,\n hookData: new MapHookData(),\n }),\n );\n\n let evaluationDetails: EvaluationDetails<T>;\n\n try {\n const frozenContext = await this.beforeHooks(allHooks, hookContexts, mergedContext, options);\n\n this.shortCircuitIfNotReady();\n\n // run the referenced resolver, binding the provider.\n const resolution = await resolver.call(this._provider, flagKey, defaultValue, frozenContext, 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 await this.errorHooks(allHooksReversed, hookContexts, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata);\n } else {\n await this.afterHooks(allHooksReversed, hookContexts, resolutionDetails, options);\n evaluationDetails = resolutionDetails;\n }\n } catch (err: unknown) {\n await this.errorHooks(allHooksReversed, hookContexts, err, options);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err);\n }\n\n await this.finallyHooks(allHooksReversed, hookContexts, evaluationDetails, options);\n return evaluationDetails;\n }\n\n private async beforeHooks(\n hooks: Hook[],\n hookContexts: HookContext[],\n mergedContext: EvaluationContext,\n options: FlagEvaluationOptions,\n ) {\n let accumulatedContext = mergedContext;\n\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\n // Update the context on the stable hook context object\n Object.assign(hookContext.context, accumulatedContext);\n\n const hookResult = await hook?.before?.(hookContext, Object.freeze(options.hookHints));\n if (hookResult) {\n accumulatedContext = {\n ...accumulatedContext,\n ...hookResult,\n };\n\n for (let i = 0; i < hooks.length; i++) {\n Object.assign(hookContexts[hookContextIndex].context, accumulatedContext);\n }\n }\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(accumulatedContext);\n }\n\n private async 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 await hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private async 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 await 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 async 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 await 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 _providerStatus(): ProviderStatus {\n return this.providerStatusAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n\n private mergeContexts(invocationContext: EvaluationContext) {\n // merge global and client contexts\n return {\n ...this.apiContextAccessor(),\n ...this.transactionContextAccessor(),\n ...this._context,\n ...invocationContext,\n };\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 { GenericEventEmitter } from '@openfeature/core';\nimport { EventEmitter } from 'node:events';\nimport type { ProviderEvents } 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<ProviderEvents> {\n protected readonly eventEmitter = new EventEmitter({ captureRejections: true });\n\n constructor() {\n super();\n this.eventEmitter.on('error', (err) => {\n this._logger?.error('Error running event handler:', err);\n });\n }\n};", "import { ServerProviderEvents } from '@openfeature/core';\n\nexport { ServerProviderEvents as ProviderEvents };", "import type { EvaluationContext } from '@openfeature/core';\nimport type { TransactionContext, TransactionContextPropagator } from './transaction-context';\n\nclass NoopTransactionContextPropagator implements TransactionContextPropagator {\n getTransactionContext(): EvaluationContext {\n return {};\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n _: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n callback(...args);\n }\n}\n\nexport const NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();\n", "import type { EvaluationContext } from '@openfeature/core';\nimport type { TransactionContext, TransactionContextPropagator } from './transaction-context';\nimport { AsyncLocalStorage } from 'async_hooks';\n\nexport class AsyncLocalStorageTransactionContextPropagator implements TransactionContextPropagator {\n private asyncLocalStorage = new AsyncLocalStorage<EvaluationContext>();\n\n getTransactionContext(): EvaluationContext {\n return this.asyncLocalStorage.getStore() ?? {};\n }\n\n setTransactionContext<TArgs extends unknown[], R>(\n transactionContext: TransactionContext,\n callback: (...args: TArgs) => R,\n ...args: TArgs\n ): void {\n this.asyncLocalStorage.run(transactionContext, callback, ...args);\n }\n}\n", "export * from './client';\nexport * from './provider';\nexport * from './evaluation';\nexport * from './open-feature';\nexport * from './transaction-context';\nexport * from './events';\nexport * from './hooks';\nexport * from './tracking';\nexport * from '@openfeature/core';\n"],
5
+ "mappings": "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",
6
6
  "names": ["OpenFeatureError", "OpenFeatureError", "ErrorCode", "StandardResolutionReasons", "err", "ErrorCode", "StandardResolutionReasons"]
7
7
  }
package/dist/types.d.ts CHANGED
@@ -3,7 +3,7 @@ export * from '@openfeature/core';
3
3
  export { ServerProviderEvents as ProviderEvents, ServerProviderStatus as ProviderStatus } from '@openfeature/core';
4
4
  import { EventEmitter } from 'node:events';
5
5
 
6
- type Hook = BaseHook<FlagValue, Promise<EvaluationContext | void> | EvaluationContext | void, Promise<void> | void>;
6
+ type Hook<TData = Record<string, unknown>> = BaseHook<FlagValue, TData, Promise<EvaluationContext | void> | EvaluationContext | void, Promise<void> | void>;
7
7
 
8
8
  interface FlagEvaluationOptions {
9
9
  hooks?: Hook[];
@@ -319,7 +319,7 @@ declare class OpenFeatureAPI extends OpenFeatureCommonAPI<ServerProviderStatus,
319
319
  * Setting a provider supersedes the current provider used in new and existing unbound clients.
320
320
  * @param {Provider} provider The provider responsible for flag evaluations.
321
321
  * @returns {Promise<void>}
322
- * @throws Uncaught exceptions thrown by the provider during initialization.
322
+ * @throws {Error} If the provider throws an exception during initialization.
323
323
  */
324
324
  setProviderAndWait(provider: Provider): Promise<void>;
325
325
  /**
@@ -329,7 +329,7 @@ declare class OpenFeatureAPI extends OpenFeatureCommonAPI<ServerProviderStatus,
329
329
  * @param {string} domain The name to identify the client
330
330
  * @param {Provider} provider The provider responsible for flag evaluations.
331
331
  * @returns {Promise<void>}
332
- * @throws Uncaught exceptions thrown by the provider during initialization.
332
+ * @throws {Error} If the provider throws an exception during initialization.
333
333
  */
334
334
  setProviderAndWait(domain: string, provider: Provider): Promise<void>;
335
335
  /**
@@ -348,6 +348,23 @@ declare class OpenFeatureAPI extends OpenFeatureCommonAPI<ServerProviderStatus,
348
348
  * @returns {this} OpenFeature API
349
349
  */
350
350
  setProvider(domain: string, provider: Provider): this;
351
+ /**
352
+ * Get the default provider.
353
+ *
354
+ * Note that it isn't recommended to interact with the provider directly, but rather through
355
+ * an OpenFeature client.
356
+ * @returns {Provider} Default Provider
357
+ */
358
+ getProvider(): Provider;
359
+ /**
360
+ * Get the provider bound to the specified domain.
361
+ *
362
+ * Note that it isn't recommended to interact with the provider directly, but rather through
363
+ * an OpenFeature client.
364
+ * @param {string} domain An identifier which logically binds clients with providers
365
+ * @returns {Provider} Domain-scoped provider
366
+ */
367
+ getProvider(domain?: string): Provider;
351
368
  setContext(context: EvaluationContext): this;
352
369
  getContext(): EvaluationContext;
353
370
  /**
@@ -400,4 +417,5 @@ declare class OpenFeatureAPI extends OpenFeatureCommonAPI<ServerProviderStatus,
400
417
  */
401
418
  declare const OpenFeature: OpenFeatureAPI;
402
419
 
403
- export { AsyncLocalStorageTransactionContextPropagator, type Client, type Features, type FlagEvaluationOptions, type Hook, InMemoryProvider, type ManageTransactionContextPropagator, NOOP_PROVIDER, NOOP_TRANSACTION_CONTEXT_PROPAGATOR, OpenFeature, OpenFeatureAPI, OpenFeatureEventEmitter, type Provider, type Tracking, type TransactionContext, type TransactionContextPropagator };
420
+ export { AsyncLocalStorageTransactionContextPropagator, InMemoryProvider, NOOP_PROVIDER, NOOP_TRANSACTION_CONTEXT_PROPAGATOR, OpenFeature, OpenFeatureAPI, OpenFeatureEventEmitter };
421
+ export type { Client, Features, FlagEvaluationOptions, Hook, ManageTransactionContextPropagator, Provider, Tracking, TransactionContext, TransactionContextPropagator };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openfeature/server-sdk",
3
- "version": "1.17.1",
3
+ "version": "1.19.0",
4
4
  "description": "OpenFeature SDK for JavaScript",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "files": [
@@ -45,12 +45,12 @@
45
45
  },
46
46
  "homepage": "https://github.com/open-feature/js-sdk#readme",
47
47
  "engines": {
48
- "node": ">=18"
48
+ "node": ">=20"
49
49
  },
50
50
  "peerDependencies": {
51
- "@openfeature/core": "^1.7.0"
51
+ "@openfeature/core": "^1.9.0"
52
52
  },
53
53
  "devDependencies": {
54
- "@openfeature/core": "^1.7.0"
54
+ "@openfeature/core": "^1.9.0"
55
55
  }
56
56
  }