Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add a custom baseURL for sidecar resolves #200

Merged
merged 2 commits into from
Sep 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -28,8 +28,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 @@ -38,6 +36,8 @@ export interface ConfidenceOptions {
timeout: number;
/** Debug logger */
logger?: Logger;
/** Sets an alternative resolve url */
resolveBaseUrl?: string;
}

/**
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
Loading