diff --git a/source/core/Ky.ts b/source/core/Ky.ts index 0bde49b3..5218d6c7 100644 --- a/source/core/Ky.ts +++ b/source/core/Ky.ts @@ -163,10 +163,13 @@ export class Ky { if (supportsAbortController) { this.abortController = new globalThis.AbortController(); const originalSignal = this._options.signal ?? (this._input as Request).signal; + if (originalSignal?.aborted) { + this.abortController.abort(originalSignal?.reason); + } + originalSignal?.addEventListener('abort', () => { this.abortController!.abort(originalSignal.reason); }); - this._options.signal = this.abortController.signal; } diff --git a/test/main.ts b/test/main.ts index e21140d5..58cb969a 100644 --- a/test/main.ts +++ b/test/main.ts @@ -713,6 +713,26 @@ test('throws DOMException/Error with name AbortError when aborted by user', asyn t.is(error.name, 'AbortError', `Expected AbortError, got ${error.name}`); }); +test('throws AbortError when signal was aborted before request', async t => { + const server = await createHttpTestServer(); + let requestCount = 0; + server.get('/', () => { + requestCount += 1; + }); + + const abortController = new AbortController(); + const {signal} = abortController; + const request = new Request(server.url, {signal}); + abortController.abort(); + const response = ky(request); + + const error = (await t.throwsAsync(response))!; + + t.true(['DOMException', 'Error'].includes(error.constructor.name), `Expected DOMException or Error, got ${error.constructor.name}`); + t.is(error.name, 'AbortError', `Expected AbortError, got ${error.name}`); + t.is(requestCount, 0, 'Request count is more than 0, server received request.'); +}); + test('throws AbortError when aborted via Request', async t => { const server = await createHttpTestServer(); // eslint-disable-next-line @typescript-eslint/no-empty-function