Skip to content

Commit ec910a3

Browse files
feat: migrate multi-provider into js-sdk with normalized imports and event typings
1 parent e916c2d commit ec910a3

22 files changed

+99
-96
lines changed

packages/server/src/provider/multi-provider/errors.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import type { ErrorCode } from '@openfeature/server-sdk';
2-
import { GeneralError, OpenFeatureError } from '@openfeature/server-sdk';
1+
import type { ErrorCode } from '@openfeature/core';
2+
import { GeneralError, OpenFeatureError } from '@openfeature/core';
33
import type { RegisteredProvider } from './types';
44

55
export class ErrorWithCode extends OpenFeatureError {

packages/server/src/provider/multi-provider/hook-executor.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import type { EvaluationDetails, FlagValue, Hook, HookContext, HookHints, Logger } from '@openfeature/server-sdk';
1+
import type { EvaluationDetails, FlagValue, HookContext, HookHints, Logger } from '@openfeature/core';
2+
import type { Hook } from '../../hooks';
23

34
/**
45
* Utility for executing a set of hooks of each type. Implementation is largely copied from the main OpenFeature SDK.

packages/server/src/provider/multi-provider/multi-provider.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,19 @@ import type {
55
FlagMetadata,
66
FlagValue,
77
FlagValueType,
8-
Hook,
98
HookContext,
109
HookHints,
1110
JsonValue,
1211
Logger,
1312
OpenFeatureError,
14-
Provider,
1513
ProviderMetadata,
1614
ResolutionDetails,
1715
TrackingEventDetails,
18-
} from '@openfeature/server-sdk';
19-
import {
20-
DefaultLogger,
21-
ErrorCode,
22-
GeneralError,
23-
OpenFeatureEventEmitter,
24-
StandardResolutionReasons,
25-
} from '@openfeature/server-sdk';
16+
} from '@openfeature/core';
17+
import { DefaultLogger, ErrorCode, GeneralError, StandardResolutionReasons } from '@openfeature/core';
18+
import type { Provider } from '../provider';
19+
import type { Hook } from '../../hooks';
20+
import { OpenFeatureEventEmitter } from '../../events/open-feature-event-emitter';
2621
import { constructAggregateError, throwAggregateErrorFromPromiseResults } from './errors';
2722
import { HookExecutor } from './hook-executor';
2823
import { StatusTracker } from './status-tracker';
@@ -177,7 +172,7 @@ export class MultiProvider implements Provider {
177172

178173
const results = await Promise.all(tasks);
179174
const resolutions = results
180-
.map(([_, resolution]) => resolution)
175+
.map(([, resolution]) => resolution)
181176
.filter((r): r is ProviderResolutionResult<T> => Boolean(r));
182177

183178
const finalResult = this.evaluationStrategy.determineFinalResult({ flagKey, flagType }, context, resolutions);
@@ -201,7 +196,7 @@ export class MultiProvider implements Provider {
201196
hookContext: HookContext,
202197
hookHints: HookHints,
203198
context: EvaluationContext,
204-
): Promise<[shouldEvaluateNext: boolean, ProviderResolutionResult<T> | null]> {
199+
): Promise<[boolean, ProviderResolutionResult<T> | null]> {
205200
let evaluationResult: ResolutionDetails<T> | undefined = undefined;
206201
const provider = providerEntry.provider;
207202
const strategyContext = {
@@ -262,7 +257,7 @@ export class MultiProvider implements Provider {
262257
provider,
263258
flagKey,
264259
defaultValue,
265-
providerContext,
260+
providerContext || {},
266261
)) as ResolutionDetails<T>;
267262

268263
evaluationDetails = {

packages/server/src/provider/multi-provider/status-tracker.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
import type { EventDetails, OpenFeatureEventEmitter } from '@openfeature/server-sdk';
2-
import { ProviderEvents, ProviderStatus } from '@openfeature/server-sdk';
1+
import type { EventDetails } from '@openfeature/core';
2+
import type { OpenFeatureEventEmitter } from '../../events';
3+
import { ProviderEvents } from '../../events';
4+
import { ProviderStatus } from '../provider';
35
import type { RegisteredProvider } from './types';
46

57
/**
@@ -13,19 +15,19 @@ export class StatusTracker {
1315

1416
wrapEventHandler(providerEntry: RegisteredProvider) {
1517
const provider = providerEntry.provider;
16-
provider.events?.addHandler(ProviderEvents.Error, (details) => {
18+
provider.events?.addHandler(ProviderEvents.Error, (details?: EventDetails) => {
1719
this.changeProviderStatus(providerEntry.name, ProviderStatus.ERROR, details);
1820
});
1921

20-
provider.events?.addHandler(ProviderEvents.Stale, (details) => {
22+
provider.events?.addHandler(ProviderEvents.Stale, (details?: EventDetails) => {
2123
this.changeProviderStatus(providerEntry.name, ProviderStatus.STALE, details);
2224
});
2325

24-
provider.events?.addHandler(ProviderEvents.ConfigurationChanged, (details) => {
26+
provider.events?.addHandler(ProviderEvents.ConfigurationChanged, (details?: EventDetails) => {
2527
this.events.emit(ProviderEvents.ConfigurationChanged, details);
2628
});
2729

28-
provider.events?.addHandler(ProviderEvents.Ready, (details) => {
30+
provider.events?.addHandler(ProviderEvents.Ready, (details?: EventDetails) => {
2931
this.changeProviderStatus(providerEntry.name, ProviderStatus.READY, details);
3032
});
3133
}

packages/web/src/provider/multi-provider/strategies/BaseEvaluationStrategy.ts renamed to packages/server/src/provider/multi-provider/strategies/base-evaluation-strategy.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import type {
44
FlagValue,
55
FlagValueType,
66
OpenFeatureError,
7-
Provider,
87
ResolutionDetails,
98
TrackingEventDetails,
10-
} from '@openfeature/web-sdk';
11-
import { ProviderStatus } from '@openfeature/web-sdk';
9+
} from '@openfeature/core';
10+
import type { Provider } from '../../provider';
11+
import { ProviderStatus } from '../../provider';
1212
import { ErrorWithCode } from '../errors';
1313

1414
export type StrategyEvaluationContext = {
@@ -54,7 +54,10 @@ export type FinalResult<T extends FlagValue> = {
5454
* Contains default implementations for `shouldEvaluateThisProvider` and `shouldEvaluateNextProvider`
5555
*/
5656
export abstract class BaseEvaluationStrategy {
57-
shouldEvaluateThisProvider(strategyContext: StrategyPerProviderContext, evalContext: EvaluationContext): boolean {
57+
public runMode: 'parallel' | 'sequential' = 'sequential';
58+
59+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
60+
shouldEvaluateThisProvider(strategyContext: StrategyPerProviderContext, _evalContext?: EvaluationContext): boolean {
5861
if (
5962
strategyContext.providerStatus === ProviderStatus.NOT_READY ||
6063
strategyContext.providerStatus === ProviderStatus.FATAL
@@ -64,19 +67,21 @@ export abstract class BaseEvaluationStrategy {
6467
return true;
6568
}
6669

70+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
6771
shouldEvaluateNextProvider<T extends FlagValue>(
68-
strategyContext: StrategyPerProviderContext,
69-
context: EvaluationContext,
70-
result: ProviderResolutionResult<T>,
72+
_strategyContext?: StrategyPerProviderContext,
73+
_context?: EvaluationContext,
74+
_result?: ProviderResolutionResult<T>,
7175
): boolean {
7276
return true;
7377
}
7478

79+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
7580
shouldTrackWithThisProvider(
7681
strategyContext: StrategyProviderContext,
77-
context: EvaluationContext,
78-
trackingEventName: string,
79-
trackingEventDetails: TrackingEventDetails,
82+
_context?: EvaluationContext,
83+
_trackingEventName?: string,
84+
_trackingEventDetails?: TrackingEventDetails,
8085
): boolean {
8186
if (
8287
strategyContext.providerStatus === ProviderStatus.NOT_READY ||

packages/server/src/provider/multi-provider/strategies/ComparisonStrategy.ts renamed to packages/server/src/provider/multi-provider/strategies/comparison-strategy.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import type {
33
ProviderResolutionResult,
44
ProviderResolutionSuccessResult,
55
StrategyPerProviderContext,
6-
} from './BaseEvaluationStrategy';
7-
import { BaseEvaluationStrategy } from './BaseEvaluationStrategy';
8-
import type { EvaluationContext, FlagValue, Provider } from '@openfeature/server-sdk';
9-
import { GeneralError } from '@openfeature/server-sdk';
6+
} from './base-evaluation-strategy';
7+
import { BaseEvaluationStrategy } from './base-evaluation-strategy';
8+
import type { EvaluationContext, FlagValue } from '@openfeature/core';
9+
import type { Provider } from '../../provider';
10+
import { GeneralError } from '@openfeature/core';
1011

1112
/**
1213
* Evaluate all providers in parallel and compare the results.

packages/server/src/provider/multi-provider/strategies/FirstMatchStrategy.ts renamed to packages/server/src/provider/multi-provider/strategies/first-match-strategy.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type { FinalResult, ProviderResolutionResult, StrategyPerProviderContext } from './BaseEvaluationStrategy';
2-
import { BaseEvaluationStrategy } from './BaseEvaluationStrategy';
3-
import type { EvaluationContext, FlagValue } from '@openfeature/server-sdk';
4-
import { ErrorCode, OpenFeatureError, ResolutionDetails } from '@openfeature/server-sdk';
1+
import type { FinalResult, ProviderResolutionResult, StrategyPerProviderContext } from './base-evaluation-strategy';
2+
import { BaseEvaluationStrategy } from './base-evaluation-strategy';
3+
import type { EvaluationContext, FlagValue } from '@openfeature/core';
4+
import { ErrorCode } from '@openfeature/core';
55

66
/**
77
* Return the first result that did not indicate "flag not found".

packages/server/src/provider/multi-provider/strategies/FirstSuccessfulStrategy.ts renamed to packages/server/src/provider/multi-provider/strategies/first-successful-strategy.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import type { FinalResult, ProviderResolutionResult, StrategyPerProviderContext } from './BaseEvaluationStrategy';
2-
import { BaseEvaluationStrategy } from './BaseEvaluationStrategy';
3-
import type { EvaluationContext, FlagValue } from '@openfeature/server-sdk';
4-
import { ResolutionDetails } from '@openfeature/server-sdk';
1+
import type { FinalResult, ProviderResolutionResult, StrategyPerProviderContext } from './base-evaluation-strategy';
2+
import { BaseEvaluationStrategy } from './base-evaluation-strategy';
3+
import type { EvaluationContext, FlagValue } from '@openfeature/core';
54

65
/**
76
* Return the first result that did result in an error
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export * from './BaseEvaluationStrategy';
2-
export * from './FirstMatchStrategy';
3-
export * from './FirstSuccessfulStrategy';
4-
export * from './ComparisonStrategy';
1+
export * from './base-evaluation-strategy';
2+
export * from './first-match-strategy';
3+
export * from './first-successful-strategy';
4+
export * from './comparison-strategy';

packages/server/src/provider/multi-provider/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Represents an entry in the constructor's provider array which may or may not have a name set
2-
import type { Provider } from '@openfeature/server-sdk';
2+
import type { Provider } from '../provider';
33

44
export type ProviderEntryInput = {
55
provider: Provider;

0 commit comments

Comments
 (0)