@openfeature/server-sdk 1.21.0 → 1.22.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 +2 -2
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +2 -2
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +2 -2
- package/dist/types.d.ts +2 -3
- package/package.json +2 -2
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.
|
|
20
|
-
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.
|
|
19
|
+
<a href="https://github.com/open-feature/js-sdk/releases/tag/server-sdk-v1.22.0">
|
|
20
|
+
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.22.0&color=blue&style=for-the-badge" />
|
|
21
21
|
</a>
|
|
22
22
|
<!-- x-release-please-end -->
|
|
23
23
|
<br/>
|
package/dist/cjs/index.js
CHANGED
|
@@ -600,6 +600,8 @@ var OpenFeatureClient = class {
|
|
|
600
600
|
name: (_a = this.options.domain) != null ? _a : this.options.name,
|
|
601
601
|
domain: (_b = this.options.domain) != null ? _b : this.options.name,
|
|
602
602
|
version: this.options.version,
|
|
603
|
+
sdk: "js-server",
|
|
604
|
+
paradigm: "server",
|
|
603
605
|
providerMetadata: this.providerAccessor().metadata
|
|
604
606
|
};
|
|
605
607
|
}
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -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/provider/multi-provider/multi-provider.ts", "../../src/provider/multi-provider/strategies.ts", "../../src/events/open-feature-event-emitter.ts", "../../src/events/events.ts", "../../src/provider/multi-provider/hook-executor.ts", "../../src/open-feature.ts", "../../src/client/internal/open-feature-client.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 { CommonProvider, EvaluationContext, JsonValue, Logger, ResolutionDetails } from '@openfeature/core';\nimport { ServerProviderStatus } 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 { EvaluationContext, FlagValueType, JsonValue, Logger, 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, FlagVariants } 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 * @deprecated Use {@link TypedInMemoryProvider} for type-safe flag configuration.\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\n/**\n * A simple OpenFeature provider intended for demos and as a test stub.\n * @example\n * ```\n * const provider = new TypedInMemoryProvider({\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * });\n *\n * const flags = {\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * } as const; // 'as const' needed to preserve the `defaultVariant` narrow literal type rather than `string`\n * const provider = new TypedInMemoryProvider(flags);\n * ```\n */\nexport class TypedInMemoryProvider<\n T extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>,\n> extends InMemoryProvider {\n constructor(flagConfiguration: FlagConfiguration<T> = {} as FlagConfiguration<T>) {\n super(flagConfiguration);\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n * @example\n * ```\n * provider.putConfiguration({\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * });\n *\n * const flags = {\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * } as const; // 'as const' needed to preserve the `defaultVariant` narrow literal type rather than `string`\n * provider.putConfiguration(flags);\n * ```\n */\n override putConfiguration<U extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>>(\n flagConfiguration: FlagConfiguration<U>,\n ) {\n super.putConfiguration(flagConfiguration);\n }\n}\n\n/**\n * The variants object for a flag in the {@link TypedInMemoryProvider}, containing all possible variants and their associated values.\n *\n * Can be used in combination with {@link InMemoryFlagConfiguration} to preserve type-safety when extending the provider class.\n * @example\n * ```\n * export class CustomInMemoryProvider<\n * T extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * > extends TypedInMemoryProvider<T> {\n * constructor(flagConfiguration: InMemoryFlagConfiguration<T>) {\n * super(flagConfiguration);\n * // custom logic ...\n * }\n *\n * override putConfiguration<\n * U extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * >(flagConfiguration: InMemoryFlagConfiguration<U>) {\n * super.putConfiguration(flagConfiguration);\n * // custom logic ...\n * }\n * }\n * ```\n */\nexport type InMemoryFlagVariants<T extends string> = FlagVariants<T>;\n\n/**\n * The configuration object for the {@link TypedInMemoryProvider}, containing all flags and their specifications.\n *\n * Can be used in combination with {@link InMemoryFlagVariants} to preserve type-safety when extending the provider class.\n *\n * The generic ensures that the keys of the `variants` object in each flag specification are consistent with the `defaultVariant` and the return type of `contextEvaluator`.\n * @example\n * ```\n * export class CustomInMemoryProvider<\n * T extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * > extends TypedInMemoryProvider<T> {\n * constructor(flagConfiguration: InMemoryFlagConfiguration<T>) {\n * super(flagConfiguration);\n * // custom logic ...\n * }\n *\n * override putConfiguration<\n * U extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * >(flagConfiguration: InMemoryFlagConfiguration<U>) {\n * super.putConfiguration(flagConfiguration);\n * // custom logic ...\n * }\n * }\n * ```\n */\nexport type InMemoryFlagConfiguration<\n T extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>,\n> = FlagConfiguration<T>;\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 BeforeHookContext,\n EvaluationContext,\n EvaluationDetails,\n FlagMetadata,\n FlagValue,\n FlagValueType,\n HookContext,\n HookHints,\n JsonValue,\n Logger,\n OpenFeatureError,\n ProviderMetadata,\n ResolutionDetails,\n TrackingEventDetails,\n BaseProviderResolutionResult,\n ProviderEntryInput,\n RegisteredProvider,\n BaseEvaluationStrategy,\n} from '@openfeature/core';\nimport {\n DefaultLogger,\n ErrorCode,\n GeneralError,\n StandardResolutionReasons,\n constructAggregateError,\n throwAggregateErrorFromPromiseResults,\n StatusTracker,\n} from '@openfeature/core';\nimport { FirstMatchStrategy } from './strategies';\nimport type { Provider } from '../provider';\nimport { ProviderStatus } from '../provider';\nimport type { Hook } from '../../hooks';\nimport { OpenFeatureEventEmitter } from '../../events/open-feature-event-emitter';\nimport { ProviderEvents } from '../../events';\nimport { HookExecutor } from './hook-executor';\n\nexport class MultiProvider implements Provider {\n readonly runsOn = 'server';\n\n public readonly events = new OpenFeatureEventEmitter();\n\n private hookContexts: WeakMap<EvaluationContext, HookContext> = new WeakMap<EvaluationContext, HookContext>();\n private hookHints: WeakMap<EvaluationContext, HookHints> = new WeakMap<EvaluationContext, HookHints>();\n\n metadata: ProviderMetadata;\n\n providerEntries: RegisteredProvider<Provider>[] = [];\n private providerEntriesByName: Record<string, RegisteredProvider<Provider>> = {};\n\n private hookExecutor: HookExecutor;\n private statusTracker = new StatusTracker<\n (typeof ProviderEvents)[keyof typeof ProviderEvents],\n ProviderStatus,\n Provider\n >(this.events, ProviderStatus, ProviderEvents);\n\n constructor(\n readonly constructorProviders: ProviderEntryInput<Provider>[],\n private readonly evaluationStrategy: BaseEvaluationStrategy<ProviderStatus, Provider> = new FirstMatchStrategy(),\n private readonly logger: Logger = new DefaultLogger(),\n ) {\n this.hookExecutor = new HookExecutor(this.logger);\n\n this.registerProviders(constructorProviders);\n\n const aggregateMetadata = Object.keys(this.providerEntriesByName).reduce((acc, name) => {\n return { ...acc, [name]: this.providerEntriesByName[name].provider.metadata };\n }, {});\n\n this.metadata = {\n ...aggregateMetadata,\n name: MultiProvider.name,\n };\n }\n\n private registerProviders(constructorProviders: ProviderEntryInput<Provider>[]) {\n const providersByName: Record<string, Provider[]> = {};\n\n for (const constructorProvider of constructorProviders) {\n const providerName = constructorProvider.provider.metadata.name;\n const candidateName = constructorProvider.name ?? providerName;\n\n if (constructorProvider.name && providersByName[constructorProvider.name]) {\n throw new Error('Provider names must be unique');\n }\n\n providersByName[candidateName] ??= [];\n providersByName[candidateName].push(constructorProvider.provider);\n }\n\n for (const name of Object.keys(providersByName)) {\n const useIndexedNames = providersByName[name].length > 1;\n for (let i = 0; i < providersByName[name].length; i++) {\n const indexedName = useIndexedNames ? `${name}-${i + 1}` : name;\n this.providerEntriesByName[indexedName] = { provider: providersByName[name][i], name: indexedName };\n this.providerEntries.push(this.providerEntriesByName[indexedName]);\n this.statusTracker.wrapEventHandler(this.providerEntriesByName[indexedName]);\n }\n }\n\n // just make sure we don't accidentally modify these later\n Object.freeze(this.providerEntries);\n Object.freeze(this.providerEntriesByName);\n }\n\n async initialize(context?: EvaluationContext): Promise<void> {\n const result = await Promise.allSettled(\n this.providerEntries.map((provider) => provider.provider.initialize?.(context)),\n );\n throwAggregateErrorFromPromiseResults(result, this.providerEntries);\n }\n\n async onClose(): Promise<void> {\n const result = await Promise.allSettled(this.providerEntries.map((provider) => provider.provider.onClose?.()));\n throwAggregateErrorFromPromiseResults(result, this.providerEntries);\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<boolean>> {\n return this.flagResolutionProxy<boolean>(flagKey, 'boolean', defaultValue, context);\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<string>> {\n return this.flagResolutionProxy(flagKey, 'string', defaultValue, context);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<number>> {\n return this.flagResolutionProxy(flagKey, 'number', defaultValue, context);\n }\n\n resolveObjectEvaluation<U extends JsonValue>(\n flagKey: string,\n defaultValue: U,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<U>> {\n return this.flagResolutionProxy(flagKey, 'object', defaultValue, context);\n }\n\n private async flagResolutionProxy<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n flagType: FlagValueType,\n defaultValue: T,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<T>> {\n const hookContext = this.hookContexts.get(context);\n const hookHints = this.hookHints.get(context);\n\n if (!hookContext || !hookHints) {\n throw new GeneralError('Hook context not available for evaluation');\n }\n\n const tasks: Promise<[boolean, BaseProviderResolutionResult<T, ProviderStatus, Provider> | null]>[] = [];\n\n for (const providerEntry of this.providerEntries) {\n const task = this.evaluateProviderEntry(\n flagKey,\n flagType,\n defaultValue,\n providerEntry,\n hookContext,\n hookHints,\n context,\n );\n\n tasks.push(task);\n\n if (this.evaluationStrategy.runMode === 'sequential') {\n const [shouldEvaluateNext] = await task;\n if (!shouldEvaluateNext) {\n break;\n }\n }\n }\n\n const results = await Promise.all(tasks);\n const resolutions = results\n .map(([, resolution]) => resolution)\n .filter((r): r is BaseProviderResolutionResult<T, ProviderStatus, Provider> => Boolean(r));\n\n const finalResult = this.evaluationStrategy.determineFinalResult({ flagKey, flagType }, context, resolutions);\n\n if (finalResult.errors?.length) {\n throw constructAggregateError(finalResult.errors);\n }\n\n if (!finalResult.details) {\n throw new GeneralError('No result was returned from any provider');\n }\n\n return finalResult.details;\n }\n\n private async evaluateProviderEntry<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n flagType: FlagValueType,\n defaultValue: T,\n providerEntry: RegisteredProvider<Provider>,\n hookContext: HookContext,\n hookHints: HookHints,\n context: EvaluationContext,\n ): Promise<[boolean, BaseProviderResolutionResult<T, ProviderStatus, Provider> | null]> {\n let evaluationResult: ResolutionDetails<T> | undefined = undefined;\n const provider = providerEntry.provider;\n const strategyContext = {\n flagKey,\n flagType,\n provider,\n providerName: providerEntry.name,\n providerStatus: this.statusTracker.providerStatus(providerEntry.name),\n };\n\n if (!this.evaluationStrategy.shouldEvaluateThisProvider(strategyContext, context)) {\n return [true, null];\n }\n\n let resolution: BaseProviderResolutionResult<T, ProviderStatus, Provider>;\n\n try {\n evaluationResult = await this.evaluateProviderAndHooks(flagKey, defaultValue, provider, hookContext, hookHints);\n resolution = {\n details: evaluationResult,\n provider,\n providerName: providerEntry.name,\n };\n } catch (error: unknown) {\n resolution = {\n thrownError: error,\n provider,\n providerName: providerEntry.name,\n };\n }\n\n return [\n this.evaluationStrategy.runMode === 'sequential'\n ? this.evaluationStrategy.shouldEvaluateNextProvider(strategyContext, context, resolution)\n : true,\n resolution,\n ];\n }\n\n private async evaluateProviderAndHooks<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n defaultValue: T,\n provider: Provider,\n hookContext: HookContext,\n hookHints: HookHints,\n ) {\n let providerContext: EvaluationContext | undefined = undefined;\n let evaluationDetails: EvaluationDetails<T>;\n\n // create a copy of the shared hook context because we're going to mutate the evaluation context\n const hookContextCopy = { ...hookContext, context: { ...hookContext.context } };\n\n try {\n // return the modified provider context and mutate the hook context to contain it\n providerContext = await this.hookExecutor.beforeHooks(provider.hooks, hookContextCopy, hookHints);\n\n const resolutionDetails = (await this.callProviderResolve(\n provider,\n flagKey,\n defaultValue,\n providerContext || {},\n )) as ResolutionDetails<T>;\n\n evaluationDetails = {\n ...resolutionDetails,\n flagMetadata: Object.freeze(resolutionDetails.flagMetadata ?? {}),\n flagKey,\n };\n\n await this.hookExecutor.afterHooks(provider.hooks, hookContextCopy, evaluationDetails, hookHints);\n } catch (error: unknown) {\n await this.hookExecutor.errorHooks(provider.hooks, hookContextCopy, error, hookHints);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, error);\n }\n await this.hookExecutor.finallyHooks(provider.hooks, hookContextCopy, evaluationDetails, hookHints);\n return evaluationDetails;\n }\n\n private async callProviderResolve<T extends boolean | string | number | JsonValue>(\n provider: Provider,\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n ) {\n switch (typeof defaultValue) {\n case 'string':\n return await provider.resolveStringEvaluation(flagKey, defaultValue, context, this.logger);\n case 'number':\n return await provider.resolveNumberEvaluation(flagKey, defaultValue, context, this.logger);\n case 'object':\n return await provider.resolveObjectEvaluation(flagKey, defaultValue, context, this.logger);\n case 'boolean':\n return await provider.resolveBooleanEvaluation(flagKey, defaultValue, context, this.logger);\n default:\n throw new GeneralError('Invalid flag evaluation type');\n }\n }\n\n public get hooks(): Hook[] {\n return [\n {\n before: async (hookContext: BeforeHookContext, hints: HookHints): Promise<EvaluationContext> => {\n this.hookContexts.set(hookContext.context, hookContext);\n this.hookHints.set(hookContext.context, hints ?? {});\n return hookContext.context;\n },\n },\n ];\n }\n\n track(trackingEventName: string, context: EvaluationContext, trackingEventDetails: TrackingEventDetails): void {\n for (const providerEntry of this.providerEntries) {\n if (!providerEntry.provider.track) {\n continue;\n }\n\n const strategyContext = {\n provider: providerEntry.provider,\n providerName: providerEntry.name,\n providerStatus: this.statusTracker.providerStatus(providerEntry.name),\n };\n\n if (\n this.evaluationStrategy.shouldTrackWithThisProvider(\n strategyContext,\n context,\n trackingEventName,\n trackingEventDetails,\n )\n ) {\n try {\n providerEntry.provider.track?.(trackingEventName, context, trackingEventDetails);\n } catch (error) {\n // Log error but don't throw - tracking shouldn't break application flow\n this.logger.error(\n `Error tracking event \"${trackingEventName}\" with provider \"${providerEntry.name}\":`,\n error,\n );\n }\n }\n }\n }\n\n private getErrorEvaluationDetails<T extends FlagValue>(\n flagKey: string,\n defaultValue: T,\n err: unknown,\n flagMetadata: FlagMetadata = {},\n ): EvaluationDetails<T> {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze(flagMetadata),\n flagKey,\n };\n }\n}\n", "/**\n * Pre-configured strategy exports for the server SDK.\n * These classes extend the base strategies from @openfeature/core with the\n * server-specific ProviderStatus enum already bound.\n */\nimport {\n BaseFirstMatchStrategy,\n BaseFirstSuccessfulStrategy,\n BaseComparisonStrategy,\n type BaseStrategyProviderContext,\n type BaseStrategyPerProviderContext,\n type BaseProviderResolutionResult,\n type BaseProviderResolutionSuccessResult,\n type BaseProviderResolutionErrorResult,\n type BaseFinalResult,\n type StrategyEvaluationContext,\n type FlagValue,\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport { ProviderStatus } from '../provider';\n\n/**\n * Pre-bound type aliases for server SDK.\n * These types have the server-specific ProviderStatus and Provider types already applied,\n * providing backward compatibility for existing consumers.\n */\nexport type StrategyProviderContext = BaseStrategyProviderContext<ProviderStatus, Provider>;\nexport type StrategyPerProviderContext = BaseStrategyPerProviderContext<ProviderStatus, Provider>;\nexport type ProviderResolutionResult<T extends FlagValue> = BaseProviderResolutionResult<T, ProviderStatus, Provider>;\nexport type ProviderResolutionSuccessResult<T extends FlagValue> = BaseProviderResolutionSuccessResult<\n T,\n ProviderStatus,\n Provider\n>;\nexport type ProviderResolutionErrorResult = BaseProviderResolutionErrorResult<ProviderStatus, Provider>;\nexport type FinalResult<T extends FlagValue> = BaseFinalResult<T, ProviderStatus, Provider>;\nexport type { StrategyEvaluationContext };\n\n/**\n * Evaluates providers in order and returns the first successful result.\n * Providers that return FLAG_NOT_FOUND are skipped. Any other error stops evaluation.\n */\nexport class FirstMatchStrategy extends BaseFirstMatchStrategy<ProviderStatus, Provider> {\n constructor() {\n super(ProviderStatus);\n }\n}\n\n/**\n * Evaluates providers in order and returns the first successful result.\n * Any error causes that provider to be skipped.\n */\nexport class FirstSuccessfulStrategy extends BaseFirstSuccessfulStrategy<ProviderStatus, Provider> {\n constructor() {\n super(ProviderStatus);\n }\n}\n\n/**\n * Evaluates all providers in parallel and compares results.\n * If all providers agree, returns that result. Otherwise, returns the fallback provider's result.\n */\nexport class ComparisonStrategy extends BaseComparisonStrategy<ProviderStatus, Provider> {\n constructor(fallbackProvider: Provider, onMismatch?: (resolutions: ProviderResolutionResult<FlagValue>[]) => void) {\n super(ProviderStatus, fallbackProvider, onMismatch);\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}\n", "import { ServerProviderEvents } from '@openfeature/core';\n\nexport { ServerProviderEvents as ProviderEvents };\n", "import type { EvaluationDetails, FlagValue, HookContext, HookHints, Logger } from '@openfeature/core';\nimport type { Hook } from '../../hooks';\n\n/**\n * Utility for executing a set of hooks of each type. Implementation is largely copied from the main OpenFeature SDK.\n */\nexport class HookExecutor {\n constructor(private logger: Logger) {}\n\n async beforeHooks(hooks: Hook[] | undefined, hookContext: HookContext, hints: HookHints) {\n for (const hook of hooks ?? []) {\n // freeze the hookContext\n Object.freeze(hookContext);\n\n Object.assign(hookContext.context, {\n ...(await hook?.before?.(hookContext, Object.freeze(hints))),\n });\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(hookContext.context);\n }\n\n async afterHooks(\n hooks: Hook[] | undefined,\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n hints: HookHints,\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks ?? []) {\n await hook?.after?.(hookContext, evaluationDetails, hints);\n }\n }\n\n async errorHooks(hooks: Hook[] | undefined, hookContext: HookContext, err: unknown, hints: HookHints) {\n // run \"error\" hooks sequentially\n for (const hook of hooks ?? []) {\n try {\n await hook?.error?.(hookContext, err, hints);\n } catch (err) {\n this.logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this.logger.error(err.stack);\n }\n this.logger.error((err as Error)?.stack);\n }\n }\n }\n\n async finallyHooks(\n hooks: Hook[] | undefined,\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n hints: HookHints,\n ) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks ?? []) {\n try {\n await hook?.finally?.(hookContext, evaluationDetails, hints);\n } catch (err) {\n this.logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this.logger.error(err.stack);\n }\n this.logger.error((err as Error)?.stack);\n }\n }\n }\n}\n", "import type { EvaluationContext, ManageContext, ServerProviderStatus } from '@openfeature/core';\nimport { OpenFeatureCommonAPI, ProviderWrapper, objectOrUndefined, stringOrUndefined } 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,\n} from './transaction-context';\nimport { NOOP_TRANSACTION_CONTEXT_PROPAGATOR } 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 const 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 Object.assign(accumulatedContext, hookResult);\n Object.assign(hookContext.context, accumulatedContext);\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 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 { CommonProvider, EvaluationContext, JsonValue, Logger, ResolutionDetails } from '@openfeature/core';\nimport { ServerProviderStatus } 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 { EvaluationContext, FlagValueType, JsonValue, Logger, 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, FlagVariants } 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 * @deprecated Use {@link TypedInMemoryProvider} for type-safe flag configuration.\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\n/**\n * A simple OpenFeature provider intended for demos and as a test stub.\n * @example\n * ```\n * const provider = new TypedInMemoryProvider({\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * });\n *\n * const flags = {\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * } as const; // 'as const' needed to preserve the `defaultVariant` narrow literal type rather than `string`\n * const provider = new TypedInMemoryProvider(flags);\n * ```\n */\nexport class TypedInMemoryProvider<\n T extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>,\n> extends InMemoryProvider {\n constructor(flagConfiguration: FlagConfiguration<T> = {} as FlagConfiguration<T>) {\n super(flagConfiguration);\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n * @example\n * ```\n * provider.putConfiguration({\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * });\n *\n * const flags = {\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * } as const; // 'as const' needed to preserve the `defaultVariant` narrow literal type rather than `string`\n * provider.putConfiguration(flags);\n * ```\n */\n override putConfiguration<U extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>>(\n flagConfiguration: FlagConfiguration<U>,\n ) {\n super.putConfiguration(flagConfiguration);\n }\n}\n\n/**\n * The variants object for a flag in the {@link TypedInMemoryProvider}, containing all possible variants and their associated values.\n *\n * Can be used in combination with {@link InMemoryFlagConfiguration} to preserve type-safety when extending the provider class.\n * @example\n * ```\n * export class CustomInMemoryProvider<\n * T extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * > extends TypedInMemoryProvider<T> {\n * constructor(flagConfiguration: InMemoryFlagConfiguration<T>) {\n * super(flagConfiguration);\n * // custom logic ...\n * }\n *\n * override putConfiguration<\n * U extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * >(flagConfiguration: InMemoryFlagConfiguration<U>) {\n * super.putConfiguration(flagConfiguration);\n * // custom logic ...\n * }\n * }\n * ```\n */\nexport type InMemoryFlagVariants<T extends string> = FlagVariants<T>;\n\n/**\n * The configuration object for the {@link TypedInMemoryProvider}, containing all flags and their specifications.\n *\n * Can be used in combination with {@link InMemoryFlagVariants} to preserve type-safety when extending the provider class.\n *\n * The generic ensures that the keys of the `variants` object in each flag specification are consistent with the `defaultVariant` and the return type of `contextEvaluator`.\n * @example\n * ```\n * export class CustomInMemoryProvider<\n * T extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * > extends TypedInMemoryProvider<T> {\n * constructor(flagConfiguration: InMemoryFlagConfiguration<T>) {\n * super(flagConfiguration);\n * // custom logic ...\n * }\n *\n * override putConfiguration<\n * U extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * >(flagConfiguration: InMemoryFlagConfiguration<U>) {\n * super.putConfiguration(flagConfiguration);\n * // custom logic ...\n * }\n * }\n * ```\n */\nexport type InMemoryFlagConfiguration<\n T extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>,\n> = FlagConfiguration<T>;\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 BeforeHookContext,\n EvaluationContext,\n EvaluationDetails,\n FlagMetadata,\n FlagValue,\n FlagValueType,\n HookContext,\n HookHints,\n JsonValue,\n Logger,\n OpenFeatureError,\n ProviderMetadata,\n ResolutionDetails,\n TrackingEventDetails,\n BaseProviderResolutionResult,\n ProviderEntryInput,\n RegisteredProvider,\n BaseEvaluationStrategy,\n} from '@openfeature/core';\nimport {\n DefaultLogger,\n ErrorCode,\n GeneralError,\n StandardResolutionReasons,\n constructAggregateError,\n throwAggregateErrorFromPromiseResults,\n StatusTracker,\n} from '@openfeature/core';\nimport { FirstMatchStrategy } from './strategies';\nimport type { Provider } from '../provider';\nimport { ProviderStatus } from '../provider';\nimport type { Hook } from '../../hooks';\nimport { OpenFeatureEventEmitter } from '../../events/open-feature-event-emitter';\nimport { ProviderEvents } from '../../events';\nimport { HookExecutor } from './hook-executor';\n\nexport class MultiProvider implements Provider {\n readonly runsOn = 'server';\n\n public readonly events = new OpenFeatureEventEmitter();\n\n private hookContexts: WeakMap<EvaluationContext, HookContext> = new WeakMap<EvaluationContext, HookContext>();\n private hookHints: WeakMap<EvaluationContext, HookHints> = new WeakMap<EvaluationContext, HookHints>();\n\n metadata: ProviderMetadata;\n\n providerEntries: RegisteredProvider<Provider>[] = [];\n private providerEntriesByName: Record<string, RegisteredProvider<Provider>> = {};\n\n private hookExecutor: HookExecutor;\n private statusTracker = new StatusTracker<\n (typeof ProviderEvents)[keyof typeof ProviderEvents],\n ProviderStatus,\n Provider\n >(this.events, ProviderStatus, ProviderEvents);\n\n constructor(\n readonly constructorProviders: ProviderEntryInput<Provider>[],\n private readonly evaluationStrategy: BaseEvaluationStrategy<ProviderStatus, Provider> = new FirstMatchStrategy(),\n private readonly logger: Logger = new DefaultLogger(),\n ) {\n this.hookExecutor = new HookExecutor(this.logger);\n\n this.registerProviders(constructorProviders);\n\n const aggregateMetadata = Object.keys(this.providerEntriesByName).reduce((acc, name) => {\n return { ...acc, [name]: this.providerEntriesByName[name].provider.metadata };\n }, {});\n\n this.metadata = {\n ...aggregateMetadata,\n name: MultiProvider.name,\n };\n }\n\n private registerProviders(constructorProviders: ProviderEntryInput<Provider>[]) {\n const providersByName: Record<string, Provider[]> = {};\n\n for (const constructorProvider of constructorProviders) {\n const providerName = constructorProvider.provider.metadata.name;\n const candidateName = constructorProvider.name ?? providerName;\n\n if (constructorProvider.name && providersByName[constructorProvider.name]) {\n throw new Error('Provider names must be unique');\n }\n\n providersByName[candidateName] ??= [];\n providersByName[candidateName].push(constructorProvider.provider);\n }\n\n for (const name of Object.keys(providersByName)) {\n const useIndexedNames = providersByName[name].length > 1;\n for (let i = 0; i < providersByName[name].length; i++) {\n const indexedName = useIndexedNames ? `${name}-${i + 1}` : name;\n this.providerEntriesByName[indexedName] = { provider: providersByName[name][i], name: indexedName };\n this.providerEntries.push(this.providerEntriesByName[indexedName]);\n this.statusTracker.wrapEventHandler(this.providerEntriesByName[indexedName]);\n }\n }\n\n // just make sure we don't accidentally modify these later\n Object.freeze(this.providerEntries);\n Object.freeze(this.providerEntriesByName);\n }\n\n async initialize(context?: EvaluationContext): Promise<void> {\n const result = await Promise.allSettled(\n this.providerEntries.map((provider) => provider.provider.initialize?.(context)),\n );\n throwAggregateErrorFromPromiseResults(result, this.providerEntries);\n }\n\n async onClose(): Promise<void> {\n const result = await Promise.allSettled(this.providerEntries.map((provider) => provider.provider.onClose?.()));\n throwAggregateErrorFromPromiseResults(result, this.providerEntries);\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<boolean>> {\n return this.flagResolutionProxy<boolean>(flagKey, 'boolean', defaultValue, context);\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<string>> {\n return this.flagResolutionProxy(flagKey, 'string', defaultValue, context);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<number>> {\n return this.flagResolutionProxy(flagKey, 'number', defaultValue, context);\n }\n\n resolveObjectEvaluation<U extends JsonValue>(\n flagKey: string,\n defaultValue: U,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<U>> {\n return this.flagResolutionProxy(flagKey, 'object', defaultValue, context);\n }\n\n private async flagResolutionProxy<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n flagType: FlagValueType,\n defaultValue: T,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<T>> {\n const hookContext = this.hookContexts.get(context);\n const hookHints = this.hookHints.get(context);\n\n if (!hookContext || !hookHints) {\n throw new GeneralError('Hook context not available for evaluation');\n }\n\n const tasks: Promise<[boolean, BaseProviderResolutionResult<T, ProviderStatus, Provider> | null]>[] = [];\n\n for (const providerEntry of this.providerEntries) {\n const task = this.evaluateProviderEntry(\n flagKey,\n flagType,\n defaultValue,\n providerEntry,\n hookContext,\n hookHints,\n context,\n );\n\n tasks.push(task);\n\n if (this.evaluationStrategy.runMode === 'sequential') {\n const [shouldEvaluateNext] = await task;\n if (!shouldEvaluateNext) {\n break;\n }\n }\n }\n\n const results = await Promise.all(tasks);\n const resolutions = results\n .map(([, resolution]) => resolution)\n .filter((r): r is BaseProviderResolutionResult<T, ProviderStatus, Provider> => Boolean(r));\n\n const finalResult = this.evaluationStrategy.determineFinalResult({ flagKey, flagType }, context, resolutions);\n\n if (finalResult.errors?.length) {\n throw constructAggregateError(finalResult.errors);\n }\n\n if (!finalResult.details) {\n throw new GeneralError('No result was returned from any provider');\n }\n\n return finalResult.details;\n }\n\n private async evaluateProviderEntry<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n flagType: FlagValueType,\n defaultValue: T,\n providerEntry: RegisteredProvider<Provider>,\n hookContext: HookContext,\n hookHints: HookHints,\n context: EvaluationContext,\n ): Promise<[boolean, BaseProviderResolutionResult<T, ProviderStatus, Provider> | null]> {\n let evaluationResult: ResolutionDetails<T> | undefined = undefined;\n const provider = providerEntry.provider;\n const strategyContext = {\n flagKey,\n flagType,\n provider,\n providerName: providerEntry.name,\n providerStatus: this.statusTracker.providerStatus(providerEntry.name),\n };\n\n if (!this.evaluationStrategy.shouldEvaluateThisProvider(strategyContext, context)) {\n return [true, null];\n }\n\n let resolution: BaseProviderResolutionResult<T, ProviderStatus, Provider>;\n\n try {\n evaluationResult = await this.evaluateProviderAndHooks(flagKey, defaultValue, provider, hookContext, hookHints);\n resolution = {\n details: evaluationResult,\n provider,\n providerName: providerEntry.name,\n };\n } catch (error: unknown) {\n resolution = {\n thrownError: error,\n provider,\n providerName: providerEntry.name,\n };\n }\n\n return [\n this.evaluationStrategy.runMode === 'sequential'\n ? this.evaluationStrategy.shouldEvaluateNextProvider(strategyContext, context, resolution)\n : true,\n resolution,\n ];\n }\n\n private async evaluateProviderAndHooks<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n defaultValue: T,\n provider: Provider,\n hookContext: HookContext,\n hookHints: HookHints,\n ) {\n let providerContext: EvaluationContext | undefined = undefined;\n let evaluationDetails: EvaluationDetails<T>;\n\n // create a copy of the shared hook context because we're going to mutate the evaluation context\n const hookContextCopy = { ...hookContext, context: { ...hookContext.context } };\n\n try {\n // return the modified provider context and mutate the hook context to contain it\n providerContext = await this.hookExecutor.beforeHooks(provider.hooks, hookContextCopy, hookHints);\n\n const resolutionDetails = (await this.callProviderResolve(\n provider,\n flagKey,\n defaultValue,\n providerContext || {},\n )) as ResolutionDetails<T>;\n\n evaluationDetails = {\n ...resolutionDetails,\n flagMetadata: Object.freeze(resolutionDetails.flagMetadata ?? {}),\n flagKey,\n };\n\n await this.hookExecutor.afterHooks(provider.hooks, hookContextCopy, evaluationDetails, hookHints);\n } catch (error: unknown) {\n await this.hookExecutor.errorHooks(provider.hooks, hookContextCopy, error, hookHints);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, error);\n }\n await this.hookExecutor.finallyHooks(provider.hooks, hookContextCopy, evaluationDetails, hookHints);\n return evaluationDetails;\n }\n\n private async callProviderResolve<T extends boolean | string | number | JsonValue>(\n provider: Provider,\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n ) {\n switch (typeof defaultValue) {\n case 'string':\n return await provider.resolveStringEvaluation(flagKey, defaultValue, context, this.logger);\n case 'number':\n return await provider.resolveNumberEvaluation(flagKey, defaultValue, context, this.logger);\n case 'object':\n return await provider.resolveObjectEvaluation(flagKey, defaultValue, context, this.logger);\n case 'boolean':\n return await provider.resolveBooleanEvaluation(flagKey, defaultValue, context, this.logger);\n default:\n throw new GeneralError('Invalid flag evaluation type');\n }\n }\n\n public get hooks(): Hook[] {\n return [\n {\n before: async (hookContext: BeforeHookContext, hints: HookHints): Promise<EvaluationContext> => {\n this.hookContexts.set(hookContext.context, hookContext);\n this.hookHints.set(hookContext.context, hints ?? {});\n return hookContext.context;\n },\n },\n ];\n }\n\n track(trackingEventName: string, context: EvaluationContext, trackingEventDetails: TrackingEventDetails): void {\n for (const providerEntry of this.providerEntries) {\n if (!providerEntry.provider.track) {\n continue;\n }\n\n const strategyContext = {\n provider: providerEntry.provider,\n providerName: providerEntry.name,\n providerStatus: this.statusTracker.providerStatus(providerEntry.name),\n };\n\n if (\n this.evaluationStrategy.shouldTrackWithThisProvider(\n strategyContext,\n context,\n trackingEventName,\n trackingEventDetails,\n )\n ) {\n try {\n providerEntry.provider.track?.(trackingEventName, context, trackingEventDetails);\n } catch (error) {\n // Log error but don't throw - tracking shouldn't break application flow\n this.logger.error(\n `Error tracking event \"${trackingEventName}\" with provider \"${providerEntry.name}\":`,\n error,\n );\n }\n }\n }\n }\n\n private getErrorEvaluationDetails<T extends FlagValue>(\n flagKey: string,\n defaultValue: T,\n err: unknown,\n flagMetadata: FlagMetadata = {},\n ): EvaluationDetails<T> {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze(flagMetadata),\n flagKey,\n };\n }\n}\n", "/**\n * Pre-configured strategy exports for the server SDK.\n * These classes extend the base strategies from @openfeature/core with the\n * server-specific ProviderStatus enum already bound.\n */\nimport {\n BaseFirstMatchStrategy,\n BaseFirstSuccessfulStrategy,\n BaseComparisonStrategy,\n type BaseStrategyProviderContext,\n type BaseStrategyPerProviderContext,\n type BaseProviderResolutionResult,\n type BaseProviderResolutionSuccessResult,\n type BaseProviderResolutionErrorResult,\n type BaseFinalResult,\n type StrategyEvaluationContext,\n type FlagValue,\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport { ProviderStatus } from '../provider';\n\n/**\n * Pre-bound type aliases for server SDK.\n * These types have the server-specific ProviderStatus and Provider types already applied,\n * providing backward compatibility for existing consumers.\n */\nexport type StrategyProviderContext = BaseStrategyProviderContext<ProviderStatus, Provider>;\nexport type StrategyPerProviderContext = BaseStrategyPerProviderContext<ProviderStatus, Provider>;\nexport type ProviderResolutionResult<T extends FlagValue> = BaseProviderResolutionResult<T, ProviderStatus, Provider>;\nexport type ProviderResolutionSuccessResult<T extends FlagValue> = BaseProviderResolutionSuccessResult<\n T,\n ProviderStatus,\n Provider\n>;\nexport type ProviderResolutionErrorResult = BaseProviderResolutionErrorResult<ProviderStatus, Provider>;\nexport type FinalResult<T extends FlagValue> = BaseFinalResult<T, ProviderStatus, Provider>;\nexport type { StrategyEvaluationContext };\n\n/**\n * Evaluates providers in order and returns the first successful result.\n * Providers that return FLAG_NOT_FOUND are skipped. Any other error stops evaluation.\n */\nexport class FirstMatchStrategy extends BaseFirstMatchStrategy<ProviderStatus, Provider> {\n constructor() {\n super(ProviderStatus);\n }\n}\n\n/**\n * Evaluates providers in order and returns the first successful result.\n * Any error causes that provider to be skipped.\n */\nexport class FirstSuccessfulStrategy extends BaseFirstSuccessfulStrategy<ProviderStatus, Provider> {\n constructor() {\n super(ProviderStatus);\n }\n}\n\n/**\n * Evaluates all providers in parallel and compares results.\n * If all providers agree, returns that result. Otherwise, returns the fallback provider's result.\n */\nexport class ComparisonStrategy extends BaseComparisonStrategy<ProviderStatus, Provider> {\n constructor(fallbackProvider: Provider, onMismatch?: (resolutions: ProviderResolutionResult<FlagValue>[]) => void) {\n super(ProviderStatus, fallbackProvider, onMismatch);\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}\n", "import { ServerProviderEvents } from '@openfeature/core';\n\nexport { ServerProviderEvents as ProviderEvents };\n", "import type { EvaluationDetails, FlagValue, HookContext, HookHints, Logger } from '@openfeature/core';\nimport type { Hook } from '../../hooks';\n\n/**\n * Utility for executing a set of hooks of each type. Implementation is largely copied from the main OpenFeature SDK.\n */\nexport class HookExecutor {\n constructor(private logger: Logger) {}\n\n async beforeHooks(hooks: Hook[] | undefined, hookContext: HookContext, hints: HookHints) {\n for (const hook of hooks ?? []) {\n // freeze the hookContext\n Object.freeze(hookContext);\n\n Object.assign(hookContext.context, {\n ...(await hook?.before?.(hookContext, Object.freeze(hints))),\n });\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(hookContext.context);\n }\n\n async afterHooks(\n hooks: Hook[] | undefined,\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n hints: HookHints,\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks ?? []) {\n await hook?.after?.(hookContext, evaluationDetails, hints);\n }\n }\n\n async errorHooks(hooks: Hook[] | undefined, hookContext: HookContext, err: unknown, hints: HookHints) {\n // run \"error\" hooks sequentially\n for (const hook of hooks ?? []) {\n try {\n await hook?.error?.(hookContext, err, hints);\n } catch (err) {\n this.logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this.logger.error(err.stack);\n }\n this.logger.error((err as Error)?.stack);\n }\n }\n }\n\n async finallyHooks(\n hooks: Hook[] | undefined,\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n hints: HookHints,\n ) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks ?? []) {\n try {\n await hook?.finally?.(hookContext, evaluationDetails, hints);\n } catch (err) {\n this.logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this.logger.error(err.stack);\n }\n this.logger.error((err as Error)?.stack);\n }\n }\n }\n}\n", "import type { EvaluationContext, ManageContext, ServerProviderStatus } from '@openfeature/core';\nimport { OpenFeatureCommonAPI, ProviderWrapper, objectOrUndefined, stringOrUndefined } 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,\n} from './transaction-context';\nimport { NOOP_TRANSACTION_CONTEXT_PROPAGATOR } 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 sdk: 'js-server',\n paradigm: 'server',\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 const 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 Object.assign(accumulatedContext, hookResult);\n Object.assign(hookContext.context, accumulatedContext);\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 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", "import_core", "import_core", "err", "import_core", "import_core", "err"]
|
|
7
7
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -590,6 +590,8 @@ var OpenFeatureClient = class {
|
|
|
590
590
|
name: (_a = this.options.domain) != null ? _a : this.options.name,
|
|
591
591
|
domain: (_b = this.options.domain) != null ? _b : this.options.name,
|
|
592
592
|
version: this.options.version,
|
|
593
|
+
sdk: "js-server",
|
|
594
|
+
paradigm: "server",
|
|
593
595
|
providerMetadata: this.providerAccessor().metadata
|
|
594
596
|
};
|
|
595
597
|
}
|
package/dist/esm/index.js.map
CHANGED
|
@@ -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/provider/multi-provider/multi-provider.ts", "../../src/provider/multi-provider/strategies.ts", "../../src/events/open-feature-event-emitter.ts", "../../src/events/events.ts", "../../src/provider/multi-provider/hook-executor.ts", "../../src/open-feature.ts", "../../src/client/internal/open-feature-client.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 { CommonProvider, EvaluationContext, JsonValue, Logger, ResolutionDetails } from '@openfeature/core';\nimport { ServerProviderStatus } 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 { EvaluationContext, FlagValueType, JsonValue, Logger, 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, FlagVariants } 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 * @deprecated Use {@link TypedInMemoryProvider} for type-safe flag configuration.\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\n/**\n * A simple OpenFeature provider intended for demos and as a test stub.\n * @example\n * ```\n * const provider = new TypedInMemoryProvider({\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * });\n *\n * const flags = {\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * } as const; // 'as const' needed to preserve the `defaultVariant` narrow literal type rather than `string`\n * const provider = new TypedInMemoryProvider(flags);\n * ```\n */\nexport class TypedInMemoryProvider<\n T extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>,\n> extends InMemoryProvider {\n constructor(flagConfiguration: FlagConfiguration<T> = {} as FlagConfiguration<T>) {\n super(flagConfiguration);\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n * @example\n * ```\n * provider.putConfiguration({\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * });\n *\n * const flags = {\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * } as const; // 'as const' needed to preserve the `defaultVariant` narrow literal type rather than `string`\n * provider.putConfiguration(flags);\n * ```\n */\n override putConfiguration<U extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>>(\n flagConfiguration: FlagConfiguration<U>,\n ) {\n super.putConfiguration(flagConfiguration);\n }\n}\n\n/**\n * The variants object for a flag in the {@link TypedInMemoryProvider}, containing all possible variants and their associated values.\n *\n * Can be used in combination with {@link InMemoryFlagConfiguration} to preserve type-safety when extending the provider class.\n * @example\n * ```\n * export class CustomInMemoryProvider<\n * T extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * > extends TypedInMemoryProvider<T> {\n * constructor(flagConfiguration: InMemoryFlagConfiguration<T>) {\n * super(flagConfiguration);\n * // custom logic ...\n * }\n *\n * override putConfiguration<\n * U extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * >(flagConfiguration: InMemoryFlagConfiguration<U>) {\n * super.putConfiguration(flagConfiguration);\n * // custom logic ...\n * }\n * }\n * ```\n */\nexport type InMemoryFlagVariants<T extends string> = FlagVariants<T>;\n\n/**\n * The configuration object for the {@link TypedInMemoryProvider}, containing all flags and their specifications.\n *\n * Can be used in combination with {@link InMemoryFlagVariants} to preserve type-safety when extending the provider class.\n *\n * The generic ensures that the keys of the `variants` object in each flag specification are consistent with the `defaultVariant` and the return type of `contextEvaluator`.\n * @example\n * ```\n * export class CustomInMemoryProvider<\n * T extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * > extends TypedInMemoryProvider<T> {\n * constructor(flagConfiguration: InMemoryFlagConfiguration<T>) {\n * super(flagConfiguration);\n * // custom logic ...\n * }\n *\n * override putConfiguration<\n * U extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * >(flagConfiguration: InMemoryFlagConfiguration<U>) {\n * super.putConfiguration(flagConfiguration);\n * // custom logic ...\n * }\n * }\n * ```\n */\nexport type InMemoryFlagConfiguration<\n T extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>,\n> = FlagConfiguration<T>;\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 BeforeHookContext,\n EvaluationContext,\n EvaluationDetails,\n FlagMetadata,\n FlagValue,\n FlagValueType,\n HookContext,\n HookHints,\n JsonValue,\n Logger,\n OpenFeatureError,\n ProviderMetadata,\n ResolutionDetails,\n TrackingEventDetails,\n BaseProviderResolutionResult,\n ProviderEntryInput,\n RegisteredProvider,\n BaseEvaluationStrategy,\n} from '@openfeature/core';\nimport {\n DefaultLogger,\n ErrorCode,\n GeneralError,\n StandardResolutionReasons,\n constructAggregateError,\n throwAggregateErrorFromPromiseResults,\n StatusTracker,\n} from '@openfeature/core';\nimport { FirstMatchStrategy } from './strategies';\nimport type { Provider } from '../provider';\nimport { ProviderStatus } from '../provider';\nimport type { Hook } from '../../hooks';\nimport { OpenFeatureEventEmitter } from '../../events/open-feature-event-emitter';\nimport { ProviderEvents } from '../../events';\nimport { HookExecutor } from './hook-executor';\n\nexport class MultiProvider implements Provider {\n readonly runsOn = 'server';\n\n public readonly events = new OpenFeatureEventEmitter();\n\n private hookContexts: WeakMap<EvaluationContext, HookContext> = new WeakMap<EvaluationContext, HookContext>();\n private hookHints: WeakMap<EvaluationContext, HookHints> = new WeakMap<EvaluationContext, HookHints>();\n\n metadata: ProviderMetadata;\n\n providerEntries: RegisteredProvider<Provider>[] = [];\n private providerEntriesByName: Record<string, RegisteredProvider<Provider>> = {};\n\n private hookExecutor: HookExecutor;\n private statusTracker = new StatusTracker<\n (typeof ProviderEvents)[keyof typeof ProviderEvents],\n ProviderStatus,\n Provider\n >(this.events, ProviderStatus, ProviderEvents);\n\n constructor(\n readonly constructorProviders: ProviderEntryInput<Provider>[],\n private readonly evaluationStrategy: BaseEvaluationStrategy<ProviderStatus, Provider> = new FirstMatchStrategy(),\n private readonly logger: Logger = new DefaultLogger(),\n ) {\n this.hookExecutor = new HookExecutor(this.logger);\n\n this.registerProviders(constructorProviders);\n\n const aggregateMetadata = Object.keys(this.providerEntriesByName).reduce((acc, name) => {\n return { ...acc, [name]: this.providerEntriesByName[name].provider.metadata };\n }, {});\n\n this.metadata = {\n ...aggregateMetadata,\n name: MultiProvider.name,\n };\n }\n\n private registerProviders(constructorProviders: ProviderEntryInput<Provider>[]) {\n const providersByName: Record<string, Provider[]> = {};\n\n for (const constructorProvider of constructorProviders) {\n const providerName = constructorProvider.provider.metadata.name;\n const candidateName = constructorProvider.name ?? providerName;\n\n if (constructorProvider.name && providersByName[constructorProvider.name]) {\n throw new Error('Provider names must be unique');\n }\n\n providersByName[candidateName] ??= [];\n providersByName[candidateName].push(constructorProvider.provider);\n }\n\n for (const name of Object.keys(providersByName)) {\n const useIndexedNames = providersByName[name].length > 1;\n for (let i = 0; i < providersByName[name].length; i++) {\n const indexedName = useIndexedNames ? `${name}-${i + 1}` : name;\n this.providerEntriesByName[indexedName] = { provider: providersByName[name][i], name: indexedName };\n this.providerEntries.push(this.providerEntriesByName[indexedName]);\n this.statusTracker.wrapEventHandler(this.providerEntriesByName[indexedName]);\n }\n }\n\n // just make sure we don't accidentally modify these later\n Object.freeze(this.providerEntries);\n Object.freeze(this.providerEntriesByName);\n }\n\n async initialize(context?: EvaluationContext): Promise<void> {\n const result = await Promise.allSettled(\n this.providerEntries.map((provider) => provider.provider.initialize?.(context)),\n );\n throwAggregateErrorFromPromiseResults(result, this.providerEntries);\n }\n\n async onClose(): Promise<void> {\n const result = await Promise.allSettled(this.providerEntries.map((provider) => provider.provider.onClose?.()));\n throwAggregateErrorFromPromiseResults(result, this.providerEntries);\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<boolean>> {\n return this.flagResolutionProxy<boolean>(flagKey, 'boolean', defaultValue, context);\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<string>> {\n return this.flagResolutionProxy(flagKey, 'string', defaultValue, context);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<number>> {\n return this.flagResolutionProxy(flagKey, 'number', defaultValue, context);\n }\n\n resolveObjectEvaluation<U extends JsonValue>(\n flagKey: string,\n defaultValue: U,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<U>> {\n return this.flagResolutionProxy(flagKey, 'object', defaultValue, context);\n }\n\n private async flagResolutionProxy<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n flagType: FlagValueType,\n defaultValue: T,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<T>> {\n const hookContext = this.hookContexts.get(context);\n const hookHints = this.hookHints.get(context);\n\n if (!hookContext || !hookHints) {\n throw new GeneralError('Hook context not available for evaluation');\n }\n\n const tasks: Promise<[boolean, BaseProviderResolutionResult<T, ProviderStatus, Provider> | null]>[] = [];\n\n for (const providerEntry of this.providerEntries) {\n const task = this.evaluateProviderEntry(\n flagKey,\n flagType,\n defaultValue,\n providerEntry,\n hookContext,\n hookHints,\n context,\n );\n\n tasks.push(task);\n\n if (this.evaluationStrategy.runMode === 'sequential') {\n const [shouldEvaluateNext] = await task;\n if (!shouldEvaluateNext) {\n break;\n }\n }\n }\n\n const results = await Promise.all(tasks);\n const resolutions = results\n .map(([, resolution]) => resolution)\n .filter((r): r is BaseProviderResolutionResult<T, ProviderStatus, Provider> => Boolean(r));\n\n const finalResult = this.evaluationStrategy.determineFinalResult({ flagKey, flagType }, context, resolutions);\n\n if (finalResult.errors?.length) {\n throw constructAggregateError(finalResult.errors);\n }\n\n if (!finalResult.details) {\n throw new GeneralError('No result was returned from any provider');\n }\n\n return finalResult.details;\n }\n\n private async evaluateProviderEntry<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n flagType: FlagValueType,\n defaultValue: T,\n providerEntry: RegisteredProvider<Provider>,\n hookContext: HookContext,\n hookHints: HookHints,\n context: EvaluationContext,\n ): Promise<[boolean, BaseProviderResolutionResult<T, ProviderStatus, Provider> | null]> {\n let evaluationResult: ResolutionDetails<T> | undefined = undefined;\n const provider = providerEntry.provider;\n const strategyContext = {\n flagKey,\n flagType,\n provider,\n providerName: providerEntry.name,\n providerStatus: this.statusTracker.providerStatus(providerEntry.name),\n };\n\n if (!this.evaluationStrategy.shouldEvaluateThisProvider(strategyContext, context)) {\n return [true, null];\n }\n\n let resolution: BaseProviderResolutionResult<T, ProviderStatus, Provider>;\n\n try {\n evaluationResult = await this.evaluateProviderAndHooks(flagKey, defaultValue, provider, hookContext, hookHints);\n resolution = {\n details: evaluationResult,\n provider,\n providerName: providerEntry.name,\n };\n } catch (error: unknown) {\n resolution = {\n thrownError: error,\n provider,\n providerName: providerEntry.name,\n };\n }\n\n return [\n this.evaluationStrategy.runMode === 'sequential'\n ? this.evaluationStrategy.shouldEvaluateNextProvider(strategyContext, context, resolution)\n : true,\n resolution,\n ];\n }\n\n private async evaluateProviderAndHooks<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n defaultValue: T,\n provider: Provider,\n hookContext: HookContext,\n hookHints: HookHints,\n ) {\n let providerContext: EvaluationContext | undefined = undefined;\n let evaluationDetails: EvaluationDetails<T>;\n\n // create a copy of the shared hook context because we're going to mutate the evaluation context\n const hookContextCopy = { ...hookContext, context: { ...hookContext.context } };\n\n try {\n // return the modified provider context and mutate the hook context to contain it\n providerContext = await this.hookExecutor.beforeHooks(provider.hooks, hookContextCopy, hookHints);\n\n const resolutionDetails = (await this.callProviderResolve(\n provider,\n flagKey,\n defaultValue,\n providerContext || {},\n )) as ResolutionDetails<T>;\n\n evaluationDetails = {\n ...resolutionDetails,\n flagMetadata: Object.freeze(resolutionDetails.flagMetadata ?? {}),\n flagKey,\n };\n\n await this.hookExecutor.afterHooks(provider.hooks, hookContextCopy, evaluationDetails, hookHints);\n } catch (error: unknown) {\n await this.hookExecutor.errorHooks(provider.hooks, hookContextCopy, error, hookHints);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, error);\n }\n await this.hookExecutor.finallyHooks(provider.hooks, hookContextCopy, evaluationDetails, hookHints);\n return evaluationDetails;\n }\n\n private async callProviderResolve<T extends boolean | string | number | JsonValue>(\n provider: Provider,\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n ) {\n switch (typeof defaultValue) {\n case 'string':\n return await provider.resolveStringEvaluation(flagKey, defaultValue, context, this.logger);\n case 'number':\n return await provider.resolveNumberEvaluation(flagKey, defaultValue, context, this.logger);\n case 'object':\n return await provider.resolveObjectEvaluation(flagKey, defaultValue, context, this.logger);\n case 'boolean':\n return await provider.resolveBooleanEvaluation(flagKey, defaultValue, context, this.logger);\n default:\n throw new GeneralError('Invalid flag evaluation type');\n }\n }\n\n public get hooks(): Hook[] {\n return [\n {\n before: async (hookContext: BeforeHookContext, hints: HookHints): Promise<EvaluationContext> => {\n this.hookContexts.set(hookContext.context, hookContext);\n this.hookHints.set(hookContext.context, hints ?? {});\n return hookContext.context;\n },\n },\n ];\n }\n\n track(trackingEventName: string, context: EvaluationContext, trackingEventDetails: TrackingEventDetails): void {\n for (const providerEntry of this.providerEntries) {\n if (!providerEntry.provider.track) {\n continue;\n }\n\n const strategyContext = {\n provider: providerEntry.provider,\n providerName: providerEntry.name,\n providerStatus: this.statusTracker.providerStatus(providerEntry.name),\n };\n\n if (\n this.evaluationStrategy.shouldTrackWithThisProvider(\n strategyContext,\n context,\n trackingEventName,\n trackingEventDetails,\n )\n ) {\n try {\n providerEntry.provider.track?.(trackingEventName, context, trackingEventDetails);\n } catch (error) {\n // Log error but don't throw - tracking shouldn't break application flow\n this.logger.error(\n `Error tracking event \"${trackingEventName}\" with provider \"${providerEntry.name}\":`,\n error,\n );\n }\n }\n }\n }\n\n private getErrorEvaluationDetails<T extends FlagValue>(\n flagKey: string,\n defaultValue: T,\n err: unknown,\n flagMetadata: FlagMetadata = {},\n ): EvaluationDetails<T> {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze(flagMetadata),\n flagKey,\n };\n }\n}\n", "/**\n * Pre-configured strategy exports for the server SDK.\n * These classes extend the base strategies from @openfeature/core with the\n * server-specific ProviderStatus enum already bound.\n */\nimport {\n BaseFirstMatchStrategy,\n BaseFirstSuccessfulStrategy,\n BaseComparisonStrategy,\n type BaseStrategyProviderContext,\n type BaseStrategyPerProviderContext,\n type BaseProviderResolutionResult,\n type BaseProviderResolutionSuccessResult,\n type BaseProviderResolutionErrorResult,\n type BaseFinalResult,\n type StrategyEvaluationContext,\n type FlagValue,\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport { ProviderStatus } from '../provider';\n\n/**\n * Pre-bound type aliases for server SDK.\n * These types have the server-specific ProviderStatus and Provider types already applied,\n * providing backward compatibility for existing consumers.\n */\nexport type StrategyProviderContext = BaseStrategyProviderContext<ProviderStatus, Provider>;\nexport type StrategyPerProviderContext = BaseStrategyPerProviderContext<ProviderStatus, Provider>;\nexport type ProviderResolutionResult<T extends FlagValue> = BaseProviderResolutionResult<T, ProviderStatus, Provider>;\nexport type ProviderResolutionSuccessResult<T extends FlagValue> = BaseProviderResolutionSuccessResult<\n T,\n ProviderStatus,\n Provider\n>;\nexport type ProviderResolutionErrorResult = BaseProviderResolutionErrorResult<ProviderStatus, Provider>;\nexport type FinalResult<T extends FlagValue> = BaseFinalResult<T, ProviderStatus, Provider>;\nexport type { StrategyEvaluationContext };\n\n/**\n * Evaluates providers in order and returns the first successful result.\n * Providers that return FLAG_NOT_FOUND are skipped. Any other error stops evaluation.\n */\nexport class FirstMatchStrategy extends BaseFirstMatchStrategy<ProviderStatus, Provider> {\n constructor() {\n super(ProviderStatus);\n }\n}\n\n/**\n * Evaluates providers in order and returns the first successful result.\n * Any error causes that provider to be skipped.\n */\nexport class FirstSuccessfulStrategy extends BaseFirstSuccessfulStrategy<ProviderStatus, Provider> {\n constructor() {\n super(ProviderStatus);\n }\n}\n\n/**\n * Evaluates all providers in parallel and compares results.\n * If all providers agree, returns that result. Otherwise, returns the fallback provider's result.\n */\nexport class ComparisonStrategy extends BaseComparisonStrategy<ProviderStatus, Provider> {\n constructor(fallbackProvider: Provider, onMismatch?: (resolutions: ProviderResolutionResult<FlagValue>[]) => void) {\n super(ProviderStatus, fallbackProvider, onMismatch);\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}\n", "import { ServerProviderEvents } from '@openfeature/core';\n\nexport { ServerProviderEvents as ProviderEvents };\n", "import type { EvaluationDetails, FlagValue, HookContext, HookHints, Logger } from '@openfeature/core';\nimport type { Hook } from '../../hooks';\n\n/**\n * Utility for executing a set of hooks of each type. Implementation is largely copied from the main OpenFeature SDK.\n */\nexport class HookExecutor {\n constructor(private logger: Logger) {}\n\n async beforeHooks(hooks: Hook[] | undefined, hookContext: HookContext, hints: HookHints) {\n for (const hook of hooks ?? []) {\n // freeze the hookContext\n Object.freeze(hookContext);\n\n Object.assign(hookContext.context, {\n ...(await hook?.before?.(hookContext, Object.freeze(hints))),\n });\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(hookContext.context);\n }\n\n async afterHooks(\n hooks: Hook[] | undefined,\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n hints: HookHints,\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks ?? []) {\n await hook?.after?.(hookContext, evaluationDetails, hints);\n }\n }\n\n async errorHooks(hooks: Hook[] | undefined, hookContext: HookContext, err: unknown, hints: HookHints) {\n // run \"error\" hooks sequentially\n for (const hook of hooks ?? []) {\n try {\n await hook?.error?.(hookContext, err, hints);\n } catch (err) {\n this.logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this.logger.error(err.stack);\n }\n this.logger.error((err as Error)?.stack);\n }\n }\n }\n\n async finallyHooks(\n hooks: Hook[] | undefined,\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n hints: HookHints,\n ) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks ?? []) {\n try {\n await hook?.finally?.(hookContext, evaluationDetails, hints);\n } catch (err) {\n this.logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this.logger.error(err.stack);\n }\n this.logger.error((err as Error)?.stack);\n }\n }\n }\n}\n", "import type { EvaluationContext, ManageContext, ServerProviderStatus } from '@openfeature/core';\nimport { OpenFeatureCommonAPI, ProviderWrapper, objectOrUndefined, stringOrUndefined } 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,\n} from './transaction-context';\nimport { NOOP_TRANSACTION_CONTEXT_PROPAGATOR } 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 const 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 Object.assign(accumulatedContext, hookResult);\n Object.assign(hookContext.context, accumulatedContext);\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 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 { CommonProvider, EvaluationContext, JsonValue, Logger, ResolutionDetails } from '@openfeature/core';\nimport { ServerProviderStatus } 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 { EvaluationContext, FlagValueType, JsonValue, Logger, 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, FlagVariants } 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 * @deprecated Use {@link TypedInMemoryProvider} for type-safe flag configuration.\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\n/**\n * A simple OpenFeature provider intended for demos and as a test stub.\n * @example\n * ```\n * const provider = new TypedInMemoryProvider({\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * });\n *\n * const flags = {\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * } as const; // 'as const' needed to preserve the `defaultVariant` narrow literal type rather than `string`\n * const provider = new TypedInMemoryProvider(flags);\n * ```\n */\nexport class TypedInMemoryProvider<\n T extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>,\n> extends InMemoryProvider {\n constructor(flagConfiguration: FlagConfiguration<T> = {} as FlagConfiguration<T>) {\n super(flagConfiguration);\n }\n\n /**\n * Overwrites the configured flags.\n * @param { FlagConfiguration } flagConfiguration new flag configuration\n * @example\n * ```\n * provider.putConfiguration({\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * });\n *\n * const flags = {\n * 'my-flag': {\n * variants: { on: true, off: false },\n * defaultVariant: 'on',\n * contextEvaluator: (ctx) => ctx?.user?.id === '123' ? 'on' : 'off',\n * disabled: false,\n * },\n * } as const; // 'as const' needed to preserve the `defaultVariant` narrow literal type rather than `string`\n * provider.putConfiguration(flags);\n * ```\n */\n override putConfiguration<U extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>>(\n flagConfiguration: FlagConfiguration<U>,\n ) {\n super.putConfiguration(flagConfiguration);\n }\n}\n\n/**\n * The variants object for a flag in the {@link TypedInMemoryProvider}, containing all possible variants and their associated values.\n *\n * Can be used in combination with {@link InMemoryFlagConfiguration} to preserve type-safety when extending the provider class.\n * @example\n * ```\n * export class CustomInMemoryProvider<\n * T extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * > extends TypedInMemoryProvider<T> {\n * constructor(flagConfiguration: InMemoryFlagConfiguration<T>) {\n * super(flagConfiguration);\n * // custom logic ...\n * }\n *\n * override putConfiguration<\n * U extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * >(flagConfiguration: InMemoryFlagConfiguration<U>) {\n * super.putConfiguration(flagConfiguration);\n * // custom logic ...\n * }\n * }\n * ```\n */\nexport type InMemoryFlagVariants<T extends string> = FlagVariants<T>;\n\n/**\n * The configuration object for the {@link TypedInMemoryProvider}, containing all flags and their specifications.\n *\n * Can be used in combination with {@link InMemoryFlagVariants} to preserve type-safety when extending the provider class.\n *\n * The generic ensures that the keys of the `variants` object in each flag specification are consistent with the `defaultVariant` and the return type of `contextEvaluator`.\n * @example\n * ```\n * export class CustomInMemoryProvider<\n * T extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * > extends TypedInMemoryProvider<T> {\n * constructor(flagConfiguration: InMemoryFlagConfiguration<T>) {\n * super(flagConfiguration);\n * // custom logic ...\n * }\n *\n * override putConfiguration<\n * U extends Record<string, InMemoryFlagVariants<string>> = Record<string, InMemoryFlagVariants<string>>,\n * >(flagConfiguration: InMemoryFlagConfiguration<U>) {\n * super.putConfiguration(flagConfiguration);\n * // custom logic ...\n * }\n * }\n * ```\n */\nexport type InMemoryFlagConfiguration<\n T extends Record<string, FlagVariants<string>> = Record<string, FlagVariants<string>>,\n> = FlagConfiguration<T>;\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 BeforeHookContext,\n EvaluationContext,\n EvaluationDetails,\n FlagMetadata,\n FlagValue,\n FlagValueType,\n HookContext,\n HookHints,\n JsonValue,\n Logger,\n OpenFeatureError,\n ProviderMetadata,\n ResolutionDetails,\n TrackingEventDetails,\n BaseProviderResolutionResult,\n ProviderEntryInput,\n RegisteredProvider,\n BaseEvaluationStrategy,\n} from '@openfeature/core';\nimport {\n DefaultLogger,\n ErrorCode,\n GeneralError,\n StandardResolutionReasons,\n constructAggregateError,\n throwAggregateErrorFromPromiseResults,\n StatusTracker,\n} from '@openfeature/core';\nimport { FirstMatchStrategy } from './strategies';\nimport type { Provider } from '../provider';\nimport { ProviderStatus } from '../provider';\nimport type { Hook } from '../../hooks';\nimport { OpenFeatureEventEmitter } from '../../events/open-feature-event-emitter';\nimport { ProviderEvents } from '../../events';\nimport { HookExecutor } from './hook-executor';\n\nexport class MultiProvider implements Provider {\n readonly runsOn = 'server';\n\n public readonly events = new OpenFeatureEventEmitter();\n\n private hookContexts: WeakMap<EvaluationContext, HookContext> = new WeakMap<EvaluationContext, HookContext>();\n private hookHints: WeakMap<EvaluationContext, HookHints> = new WeakMap<EvaluationContext, HookHints>();\n\n metadata: ProviderMetadata;\n\n providerEntries: RegisteredProvider<Provider>[] = [];\n private providerEntriesByName: Record<string, RegisteredProvider<Provider>> = {};\n\n private hookExecutor: HookExecutor;\n private statusTracker = new StatusTracker<\n (typeof ProviderEvents)[keyof typeof ProviderEvents],\n ProviderStatus,\n Provider\n >(this.events, ProviderStatus, ProviderEvents);\n\n constructor(\n readonly constructorProviders: ProviderEntryInput<Provider>[],\n private readonly evaluationStrategy: BaseEvaluationStrategy<ProviderStatus, Provider> = new FirstMatchStrategy(),\n private readonly logger: Logger = new DefaultLogger(),\n ) {\n this.hookExecutor = new HookExecutor(this.logger);\n\n this.registerProviders(constructorProviders);\n\n const aggregateMetadata = Object.keys(this.providerEntriesByName).reduce((acc, name) => {\n return { ...acc, [name]: this.providerEntriesByName[name].provider.metadata };\n }, {});\n\n this.metadata = {\n ...aggregateMetadata,\n name: MultiProvider.name,\n };\n }\n\n private registerProviders(constructorProviders: ProviderEntryInput<Provider>[]) {\n const providersByName: Record<string, Provider[]> = {};\n\n for (const constructorProvider of constructorProviders) {\n const providerName = constructorProvider.provider.metadata.name;\n const candidateName = constructorProvider.name ?? providerName;\n\n if (constructorProvider.name && providersByName[constructorProvider.name]) {\n throw new Error('Provider names must be unique');\n }\n\n providersByName[candidateName] ??= [];\n providersByName[candidateName].push(constructorProvider.provider);\n }\n\n for (const name of Object.keys(providersByName)) {\n const useIndexedNames = providersByName[name].length > 1;\n for (let i = 0; i < providersByName[name].length; i++) {\n const indexedName = useIndexedNames ? `${name}-${i + 1}` : name;\n this.providerEntriesByName[indexedName] = { provider: providersByName[name][i], name: indexedName };\n this.providerEntries.push(this.providerEntriesByName[indexedName]);\n this.statusTracker.wrapEventHandler(this.providerEntriesByName[indexedName]);\n }\n }\n\n // just make sure we don't accidentally modify these later\n Object.freeze(this.providerEntries);\n Object.freeze(this.providerEntriesByName);\n }\n\n async initialize(context?: EvaluationContext): Promise<void> {\n const result = await Promise.allSettled(\n this.providerEntries.map((provider) => provider.provider.initialize?.(context)),\n );\n throwAggregateErrorFromPromiseResults(result, this.providerEntries);\n }\n\n async onClose(): Promise<void> {\n const result = await Promise.allSettled(this.providerEntries.map((provider) => provider.provider.onClose?.()));\n throwAggregateErrorFromPromiseResults(result, this.providerEntries);\n }\n\n resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<boolean>> {\n return this.flagResolutionProxy<boolean>(flagKey, 'boolean', defaultValue, context);\n }\n\n resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<string>> {\n return this.flagResolutionProxy(flagKey, 'string', defaultValue, context);\n }\n\n resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<number>> {\n return this.flagResolutionProxy(flagKey, 'number', defaultValue, context);\n }\n\n resolveObjectEvaluation<U extends JsonValue>(\n flagKey: string,\n defaultValue: U,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<U>> {\n return this.flagResolutionProxy(flagKey, 'object', defaultValue, context);\n }\n\n private async flagResolutionProxy<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n flagType: FlagValueType,\n defaultValue: T,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<T>> {\n const hookContext = this.hookContexts.get(context);\n const hookHints = this.hookHints.get(context);\n\n if (!hookContext || !hookHints) {\n throw new GeneralError('Hook context not available for evaluation');\n }\n\n const tasks: Promise<[boolean, BaseProviderResolutionResult<T, ProviderStatus, Provider> | null]>[] = [];\n\n for (const providerEntry of this.providerEntries) {\n const task = this.evaluateProviderEntry(\n flagKey,\n flagType,\n defaultValue,\n providerEntry,\n hookContext,\n hookHints,\n context,\n );\n\n tasks.push(task);\n\n if (this.evaluationStrategy.runMode === 'sequential') {\n const [shouldEvaluateNext] = await task;\n if (!shouldEvaluateNext) {\n break;\n }\n }\n }\n\n const results = await Promise.all(tasks);\n const resolutions = results\n .map(([, resolution]) => resolution)\n .filter((r): r is BaseProviderResolutionResult<T, ProviderStatus, Provider> => Boolean(r));\n\n const finalResult = this.evaluationStrategy.determineFinalResult({ flagKey, flagType }, context, resolutions);\n\n if (finalResult.errors?.length) {\n throw constructAggregateError(finalResult.errors);\n }\n\n if (!finalResult.details) {\n throw new GeneralError('No result was returned from any provider');\n }\n\n return finalResult.details;\n }\n\n private async evaluateProviderEntry<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n flagType: FlagValueType,\n defaultValue: T,\n providerEntry: RegisteredProvider<Provider>,\n hookContext: HookContext,\n hookHints: HookHints,\n context: EvaluationContext,\n ): Promise<[boolean, BaseProviderResolutionResult<T, ProviderStatus, Provider> | null]> {\n let evaluationResult: ResolutionDetails<T> | undefined = undefined;\n const provider = providerEntry.provider;\n const strategyContext = {\n flagKey,\n flagType,\n provider,\n providerName: providerEntry.name,\n providerStatus: this.statusTracker.providerStatus(providerEntry.name),\n };\n\n if (!this.evaluationStrategy.shouldEvaluateThisProvider(strategyContext, context)) {\n return [true, null];\n }\n\n let resolution: BaseProviderResolutionResult<T, ProviderStatus, Provider>;\n\n try {\n evaluationResult = await this.evaluateProviderAndHooks(flagKey, defaultValue, provider, hookContext, hookHints);\n resolution = {\n details: evaluationResult,\n provider,\n providerName: providerEntry.name,\n };\n } catch (error: unknown) {\n resolution = {\n thrownError: error,\n provider,\n providerName: providerEntry.name,\n };\n }\n\n return [\n this.evaluationStrategy.runMode === 'sequential'\n ? this.evaluationStrategy.shouldEvaluateNextProvider(strategyContext, context, resolution)\n : true,\n resolution,\n ];\n }\n\n private async evaluateProviderAndHooks<T extends boolean | string | number | JsonValue>(\n flagKey: string,\n defaultValue: T,\n provider: Provider,\n hookContext: HookContext,\n hookHints: HookHints,\n ) {\n let providerContext: EvaluationContext | undefined = undefined;\n let evaluationDetails: EvaluationDetails<T>;\n\n // create a copy of the shared hook context because we're going to mutate the evaluation context\n const hookContextCopy = { ...hookContext, context: { ...hookContext.context } };\n\n try {\n // return the modified provider context and mutate the hook context to contain it\n providerContext = await this.hookExecutor.beforeHooks(provider.hooks, hookContextCopy, hookHints);\n\n const resolutionDetails = (await this.callProviderResolve(\n provider,\n flagKey,\n defaultValue,\n providerContext || {},\n )) as ResolutionDetails<T>;\n\n evaluationDetails = {\n ...resolutionDetails,\n flagMetadata: Object.freeze(resolutionDetails.flagMetadata ?? {}),\n flagKey,\n };\n\n await this.hookExecutor.afterHooks(provider.hooks, hookContextCopy, evaluationDetails, hookHints);\n } catch (error: unknown) {\n await this.hookExecutor.errorHooks(provider.hooks, hookContextCopy, error, hookHints);\n evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, error);\n }\n await this.hookExecutor.finallyHooks(provider.hooks, hookContextCopy, evaluationDetails, hookHints);\n return evaluationDetails;\n }\n\n private async callProviderResolve<T extends boolean | string | number | JsonValue>(\n provider: Provider,\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n ) {\n switch (typeof defaultValue) {\n case 'string':\n return await provider.resolveStringEvaluation(flagKey, defaultValue, context, this.logger);\n case 'number':\n return await provider.resolveNumberEvaluation(flagKey, defaultValue, context, this.logger);\n case 'object':\n return await provider.resolveObjectEvaluation(flagKey, defaultValue, context, this.logger);\n case 'boolean':\n return await provider.resolveBooleanEvaluation(flagKey, defaultValue, context, this.logger);\n default:\n throw new GeneralError('Invalid flag evaluation type');\n }\n }\n\n public get hooks(): Hook[] {\n return [\n {\n before: async (hookContext: BeforeHookContext, hints: HookHints): Promise<EvaluationContext> => {\n this.hookContexts.set(hookContext.context, hookContext);\n this.hookHints.set(hookContext.context, hints ?? {});\n return hookContext.context;\n },\n },\n ];\n }\n\n track(trackingEventName: string, context: EvaluationContext, trackingEventDetails: TrackingEventDetails): void {\n for (const providerEntry of this.providerEntries) {\n if (!providerEntry.provider.track) {\n continue;\n }\n\n const strategyContext = {\n provider: providerEntry.provider,\n providerName: providerEntry.name,\n providerStatus: this.statusTracker.providerStatus(providerEntry.name),\n };\n\n if (\n this.evaluationStrategy.shouldTrackWithThisProvider(\n strategyContext,\n context,\n trackingEventName,\n trackingEventDetails,\n )\n ) {\n try {\n providerEntry.provider.track?.(trackingEventName, context, trackingEventDetails);\n } catch (error) {\n // Log error but don't throw - tracking shouldn't break application flow\n this.logger.error(\n `Error tracking event \"${trackingEventName}\" with provider \"${providerEntry.name}\":`,\n error,\n );\n }\n }\n }\n }\n\n private getErrorEvaluationDetails<T extends FlagValue>(\n flagKey: string,\n defaultValue: T,\n err: unknown,\n flagMetadata: FlagMetadata = {},\n ): EvaluationDetails<T> {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagMetadata: Object.freeze(flagMetadata),\n flagKey,\n };\n }\n}\n", "/**\n * Pre-configured strategy exports for the server SDK.\n * These classes extend the base strategies from @openfeature/core with the\n * server-specific ProviderStatus enum already bound.\n */\nimport {\n BaseFirstMatchStrategy,\n BaseFirstSuccessfulStrategy,\n BaseComparisonStrategy,\n type BaseStrategyProviderContext,\n type BaseStrategyPerProviderContext,\n type BaseProviderResolutionResult,\n type BaseProviderResolutionSuccessResult,\n type BaseProviderResolutionErrorResult,\n type BaseFinalResult,\n type StrategyEvaluationContext,\n type FlagValue,\n} from '@openfeature/core';\nimport type { Provider } from '../provider';\nimport { ProviderStatus } from '../provider';\n\n/**\n * Pre-bound type aliases for server SDK.\n * These types have the server-specific ProviderStatus and Provider types already applied,\n * providing backward compatibility for existing consumers.\n */\nexport type StrategyProviderContext = BaseStrategyProviderContext<ProviderStatus, Provider>;\nexport type StrategyPerProviderContext = BaseStrategyPerProviderContext<ProviderStatus, Provider>;\nexport type ProviderResolutionResult<T extends FlagValue> = BaseProviderResolutionResult<T, ProviderStatus, Provider>;\nexport type ProviderResolutionSuccessResult<T extends FlagValue> = BaseProviderResolutionSuccessResult<\n T,\n ProviderStatus,\n Provider\n>;\nexport type ProviderResolutionErrorResult = BaseProviderResolutionErrorResult<ProviderStatus, Provider>;\nexport type FinalResult<T extends FlagValue> = BaseFinalResult<T, ProviderStatus, Provider>;\nexport type { StrategyEvaluationContext };\n\n/**\n * Evaluates providers in order and returns the first successful result.\n * Providers that return FLAG_NOT_FOUND are skipped. Any other error stops evaluation.\n */\nexport class FirstMatchStrategy extends BaseFirstMatchStrategy<ProviderStatus, Provider> {\n constructor() {\n super(ProviderStatus);\n }\n}\n\n/**\n * Evaluates providers in order and returns the first successful result.\n * Any error causes that provider to be skipped.\n */\nexport class FirstSuccessfulStrategy extends BaseFirstSuccessfulStrategy<ProviderStatus, Provider> {\n constructor() {\n super(ProviderStatus);\n }\n}\n\n/**\n * Evaluates all providers in parallel and compares results.\n * If all providers agree, returns that result. Otherwise, returns the fallback provider's result.\n */\nexport class ComparisonStrategy extends BaseComparisonStrategy<ProviderStatus, Provider> {\n constructor(fallbackProvider: Provider, onMismatch?: (resolutions: ProviderResolutionResult<FlagValue>[]) => void) {\n super(ProviderStatus, fallbackProvider, onMismatch);\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}\n", "import { ServerProviderEvents } from '@openfeature/core';\n\nexport { ServerProviderEvents as ProviderEvents };\n", "import type { EvaluationDetails, FlagValue, HookContext, HookHints, Logger } from '@openfeature/core';\nimport type { Hook } from '../../hooks';\n\n/**\n * Utility for executing a set of hooks of each type. Implementation is largely copied from the main OpenFeature SDK.\n */\nexport class HookExecutor {\n constructor(private logger: Logger) {}\n\n async beforeHooks(hooks: Hook[] | undefined, hookContext: HookContext, hints: HookHints) {\n for (const hook of hooks ?? []) {\n // freeze the hookContext\n Object.freeze(hookContext);\n\n Object.assign(hookContext.context, {\n ...(await hook?.before?.(hookContext, Object.freeze(hints))),\n });\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(hookContext.context);\n }\n\n async afterHooks(\n hooks: Hook[] | undefined,\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n hints: HookHints,\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks ?? []) {\n await hook?.after?.(hookContext, evaluationDetails, hints);\n }\n }\n\n async errorHooks(hooks: Hook[] | undefined, hookContext: HookContext, err: unknown, hints: HookHints) {\n // run \"error\" hooks sequentially\n for (const hook of hooks ?? []) {\n try {\n await hook?.error?.(hookContext, err, hints);\n } catch (err) {\n this.logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this.logger.error(err.stack);\n }\n this.logger.error((err as Error)?.stack);\n }\n }\n }\n\n async finallyHooks(\n hooks: Hook[] | undefined,\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n hints: HookHints,\n ) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks ?? []) {\n try {\n await hook?.finally?.(hookContext, evaluationDetails, hints);\n } catch (err) {\n this.logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this.logger.error(err.stack);\n }\n this.logger.error((err as Error)?.stack);\n }\n }\n }\n}\n", "import type { EvaluationContext, ManageContext, ServerProviderStatus } from '@openfeature/core';\nimport { OpenFeatureCommonAPI, ProviderWrapper, objectOrUndefined, stringOrUndefined } 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,\n} from './transaction-context';\nimport { NOOP_TRANSACTION_CONTEXT_PROPAGATOR } 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 sdk: 'js-server',\n paradigm: 'server',\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 const 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 Object.assign(accumulatedContext, hookResult);\n Object.assign(hookContext.context, accumulatedContext);\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 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", "GeneralError", "StandardResolutionReasons", "err", "GeneralError", "ErrorCode", "StandardResolutionReasons", "ErrorCode", "StandardResolutionReasons", "err", "ErrorCode", "StandardResolutionReasons"]
|
|
7
7
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseHook, FlagValue, EvaluationContext, BooleanFlagKey, HookHints, EvaluationDetails, StringFlagKey, NumberFlagKey, ObjectFlagKey, JsonValue, CommonProvider, ServerProviderStatus, Logger, ResolutionDetails, GenericEventEmitter, ServerProviderEvents, ProviderEntryInput, ProviderMetadata, RegisteredProvider, BaseEvaluationStrategy, TrackingEventDetails, BaseStrategyProviderContext, BaseStrategyPerProviderContext, BaseProviderResolutionResult, BaseProviderResolutionSuccessResult, BaseProviderResolutionErrorResult, BaseFinalResult, BaseFirstMatchStrategy, BaseFirstSuccessfulStrategy, BaseComparisonStrategy, EvaluationLifeCycle, ManageContext, ManageLogger, Eventing,
|
|
1
|
+
import { BaseHook, FlagValue, EvaluationContext, BooleanFlagKey, HookHints, EvaluationDetails, StringFlagKey, NumberFlagKey, ObjectFlagKey, JsonValue, CommonProvider, ServerProviderStatus, Logger, ResolutionDetails, GenericEventEmitter, ServerProviderEvents, ProviderEntryInput, ProviderMetadata, RegisteredProvider, BaseEvaluationStrategy, TrackingEventDetails, BaseStrategyProviderContext, BaseStrategyPerProviderContext, BaseProviderResolutionResult, BaseProviderResolutionSuccessResult, BaseProviderResolutionErrorResult, BaseFinalResult, BaseFirstMatchStrategy, BaseFirstSuccessfulStrategy, BaseComparisonStrategy, EvaluationLifeCycle, ManageContext, ManageLogger, Eventing, MetadataClient, OpenFeatureCommonAPI, ProviderWrapper } from '@openfeature/core';
|
|
2
2
|
export * from '@openfeature/core';
|
|
3
3
|
export { ServerProviderEvents as ProviderEvents, ServerProviderStatus as ProviderStatus, StrategyEvaluationContext } from '@openfeature/core';
|
|
4
4
|
import { EventEmitter } from 'node:events';
|
|
@@ -411,8 +411,7 @@ interface Tracking {
|
|
|
411
411
|
track(trackingEventName: string, context?: EvaluationContext, trackingEventDetails?: TrackingEventDetails): void;
|
|
412
412
|
}
|
|
413
413
|
|
|
414
|
-
interface Client extends EvaluationLifeCycle<Client>, Features, ManageContext<Client>, ManageLogger<Client>, Tracking, Eventing<ServerProviderEvents
|
|
415
|
-
readonly metadata: ClientMetadata;
|
|
414
|
+
interface Client extends EvaluationLifeCycle<Client>, Features, ManageContext<Client>, ManageLogger<Client>, Tracking, Eventing<ServerProviderEvents>, MetadataClient {
|
|
416
415
|
/**
|
|
417
416
|
* Returns the status of the associated provider.
|
|
418
417
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openfeature/server-sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.22.0",
|
|
4
4
|
"description": "OpenFeature SDK for JavaScript",
|
|
5
5
|
"main": "./dist/cjs/index.js",
|
|
6
6
|
"files": [
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"node": ">=20"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
|
-
"@openfeature/core": "^1.
|
|
51
|
+
"@openfeature/core": "^1.11.0"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@openfeature/core": "^1.9.2"
|