summaryrefslogtreecommitdiff
path: root/ext/fetch/23_request.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/fetch/23_request.js')
-rw-r--r--ext/fetch/23_request.js65
1 files changed, 45 insertions, 20 deletions
diff --git a/ext/fetch/23_request.js b/ext/fetch/23_request.js
index 61c3b3f5d..70e00a874 100644
--- a/ext/fetch/23_request.js
+++ b/ext/fetch/23_request.js
@@ -14,6 +14,7 @@ const {
ArrayPrototypeMap,
ArrayPrototypeSlice,
ArrayPrototypeSplice,
+ ObjectFreeze,
ObjectKeys,
ObjectPrototypeIsPrototypeOf,
RegExpPrototypeExec,
@@ -24,7 +25,6 @@ const {
} = primordials;
import * as webidl from "ext:deno_webidl/00_webidl.js";
-import { assert } from "ext:deno_web/00_infra.js";
import { createFilteredInspectProxy } from "ext:deno_console/01_console.js";
import {
byteUpperCase,
@@ -43,8 +43,12 @@ import {
headersFromHeaderList,
} from "ext:deno_fetch/20_headers.js";
import { HttpClientPrototype } from "ext:deno_fetch/22_http_client.js";
-import * as abortSignal from "ext:deno_web/03_abort_signal.js";
-
+import {
+ createDependentAbortSignal,
+ newSignal,
+ signalAbort,
+} from "ext:deno_web/03_abort_signal.js";
+import { DOMException } from "ext:deno_web/01_dom_exception.js";
const { internalRidSymbol } = core;
const _request = Symbol("request");
@@ -52,6 +56,7 @@ const _headers = Symbol("headers");
const _getHeaders = Symbol("get headers");
const _headersCache = Symbol("headers cache");
const _signal = Symbol("signal");
+const _signalCache = Symbol("signalCache");
const _mimeType = Symbol("mime type");
const _body = Symbol("body");
const _url = Symbol("url");
@@ -262,7 +267,13 @@ class Request {
}
/** @type {AbortSignal} */
- [_signal];
+ get [_signal]() {
+ const signal = this[_signalCache];
+ if (signal !== undefined) {
+ return signal;
+ }
+ return (this[_signalCache] = newSignal());
+ }
get [_mimeType]() {
const values = getDecodeSplitHeader(
headerListFromHeaders(this[_headers]),
@@ -363,11 +374,10 @@ class Request {
// 28.
this[_request] = request;
- // 29.
- const signals = signal !== null ? [signal] : [];
-
- // 30.
- this[_signal] = abortSignal.createDependentAbortSignal(signals, prefix);
+ // 29 & 30.
+ if (signal !== null) {
+ this[_signalCache] = createDependentAbortSignal([signal], prefix);
+ }
// 31.
this[_headers] = headersFromHeaderList(request.headerList, "request");
@@ -473,17 +483,21 @@ class Request {
}
const clonedReq = cloneInnerRequest(this[_request]);
- assert(this[_signal] !== null);
- const clonedSignal = abortSignal.createDependentAbortSignal(
- [this[_signal]],
+ const materializedSignal = this[_signal];
+ const clonedSignal = createDependentAbortSignal(
+ [materializedSignal],
prefix,
);
- return fromInnerRequest(
- clonedReq,
- clonedSignal,
- guardFromHeaders(this[_headers]),
- );
+ const request = new Request(_brand);
+ request[_request] = clonedReq;
+ request[_signalCache] = clonedSignal;
+ request[_getHeaders] = () =>
+ headersFromHeaderList(
+ clonedReq.headerList,
+ guardFromHeaders(this[_headers]),
+ );
+ return request;
}
[SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) {
@@ -562,19 +576,30 @@ function toInnerRequest(request) {
/**
* @param {InnerRequest} inner
- * @param {AbortSignal} signal
* @param {"request" | "immutable" | "request-no-cors" | "response" | "none"} guard
* @returns {Request}
*/
-function fromInnerRequest(inner, signal, guard) {
+function fromInnerRequest(inner, guard) {
const request = new Request(_brand);
request[_request] = inner;
- request[_signal] = signal;
request[_getHeaders] = () => headersFromHeaderList(inner.headerList, guard);
return request;
}
+const signalAbortError = new DOMException(
+ "The request has been cancelled.",
+ "AbortError",
+);
+ObjectFreeze(signalAbortError);
+
+function abortRequest(request) {
+ if (request[_signal]) {
+ request[_signal][signalAbort](signalAbortError);
+ }
+}
+
export {
+ abortRequest,
fromInnerRequest,
newInnerRequest,
processUrlList,