Skip to content

Commit dff75d9

Browse files
fix(fetch): signal should not be nullable (#81)
* feat: signal should not be nullable https://fetch.spec.whatwg.org/#ref-for-map-exists%E2%91%A0%E2%91%A3 * chore: fix changeset --------- Co-authored-by: Jacob Ebey <[email protected]>
1 parent c97e2b8 commit dff75d9

File tree

5 files changed

+20
-4
lines changed

5 files changed

+20
-4
lines changed

.changeset/gentle-fans-invent.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@web-std/fetch": patch
3+
---
4+
5+
Make `Request` signal handling follow spec: https://fetch.spec.whatwg.org/#ref-for-map-exists%E2%91%A0%E2%91%A3

packages/fetch/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@
7777
"@types/mocha": "^9.1.0",
7878
"@types/chai-as-promised": "^7.1.5",
7979
"@types/chai-string": "^1.4.2",
80-
"abort-controller": "^3.0.0",
8180
"abortcontroller-polyfill": "^1.7.1",
8281
"busboy": "^0.3.1",
8382
"c8": "^7.3.0",
@@ -100,6 +99,7 @@
10099
"@web-std/blob": "^3.0.3",
101100
"@web-std/form-data": "^3.0.2",
102101
"@web-std/stream": "^1.0.1",
102+
"abort-controller": "^3.0.0",
103103
"data-uri-to-buffer": "^3.0.1",
104104
"mrmime": "^1.0.0",
105105
"@web3-storage/multipart-parser": "^1.0.0"

packages/fetch/src/fetch.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ async function fetch(url, options_ = {}) {
191191
// Note: We can not use `request.body` because send would have
192192
// consumed it already.
193193
body: options_.body,
194-
signal: request.signal,
194+
signal: signal,
195195
size: request.size
196196
};
197197

packages/fetch/src/request.js

+10
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*/
99

1010
import {format as formatUrl} from 'url';
11+
import {AbortController as AbortControllerPolyfill} from 'abort-controller';
1112
import Headers from './headers.js';
1213
import Body, {clone, extractContentType, getTotalBytes} from './body.js';
1314
import {isAbortSignal} from './utils/is.js';
@@ -128,6 +129,15 @@ export default class Request extends Body {
128129
if (signal != null && !isAbortSignal(signal)) {
129130
throw new TypeError('Expected signal to be an instanceof AbortSignal or EventTarget');
130131
}
132+
133+
if (!signal) {
134+
let AbortControllerConstructor = typeof AbortController != "undefined"
135+
? AbortController
136+
: AbortControllerPolyfill;
137+
/** @type {any} */
138+
let newSignal = new AbortControllerConstructor().signal;
139+
signal = newSignal;
140+
}
131141

132142
/** @type {RequestState} */
133143
this[INTERNALS] = {

packages/fetch/test/request.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ describe('Request', () => {
152152
expect(derivedRequest.signal).to.equal(derivedAbortController.signal);
153153
});
154154

155-
it('should allow removing signal on derived Request instances', () => {
155+
it('should allow overriding signal on derived Request instances', () => {
156156
const parentAbortController = new AbortController();
157157
const parentRequest = new Request(`${base}hello`, {
158158
signal: parentAbortController.signal
@@ -161,7 +161,8 @@ describe('Request', () => {
161161
signal: null
162162
});
163163
expect(parentRequest.signal).to.equal(parentAbortController.signal);
164-
expect(derivedRequest.signal).to.equal(null);
164+
expect(derivedRequest.signal).to.not.equal(null);
165+
expect(derivedRequest.signal).to.not.equal(parentAbortController.signal);
165166
});
166167

167168
it('should default to "same-origin" as credentials', () => {

0 commit comments

Comments
 (0)