diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index a45964d60..116336b6f 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -2,4 +2,5 @@ export * from './client'; export * from './provider'; export * from './evaluation'; export * from './open-feature'; +export * from './transaction-context'; export * from '@openfeature/shared'; diff --git a/packages/server/src/open-feature.ts b/packages/server/src/open-feature.ts index fb6d88aa1..962bb20d1 100644 --- a/packages/server/src/open-feature.ts +++ b/packages/server/src/open-feature.ts @@ -6,6 +6,12 @@ import { objectOrUndefined, stringOrUndefined, } from '@openfeature/shared'; +import { + ManageTransactionContextPropagator, + NOOP_TRANSACTION_CONTEXT_PROPAGATOR, + TransactionContext, + TransactionContextPropagator, +} from './transaction-context'; import { Client, OpenFeatureClient } from './client'; // use a symbol as a key for the global singleton @@ -16,7 +22,11 @@ type OpenFeatureGlobal = { }; const _globalThis = globalThis as OpenFeatureGlobal; -export class OpenFeatureAPI extends OpenFeatureCommonAPI implements ManageContext { +export class OpenFeatureAPI + extends OpenFeatureCommonAPI + implements ManageContext, ManageTransactionContextPropagator> +{ + private _transactionContextPropagator: TransactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR; protected _defaultProvider: Provider = NOOP_PROVIDER; private constructor() { @@ -111,6 +121,39 @@ export class OpenFeatureAPI extends OpenFeatureCommonAPI implements Ma clearProviders(): Promise { return super.clearProvidersAndSetDefault(NOOP_PROVIDER); } + + setTransactionContextPropagator( + transactionContextPropagator: TransactionContextPropagator + ): OpenFeatureCommonAPI { + const baseMessage = 'Invalid TransactionContextPropagator, will not be set: '; + if (typeof transactionContextPropagator?.getTransactionContext !== 'function') { + this._logger.error(`${baseMessage}: getTransactionContext is not a function.`); + } else if (typeof transactionContextPropagator?.setTransactionContext !== 'function') { + this._logger.error(`${baseMessage}: setTransactionContext is not a function.`); + } else { + this._transactionContextPropagator = transactionContextPropagator; + } + return this; + } + + setTransactionContext( + transactionContext: TransactionContext, + callback: (...args: unknown[]) => R, + ...args: unknown[] + ): void { + this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args); + } + + getTransactionContext(): TransactionContext { + try { + return this._transactionContextPropagator.getTransactionContext(); + } catch (err: unknown) { + const error = err as Error | undefined; + this._logger.error(`Error getting transaction context: ${error?.message}, returning empty context.`); + this._logger.error(error?.stack); + return {}; + } + } } /** diff --git a/packages/shared/src/transaction-context/index.ts b/packages/server/src/transaction-context/index.ts similarity index 100% rename from packages/shared/src/transaction-context/index.ts rename to packages/server/src/transaction-context/index.ts diff --git a/packages/shared/src/transaction-context/no-op-transaction-context-propagator.ts b/packages/server/src/transaction-context/no-op-transaction-context-propagator.ts similarity index 87% rename from packages/shared/src/transaction-context/no-op-transaction-context-propagator.ts rename to packages/server/src/transaction-context/no-op-transaction-context-propagator.ts index 13ee4ce9a..0dbeaaa5b 100644 --- a/packages/shared/src/transaction-context/no-op-transaction-context-propagator.ts +++ b/packages/server/src/transaction-context/no-op-transaction-context-propagator.ts @@ -1,4 +1,4 @@ -import { EvaluationContext } from '../evaluation'; +import { EvaluationContext } from '@openfeature/shared'; import { TransactionContextPropagator } from './transaction-context'; class NoopTransactionContextPropagator implements TransactionContextPropagator { diff --git a/packages/shared/src/transaction-context/transaction-context.ts b/packages/server/src/transaction-context/transaction-context.ts similarity index 97% rename from packages/shared/src/transaction-context/transaction-context.ts rename to packages/server/src/transaction-context/transaction-context.ts index 92c86800a..d69c5f86a 100644 --- a/packages/shared/src/transaction-context/transaction-context.ts +++ b/packages/server/src/transaction-context/transaction-context.ts @@ -1,4 +1,4 @@ -import { EvaluationContext } from '../evaluation'; +import { EvaluationContext } from '@openfeature/shared'; /** * Transaction context is a mechanism for adding transaction specific context that diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index a009632f7..8a85f4142 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -6,6 +6,5 @@ export * from './events'; export * from './logger'; export * from './provider'; export * from './evaluation'; -export * from './transaction-context'; export * from './type-guards'; export * from './open-feature'; diff --git a/packages/shared/src/open-feature.ts b/packages/shared/src/open-feature.ts index ca3373216..1f6f23eef 100644 --- a/packages/shared/src/open-feature.ts +++ b/packages/shared/src/open-feature.ts @@ -6,24 +6,13 @@ import { isDefined } from './filter'; import { EvaluationLifeCycle, Hook } from './hooks'; import { DefaultLogger, Logger, ManageLogger, SafeLogger } from './logger'; import { CommonProvider, ProviderMetadata, ProviderStatus } from './provider'; -import { - ManageTransactionContextPropagator, - NOOP_TRANSACTION_CONTEXT_PROPAGATOR, - TransactionContext, - TransactionContextPropagator, -} from './transaction-context'; import { objectOrUndefined, stringOrUndefined } from './type-guards'; import { Paradigm } from './types'; export abstract class OpenFeatureCommonAPI

- implements - Eventing, - EvaluationLifeCycle>, - ManageLogger>, - ManageTransactionContextPropagator> + implements Eventing, EvaluationLifeCycle>, ManageLogger> { protected _hooks: Hook[] = []; - protected _transactionContextPropagator: TransactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR; protected _context: EvaluationContext = {}; protected _logger: Logger = new DefaultLogger(); @@ -350,35 +339,4 @@ export abstract class OpenFeatureCommonAPI

{ - const baseMessage = 'Invalid TransactionContextPropagator, will not be set: '; - if (typeof transactionContextPropagator?.getTransactionContext !== 'function') { - this._logger.error(`${baseMessage}: getTransactionContext is not a function.`); - } else if (typeof transactionContextPropagator?.setTransactionContext !== 'function') { - this._logger.error(`${baseMessage}: setTransactionContext is not a function.`); - } else { - this._transactionContextPropagator = transactionContextPropagator; - } - return this; - } - - setTransactionContext( - transactionContext: TransactionContext, - callback: (...args: unknown[]) => R, - ...args: unknown[] - ): void { - this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args); - } - - getTransactionContext(): TransactionContext { - try { - return this._transactionContextPropagator.getTransactionContext(); - } catch (err: unknown) { - const error = err as Error | undefined; - this._logger.error(`Error getting transaction context: ${error?.message}, returning empty context.`); - this._logger.error(error?.stack); - return {}; - } - } } diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index 04772c62a..16a0c4d59 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -98,7 +98,9 @@ }, "include": [ "./src/**/*" - ], +, +"../server/src/transaction-context" +], "exclude": [ "node_modules", "**/*.test.js"