Skip to content

Commit 2376cf2

Browse files
crisshakersholladay
andauthoredJul 31, 2024··
Fix signal handling for Request objects (#613)
* Fix signal handling for Request objects Fix lint issues * Simplify signal handling * Fix lint error * Add a test for aborting via a Request object --------- Co-authored-by: Seth Holladay <me@seth-holladay.com>
1 parent 0017053 commit 2376cf2

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed
 

‎source/core/Ky.ts

+4-7
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,10 @@ export class Ky {
168168

169169
if (supportsAbortController) {
170170
this.abortController = new globalThis.AbortController();
171-
if (this._options.signal) {
172-
const originalSignal = this._options.signal;
173-
174-
this._options.signal.addEventListener('abort', () => {
175-
this.abortController!.abort(originalSignal.reason);
176-
});
177-
}
171+
const originalSignal = this._options.signal ?? (this._input as Request).signal;
172+
originalSignal?.addEventListener('abort', () => {
173+
this.abortController!.abort(originalSignal.reason);
174+
});
178175

179176
this._options.signal = this.abortController.signal;
180177
}

‎test/main.ts

+17
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,23 @@ test('throws DOMException/Error with name AbortError when aborted by user', asyn
711711
t.is(error.name, 'AbortError', `Expected AbortError, got ${error.name}`);
712712
});
713713

714+
test('throws AbortError when aborted via Request', async t => {
715+
const server = await createHttpTestServer();
716+
// eslint-disable-next-line @typescript-eslint/no-empty-function
717+
server.get('/', () => {});
718+
719+
const abortController = new AbortController();
720+
const {signal} = abortController;
721+
const request = new Request(server.url, {signal});
722+
const response = ky(request);
723+
abortController.abort();
724+
725+
const error = (await t.throwsAsync(response))!;
726+
727+
t.true(['DOMException', 'Error'].includes(error.constructor.name), `Expected DOMException or Error, got ${error.constructor.name}`);
728+
t.is(error.name, 'AbortError', `Expected AbortError, got ${error.name}`);
729+
});
730+
714731
test('supports Request instance as input', async t => {
715732
const server = await createHttpTestServer();
716733
const inputRequest = new Request(server.url, {method: 'POST'});

0 commit comments

Comments
 (0)
Please sign in to comment.