Skip to content

Commit 58f7724

Browse files
authored
fix: defensively reject if aborted during response.json() (#266)
* fix: defensively reject if aborted during response.json() * fixup! fix: defensively reject if aborted during response.json()
1 parent a8812a3 commit 58f7724

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

packages/sdk/src/FlagResolverClient.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,23 @@ export class FetchingFlagResolverClient implements FlagResolverClient {
277277
if (!resp.ok) {
278278
throw new Error(`${resp.status}: ${resp.statusText}`);
279279
}
280-
return ResolveFlagsResponse.fromJSON(await resp.json());
280+
const abortPromise = new Promise((_resolve, reject) => {
281+
if (signal.aborted) {
282+
reject(signal.reason);
283+
return;
284+
}
285+
signal.addEventListener(
286+
'abort',
287+
() => {
288+
reject(signal.reason);
289+
},
290+
{ once: true },
291+
);
292+
});
293+
// we've seen issues where Node doesn't properly reject response.json() on abort,
294+
// so we do it ourselves
295+
const json = await Promise.race([abortPromise, resp.json()]);
296+
return ResolveFlagsResponse.fromJSON(json);
281297
}
282298

283299
// async resolveFlagsProto(request: ResolveFlagsRequest): Promise<ResolveFlagsResponse> {

0 commit comments

Comments
 (0)