Skip to content

Commit

Permalink
feat: add a custom baseURL for sidecar resolves (#200)
Browse files Browse the repository at this point in the history
  • Loading branch information
nickybondarenko authored Sep 12, 2024
1 parent aea60c4 commit f838752
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 5 deletions.
4 changes: 2 additions & 2 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 @@ -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;
}

Expand Down
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
7 changes: 5 additions & 2 deletions packages/sdk/src/Confidence.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -37,6 +35,8 @@ export interface ConfidenceOptions {
timeout: number;
/** Debug logger */
logger?: Logger;
/** Sets an alternative resolve url */
resolveBaseUrl?: string;
}

/**
Expand Down Expand Up @@ -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({
Expand All @@ -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,
Expand All @@ -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);
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 f838752

Please sign in to comment.