Skip to content

Commit 5a1c580

Browse files
authored
fix: use POST instead of GET for fetch request (#6)
1 parent 4dd2708 commit 5a1c580

File tree

10 files changed

+61
-67
lines changed

10 files changed

+61
-67
lines changed

packages/browser-demo/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"version": "1.0.1",
44
"private": true,
55
"dependencies": {
6-
"@amplitude/experiment-js-client": "^1.0.1",
6+
"@amplitude/experiment-js-client": "file:../browser",
77
"@testing-library/jest-dom": "^4.2.4",
88
"@testing-library/react": "^9.3.2",
99
"@testing-library/user-event": "^7.1.2",

packages/browser/jest.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const { compilerOptions } = require('./tsconfig.test.json');
66

77
module.exports = {
88
preset: 'ts-jest',
9-
testEnvironment: 'node',
9+
testEnvironment: 'jsdom',
1010
displayName: package.name,
1111
name: package.name,
1212
rootDir: '.',

packages/browser/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
},
2929
"homepage": "https://github.com/amplitude/experiment-js-client#readme",
3030
"dependencies": {
31-
"base64-js": "^1.3.1",
3231
"unfetch": "^4.1.0"
3332
},
3433
"gitHead": "0a910f04a64dafcf37b68be45ed7dca58fdd6acf"

packages/browser/src/experimentClient.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import { HttpClient } from './types/transport';
1414
import { ExperimentUser, ExperimentUserProvider } from './types/user';
1515
import { Variant, Variants } from './types/variant';
1616
import { Backoff } from './util/backoff';
17-
import { urlSafeBase64Encode } from './util/base64';
1817
import { randomString } from './util/randomstring';
1918

2019
// Configs which have been removed from the public API.
@@ -224,21 +223,27 @@ export class ExperimentClient implements Client {
224223
timeoutMillis: number,
225224
): Promise<Variants> {
226225
const userContext = this.addContext(user);
227-
const encodedContext = urlSafeBase64Encode(JSON.stringify(userContext));
228226
let queryString = '';
229227
if (this.config.debug) {
230228
queryString = `?d=${randomString(8)}`;
231229
}
232-
const endpoint = `${this.config.serverUrl}/sdk/vardata/${encodedContext}${queryString}`;
230+
const endpoint = `${this.config.serverUrl}/sdk/vardata${queryString}`;
233231
const headers = {
234232
Authorization: `Api-Key ${this.apiKey}`,
235233
};
234+
const body = JSON.stringify(user);
235+
// CDN can only cache requests where the body is < 8KB
236+
if (body.length > 8000) {
237+
console.warn(
238+
`[Experiment] encoded user object length ${body.length} cannot be cached by CDN; must be < 8KB`,
239+
);
240+
}
236241
this.debug('[Experiment] Fetch variants for user: ', userContext);
237242
const response = await this.httpClient.request(
238243
endpoint,
239-
'GET',
244+
'POST',
240245
headers,
241-
null,
246+
body,
242247
timeoutMillis,
243248
);
244249
if (response.status != 200) {

packages/browser/src/transport/http.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ const request: HttpClient['request'] = (
3434
requestUrl: string,
3535
method: string,
3636
headers: Record<string, string>,
37-
data?: Record<string, string>,
37+
data: string,
3838
timeoutMillis?: number,
3939
): Promise<Response> => {
4040
return timeout(
4141
fetch(requestUrl, {
42-
method,
43-
headers,
44-
body: data && JSON.stringify(data),
42+
method: method,
43+
headers: headers,
44+
body: data,
4545
}),
4646
timeoutMillis,
4747
);

packages/browser/src/types/transport.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ export interface HttpClient {
33
requestUrl: string,
44
method: string,
55
headers: Record<string, string>,
6-
data?: Record<string, string>,
6+
data: string,
77
timeoutMillis?: number,
88
): Promise<Response>;
99
}

packages/browser/src/util/base64.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { ExperimentClient } from '../src/experimentClient';
2+
import { ExperimentUser } from '../src/types/user';
3+
4+
const API_KEY = 'client-DvWljIjiiuqLbyjqdvBaLFfEBrAvGuA3';
5+
6+
const testUser: ExperimentUser = { user_id: 'test_user' };
7+
const testClient: ExperimentClient = new ExperimentClient(API_KEY, {});
8+
9+
const testTimeoutNoRetriesClient = new ExperimentClient(API_KEY, {
10+
retryFetchOnFailure: false,
11+
fetchTimeoutMillis: 1,
12+
});
13+
14+
const testTimeoutRetrySuccessClient = new ExperimentClient(API_KEY, {
15+
fetchTimeoutMillis: 1,
16+
});
17+
18+
beforeEach(() => {
19+
localStorage.clear();
20+
});
21+
22+
test('ExperimentClient.fetch, success', async () => {
23+
await testClient.fetch(testUser);
24+
const variant = testClient.variant('sdk-ci-test');
25+
expect(variant).toEqual({ value: 'on', payload: 'payload' });
26+
});
27+
28+
test('ExperimentClient.fetch, no retries, timeout failure', async () => {
29+
await testTimeoutNoRetriesClient.fetch(testUser);
30+
const variants = testTimeoutNoRetriesClient.all();
31+
expect(variants).toEqual({});
32+
});
33+
34+
test('ExperimentClient.fetch, no retries, timeout failure', async () => {
35+
await testTimeoutRetrySuccessClient.fetch(testUser);
36+
const variant = testClient.variant('sdk-ci-test');
37+
expect(variant).toEqual({ value: 'on', payload: 'payload' });
38+
});

packages/browser/test/util/base64.test.ts

Lines changed: 0 additions & 35 deletions
This file was deleted.

yarn.lock

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
# yarn lockfile v1
33

44

5+
"@amplitude/experiment-js-client@file:packages/browser":
6+
version "1.0.0"
7+
dependencies:
8+
unfetch "^4.1.0"
9+
510
611
version "7.8.3"
712
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
@@ -4358,7 +4363,7 @@ balanced-match@^1.0.0:
43584363
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
43594364
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
43604365

4361-
base64-js@^1.0.2, base64-js@^1.3.1:
4366+
base64-js@^1.0.2:
43624367
version "1.3.1"
43634368
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
43644369
integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==

0 commit comments

Comments
 (0)