Skip to content

Commit 4bb7bb3

Browse files
authored
Non-fatal polling of request configurations via leveraging common poller (#45)
* existing test cases passing * remove axios dep * ported node tests passing * add test for polling after init * use released common js sdk * warn if local storage is not available
1 parent e27e49a commit 4bb7bb3

15 files changed

+593
-370
lines changed

Makefile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ test-data:
4141
## prepare
4242
.PHONY: prepare
4343
prepare: test-data
44-
husky install
44+
yarn husky install
4545
rm -rf dist/
46-
tsc
47-
webpack
48-
api-extractor run --local
46+
yarn tsc
47+
yarn webpack
48+
yarn api-extractor run --local

docs/js-client-sdk.iclientconfig.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,10 @@ export interface IClientConfig
1919
| [apiKey](./js-client-sdk.iclientconfig.apikey.md) | | string | Eppo API key |
2020
| [assignmentLogger](./js-client-sdk.iclientconfig.assignmentlogger.md) | | IAssignmentLogger | Pass a logging implementation to send variation assignments to your data warehouse. |
2121
| [baseUrl?](./js-client-sdk.iclientconfig.baseurl.md) | | string | _(Optional)_ Base URL of the Eppo API. Clients should use the default setting in most cases. |
22+
| [numInitialRequestRetries?](./js-client-sdk.iclientconfig.numinitialrequestretries.md) | | number | _(Optional)_ Number of additional times the initial configuration request will be attempted if it fails. This is the request typically synchronously waited (via await) for completion. A small wait will be done between requests. (Default: 1) |
23+
| [numPollRequestRetries?](./js-client-sdk.iclientconfig.numpollrequestretries.md) | | number | _(Optional)_ Number of additional times polling for updated configurations will be attempted before giving up. Polling is done after a successful initial request. Subsequent attempts are done using an exponential backoff. (Default: 7) |
24+
| [pollAfterFailedInitialization?](./js-client-sdk.iclientconfig.pollafterfailedinitialization.md) | | boolean | _(Optional)_ Poll for new configurations even if the initial configuration request failed. (default: false) |
25+
| [pollAfterSuccessfulInitialization?](./js-client-sdk.iclientconfig.pollaftersuccessfulinitialization.md) | | boolean | _(Optional)_ Poll for new configurations (every 30 seconds) after successfully requesting the initial configuration. (default: false) |
2226
| [requestTimeoutMs?](./js-client-sdk.iclientconfig.requesttimeoutms.md) | | number | _(Optional)_ \* Timeout in milliseconds for the HTTPS request for the experiment configuration. (Default: 5000) |
27+
| [throwOnFailedInitialization?](./js-client-sdk.iclientconfig.throwonfailedinitialization.md) | | boolean | _(Optional)_ Throw on error if unable to fetch an initial configuration during initialization. (default: true) |
2328

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@eppo/js-client-sdk](./js-client-sdk.md) &gt; [IClientConfig](./js-client-sdk.iclientconfig.md) &gt; [numInitialRequestRetries](./js-client-sdk.iclientconfig.numinitialrequestretries.md)
4+
5+
## IClientConfig.numInitialRequestRetries property
6+
7+
Number of additional times the initial configuration request will be attempted if it fails. This is the request typically synchronously waited (via await) for completion. A small wait will be done between requests. (Default: 1)
8+
9+
**Signature:**
10+
11+
```typescript
12+
numInitialRequestRetries?: number;
13+
```
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@eppo/js-client-sdk](./js-client-sdk.md) &gt; [IClientConfig](./js-client-sdk.iclientconfig.md) &gt; [numPollRequestRetries](./js-client-sdk.iclientconfig.numpollrequestretries.md)
4+
5+
## IClientConfig.numPollRequestRetries property
6+
7+
Number of additional times polling for updated configurations will be attempted before giving up. Polling is done after a successful initial request. Subsequent attempts are done using an exponential backoff. (Default: 7)
8+
9+
**Signature:**
10+
11+
```typescript
12+
numPollRequestRetries?: number;
13+
```
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@eppo/js-client-sdk](./js-client-sdk.md) &gt; [IClientConfig](./js-client-sdk.iclientconfig.md) &gt; [pollAfterFailedInitialization](./js-client-sdk.iclientconfig.pollafterfailedinitialization.md)
4+
5+
## IClientConfig.pollAfterFailedInitialization property
6+
7+
Poll for new configurations even if the initial configuration request failed. (default: false)
8+
9+
**Signature:**
10+
11+
```typescript
12+
pollAfterFailedInitialization?: boolean;
13+
```
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@eppo/js-client-sdk](./js-client-sdk.md) &gt; [IClientConfig](./js-client-sdk.iclientconfig.md) &gt; [pollAfterSuccessfulInitialization](./js-client-sdk.iclientconfig.pollaftersuccessfulinitialization.md)
4+
5+
## IClientConfig.pollAfterSuccessfulInitialization property
6+
7+
Poll for new configurations (every 30 seconds) after successfully requesting the initial configuration. (default: false)
8+
9+
**Signature:**
10+
11+
```typescript
12+
pollAfterSuccessfulInitialization?: boolean;
13+
```
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
2+
3+
[Home](./index.md) &gt; [@eppo/js-client-sdk](./js-client-sdk.md) &gt; [IClientConfig](./js-client-sdk.iclientconfig.md) &gt; [throwOnFailedInitialization](./js-client-sdk.iclientconfig.throwonfailedinitialization.md)
4+
5+
## IClientConfig.throwOnFailedInitialization property
6+
7+
Throw on error if unable to fetch an initial configuration during initialization. (default: true)
8+
9+
**Signature:**
10+
11+
```typescript
12+
throwOnFailedInitialization?: boolean;
13+
```

jest.config.js renamed to jest.config.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module.exports = {
1+
const jestConfig = {
22
moduleFileExtensions: ['js', 'json', 'ts'],
33
rootDir: './',
44
moduleNameMapper: {
@@ -13,9 +13,6 @@ module.exports = {
1313
collectCoverageFrom: ['**/*.(t|j)s'],
1414
coverageDirectory: 'coverage/',
1515
testEnvironment: 'node',
16-
globals: {
17-
'ts-jest': {
18-
isolatedModules: true,
19-
},
20-
},
2116
};
17+
18+
export default jestConfig;

js-client-sdk.api.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,12 @@ export interface IClientConfig {
4040
apiKey: string;
4141
assignmentLogger: IAssignmentLogger;
4242
baseUrl?: string;
43+
numInitialRequestRetries?: number;
44+
numPollRequestRetries?: number;
45+
pollAfterFailedInitialization?: boolean;
46+
pollAfterSuccessfulInitialization?: boolean;
4347
requestTimeoutMs?: number;
48+
throwOnFailedInitialization?: boolean;
4449
}
4550

4651
export { IEppoClient }

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"devDependencies": {
3333
"@microsoft/api-documenter": "^7.23.9",
3434
"@microsoft/api-extractor": "^7.38.0",
35-
"@types/jest": "^28.1.1",
35+
"@types/jest": "^29.5.11",
3636
"@types/md5": "^2.3.2",
3737
"@typescript-eslint/eslint-plugin": "^5.13.0",
3838
"@typescript-eslint/parser": "^5.13.0",
@@ -43,22 +43,22 @@
4343
"eslint-plugin-prettier": "^4.0.0",
4444
"eslint-plugin-promise": "^6.0.0",
4545
"husky": "^8.0.1",
46-
"lint-staged": "^12.3.5",
4746
"jest": "^29.7.0",
48-
"jest-environment-jsdom": "^28.1.1",
47+
"jest-environment-jsdom": "^29.7.0",
48+
"lint-staged": "^12.3.5",
4949
"prettier": "^2.7.1",
5050
"terser-webpack-plugin": "^5.3.3",
5151
"testdouble": "^3.16.6",
5252
"ts-jest": "^29.1.1",
5353
"ts-loader": "^9.3.1",
54+
"ts-node": "^10.9.2",
5455
"typescript": "^4.7.4",
5556
"webpack": "^5.73.0",
5657
"webpack-cli": "^4.10.0",
5758
"xhr-mock": "^2.5.1"
5859
},
5960
"dependencies": {
60-
"@eppo/js-client-sdk-common": "2.0.0",
61-
"axios": "^1.6.0",
61+
"@eppo/js-client-sdk-common": "2.1.0",
6262
"md5": "^2.3.0"
6363
}
64-
}
64+
}

0 commit comments

Comments
 (0)