Skip to content

Commit fb7c554

Browse files
authored
feat: use subdomain in precomputed client (#264)
* feat: use subdomain in precomputed client * v4.15.1
1 parent 5edebab commit fb7c554

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@eppo/js-client-sdk-common",
3-
"version": "4.15.0",
3+
"version": "4.15.1",
44
"description": "Common library for Eppo JavaScript SDKs (web, react native, and node)",
55
"main": "dist/index.js",
66
"files": [

src/client/eppo-precomputed-client.spec.ts

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,84 @@ describe('EppoPrecomputedClient E2E test', () => {
714714
pollAfterFailedInitialization ? red : 'default',
715715
);
716716
});
717+
718+
describe('Enhanced SDK Token with encoded subdomain', () => {
719+
let urlsRequested: string[] = [];
720+
const SDK_PARAM_SUFFIX = 'sdkName=js-client-sdk-common&sdkVersion=1.0.0';
721+
722+
beforeEach(() => {
723+
urlsRequested = [];
724+
global.fetch = jest.fn((url) => {
725+
urlsRequested.push(url.toString());
726+
return Promise.resolve({
727+
ok: true,
728+
status: 200,
729+
json: () => Promise.resolve(precomputedResponse),
730+
} as Response);
731+
});
732+
});
733+
734+
it('should request from the encoded subdomain', async () => {
735+
const client = new EppoPrecomputedClient({
736+
precomputedFlagStore: new MemoryOnlyConfigurationStore<PrecomputedFlag>(),
737+
subject,
738+
requestParameters: {
739+
apiKey: 'zCsQuoHJxVPp895.Y3M9ZXhwZXJpbWVudA==', // subdomain=experiment
740+
sdkName: 'js-client-sdk-common',
741+
sdkVersion: '1.0.0',
742+
},
743+
});
744+
745+
await client.fetchPrecomputedFlags();
746+
747+
expect(urlsRequested).toHaveLength(1);
748+
expect(urlsRequested[0]).toEqual(
749+
'https://experiment.fs-edge-assignment.eppo.cloud/assignments?apiKey=zCsQuoHJxVPp895.Y3M9ZXhwZXJpbWVudA%3D%3D&' +
750+
SDK_PARAM_SUFFIX,
751+
);
752+
});
753+
754+
it('should request from the default domain if the encoded subdomain is not present', async () => {
755+
const client = new EppoPrecomputedClient({
756+
precomputedFlagStore: new MemoryOnlyConfigurationStore<PrecomputedFlag>(),
757+
subject,
758+
requestParameters: {
759+
apiKey: 'old style key',
760+
sdkName: 'js-client-sdk-common',
761+
sdkVersion: '1.0.0',
762+
},
763+
});
764+
765+
await client.fetchPrecomputedFlags();
766+
767+
expect(urlsRequested).toHaveLength(1);
768+
expect(urlsRequested[0]).toEqual(
769+
'https://fs-edge-assignment.eppo.cloud/assignments?apiKey=old+style+key&' +
770+
SDK_PARAM_SUFFIX,
771+
);
772+
});
773+
774+
it('should request from the provided baseUrl if present', async () => {
775+
const client = new EppoPrecomputedClient({
776+
precomputedFlagStore: new MemoryOnlyConfigurationStore<PrecomputedFlag>(),
777+
subject,
778+
requestParameters: {
779+
apiKey: 'zCsQuoHJxVPp895.Y3M9ZXhwZXJpbWVudA==', // subdomain=experiment
780+
sdkName: 'js-client-sdk-common',
781+
sdkVersion: '1.0.0',
782+
baseUrl: 'https://custom-base-url.com',
783+
},
784+
});
785+
786+
await client.fetchPrecomputedFlags();
787+
788+
expect(urlsRequested).toHaveLength(1);
789+
expect(urlsRequested[0]).toEqual(
790+
'https://custom-base-url.com/assignments?apiKey=zCsQuoHJxVPp895.Y3M9ZXhwZXJpbWVudA%3D%3D&' +
791+
SDK_PARAM_SUFFIX,
792+
);
793+
});
794+
});
717795
});
718796

719797
describe('Obfuscated precomputed flags', () => {

src/client/eppo-precomputed-client.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
import { getMD5Hash } from '../obfuscation';
3333
import initPoller, { IPoller } from '../poller';
3434
import PrecomputedRequestor from '../precomputed-requestor';
35+
import SdkTokenDecoder from '../sdk-token-decoder';
3536
import { Attributes, ContextAttributes, FlagKey } from '../types';
3637
import { validateNotBlank } from '../validation';
3738
import { LIB_VERSION } from '../version';
@@ -164,6 +165,7 @@ export default class EppoPrecomputedClient {
164165
defaultUrl: PRECOMPUTED_BASE_URL,
165166
baseUrl,
166167
queryParams: { apiKey, sdkName, sdkVersion },
168+
sdkTokenDecoder: new SdkTokenDecoder(apiKey),
167169
});
168170
const httpClient = new FetchHttpClient(apiEndpoints, requestTimeoutMs);
169171
const precomputedRequestor = new PrecomputedRequestor(

0 commit comments

Comments
 (0)