diff --git a/api/sdk.api.md b/api/sdk.api.md index 205b336..8f6b3b9 100644 --- a/api/sdk.api.md +++ b/api/sdk.api.md @@ -22,7 +22,7 @@ export class Confidence implements EventSender, Trackable, FlagResolver { // // @internal readonly contextChanges: Subscribe; - static create({ clientSecret, region, timeout, environment, fetchImplementation, logger, }: ConfidenceOptions): Confidence; + static create({ clientSecret, region, timeout, environment, fetchImplementation, logger, resolveBaseUrl, }: ConfidenceOptions): Confidence; get environment(): string; evaluateFlag(path: string, defaultValue: string): FlagEvaluation; // (undocumented) @@ -58,7 +58,7 @@ export interface ConfidenceOptions { // Warning: (ae-forgotten-export) The symbol "Logger" needs to be exported by the entry point index.d.ts logger?: Logger; region?: 'eu' | 'us'; - resolveUrl?: string; + resolveBaseUrl?: string; timeout: number; } diff --git a/packages/sdk/src/Confidence.int.test.ts b/packages/sdk/src/Confidence.int.test.ts index 613a331..c08422f 100644 --- a/packages/sdk/src/Confidence.int.test.ts +++ b/packages/sdk/src/Confidence.int.test.ts @@ -27,6 +27,7 @@ const fetchImplementation = async (request: Request): Promise => { let handler: (reqBody: any) => any; switch (request.url) { + case 'https://custom.dev/v1/flags:resolve': case 'https://resolver.confidence.dev/v1/flags:resolve': handler = resolveHandlerMock; break; @@ -62,6 +63,18 @@ describe('Confidence integration tests', () => { publishHandlerMock.mockReturnValue(mockPublishResponse); }); + it('should resolve against provided base url', async () => { + const customCondifence = Confidence.create({ + clientSecret: '', + timeout: 100, + environment: 'client', + fetchImplementation, + resolveBaseUrl: 'https://custom.dev', + }); + + expect(await customCondifence.getFlag('flag1.str', 'goodbye')).toBe('hello'); + }); + it('should resolve a value and send apply', async () => { expect(await confidence.getFlag('flag1.str', 'goodbye')).toBe('hello'); const [applyRequest] = await nextMockArgs(applyHandlerMock); diff --git a/packages/sdk/src/Confidence.ts b/packages/sdk/src/Confidence.ts index 169500f..d0f012f 100644 --- a/packages/sdk/src/Confidence.ts +++ b/packages/sdk/src/Confidence.ts @@ -27,8 +27,6 @@ export interface ConfidenceOptions { clientSecret: string; /** Region in which Confidence will operate */ region?: 'eu' | 'us'; - /** Resolve URL */ - resolveUrl?: string; /** Environment: can be either client of backend */ environment: 'client' | 'backend'; /** Fetch implementation */ @@ -37,6 +35,8 @@ export interface ConfidenceOptions { timeout: number; /** Debug logger */ logger?: Logger; + /** Sets an alternative resolve url */ + resolveBaseUrl?: string; } /** @@ -322,6 +322,7 @@ export class Confidence implements EventSender, Trackable, FlagResolver { * @param environment - can be either "client" or "backend" * @param fetchImplementation - fetch implementation * @param logger - debug logger + * @param resolveBaseUrl - custom backend resolve URL * @returns */ static create({ @@ -331,6 +332,7 @@ export class Confidence implements EventSender, Trackable, FlagResolver { environment, fetchImplementation = defaultFetchImplementation(), logger = defaultLogger(), + resolveBaseUrl, }: ConfidenceOptions): Confidence { const sdk = { id: SdkId.SDK_ID_JS_CONFIDENCE, @@ -343,6 +345,7 @@ export class Confidence implements EventSender, Trackable, FlagResolver { environment, resolveTimeout: timeout, region, + resolveBaseUrl, }); if (environment === 'client') { flagResolverClient = new CachingFlagResolverClient(flagResolverClient, Number.POSITIVE_INFINITY); diff --git a/packages/sdk/src/FlagResolverClient.ts b/packages/sdk/src/FlagResolverClient.ts index 94dc8ef..50506dc 100644 --- a/packages/sdk/src/FlagResolverClient.ts +++ b/packages/sdk/src/FlagResolverClient.ts @@ -84,6 +84,7 @@ export type FlagResolverClientOptions = { resolveTimeout: number; environment: 'client' | 'backend'; region?: 'eu' | 'us'; + resolveBaseUrl?: string; }; export class FetchingFlagResolverClient implements FlagResolverClient { @@ -103,13 +104,18 @@ export class FetchingFlagResolverClient implements FlagResolverClient { // todo refactor to move out environment environment, region, + resolveBaseUrl, }: FlagResolverClientOptions) { // TODO think about both resolve and apply request logic for backends this.fetchImplementation = environment === 'backend' ? fetchImplementation : withRequestLogic(fetchImplementation); this.clientSecret = clientSecret; this.sdk = sdk; this.applyTimeout = applyTimeout; - this.baseUrl = region ? `https://resolver.${region}.confidence.dev/v1` : 'https://resolver.confidence.dev/v1'; + if (resolveBaseUrl) { + this.baseUrl = `${resolveBaseUrl}/v1`; + } else { + this.baseUrl = region ? `https://resolver.${region}.confidence.dev/v1` : 'https://resolver.confidence.dev/v1'; + } this.resolveTimeout = resolveTimeout; }