Skip to content

Commit 7d972e3

Browse files
authored
feat: allow for AbortController to be optional (#211)
1 parent f9a7c85 commit 7d972e3

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/index.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,27 @@ test('Should not trigger error on abort', async () => {
642642
await client.updateContext({ userId: '789' });
643643
});
644644

645+
test('Should run without abort controller', async () => {
646+
fetchMock.mockResponse(JSON.stringify(data));
647+
const abortSpy = jest.spyOn(AbortController.prototype, 'abort');
648+
649+
const config: IConfig = {
650+
url: 'http://localhost/test',
651+
clientKey: '12',
652+
appName: 'web',
653+
createAbortController: () => null,
654+
};
655+
const client = new UnleashClient(config);
656+
657+
await client.start();
658+
client.updateContext({ userId: '123' });
659+
client.updateContext({ userId: '456' });
660+
await client.updateContext({ userId: '789' });
661+
662+
expect(abortSpy).toBeCalledTimes(0);
663+
abortSpy.mockRestore();
664+
});
665+
645666
test.each([400, 401, 403, 404, 429, 500, 502, 503])(
646667
'Should publish error when fetch receives a %d error',
647668
async (errorCode) => {

src/index.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ interface IConfig extends IStaticContext {
4646
storageProvider?: IStorageProvider;
4747
context?: IMutableContext;
4848
fetch?: any;
49-
createAbortController?: () => AbortController;
49+
createAbortController?: () => AbortController | null;
5050
bootstrap?: IToggle[];
5151
bootstrapOverride?: boolean;
5252
headerName?: string;
@@ -100,7 +100,9 @@ export const resolveFetch = () => {
100100
try {
101101
if (typeof window !== 'undefined' && 'fetch' in window) {
102102
return fetch.bind(window);
103-
} else if ('fetch' in globalThis) {
103+
}
104+
105+
if ('fetch' in globalThis) {
104106
return fetch.bind(globalThis);
105107
}
106108
} catch (e) {
@@ -114,7 +116,9 @@ const resolveAbortController = () => {
114116
try {
115117
if (typeof window !== 'undefined' && 'AbortController' in window) {
116118
return () => new window.AbortController();
117-
} else if ('fetch' in globalThis) {
119+
}
120+
121+
if ('fetch' in globalThis) {
118122
return () => new globalThis.AbortController();
119123
}
120124
} catch (e) {
@@ -135,7 +139,7 @@ export class UnleashClient extends TinyEmitter {
135139
private metrics: Metrics;
136140
private ready: Promise<void>;
137141
private fetch: any;
138-
private createAbortController?: () => AbortController;
142+
private createAbortController?: () => AbortController | null;
139143
private abortController?: AbortController | null;
140144
private bootstrap?: IToggle[];
141145
private bootstrapOverride: boolean;
@@ -431,8 +435,7 @@ export class UnleashClient extends TinyEmitter {
431435
if (this.abortController) {
432436
this.abortController.abort();
433437
}
434-
this.abortController =
435-
this.createAbortController && this.createAbortController();
438+
this.abortController = this.createAbortController?.();
436439
const signal = this.abortController
437440
? this.abortController.signal
438441
: undefined;

0 commit comments

Comments
 (0)