Skip to content

Commit

Permalink
feat: add a custom baseURL for sidecar resolves
Browse files Browse the repository at this point in the history
  • Loading branch information
nickybondarenko committed Sep 12, 2024
1 parent 85b8b15 commit 3702fb0
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 13 deletions.
19 changes: 11 additions & 8 deletions api/sdk.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export class Confidence implements EventSender, Trackable, FlagResolver {
//
// @internal
readonly contextChanges: Subscribe<string[]>;
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<string>;
// (undocumented)
Expand Down Expand Up @@ -50,17 +50,15 @@ export class Confidence implements EventSender, Trackable, FlagResolver {
}

// @public
export interface ConfidenceOptions {
export type ConfidenceOptions = {
clientSecret: string;
region?: 'eu' | 'us';
environment: 'client' | 'backend';
// Warning: (ae-forgotten-export) The symbol "SimpleFetch" needs to be exported by the entry point index.d.ts
fetchImplementation?: SimpleFetch;
// 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;
timeout: number;
}
logger?: Logger;
resolveBaseUrl?: string;
};

// @public
export interface Configuration {
Expand Down Expand Up @@ -215,6 +213,11 @@ export type WebVitalsOptions = {
ttfb?: boolean;
};

// Warnings were encountered during analysis:
//
// src/Confidence.ts:34:3 - (ae-forgotten-export) The symbol "SimpleFetch" needs to be exported by the entry point index.d.ts
// src/Confidence.ts:38:3 - (ae-forgotten-export) The symbol "Logger" needs to be exported by the entry point index.d.ts

// (No @packageDocumentation comment for this package)

```
13 changes: 13 additions & 0 deletions packages/sdk/src/Confidence.int.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ const fetchImplementation = async (request: Request): Promise<Response> => {

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;
Expand Down Expand Up @@ -62,6 +63,18 @@ describe('Confidence integration tests', () => {
publishHandlerMock.mockReturnValue(mockPublishResponse);
});

it('should resolve against provided base url', async () => {
const customCondifence = Confidence.create({
clientSecret: '<client-secret>',
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);
Expand Down
11 changes: 7 additions & 4 deletions packages/sdk/src/Confidence.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,11 @@ import { AccessiblePromise } from './AccessiblePromise';
* Confidence options, to be used for easier initialization of Confidence
* @public
* */
export interface ConfidenceOptions {
export type ConfidenceOptions = {
/** Client secret, to be found in Confidence console*/
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 */
Expand All @@ -38,7 +36,9 @@ export interface ConfidenceOptions {
timeout: number;
/** Debug logger */
logger?: Logger;
}
/** Sets an alternative resolve url */
resolveBaseUrl?: string;
};

/**
* Confidence configuration
Expand Down Expand Up @@ -323,6 +323,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({
Expand All @@ -332,6 +333,7 @@ export class Confidence implements EventSender, Trackable, FlagResolver {
environment,
fetchImplementation = defaultFetchImplementation(),
logger = defaultLogger(),
resolveBaseUrl,
}: ConfidenceOptions): Confidence {
const sdk = {
id: SdkId.SDK_ID_JS_CONFIDENCE,
Expand All @@ -344,6 +346,7 @@ export class Confidence implements EventSender, Trackable, FlagResolver {
environment,
resolveTimeout: timeout,
region,
resolveBaseUrl,
});
if (environment === 'client') {
flagResolverClient = new CachingFlagResolverClient(flagResolverClient, Number.POSITIVE_INFINITY);
Expand Down
8 changes: 7 additions & 1 deletion packages/sdk/src/FlagResolverClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ export type FlagResolverClientOptions = {
resolveTimeout: number;
environment: 'client' | 'backend';
region?: 'eu' | 'us';
resolveBaseUrl?: string;
};

export class FetchingFlagResolverClient implements FlagResolverClient {
Expand All @@ -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;
}

Expand Down

0 comments on commit 3702fb0

Please sign in to comment.