chore(deps): roll up Dependabot updates (#1004)

## Summary

Roll up the remaining dependency changes from Dependabot PRs #997, #998,
#999, #1000, #1001, #1002, and #1003:

- update `github/codeql-action` to 4.37.6
- update `zizmorcore/zizmor-action` to 0.6.2
- update `undici` to 8.10.0
- update `smol-toml` to 1.7.1
- update `@biomejs/biome` and its schema to 2.5.6
- regenerate the published bundles

PRs #905 and #907 were excluded because their requested Jest and pep440
versions are already present on `main`.

## Validation

- `npm run all`
- `actionlint .github/workflows/codeql-analysis.yml
.github/workflows/test.yml`
- `uvx zizmor .github/workflows/codeql-analysis.yml
.github/workflows/test.yml`
- `git diff --check`

Refs: pi-session 019ff0c9-8e00-72d3-99ad-d4383a4c57d4
This commit is contained in:
Kevin Stillhammer
2026-08-11 15:08:35 +02:00
committed by GitHub
parent 46f427bd47
commit 8d6402c9b7
8 changed files with 2709 additions and 745 deletions
+3 -3
View File
@@ -47,7 +47,7 @@ jobs:
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4 uses: github/codeql-action/init@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
source-root: src source-root: src
@@ -59,7 +59,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below) # If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild - name: Autobuild
uses: github/codeql-action/autobuild@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4 uses: github/codeql-action/autobuild@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
# ℹ️ Command-line programs to run using the OS shell. # ℹ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl # 📚 https://git.io/JvXDl
@@ -73,4 +73,4 @@ jobs:
# make release # make release
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4 uses: github/codeql-action/analyze@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
+1 -1
View File
@@ -27,7 +27,7 @@ jobs:
- name: Actionlint - name: Actionlint
uses: eifinger/actionlint-action@1fc89649be682d16ec5cf65ea16e269eb88d3982 # v1.10.2 uses: eifinger/actionlint-action@1fc89649be682d16ec5cf65ea16e269eb88d3982 # v1.10.2
- name: Run zizmor - name: Run zizmor
uses: zizmorcore/zizmor-action@6fc4b006235f201fdab3722e17240ab420d580e5 # v0.6.1 uses: zizmorcore/zizmor-action@3dc1ecc9bcb9e94e9b2c709687979e1298497054 # v0.6.2
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with: with:
node-version-file: .nvmrc node-version-file: .nvmrc
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"$schema": "https://biomejs.dev/schemas/2.5.4/schema.json", "$schema": "https://biomejs.dev/schemas/2.5.6/schema.json",
"assist": { "assist": {
"actions": { "actions": {
"source": { "source": {
Generated Vendored
+2
View File
@@ -62228,6 +62228,8 @@ function skipUntil(str, ptr, sep7, end, banNewLines = false) {
let c = str[i]; let c = str[i];
if (c === "#") { if (c === "#") {
i = indexOfNewline(str, i); i = indexOfNewline(str, i);
if (i < 0)
break;
} else if (c === sep7) { } else if (c === sep7) {
return i + 1; return i + 1;
} else if (c === end || banNewLines && (c === "\n" || c === "\r" && str[i + 1] === "\n")) { } else if (c === end || banNewLines && (c === "\n" || c === "\r" && str[i + 1] === "\n")) {
Generated Vendored
+1308 -326
View File
@@ -28981,6 +28981,7 @@ var require_symbols6 = __commonJS({
kCounter: /* @__PURE__ */ Symbol("socket request counter"), kCounter: /* @__PURE__ */ Symbol("socket request counter"),
kMaxResponseSize: /* @__PURE__ */ Symbol("max response size"), kMaxResponseSize: /* @__PURE__ */ Symbol("max response size"),
kHTTP2Session: /* @__PURE__ */ Symbol("http2Session"), kHTTP2Session: /* @__PURE__ */ Symbol("http2Session"),
kHTTP2Options: /* @__PURE__ */ Symbol("http2 options"),
kHTTP2SessionState: /* @__PURE__ */ Symbol("http2Session state"), kHTTP2SessionState: /* @__PURE__ */ Symbol("http2Session state"),
kRetryHandlerDefaultRetry: /* @__PURE__ */ Symbol("retry agent default retry"), kRetryHandlerDefaultRetry: /* @__PURE__ */ Symbol("retry agent default retry"),
kConstruct: /* @__PURE__ */ Symbol("constructable"), kConstruct: /* @__PURE__ */ Symbol("constructable"),
@@ -30107,7 +30108,10 @@ var require_util9 = __commonJS({
if (Object.getPrototypeOf(stream5).constructor === IncomingMessage) { if (Object.getPrototypeOf(stream5).constructor === IncomingMessage) {
stream5.socket = null; stream5.socket = null;
} }
stream5.destroy(err); try {
stream5.destroy(err);
} catch {
}
} else if (err) { } else if (err) {
queueMicrotask(() => { queueMicrotask(() => {
stream5.emit("error", err); stream5.emit("error", err);
@@ -31168,7 +31172,7 @@ var require_request3 = __commonJS({
this.headersTimeout = headersTimeout; this.headersTimeout = headersTimeout;
this.bodyTimeout = bodyTimeout; this.bodyTimeout = bodyTimeout;
this.method = method; this.method = method;
this.typeOfService = typeOfService ?? 0; this.typeOfService = typeOfService;
this.abort = null; this.abort = null;
if (body2 == null) { if (body2 == null) {
this.body = null; this.body = null;
@@ -31402,7 +31406,11 @@ var require_request3 = __commonJS({
} else if (typeof val[i] === "object") { } else if (typeof val[i] === "object") {
throw new InvalidArgumentError(`invalid ${key} header`); throw new InvalidArgumentError(`invalid ${key} header`);
} else { } else {
arr.push(`${val[i]}`); const str = `${val[i]}`;
if (!isValidHeaderValue(str)) {
throw new InvalidArgumentError(`invalid ${key} header`);
}
arr.push(str);
} }
} }
val = arr; val = arr;
@@ -31414,6 +31422,9 @@ var require_request3 = __commonJS({
val = ""; val = "";
} else { } else {
val = `${val}`; val = `${val}`;
if (!isValidHeaderValue(val)) {
throw new InvalidArgumentError(`invalid ${key} header`);
}
} }
if (headerName === "host") { if (headerName === "host") {
if (request.host !== null) { if (request.host !== null) {
@@ -31739,14 +31750,26 @@ var require_connect2 = __commonJS({
} else { } else {
assert4(!httpSocket, "httpSocket can only be sent on TLS update"); assert4(!httpSocket, "httpSocket can only be sent on TLS update");
port = port || 80; port = port || 80;
socket = net.connect({ const connectOptions = {
highWaterMark: 64 * 1024, highWaterMark: 64 * 1024,
// Same as nodejs fs streams. // Same as nodejs fs streams.
...options, ...options,
localAddress, localAddress,
port, port,
host: hostname host: hostname
}); };
const family = net.isIP(hostname);
if (family !== 0 && servername && servername !== hostname) {
connectOptions.host = servername;
connectOptions.lookup = (_hostname, lookupOptions, cb) => {
if (lookupOptions.all) {
cb(null, [{ address: hostname, family }]);
} else {
cb(null, hostname, family);
}
};
}
socket = net.connect(connectOptions);
if (useH2c === true) { if (useH2c === true) {
socket.alpnProtocol = "h2"; socket.alpnProtocol = "h2";
} }
@@ -35103,6 +35126,7 @@ var require_body2 = __commonJS({
var { multipartFormDataParser } = require_formdata_parser2(); var { multipartFormDataParser } = require_formdata_parser2();
var { parseJSONFromBytes } = require_infra(); var { parseJSONFromBytes } = require_infra();
var { utf8DecodeBytes } = require_encoding2(); var { utf8DecodeBytes } = require_encoding2();
var { ReadableStreamTee } = require("node:stream/web");
var textEncoder = new TextEncoder(); var textEncoder = new TextEncoder();
function noop() { function noop() {
} }
@@ -35245,7 +35269,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r
return extractBody(object, keepalive); return extractBody(object, keepalive);
} }
function cloneBody(body2) { function cloneBody(body2) {
const { 0: out1, 1: out2 } = body2.stream.tee(); const { 0: out1, 1: out2 } = ReadableStreamTee?.(body2.stream, true) ?? body2.stream.tee();
body2.stream = out1; body2.stream = out1;
return { return {
stream: out2, stream: out2,
@@ -35398,6 +35422,7 @@ var require_client_h12 = __commonJS({
RequestContentLengthMismatchError, RequestContentLengthMismatchError,
ResponseContentLengthMismatchError, ResponseContentLengthMismatchError,
RequestAbortedError, RequestAbortedError,
InvalidArgumentError,
HeadersTimeoutError, HeadersTimeoutError,
HeadersOverflowError, HeadersOverflowError,
SocketError, SocketError,
@@ -35447,6 +35472,7 @@ var require_client_h12 = __commonJS({
var kIdleSocketValidation = /* @__PURE__ */ Symbol("kIdleSocketValidation"); var kIdleSocketValidation = /* @__PURE__ */ Symbol("kIdleSocketValidation");
var kIdleSocketValidationTimeout = /* @__PURE__ */ Symbol("kIdleSocketValidationTimeout"); var kIdleSocketValidationTimeout = /* @__PURE__ */ Symbol("kIdleSocketValidationTimeout");
var kSocketUsed = /* @__PURE__ */ Symbol("kSocketUsed"); var kSocketUsed = /* @__PURE__ */ Symbol("kSocketUsed");
var kTypeOfService = /* @__PURE__ */ Symbol("kTypeOfService");
var extractBody; var extractBody;
function lazyllhttp() { function lazyllhttp() {
const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm2() : void 0; const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm2() : void 0;
@@ -36250,6 +36276,24 @@ var require_client_h12 = __commonJS({
function shouldSendContentLength(method) { function shouldSendContentLength(method) {
return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT";
} }
function setTypeOfService(socket, request) {
if (typeof socket.setTypeOfService !== "function") {
return;
}
const typeOfService = request.typeOfService;
if (typeOfService === void 0) {
return;
}
const currentTypeOfService = socket[kTypeOfService];
if (currentTypeOfService === typeOfService) {
return;
}
try {
socket.setTypeOfService(typeOfService);
socket[kTypeOfService] = typeOfService;
} catch {
}
}
function writeH1(client, request) { function writeH1(client, request) {
const { method, path: path17, host, upgrade, blocking, reset } = request; const { method, path: path17, host, upgrade, blocking, reset } = request;
let { body: body2, headers, contentLength: contentLength2 } = request; let { body: body2, headers, contentLength: contentLength2 } = request;
@@ -36264,8 +36308,16 @@ var require_client_h12 = __commonJS({
} }
body2 = bodyStream.stream; body2 = bodyStream.stream;
contentLength2 = bodyStream.length; contentLength2 = bodyStream.length;
} else if (util7.isBlobLike(body2) && request.contentType == null && body2.type) { } else if (util7.isBlobLike(body2) && request.contentType == null) {
headers.push("content-type", body2.type); const contentType2 = body2.type;
if (contentType2) {
const contentTypeValue = `${contentType2}`;
if (!util7.isValidHeaderValue(contentTypeValue)) {
util7.errorRequest(client, request, new InvalidArgumentError("invalid content-type header"));
return false;
}
headers.push("content-type", contentTypeValue);
}
} }
if (body2 && typeof body2.read === "function") { if (body2 && typeof body2.read === "function") {
body2.read(0); body2.read(0);
@@ -36318,9 +36370,7 @@ var require_client_h12 = __commonJS({
if (blocking) { if (blocking) {
socket[kBlocking] = true; socket[kBlocking] = true;
} }
if (socket.setTypeOfService) { setTypeOfService(socket, request);
socket.setTypeOfService(request.typeOfService);
}
let header = `${method} ${path17} HTTP/1.1\r let header = `${method} ${path17} HTTP/1.1\r
`; `;
if (typeof host === "string") { if (typeof host === "string") {
@@ -36696,10 +36746,7 @@ var require_client_h22 = __commonJS({
kStrictContentLength, kStrictContentLength,
kOnError, kOnError,
kMaxConcurrentStreams, kMaxConcurrentStreams,
kPingInterval,
kHTTP2Session, kHTTP2Session,
kHTTP2InitialWindowSize,
kHTTP2ConnectionWindowSize,
kHostAuthority, kHostAuthority,
kResume, kResume,
kSize, kSize,
@@ -36711,7 +36758,8 @@ var require_client_h22 = __commonJS({
kEnableConnectProtocol, kEnableConnectProtocol,
kRemoteSettings, kRemoteSettings,
kHTTP2Stream, kHTTP2Stream,
kHTTP2SessionState kHTTP2SessionState,
kHTTP2Options
} = require_symbols6(); } = require_symbols6();
var { channels } = require_diagnostics2(); var { channels } = require_diagnostics2();
var kOpenStreams = /* @__PURE__ */ Symbol("open streams"); var kOpenStreams = /* @__PURE__ */ Symbol("open streams");
@@ -36720,6 +36768,9 @@ var require_client_h22 = __commonJS({
var kRequestStreamCleanup = /* @__PURE__ */ Symbol("request stream cleanup"); var kRequestStreamCleanup = /* @__PURE__ */ Symbol("request stream cleanup");
var kRequestStreamState = /* @__PURE__ */ Symbol("request stream state"); var kRequestStreamState = /* @__PURE__ */ Symbol("request stream state");
var kReceivedGoAway = /* @__PURE__ */ Symbol("received goaway"); var kReceivedGoAway = /* @__PURE__ */ Symbol("received goaway");
var kGoAwayReplayAttempts = /* @__PURE__ */ Symbol("goaway replay attempts");
var kRefusedStreamRetry = /* @__PURE__ */ Symbol("refused stream retry");
var MAX_GOAWAY_REPLAY_ATTEMPTS = 1;
var extractBody; var extractBody;
var http22; var http22;
try { try {
@@ -36803,6 +36854,7 @@ var require_client_h22 = __commonJS({
const queue = client[kQueue]; const queue = client[kQueue];
const runningIdx = client[kRunningIdx]; const runningIdx = client[kRunningIdx];
if (runningIdx < client[kPendingIdx] && queue[runningIdx] === request) { if (runningIdx < client[kPendingIdx] && queue[runningIdx] === request) {
queue[runningIdx] = null;
client[kRunningIdx] = runningIdx + 1; client[kRunningIdx] = runningIdx + 1;
return; return;
} }
@@ -36816,10 +36868,15 @@ var require_client_h22 = __commonJS({
client[kPendingIdx] = client[kRunningIdx]; client[kPendingIdx] = client[kRunningIdx];
} }
} }
function canRetryRequestAfterGoAway(request) { function canReplayRequest(request) {
const { body: body2 } = request; const { body: body2 } = request;
return body2 == null || util7.isBuffer(body2) || util7.isBlobLike(body2); return body2 == null || util7.isBuffer(body2) || util7.isBlobLike(body2);
} }
function registerGoAwayRefusal(request) {
const attempts = (request[kGoAwayReplayAttempts] ?? 0) + 1;
request[kGoAwayReplayAttempts] = attempts;
return attempts <= MAX_GOAWAY_REPLAY_ATTEMPTS;
}
function closeStream(stream4, code = NGHTTP2_REFUSED_STREAM) { function closeStream(stream4, code = NGHTTP2_REFUSED_STREAM) {
if (stream4 != null && !stream4.destroyed && !stream4.closed) { if (stream4 != null && !stream4.destroyed && !stream4.closed) {
try { try {
@@ -36831,15 +36888,30 @@ var require_client_h22 = __commonJS({
function detachRequestStreamForClose(request) { function detachRequestStreamForClose(request) {
const stream4 = request[kRequestStream]; const stream4 = request[kRequestStream];
clearRequestStream(request); clearRequestStream(request);
severRequestStream(stream4);
return stream4; return stream4;
} }
function severRequestStream(stream4) {
if (stream4 == null || stream4[kRequestStreamState] == null) {
return;
}
stream4[kRequestStreamState] = null;
stream4.off("close", completeRequestStream);
stream4.off("close", onUpgradeStreamClose);
if (stream4[kHTTP2Session] != null) {
closeStreamSession(stream4);
}
if (!stream4.destroyed && !stream4.closed) {
stream4.once("error", noop);
}
}
function connectH2(client, socket) { function connectH2(client, socket) {
client[kSocket] = socket; client[kSocket] = socket;
const http2InitialWindowSize = client[kHTTP2InitialWindowSize]; const http2InitialWindowSize = client[kHTTP2Options].sessionOptions?.initialWindowSize;
const http2ConnectionWindowSize = client[kHTTP2ConnectionWindowSize]; const http2ConnectionWindowSize = client[kHTTP2Options].connectionWindowSize;
const session = http22.connect(client[kUrl], { const session = http22.connect(client[kUrl], {
createConnection: () => socket, createConnection: () => socket,
peerMaxConcurrentStreams: client[kMaxConcurrentStreams], peerMaxConcurrentStreams: client[kHTTP2Options].maxConcurrentStreams,
settings: { settings: {
// TODO(metcoder95): add support for PUSH // TODO(metcoder95): add support for PUSH
enablePush: false, enablePush: false,
@@ -36852,13 +36924,16 @@ var require_client_h22 = __commonJS({
session[kSocket] = socket; session[kSocket] = socket;
session[kHTTP2SessionState] = { session[kHTTP2SessionState] = {
idleTimeout: null, idleTimeout: null,
// Armed while the peer advertises MAX_CONCURRENT_STREAMS = 0 and we have
// work that cannot start. See setNoStreamsTimeout.
noStreamsTimeout: null,
// Sockets start out ref'd. Session ref/unref proxies to the socket, so a // Sockets start out ref'd. Session ref/unref proxies to the socket, so a
// single cached flag lets us skip redundant uv ref/unref calls, provided // single cached flag lets us skip redundant uv ref/unref calls, provided
// every ref/unref of the session or its socket goes through // every ref/unref of the session or its socket goes through
// refH2Session/unrefH2Session. // refH2Session/unrefH2Session.
refed: true, refed: true,
ping: { ping: {
interval: client[kPingInterval] === 0 ? null : setInterval(onHttp2SendPing, client[kPingInterval], session).unref() interval: client[kHTTP2Options].pingInterval === 0 ? null : setInterval(onHttp2SendPing, client[kHTTP2Options].pingInterval, session).unref()
} }
}; };
session[kReceivedGoAway] = false; session[kReceivedGoAway] = false;
@@ -36869,7 +36944,6 @@ var require_client_h22 = __commonJS({
} }
util7.addListener(session, "error", onHttp2SessionError); util7.addListener(session, "error", onHttp2SessionError);
util7.addListener(session, "frameError", onHttp2FrameError); util7.addListener(session, "frameError", onHttp2FrameError);
util7.addListener(session, "end", onHttp2SessionEnd);
util7.addListener(session, "goaway", onHttp2SessionGoAway); util7.addListener(session, "goaway", onHttp2SessionGoAway);
util7.addListener(session, "close", onHttp2SessionClose); util7.addListener(session, "close", onHttp2SessionClose);
util7.addListener(session, "remoteSettings", onHttp2RemoteSettings); util7.addListener(session, "remoteSettings", onHttp2RemoteSettings);
@@ -36928,7 +37002,6 @@ var require_client_h22 = __commonJS({
if (request != null) { if (request != null) {
if (client[kRunning] > 0) { if (client[kRunning] > 0) {
if ((request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false) return true; if ((request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false) return true;
if (util7.bodyLength(request.body) !== 0 && (util7.isStream(request.body) || util7.isAsyncIterable(request.body) || util7.isFormDataLike(request.body))) return true;
} else { } else {
return (request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false; return (request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false;
} }
@@ -36965,8 +37038,48 @@ var require_client_h22 = __commonJS({
} else { } else {
clearHttp2IdleTimeout(session); clearHttp2IdleTimeout(session);
} }
if (client[kMaxConcurrentStreams] === 0 && client[kRunning] === 0 && client[kPending] > 0) {
setNoStreamsTimeout(session);
} else {
clearNoStreamsTimeout(session);
}
} }
} }
function clearNoStreamsTimeout(session) {
const state3 = session[kHTTP2SessionState];
if (state3?.noStreamsTimeout != null) {
clearTimeout(state3.noStreamsTimeout);
state3.noStreamsTimeout = null;
}
}
function setNoStreamsTimeout(session) {
const client = session[kClient];
const state3 = session[kHTTP2SessionState];
const timeout = client[kHeadersTimeout];
if (!timeout || state3.noStreamsTimeout != null) {
return;
}
state3.noStreamsTimeout = setTimeout(onNoStreamsTimeout, timeout, session).unref();
}
function onNoStreamsTimeout(session) {
const client = session[kClient];
const state3 = session[kHTTP2SessionState];
state3.noStreamsTimeout = null;
if (client[kHTTP2Session] !== session || client[kMaxConcurrentStreams] !== 0 || client[kRunning] !== 0 || client[kPending] === 0) {
return;
}
const err = new HeadersTimeoutError(
`HTTP/2: server did not accept a new stream within ${client[kHeadersTimeout]}`
);
const requests = client[kQueue].splice(client[kPendingIdx]);
for (let i = 0; i < requests.length; i++) {
if (requests[i] != null) {
util7.errorRequest(client, requests[i], err);
}
}
session[kError] = err;
resetHttp2Session(session, err);
}
function clearHttp2IdleTimeout(session) { function clearHttp2IdleTimeout(session) {
const state3 = session[kHTTP2SessionState]; const state3 = session[kHTTP2SessionState];
if (state3?.idleTimeout != null) { if (state3?.idleTimeout != null) {
@@ -37058,11 +37171,6 @@ var require_client_h22 = __commonJS({
this[kClient][kOnError](err); this[kClient][kOnError](err);
} }
} }
function onHttp2SessionEnd() {
const err = new SocketError("other side closed", util7.getSocketInfo(this[kSocket]));
this.destroy(err);
util7.destroy(this[kSocket], err);
}
function onHttp2SessionGoAway(errorCode, lastStreamID) { function onHttp2SessionGoAway(errorCode, lastStreamID) {
if (this[kReceivedGoAway]) { if (this[kReceivedGoAway]) {
return; return;
@@ -37078,7 +37186,7 @@ var require_client_h22 = __commonJS({
const request = client[kQueue][i]; const request = client[kQueue][i];
if (request != null) { if (request != null) {
streamsToClose.push(detachRequestStreamForClose(request)); streamsToClose.push(detachRequestStreamForClose(request));
if (canRetryRequestAfterGoAway(request)) { if (canReplayRequest(request) && registerGoAwayRefusal(request)) {
retriableRequests.push(request); retriableRequests.push(request);
} else { } else {
util7.errorRequest(client, request, err); util7.errorRequest(client, request, err);
@@ -37099,6 +37207,7 @@ var require_client_h22 = __commonJS({
client[kHTTP2Session] = null; client[kHTTP2Session] = null;
} }
clearHttp2IdleTimeout(this); clearHttp2IdleTimeout(this);
clearNoStreamsTimeout(this);
if (!this.closed && !this.destroyed) { if (!this.closed && !this.destroyed) {
this.close(); this.close();
} }
@@ -37115,6 +37224,7 @@ var require_client_h22 = __commonJS({
client[kHTTP2Session] = null; client[kHTTP2Session] = null;
} }
clearHttp2IdleTimeout(this); clearHttp2IdleTimeout(this);
clearNoStreamsTimeout(this);
if (state3.ping.interval != null) { if (state3.ping.interval != null) {
clearInterval(state3.ping.interval); clearInterval(state3.ping.interval);
state3.ping.interval = null; state3.ping.interval = null;
@@ -37156,7 +37266,7 @@ var require_client_h22 = __commonJS({
if (this[kHTTP2Session]?.[kReceivedGoAway]) { if (this[kHTTP2Session]?.[kReceivedGoAway]) {
return; return;
} }
this[kClient][kOnError](err); this[kHTTP2Session]?.[kClient]?.[kOnError](err);
} }
function onHttp2SocketEnd() { function onHttp2SocketEnd() {
util7.destroy(this, new SocketError("other side closed", util7.getSocketInfo(this))); util7.destroy(this, new SocketError("other side closed", util7.getSocketInfo(this)));
@@ -37182,15 +37292,22 @@ var require_client_h22 = __commonJS({
failUpgradeStream(state3, new InformationalError("HTTP/2: stream closed before response headers")); failUpgradeStream(state3, new InformationalError("HTTP/2: stream closed before response headers"));
closeStreamSession(this); closeStreamSession(this);
} }
function onRequestStreamClose() { function completeRequestStream() {
const state3 = this[kRequestStreamState]; const state3 = this[kRequestStreamState];
if (state3) { if (state3 == null) {
releaseRequestStream(this); return;
if (state3.pendingEnd && !state3.request.aborted && !state3.request.completed) {
state3.request.onResponseEnd(state3.trailers || {});
finalizeRequest(state3);
}
} }
releaseRequestStream(this);
if (state3.pendingEnd && !state3.request.aborted && !state3.request.completed) {
state3.request.onResponseEnd(state3.trailers || {});
} else if (!state3.request.aborted && !state3.request.completed) {
util7.errorRequest(
state3.client,
state3.request,
new InformationalError("HTTP/2: stream closed before the response was complete")
);
}
finalizeRequest(state3);
closeStreamSession(this); closeStreamSession(this);
this[kRequestStreamState] = null; this[kRequestStreamState] = null;
} }
@@ -37370,11 +37487,9 @@ var require_client_h22 = __commonJS({
clearRequestStream(request); clearRequestStream(request);
const stream5 = state3.stream; const stream5 = state3.stream;
stream5.close(); stream5.close();
setImmediate(() => { if (!stream5.destroyed) {
if (!stream5.destroyed) { util7.destroy(stream5);
util7.destroy(stream5); }
}
});
client[kOnError](err); client[kOnError](err);
finalizeRequest(state3, resetPendingIdx); finalizeRequest(state3, resetPendingIdx);
} }
@@ -37483,7 +37598,7 @@ var require_client_h22 = __commonJS({
stream4.setTimeout(headersTimeout); stream4.setTimeout(headersTimeout);
} }
stream4[kHTTP2Session] = session; stream4[kHTTP2Session] = session;
stream4.on("close", onRequestStreamClose); stream4.on("close", completeRequestStream);
bindRequestToStream(request, stream4, releaseRequestStream); bindRequestToStream(request, stream4, releaseRequestStream);
if (expectContinue) { if (expectContinue) {
stream4.once("continue", writeBodyH2); stream4.once("continue", writeBodyH2);
@@ -37584,11 +37699,26 @@ var require_client_h22 = __commonJS({
if (state3.responseReceived) { if (state3.responseReceived) {
if (!request.aborted && !request.completed) { if (!request.aborted && !request.completed) {
state3.pendingEnd = true; state3.pendingEnd = true;
completeRequestStream.call(stream4);
} }
} else { } else {
state3.abort(new InformationalError("HTTP/2: stream half-closed (remote)"), true); state3.abort(new InformationalError("HTTP/2: stream half-closed (remote)"), true);
} }
} }
function retryRefusedStream(stream4, state3) {
const { client, request } = state3;
if (state3.responseReceived || request.aborted || request.completed || request[kRefusedStreamRetry] || !canReplayRequest(request)) {
return false;
}
request[kRefusedStreamRetry] = true;
detachRequestStreamForClose(request);
state3.stream = null;
state3.requestFinalized = true;
completeRequest(client, request);
client[kQueue].splice(client[kPendingIdx], 0, request);
client[kResume]();
return true;
}
function onError(err) { function onError(err) {
const stream4 = this; const stream4 = this;
const state3 = stream4[kRequestStreamState]; const state3 = stream4[kRequestStreamState];
@@ -37596,6 +37726,12 @@ var require_client_h22 = __commonJS({
return; return;
} }
stream4.off("error", onError); stream4.off("error", onError);
if (typeof stream4.rstCode === "number" && stream4.rstCode !== NGHTTP2_NO_ERROR) {
err.http2ErrorCode = stream4.rstCode;
}
if (stream4.rstCode === NGHTTP2_REFUSED_STREAM && retryRefusedStream(stream4, state3)) {
return;
}
state3.abort(err); state3.abort(err);
} }
function onFrameError(type, code) { function onFrameError(type, code) {
@@ -37877,10 +38013,8 @@ var require_client2 = __commonJS({
kHTTPContext, kHTTPContext,
kMaxConcurrentStreams, kMaxConcurrentStreams,
kHostAuthority, kHostAuthority,
kHTTP2InitialWindowSize,
kHTTP2ConnectionWindowSize,
kResume, kResume,
kPingInterval kHTTP2Options
} = require_symbols6(); } = require_symbols6();
var connectH1 = require_client_h12(); var connectH1 = require_client_h12();
var connectH2 = require_client_h22(); var connectH2 = require_client_h22();
@@ -37893,6 +38027,14 @@ var require_client2 = __commonJS({
function getPipelining(client) { function getPipelining(client) {
return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1; return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1;
} }
var h2NamespaceOptsWarning = false;
function emitH2OptionsNamespaceWarning(optName) {
if (h2NamespaceOptsWarning === true) return;
process.emitWarning(`Use h2Options.${optName} instead. ${optName} for H2 will be deprecated in future major.`, {
code: "UNDICI-H2-OPTIONS"
});
h2NamespaceOptsWarning = true;
}
function getMaxConcurrent(client) { function getMaxConcurrent(client) {
if (client[kHTTPContext]?.version === "h2") { if (client[kHTTPContext]?.version === "h2") {
return client[kMaxConcurrentStreams]; return client[kMaxConcurrentStreams];
@@ -37936,7 +38078,8 @@ var require_client2 = __commonJS({
initialWindowSize, initialWindowSize,
connectionWindowSize, connectionWindowSize,
pingInterval, pingInterval,
webSocket webSocket,
h2Options
} = {}) { } = {}) {
if (keepAlive !== void 0) { if (keepAlive !== void 0) {
throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead");
@@ -37999,20 +38142,45 @@ var require_client2 = __commonJS({
if (allowH2 != null && typeof allowH2 !== "boolean") { if (allowH2 != null && typeof allowH2 !== "boolean") {
throw new InvalidArgumentError("allowH2 must be a valid boolean value"); throw new InvalidArgumentError("allowH2 must be a valid boolean value");
} }
if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { if (allowH2 !== false) {
throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0"); if (h2Options != null) {
} if (h2Options.useH2c != null && typeof h2Options.useH2c !== "boolean") {
if (useH2c != null && typeof useH2c !== "boolean") { throw new InvalidArgumentError("h2Options.useH2c must be a valid boolean value");
throw new InvalidArgumentError("useH2c must be a valid boolean value"); }
} if (h2Options.settings?.initialWindowSize != null && (!Number.isInteger(h2Options.settings.initialWindowSize) || h2Options.settings.initialWindowSize < 1)) {
if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) { throw new InvalidArgumentError("h2Options.settings.initialWindowSize must be a positive integer, greater than 0");
throw new InvalidArgumentError("initialWindowSize must be a positive integer, greater than 0"); }
} if (h2Options.maxConcurrentStreams != null && (!Number.isInteger(h2Options.connectionWindowSize) || h2Options.maxConcurrentStreams < 1)) {
if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) { throw new InvalidArgumentError("h2Options.maxConcurrentStreams must be a positive integer, greater than 0");
throw new InvalidArgumentError("connectionWindowSize must be a positive integer, greater than 0"); }
} if (h2Options.connectionWindowSize != null && (!Number.isInteger(h2Options.connectionWindowSize) || h2Options.connectionWindowSize < 1)) {
if (pingInterval != null && (typeof pingInterval !== "number" || !Number.isInteger(pingInterval) || pingInterval < 0)) { throw new InvalidArgumentError("h2Options.connectionWindowSize must be a positive integer, greater than 0");
throw new InvalidArgumentError("pingInterval must be a positive integer, greater or equal to 0"); }
if (h2Options.pingInterval != null && (typeof h2Options.pingInterval !== "number" || !Number.isInteger(h2Options.pingInterval) || h2Options.pingInterval < 0)) {
throw new InvalidArgumentError("h2Options.pingInterval must be a positive integer, greater or equal to 0");
}
} else {
if (useH2c != null && typeof useH2c !== "boolean") {
emitH2OptionsNamespaceWarning("useH2c");
throw new InvalidArgumentError("useH2c must be a valid boolean value");
}
if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) {
emitH2OptionsNamespaceWarning("maxConcurrentStreams");
throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0");
}
if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) {
emitH2OptionsNamespaceWarning("initialWindowSize");
throw new InvalidArgumentError("initialWindowSize must be a positive integer, greater than 0");
}
if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) {
emitH2OptionsNamespaceWarning("connectionWindowSize");
throw new InvalidArgumentError("connectionWindowSize must be a positive integer, greater than 0");
}
if (pingInterval != null && (typeof pingInterval !== "number" || !Number.isInteger(pingInterval) || pingInterval < 0)) {
emitH2OptionsNamespaceWarning("pingInterval");
throw new InvalidArgumentError("pingInterval must be a positive integer, greater or equal to 0");
}
}
} }
super({ webSocket }); super({ webSocket });
if (typeof connect2 !== "function") { if (typeof connect2 !== "function") {
@@ -38020,8 +38188,8 @@ var require_client2 = __commonJS({
...tls, ...tls,
maxCachedSessions, maxCachedSessions,
allowH2, allowH2,
useH2c,
socketPath, socketPath,
useH2c: h2Options?.useH2c ?? useH2c,
timeout: connectTimeout, timeout: connectTimeout,
...typeof autoSelectFamily === "boolean" ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, ...typeof autoSelectFamily === "boolean" ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0,
...connect2 ...connect2
@@ -38056,10 +38224,21 @@ var require_client2 = __commonJS({
this[kClosedResolve] = null; this[kClosedResolve] = null;
this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1;
this[kHTTPContext] = null; this[kHTTPContext] = null;
this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100; this[kHTTP2Options] = {
this[kHTTP2InitialWindowSize] = initialWindowSize != null ? initialWindowSize : 262144; pingInterval: h2Options?.pingInterval ?? pingInterval ?? 6e4,
this[kHTTP2ConnectionWindowSize] = connectionWindowSize != null ? connectionWindowSize : 524288; connectionWindowSize: h2Options?.connectionWindowSize ?? connectionWindowSize ?? 524288,
this[kPingInterval] = pingInterval != null ? pingInterval : 6e4; maxConcurrentStreams: h2Options?.maxConcurrentStreams ?? maxConcurrentStreams ?? 100,
// Max peerConcurrentStreams for a Node h2 server
sessionOptions: {
// HTTP/2 window sizes are set to higher defaults than Node.js core for better performance:
// - initialWindowSize: 262144 (256KB) vs Node.js default 65535 (64KB - 1)
// Allows more data to be sent before requiring acknowledgment, improving throughput
// especially on high-latency networks. This matches common production HTTP/2 servers.
// - connectionWindowSize: 524288 (512KB) vs Node.js default (none set)
// Provides better flow control for the entire connection across multiple streams.
initialWindowSize: h2Options?.initialWindowSize ?? initialWindowSize ?? 262144
}
};
this[kQueue] = []; this[kQueue] = [];
this[kRunningIdx] = 0; this[kRunningIdx] = 0;
this[kPendingIdx] = 0; this[kPendingIdx] = 0;
@@ -38344,6 +38523,7 @@ var require_client2 = __commonJS({
return; return;
} }
if (!client[kHTTPContext]) { if (!client[kHTTPContext]) {
client[kServerName] = request.servername;
connect(client); connect(client);
return; return;
} }
@@ -39114,14 +39294,14 @@ var require_agent2 = __commonJS({
dispatcher.close(); dispatcher.close();
} }
let hasOrigin = false; let hasOrigin = false;
for (const client of this[kClients].values()) { for (const k of this[kClients].keys()) {
if (client[kUrl].origin === dispatcher[kUrl].origin) { if (k === origin || k === `${origin}#http1-only`) {
hasOrigin = true; hasOrigin = true;
break; break;
} }
} }
if (!hasOrigin) { if (!hasOrigin) {
this[kOrigins].delete(dispatcher[kUrl].origin); this[kOrigins].delete(origin);
} }
}; };
dispatcher.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", (origin2, targets, err) => { dispatcher.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", (origin2, targets, err) => {
@@ -39754,7 +39934,7 @@ var require_socks5_proxy_agent = __commonJS({
var DispatcherBase = require_dispatcher_base2(); var DispatcherBase = require_dispatcher_base2();
var { InvalidArgumentError } = require_errors2(); var { InvalidArgumentError } = require_errors2();
var { Socks5Client, STATES } = require_socks5_client(); var { Socks5Client, STATES } = require_socks5_client();
var { kDispatch, kClose, kDestroy } = require_symbols6(); var { kBusy, kConnected, kDispatch, kClose, kDestroy } = require_symbols6();
var Pool = require_pool2(); var Pool = require_pool2();
var buildConnector = require_connect2(); var buildConnector = require_connect2();
var { debuglog } = require("node:util"); var { debuglog } = require("node:util");
@@ -39912,6 +40092,17 @@ var require_socks5_proxy_agent = __commonJS({
} }
}); });
this[kPools].set(originKey, pool); this[kPools].set(originKey, pool);
const closePoolIfUnused = () => {
if (this[kPools].get(originKey) !== pool || pool[kConnected] > 0 || pool[kBusy]) {
return;
}
this[kPools].delete(originKey);
if (!pool.destroyed) {
pool.close();
}
};
pool.on("disconnect", closePoolIfUnused);
pool.on("connectionError", closePoolIfUnused);
} }
return pool[kDispatch](opts, handler); return pool[kDispatch](opts, handler);
} catch (err) { } catch (err) {
@@ -40296,7 +40487,7 @@ var require_env_http_proxy_agent2 = __commonJS({
} }
#getProxyAgentForUrl(url2) { #getProxyAgentForUrl(url2) {
let { protocol, host: hostname, port } = url2; let { protocol, host: hostname, port } = url2;
hostname = hostname.replace(/:\d*$/, "").toLowerCase(); hostname = hostname.replace(/:\d*$/, "").replace(/^\[(.+)\]$/, "$1").toLowerCase();
port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0; port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0;
if (!this.#shouldProxy(hostname, port)) { if (!this.#shouldProxy(hostname, port)) {
return this[kNoProxyAgent]; return this[kNoProxyAgent];
@@ -40339,11 +40530,22 @@ var require_env_http_proxy_agent2 = __commonJS({
if (!entry) { if (!entry) {
continue; continue;
} }
const parsed = entry.match(/^(.+):(\d+)$/); let hostname, port;
const ipv6WithPort = entry.match(/^\[(.+)\]:(\d+)$/);
if (ipv6WithPort) {
hostname = ipv6WithPort[1];
port = Number.parseInt(ipv6WithPort[2], 10);
} else {
const unbracketed = entry.replace(/^\[(.+)\]$/, "$1");
const colonCount = (unbracketed.match(/:/g) || []).length;
const parsed = colonCount === 1 && unbracketed.match(/^(.+):(\d+)$/);
hostname = parsed ? parsed[1] : unbracketed;
port = parsed ? Number.parseInt(parsed[2], 10) : 0;
}
noProxyEntries.push({ noProxyEntries.push({
// strip leading dot or asterisk with dot // strip leading dot or asterisk with dot
hostname: (parsed ? parsed[1] : entry).replace(/^\*?\./, "").toLowerCase(), hostname: hostname.replace(/^\*?\./, "").toLowerCase(),
port: parsed ? Number.parseInt(parsed[2], 10) : 0 port
}); });
} }
this.#noProxyValue = noProxyValue; this.#noProxyValue = noProxyValue;
@@ -40377,7 +40579,24 @@ var require_retry_handler2 = __commonJS({
} = require_util9(); } = require_util9();
function calculateRetryAfterHeader(retryAfter) { function calculateRetryAfterHeader(retryAfter) {
const retryTime = new Date(retryAfter).getTime(); const retryTime = new Date(retryAfter).getTime();
return isNaN(retryTime) ? 0 : retryTime - Date.now(); return isNaN(retryTime) ? null : retryTime - Date.now();
}
function validatePartialResponseContentLength(headers, range2, statusCode, retryCount) {
const contentLength2 = headers["content-length"];
if (contentLength2 == null) {
return;
}
if (!Number.isFinite(range2.start) || !Number.isFinite(range2.end)) {
return;
}
const length = Number(contentLength2);
const expectedLength = range2.end - range2.start + 1;
if (!Number.isFinite(length) || length !== expectedLength) {
throw new RequestRetryError("Content-Length mismatch", statusCode, {
headers,
data: { count: retryCount }
});
}
} }
var RetryController = class { var RetryController = class {
constructor() { constructor() {
@@ -40544,10 +40763,14 @@ var require_retry_handler2 = __commonJS({
retryAfterHeader = Number(retryAfterHeader); retryAfterHeader = Number(retryAfterHeader);
retryAfterHeader = Number.isNaN(retryAfterHeader) ? calculateRetryAfterHeader(headers["retry-after"]) : retryAfterHeader * 1e3; retryAfterHeader = Number.isNaN(retryAfterHeader) ? calculateRetryAfterHeader(headers["retry-after"]) : retryAfterHeader * 1e3;
} }
const retryTimeout = retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout); const retryTimeout = retryAfterHeader === 0 ? 0 : retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout);
setTimeout(() => cb(null), retryTimeout); setTimeout(() => cb(null), retryTimeout);
} }
onResponseStart(controller, statusCode, headers, statusMessage) { onResponseStart(controller, statusCode, headers, statusMessage) {
if (statusCode < 200) {
this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage);
return;
}
this.error = null; this.error = null;
this.retryCount += 1; this.retryCount += 1;
this.statusCode = statusCode; this.statusCode = statusCode;
@@ -40582,6 +40805,7 @@ var require_retry_handler2 = __commonJS({
data: { count: this.retryCount } data: { count: this.retryCount }
}); });
} }
validatePartialResponseContentLength(headers, contentRange, statusCode, this.retryCount);
const { start, size, end = size ? size - 1 : null } = contentRange; const { start, size, end = size ? size - 1 : null } = contentRange;
assert4(this.start === start, "content-range mismatch"); assert4(this.start === start, "content-range mismatch");
assert4(this.end == null || this.end === end, "content-range mismatch"); assert4(this.end == null || this.end === end, "content-range mismatch");
@@ -40590,7 +40814,7 @@ var require_retry_handler2 = __commonJS({
if (this.end == null) { if (this.end == null) {
if (statusCode === 206) { if (statusCode === 206) {
const range2 = parseRangeHeader(headers["content-range"]); const range2 = parseRangeHeader(headers["content-range"]);
if (range2 == null) { if (range2 == null || range2.end == null) {
this.headersSent = true; this.headersSent = true;
this.handler.onResponseStart?.( this.handler.onResponseStart?.(
this.controllerProxy, this.controllerProxy,
@@ -40600,6 +40824,7 @@ var require_retry_handler2 = __commonJS({
); );
return; return;
} }
validatePartialResponseContentLength(headers, range2, statusCode, this.retryCount);
const { start, size, end = size ? size - 1 : null } = range2; const { start, size, end = size ? size - 1 : null } = range2;
assert4( assert4(
start != null && Number.isFinite(start), start != null && Number.isFinite(start),
@@ -40609,7 +40834,7 @@ var require_retry_handler2 = __commonJS({
this.start = start; this.start = start;
this.end = end; this.end = end;
} }
if (this.end == null) { if (this.end == null && this.opts.method !== "HEAD") {
const contentLength2 = headers["content-length"]; const contentLength2 = headers["content-length"];
this.end = contentLength2 != null ? Number(contentLength2) - 1 : null; this.end = contentLength2 != null ? Number(contentLength2) - 1 : null;
} }
@@ -40810,7 +41035,6 @@ var require_readable2 = __commonJS({
var kContentLength = /* @__PURE__ */ Symbol("kContentLength"); var kContentLength = /* @__PURE__ */ Symbol("kContentLength");
var kUsed = /* @__PURE__ */ Symbol("kUsed"); var kUsed = /* @__PURE__ */ Symbol("kUsed");
var kBytesRead = /* @__PURE__ */ Symbol("kBytesRead"); var kBytesRead = /* @__PURE__ */ Symbol("kBytesRead");
var kPreservedBuffer = /* @__PURE__ */ Symbol("kPreservedBuffer");
var noop = () => { var noop = () => {
}; };
var BodyReadable = class extends Readable6 { var BodyReadable = class extends Readable6 {
@@ -41049,21 +41273,6 @@ var require_readable2 = __commonJS({
*/ */
setEncoding(encoding) { setEncoding(encoding) {
if (Buffer.isEncoding(encoding)) { if (Buffer.isEncoding(encoding)) {
const state3 = this._readableState;
const buffer3 = state3.buffer;
if (buffer3 && state3.length > 0) {
const bufferIndex = state3.bufferIndex ?? 0;
const preserved = [];
const source = typeof buffer3.slice === "function" ? buffer3.slice(bufferIndex) : buffer3;
for (const data of source) {
if (Buffer.isBuffer(data)) {
preserved.push(data);
}
}
if (preserved.length > 0) {
this[kPreservedBuffer] = (this[kPreservedBuffer] || []).concat(preserved);
}
}
super.setEncoding(encoding); super.setEncoding(encoding);
} }
return this; return this;
@@ -41114,13 +41323,7 @@ var require_readable2 = __commonJS({
return; return;
} }
const { _readableState: state3 } = consume2.stream; const { _readableState: state3 } = consume2.stream;
const preserved = consume2.stream[kPreservedBuffer]; if (state3.bufferIndex) {
if (preserved && preserved.length > 0) {
for (const chunk of preserved) {
consumePush(consume2, chunk);
}
consume2.stream[kPreservedBuffer] = null;
} else if (state3.bufferIndex) {
const start = state3.bufferIndex; const start = state3.bufferIndex;
const end = state3.buffer.length; const end = state3.buffer.length;
for (let n = start; n < end; n++) { for (let n = start; n < end; n++) {
@@ -41131,13 +41334,17 @@ var require_readable2 = __commonJS({
consumePush(consume2, chunk); consumePush(consume2, chunk);
} }
} }
if (state3.endEmitted) { const decoder = state3.decoder;
consumeEnd(this[kConsume], this._readableState.encoding); if (decoder != null && decoder.lastNeed > 0) {
} else { consumePush(consume2, Buffer.from(decoder.lastChar.subarray(0, decoder.lastTotal - decoder.lastNeed)));
consume2.stream.on("end", function() {
consumeEnd(this[kConsume], this._readableState.encoding);
});
} }
if (state3.endEmitted) {
consumeEnd(consume2, state3.encoding);
return;
}
consume2.stream.on("end", function() {
consumeEnd(this[kConsume], this._readableState.encoding);
});
consume2.stream.resume(); consume2.stream.resume();
while (consume2.stream.read() != null) { while (consume2.stream.read() != null) {
} }
@@ -41194,6 +41401,9 @@ var require_readable2 = __commonJS({
if (consume2.body === null) { if (consume2.body === null) {
return; return;
} }
if (typeof chunk === "string") {
chunk = Buffer.from(chunk, consume2.stream._readableState.encoding);
}
consume2.length += chunk.length; consume2.length += chunk.length;
consume2.body.push(chunk); consume2.body.push(chunk);
} }
@@ -42178,6 +42388,7 @@ var require_mock_utils2 = __commonJS({
} }
} = require("node:util"); } = require("node:util");
var { InvalidArgumentError } = require_errors2(); var { InvalidArgumentError } = require_errors2();
var requestAborted = /* @__PURE__ */ Symbol("request aborted");
function matchValue(match2, value) { function matchValue(match2, value) {
if (typeof match2 === "string") { if (typeof match2 === "string") {
return match2 === value; return match2 === value;
@@ -42290,6 +42501,8 @@ var require_mock_utils2 = __commonJS({
return data; return data;
} else if (data instanceof ArrayBuffer) { } else if (data instanceof ArrayBuffer) {
return data; return data;
} else if (ArrayBuffer.isView(data)) {
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
} else if (typeof data === "object") { } else if (typeof data === "object") {
return JSON.stringify(data); return JSON.stringify(data);
} else if (data) { } else if (data) {
@@ -42343,6 +42556,9 @@ var require_mock_utils2 = __commonJS({
} }
} }
function removeTrailingSlash(path17) { function removeTrailingSlash(path17) {
if (typeof path17 !== "string") {
return path17;
}
while (path17.endsWith("/")) { while (path17.endsWith("/")) {
path17 = path17.slice(0, -1); path17 = path17.slice(0, -1);
} }
@@ -42391,17 +42607,43 @@ var require_mock_utils2 = __commonJS({
function mockDispatch(opts, handler) { function mockDispatch(opts, handler) {
const key = buildKey(opts); const key = buildKey(opts);
const mockDispatch2 = getMockDispatch(this[kDispatches], key); const mockDispatch2 = getMockDispatch(this[kDispatches], key);
const mockDispatches = this[kDispatches];
mockDispatch2.timesInvoked++; mockDispatch2.timesInvoked++;
if (mockDispatch2.data.callback) {
mockDispatch2.data = { ...mockDispatch2.data, ...mockDispatch2.data.callback(opts) };
}
const { data: { statusCode, data, headers, trailers, error: error2 }, delay: delay4, persist } = mockDispatch2;
const { timesInvoked, times } = mockDispatch2; const { timesInvoked, times } = mockDispatch2;
mockDispatch2.consumed = !persist && timesInvoked >= times; mockDispatch2.consumed = !mockDispatch2.persist && timesInvoked >= times;
mockDispatch2.pending = timesInvoked < times; mockDispatch2.pending = timesInvoked < times;
if (error2 !== null) { const hasBodyHooks = typeof handler.onBodySent === "function" || typeof handler.onRequestSent === "function";
deleteMockDispatch(this[kDispatches], key); if (mockDispatch2.data.callback && (!hasBodyHooks || opts.body == null)) {
handler.onResponseError(null, error2); const { callback, ...responseDefaults } = mockDispatch2.data;
const callbackResult = callback(opts);
if (isPromise(callbackResult)) {
callbackResult.then(
(resolvedData) => {
if (resolvedData == null || typeof resolvedData !== "object") {
handler.onResponseError(null, new InvalidArgumentError("reply options callback must return an object"));
return;
}
mockDispatch2.data = { ...responseDefaults, ...resolvedData };
dispatchMockReply(mockDispatches, mockDispatch2, key, opts, handler);
},
(error2) => {
handler.onResponseError(null, error2);
}
);
return true;
}
if (callbackResult == null || typeof callbackResult !== "object") {
throw new InvalidArgumentError("reply options callback must return an object");
}
mockDispatch2.data = { ...responseDefaults, ...callbackResult };
}
return dispatchMockReply(mockDispatches, mockDispatch2, key, opts, handler);
}
function dispatchMockReply(mockDispatches, mockDispatch2, key, opts, handler) {
const { data: response, delay: delay4 } = mockDispatch2;
if (response.error !== null) {
deleteMockDispatch(mockDispatches, key);
handler.onResponseError(null, response.error);
return true; return true;
} }
let aborted = false; let aborted = false;
@@ -42428,39 +42670,172 @@ var require_mock_utils2 = __commonJS({
handler.onResponseError?.(controller, reason); handler.onResponseError?.(controller, reason);
} }
}; };
let replyOpts = opts;
const dispatches = mockDispatches;
handler.onRequestStart?.(controller, null); handler.onRequestStart?.(controller, null);
if (typeof delay4 === "number" && delay4 > 0) { if (aborted) {
timer = setTimeout(() => { return true;
timer = null;
handleReply(this[kDispatches]);
}, delay4);
} else {
handleReply(this[kDispatches]);
} }
function handleReply(mockDispatches, _data = data) { const requestBody = dispatchRequestBody(opts.body, handler, controller, () => aborted);
if (isPromise(requestBody)) {
requestBody.then((body2) => {
if (body2 === requestAborted) {
return;
}
if (body2 !== opts.body) {
replyOpts = { ...opts, body: body2 };
}
sendReply();
}, (error2) => controller.abort(error2));
return true;
}
if (requestBody === requestAborted) {
return true;
}
if (requestBody !== opts.body) {
replyOpts = { ...opts, body: requestBody };
}
sendReply();
function sendReply() {
if (response.callback) {
const { callback, ...responseDefaults } = response;
let callbackResult;
try {
callbackResult = callback(replyOpts);
} catch (err) {
deleteMockDispatch(mockDispatches, key);
handler.onResponseError(null, err);
return;
}
if (isPromise(callbackResult)) {
callbackResult.then(
(resolvedData) => {
if (resolvedData == null || typeof resolvedData !== "object") {
handler.onResponseError(null, new InvalidArgumentError("reply options callback must return an object"));
return;
}
mockDispatch2.data = { ...responseDefaults, ...resolvedData };
handleReply(dispatches, mockDispatch2.data);
},
(err) => {
handler.onResponseError(null, err);
}
);
return;
}
if (callbackResult == null || typeof callbackResult !== "object") {
throw new InvalidArgumentError("reply options callback must return an object");
}
mockDispatch2.data = { ...responseDefaults, ...callbackResult };
handleReply(dispatches, mockDispatch2.data);
return;
}
if (typeof delay4 === "number" && delay4 > 0) {
timer = setTimeout(() => {
timer = null;
handleReply(dispatches);
}, delay4);
} else {
handleReply(dispatches);
}
}
function handleReply(mockDispatches2, _response = response) {
if (aborted) { if (aborted) {
return; return;
} }
const { statusCode, data, headers, trailers } = _response;
const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers;
const body2 = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data; const body2 = typeof data === "function" ? data({ ...replyOpts, headers: optsHeaders }) : data;
if (isPromise(body2)) { if (isPromise(body2)) {
return body2.then((newData) => handleReply(mockDispatches, newData)); return body2.then((newData) => handleReply(mockDispatches2, { ..._response, data: newData }));
} }
if (aborted) { if (aborted) {
return; return;
} }
const responseData = getResponseData(body2); const responseData = getResponseData(body2);
const responseHeaders = generateKeyValues(headers); const responseHeaders = generateKeyValues(headers ?? {});
const responseTrailers = generateKeyValues(trailers); const responseTrailers = generateKeyValues(trailers ?? {});
controller.rawHeaders = responseHeaders; controller.rawHeaders = responseHeaders;
controller.rawTrailers = responseTrailers; controller.rawTrailers = responseTrailers;
handler.onResponseStart?.(controller, statusCode, parseHeaders(responseHeaders), getStatusText(statusCode)); handler.onResponseStart?.(controller, statusCode, parseHeaders(responseHeaders), getStatusText(statusCode));
handler.onResponseData?.(controller, Buffer.from(responseData)); handler.onResponseData?.(controller, Buffer.from(responseData));
handler.onResponseEnd?.(controller, parseHeaders(responseTrailers)); handler.onResponseEnd?.(controller, parseHeaders(responseTrailers));
deleteMockDispatch(mockDispatches, key); deleteMockDispatch(mockDispatches2, key);
} }
return true; return true;
} }
function dispatchRequestBody(body2, handler, controller, isAborted) {
if (typeof handler.onBodySent !== "function" && typeof handler.onRequestSent !== "function") {
return body2;
}
if (body2 == null) {
return callOnRequestSent(handler, controller, isAborted) ? body2 : requestAborted;
}
if (body2 && typeof body2[Symbol.asyncIterator] === "function") {
return dispatchAsyncIterableBody(body2, handler, controller, isAborted);
}
if (isIterableBody(body2)) {
const chunks = [];
for (const chunk of body2) {
if (isAborted()) {
return requestAborted;
}
chunks.push(chunk);
if (!callOnBodySent(handler, controller, chunk) || isAborted()) {
return requestAborted;
}
}
return callOnRequestSent(handler, controller, isAborted) ? chunks : requestAborted;
}
if (isAborted()) {
return requestAborted;
}
if (!callOnBodySent(handler, controller, body2)) {
return requestAborted;
}
return callOnRequestSent(handler, controller, isAborted) ? body2 : requestAborted;
}
async function dispatchAsyncIterableBody(body2, handler, controller, isAborted) {
const chunks = [];
for await (const chunk of body2) {
if (isAborted()) {
return requestAborted;
}
chunks.push(chunk);
if (!callOnBodySent(handler, controller, chunk) || isAborted()) {
return requestAborted;
}
}
if (!callOnRequestSent(handler, controller, isAborted)) {
return requestAborted;
}
return {
async *[Symbol.asyncIterator]() {
yield* chunks;
}
};
}
function callOnBodySent(handler, controller, chunk) {
try {
handler.onBodySent?.(chunk);
return true;
} catch (error2) {
controller.abort(error2);
return false;
}
}
function callOnRequestSent(handler, controller, isAborted) {
try {
handler.onRequestSent?.();
return !isAborted();
} catch (error2) {
controller.abort(error2);
return false;
}
}
function isIterableBody(body2) {
return typeof body2 !== "string" && !Buffer.isBuffer(body2) && !ArrayBuffer.isView(body2) && typeof body2[Symbol.iterator] === "function";
}
function buildMockDispatch() { function buildMockDispatch() {
const agent = this[kMockAgent]; const agent = this[kMockAgent];
const origin = this[kOrigin]; const origin = this[kOrigin];
@@ -42561,6 +42936,11 @@ var require_mock_interceptor2 = __commonJS({
} = require_mock_symbols2(); } = require_mock_symbols2();
var { InvalidArgumentError } = require_errors2(); var { InvalidArgumentError } = require_errors2();
var { serializePathWithQuery } = require_util9(); var { serializePathWithQuery } = require_util9();
var {
types: {
isPromise
}
} = require("node:util");
var MockScope = class { var MockScope = class {
constructor(mockDispatch) { constructor(mockDispatch) {
this[kMockDispatch] = mockDispatch; this[kMockDispatch] = mockDispatch;
@@ -42642,8 +43022,7 @@ var require_mock_interceptor2 = __commonJS({
*/ */
reply(replyOptionsCallbackOrStatusCode) { reply(replyOptionsCallbackOrStatusCode) {
if (typeof replyOptionsCallbackOrStatusCode === "function") { if (typeof replyOptionsCallbackOrStatusCode === "function") {
const wrappedDefaultsCallback = (opts) => { const resolveReplyCallbackData = (resolvedData) => {
const resolvedData = replyOptionsCallbackOrStatusCode(opts);
if (typeof resolvedData !== "object" || resolvedData === null) { if (typeof resolvedData !== "object" || resolvedData === null) {
throw new InvalidArgumentError("reply options callback must return an object"); throw new InvalidArgumentError("reply options callback must return an object");
} }
@@ -42653,6 +43032,13 @@ var require_mock_interceptor2 = __commonJS({
...this.createMockScopeDispatchData(replyParameters2) ...this.createMockScopeDispatchData(replyParameters2)
}; };
}; };
const wrappedDefaultsCallback = (opts) => {
const resolvedData = replyOptionsCallbackOrStatusCode(opts);
if (isPromise(resolvedData)) {
return resolvedData.then(resolveReplyCallbackData);
}
return resolveReplyCallbackData(resolvedData);
};
const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] }); const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] });
return new MockScope(newMockDispatch2); return new MockScope(newMockDispatch2);
} }
@@ -44041,6 +44427,7 @@ var require_global4 = __commonJS({
var { InvalidArgumentError } = require_errors2(); var { InvalidArgumentError } = require_errors2();
var Agent3 = require_agent2(); var Agent3 = require_agent2();
var Dispatcher1Wrapper = require_dispatcher1_wrapper(); var Dispatcher1Wrapper = require_dispatcher1_wrapper();
var fallbackDispatcher;
if (getGlobalDispatcher() === void 0) { if (getGlobalDispatcher() === void 0) {
setGlobalDispatcher(new Agent3()); setGlobalDispatcher(new Agent3());
} }
@@ -44048,22 +44435,36 @@ var require_global4 = __commonJS({
if (!agent || typeof agent.dispatch !== "function") { if (!agent || typeof agent.dispatch !== "function") {
throw new InvalidArgumentError("Argument agent must implement Agent"); throw new InvalidArgumentError("Argument agent must implement Agent");
} }
Object.defineProperty(globalThis, globalDispatcher, { try {
value: agent, Object.defineProperty(globalThis, globalDispatcher, {
writable: true, value: agent,
enumerable: false, writable: true,
configurable: false enumerable: false,
}); configurable: false
const legacyAgent = agent instanceof Dispatcher1Wrapper ? agent : new Dispatcher1Wrapper(agent); });
Object.defineProperty(globalThis, legacyGlobalDispatcher, { } catch (err) {
value: legacyAgent, if (err instanceof TypeError) {
writable: true, fallbackDispatcher = agent;
enumerable: false, return;
configurable: false }
}); throw err;
}
try {
const legacyAgent = agent instanceof Dispatcher1Wrapper ? agent : new Dispatcher1Wrapper(agent);
Object.defineProperty(globalThis, legacyGlobalDispatcher, {
value: legacyAgent,
writable: true,
enumerable: false,
configurable: false
});
} catch (err) {
if (!(err instanceof TypeError)) {
throw err;
}
}
} }
function getGlobalDispatcher() { function getGlobalDispatcher() {
return globalThis[globalDispatcher]; return globalThis[globalDispatcher] ?? fallbackDispatcher;
} }
var installedExports = ( var installedExports = (
/** @type {const} */ /** @type {const} */
@@ -44189,12 +44590,14 @@ var require_redirect_handler2 = __commonJS({
if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) {
throw new Error("max redirects"); throw new Error("max redirects");
} }
let removeContentHeaders = statusCode === 303;
if ((statusCode === 301 || statusCode === 302) && this.opts.method === "POST") { if ((statusCode === 301 || statusCode === 302) && this.opts.method === "POST") {
this.opts.method = "GET"; this.opts.method = "GET";
if (util7.isStream(this.opts.body)) { if (util7.isStream(this.opts.body)) {
util7.destroy(this.opts.body.on("error", noop)); util7.destroy(this.opts.body.on("error", noop));
} }
this.opts.body = null; this.opts.body = null;
removeContentHeaders = true;
} }
if (statusCode === 303 && this.opts.method !== "HEAD") { if (statusCode === 303 && this.opts.method !== "HEAD") {
this.opts.method = "GET"; this.opts.method = "GET";
@@ -44219,7 +44622,7 @@ var require_redirect_handler2 = __commonJS({
throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`); throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`);
} }
} }
this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin, this.stripHeadersOnRedirect, this.stripHeadersOnCrossOriginRedirect); this.opts.headers = cleanRequestHeaders(this.opts.headers, removeContentHeaders, this.opts.origin !== origin, this.stripHeadersOnRedirect, this.stripHeadersOnCrossOriginRedirect);
this.opts.path = path17; this.opts.path = path17;
this.opts.origin = origin; this.opts.origin = origin;
this.opts.query = null; this.opts.query = null;
@@ -44960,24 +45363,146 @@ var require_cache2 = __commonJS({
var { var {
safeHTTPMethods, safeHTTPMethods,
pathHasQueryOrFragment, pathHasQueryOrFragment,
hasSafeIterator hasSafeIterator,
isValidHTTPToken
} = require_util9(); } = require_util9();
var { serializePathWithQuery } = require_util9(); var { serializePathWithQuery } = require_util9();
function makeCacheKey(opts) { var MAX_DELTA_SECONDS = 2147483647;
if (!opts.origin) { var RESTRICTIVE_DIRECTIVE_NAMES = ["no-store", "private", "no-cache"];
throw new Error("opts.origin is undefined"); var kInvalidCacheControlDirectives = /* @__PURE__ */ Symbol("invalid cache-control directives");
function trimOWS(value) {
return value.replace(/^[\t ]+|[\t ]+$/g, "");
}
function arrayIncludes(array, value) {
for (let i = 0; i < array.length; i++) {
if (array[i] === value) {
return true;
}
} }
return false;
}
function trimOWSStart(value) {
return value.replace(/^[\t ]+/, "");
}
function trimOWSEnd(value) {
return value.replace(/[\t ]+$/, "");
}
function findUnescapedQuote(value, start) {
let escaped = false;
for (let i = start; i < value.length; i++) {
if (escaped) {
escaped = false;
} else if (value[i] === "\\") {
escaped = true;
} else if (value[i] === '"') {
return i;
}
}
return -1;
}
function splitCacheControlHeaderValue(value) {
const directives = [];
let start = 0;
let quoteStart = -1;
let inQuote = false;
let escaped = false;
for (let i = 0; i < value.length; i++) {
if (inQuote) {
if (escaped) {
escaped = false;
} else if (value[i] === "\\") {
escaped = true;
} else if (value[i] === '"') {
inQuote = false;
quoteStart = -1;
}
} else if (value[i] === '"') {
inQuote = true;
quoteStart = i;
} else if (value[i] === ",") {
directives.push({ value: value.substring(start, i), fromMalformedQuote: false });
start = i + 1;
}
}
if (!inQuote) {
directives.push({ value: value.substring(start), fromMalformedQuote: false });
return directives;
}
const tail = value.substring(start);
const quoteOffset = quoteStart - start;
let tailStart = 0;
for (let i = 0; i < tail.length; i++) {
if (tail[i] === ",") {
directives.push({
value: tail.substring(tailStart, i),
fromMalformedQuote: tailStart > quoteOffset
});
tailStart = i + 1;
}
}
directives.push({
value: tail.substring(tailStart),
fromMalformedQuote: tailStart > quoteOffset
});
return directives;
}
function markInvalidCacheControlDirective(directives, key) {
let invalidDirectives = directives[kInvalidCacheControlDirectives];
if (invalidDirectives === void 0) {
invalidDirectives = /* @__PURE__ */ new Set();
Object.defineProperty(directives, kInvalidCacheControlDirectives, {
value: invalidDirectives
});
}
invalidDirectives.add(key);
}
function hasInvalidCacheControlDirective(directives, key) {
return directives[kInvalidCacheControlDirectives]?.has(key) === true;
}
function getMalformedRestrictiveDirectiveName(key) {
for (const directiveName of RESTRICTIVE_DIRECTIVE_NAMES) {
if (key.startsWith(directiveName) && key.length > directiveName.length && !isValidHTTPToken(key[directiveName.length])) {
return directiveName;
}
}
let tokenOnlyKey = "";
let hasInvalidTokenChar = false;
for (let i = 0; i < key.length; i++) {
if (isValidHTTPToken(key[i])) {
tokenOnlyKey += key[i];
} else {
hasInvalidTokenChar = true;
}
}
if (hasInvalidTokenChar && arrayIncludes(RESTRICTIVE_DIRECTIVE_NAMES, tokenOnlyKey)) {
return tokenOnlyKey;
}
}
function makeCacheKey(opts) {
const origin = opts.origin ? opts.origin.toString() : "";
let fullPath = opts.path || "/"; let fullPath = opts.path || "/";
if (opts.query && !pathHasQueryOrFragment(fullPath)) { if (opts.query && !pathHasQueryOrFragment(fullPath)) {
fullPath = serializePathWithQuery(fullPath, opts.query); fullPath = serializePathWithQuery(fullPath, opts.query);
} }
return { return {
origin: opts.origin.toString(), origin,
method: opts.method, method: opts.method,
path: fullPath, path: fullPath,
headers: opts.headers headers: opts.headers
}; };
} }
function appendHeader(headers, key, val) {
const headerName = key.toLowerCase();
const current = headers[headerName];
const values = Array.isArray(val) ? val : [val];
if (current === void 0) {
headers[headerName] = Array.isArray(val) ? val.slice() : val;
} else if (Array.isArray(current)) {
current.push(...values);
} else {
headers[headerName] = [current, ...values];
}
}
function normalizeHeaders(opts) { function normalizeHeaders(opts) {
let headers; let headers;
if (opts.headers == null) { if (opts.headers == null) {
@@ -44985,19 +45510,57 @@ var require_cache2 = __commonJS({
} else if (typeof opts.headers === "object") { } else if (typeof opts.headers === "object") {
headers = {}; headers = {};
if (hasSafeIterator(opts.headers)) { if (hasSafeIterator(opts.headers)) {
for (const x of opts.headers) { if (Array.isArray(opts.headers)) {
if (!Array.isArray(x)) { const first = opts.headers[0];
throw new Error("opts.headers is not a valid header map"); if (Array.isArray(first)) {
for (const x of opts.headers) {
if (!Array.isArray(x)) {
throw new Error("opts.headers is not a valid header map");
}
const [key, val] = x;
if (typeof key !== "string" || typeof val !== "string") {
throw new Error("opts.headers is not a valid header map");
}
appendHeader(headers, key, val);
}
} else {
const len = opts.headers.length;
if (len % 2 !== 0) {
throw new Error("opts.headers is not a valid header map");
}
for (let i = 0; i < len; i += 2) {
const key = opts.headers[i];
const val = opts.headers[i + 1];
if (typeof key !== "string" || typeof val !== "string" && !Array.isArray(val)) {
throw new Error("opts.headers is not a valid header map");
}
if (typeof val === "string") {
appendHeader(headers, key, val);
} else {
const mapped = [];
for (let j = 0; j < val.length; j++) {
const v = val[j];
mapped.push(typeof v === "string" ? v : v.toString("latin1"));
}
appendHeader(headers, key, mapped);
}
}
} }
const [key, val] = x; } else {
if (typeof key !== "string" || typeof val !== "string") { for (const x of opts.headers) {
throw new Error("opts.headers is not a valid header map"); if (!Array.isArray(x)) {
throw new Error("opts.headers is not a valid header map");
}
const [key, val] = x;
if (typeof key !== "string" || typeof val !== "string") {
throw new Error("opts.headers is not a valid header map");
}
appendHeader(headers, key, val);
} }
headers[key.toLowerCase()] = val;
} }
} else { } else {
for (const key of Object.keys(opts.headers)) { for (const key of Object.keys(opts.headers)) {
headers[key.toLowerCase()] = opts.headers[key]; appendHeader(headers, key, opts.headers[key]);
} }
} }
} else { } else {
@@ -45042,25 +45605,32 @@ var require_cache2 = __commonJS({
} }
function parseCacheControlHeader(header) { function parseCacheControlHeader(header) {
const output = {}; const output = {};
let directives; const invalidNumericDirectives = /* @__PURE__ */ new Set();
if (Array.isArray(header)) { const invalidNoArgumentDirectives = /* @__PURE__ */ new Set();
directives = []; const directives = splitCacheControlHeaderValue(Array.isArray(header) ? header.join(",") : header);
for (const directive of header) {
directives.push(...directive.split(","));
}
} else {
directives = header.split(",");
}
for (let i = 0; i < directives.length; i++) { for (let i = 0; i < directives.length; i++) {
const directive = directives[i].toLowerCase(); const directiveRecord = directives[i];
const directive = directiveRecord.value.toLowerCase();
const fromMalformedQuote = directiveRecord.fromMalformedQuote;
const keyValueDelimiter = directive.indexOf("="); const keyValueDelimiter = directive.indexOf("=");
let key; let key;
let value; let value;
let keyHasTrailingWhitespace = false;
let valueHasLeadingWhitespace = false;
if (keyValueDelimiter !== -1) { if (keyValueDelimiter !== -1) {
key = directive.substring(0, keyValueDelimiter).trimStart(); const rawKey = directive.substring(0, keyValueDelimiter);
value = directive.substring(keyValueDelimiter + 1); const rawValue = directive.substring(keyValueDelimiter + 1);
keyHasTrailingWhitespace = trimOWSEnd(rawKey) !== rawKey;
valueHasLeadingWhitespace = trimOWSStart(rawValue) !== rawValue;
key = trimOWS(rawKey);
value = trimOWSStart(rawValue);
} else { } else {
key = directive.trim(); key = trimOWS(directive);
}
const malformedRestrictiveDirectiveName = getMalformedRestrictiveDirectiveName(key);
if (malformedRestrictiveDirectiveName !== void 0) {
output[malformedRestrictiveDirectiveName] = true;
continue;
} }
switch (key) { switch (key) {
case "min-fresh": case "min-fresh":
@@ -45069,48 +45639,85 @@ var require_cache2 = __commonJS({
case "s-maxage": case "s-maxage":
case "stale-while-revalidate": case "stale-while-revalidate":
case "stale-if-error": { case "stale-if-error": {
if (value === void 0 || value[0] === " ") { if (fromMalformedQuote || invalidNumericDirectives.has(key)) {
continue;
}
if (value === void 0 || keyHasTrailingWhitespace || valueHasLeadingWhitespace) {
delete output[key];
invalidNumericDirectives.add(key);
markInvalidCacheControlDirective(output, key);
continue; continue;
} }
if (value.length >= 2 && value[0] === '"' && value[value.length - 1] === '"') { if (value.length >= 2 && value[0] === '"' && value[value.length - 1] === '"') {
value = value.substring(1, value.length - 1); value = value.substring(1, value.length - 1);
} }
const parsedValue = parseInt(value, 10); if (!/^[0-9]+$/.test(value)) {
if (parsedValue !== parsedValue) { delete output[key];
invalidNumericDirectives.add(key);
markInvalidCacheControlDirective(output, key);
continue; continue;
} }
if (key === "max-age" && key in output && output[key] >= parsedValue) { const parsedValue = Math.min(parseInt(value, 10), MAX_DELTA_SECONDS);
continue; if (key === "min-fresh") {
if (!(key in output) || output[key] < parsedValue) {
output[key] = parsedValue;
}
} else if (!(key in output) || output[key] > parsedValue) {
output[key] = parsedValue;
} }
output[key] = parsedValue;
break; break;
} }
case "private": case "private":
case "no-cache": { case "no-cache": {
if (fromMalformedQuote) {
output[key] = true;
break;
}
if (value !== void 0 && value.length === 0) {
output[key] = true;
break;
}
if (value) { if (value) {
if (value[0] === '"') { if (value[0] === '"') {
const headers = [value.substring(1)]; value = trimOWSEnd(value);
let foundEndingQuote = value[value.length - 1] === '"'; let fieldList = "";
if (!foundEndingQuote) { let lastQuotedPart = i;
let foundEndingQuote = false;
const closingQuote = findUnescapedQuote(value, 1);
if (closingQuote !== -1) {
fieldList = value.substring(1, closingQuote);
foundEndingQuote = true;
} else {
const fieldListParts = [value.substring(1)];
for (let j = i + 1; j < directives.length; j++) { for (let j = i + 1; j < directives.length; j++) {
const nextPart = directives[j]; const nextPart = trimOWS(directives[j].value);
const nextPartLength = nextPart.length; const closingQuote2 = findUnescapedQuote(nextPart, 0);
headers.push(nextPart.trim()); lastQuotedPart = j;
if (nextPartLength !== 0 && nextPart[nextPartLength - 1] === '"') { if (closingQuote2 !== -1) {
fieldListParts.push(nextPart.substring(0, closingQuote2));
foundEndingQuote = true; foundEndingQuote = true;
break; break;
} }
fieldListParts.push(nextPart);
}
fieldList = fieldListParts.join(",");
}
if (!foundEndingQuote) {
output[key] = true;
break;
}
i = lastQuotedPart;
const headers = fieldList.split(",");
let validFieldNames = true;
for (let j = 0; j < headers.length; j++) {
headers[j] = trimOWS(headers[j]);
if (!isValidHTTPToken(headers[j])) {
validFieldNames = false;
} }
} }
if (foundEndingQuote) { if (!validFieldNames) {
let lastHeader = headers[headers.length - 1]; output[key] = true;
if (lastHeader[lastHeader.length - 1] === '"') { } else if (output[key] !== true) {
lastHeader = lastHeader.substring(0, lastHeader.length - 1);
headers[headers.length - 1] = lastHeader;
}
for (let j = 0; j < headers.length; j++) {
headers[j] = headers[j].trim();
}
if (key in output) { if (key in output) {
output[key] = output[key].concat(headers); output[key] = output[key].concat(headers);
} else { } else {
@@ -45118,11 +45725,15 @@ var require_cache2 = __commonJS({
} }
} }
} else { } else {
const fieldName = value.trim(); const fieldName = trimOWS(value);
if (key in output) { if (!isValidHTTPToken(fieldName)) {
output[key] = output[key].concat(fieldName); output[key] = true;
} else { } else if (output[key] !== true) {
output[key] = [fieldName]; if (key in output) {
output[key] = output[key].concat(fieldName);
} else {
output[key] = [fieldName];
}
} }
} }
break; break;
@@ -45130,16 +45741,23 @@ var require_cache2 = __commonJS({
} }
// eslint-disable-next-line no-fallthrough // eslint-disable-next-line no-fallthrough
case "public": case "public":
case "no-store":
case "must-revalidate": case "must-revalidate":
case "proxy-revalidate": case "proxy-revalidate":
case "immutable": case "immutable":
case "no-transform": case "no-transform":
case "must-understand": case "must-understand":
case "only-if-cached": case "only-if-cached":
if (value) { if (fromMalformedQuote || invalidNoArgumentDirectives.has(key)) {
continue; continue;
} }
if (value !== void 0) {
delete output[key];
invalidNoArgumentDirectives.add(key);
continue;
}
output[key] = true;
break;
case "no-store":
output[key] = true; output[key] = true;
break; break;
default: default:
@@ -45148,21 +45766,51 @@ var require_cache2 = __commonJS({
} }
return output; return output;
} }
function splitVaryHeader(varyHeader) {
const values = Array.isArray(varyHeader) ? varyHeader : [varyHeader];
const output = [];
for (let i = 0; i < values.length; i++) {
const parts = values[i].split(",");
for (let j = 0; j < parts.length; j++) {
output.push(parts[j]);
}
}
return output;
}
function hasVaryStar(varyHeader) {
const values = splitVaryHeader(varyHeader);
for (let i = 0; i < values.length; i++) {
if (trimOWS(values[i]).indexOf("*") !== -1) {
return true;
}
}
return false;
}
function parseVaryHeader(varyHeader, headers) { function parseVaryHeader(varyHeader, headers) {
if (typeof varyHeader === "string" && varyHeader.includes("*")) { if (hasVaryStar(varyHeader)) {
return headers; return headers;
} }
const output = ( const output = (
/** @type {Record<string, string | string[] | null>} */ /** @type {Record<string, string | string[] | null>} */
{} {}
); );
const varyingHeaders = typeof varyHeader === "string" ? varyHeader.split(",") : varyHeader; const varyingHeaders = splitVaryHeader(varyHeader);
for (const header of varyingHeaders) { for (const header of varyingHeaders) {
const trimmedHeader = header.trim().toLowerCase(); const trimmedHeader = trimOWS(header).toLowerCase();
output[trimmedHeader] = headers[trimmedHeader] ?? null; if (trimmedHeader.length === 0) {
continue;
}
if (!isValidHTTPToken(trimmedHeader)) {
return void 0;
}
const headerValue = headers[trimmedHeader];
output[trimmedHeader] = Array.isArray(headerValue) ? headerValue.slice() : headerValue ?? null;
} }
return output; return output;
} }
function isInvalidOrWildcardVaryHeader(varyHeader) {
return hasVaryStar(varyHeader) || parseVaryHeader(varyHeader, {}) === void 0;
}
function isEtagUsable(etag) { function isEtagUsable(etag) {
if (etag.length <= 2) { if (etag.length <= 2) {
return false; return false;
@@ -45193,7 +45841,7 @@ var require_cache2 = __commonJS({
throw new TypeError(`${name} needs to have at least one method`); throw new TypeError(`${name} needs to have at least one method`);
} }
for (const method of methods) { for (const method of methods) {
if (!safeHTTPMethods.includes(method)) { if (!arrayIncludes(safeHTTPMethods, method)) {
throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(", ")}, got ${method}`); throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(", ")}, got ${method}`);
} }
} }
@@ -45217,7 +45865,10 @@ var require_cache2 = __commonJS({
assertCacheKey, assertCacheKey,
assertCacheValue, assertCacheValue,
parseCacheControlHeader, parseCacheControlHeader,
hasInvalidCacheControlDirective,
parseVaryHeader, parseVaryHeader,
hasVaryStar,
isInvalidOrWildcardVaryHeader,
isEtagUsable, isEtagUsable,
assertCacheMethods, assertCacheMethods,
assertCacheStore, assertCacheStore,
@@ -45240,6 +45891,13 @@ var require_date = __commonJS({
return parseRfc850Date(date); return parseRfc850Date(date);
} }
} }
function makeDate(year, monthIdx, day, hour, minute, second, weekday) {
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second));
if (year >= 0 && year <= 99) {
result.setUTCFullYear(year);
}
return result.getUTCFullYear() === year && result.getUTCMonth() === monthIdx && result.getUTCDate() === day && result.getUTCHours() === hour && result.getUTCMinutes() === minute && result.getUTCSeconds() === second && result.getUTCDay() === weekday ? result : void 0;
}
function parseImfDate(date) { function parseImfDate(date) {
if (date.length !== 29 || date[4] !== " " || date[7] !== " " || date[11] !== " " || date[16] !== " " || date[19] !== ":" || date[22] !== ":" || date[25] !== " " || date[26] !== "G" || date[27] !== "M" || date[28] !== "T") { if (date.length !== 29 || date[4] !== " " || date[7] !== " " || date[11] !== " " || date[16] !== " " || date[19] !== ":" || date[22] !== ":" || date[25] !== " " || date[26] !== "G" || date[27] !== "M" || date[28] !== "T") {
return void 0; return void 0;
@@ -45400,8 +46058,7 @@ var require_date = __commonJS({
} }
second = (code1 - 48) * 10 + (code2 - 48); second = (code1 - 48) * 10 + (code2 - 48);
} }
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); return makeDate(year, monthIdx, day, hour, minute, second, weekday);
return result.getUTCDay() === weekday ? result : void 0;
} }
function parseAscTimeDate(date) { function parseAscTimeDate(date) {
if (date.length !== 24 || date[7] !== " " || date[10] !== " " || date[19] !== " ") { if (date.length !== 24 || date[7] !== " " || date[10] !== " " || date[19] !== " ") {
@@ -45563,8 +46220,7 @@ var require_date = __commonJS({
return void 0; return void 0;
} }
const year = (yearDigit1 - 48) * 1e3 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48); const year = (yearDigit1 - 48) * 1e3 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48);
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); return makeDate(year, monthIdx, day, hour, minute, second, weekday);
return result.getUTCDay() === weekday ? result : void 0;
} }
function parseRfc850Date(date) { function parseRfc850Date(date) {
let commaIndex = -1; let commaIndex = -1;
@@ -45713,8 +46369,7 @@ var require_date = __commonJS({
} }
second = (code1 - 48) * 10 + (code2 - 48); second = (code1 - 48) * 10 + (code2 - 48);
} }
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); return makeDate(year, monthIdx, day, hour, minute, second, weekday);
return result.getUTCDay() === weekday ? result : void 0;
} }
module2.exports = { module2.exports = {
parseHttpDate parseHttpDate
@@ -45729,7 +46384,10 @@ var require_cache_handler = __commonJS({
var util7 = require_util9(); var util7 = require_util9();
var { var {
parseCacheControlHeader, parseCacheControlHeader,
hasInvalidCacheControlDirective,
parseVaryHeader, parseVaryHeader,
hasVaryStar,
isInvalidOrWildcardVaryHeader,
isEtagUsable isEtagUsable
} = require_cache2(); } = require_cache2();
var { parseHttpDate } = require_date(); var { parseHttpDate } = require_date();
@@ -45753,6 +46411,79 @@ var require_cache_handler = __commonJS({
206 206
]; ];
var MAX_RESPONSE_AGE = 2147483647e3; var MAX_RESPONSE_AGE = 2147483647e3;
var REVALIDATION_ONLY_RETENTION = 864e5;
function trimOWS(value) {
return value.replace(/^[\t ]+|[\t ]+$/g, "");
}
function arrayIncludes(array, value) {
for (let i = 0; i < array.length; i++) {
if (array[i] === value) {
return true;
}
}
return false;
}
function appendConnectionHeaderTokens(headersToRemove, connectionHeader) {
const values = Array.isArray(connectionHeader) ? connectionHeader : [connectionHeader];
for (let i = 0; i < values.length; i++) {
const tokens = values[i].split(",");
for (let j = 0; j < tokens.length; j++) {
headersToRemove.push(trimOWS(tokens[j]).toLowerCase());
}
}
}
function getSameOriginPath(cacheKey, location) {
if (typeof location !== "string") {
return void 0;
}
let originUrl;
let requestUrl;
let locationUrl;
try {
originUrl = new URL(cacheKey.origin);
requestUrl = new URL(cacheKey.path, originUrl);
locationUrl = new URL(location, requestUrl);
} catch {
return void 0;
}
if (locationUrl.origin !== originUrl.origin) {
return void 0;
}
return locationUrl.pathname + locationUrl.search;
}
function deleteCachedUri(store, cacheKey, path17) {
deleteCachedValue(store, {
...cacheKey,
path: path17
});
for (let i = 0; i < util7.safeHTTPMethods.length; i++) {
const method = util7.safeHTTPMethods[i];
if (method !== cacheKey.method) {
deleteCachedValue(store, {
...cacheKey,
method,
path: path17
});
}
}
}
function deleteLocationTargets(store, cacheKey, headerValue) {
if (headerValue === void 0) {
return;
}
const values = Array.isArray(headerValue) ? headerValue : [headerValue];
for (let i = 0; i < values.length; i++) {
const path17 = getSameOriginPath(cacheKey, values[i]);
if (path17 !== void 0) {
deleteCachedUri(store, cacheKey, path17);
}
}
}
function invalidateUnsafeRequest(store, cacheKey, resHeaders) {
deleteCachedUri(store, cacheKey, cacheKey.path);
deleteLocationTargets(store, cacheKey, resHeaders.location);
deleteLocationTargets(store, cacheKey, resHeaders["content-location"]);
}
var CacheHandler = class { var CacheHandler = class {
/** /**
* @type {import('../../types/cache-interceptor.d.ts').default.CacheKey} * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}
@@ -45812,35 +46543,51 @@ var require_cache_handler = __commonJS({
statusMessage statusMessage
); );
const handler = this; const handler = this;
if (!util7.safeHTTPMethods.includes(this.#cacheKey.method) && statusCode >= 200 && statusCode <= 399) { if (!arrayIncludes(util7.safeHTTPMethods, this.#cacheKey.method) && statusCode >= 200 && statusCode <= 399) {
try { invalidateUnsafeRequest(this.#store, this.#cacheKey, resHeaders);
this.#store.delete(this.#cacheKey)?.catch?.(noop);
} catch {
}
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
const cacheControlHeader = resHeaders["cache-control"]; const cacheControlHeader = resHeaders["cache-control"];
const heuristicallyCacheable = resHeaders["last-modified"] && HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode); const heuristicallyCacheable = resHeaders["last-modified"] && arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES, statusCode);
if (!cacheControlHeader && !resHeaders["expires"] && !heuristicallyCacheable && !this.#cacheByDefault) { if (!cacheControlHeader && !resHeaders["expires"] && !heuristicallyCacheable && !this.#cacheByDefault) {
if (statusCode === 304 && resHeaders.vary && isInvalidOrWildcardVaryHeader(resHeaders.vary)) {
deleteCachedValue(this.#store, this.#cacheKey);
}
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {}; const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {};
if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) { if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) {
if (statusCode === 304 && (cacheControlHeader || revalidationResponseDisallowsCachedReuse(this.#cacheType, resHeaders, cacheControlDirectives))) {
deleteCachedValue(this.#store, this.#cacheKey);
}
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
const now = Date.now(); const now = Date.now();
const resAge = resHeaders.age ? getAge(resHeaders.age) : void 0; const resAge = Object.hasOwn(resHeaders, "age") ? getAge(resHeaders.age) : void 0;
if (resAge && resAge >= MAX_RESPONSE_AGE) { if (resAge !== void 0 && resAge >= MAX_RESPONSE_AGE) {
deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey);
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
const resDate = typeof resHeaders.date === "string" ? parseHttpDate(resHeaders.date) : void 0; const resDate = Object.hasOwn(resHeaders, "date") ? getDate(resHeaders.date) : void 0;
const staleAt = determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives) ?? this.#cacheByDefault; if (resDate === null) {
if (staleAt === void 0 || resAge && resAge > staleAt) { deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey);
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
const baseTime = resDate ? resDate.getTime() : now; const apparentAge = resDate ? Math.max(0, now - resDate.getTime()) : 0;
const currentAge = Math.max(apparentAge, resAge ?? 0);
const hasValidator = typeof resHeaders.etag === "string" && isEtagUsable(resHeaders.etag) || typeof resHeaders["last-modified"] === "string";
const staleAt = determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives, hasValidator) ?? this.#cacheByDefault;
const revalidationOnly = staleAt === 0 && hasValidator;
if (staleAt === void 0 || currentAge >= staleAt && !revalidationOnly) {
if (cacheControlHeader || staleAt !== void 0) {
deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey);
}
return downstreamOnHeaders();
}
const baseTime = now - currentAge;
const absoluteStaleAt = staleAt + baseTime; const absoluteStaleAt = staleAt + baseTime;
if (now >= absoluteStaleAt) { if (now >= absoluteStaleAt && !revalidationOnly) {
deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey);
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
let varyDirectives; let varyDirectives;
@@ -45850,8 +46597,8 @@ var require_cache_handler = __commonJS({
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
} }
const cachedAt = resAge ? now - resAge : now; const cachedAt = baseTime;
const deleteAt = determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, absoluteStaleAt); const deleteAt = determineDeleteAt(baseTime, now, cacheControlDirectives, absoluteStaleAt);
const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives); const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives);
const value = { const value = {
statusCode, statusCode,
@@ -45871,6 +46618,7 @@ var require_cache_handler = __commonJS({
value.statusCode = cachedValue.statusCode; value.statusCode = cachedValue.statusCode;
value.statusMessage = cachedValue.statusMessage; value.statusMessage = cachedValue.statusMessage;
value.etag = cachedValue.etag; value.etag = cachedValue.etag;
value.vary = varyDirectives ?? cachedValue.vary;
value.headers = { ...cachedValue.headers, ...strippedHeaders }; value.headers = { ...cachedValue.headers, ...strippedHeaders };
downstreamOnHeaders(); downstreamOnHeaders();
this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value); this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value);
@@ -45961,11 +46709,25 @@ var require_cache_handler = __commonJS({
this.#handler.onResponseError?.(controller, err); this.#handler.onResponseError?.(controller, err);
} }
}; };
function deleteCachedValue(store, cacheKey) {
try {
store.delete(cacheKey)?.catch?.(noop);
} catch {
}
}
function deleteCachedValueIfNotModified(statusCode, store, cacheKey) {
if (statusCode === 304) {
deleteCachedValue(store, cacheKey);
}
}
function revalidationResponseDisallowsCachedReuse(cacheType, resHeaders, cacheControlDirectives) {
return cacheControlDirectives["no-store"] === true || cacheType === "shared" && cacheControlDirectives.private === true || (resHeaders.vary ? isInvalidOrWildcardVaryHeader(resHeaders.vary) : false);
}
function canCacheResponse(cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) { function canCacheResponse(cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {
if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) { if (statusCode < 200 || arrayIncludes(NOT_UNDERSTOOD_STATUS_CODES, statusCode)) {
return false; return false;
} }
if (!HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode) && !resHeaders["expires"] && !cacheControlDirectives.public && cacheControlDirectives["max-age"] === void 0 && // RFC 9111: a private response directive, if the cache is not shared if (!arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES, statusCode) && !resHeaders["expires"] && !cacheControlDirectives.public && cacheControlDirectives["max-age"] === void 0 && // RFC 9111: a private response directive, if the cache is not shared
!(cacheControlDirectives.private && cacheType === "private") && !(cacheControlDirectives["s-maxage"] !== void 0 && cacheType === "shared")) { !(cacheControlDirectives.private && cacheType === "private") && !(cacheControlDirectives["s-maxage"] !== void 0 && cacheType === "shared")) {
return false; return false;
} }
@@ -45975,60 +46737,104 @@ var require_cache_handler = __commonJS({
if (cacheType === "shared" && cacheControlDirectives.private === true) { if (cacheType === "shared" && cacheControlDirectives.private === true) {
return false; return false;
} }
if (resHeaders.vary?.includes("*")) { if (resHeaders.vary && hasVaryStar(resHeaders.vary)) {
return false; return false;
} }
if (reqHeaders?.authorization) { if (reqHeaders != null && Object.hasOwn(reqHeaders, "authorization")) {
if (!cacheControlDirectives.public && !cacheControlDirectives["s-maxage"] && !cacheControlDirectives["must-revalidate"]) { if (!cacheControlDirectives.public && !cacheControlDirectives["s-maxage"] && !cacheControlDirectives["must-revalidate"]) {
return false; return false;
} }
if (typeof reqHeaders.authorization !== "string") { if (typeof reqHeaders.authorization !== "string") {
return false; return false;
} }
if (Array.isArray(cacheControlDirectives["no-cache"]) && cacheControlDirectives["no-cache"].includes("authorization")) { if (Array.isArray(cacheControlDirectives["no-cache"]) && arrayIncludes(cacheControlDirectives["no-cache"], "authorization")) {
return false; return false;
} }
if (Array.isArray(cacheControlDirectives["private"]) && cacheControlDirectives["private"].includes("authorization")) { if (Array.isArray(cacheControlDirectives["private"]) && arrayIncludes(cacheControlDirectives["private"], "authorization")) {
return false; return false;
} }
} }
return true; return true;
} }
function getAge(ageHeader) { function getDate(dateHeader) {
const age = parseInt(Array.isArray(ageHeader) ? ageHeader[0] : ageHeader); let dateValue = dateHeader;
return isNaN(age) ? void 0 : age * 1e3; if (Array.isArray(dateValue)) {
if (dateValue.length !== 1) {
return null;
}
dateValue = dateValue[0];
}
if (typeof dateValue !== "string") {
return null;
}
return parseHttpDate(dateValue);
} }
function determineStaleAt(cacheType, now, age, resHeaders, responseDate, cacheControlDirectives) { function getAge(ageHeader) {
let ageValue = ageHeader;
if (Array.isArray(ageValue)) {
if (ageValue.length !== 1) {
return MAX_RESPONSE_AGE;
}
ageValue = ageValue[0];
}
if (typeof ageValue !== "string" || !/^[\t ]*[0-9]+[\t ]*$/.test(ageValue)) {
return MAX_RESPONSE_AGE;
}
const age = BigInt(ageValue.replace(/^[\t ]+|[\t ]+$/g, ""));
if (age >= BigInt(MAX_RESPONSE_AGE / 1e3)) {
return MAX_RESPONSE_AGE;
}
return Number(age) * 1e3;
}
function determineStaleAt(cacheType, now, age, resHeaders, responseDate, cacheControlDirectives, hasValidator) {
if (cacheType === "shared") { if (cacheType === "shared") {
if (hasInvalidCacheControlDirective(cacheControlDirectives, "s-maxage")) {
return 0;
}
const sMaxAge = cacheControlDirectives["s-maxage"]; const sMaxAge = cacheControlDirectives["s-maxage"];
if (sMaxAge !== void 0) { if (sMaxAge !== void 0) {
return sMaxAge > 0 ? sMaxAge * 1e3 : void 0; if (sMaxAge > 0) {
return sMaxAge * 1e3;
}
return 0;
} }
} }
if (hasInvalidCacheControlDirective(cacheControlDirectives, "max-age")) {
return 0;
}
const maxAge = cacheControlDirectives["max-age"]; const maxAge = cacheControlDirectives["max-age"];
if (maxAge !== void 0) { if (maxAge !== void 0) {
return maxAge > 0 ? maxAge * 1e3 : void 0; if (maxAge > 0) {
} return maxAge * 1e3;
if (typeof resHeaders.expires === "string") {
const expiresDate = parseHttpDate(resHeaders.expires);
if (expiresDate) {
if (now >= expiresDate.getTime()) {
return void 0;
}
if (responseDate) {
if (responseDate >= expiresDate) {
return void 0;
}
if (age !== void 0 && age > expiresDate - responseDate) {
return void 0;
}
}
return expiresDate.getTime() - now;
} }
return 0;
}
if (Object.hasOwn(resHeaders, "expires")) {
if (typeof resHeaders.expires !== "string") {
return 0;
}
const expiresDate = parseHttpDate(resHeaders.expires);
if (!expiresDate) {
return 0;
}
if (now >= expiresDate.getTime()) {
return 0;
}
if (responseDate) {
if (responseDate >= expiresDate) {
return 0;
}
const freshnessLifetime = expiresDate.getTime() - responseDate.getTime();
if (age !== void 0 && age >= freshnessLifetime) {
return 0;
}
return freshnessLifetime;
}
return expiresDate.getTime() - now;
} }
if (typeof resHeaders["last-modified"] === "string") { if (typeof resHeaders["last-modified"] === "string") {
const lastModified = new Date(resHeaders["last-modified"]); const lastModified = parseHttpDate(resHeaders["last-modified"]);
if (isValidDate(lastModified)) { if (lastModified) {
if (lastModified.getTime() >= now) { if (lastModified.getTime() >= now) {
return void 0; return void 0;
} }
@@ -46039,6 +46845,9 @@ var require_cache_handler = __commonJS({
if (cacheControlDirectives.immutable) { if (cacheControlDirectives.immutable) {
return 31536e6; return 31536e6;
} }
if (cacheControlDirectives["no-cache"] === true && hasValidator) {
return 0;
}
return void 0; return void 0;
} }
function determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, staleAt) { function determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, staleAt) {
@@ -46056,6 +46865,9 @@ var require_cache_handler = __commonJS({
} }
if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) { if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) {
const freshnessLifetime = staleAt - baseTime; const freshnessLifetime = staleAt - baseTime;
if (freshnessLifetime <= 0) {
return cachedAt + REVALIDATION_ONLY_RETENTION;
}
const datePrecisionPadding = Math.min(Math.max(cachedAt - baseTime, 0), 1e3); const datePrecisionPadding = Math.min(Math.max(cachedAt - baseTime, 0), 1e3);
return staleAt + freshnessLifetime + datePrecisionPadding; return staleAt + freshnessLifetime + datePrecisionPadding;
} }
@@ -46075,11 +46887,7 @@ var require_cache_handler = __commonJS({
"age" "age"
]; ];
if (resHeaders["connection"]) { if (resHeaders["connection"]) {
if (Array.isArray(resHeaders["connection"])) { appendConnectionHeaderTokens(headersToRemove, resHeaders["connection"]);
headersToRemove.push(...resHeaders["connection"].map((header) => header.trim()));
} else {
headersToRemove.push(...resHeaders["connection"].split(",").map((header) => header.trim()));
}
} }
if (Array.isArray(cacheControlDirectives["no-cache"])) { if (Array.isArray(cacheControlDirectives["no-cache"])) {
headersToRemove.push(...cacheControlDirectives["no-cache"]); headersToRemove.push(...cacheControlDirectives["no-cache"]);
@@ -46089,16 +46897,13 @@ var require_cache_handler = __commonJS({
} }
let strippedHeaders; let strippedHeaders;
for (const headerName of headersToRemove) { for (const headerName of headersToRemove) {
if (resHeaders[headerName]) { if (Object.hasOwn(resHeaders, headerName)) {
strippedHeaders ??= { ...resHeaders }; strippedHeaders ??= { ...resHeaders };
delete strippedHeaders[headerName]; delete strippedHeaders[headerName];
} }
} }
return strippedHeaders ?? resHeaders; return strippedHeaders ?? resHeaders;
} }
function isValidDate(date) {
return date instanceof Date && Number.isFinite(date.valueOf());
}
module2.exports = CacheHandler; module2.exports = CacheHandler;
} }
}); });
@@ -46269,12 +47074,43 @@ var require_memory_cache_store = __commonJS({
} }
}; };
function findEntry(key, entries, now) { function findEntry(key, entries, now) {
return entries.find((entry) => entry.deleteAt > now && entry.method === key.method && (entry.vary == null || Object.keys(entry.vary).every((headerName) => { for (let i = 0; i < entries.length; i++) {
if (entry.vary[headerName] === null) { const entry = entries[i];
return key.headers[headerName] === void 0; if (entry.deleteAt > now && entry.method === key.method && varyMatches(key, entry)) {
return entry;
} }
return entry.vary[headerName] === key.headers[headerName]; }
}))); }
function varyMatches(key, entry) {
if (entry.vary == null) {
return true;
}
for (const headerName in entry.vary) {
if (Object.hasOwn(entry.vary, headerName) && !headerValueEquals(key.headers?.[headerName], entry.vary[headerName])) {
return false;
}
}
return true;
}
function headerValueEquals(lhs, rhs) {
if (lhs == null && rhs == null) {
return true;
}
if (lhs == null && rhs != null || lhs != null && rhs == null) {
return false;
}
if (Array.isArray(lhs) && Array.isArray(rhs)) {
if (lhs.length !== rhs.length) {
return false;
}
for (let i = 0; i < lhs.length; i++) {
if (lhs[i] !== rhs[i]) {
return false;
}
}
return true;
}
return lhs === rhs;
} }
module2.exports = MemoryCacheStore; module2.exports = MemoryCacheStore;
} }
@@ -46288,7 +47124,7 @@ var require_cache_revalidation_handler = __commonJS({
var CacheRevalidationHandler = class { var CacheRevalidationHandler = class {
#successful = false; #successful = false;
/** /**
* @type {((boolean, any) => void) | null} * @type {((success: boolean, context?: any, statusCode?: number, headers?: import('../../types/header.d.ts').IncomingHttpHeaders) => void) | null}
*/ */
#callback; #callback;
/** /**
@@ -46301,7 +47137,7 @@ var require_cache_revalidation_handler = __commonJS({
*/ */
#allowErrorStatusCodes; #allowErrorStatusCodes;
/** /**
* @param {(boolean) => void} callback Function to call if the cached value is valid * @param {(success: boolean, context?: any, statusCode?: number, headers?: import('../../types/header.d.ts').IncomingHttpHeaders) => void} callback Function to call if the cached value is valid
* @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler * @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler
* @param {boolean} allowErrorStatusCodes * @param {boolean} allowErrorStatusCodes
*/ */
@@ -46323,7 +47159,7 @@ var require_cache_revalidation_handler = __commonJS({
onResponseStart(controller, statusCode, headers, statusMessage) { onResponseStart(controller, statusCode, headers, statusMessage) {
assert4(this.#callback != null); assert4(this.#callback != null);
this.#successful = statusCode === 304 || this.#allowErrorStatusCodes && statusCode >= 500 && statusCode <= 504; this.#successful = statusCode === 304 || this.#allowErrorStatusCodes && statusCode >= 500 && statusCode <= 504;
this.#callback(this.#successful, this.#context); this.#callback(this.#successful, this.#context, statusCode, headers);
this.#callback = null; this.#callback = null;
if (this.#successful) { if (this.#successful) {
return true; return true;
@@ -46353,6 +47189,12 @@ var require_cache_revalidation_handler = __commonJS({
return; return;
} }
if (this.#callback) { if (this.#callback) {
if (this.#allowErrorStatusCodes) {
this.#successful = true;
this.#callback(true, this.#context);
this.#callback = null;
return;
}
this.#callback(false); this.#callback(false);
this.#callback = null; this.#callback = null;
} }
@@ -46377,8 +47219,9 @@ var require_cache3 = __commonJS({
var CacheHandler = require_cache_handler(); var CacheHandler = require_cache_handler();
var MemoryCacheStore = require_memory_cache_store(); var MemoryCacheStore = require_memory_cache_store();
var CacheRevalidationHandler = require_cache_revalidation_handler(); var CacheRevalidationHandler = require_cache_revalidation_handler();
var { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders, parseCacheControlHeader } = require_cache2(); var { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders, parseCacheControlHeader, isInvalidOrWildcardVaryHeader } = require_cache2();
var { AbortError: AbortError3 } = require_errors2(); var { AbortError: AbortError3 } = require_errors2();
var { parseHttpDate } = require_date();
function assertCacheOrigins(origins, name) { function assertCacheOrigins(origins, name) {
if (origins === void 0) return; if (origins === void 0) return;
if (!Array.isArray(origins)) { if (!Array.isArray(origins)) {
@@ -46393,6 +47236,37 @@ var require_cache3 = __commonJS({
} }
var nop = () => { var nop = () => {
}; };
function trimOWS(value) {
return value.replace(/^[\t ]+|[\t ]+$/g, "");
}
function arrayIncludes(array, value) {
for (let i = 0; i < array.length; i++) {
if (array[i] === value) {
return true;
}
}
return false;
}
function hasPragmaNoCache(headers) {
const pragma = headers?.pragma;
if (!pragma) {
return false;
}
const values = Array.isArray(pragma) ? pragma : [pragma];
for (let i = 0; i < values.length; i++) {
const value = values[i];
if (typeof value !== "string") {
continue;
}
const directives = value.split(",");
for (let j = 0; j < directives.length; j++) {
if (trimOWS(directives[j]).toLowerCase() === "no-cache") {
return true;
}
}
}
return false;
}
function needsRevalidation(result, cacheControlDirectives, { headers = {} }) { function needsRevalidation(result, cacheControlDirectives, { headers = {} }) {
if (cacheControlDirectives?.["no-cache"]) { if (cacheControlDirectives?.["no-cache"]) {
return true; return true;
@@ -46405,10 +47279,58 @@ var require_cache3 = __commonJS({
} }
return false; return false;
} }
function isStale(result, cacheControlDirectives) { function staleResponseRequiresRevalidation(result, cacheType) {
return result.cacheControlDirectives?.["must-revalidate"] === true || cacheType === "shared" && (result.cacheControlDirectives?.["proxy-revalidate"] === true || // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.2.10
// s-maxage implies proxy-revalidate for shared caches.
result.cacheControlDirectives?.["s-maxage"] !== void 0);
}
function revalidationResponseDisallowsCachedReuse(cacheType, headers) {
if (headers.vary && isInvalidOrWildcardVaryHeader(headers.vary)) {
return true;
}
const cacheControl = headers["cache-control"];
if (!cacheControl) {
return false;
}
const cacheControlDirectives = parseCacheControlHeader(cacheControl);
return cacheControlDirectives["no-store"] === true || cacheType === "shared" && cacheControlDirectives.private === true;
}
function revalidationResponseUpdatesCacheControl(headers) {
return headers["cache-control"] !== void 0;
}
function deleteCachedValue(store, cacheKey) {
try {
store.delete(cacheKey)?.catch?.(nop);
} catch {
}
}
function getUsableLastModified(headers) {
const lastModified = headers?.["last-modified"];
if (typeof lastModified === "string" && parseHttpDate(lastModified)) {
return lastModified;
}
}
function makeRevalidationHeaders(opts, result) {
const headers = {
...opts.headers,
"if-modified-since": getUsableLastModified(result.headers) ?? new Date(result.cachedAt).toUTCString()
};
if (result.etag) {
headers["if-none-match"] = result.etag;
}
if (result.vary) {
for (const key in result.vary) {
if (result.vary[key] != null) {
headers[key] = result.vary[key];
}
}
}
return headers;
}
function isStale(result, cacheControlDirectives, cacheType) {
const now = Date.now(); const now = Date.now();
if (now > result.staleAt) { if (now > result.staleAt) {
if (cacheControlDirectives?.["max-stale"]) { if (!staleResponseRequiresRevalidation(result, cacheType) && cacheControlDirectives?.["max-stale"]) {
const gracePeriod = result.staleAt + cacheControlDirectives["max-stale"] * 1e3; const gracePeriod = result.staleAt + cacheControlDirectives["max-stale"] * 1e3;
return now > gracePeriod; return now > gracePeriod;
} }
@@ -46421,9 +47343,9 @@ var require_cache3 = __commonJS({
} }
return false; return false;
} }
function withinStaleWhileRevalidateWindow(result) { function withinStaleWhileRevalidateWindow(result, cacheType) {
const staleWhileRevalidate = result.cacheControlDirectives?.["stale-while-revalidate"]; const staleWhileRevalidate = result.cacheControlDirectives?.["stale-while-revalidate"];
if (!staleWhileRevalidate) { if (!staleWhileRevalidate || staleResponseRequiresRevalidation(result, cacheType)) {
return false; return false;
} }
const now = Date.now(); const now = Date.now();
@@ -46533,32 +47455,17 @@ var require_cache3 = __commonJS({
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler)); return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler));
} }
const age = Math.round((now - result.cachedAt) / 1e3); const age = Math.round((now - result.cachedAt) / 1e3);
if (reqCacheControl?.["max-age"] && age >= reqCacheControl["max-age"]) { const requestMaxAgeExpired = reqCacheControl?.["max-age"] !== void 0 && age >= reqCacheControl["max-age"];
return dispatch(opts, handler); const stale = requestMaxAgeExpired || isStale(result, reqCacheControl, globalOpts.type);
} const revalidate = requestMaxAgeExpired || needsRevalidation(result, reqCacheControl, opts);
const stale = isStale(result, reqCacheControl);
const revalidate = needsRevalidation(result, reqCacheControl, opts);
if (stale || revalidate) { if (stale || revalidate) {
if (util7.isStream(opts.body) && util7.bodyLength(opts.body) !== 0) { if (util7.isStream(opts.body) && util7.bodyLength(opts.body) !== 0) {
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler)); return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler));
} }
if (!revalidate && withinStaleWhileRevalidateWindow(result)) { if (!revalidate && withinStaleWhileRevalidateWindow(result, globalOpts.type)) {
sendCachedValue(handler, opts, result, age, null, true); sendCachedValue(handler, opts, result, age, null, true);
queueMicrotask(() => { queueMicrotask(() => {
const headers2 = { const headers2 = makeRevalidationHeaders(opts, result);
...opts.headers,
"if-modified-since": new Date(result.cachedAt).toUTCString()
};
if (result.etag) {
headers2["if-none-match"] = result.etag;
}
if (result.vary) {
for (const key in result.vary) {
if (result.vary[key] != null) {
headers2[key] = result.vary[key];
}
}
}
dispatch( dispatch(
{ {
...opts, ...opts,
@@ -46584,32 +47491,33 @@ var require_cache3 = __commonJS({
return true; return true;
} }
let withinStaleIfErrorThreshold = false; let withinStaleIfErrorThreshold = false;
const staleIfErrorExpiry = result.cacheControlDirectives["stale-if-error"] ?? reqCacheControl?.["stale-if-error"]; if (!staleResponseRequiresRevalidation(result, globalOpts.type)) {
if (staleIfErrorExpiry) { const staleIfErrorExpiry = result.cacheControlDirectives["stale-if-error"] ?? reqCacheControl?.["stale-if-error"];
withinStaleIfErrorThreshold = now < result.staleAt + staleIfErrorExpiry * 1e3; if (staleIfErrorExpiry) {
} withinStaleIfErrorThreshold = now < result.staleAt + staleIfErrorExpiry * 1e3;
const headers = {
...opts.headers,
"if-modified-since": new Date(result.cachedAt).toUTCString()
};
if (result.etag) {
headers["if-none-match"] = result.etag;
}
if (result.vary) {
for (const key in result.vary) {
if (result.vary[key] != null) {
headers[key] = result.vary[key];
}
} }
} }
const headers = makeRevalidationHeaders(opts, result);
return dispatch( return dispatch(
{ {
...opts, ...opts,
headers headers
}, },
new CacheRevalidationHandler( new CacheRevalidationHandler(
(success, context3) => { (success, context3, statusCode, headers2) => {
if (success) { if (success) {
if (statusCode === 304) {
if (revalidationResponseDisallowsCachedReuse(globalOpts.type, headers2)) {
if (util7.isStream(result.body)) {
result.body.on("error", nop).destroy();
}
deleteCachedValue(globalOpts.store, cacheKey);
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler));
}
if (revalidationResponseUpdatesCacheControl(headers2)) {
deleteCachedValue(globalOpts.store, cacheKey);
}
}
sendCachedValue(handler, opts, result, age, context3, stale); sendCachedValue(handler, opts, result, age, context3, stale);
} else if (util7.isStream(result.body)) { } else if (util7.isStream(result.body)) {
result.body.on("error", nop).destroy(); result.body.on("error", nop).destroy();
@@ -46651,13 +47559,22 @@ var require_cache3 = __commonJS({
cacheByDefault, cacheByDefault,
type type
}; };
const safeMethodsToNotCache = util7.safeHTTPMethods.filter((method) => methods.includes(method) === false); const safeMethodsToNotCache = [];
for (let i = 0; i < util7.safeHTTPMethods.length; i++) {
const method = util7.safeHTTPMethods[i];
if (!arrayIncludes(methods, method)) {
safeMethodsToNotCache.push(method);
}
}
return (dispatch) => { return (dispatch) => {
return (opts2, handler) => { return (opts2, handler) => {
if (!opts2.origin || safeMethodsToNotCache.includes(opts2.method)) { if (arrayIncludes(safeMethodsToNotCache, opts2.method)) {
return dispatch(opts2, handler); return dispatch(opts2, handler);
} }
if (origins !== void 0) { if (origins !== void 0) {
if (!opts2.origin) {
return dispatch(opts2, handler);
}
const requestOrigin = opts2.origin.toString().toLowerCase(); const requestOrigin = opts2.origin.toString().toLowerCase();
let isAllowed = false; let isAllowed = false;
for (let i = 0; i < origins.length; i++) { for (let i = 0; i < origins.length; i++) {
@@ -46680,7 +47597,7 @@ var require_cache3 = __commonJS({
...opts2, ...opts2,
headers: normalizeHeaders(opts2) headers: normalizeHeaders(opts2)
}; };
const reqCacheControl = opts2.headers?.["cache-control"] ? parseCacheControlHeader(opts2.headers["cache-control"]) : void 0; const reqCacheControl = opts2.headers?.["cache-control"] ? parseCacheControlHeader(opts2.headers["cache-control"]) : hasPragmaNoCache(opts2.headers) ? { "no-cache": true } : void 0;
if (reqCacheControl?.["no-store"]) { if (reqCacheControl?.["no-store"]) {
return dispatch(opts2, handler); return dispatch(opts2, handler);
} }
@@ -46740,6 +47657,8 @@ var require_decompress = __commonJS({
var DecompressHandler = class extends DecoratorHandler { var DecompressHandler = class extends DecoratorHandler {
/** @type {Transform[]} */ /** @type {Transform[]} */
#decompressors = []; #decompressors = [];
/** @type {Record<string, string | string[]> | undefined} */
#trailers;
/** @type {Readonly<number[]>} */ /** @type {Readonly<number[]>} */
#skipStatusCodes; #skipStatusCodes;
/** @type {boolean} */ /** @type {boolean} */
@@ -46815,7 +47734,7 @@ var require_decompress = __commonJS({
const decompressor = this.#decompressors[0]; const decompressor = this.#decompressors[0];
this.#setupDecompressorEvents(decompressor, controller); this.#setupDecompressorEvents(decompressor, controller);
decompressor.on("end", () => { decompressor.on("end", () => {
super.onResponseEnd(controller, {}); super.onResponseEnd(controller, this.#trailers);
}); });
} }
/** /**
@@ -46831,7 +47750,7 @@ var require_decompress = __commonJS({
super.onResponseError(controller, err); super.onResponseError(controller, err);
return; return;
} }
super.onResponseEnd(controller, {}); super.onResponseEnd(controller, this.#trailers);
}); });
} }
/** /**
@@ -46909,6 +47828,7 @@ var require_decompress = __commonJS({
*/ */
onResponseEnd(controller, trailers) { onResponseEnd(controller, trailers) {
if (this.#decompressors.length > 0) { if (this.#decompressors.length > 0) {
this.#trailers = trailers;
this.#decompressors[0].end(); this.#decompressors[0].end();
this.#cleanupDecompressors(); this.#cleanupDecompressors();
return; return;
@@ -46940,6 +47860,9 @@ var require_decompress = __commonJS({
} }
return (dispatch) => { return (dispatch) => {
return (opts, handler) => { return (opts, handler) => {
if (opts.method === "HEAD") {
return dispatch(opts, handler);
}
const decompressHandler = new DecompressHandler(handler, options); const decompressHandler = new DecompressHandler(handler, options);
return dispatch(opts, decompressHandler); return dispatch(opts, decompressHandler);
}; };
@@ -47349,7 +48272,7 @@ var require_deduplicate = __commonJS({
const pendingRequests = /* @__PURE__ */ new Map(); const pendingRequests = /* @__PURE__ */ new Map();
return (dispatch) => { return (dispatch) => {
return (opts2, handler) => { return (opts2, handler) => {
if (!opts2.origin || methods.includes(opts2.method) === false) { if (opts2.upgrade || methods.includes(opts2.method) === false) {
return dispatch(opts2, handler); return dispatch(opts2, handler);
} }
opts2 = { opts2 = {
@@ -47747,7 +48670,12 @@ var require_sqlite_cache_store = __commonJS({
if (lhs.length !== rhs.length) { if (lhs.length !== rhs.length) {
return false; return false;
} }
return lhs.every((x, i) => x === rhs[i]); for (let i = 0; i < lhs.length; i++) {
if (lhs[i] !== rhs[i]) {
return false;
}
}
return true;
} }
return lhs === rhs; return lhs === rhs;
} }
@@ -48253,9 +49181,7 @@ var require_response2 = __commonJS({
// https://fetch.spec.whatwg.org/#dom-response-json // https://fetch.spec.whatwg.org/#dom-response-json
static json(data, init = void 0) { static json(data, init = void 0) {
webidl.argumentLengthCheck(arguments, 1, "Response.json"); webidl.argumentLengthCheck(arguments, 1, "Response.json");
if (init !== null) { init = webidl.converters.ResponseInit(init);
init = webidl.converters.ResponseInit(init);
}
const bytes = textEncoder.encode( const bytes = textEncoder.encode(
serializeJavascriptValueToJSONString(data) serializeJavascriptValueToJSONString(data)
); );
@@ -51474,8 +52400,42 @@ var require_util12 = __commonJS({
} }
} }
} }
function isLetterOrDigit(code) {
return code >= 48 && code <= 57 || // 0-9
code >= 65 && code <= 90 || // A-Z
code >= 97 && code <= 122;
}
function validateCookieDomain(domain) { function validateCookieDomain(domain) {
if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { if (domain === " ") {
return;
}
if (domain.length > 255) {
throw new Error("Invalid cookie domain");
}
let labelLength = 0;
for (let i = 0; i < domain.length; ++i) {
const code = domain.charCodeAt(i);
if (code === 46) {
if (labelLength === 0) {
throw new Error("Invalid cookie domain");
}
if (domain.charCodeAt(i - 1) === 45) {
throw new Error("Invalid cookie domain");
}
labelLength = 0;
continue;
}
if (labelLength === 0 && !isLetterOrDigit(code)) {
throw new Error("Invalid cookie domain");
}
if (!isLetterOrDigit(code) && code !== 45) {
throw new Error("Invalid cookie domain");
}
if (++labelLength > 63) {
throw new Error("Invalid cookie domain");
}
}
if (labelLength === 0 || domain.charCodeAt(domain.length - 1) === 45) {
throw new Error("Invalid cookie domain"); throw new Error("Invalid cookie domain");
} }
} }
@@ -51558,7 +52518,11 @@ var require_util12 = __commonJS({
throw new Error("Invalid unparsed"); throw new Error("Invalid unparsed");
} }
const [key, ...value] = part.split("="); const [key, ...value] = part.split("=");
out.push(`${key.trim()}=${value.join("=")}`); const trimmedKey = key.trim();
const joinedValue = value.join("=");
validateCookieName(trimmedKey);
validateCookieValue(joinedValue);
out.push(`${trimmedKey}=${joinedValue}`);
} }
return out.join("; "); return out.join("; ");
} }
@@ -53158,6 +54122,8 @@ var require_websocket2 = __commonJS({
var { SendQueue } = require_sender2(); var { SendQueue } = require_sender2();
var { WebsocketFrameSend } = require_frame2(); var { WebsocketFrameSend } = require_frame2();
var { channels } = require_diagnostics2(); var { channels } = require_diagnostics2();
var kRef = /* @__PURE__ */ Symbol.for("nodejs.ref");
var kUnref = /* @__PURE__ */ Symbol.for("nodejs.unref");
function getSocketAddress(socket) { function getSocketAddress(socket) {
if (typeof socket?.address === "function") { if (typeof socket?.address === "function") {
return socket.address(); return socket.address();
@@ -53177,6 +54143,7 @@ var require_websocket2 = __commonJS({
#bufferedAmount = 0; #bufferedAmount = 0;
#protocol = ""; #protocol = "";
#extensions = ""; #extensions = "";
#refed = true;
/** @type {SendQueue} */ /** @type {SendQueue} */
#sendQueue; #sendQueue;
/** @type {Handler} */ /** @type {Handler} */
@@ -53259,6 +54226,16 @@ var require_websocket2 = __commonJS({
this.#handler.readyState = _WebSocket.CONNECTING; this.#handler.readyState = _WebSocket.CONNECTING;
this.#binaryType = "blob"; this.#binaryType = "blob";
} }
[kRef]() {
webidl.brandCheck(this, _WebSocket);
this.#refed = true;
this.#handler.socket?.ref?.();
}
[kUnref]() {
webidl.brandCheck(this, _WebSocket);
this.#refed = false;
this.#handler.socket?.unref?.();
}
/** /**
* @see https://websockets.spec.whatwg.org/#dom-websocket-close * @see https://websockets.spec.whatwg.org/#dom-websocket-close
* @param {number|undefined} code * @param {number|undefined} code
@@ -53420,6 +54397,9 @@ var require_websocket2 = __commonJS({
*/ */
#onConnectionEstablished(response, parsedExtensions) { #onConnectionEstablished(response, parsedExtensions) {
this.#handler.socket = response.socket; this.#handler.socket = response.socket;
if (!this.#refed) {
this.#handler.socket.unref?.();
}
const maxFragments = this.#handler.controller.dispatcher?.webSocketOptions?.maxFragments; const maxFragments = this.#handler.controller.dispatcher?.webSocketOptions?.maxFragments;
const maxPayloadSize = this.#handler.controller.dispatcher?.webSocketOptions?.maxPayloadSize; const maxPayloadSize = this.#handler.controller.dispatcher?.webSocketOptions?.maxPayloadSize;
const parser = new ByteParser(this.#handler, parsedExtensions, { const parser = new ByteParser(this.#handler, parsedExtensions, {
@@ -97862,6 +98842,8 @@ function skipUntil(str, ptr, sep8, end, banNewLines = false) {
let c = str[i]; let c = str[i];
if (c === "#") { if (c === "#") {
i = indexOfNewline(str, i); i = indexOfNewline(str, i);
if (i < 0)
break;
} else if (c === sep8) { } else if (c === sep8) {
return i + 1; return i + 1;
} else if (c === end || banNewLines && (c === "\n" || c === "\r" && str[i + 1] === "\n")) { } else if (c === end || banNewLines && (c === "\n" || c === "\r" && str[i + 1] === "\n")) {
+1306 -326
View File
@@ -19803,6 +19803,7 @@ var require_symbols6 = __commonJS({
kCounter: /* @__PURE__ */ Symbol("socket request counter"), kCounter: /* @__PURE__ */ Symbol("socket request counter"),
kMaxResponseSize: /* @__PURE__ */ Symbol("max response size"), kMaxResponseSize: /* @__PURE__ */ Symbol("max response size"),
kHTTP2Session: /* @__PURE__ */ Symbol("http2Session"), kHTTP2Session: /* @__PURE__ */ Symbol("http2Session"),
kHTTP2Options: /* @__PURE__ */ Symbol("http2 options"),
kHTTP2SessionState: /* @__PURE__ */ Symbol("http2Session state"), kHTTP2SessionState: /* @__PURE__ */ Symbol("http2Session state"),
kRetryHandlerDefaultRetry: /* @__PURE__ */ Symbol("retry agent default retry"), kRetryHandlerDefaultRetry: /* @__PURE__ */ Symbol("retry agent default retry"),
kConstruct: /* @__PURE__ */ Symbol("constructable"), kConstruct: /* @__PURE__ */ Symbol("constructable"),
@@ -20929,7 +20930,10 @@ var require_util9 = __commonJS({
if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) {
stream2.socket = null; stream2.socket = null;
} }
stream2.destroy(err); try {
stream2.destroy(err);
} catch {
}
} else if (err) { } else if (err) {
queueMicrotask(() => { queueMicrotask(() => {
stream2.emit("error", err); stream2.emit("error", err);
@@ -21990,7 +21994,7 @@ var require_request3 = __commonJS({
this.headersTimeout = headersTimeout; this.headersTimeout = headersTimeout;
this.bodyTimeout = bodyTimeout; this.bodyTimeout = bodyTimeout;
this.method = method; this.method = method;
this.typeOfService = typeOfService ?? 0; this.typeOfService = typeOfService;
this.abort = null; this.abort = null;
if (body == null) { if (body == null) {
this.body = null; this.body = null;
@@ -22224,7 +22228,11 @@ var require_request3 = __commonJS({
} else if (typeof val[i] === "object") { } else if (typeof val[i] === "object") {
throw new InvalidArgumentError(`invalid ${key} header`); throw new InvalidArgumentError(`invalid ${key} header`);
} else { } else {
arr.push(`${val[i]}`); const str = `${val[i]}`;
if (!isValidHeaderValue(str)) {
throw new InvalidArgumentError(`invalid ${key} header`);
}
arr.push(str);
} }
} }
val = arr; val = arr;
@@ -22236,6 +22244,9 @@ var require_request3 = __commonJS({
val = ""; val = "";
} else { } else {
val = `${val}`; val = `${val}`;
if (!isValidHeaderValue(val)) {
throw new InvalidArgumentError(`invalid ${key} header`);
}
} }
if (headerName === "host") { if (headerName === "host") {
if (request.host !== null) { if (request.host !== null) {
@@ -22561,14 +22572,26 @@ var require_connect2 = __commonJS({
} else { } else {
assert(!httpSocket, "httpSocket can only be sent on TLS update"); assert(!httpSocket, "httpSocket can only be sent on TLS update");
port = port || 80; port = port || 80;
socket = net.connect({ const connectOptions = {
highWaterMark: 64 * 1024, highWaterMark: 64 * 1024,
// Same as nodejs fs streams. // Same as nodejs fs streams.
...options, ...options,
localAddress, localAddress,
port, port,
host: hostname host: hostname
}); };
const family = net.isIP(hostname);
if (family !== 0 && servername && servername !== hostname) {
connectOptions.host = servername;
connectOptions.lookup = (_hostname, lookupOptions, cb) => {
if (lookupOptions.all) {
cb(null, [{ address: hostname, family }]);
} else {
cb(null, hostname, family);
}
};
}
socket = net.connect(connectOptions);
if (useH2c === true) { if (useH2c === true) {
socket.alpnProtocol = "h2"; socket.alpnProtocol = "h2";
} }
@@ -25925,6 +25948,7 @@ var require_body2 = __commonJS({
var { multipartFormDataParser } = require_formdata_parser2(); var { multipartFormDataParser } = require_formdata_parser2();
var { parseJSONFromBytes } = require_infra(); var { parseJSONFromBytes } = require_infra();
var { utf8DecodeBytes } = require_encoding2(); var { utf8DecodeBytes } = require_encoding2();
var { ReadableStreamTee } = require("node:stream/web");
var textEncoder = new TextEncoder(); var textEncoder = new TextEncoder();
function noop() { function noop() {
} }
@@ -26067,7 +26091,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r
return extractBody(object, keepalive); return extractBody(object, keepalive);
} }
function cloneBody(body) { function cloneBody(body) {
const { 0: out1, 1: out2 } = body.stream.tee(); const { 0: out1, 1: out2 } = ReadableStreamTee?.(body.stream, true) ?? body.stream.tee();
body.stream = out1; body.stream = out1;
return { return {
stream: out2, stream: out2,
@@ -26220,6 +26244,7 @@ var require_client_h12 = __commonJS({
RequestContentLengthMismatchError, RequestContentLengthMismatchError,
ResponseContentLengthMismatchError, ResponseContentLengthMismatchError,
RequestAbortedError, RequestAbortedError,
InvalidArgumentError,
HeadersTimeoutError, HeadersTimeoutError,
HeadersOverflowError, HeadersOverflowError,
SocketError, SocketError,
@@ -26269,6 +26294,7 @@ var require_client_h12 = __commonJS({
var kIdleSocketValidation = /* @__PURE__ */ Symbol("kIdleSocketValidation"); var kIdleSocketValidation = /* @__PURE__ */ Symbol("kIdleSocketValidation");
var kIdleSocketValidationTimeout = /* @__PURE__ */ Symbol("kIdleSocketValidationTimeout"); var kIdleSocketValidationTimeout = /* @__PURE__ */ Symbol("kIdleSocketValidationTimeout");
var kSocketUsed = /* @__PURE__ */ Symbol("kSocketUsed"); var kSocketUsed = /* @__PURE__ */ Symbol("kSocketUsed");
var kTypeOfService = /* @__PURE__ */ Symbol("kTypeOfService");
var extractBody; var extractBody;
function lazyllhttp() { function lazyllhttp() {
const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm2() : void 0; const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm2() : void 0;
@@ -27072,6 +27098,24 @@ var require_client_h12 = __commonJS({
function shouldSendContentLength(method) { function shouldSendContentLength(method) {
return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT";
} }
function setTypeOfService(socket, request) {
if (typeof socket.setTypeOfService !== "function") {
return;
}
const typeOfService = request.typeOfService;
if (typeOfService === void 0) {
return;
}
const currentTypeOfService = socket[kTypeOfService];
if (currentTypeOfService === typeOfService) {
return;
}
try {
socket.setTypeOfService(typeOfService);
socket[kTypeOfService] = typeOfService;
} catch {
}
}
function writeH1(client, request) { function writeH1(client, request) {
const { method, path, host, upgrade, blocking, reset } = request; const { method, path, host, upgrade, blocking, reset } = request;
let { body, headers, contentLength } = request; let { body, headers, contentLength } = request;
@@ -27086,8 +27130,16 @@ var require_client_h12 = __commonJS({
} }
body = bodyStream.stream; body = bodyStream.stream;
contentLength = bodyStream.length; contentLength = bodyStream.length;
} else if (util.isBlobLike(body) && request.contentType == null && body.type) { } else if (util.isBlobLike(body) && request.contentType == null) {
headers.push("content-type", body.type); const contentType = body.type;
if (contentType) {
const contentTypeValue = `${contentType}`;
if (!util.isValidHeaderValue(contentTypeValue)) {
util.errorRequest(client, request, new InvalidArgumentError("invalid content-type header"));
return false;
}
headers.push("content-type", contentTypeValue);
}
} }
if (body && typeof body.read === "function") { if (body && typeof body.read === "function") {
body.read(0); body.read(0);
@@ -27140,9 +27192,7 @@ var require_client_h12 = __commonJS({
if (blocking) { if (blocking) {
socket[kBlocking] = true; socket[kBlocking] = true;
} }
if (socket.setTypeOfService) { setTypeOfService(socket, request);
socket.setTypeOfService(request.typeOfService);
}
let header = `${method} ${path} HTTP/1.1\r let header = `${method} ${path} HTTP/1.1\r
`; `;
if (typeof host === "string") { if (typeof host === "string") {
@@ -27518,10 +27568,7 @@ var require_client_h22 = __commonJS({
kStrictContentLength, kStrictContentLength,
kOnError, kOnError,
kMaxConcurrentStreams, kMaxConcurrentStreams,
kPingInterval,
kHTTP2Session, kHTTP2Session,
kHTTP2InitialWindowSize,
kHTTP2ConnectionWindowSize,
kHostAuthority, kHostAuthority,
kResume, kResume,
kSize, kSize,
@@ -27533,7 +27580,8 @@ var require_client_h22 = __commonJS({
kEnableConnectProtocol, kEnableConnectProtocol,
kRemoteSettings, kRemoteSettings,
kHTTP2Stream, kHTTP2Stream,
kHTTP2SessionState kHTTP2SessionState,
kHTTP2Options
} = require_symbols6(); } = require_symbols6();
var { channels } = require_diagnostics2(); var { channels } = require_diagnostics2();
var kOpenStreams = /* @__PURE__ */ Symbol("open streams"); var kOpenStreams = /* @__PURE__ */ Symbol("open streams");
@@ -27542,6 +27590,9 @@ var require_client_h22 = __commonJS({
var kRequestStreamCleanup = /* @__PURE__ */ Symbol("request stream cleanup"); var kRequestStreamCleanup = /* @__PURE__ */ Symbol("request stream cleanup");
var kRequestStreamState = /* @__PURE__ */ Symbol("request stream state"); var kRequestStreamState = /* @__PURE__ */ Symbol("request stream state");
var kReceivedGoAway = /* @__PURE__ */ Symbol("received goaway"); var kReceivedGoAway = /* @__PURE__ */ Symbol("received goaway");
var kGoAwayReplayAttempts = /* @__PURE__ */ Symbol("goaway replay attempts");
var kRefusedStreamRetry = /* @__PURE__ */ Symbol("refused stream retry");
var MAX_GOAWAY_REPLAY_ATTEMPTS = 1;
var extractBody; var extractBody;
var http2; var http2;
try { try {
@@ -27625,6 +27676,7 @@ var require_client_h22 = __commonJS({
const queue = client[kQueue]; const queue = client[kQueue];
const runningIdx = client[kRunningIdx]; const runningIdx = client[kRunningIdx];
if (runningIdx < client[kPendingIdx] && queue[runningIdx] === request) { if (runningIdx < client[kPendingIdx] && queue[runningIdx] === request) {
queue[runningIdx] = null;
client[kRunningIdx] = runningIdx + 1; client[kRunningIdx] = runningIdx + 1;
return; return;
} }
@@ -27638,10 +27690,15 @@ var require_client_h22 = __commonJS({
client[kPendingIdx] = client[kRunningIdx]; client[kPendingIdx] = client[kRunningIdx];
} }
} }
function canRetryRequestAfterGoAway(request) { function canReplayRequest(request) {
const { body } = request; const { body } = request;
return body == null || util.isBuffer(body) || util.isBlobLike(body); return body == null || util.isBuffer(body) || util.isBlobLike(body);
} }
function registerGoAwayRefusal(request) {
const attempts = (request[kGoAwayReplayAttempts] ?? 0) + 1;
request[kGoAwayReplayAttempts] = attempts;
return attempts <= MAX_GOAWAY_REPLAY_ATTEMPTS;
}
function closeStream(stream, code = NGHTTP2_REFUSED_STREAM) { function closeStream(stream, code = NGHTTP2_REFUSED_STREAM) {
if (stream != null && !stream.destroyed && !stream.closed) { if (stream != null && !stream.destroyed && !stream.closed) {
try { try {
@@ -27653,15 +27710,30 @@ var require_client_h22 = __commonJS({
function detachRequestStreamForClose(request) { function detachRequestStreamForClose(request) {
const stream = request[kRequestStream]; const stream = request[kRequestStream];
clearRequestStream(request); clearRequestStream(request);
severRequestStream(stream);
return stream; return stream;
} }
function severRequestStream(stream) {
if (stream == null || stream[kRequestStreamState] == null) {
return;
}
stream[kRequestStreamState] = null;
stream.off("close", completeRequestStream);
stream.off("close", onUpgradeStreamClose);
if (stream[kHTTP2Session] != null) {
closeStreamSession(stream);
}
if (!stream.destroyed && !stream.closed) {
stream.once("error", noop);
}
}
function connectH2(client, socket) { function connectH2(client, socket) {
client[kSocket] = socket; client[kSocket] = socket;
const http2InitialWindowSize = client[kHTTP2InitialWindowSize]; const http2InitialWindowSize = client[kHTTP2Options].sessionOptions?.initialWindowSize;
const http2ConnectionWindowSize = client[kHTTP2ConnectionWindowSize]; const http2ConnectionWindowSize = client[kHTTP2Options].connectionWindowSize;
const session = http2.connect(client[kUrl], { const session = http2.connect(client[kUrl], {
createConnection: () => socket, createConnection: () => socket,
peerMaxConcurrentStreams: client[kMaxConcurrentStreams], peerMaxConcurrentStreams: client[kHTTP2Options].maxConcurrentStreams,
settings: { settings: {
// TODO(metcoder95): add support for PUSH // TODO(metcoder95): add support for PUSH
enablePush: false, enablePush: false,
@@ -27674,13 +27746,16 @@ var require_client_h22 = __commonJS({
session[kSocket] = socket; session[kSocket] = socket;
session[kHTTP2SessionState] = { session[kHTTP2SessionState] = {
idleTimeout: null, idleTimeout: null,
// Armed while the peer advertises MAX_CONCURRENT_STREAMS = 0 and we have
// work that cannot start. See setNoStreamsTimeout.
noStreamsTimeout: null,
// Sockets start out ref'd. Session ref/unref proxies to the socket, so a // Sockets start out ref'd. Session ref/unref proxies to the socket, so a
// single cached flag lets us skip redundant uv ref/unref calls, provided // single cached flag lets us skip redundant uv ref/unref calls, provided
// every ref/unref of the session or its socket goes through // every ref/unref of the session or its socket goes through
// refH2Session/unrefH2Session. // refH2Session/unrefH2Session.
refed: true, refed: true,
ping: { ping: {
interval: client[kPingInterval] === 0 ? null : setInterval(onHttp2SendPing, client[kPingInterval], session).unref() interval: client[kHTTP2Options].pingInterval === 0 ? null : setInterval(onHttp2SendPing, client[kHTTP2Options].pingInterval, session).unref()
} }
}; };
session[kReceivedGoAway] = false; session[kReceivedGoAway] = false;
@@ -27691,7 +27766,6 @@ var require_client_h22 = __commonJS({
} }
util.addListener(session, "error", onHttp2SessionError); util.addListener(session, "error", onHttp2SessionError);
util.addListener(session, "frameError", onHttp2FrameError); util.addListener(session, "frameError", onHttp2FrameError);
util.addListener(session, "end", onHttp2SessionEnd);
util.addListener(session, "goaway", onHttp2SessionGoAway); util.addListener(session, "goaway", onHttp2SessionGoAway);
util.addListener(session, "close", onHttp2SessionClose); util.addListener(session, "close", onHttp2SessionClose);
util.addListener(session, "remoteSettings", onHttp2RemoteSettings); util.addListener(session, "remoteSettings", onHttp2RemoteSettings);
@@ -27750,7 +27824,6 @@ var require_client_h22 = __commonJS({
if (request != null) { if (request != null) {
if (client[kRunning] > 0) { if (client[kRunning] > 0) {
if ((request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false) return true; if ((request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false) return true;
if (util.bodyLength(request.body) !== 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body) || util.isFormDataLike(request.body))) return true;
} else { } else {
return (request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false; return (request.upgrade === "websocket" || request.method === "CONNECT") && session[kRemoteSettings] === false;
} }
@@ -27787,8 +27860,48 @@ var require_client_h22 = __commonJS({
} else { } else {
clearHttp2IdleTimeout(session); clearHttp2IdleTimeout(session);
} }
if (client[kMaxConcurrentStreams] === 0 && client[kRunning] === 0 && client[kPending] > 0) {
setNoStreamsTimeout(session);
} else {
clearNoStreamsTimeout(session);
}
} }
} }
function clearNoStreamsTimeout(session) {
const state = session[kHTTP2SessionState];
if (state?.noStreamsTimeout != null) {
clearTimeout(state.noStreamsTimeout);
state.noStreamsTimeout = null;
}
}
function setNoStreamsTimeout(session) {
const client = session[kClient];
const state = session[kHTTP2SessionState];
const timeout = client[kHeadersTimeout];
if (!timeout || state.noStreamsTimeout != null) {
return;
}
state.noStreamsTimeout = setTimeout(onNoStreamsTimeout, timeout, session).unref();
}
function onNoStreamsTimeout(session) {
const client = session[kClient];
const state = session[kHTTP2SessionState];
state.noStreamsTimeout = null;
if (client[kHTTP2Session] !== session || client[kMaxConcurrentStreams] !== 0 || client[kRunning] !== 0 || client[kPending] === 0) {
return;
}
const err = new HeadersTimeoutError(
`HTTP/2: server did not accept a new stream within ${client[kHeadersTimeout]}`
);
const requests = client[kQueue].splice(client[kPendingIdx]);
for (let i = 0; i < requests.length; i++) {
if (requests[i] != null) {
util.errorRequest(client, requests[i], err);
}
}
session[kError] = err;
resetHttp2Session(session, err);
}
function clearHttp2IdleTimeout(session) { function clearHttp2IdleTimeout(session) {
const state = session[kHTTP2SessionState]; const state = session[kHTTP2SessionState];
if (state?.idleTimeout != null) { if (state?.idleTimeout != null) {
@@ -27880,11 +27993,6 @@ var require_client_h22 = __commonJS({
this[kClient][kOnError](err); this[kClient][kOnError](err);
} }
} }
function onHttp2SessionEnd() {
const err = new SocketError("other side closed", util.getSocketInfo(this[kSocket]));
this.destroy(err);
util.destroy(this[kSocket], err);
}
function onHttp2SessionGoAway(errorCode, lastStreamID) { function onHttp2SessionGoAway(errorCode, lastStreamID) {
if (this[kReceivedGoAway]) { if (this[kReceivedGoAway]) {
return; return;
@@ -27900,7 +28008,7 @@ var require_client_h22 = __commonJS({
const request = client[kQueue][i]; const request = client[kQueue][i];
if (request != null) { if (request != null) {
streamsToClose.push(detachRequestStreamForClose(request)); streamsToClose.push(detachRequestStreamForClose(request));
if (canRetryRequestAfterGoAway(request)) { if (canReplayRequest(request) && registerGoAwayRefusal(request)) {
retriableRequests.push(request); retriableRequests.push(request);
} else { } else {
util.errorRequest(client, request, err); util.errorRequest(client, request, err);
@@ -27921,6 +28029,7 @@ var require_client_h22 = __commonJS({
client[kHTTP2Session] = null; client[kHTTP2Session] = null;
} }
clearHttp2IdleTimeout(this); clearHttp2IdleTimeout(this);
clearNoStreamsTimeout(this);
if (!this.closed && !this.destroyed) { if (!this.closed && !this.destroyed) {
this.close(); this.close();
} }
@@ -27937,6 +28046,7 @@ var require_client_h22 = __commonJS({
client[kHTTP2Session] = null; client[kHTTP2Session] = null;
} }
clearHttp2IdleTimeout(this); clearHttp2IdleTimeout(this);
clearNoStreamsTimeout(this);
if (state.ping.interval != null) { if (state.ping.interval != null) {
clearInterval(state.ping.interval); clearInterval(state.ping.interval);
state.ping.interval = null; state.ping.interval = null;
@@ -27978,7 +28088,7 @@ var require_client_h22 = __commonJS({
if (this[kHTTP2Session]?.[kReceivedGoAway]) { if (this[kHTTP2Session]?.[kReceivedGoAway]) {
return; return;
} }
this[kClient][kOnError](err); this[kHTTP2Session]?.[kClient]?.[kOnError](err);
} }
function onHttp2SocketEnd() { function onHttp2SocketEnd() {
util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this)));
@@ -28004,15 +28114,22 @@ var require_client_h22 = __commonJS({
failUpgradeStream(state, new InformationalError("HTTP/2: stream closed before response headers")); failUpgradeStream(state, new InformationalError("HTTP/2: stream closed before response headers"));
closeStreamSession(this); closeStreamSession(this);
} }
function onRequestStreamClose() { function completeRequestStream() {
const state = this[kRequestStreamState]; const state = this[kRequestStreamState];
if (state) { if (state == null) {
releaseRequestStream(this); return;
if (state.pendingEnd && !state.request.aborted && !state.request.completed) {
state.request.onResponseEnd(state.trailers || {});
finalizeRequest(state);
}
} }
releaseRequestStream(this);
if (state.pendingEnd && !state.request.aborted && !state.request.completed) {
state.request.onResponseEnd(state.trailers || {});
} else if (!state.request.aborted && !state.request.completed) {
util.errorRequest(
state.client,
state.request,
new InformationalError("HTTP/2: stream closed before the response was complete")
);
}
finalizeRequest(state);
closeStreamSession(this); closeStreamSession(this);
this[kRequestStreamState] = null; this[kRequestStreamState] = null;
} }
@@ -28192,11 +28309,9 @@ var require_client_h22 = __commonJS({
clearRequestStream(request); clearRequestStream(request);
const stream2 = state.stream; const stream2 = state.stream;
stream2.close(); stream2.close();
setImmediate(() => { if (!stream2.destroyed) {
if (!stream2.destroyed) { util.destroy(stream2);
util.destroy(stream2); }
}
});
client[kOnError](err); client[kOnError](err);
finalizeRequest(state, resetPendingIdx); finalizeRequest(state, resetPendingIdx);
} }
@@ -28305,7 +28420,7 @@ var require_client_h22 = __commonJS({
stream.setTimeout(headersTimeout); stream.setTimeout(headersTimeout);
} }
stream[kHTTP2Session] = session; stream[kHTTP2Session] = session;
stream.on("close", onRequestStreamClose); stream.on("close", completeRequestStream);
bindRequestToStream(request, stream, releaseRequestStream); bindRequestToStream(request, stream, releaseRequestStream);
if (expectContinue) { if (expectContinue) {
stream.once("continue", writeBodyH2); stream.once("continue", writeBodyH2);
@@ -28406,11 +28521,26 @@ var require_client_h22 = __commonJS({
if (state.responseReceived) { if (state.responseReceived) {
if (!request.aborted && !request.completed) { if (!request.aborted && !request.completed) {
state.pendingEnd = true; state.pendingEnd = true;
completeRequestStream.call(stream);
} }
} else { } else {
state.abort(new InformationalError("HTTP/2: stream half-closed (remote)"), true); state.abort(new InformationalError("HTTP/2: stream half-closed (remote)"), true);
} }
} }
function retryRefusedStream(stream, state) {
const { client, request } = state;
if (state.responseReceived || request.aborted || request.completed || request[kRefusedStreamRetry] || !canReplayRequest(request)) {
return false;
}
request[kRefusedStreamRetry] = true;
detachRequestStreamForClose(request);
state.stream = null;
state.requestFinalized = true;
completeRequest(client, request);
client[kQueue].splice(client[kPendingIdx], 0, request);
client[kResume]();
return true;
}
function onError(err) { function onError(err) {
const stream = this; const stream = this;
const state = stream[kRequestStreamState]; const state = stream[kRequestStreamState];
@@ -28418,6 +28548,12 @@ var require_client_h22 = __commonJS({
return; return;
} }
stream.off("error", onError); stream.off("error", onError);
if (typeof stream.rstCode === "number" && stream.rstCode !== NGHTTP2_NO_ERROR) {
err.http2ErrorCode = stream.rstCode;
}
if (stream.rstCode === NGHTTP2_REFUSED_STREAM && retryRefusedStream(stream, state)) {
return;
}
state.abort(err); state.abort(err);
} }
function onFrameError(type, code) { function onFrameError(type, code) {
@@ -28699,10 +28835,8 @@ var require_client2 = __commonJS({
kHTTPContext, kHTTPContext,
kMaxConcurrentStreams, kMaxConcurrentStreams,
kHostAuthority, kHostAuthority,
kHTTP2InitialWindowSize,
kHTTP2ConnectionWindowSize,
kResume, kResume,
kPingInterval kHTTP2Options
} = require_symbols6(); } = require_symbols6();
var connectH1 = require_client_h12(); var connectH1 = require_client_h12();
var connectH2 = require_client_h22(); var connectH2 = require_client_h22();
@@ -28715,6 +28849,14 @@ var require_client2 = __commonJS({
function getPipelining(client) { function getPipelining(client) {
return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1; return client[kPipelining] ?? client[kHTTPContext]?.defaultPipelining ?? 1;
} }
var h2NamespaceOptsWarning = false;
function emitH2OptionsNamespaceWarning(optName) {
if (h2NamespaceOptsWarning === true) return;
process.emitWarning(`Use h2Options.${optName} instead. ${optName} for H2 will be deprecated in future major.`, {
code: "UNDICI-H2-OPTIONS"
});
h2NamespaceOptsWarning = true;
}
function getMaxConcurrent(client) { function getMaxConcurrent(client) {
if (client[kHTTPContext]?.version === "h2") { if (client[kHTTPContext]?.version === "h2") {
return client[kMaxConcurrentStreams]; return client[kMaxConcurrentStreams];
@@ -28758,7 +28900,8 @@ var require_client2 = __commonJS({
initialWindowSize, initialWindowSize,
connectionWindowSize, connectionWindowSize,
pingInterval, pingInterval,
webSocket webSocket,
h2Options
} = {}) { } = {}) {
if (keepAlive !== void 0) { if (keepAlive !== void 0) {
throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead");
@@ -28821,20 +28964,45 @@ var require_client2 = __commonJS({
if (allowH2 != null && typeof allowH2 !== "boolean") { if (allowH2 != null && typeof allowH2 !== "boolean") {
throw new InvalidArgumentError("allowH2 must be a valid boolean value"); throw new InvalidArgumentError("allowH2 must be a valid boolean value");
} }
if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { if (allowH2 !== false) {
throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0"); if (h2Options != null) {
} if (h2Options.useH2c != null && typeof h2Options.useH2c !== "boolean") {
if (useH2c != null && typeof useH2c !== "boolean") { throw new InvalidArgumentError("h2Options.useH2c must be a valid boolean value");
throw new InvalidArgumentError("useH2c must be a valid boolean value"); }
} if (h2Options.settings?.initialWindowSize != null && (!Number.isInteger(h2Options.settings.initialWindowSize) || h2Options.settings.initialWindowSize < 1)) {
if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) { throw new InvalidArgumentError("h2Options.settings.initialWindowSize must be a positive integer, greater than 0");
throw new InvalidArgumentError("initialWindowSize must be a positive integer, greater than 0"); }
} if (h2Options.maxConcurrentStreams != null && (!Number.isInteger(h2Options.connectionWindowSize) || h2Options.maxConcurrentStreams < 1)) {
if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) { throw new InvalidArgumentError("h2Options.maxConcurrentStreams must be a positive integer, greater than 0");
throw new InvalidArgumentError("connectionWindowSize must be a positive integer, greater than 0"); }
} if (h2Options.connectionWindowSize != null && (!Number.isInteger(h2Options.connectionWindowSize) || h2Options.connectionWindowSize < 1)) {
if (pingInterval != null && (typeof pingInterval !== "number" || !Number.isInteger(pingInterval) || pingInterval < 0)) { throw new InvalidArgumentError("h2Options.connectionWindowSize must be a positive integer, greater than 0");
throw new InvalidArgumentError("pingInterval must be a positive integer, greater or equal to 0"); }
if (h2Options.pingInterval != null && (typeof h2Options.pingInterval !== "number" || !Number.isInteger(h2Options.pingInterval) || h2Options.pingInterval < 0)) {
throw new InvalidArgumentError("h2Options.pingInterval must be a positive integer, greater or equal to 0");
}
} else {
if (useH2c != null && typeof useH2c !== "boolean") {
emitH2OptionsNamespaceWarning("useH2c");
throw new InvalidArgumentError("useH2c must be a valid boolean value");
}
if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) {
emitH2OptionsNamespaceWarning("maxConcurrentStreams");
throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0");
}
if (initialWindowSize != null && (!Number.isInteger(initialWindowSize) || initialWindowSize < 1)) {
emitH2OptionsNamespaceWarning("initialWindowSize");
throw new InvalidArgumentError("initialWindowSize must be a positive integer, greater than 0");
}
if (connectionWindowSize != null && (!Number.isInteger(connectionWindowSize) || connectionWindowSize < 1)) {
emitH2OptionsNamespaceWarning("connectionWindowSize");
throw new InvalidArgumentError("connectionWindowSize must be a positive integer, greater than 0");
}
if (pingInterval != null && (typeof pingInterval !== "number" || !Number.isInteger(pingInterval) || pingInterval < 0)) {
emitH2OptionsNamespaceWarning("pingInterval");
throw new InvalidArgumentError("pingInterval must be a positive integer, greater or equal to 0");
}
}
} }
super({ webSocket }); super({ webSocket });
if (typeof connect2 !== "function") { if (typeof connect2 !== "function") {
@@ -28842,8 +29010,8 @@ var require_client2 = __commonJS({
...tls, ...tls,
maxCachedSessions, maxCachedSessions,
allowH2, allowH2,
useH2c,
socketPath, socketPath,
useH2c: h2Options?.useH2c ?? useH2c,
timeout: connectTimeout, timeout: connectTimeout,
...typeof autoSelectFamily === "boolean" ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, ...typeof autoSelectFamily === "boolean" ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0,
...connect2 ...connect2
@@ -28878,10 +29046,21 @@ var require_client2 = __commonJS({
this[kClosedResolve] = null; this[kClosedResolve] = null;
this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1;
this[kHTTPContext] = null; this[kHTTPContext] = null;
this[kMaxConcurrentStreams] = maxConcurrentStreams != null ? maxConcurrentStreams : 100; this[kHTTP2Options] = {
this[kHTTP2InitialWindowSize] = initialWindowSize != null ? initialWindowSize : 262144; pingInterval: h2Options?.pingInterval ?? pingInterval ?? 6e4,
this[kHTTP2ConnectionWindowSize] = connectionWindowSize != null ? connectionWindowSize : 524288; connectionWindowSize: h2Options?.connectionWindowSize ?? connectionWindowSize ?? 524288,
this[kPingInterval] = pingInterval != null ? pingInterval : 6e4; maxConcurrentStreams: h2Options?.maxConcurrentStreams ?? maxConcurrentStreams ?? 100,
// Max peerConcurrentStreams for a Node h2 server
sessionOptions: {
// HTTP/2 window sizes are set to higher defaults than Node.js core for better performance:
// - initialWindowSize: 262144 (256KB) vs Node.js default 65535 (64KB - 1)
// Allows more data to be sent before requiring acknowledgment, improving throughput
// especially on high-latency networks. This matches common production HTTP/2 servers.
// - connectionWindowSize: 524288 (512KB) vs Node.js default (none set)
// Provides better flow control for the entire connection across multiple streams.
initialWindowSize: h2Options?.initialWindowSize ?? initialWindowSize ?? 262144
}
};
this[kQueue] = []; this[kQueue] = [];
this[kRunningIdx] = 0; this[kRunningIdx] = 0;
this[kPendingIdx] = 0; this[kPendingIdx] = 0;
@@ -29166,6 +29345,7 @@ var require_client2 = __commonJS({
return; return;
} }
if (!client[kHTTPContext]) { if (!client[kHTTPContext]) {
client[kServerName] = request.servername;
connect(client); connect(client);
return; return;
} }
@@ -29936,14 +30116,14 @@ var require_agent2 = __commonJS({
dispatcher.close(); dispatcher.close();
} }
let hasOrigin = false; let hasOrigin = false;
for (const client of this[kClients].values()) { for (const k of this[kClients].keys()) {
if (client[kUrl].origin === dispatcher[kUrl].origin) { if (k === origin || k === `${origin}#http1-only`) {
hasOrigin = true; hasOrigin = true;
break; break;
} }
} }
if (!hasOrigin) { if (!hasOrigin) {
this[kOrigins].delete(dispatcher[kUrl].origin); this[kOrigins].delete(origin);
} }
}; };
dispatcher.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", (origin2, targets, err) => { dispatcher.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", (origin2, targets, err) => {
@@ -30576,7 +30756,7 @@ var require_socks5_proxy_agent = __commonJS({
var DispatcherBase = require_dispatcher_base2(); var DispatcherBase = require_dispatcher_base2();
var { InvalidArgumentError } = require_errors2(); var { InvalidArgumentError } = require_errors2();
var { Socks5Client, STATES } = require_socks5_client(); var { Socks5Client, STATES } = require_socks5_client();
var { kDispatch, kClose, kDestroy } = require_symbols6(); var { kBusy, kConnected, kDispatch, kClose, kDestroy } = require_symbols6();
var Pool = require_pool2(); var Pool = require_pool2();
var buildConnector = require_connect2(); var buildConnector = require_connect2();
var { debuglog } = require("node:util"); var { debuglog } = require("node:util");
@@ -30734,6 +30914,17 @@ var require_socks5_proxy_agent = __commonJS({
} }
}); });
this[kPools].set(originKey, pool); this[kPools].set(originKey, pool);
const closePoolIfUnused = () => {
if (this[kPools].get(originKey) !== pool || pool[kConnected] > 0 || pool[kBusy]) {
return;
}
this[kPools].delete(originKey);
if (!pool.destroyed) {
pool.close();
}
};
pool.on("disconnect", closePoolIfUnused);
pool.on("connectionError", closePoolIfUnused);
} }
return pool[kDispatch](opts, handler); return pool[kDispatch](opts, handler);
} catch (err) { } catch (err) {
@@ -31118,7 +31309,7 @@ var require_env_http_proxy_agent2 = __commonJS({
} }
#getProxyAgentForUrl(url) { #getProxyAgentForUrl(url) {
let { protocol, host: hostname, port } = url; let { protocol, host: hostname, port } = url;
hostname = hostname.replace(/:\d*$/, "").toLowerCase(); hostname = hostname.replace(/:\d*$/, "").replace(/^\[(.+)\]$/, "$1").toLowerCase();
port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0; port = Number.parseInt(port, 10) || DEFAULT_PORTS[protocol] || 0;
if (!this.#shouldProxy(hostname, port)) { if (!this.#shouldProxy(hostname, port)) {
return this[kNoProxyAgent]; return this[kNoProxyAgent];
@@ -31161,11 +31352,22 @@ var require_env_http_proxy_agent2 = __commonJS({
if (!entry) { if (!entry) {
continue; continue;
} }
const parsed = entry.match(/^(.+):(\d+)$/); let hostname, port;
const ipv6WithPort = entry.match(/^\[(.+)\]:(\d+)$/);
if (ipv6WithPort) {
hostname = ipv6WithPort[1];
port = Number.parseInt(ipv6WithPort[2], 10);
} else {
const unbracketed = entry.replace(/^\[(.+)\]$/, "$1");
const colonCount = (unbracketed.match(/:/g) || []).length;
const parsed = colonCount === 1 && unbracketed.match(/^(.+):(\d+)$/);
hostname = parsed ? parsed[1] : unbracketed;
port = parsed ? Number.parseInt(parsed[2], 10) : 0;
}
noProxyEntries.push({ noProxyEntries.push({
// strip leading dot or asterisk with dot // strip leading dot or asterisk with dot
hostname: (parsed ? parsed[1] : entry).replace(/^\*?\./, "").toLowerCase(), hostname: hostname.replace(/^\*?\./, "").toLowerCase(),
port: parsed ? Number.parseInt(parsed[2], 10) : 0 port
}); });
} }
this.#noProxyValue = noProxyValue; this.#noProxyValue = noProxyValue;
@@ -31199,7 +31401,24 @@ var require_retry_handler2 = __commonJS({
} = require_util9(); } = require_util9();
function calculateRetryAfterHeader(retryAfter) { function calculateRetryAfterHeader(retryAfter) {
const retryTime = new Date(retryAfter).getTime(); const retryTime = new Date(retryAfter).getTime();
return isNaN(retryTime) ? 0 : retryTime - Date.now(); return isNaN(retryTime) ? null : retryTime - Date.now();
}
function validatePartialResponseContentLength(headers, range, statusCode, retryCount) {
const contentLength = headers["content-length"];
if (contentLength == null) {
return;
}
if (!Number.isFinite(range.start) || !Number.isFinite(range.end)) {
return;
}
const length = Number(contentLength);
const expectedLength = range.end - range.start + 1;
if (!Number.isFinite(length) || length !== expectedLength) {
throw new RequestRetryError("Content-Length mismatch", statusCode, {
headers,
data: { count: retryCount }
});
}
} }
var RetryController = class { var RetryController = class {
constructor() { constructor() {
@@ -31366,10 +31585,14 @@ var require_retry_handler2 = __commonJS({
retryAfterHeader = Number(retryAfterHeader); retryAfterHeader = Number(retryAfterHeader);
retryAfterHeader = Number.isNaN(retryAfterHeader) ? calculateRetryAfterHeader(headers["retry-after"]) : retryAfterHeader * 1e3; retryAfterHeader = Number.isNaN(retryAfterHeader) ? calculateRetryAfterHeader(headers["retry-after"]) : retryAfterHeader * 1e3;
} }
const retryTimeout = retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout); const retryTimeout = retryAfterHeader === 0 ? 0 : retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout);
setTimeout(() => cb(null), retryTimeout); setTimeout(() => cb(null), retryTimeout);
} }
onResponseStart(controller, statusCode, headers, statusMessage) { onResponseStart(controller, statusCode, headers, statusMessage) {
if (statusCode < 200) {
this.handler.onResponseStart?.(this.controllerProxy, statusCode, headers, statusMessage);
return;
}
this.error = null; this.error = null;
this.retryCount += 1; this.retryCount += 1;
this.statusCode = statusCode; this.statusCode = statusCode;
@@ -31404,6 +31627,7 @@ var require_retry_handler2 = __commonJS({
data: { count: this.retryCount } data: { count: this.retryCount }
}); });
} }
validatePartialResponseContentLength(headers, contentRange, statusCode, this.retryCount);
const { start, size, end = size ? size - 1 : null } = contentRange; const { start, size, end = size ? size - 1 : null } = contentRange;
assert(this.start === start, "content-range mismatch"); assert(this.start === start, "content-range mismatch");
assert(this.end == null || this.end === end, "content-range mismatch"); assert(this.end == null || this.end === end, "content-range mismatch");
@@ -31412,7 +31636,7 @@ var require_retry_handler2 = __commonJS({
if (this.end == null) { if (this.end == null) {
if (statusCode === 206) { if (statusCode === 206) {
const range = parseRangeHeader(headers["content-range"]); const range = parseRangeHeader(headers["content-range"]);
if (range == null) { if (range == null || range.end == null) {
this.headersSent = true; this.headersSent = true;
this.handler.onResponseStart?.( this.handler.onResponseStart?.(
this.controllerProxy, this.controllerProxy,
@@ -31422,6 +31646,7 @@ var require_retry_handler2 = __commonJS({
); );
return; return;
} }
validatePartialResponseContentLength(headers, range, statusCode, this.retryCount);
const { start, size, end = size ? size - 1 : null } = range; const { start, size, end = size ? size - 1 : null } = range;
assert( assert(
start != null && Number.isFinite(start), start != null && Number.isFinite(start),
@@ -31431,7 +31656,7 @@ var require_retry_handler2 = __commonJS({
this.start = start; this.start = start;
this.end = end; this.end = end;
} }
if (this.end == null) { if (this.end == null && this.opts.method !== "HEAD") {
const contentLength = headers["content-length"]; const contentLength = headers["content-length"];
this.end = contentLength != null ? Number(contentLength) - 1 : null; this.end = contentLength != null ? Number(contentLength) - 1 : null;
} }
@@ -31632,7 +31857,6 @@ var require_readable2 = __commonJS({
var kContentLength = /* @__PURE__ */ Symbol("kContentLength"); var kContentLength = /* @__PURE__ */ Symbol("kContentLength");
var kUsed = /* @__PURE__ */ Symbol("kUsed"); var kUsed = /* @__PURE__ */ Symbol("kUsed");
var kBytesRead = /* @__PURE__ */ Symbol("kBytesRead"); var kBytesRead = /* @__PURE__ */ Symbol("kBytesRead");
var kPreservedBuffer = /* @__PURE__ */ Symbol("kPreservedBuffer");
var noop = () => { var noop = () => {
}; };
var BodyReadable = class extends Readable2 { var BodyReadable = class extends Readable2 {
@@ -31871,21 +32095,6 @@ var require_readable2 = __commonJS({
*/ */
setEncoding(encoding) { setEncoding(encoding) {
if (Buffer.isEncoding(encoding)) { if (Buffer.isEncoding(encoding)) {
const state = this._readableState;
const buffer = state.buffer;
if (buffer && state.length > 0) {
const bufferIndex = state.bufferIndex ?? 0;
const preserved = [];
const source = typeof buffer.slice === "function" ? buffer.slice(bufferIndex) : buffer;
for (const data of source) {
if (Buffer.isBuffer(data)) {
preserved.push(data);
}
}
if (preserved.length > 0) {
this[kPreservedBuffer] = (this[kPreservedBuffer] || []).concat(preserved);
}
}
super.setEncoding(encoding); super.setEncoding(encoding);
} }
return this; return this;
@@ -31936,13 +32145,7 @@ var require_readable2 = __commonJS({
return; return;
} }
const { _readableState: state } = consume2.stream; const { _readableState: state } = consume2.stream;
const preserved = consume2.stream[kPreservedBuffer]; if (state.bufferIndex) {
if (preserved && preserved.length > 0) {
for (const chunk of preserved) {
consumePush(consume2, chunk);
}
consume2.stream[kPreservedBuffer] = null;
} else if (state.bufferIndex) {
const start = state.bufferIndex; const start = state.bufferIndex;
const end = state.buffer.length; const end = state.buffer.length;
for (let n = start; n < end; n++) { for (let n = start; n < end; n++) {
@@ -31953,13 +32156,17 @@ var require_readable2 = __commonJS({
consumePush(consume2, chunk); consumePush(consume2, chunk);
} }
} }
if (state.endEmitted) { const decoder = state.decoder;
consumeEnd(this[kConsume], this._readableState.encoding); if (decoder != null && decoder.lastNeed > 0) {
} else { consumePush(consume2, Buffer.from(decoder.lastChar.subarray(0, decoder.lastTotal - decoder.lastNeed)));
consume2.stream.on("end", function() {
consumeEnd(this[kConsume], this._readableState.encoding);
});
} }
if (state.endEmitted) {
consumeEnd(consume2, state.encoding);
return;
}
consume2.stream.on("end", function() {
consumeEnd(this[kConsume], this._readableState.encoding);
});
consume2.stream.resume(); consume2.stream.resume();
while (consume2.stream.read() != null) { while (consume2.stream.read() != null) {
} }
@@ -32016,6 +32223,9 @@ var require_readable2 = __commonJS({
if (consume2.body === null) { if (consume2.body === null) {
return; return;
} }
if (typeof chunk === "string") {
chunk = Buffer.from(chunk, consume2.stream._readableState.encoding);
}
consume2.length += chunk.length; consume2.length += chunk.length;
consume2.body.push(chunk); consume2.body.push(chunk);
} }
@@ -33000,6 +33210,7 @@ var require_mock_utils2 = __commonJS({
} }
} = require("node:util"); } = require("node:util");
var { InvalidArgumentError } = require_errors2(); var { InvalidArgumentError } = require_errors2();
var requestAborted = /* @__PURE__ */ Symbol("request aborted");
function matchValue(match, value) { function matchValue(match, value) {
if (typeof match === "string") { if (typeof match === "string") {
return match === value; return match === value;
@@ -33112,6 +33323,8 @@ var require_mock_utils2 = __commonJS({
return data; return data;
} else if (data instanceof ArrayBuffer) { } else if (data instanceof ArrayBuffer) {
return data; return data;
} else if (ArrayBuffer.isView(data)) {
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
} else if (typeof data === "object") { } else if (typeof data === "object") {
return JSON.stringify(data); return JSON.stringify(data);
} else if (data) { } else if (data) {
@@ -33165,6 +33378,9 @@ var require_mock_utils2 = __commonJS({
} }
} }
function removeTrailingSlash(path) { function removeTrailingSlash(path) {
if (typeof path !== "string") {
return path;
}
while (path.endsWith("/")) { while (path.endsWith("/")) {
path = path.slice(0, -1); path = path.slice(0, -1);
} }
@@ -33213,17 +33429,43 @@ var require_mock_utils2 = __commonJS({
function mockDispatch(opts, handler) { function mockDispatch(opts, handler) {
const key = buildKey(opts); const key = buildKey(opts);
const mockDispatch2 = getMockDispatch(this[kDispatches], key); const mockDispatch2 = getMockDispatch(this[kDispatches], key);
const mockDispatches = this[kDispatches];
mockDispatch2.timesInvoked++; mockDispatch2.timesInvoked++;
if (mockDispatch2.data.callback) {
mockDispatch2.data = { ...mockDispatch2.data, ...mockDispatch2.data.callback(opts) };
}
const { data: { statusCode, data, headers, trailers, error: error2 }, delay, persist } = mockDispatch2;
const { timesInvoked, times } = mockDispatch2; const { timesInvoked, times } = mockDispatch2;
mockDispatch2.consumed = !persist && timesInvoked >= times; mockDispatch2.consumed = !mockDispatch2.persist && timesInvoked >= times;
mockDispatch2.pending = timesInvoked < times; mockDispatch2.pending = timesInvoked < times;
if (error2 !== null) { const hasBodyHooks = typeof handler.onBodySent === "function" || typeof handler.onRequestSent === "function";
deleteMockDispatch(this[kDispatches], key); if (mockDispatch2.data.callback && (!hasBodyHooks || opts.body == null)) {
handler.onResponseError(null, error2); const { callback, ...responseDefaults } = mockDispatch2.data;
const callbackResult = callback(opts);
if (isPromise(callbackResult)) {
callbackResult.then(
(resolvedData) => {
if (resolvedData == null || typeof resolvedData !== "object") {
handler.onResponseError(null, new InvalidArgumentError("reply options callback must return an object"));
return;
}
mockDispatch2.data = { ...responseDefaults, ...resolvedData };
dispatchMockReply(mockDispatches, mockDispatch2, key, opts, handler);
},
(error2) => {
handler.onResponseError(null, error2);
}
);
return true;
}
if (callbackResult == null || typeof callbackResult !== "object") {
throw new InvalidArgumentError("reply options callback must return an object");
}
mockDispatch2.data = { ...responseDefaults, ...callbackResult };
}
return dispatchMockReply(mockDispatches, mockDispatch2, key, opts, handler);
}
function dispatchMockReply(mockDispatches, mockDispatch2, key, opts, handler) {
const { data: response, delay } = mockDispatch2;
if (response.error !== null) {
deleteMockDispatch(mockDispatches, key);
handler.onResponseError(null, response.error);
return true; return true;
} }
let aborted = false; let aborted = false;
@@ -33250,39 +33492,172 @@ var require_mock_utils2 = __commonJS({
handler.onResponseError?.(controller, reason); handler.onResponseError?.(controller, reason);
} }
}; };
let replyOpts = opts;
const dispatches = mockDispatches;
handler.onRequestStart?.(controller, null); handler.onRequestStart?.(controller, null);
if (typeof delay === "number" && delay > 0) { if (aborted) {
timer = setTimeout(() => { return true;
timer = null;
handleReply(this[kDispatches]);
}, delay);
} else {
handleReply(this[kDispatches]);
} }
function handleReply(mockDispatches, _data = data) { const requestBody = dispatchRequestBody(opts.body, handler, controller, () => aborted);
if (isPromise(requestBody)) {
requestBody.then((body) => {
if (body === requestAborted) {
return;
}
if (body !== opts.body) {
replyOpts = { ...opts, body };
}
sendReply();
}, (error2) => controller.abort(error2));
return true;
}
if (requestBody === requestAborted) {
return true;
}
if (requestBody !== opts.body) {
replyOpts = { ...opts, body: requestBody };
}
sendReply();
function sendReply() {
if (response.callback) {
const { callback, ...responseDefaults } = response;
let callbackResult;
try {
callbackResult = callback(replyOpts);
} catch (err) {
deleteMockDispatch(mockDispatches, key);
handler.onResponseError(null, err);
return;
}
if (isPromise(callbackResult)) {
callbackResult.then(
(resolvedData) => {
if (resolvedData == null || typeof resolvedData !== "object") {
handler.onResponseError(null, new InvalidArgumentError("reply options callback must return an object"));
return;
}
mockDispatch2.data = { ...responseDefaults, ...resolvedData };
handleReply(dispatches, mockDispatch2.data);
},
(err) => {
handler.onResponseError(null, err);
}
);
return;
}
if (callbackResult == null || typeof callbackResult !== "object") {
throw new InvalidArgumentError("reply options callback must return an object");
}
mockDispatch2.data = { ...responseDefaults, ...callbackResult };
handleReply(dispatches, mockDispatch2.data);
return;
}
if (typeof delay === "number" && delay > 0) {
timer = setTimeout(() => {
timer = null;
handleReply(dispatches);
}, delay);
} else {
handleReply(dispatches);
}
}
function handleReply(mockDispatches2, _response = response) {
if (aborted) { if (aborted) {
return; return;
} }
const { statusCode, data, headers, trailers } = _response;
const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers;
const body = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data; const body = typeof data === "function" ? data({ ...replyOpts, headers: optsHeaders }) : data;
if (isPromise(body)) { if (isPromise(body)) {
return body.then((newData) => handleReply(mockDispatches, newData)); return body.then((newData) => handleReply(mockDispatches2, { ..._response, data: newData }));
} }
if (aborted) { if (aborted) {
return; return;
} }
const responseData = getResponseData(body); const responseData = getResponseData(body);
const responseHeaders = generateKeyValues(headers); const responseHeaders = generateKeyValues(headers ?? {});
const responseTrailers = generateKeyValues(trailers); const responseTrailers = generateKeyValues(trailers ?? {});
controller.rawHeaders = responseHeaders; controller.rawHeaders = responseHeaders;
controller.rawTrailers = responseTrailers; controller.rawTrailers = responseTrailers;
handler.onResponseStart?.(controller, statusCode, parseHeaders(responseHeaders), getStatusText(statusCode)); handler.onResponseStart?.(controller, statusCode, parseHeaders(responseHeaders), getStatusText(statusCode));
handler.onResponseData?.(controller, Buffer.from(responseData)); handler.onResponseData?.(controller, Buffer.from(responseData));
handler.onResponseEnd?.(controller, parseHeaders(responseTrailers)); handler.onResponseEnd?.(controller, parseHeaders(responseTrailers));
deleteMockDispatch(mockDispatches, key); deleteMockDispatch(mockDispatches2, key);
} }
return true; return true;
} }
function dispatchRequestBody(body, handler, controller, isAborted) {
if (typeof handler.onBodySent !== "function" && typeof handler.onRequestSent !== "function") {
return body;
}
if (body == null) {
return callOnRequestSent(handler, controller, isAborted) ? body : requestAborted;
}
if (body && typeof body[Symbol.asyncIterator] === "function") {
return dispatchAsyncIterableBody(body, handler, controller, isAborted);
}
if (isIterableBody(body)) {
const chunks = [];
for (const chunk of body) {
if (isAborted()) {
return requestAborted;
}
chunks.push(chunk);
if (!callOnBodySent(handler, controller, chunk) || isAborted()) {
return requestAborted;
}
}
return callOnRequestSent(handler, controller, isAborted) ? chunks : requestAborted;
}
if (isAborted()) {
return requestAborted;
}
if (!callOnBodySent(handler, controller, body)) {
return requestAborted;
}
return callOnRequestSent(handler, controller, isAborted) ? body : requestAborted;
}
async function dispatchAsyncIterableBody(body, handler, controller, isAborted) {
const chunks = [];
for await (const chunk of body) {
if (isAborted()) {
return requestAborted;
}
chunks.push(chunk);
if (!callOnBodySent(handler, controller, chunk) || isAborted()) {
return requestAborted;
}
}
if (!callOnRequestSent(handler, controller, isAborted)) {
return requestAborted;
}
return {
async *[Symbol.asyncIterator]() {
yield* chunks;
}
};
}
function callOnBodySent(handler, controller, chunk) {
try {
handler.onBodySent?.(chunk);
return true;
} catch (error2) {
controller.abort(error2);
return false;
}
}
function callOnRequestSent(handler, controller, isAborted) {
try {
handler.onRequestSent?.();
return !isAborted();
} catch (error2) {
controller.abort(error2);
return false;
}
}
function isIterableBody(body) {
return typeof body !== "string" && !Buffer.isBuffer(body) && !ArrayBuffer.isView(body) && typeof body[Symbol.iterator] === "function";
}
function buildMockDispatch() { function buildMockDispatch() {
const agent = this[kMockAgent]; const agent = this[kMockAgent];
const origin = this[kOrigin]; const origin = this[kOrigin];
@@ -33383,6 +33758,11 @@ var require_mock_interceptor2 = __commonJS({
} = require_mock_symbols2(); } = require_mock_symbols2();
var { InvalidArgumentError } = require_errors2(); var { InvalidArgumentError } = require_errors2();
var { serializePathWithQuery } = require_util9(); var { serializePathWithQuery } = require_util9();
var {
types: {
isPromise
}
} = require("node:util");
var MockScope = class { var MockScope = class {
constructor(mockDispatch) { constructor(mockDispatch) {
this[kMockDispatch] = mockDispatch; this[kMockDispatch] = mockDispatch;
@@ -33464,8 +33844,7 @@ var require_mock_interceptor2 = __commonJS({
*/ */
reply(replyOptionsCallbackOrStatusCode) { reply(replyOptionsCallbackOrStatusCode) {
if (typeof replyOptionsCallbackOrStatusCode === "function") { if (typeof replyOptionsCallbackOrStatusCode === "function") {
const wrappedDefaultsCallback = (opts) => { const resolveReplyCallbackData = (resolvedData) => {
const resolvedData = replyOptionsCallbackOrStatusCode(opts);
if (typeof resolvedData !== "object" || resolvedData === null) { if (typeof resolvedData !== "object" || resolvedData === null) {
throw new InvalidArgumentError("reply options callback must return an object"); throw new InvalidArgumentError("reply options callback must return an object");
} }
@@ -33475,6 +33854,13 @@ var require_mock_interceptor2 = __commonJS({
...this.createMockScopeDispatchData(replyParameters2) ...this.createMockScopeDispatchData(replyParameters2)
}; };
}; };
const wrappedDefaultsCallback = (opts) => {
const resolvedData = replyOptionsCallbackOrStatusCode(opts);
if (isPromise(resolvedData)) {
return resolvedData.then(resolveReplyCallbackData);
}
return resolveReplyCallbackData(resolvedData);
};
const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] }); const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] });
return new MockScope(newMockDispatch2); return new MockScope(newMockDispatch2);
} }
@@ -34863,6 +35249,7 @@ var require_global4 = __commonJS({
var { InvalidArgumentError } = require_errors2(); var { InvalidArgumentError } = require_errors2();
var Agent = require_agent2(); var Agent = require_agent2();
var Dispatcher1Wrapper = require_dispatcher1_wrapper(); var Dispatcher1Wrapper = require_dispatcher1_wrapper();
var fallbackDispatcher;
if (getGlobalDispatcher() === void 0) { if (getGlobalDispatcher() === void 0) {
setGlobalDispatcher(new Agent()); setGlobalDispatcher(new Agent());
} }
@@ -34870,22 +35257,36 @@ var require_global4 = __commonJS({
if (!agent || typeof agent.dispatch !== "function") { if (!agent || typeof agent.dispatch !== "function") {
throw new InvalidArgumentError("Argument agent must implement Agent"); throw new InvalidArgumentError("Argument agent must implement Agent");
} }
Object.defineProperty(globalThis, globalDispatcher, { try {
value: agent, Object.defineProperty(globalThis, globalDispatcher, {
writable: true, value: agent,
enumerable: false, writable: true,
configurable: false enumerable: false,
}); configurable: false
const legacyAgent = agent instanceof Dispatcher1Wrapper ? agent : new Dispatcher1Wrapper(agent); });
Object.defineProperty(globalThis, legacyGlobalDispatcher, { } catch (err) {
value: legacyAgent, if (err instanceof TypeError) {
writable: true, fallbackDispatcher = agent;
enumerable: false, return;
configurable: false }
}); throw err;
}
try {
const legacyAgent = agent instanceof Dispatcher1Wrapper ? agent : new Dispatcher1Wrapper(agent);
Object.defineProperty(globalThis, legacyGlobalDispatcher, {
value: legacyAgent,
writable: true,
enumerable: false,
configurable: false
});
} catch (err) {
if (!(err instanceof TypeError)) {
throw err;
}
}
} }
function getGlobalDispatcher() { function getGlobalDispatcher() {
return globalThis[globalDispatcher]; return globalThis[globalDispatcher] ?? fallbackDispatcher;
} }
var installedExports = ( var installedExports = (
/** @type {const} */ /** @type {const} */
@@ -35011,12 +35412,14 @@ var require_redirect_handler2 = __commonJS({
if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) {
throw new Error("max redirects"); throw new Error("max redirects");
} }
let removeContentHeaders = statusCode === 303;
if ((statusCode === 301 || statusCode === 302) && this.opts.method === "POST") { if ((statusCode === 301 || statusCode === 302) && this.opts.method === "POST") {
this.opts.method = "GET"; this.opts.method = "GET";
if (util.isStream(this.opts.body)) { if (util.isStream(this.opts.body)) {
util.destroy(this.opts.body.on("error", noop)); util.destroy(this.opts.body.on("error", noop));
} }
this.opts.body = null; this.opts.body = null;
removeContentHeaders = true;
} }
if (statusCode === 303 && this.opts.method !== "HEAD") { if (statusCode === 303 && this.opts.method !== "HEAD") {
this.opts.method = "GET"; this.opts.method = "GET";
@@ -35041,7 +35444,7 @@ var require_redirect_handler2 = __commonJS({
throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`); throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`);
} }
} }
this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin, this.stripHeadersOnRedirect, this.stripHeadersOnCrossOriginRedirect); this.opts.headers = cleanRequestHeaders(this.opts.headers, removeContentHeaders, this.opts.origin !== origin, this.stripHeadersOnRedirect, this.stripHeadersOnCrossOriginRedirect);
this.opts.path = path; this.opts.path = path;
this.opts.origin = origin; this.opts.origin = origin;
this.opts.query = null; this.opts.query = null;
@@ -35782,24 +36185,146 @@ var require_cache2 = __commonJS({
var { var {
safeHTTPMethods, safeHTTPMethods,
pathHasQueryOrFragment, pathHasQueryOrFragment,
hasSafeIterator hasSafeIterator,
isValidHTTPToken
} = require_util9(); } = require_util9();
var { serializePathWithQuery } = require_util9(); var { serializePathWithQuery } = require_util9();
function makeCacheKey(opts) { var MAX_DELTA_SECONDS = 2147483647;
if (!opts.origin) { var RESTRICTIVE_DIRECTIVE_NAMES = ["no-store", "private", "no-cache"];
throw new Error("opts.origin is undefined"); var kInvalidCacheControlDirectives = /* @__PURE__ */ Symbol("invalid cache-control directives");
function trimOWS(value) {
return value.replace(/^[\t ]+|[\t ]+$/g, "");
}
function arrayIncludes(array, value) {
for (let i = 0; i < array.length; i++) {
if (array[i] === value) {
return true;
}
} }
return false;
}
function trimOWSStart(value) {
return value.replace(/^[\t ]+/, "");
}
function trimOWSEnd(value) {
return value.replace(/[\t ]+$/, "");
}
function findUnescapedQuote(value, start) {
let escaped = false;
for (let i = start; i < value.length; i++) {
if (escaped) {
escaped = false;
} else if (value[i] === "\\") {
escaped = true;
} else if (value[i] === '"') {
return i;
}
}
return -1;
}
function splitCacheControlHeaderValue(value) {
const directives = [];
let start = 0;
let quoteStart = -1;
let inQuote = false;
let escaped = false;
for (let i = 0; i < value.length; i++) {
if (inQuote) {
if (escaped) {
escaped = false;
} else if (value[i] === "\\") {
escaped = true;
} else if (value[i] === '"') {
inQuote = false;
quoteStart = -1;
}
} else if (value[i] === '"') {
inQuote = true;
quoteStart = i;
} else if (value[i] === ",") {
directives.push({ value: value.substring(start, i), fromMalformedQuote: false });
start = i + 1;
}
}
if (!inQuote) {
directives.push({ value: value.substring(start), fromMalformedQuote: false });
return directives;
}
const tail = value.substring(start);
const quoteOffset = quoteStart - start;
let tailStart = 0;
for (let i = 0; i < tail.length; i++) {
if (tail[i] === ",") {
directives.push({
value: tail.substring(tailStart, i),
fromMalformedQuote: tailStart > quoteOffset
});
tailStart = i + 1;
}
}
directives.push({
value: tail.substring(tailStart),
fromMalformedQuote: tailStart > quoteOffset
});
return directives;
}
function markInvalidCacheControlDirective(directives, key) {
let invalidDirectives = directives[kInvalidCacheControlDirectives];
if (invalidDirectives === void 0) {
invalidDirectives = /* @__PURE__ */ new Set();
Object.defineProperty(directives, kInvalidCacheControlDirectives, {
value: invalidDirectives
});
}
invalidDirectives.add(key);
}
function hasInvalidCacheControlDirective(directives, key) {
return directives[kInvalidCacheControlDirectives]?.has(key) === true;
}
function getMalformedRestrictiveDirectiveName(key) {
for (const directiveName of RESTRICTIVE_DIRECTIVE_NAMES) {
if (key.startsWith(directiveName) && key.length > directiveName.length && !isValidHTTPToken(key[directiveName.length])) {
return directiveName;
}
}
let tokenOnlyKey = "";
let hasInvalidTokenChar = false;
for (let i = 0; i < key.length; i++) {
if (isValidHTTPToken(key[i])) {
tokenOnlyKey += key[i];
} else {
hasInvalidTokenChar = true;
}
}
if (hasInvalidTokenChar && arrayIncludes(RESTRICTIVE_DIRECTIVE_NAMES, tokenOnlyKey)) {
return tokenOnlyKey;
}
}
function makeCacheKey(opts) {
const origin = opts.origin ? opts.origin.toString() : "";
let fullPath = opts.path || "/"; let fullPath = opts.path || "/";
if (opts.query && !pathHasQueryOrFragment(fullPath)) { if (opts.query && !pathHasQueryOrFragment(fullPath)) {
fullPath = serializePathWithQuery(fullPath, opts.query); fullPath = serializePathWithQuery(fullPath, opts.query);
} }
return { return {
origin: opts.origin.toString(), origin,
method: opts.method, method: opts.method,
path: fullPath, path: fullPath,
headers: opts.headers headers: opts.headers
}; };
} }
function appendHeader(headers, key, val) {
const headerName = key.toLowerCase();
const current = headers[headerName];
const values = Array.isArray(val) ? val : [val];
if (current === void 0) {
headers[headerName] = Array.isArray(val) ? val.slice() : val;
} else if (Array.isArray(current)) {
current.push(...values);
} else {
headers[headerName] = [current, ...values];
}
}
function normalizeHeaders(opts) { function normalizeHeaders(opts) {
let headers; let headers;
if (opts.headers == null) { if (opts.headers == null) {
@@ -35807,19 +36332,57 @@ var require_cache2 = __commonJS({
} else if (typeof opts.headers === "object") { } else if (typeof opts.headers === "object") {
headers = {}; headers = {};
if (hasSafeIterator(opts.headers)) { if (hasSafeIterator(opts.headers)) {
for (const x of opts.headers) { if (Array.isArray(opts.headers)) {
if (!Array.isArray(x)) { const first = opts.headers[0];
throw new Error("opts.headers is not a valid header map"); if (Array.isArray(first)) {
for (const x of opts.headers) {
if (!Array.isArray(x)) {
throw new Error("opts.headers is not a valid header map");
}
const [key, val] = x;
if (typeof key !== "string" || typeof val !== "string") {
throw new Error("opts.headers is not a valid header map");
}
appendHeader(headers, key, val);
}
} else {
const len = opts.headers.length;
if (len % 2 !== 0) {
throw new Error("opts.headers is not a valid header map");
}
for (let i = 0; i < len; i += 2) {
const key = opts.headers[i];
const val = opts.headers[i + 1];
if (typeof key !== "string" || typeof val !== "string" && !Array.isArray(val)) {
throw new Error("opts.headers is not a valid header map");
}
if (typeof val === "string") {
appendHeader(headers, key, val);
} else {
const mapped = [];
for (let j = 0; j < val.length; j++) {
const v = val[j];
mapped.push(typeof v === "string" ? v : v.toString("latin1"));
}
appendHeader(headers, key, mapped);
}
}
} }
const [key, val] = x; } else {
if (typeof key !== "string" || typeof val !== "string") { for (const x of opts.headers) {
throw new Error("opts.headers is not a valid header map"); if (!Array.isArray(x)) {
throw new Error("opts.headers is not a valid header map");
}
const [key, val] = x;
if (typeof key !== "string" || typeof val !== "string") {
throw new Error("opts.headers is not a valid header map");
}
appendHeader(headers, key, val);
} }
headers[key.toLowerCase()] = val;
} }
} else { } else {
for (const key of Object.keys(opts.headers)) { for (const key of Object.keys(opts.headers)) {
headers[key.toLowerCase()] = opts.headers[key]; appendHeader(headers, key, opts.headers[key]);
} }
} }
} else { } else {
@@ -35864,25 +36427,32 @@ var require_cache2 = __commonJS({
} }
function parseCacheControlHeader(header) { function parseCacheControlHeader(header) {
const output = {}; const output = {};
let directives; const invalidNumericDirectives = /* @__PURE__ */ new Set();
if (Array.isArray(header)) { const invalidNoArgumentDirectives = /* @__PURE__ */ new Set();
directives = []; const directives = splitCacheControlHeaderValue(Array.isArray(header) ? header.join(",") : header);
for (const directive of header) {
directives.push(...directive.split(","));
}
} else {
directives = header.split(",");
}
for (let i = 0; i < directives.length; i++) { for (let i = 0; i < directives.length; i++) {
const directive = directives[i].toLowerCase(); const directiveRecord = directives[i];
const directive = directiveRecord.value.toLowerCase();
const fromMalformedQuote = directiveRecord.fromMalformedQuote;
const keyValueDelimiter = directive.indexOf("="); const keyValueDelimiter = directive.indexOf("=");
let key; let key;
let value; let value;
let keyHasTrailingWhitespace = false;
let valueHasLeadingWhitespace = false;
if (keyValueDelimiter !== -1) { if (keyValueDelimiter !== -1) {
key = directive.substring(0, keyValueDelimiter).trimStart(); const rawKey = directive.substring(0, keyValueDelimiter);
value = directive.substring(keyValueDelimiter + 1); const rawValue = directive.substring(keyValueDelimiter + 1);
keyHasTrailingWhitespace = trimOWSEnd(rawKey) !== rawKey;
valueHasLeadingWhitespace = trimOWSStart(rawValue) !== rawValue;
key = trimOWS(rawKey);
value = trimOWSStart(rawValue);
} else { } else {
key = directive.trim(); key = trimOWS(directive);
}
const malformedRestrictiveDirectiveName = getMalformedRestrictiveDirectiveName(key);
if (malformedRestrictiveDirectiveName !== void 0) {
output[malformedRestrictiveDirectiveName] = true;
continue;
} }
switch (key) { switch (key) {
case "min-fresh": case "min-fresh":
@@ -35891,48 +36461,85 @@ var require_cache2 = __commonJS({
case "s-maxage": case "s-maxage":
case "stale-while-revalidate": case "stale-while-revalidate":
case "stale-if-error": { case "stale-if-error": {
if (value === void 0 || value[0] === " ") { if (fromMalformedQuote || invalidNumericDirectives.has(key)) {
continue;
}
if (value === void 0 || keyHasTrailingWhitespace || valueHasLeadingWhitespace) {
delete output[key];
invalidNumericDirectives.add(key);
markInvalidCacheControlDirective(output, key);
continue; continue;
} }
if (value.length >= 2 && value[0] === '"' && value[value.length - 1] === '"') { if (value.length >= 2 && value[0] === '"' && value[value.length - 1] === '"') {
value = value.substring(1, value.length - 1); value = value.substring(1, value.length - 1);
} }
const parsedValue = parseInt(value, 10); if (!/^[0-9]+$/.test(value)) {
if (parsedValue !== parsedValue) { delete output[key];
invalidNumericDirectives.add(key);
markInvalidCacheControlDirective(output, key);
continue; continue;
} }
if (key === "max-age" && key in output && output[key] >= parsedValue) { const parsedValue = Math.min(parseInt(value, 10), MAX_DELTA_SECONDS);
continue; if (key === "min-fresh") {
if (!(key in output) || output[key] < parsedValue) {
output[key] = parsedValue;
}
} else if (!(key in output) || output[key] > parsedValue) {
output[key] = parsedValue;
} }
output[key] = parsedValue;
break; break;
} }
case "private": case "private":
case "no-cache": { case "no-cache": {
if (fromMalformedQuote) {
output[key] = true;
break;
}
if (value !== void 0 && value.length === 0) {
output[key] = true;
break;
}
if (value) { if (value) {
if (value[0] === '"') { if (value[0] === '"') {
const headers = [value.substring(1)]; value = trimOWSEnd(value);
let foundEndingQuote = value[value.length - 1] === '"'; let fieldList = "";
if (!foundEndingQuote) { let lastQuotedPart = i;
let foundEndingQuote = false;
const closingQuote = findUnescapedQuote(value, 1);
if (closingQuote !== -1) {
fieldList = value.substring(1, closingQuote);
foundEndingQuote = true;
} else {
const fieldListParts = [value.substring(1)];
for (let j = i + 1; j < directives.length; j++) { for (let j = i + 1; j < directives.length; j++) {
const nextPart = directives[j]; const nextPart = trimOWS(directives[j].value);
const nextPartLength = nextPart.length; const closingQuote2 = findUnescapedQuote(nextPart, 0);
headers.push(nextPart.trim()); lastQuotedPart = j;
if (nextPartLength !== 0 && nextPart[nextPartLength - 1] === '"') { if (closingQuote2 !== -1) {
fieldListParts.push(nextPart.substring(0, closingQuote2));
foundEndingQuote = true; foundEndingQuote = true;
break; break;
} }
fieldListParts.push(nextPart);
}
fieldList = fieldListParts.join(",");
}
if (!foundEndingQuote) {
output[key] = true;
break;
}
i = lastQuotedPart;
const headers = fieldList.split(",");
let validFieldNames = true;
for (let j = 0; j < headers.length; j++) {
headers[j] = trimOWS(headers[j]);
if (!isValidHTTPToken(headers[j])) {
validFieldNames = false;
} }
} }
if (foundEndingQuote) { if (!validFieldNames) {
let lastHeader = headers[headers.length - 1]; output[key] = true;
if (lastHeader[lastHeader.length - 1] === '"') { } else if (output[key] !== true) {
lastHeader = lastHeader.substring(0, lastHeader.length - 1);
headers[headers.length - 1] = lastHeader;
}
for (let j = 0; j < headers.length; j++) {
headers[j] = headers[j].trim();
}
if (key in output) { if (key in output) {
output[key] = output[key].concat(headers); output[key] = output[key].concat(headers);
} else { } else {
@@ -35940,11 +36547,15 @@ var require_cache2 = __commonJS({
} }
} }
} else { } else {
const fieldName = value.trim(); const fieldName = trimOWS(value);
if (key in output) { if (!isValidHTTPToken(fieldName)) {
output[key] = output[key].concat(fieldName); output[key] = true;
} else { } else if (output[key] !== true) {
output[key] = [fieldName]; if (key in output) {
output[key] = output[key].concat(fieldName);
} else {
output[key] = [fieldName];
}
} }
} }
break; break;
@@ -35952,16 +36563,23 @@ var require_cache2 = __commonJS({
} }
// eslint-disable-next-line no-fallthrough // eslint-disable-next-line no-fallthrough
case "public": case "public":
case "no-store":
case "must-revalidate": case "must-revalidate":
case "proxy-revalidate": case "proxy-revalidate":
case "immutable": case "immutable":
case "no-transform": case "no-transform":
case "must-understand": case "must-understand":
case "only-if-cached": case "only-if-cached":
if (value) { if (fromMalformedQuote || invalidNoArgumentDirectives.has(key)) {
continue; continue;
} }
if (value !== void 0) {
delete output[key];
invalidNoArgumentDirectives.add(key);
continue;
}
output[key] = true;
break;
case "no-store":
output[key] = true; output[key] = true;
break; break;
default: default:
@@ -35970,21 +36588,51 @@ var require_cache2 = __commonJS({
} }
return output; return output;
} }
function splitVaryHeader(varyHeader) {
const values = Array.isArray(varyHeader) ? varyHeader : [varyHeader];
const output = [];
for (let i = 0; i < values.length; i++) {
const parts = values[i].split(",");
for (let j = 0; j < parts.length; j++) {
output.push(parts[j]);
}
}
return output;
}
function hasVaryStar(varyHeader) {
const values = splitVaryHeader(varyHeader);
for (let i = 0; i < values.length; i++) {
if (trimOWS(values[i]).indexOf("*") !== -1) {
return true;
}
}
return false;
}
function parseVaryHeader(varyHeader, headers) { function parseVaryHeader(varyHeader, headers) {
if (typeof varyHeader === "string" && varyHeader.includes("*")) { if (hasVaryStar(varyHeader)) {
return headers; return headers;
} }
const output = ( const output = (
/** @type {Record<string, string | string[] | null>} */ /** @type {Record<string, string | string[] | null>} */
{} {}
); );
const varyingHeaders = typeof varyHeader === "string" ? varyHeader.split(",") : varyHeader; const varyingHeaders = splitVaryHeader(varyHeader);
for (const header of varyingHeaders) { for (const header of varyingHeaders) {
const trimmedHeader = header.trim().toLowerCase(); const trimmedHeader = trimOWS(header).toLowerCase();
output[trimmedHeader] = headers[trimmedHeader] ?? null; if (trimmedHeader.length === 0) {
continue;
}
if (!isValidHTTPToken(trimmedHeader)) {
return void 0;
}
const headerValue = headers[trimmedHeader];
output[trimmedHeader] = Array.isArray(headerValue) ? headerValue.slice() : headerValue ?? null;
} }
return output; return output;
} }
function isInvalidOrWildcardVaryHeader(varyHeader) {
return hasVaryStar(varyHeader) || parseVaryHeader(varyHeader, {}) === void 0;
}
function isEtagUsable(etag) { function isEtagUsable(etag) {
if (etag.length <= 2) { if (etag.length <= 2) {
return false; return false;
@@ -36015,7 +36663,7 @@ var require_cache2 = __commonJS({
throw new TypeError(`${name} needs to have at least one method`); throw new TypeError(`${name} needs to have at least one method`);
} }
for (const method of methods) { for (const method of methods) {
if (!safeHTTPMethods.includes(method)) { if (!arrayIncludes(safeHTTPMethods, method)) {
throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(", ")}, got ${method}`); throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(", ")}, got ${method}`);
} }
} }
@@ -36039,7 +36687,10 @@ var require_cache2 = __commonJS({
assertCacheKey, assertCacheKey,
assertCacheValue, assertCacheValue,
parseCacheControlHeader, parseCacheControlHeader,
hasInvalidCacheControlDirective,
parseVaryHeader, parseVaryHeader,
hasVaryStar,
isInvalidOrWildcardVaryHeader,
isEtagUsable, isEtagUsable,
assertCacheMethods, assertCacheMethods,
assertCacheStore, assertCacheStore,
@@ -36062,6 +36713,13 @@ var require_date = __commonJS({
return parseRfc850Date(date); return parseRfc850Date(date);
} }
} }
function makeDate(year, monthIdx, day, hour, minute, second, weekday) {
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second));
if (year >= 0 && year <= 99) {
result.setUTCFullYear(year);
}
return result.getUTCFullYear() === year && result.getUTCMonth() === monthIdx && result.getUTCDate() === day && result.getUTCHours() === hour && result.getUTCMinutes() === minute && result.getUTCSeconds() === second && result.getUTCDay() === weekday ? result : void 0;
}
function parseImfDate(date) { function parseImfDate(date) {
if (date.length !== 29 || date[4] !== " " || date[7] !== " " || date[11] !== " " || date[16] !== " " || date[19] !== ":" || date[22] !== ":" || date[25] !== " " || date[26] !== "G" || date[27] !== "M" || date[28] !== "T") { if (date.length !== 29 || date[4] !== " " || date[7] !== " " || date[11] !== " " || date[16] !== " " || date[19] !== ":" || date[22] !== ":" || date[25] !== " " || date[26] !== "G" || date[27] !== "M" || date[28] !== "T") {
return void 0; return void 0;
@@ -36222,8 +36880,7 @@ var require_date = __commonJS({
} }
second = (code1 - 48) * 10 + (code2 - 48); second = (code1 - 48) * 10 + (code2 - 48);
} }
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); return makeDate(year, monthIdx, day, hour, minute, second, weekday);
return result.getUTCDay() === weekday ? result : void 0;
} }
function parseAscTimeDate(date) { function parseAscTimeDate(date) {
if (date.length !== 24 || date[7] !== " " || date[10] !== " " || date[19] !== " ") { if (date.length !== 24 || date[7] !== " " || date[10] !== " " || date[19] !== " ") {
@@ -36385,8 +37042,7 @@ var require_date = __commonJS({
return void 0; return void 0;
} }
const year = (yearDigit1 - 48) * 1e3 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48); const year = (yearDigit1 - 48) * 1e3 + (yearDigit2 - 48) * 100 + (yearDigit3 - 48) * 10 + (yearDigit4 - 48);
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); return makeDate(year, monthIdx, day, hour, minute, second, weekday);
return result.getUTCDay() === weekday ? result : void 0;
} }
function parseRfc850Date(date) { function parseRfc850Date(date) {
let commaIndex = -1; let commaIndex = -1;
@@ -36535,8 +37191,7 @@ var require_date = __commonJS({
} }
second = (code1 - 48) * 10 + (code2 - 48); second = (code1 - 48) * 10 + (code2 - 48);
} }
const result = new Date(Date.UTC(year, monthIdx, day, hour, minute, second)); return makeDate(year, monthIdx, day, hour, minute, second, weekday);
return result.getUTCDay() === weekday ? result : void 0;
} }
module2.exports = { module2.exports = {
parseHttpDate parseHttpDate
@@ -36551,7 +37206,10 @@ var require_cache_handler = __commonJS({
var util = require_util9(); var util = require_util9();
var { var {
parseCacheControlHeader, parseCacheControlHeader,
hasInvalidCacheControlDirective,
parseVaryHeader, parseVaryHeader,
hasVaryStar,
isInvalidOrWildcardVaryHeader,
isEtagUsable isEtagUsable
} = require_cache2(); } = require_cache2();
var { parseHttpDate } = require_date(); var { parseHttpDate } = require_date();
@@ -36575,6 +37233,79 @@ var require_cache_handler = __commonJS({
206 206
]; ];
var MAX_RESPONSE_AGE = 2147483647e3; var MAX_RESPONSE_AGE = 2147483647e3;
var REVALIDATION_ONLY_RETENTION = 864e5;
function trimOWS(value) {
return value.replace(/^[\t ]+|[\t ]+$/g, "");
}
function arrayIncludes(array, value) {
for (let i = 0; i < array.length; i++) {
if (array[i] === value) {
return true;
}
}
return false;
}
function appendConnectionHeaderTokens(headersToRemove, connectionHeader) {
const values = Array.isArray(connectionHeader) ? connectionHeader : [connectionHeader];
for (let i = 0; i < values.length; i++) {
const tokens = values[i].split(",");
for (let j = 0; j < tokens.length; j++) {
headersToRemove.push(trimOWS(tokens[j]).toLowerCase());
}
}
}
function getSameOriginPath(cacheKey, location) {
if (typeof location !== "string") {
return void 0;
}
let originUrl;
let requestUrl;
let locationUrl;
try {
originUrl = new URL(cacheKey.origin);
requestUrl = new URL(cacheKey.path, originUrl);
locationUrl = new URL(location, requestUrl);
} catch {
return void 0;
}
if (locationUrl.origin !== originUrl.origin) {
return void 0;
}
return locationUrl.pathname + locationUrl.search;
}
function deleteCachedUri(store, cacheKey, path) {
deleteCachedValue(store, {
...cacheKey,
path
});
for (let i = 0; i < util.safeHTTPMethods.length; i++) {
const method = util.safeHTTPMethods[i];
if (method !== cacheKey.method) {
deleteCachedValue(store, {
...cacheKey,
method,
path
});
}
}
}
function deleteLocationTargets(store, cacheKey, headerValue) {
if (headerValue === void 0) {
return;
}
const values = Array.isArray(headerValue) ? headerValue : [headerValue];
for (let i = 0; i < values.length; i++) {
const path = getSameOriginPath(cacheKey, values[i]);
if (path !== void 0) {
deleteCachedUri(store, cacheKey, path);
}
}
}
function invalidateUnsafeRequest(store, cacheKey, resHeaders) {
deleteCachedUri(store, cacheKey, cacheKey.path);
deleteLocationTargets(store, cacheKey, resHeaders.location);
deleteLocationTargets(store, cacheKey, resHeaders["content-location"]);
}
var CacheHandler = class { var CacheHandler = class {
/** /**
* @type {import('../../types/cache-interceptor.d.ts').default.CacheKey} * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey}
@@ -36634,35 +37365,51 @@ var require_cache_handler = __commonJS({
statusMessage statusMessage
); );
const handler = this; const handler = this;
if (!util.safeHTTPMethods.includes(this.#cacheKey.method) && statusCode >= 200 && statusCode <= 399) { if (!arrayIncludes(util.safeHTTPMethods, this.#cacheKey.method) && statusCode >= 200 && statusCode <= 399) {
try { invalidateUnsafeRequest(this.#store, this.#cacheKey, resHeaders);
this.#store.delete(this.#cacheKey)?.catch?.(noop);
} catch {
}
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
const cacheControlHeader = resHeaders["cache-control"]; const cacheControlHeader = resHeaders["cache-control"];
const heuristicallyCacheable = resHeaders["last-modified"] && HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode); const heuristicallyCacheable = resHeaders["last-modified"] && arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES, statusCode);
if (!cacheControlHeader && !resHeaders["expires"] && !heuristicallyCacheable && !this.#cacheByDefault) { if (!cacheControlHeader && !resHeaders["expires"] && !heuristicallyCacheable && !this.#cacheByDefault) {
if (statusCode === 304 && resHeaders.vary && isInvalidOrWildcardVaryHeader(resHeaders.vary)) {
deleteCachedValue(this.#store, this.#cacheKey);
}
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {}; const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {};
if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) { if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives, this.#cacheKey.headers)) {
if (statusCode === 304 && (cacheControlHeader || revalidationResponseDisallowsCachedReuse(this.#cacheType, resHeaders, cacheControlDirectives))) {
deleteCachedValue(this.#store, this.#cacheKey);
}
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
const now = Date.now(); const now = Date.now();
const resAge = resHeaders.age ? getAge(resHeaders.age) : void 0; const resAge = Object.hasOwn(resHeaders, "age") ? getAge(resHeaders.age) : void 0;
if (resAge && resAge >= MAX_RESPONSE_AGE) { if (resAge !== void 0 && resAge >= MAX_RESPONSE_AGE) {
deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey);
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
const resDate = typeof resHeaders.date === "string" ? parseHttpDate(resHeaders.date) : void 0; const resDate = Object.hasOwn(resHeaders, "date") ? getDate(resHeaders.date) : void 0;
const staleAt = determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives) ?? this.#cacheByDefault; if (resDate === null) {
if (staleAt === void 0 || resAge && resAge > staleAt) { deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey);
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
const baseTime = resDate ? resDate.getTime() : now; const apparentAge = resDate ? Math.max(0, now - resDate.getTime()) : 0;
const currentAge = Math.max(apparentAge, resAge ?? 0);
const hasValidator = typeof resHeaders.etag === "string" && isEtagUsable(resHeaders.etag) || typeof resHeaders["last-modified"] === "string";
const staleAt = determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives, hasValidator) ?? this.#cacheByDefault;
const revalidationOnly = staleAt === 0 && hasValidator;
if (staleAt === void 0 || currentAge >= staleAt && !revalidationOnly) {
if (cacheControlHeader || staleAt !== void 0) {
deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey);
}
return downstreamOnHeaders();
}
const baseTime = now - currentAge;
const absoluteStaleAt = staleAt + baseTime; const absoluteStaleAt = staleAt + baseTime;
if (now >= absoluteStaleAt) { if (now >= absoluteStaleAt && !revalidationOnly) {
deleteCachedValueIfNotModified(statusCode, this.#store, this.#cacheKey);
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
let varyDirectives; let varyDirectives;
@@ -36672,8 +37419,8 @@ var require_cache_handler = __commonJS({
return downstreamOnHeaders(); return downstreamOnHeaders();
} }
} }
const cachedAt = resAge ? now - resAge : now; const cachedAt = baseTime;
const deleteAt = determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, absoluteStaleAt); const deleteAt = determineDeleteAt(baseTime, now, cacheControlDirectives, absoluteStaleAt);
const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives); const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives);
const value = { const value = {
statusCode, statusCode,
@@ -36693,6 +37440,7 @@ var require_cache_handler = __commonJS({
value.statusCode = cachedValue.statusCode; value.statusCode = cachedValue.statusCode;
value.statusMessage = cachedValue.statusMessage; value.statusMessage = cachedValue.statusMessage;
value.etag = cachedValue.etag; value.etag = cachedValue.etag;
value.vary = varyDirectives ?? cachedValue.vary;
value.headers = { ...cachedValue.headers, ...strippedHeaders }; value.headers = { ...cachedValue.headers, ...strippedHeaders };
downstreamOnHeaders(); downstreamOnHeaders();
this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value); this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value);
@@ -36783,11 +37531,25 @@ var require_cache_handler = __commonJS({
this.#handler.onResponseError?.(controller, err); this.#handler.onResponseError?.(controller, err);
} }
}; };
function deleteCachedValue(store, cacheKey) {
try {
store.delete(cacheKey)?.catch?.(noop);
} catch {
}
}
function deleteCachedValueIfNotModified(statusCode, store, cacheKey) {
if (statusCode === 304) {
deleteCachedValue(store, cacheKey);
}
}
function revalidationResponseDisallowsCachedReuse(cacheType, resHeaders, cacheControlDirectives) {
return cacheControlDirectives["no-store"] === true || cacheType === "shared" && cacheControlDirectives.private === true || (resHeaders.vary ? isInvalidOrWildcardVaryHeader(resHeaders.vary) : false);
}
function canCacheResponse(cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) { function canCacheResponse(cacheType, statusCode, resHeaders, cacheControlDirectives, reqHeaders) {
if (statusCode < 200 || NOT_UNDERSTOOD_STATUS_CODES.includes(statusCode)) { if (statusCode < 200 || arrayIncludes(NOT_UNDERSTOOD_STATUS_CODES, statusCode)) {
return false; return false;
} }
if (!HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode) && !resHeaders["expires"] && !cacheControlDirectives.public && cacheControlDirectives["max-age"] === void 0 && // RFC 9111: a private response directive, if the cache is not shared if (!arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES, statusCode) && !resHeaders["expires"] && !cacheControlDirectives.public && cacheControlDirectives["max-age"] === void 0 && // RFC 9111: a private response directive, if the cache is not shared
!(cacheControlDirectives.private && cacheType === "private") && !(cacheControlDirectives["s-maxage"] !== void 0 && cacheType === "shared")) { !(cacheControlDirectives.private && cacheType === "private") && !(cacheControlDirectives["s-maxage"] !== void 0 && cacheType === "shared")) {
return false; return false;
} }
@@ -36797,60 +37559,104 @@ var require_cache_handler = __commonJS({
if (cacheType === "shared" && cacheControlDirectives.private === true) { if (cacheType === "shared" && cacheControlDirectives.private === true) {
return false; return false;
} }
if (resHeaders.vary?.includes("*")) { if (resHeaders.vary && hasVaryStar(resHeaders.vary)) {
return false; return false;
} }
if (reqHeaders?.authorization) { if (reqHeaders != null && Object.hasOwn(reqHeaders, "authorization")) {
if (!cacheControlDirectives.public && !cacheControlDirectives["s-maxage"] && !cacheControlDirectives["must-revalidate"]) { if (!cacheControlDirectives.public && !cacheControlDirectives["s-maxage"] && !cacheControlDirectives["must-revalidate"]) {
return false; return false;
} }
if (typeof reqHeaders.authorization !== "string") { if (typeof reqHeaders.authorization !== "string") {
return false; return false;
} }
if (Array.isArray(cacheControlDirectives["no-cache"]) && cacheControlDirectives["no-cache"].includes("authorization")) { if (Array.isArray(cacheControlDirectives["no-cache"]) && arrayIncludes(cacheControlDirectives["no-cache"], "authorization")) {
return false; return false;
} }
if (Array.isArray(cacheControlDirectives["private"]) && cacheControlDirectives["private"].includes("authorization")) { if (Array.isArray(cacheControlDirectives["private"]) && arrayIncludes(cacheControlDirectives["private"], "authorization")) {
return false; return false;
} }
} }
return true; return true;
} }
function getAge(ageHeader) { function getDate(dateHeader) {
const age = parseInt(Array.isArray(ageHeader) ? ageHeader[0] : ageHeader); let dateValue = dateHeader;
return isNaN(age) ? void 0 : age * 1e3; if (Array.isArray(dateValue)) {
if (dateValue.length !== 1) {
return null;
}
dateValue = dateValue[0];
}
if (typeof dateValue !== "string") {
return null;
}
return parseHttpDate(dateValue);
} }
function determineStaleAt(cacheType, now, age, resHeaders, responseDate, cacheControlDirectives) { function getAge(ageHeader) {
let ageValue = ageHeader;
if (Array.isArray(ageValue)) {
if (ageValue.length !== 1) {
return MAX_RESPONSE_AGE;
}
ageValue = ageValue[0];
}
if (typeof ageValue !== "string" || !/^[\t ]*[0-9]+[\t ]*$/.test(ageValue)) {
return MAX_RESPONSE_AGE;
}
const age = BigInt(ageValue.replace(/^[\t ]+|[\t ]+$/g, ""));
if (age >= BigInt(MAX_RESPONSE_AGE / 1e3)) {
return MAX_RESPONSE_AGE;
}
return Number(age) * 1e3;
}
function determineStaleAt(cacheType, now, age, resHeaders, responseDate, cacheControlDirectives, hasValidator) {
if (cacheType === "shared") { if (cacheType === "shared") {
if (hasInvalidCacheControlDirective(cacheControlDirectives, "s-maxage")) {
return 0;
}
const sMaxAge = cacheControlDirectives["s-maxage"]; const sMaxAge = cacheControlDirectives["s-maxage"];
if (sMaxAge !== void 0) { if (sMaxAge !== void 0) {
return sMaxAge > 0 ? sMaxAge * 1e3 : void 0; if (sMaxAge > 0) {
return sMaxAge * 1e3;
}
return 0;
} }
} }
if (hasInvalidCacheControlDirective(cacheControlDirectives, "max-age")) {
return 0;
}
const maxAge = cacheControlDirectives["max-age"]; const maxAge = cacheControlDirectives["max-age"];
if (maxAge !== void 0) { if (maxAge !== void 0) {
return maxAge > 0 ? maxAge * 1e3 : void 0; if (maxAge > 0) {
} return maxAge * 1e3;
if (typeof resHeaders.expires === "string") {
const expiresDate = parseHttpDate(resHeaders.expires);
if (expiresDate) {
if (now >= expiresDate.getTime()) {
return void 0;
}
if (responseDate) {
if (responseDate >= expiresDate) {
return void 0;
}
if (age !== void 0 && age > expiresDate - responseDate) {
return void 0;
}
}
return expiresDate.getTime() - now;
} }
return 0;
}
if (Object.hasOwn(resHeaders, "expires")) {
if (typeof resHeaders.expires !== "string") {
return 0;
}
const expiresDate = parseHttpDate(resHeaders.expires);
if (!expiresDate) {
return 0;
}
if (now >= expiresDate.getTime()) {
return 0;
}
if (responseDate) {
if (responseDate >= expiresDate) {
return 0;
}
const freshnessLifetime = expiresDate.getTime() - responseDate.getTime();
if (age !== void 0 && age >= freshnessLifetime) {
return 0;
}
return freshnessLifetime;
}
return expiresDate.getTime() - now;
} }
if (typeof resHeaders["last-modified"] === "string") { if (typeof resHeaders["last-modified"] === "string") {
const lastModified = new Date(resHeaders["last-modified"]); const lastModified = parseHttpDate(resHeaders["last-modified"]);
if (isValidDate(lastModified)) { if (lastModified) {
if (lastModified.getTime() >= now) { if (lastModified.getTime() >= now) {
return void 0; return void 0;
} }
@@ -36861,6 +37667,9 @@ var require_cache_handler = __commonJS({
if (cacheControlDirectives.immutable) { if (cacheControlDirectives.immutable) {
return 31536e6; return 31536e6;
} }
if (cacheControlDirectives["no-cache"] === true && hasValidator) {
return 0;
}
return void 0; return void 0;
} }
function determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, staleAt) { function determineDeleteAt(baseTime, cachedAt, cacheControlDirectives, staleAt) {
@@ -36878,6 +37687,9 @@ var require_cache_handler = __commonJS({
} }
if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) { if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity && immutable === -Infinity) {
const freshnessLifetime = staleAt - baseTime; const freshnessLifetime = staleAt - baseTime;
if (freshnessLifetime <= 0) {
return cachedAt + REVALIDATION_ONLY_RETENTION;
}
const datePrecisionPadding = Math.min(Math.max(cachedAt - baseTime, 0), 1e3); const datePrecisionPadding = Math.min(Math.max(cachedAt - baseTime, 0), 1e3);
return staleAt + freshnessLifetime + datePrecisionPadding; return staleAt + freshnessLifetime + datePrecisionPadding;
} }
@@ -36897,11 +37709,7 @@ var require_cache_handler = __commonJS({
"age" "age"
]; ];
if (resHeaders["connection"]) { if (resHeaders["connection"]) {
if (Array.isArray(resHeaders["connection"])) { appendConnectionHeaderTokens(headersToRemove, resHeaders["connection"]);
headersToRemove.push(...resHeaders["connection"].map((header) => header.trim()));
} else {
headersToRemove.push(...resHeaders["connection"].split(",").map((header) => header.trim()));
}
} }
if (Array.isArray(cacheControlDirectives["no-cache"])) { if (Array.isArray(cacheControlDirectives["no-cache"])) {
headersToRemove.push(...cacheControlDirectives["no-cache"]); headersToRemove.push(...cacheControlDirectives["no-cache"]);
@@ -36911,16 +37719,13 @@ var require_cache_handler = __commonJS({
} }
let strippedHeaders; let strippedHeaders;
for (const headerName of headersToRemove) { for (const headerName of headersToRemove) {
if (resHeaders[headerName]) { if (Object.hasOwn(resHeaders, headerName)) {
strippedHeaders ??= { ...resHeaders }; strippedHeaders ??= { ...resHeaders };
delete strippedHeaders[headerName]; delete strippedHeaders[headerName];
} }
} }
return strippedHeaders ?? resHeaders; return strippedHeaders ?? resHeaders;
} }
function isValidDate(date) {
return date instanceof Date && Number.isFinite(date.valueOf());
}
module2.exports = CacheHandler; module2.exports = CacheHandler;
} }
}); });
@@ -37091,12 +37896,43 @@ var require_memory_cache_store = __commonJS({
} }
}; };
function findEntry(key, entries, now) { function findEntry(key, entries, now) {
return entries.find((entry) => entry.deleteAt > now && entry.method === key.method && (entry.vary == null || Object.keys(entry.vary).every((headerName) => { for (let i = 0; i < entries.length; i++) {
if (entry.vary[headerName] === null) { const entry = entries[i];
return key.headers[headerName] === void 0; if (entry.deleteAt > now && entry.method === key.method && varyMatches(key, entry)) {
return entry;
} }
return entry.vary[headerName] === key.headers[headerName]; }
}))); }
function varyMatches(key, entry) {
if (entry.vary == null) {
return true;
}
for (const headerName in entry.vary) {
if (Object.hasOwn(entry.vary, headerName) && !headerValueEquals(key.headers?.[headerName], entry.vary[headerName])) {
return false;
}
}
return true;
}
function headerValueEquals(lhs, rhs) {
if (lhs == null && rhs == null) {
return true;
}
if (lhs == null && rhs != null || lhs != null && rhs == null) {
return false;
}
if (Array.isArray(lhs) && Array.isArray(rhs)) {
if (lhs.length !== rhs.length) {
return false;
}
for (let i = 0; i < lhs.length; i++) {
if (lhs[i] !== rhs[i]) {
return false;
}
}
return true;
}
return lhs === rhs;
} }
module2.exports = MemoryCacheStore; module2.exports = MemoryCacheStore;
} }
@@ -37110,7 +37946,7 @@ var require_cache_revalidation_handler = __commonJS({
var CacheRevalidationHandler = class { var CacheRevalidationHandler = class {
#successful = false; #successful = false;
/** /**
* @type {((boolean, any) => void) | null} * @type {((success: boolean, context?: any, statusCode?: number, headers?: import('../../types/header.d.ts').IncomingHttpHeaders) => void) | null}
*/ */
#callback; #callback;
/** /**
@@ -37123,7 +37959,7 @@ var require_cache_revalidation_handler = __commonJS({
*/ */
#allowErrorStatusCodes; #allowErrorStatusCodes;
/** /**
* @param {(boolean) => void} callback Function to call if the cached value is valid * @param {(success: boolean, context?: any, statusCode?: number, headers?: import('../../types/header.d.ts').IncomingHttpHeaders) => void} callback Function to call if the cached value is valid
* @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler * @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler
* @param {boolean} allowErrorStatusCodes * @param {boolean} allowErrorStatusCodes
*/ */
@@ -37145,7 +37981,7 @@ var require_cache_revalidation_handler = __commonJS({
onResponseStart(controller, statusCode, headers, statusMessage) { onResponseStart(controller, statusCode, headers, statusMessage) {
assert(this.#callback != null); assert(this.#callback != null);
this.#successful = statusCode === 304 || this.#allowErrorStatusCodes && statusCode >= 500 && statusCode <= 504; this.#successful = statusCode === 304 || this.#allowErrorStatusCodes && statusCode >= 500 && statusCode <= 504;
this.#callback(this.#successful, this.#context); this.#callback(this.#successful, this.#context, statusCode, headers);
this.#callback = null; this.#callback = null;
if (this.#successful) { if (this.#successful) {
return true; return true;
@@ -37175,6 +38011,12 @@ var require_cache_revalidation_handler = __commonJS({
return; return;
} }
if (this.#callback) { if (this.#callback) {
if (this.#allowErrorStatusCodes) {
this.#successful = true;
this.#callback(true, this.#context);
this.#callback = null;
return;
}
this.#callback(false); this.#callback(false);
this.#callback = null; this.#callback = null;
} }
@@ -37199,8 +38041,9 @@ var require_cache3 = __commonJS({
var CacheHandler = require_cache_handler(); var CacheHandler = require_cache_handler();
var MemoryCacheStore = require_memory_cache_store(); var MemoryCacheStore = require_memory_cache_store();
var CacheRevalidationHandler = require_cache_revalidation_handler(); var CacheRevalidationHandler = require_cache_revalidation_handler();
var { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders, parseCacheControlHeader } = require_cache2(); var { assertCacheStore, assertCacheMethods, makeCacheKey, normalizeHeaders, parseCacheControlHeader, isInvalidOrWildcardVaryHeader } = require_cache2();
var { AbortError } = require_errors2(); var { AbortError } = require_errors2();
var { parseHttpDate } = require_date();
function assertCacheOrigins(origins, name) { function assertCacheOrigins(origins, name) {
if (origins === void 0) return; if (origins === void 0) return;
if (!Array.isArray(origins)) { if (!Array.isArray(origins)) {
@@ -37215,6 +38058,37 @@ var require_cache3 = __commonJS({
} }
var nop = () => { var nop = () => {
}; };
function trimOWS(value) {
return value.replace(/^[\t ]+|[\t ]+$/g, "");
}
function arrayIncludes(array, value) {
for (let i = 0; i < array.length; i++) {
if (array[i] === value) {
return true;
}
}
return false;
}
function hasPragmaNoCache(headers) {
const pragma = headers?.pragma;
if (!pragma) {
return false;
}
const values = Array.isArray(pragma) ? pragma : [pragma];
for (let i = 0; i < values.length; i++) {
const value = values[i];
if (typeof value !== "string") {
continue;
}
const directives = value.split(",");
for (let j = 0; j < directives.length; j++) {
if (trimOWS(directives[j]).toLowerCase() === "no-cache") {
return true;
}
}
}
return false;
}
function needsRevalidation(result, cacheControlDirectives, { headers = {} }) { function needsRevalidation(result, cacheControlDirectives, { headers = {} }) {
if (cacheControlDirectives?.["no-cache"]) { if (cacheControlDirectives?.["no-cache"]) {
return true; return true;
@@ -37227,10 +38101,58 @@ var require_cache3 = __commonJS({
} }
return false; return false;
} }
function isStale(result, cacheControlDirectives) { function staleResponseRequiresRevalidation(result, cacheType) {
return result.cacheControlDirectives?.["must-revalidate"] === true || cacheType === "shared" && (result.cacheControlDirectives?.["proxy-revalidate"] === true || // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.2.10
// s-maxage implies proxy-revalidate for shared caches.
result.cacheControlDirectives?.["s-maxage"] !== void 0);
}
function revalidationResponseDisallowsCachedReuse(cacheType, headers) {
if (headers.vary && isInvalidOrWildcardVaryHeader(headers.vary)) {
return true;
}
const cacheControl = headers["cache-control"];
if (!cacheControl) {
return false;
}
const cacheControlDirectives = parseCacheControlHeader(cacheControl);
return cacheControlDirectives["no-store"] === true || cacheType === "shared" && cacheControlDirectives.private === true;
}
function revalidationResponseUpdatesCacheControl(headers) {
return headers["cache-control"] !== void 0;
}
function deleteCachedValue(store, cacheKey) {
try {
store.delete(cacheKey)?.catch?.(nop);
} catch {
}
}
function getUsableLastModified(headers) {
const lastModified = headers?.["last-modified"];
if (typeof lastModified === "string" && parseHttpDate(lastModified)) {
return lastModified;
}
}
function makeRevalidationHeaders(opts, result) {
const headers = {
...opts.headers,
"if-modified-since": getUsableLastModified(result.headers) ?? new Date(result.cachedAt).toUTCString()
};
if (result.etag) {
headers["if-none-match"] = result.etag;
}
if (result.vary) {
for (const key in result.vary) {
if (result.vary[key] != null) {
headers[key] = result.vary[key];
}
}
}
return headers;
}
function isStale(result, cacheControlDirectives, cacheType) {
const now = Date.now(); const now = Date.now();
if (now > result.staleAt) { if (now > result.staleAt) {
if (cacheControlDirectives?.["max-stale"]) { if (!staleResponseRequiresRevalidation(result, cacheType) && cacheControlDirectives?.["max-stale"]) {
const gracePeriod = result.staleAt + cacheControlDirectives["max-stale"] * 1e3; const gracePeriod = result.staleAt + cacheControlDirectives["max-stale"] * 1e3;
return now > gracePeriod; return now > gracePeriod;
} }
@@ -37243,9 +38165,9 @@ var require_cache3 = __commonJS({
} }
return false; return false;
} }
function withinStaleWhileRevalidateWindow(result) { function withinStaleWhileRevalidateWindow(result, cacheType) {
const staleWhileRevalidate = result.cacheControlDirectives?.["stale-while-revalidate"]; const staleWhileRevalidate = result.cacheControlDirectives?.["stale-while-revalidate"];
if (!staleWhileRevalidate) { if (!staleWhileRevalidate || staleResponseRequiresRevalidation(result, cacheType)) {
return false; return false;
} }
const now = Date.now(); const now = Date.now();
@@ -37355,32 +38277,17 @@ var require_cache3 = __commonJS({
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler)); return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler));
} }
const age = Math.round((now - result.cachedAt) / 1e3); const age = Math.round((now - result.cachedAt) / 1e3);
if (reqCacheControl?.["max-age"] && age >= reqCacheControl["max-age"]) { const requestMaxAgeExpired = reqCacheControl?.["max-age"] !== void 0 && age >= reqCacheControl["max-age"];
return dispatch(opts, handler); const stale = requestMaxAgeExpired || isStale(result, reqCacheControl, globalOpts.type);
} const revalidate = requestMaxAgeExpired || needsRevalidation(result, reqCacheControl, opts);
const stale = isStale(result, reqCacheControl);
const revalidate = needsRevalidation(result, reqCacheControl, opts);
if (stale || revalidate) { if (stale || revalidate) {
if (util.isStream(opts.body) && util.bodyLength(opts.body) !== 0) { if (util.isStream(opts.body) && util.bodyLength(opts.body) !== 0) {
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler)); return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler));
} }
if (!revalidate && withinStaleWhileRevalidateWindow(result)) { if (!revalidate && withinStaleWhileRevalidateWindow(result, globalOpts.type)) {
sendCachedValue(handler, opts, result, age, null, true); sendCachedValue(handler, opts, result, age, null, true);
queueMicrotask(() => { queueMicrotask(() => {
const headers2 = { const headers2 = makeRevalidationHeaders(opts, result);
...opts.headers,
"if-modified-since": new Date(result.cachedAt).toUTCString()
};
if (result.etag) {
headers2["if-none-match"] = result.etag;
}
if (result.vary) {
for (const key in result.vary) {
if (result.vary[key] != null) {
headers2[key] = result.vary[key];
}
}
}
dispatch( dispatch(
{ {
...opts, ...opts,
@@ -37406,32 +38313,33 @@ var require_cache3 = __commonJS({
return true; return true;
} }
let withinStaleIfErrorThreshold = false; let withinStaleIfErrorThreshold = false;
const staleIfErrorExpiry = result.cacheControlDirectives["stale-if-error"] ?? reqCacheControl?.["stale-if-error"]; if (!staleResponseRequiresRevalidation(result, globalOpts.type)) {
if (staleIfErrorExpiry) { const staleIfErrorExpiry = result.cacheControlDirectives["stale-if-error"] ?? reqCacheControl?.["stale-if-error"];
withinStaleIfErrorThreshold = now < result.staleAt + staleIfErrorExpiry * 1e3; if (staleIfErrorExpiry) {
} withinStaleIfErrorThreshold = now < result.staleAt + staleIfErrorExpiry * 1e3;
const headers = {
...opts.headers,
"if-modified-since": new Date(result.cachedAt).toUTCString()
};
if (result.etag) {
headers["if-none-match"] = result.etag;
}
if (result.vary) {
for (const key in result.vary) {
if (result.vary[key] != null) {
headers[key] = result.vary[key];
}
} }
} }
const headers = makeRevalidationHeaders(opts, result);
return dispatch( return dispatch(
{ {
...opts, ...opts,
headers headers
}, },
new CacheRevalidationHandler( new CacheRevalidationHandler(
(success, context) => { (success, context, statusCode, headers2) => {
if (success) { if (success) {
if (statusCode === 304) {
if (revalidationResponseDisallowsCachedReuse(globalOpts.type, headers2)) {
if (util.isStream(result.body)) {
result.body.on("error", nop).destroy();
}
deleteCachedValue(globalOpts.store, cacheKey);
return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler));
}
if (revalidationResponseUpdatesCacheControl(headers2)) {
deleteCachedValue(globalOpts.store, cacheKey);
}
}
sendCachedValue(handler, opts, result, age, context, stale); sendCachedValue(handler, opts, result, age, context, stale);
} else if (util.isStream(result.body)) { } else if (util.isStream(result.body)) {
result.body.on("error", nop).destroy(); result.body.on("error", nop).destroy();
@@ -37473,13 +38381,22 @@ var require_cache3 = __commonJS({
cacheByDefault, cacheByDefault,
type type
}; };
const safeMethodsToNotCache = util.safeHTTPMethods.filter((method) => methods.includes(method) === false); const safeMethodsToNotCache = [];
for (let i = 0; i < util.safeHTTPMethods.length; i++) {
const method = util.safeHTTPMethods[i];
if (!arrayIncludes(methods, method)) {
safeMethodsToNotCache.push(method);
}
}
return (dispatch) => { return (dispatch) => {
return (opts2, handler) => { return (opts2, handler) => {
if (!opts2.origin || safeMethodsToNotCache.includes(opts2.method)) { if (arrayIncludes(safeMethodsToNotCache, opts2.method)) {
return dispatch(opts2, handler); return dispatch(opts2, handler);
} }
if (origins !== void 0) { if (origins !== void 0) {
if (!opts2.origin) {
return dispatch(opts2, handler);
}
const requestOrigin = opts2.origin.toString().toLowerCase(); const requestOrigin = opts2.origin.toString().toLowerCase();
let isAllowed = false; let isAllowed = false;
for (let i = 0; i < origins.length; i++) { for (let i = 0; i < origins.length; i++) {
@@ -37502,7 +38419,7 @@ var require_cache3 = __commonJS({
...opts2, ...opts2,
headers: normalizeHeaders(opts2) headers: normalizeHeaders(opts2)
}; };
const reqCacheControl = opts2.headers?.["cache-control"] ? parseCacheControlHeader(opts2.headers["cache-control"]) : void 0; const reqCacheControl = opts2.headers?.["cache-control"] ? parseCacheControlHeader(opts2.headers["cache-control"]) : hasPragmaNoCache(opts2.headers) ? { "no-cache": true } : void 0;
if (reqCacheControl?.["no-store"]) { if (reqCacheControl?.["no-store"]) {
return dispatch(opts2, handler); return dispatch(opts2, handler);
} }
@@ -37562,6 +38479,8 @@ var require_decompress = __commonJS({
var DecompressHandler = class extends DecoratorHandler { var DecompressHandler = class extends DecoratorHandler {
/** @type {Transform[]} */ /** @type {Transform[]} */
#decompressors = []; #decompressors = [];
/** @type {Record<string, string | string[]> | undefined} */
#trailers;
/** @type {Readonly<number[]>} */ /** @type {Readonly<number[]>} */
#skipStatusCodes; #skipStatusCodes;
/** @type {boolean} */ /** @type {boolean} */
@@ -37637,7 +38556,7 @@ var require_decompress = __commonJS({
const decompressor = this.#decompressors[0]; const decompressor = this.#decompressors[0];
this.#setupDecompressorEvents(decompressor, controller); this.#setupDecompressorEvents(decompressor, controller);
decompressor.on("end", () => { decompressor.on("end", () => {
super.onResponseEnd(controller, {}); super.onResponseEnd(controller, this.#trailers);
}); });
} }
/** /**
@@ -37653,7 +38572,7 @@ var require_decompress = __commonJS({
super.onResponseError(controller, err); super.onResponseError(controller, err);
return; return;
} }
super.onResponseEnd(controller, {}); super.onResponseEnd(controller, this.#trailers);
}); });
} }
/** /**
@@ -37731,6 +38650,7 @@ var require_decompress = __commonJS({
*/ */
onResponseEnd(controller, trailers) { onResponseEnd(controller, trailers) {
if (this.#decompressors.length > 0) { if (this.#decompressors.length > 0) {
this.#trailers = trailers;
this.#decompressors[0].end(); this.#decompressors[0].end();
this.#cleanupDecompressors(); this.#cleanupDecompressors();
return; return;
@@ -37762,6 +38682,9 @@ var require_decompress = __commonJS({
} }
return (dispatch) => { return (dispatch) => {
return (opts, handler) => { return (opts, handler) => {
if (opts.method === "HEAD") {
return dispatch(opts, handler);
}
const decompressHandler = new DecompressHandler(handler, options); const decompressHandler = new DecompressHandler(handler, options);
return dispatch(opts, decompressHandler); return dispatch(opts, decompressHandler);
}; };
@@ -38171,7 +39094,7 @@ var require_deduplicate = __commonJS({
const pendingRequests = /* @__PURE__ */ new Map(); const pendingRequests = /* @__PURE__ */ new Map();
return (dispatch) => { return (dispatch) => {
return (opts2, handler) => { return (opts2, handler) => {
if (!opts2.origin || methods.includes(opts2.method) === false) { if (opts2.upgrade || methods.includes(opts2.method) === false) {
return dispatch(opts2, handler); return dispatch(opts2, handler);
} }
opts2 = { opts2 = {
@@ -38569,7 +39492,12 @@ var require_sqlite_cache_store = __commonJS({
if (lhs.length !== rhs.length) { if (lhs.length !== rhs.length) {
return false; return false;
} }
return lhs.every((x, i) => x === rhs[i]); for (let i = 0; i < lhs.length; i++) {
if (lhs[i] !== rhs[i]) {
return false;
}
}
return true;
} }
return lhs === rhs; return lhs === rhs;
} }
@@ -39075,9 +40003,7 @@ var require_response2 = __commonJS({
// https://fetch.spec.whatwg.org/#dom-response-json // https://fetch.spec.whatwg.org/#dom-response-json
static json(data, init = void 0) { static json(data, init = void 0) {
webidl.argumentLengthCheck(arguments, 1, "Response.json"); webidl.argumentLengthCheck(arguments, 1, "Response.json");
if (init !== null) { init = webidl.converters.ResponseInit(init);
init = webidl.converters.ResponseInit(init);
}
const bytes = textEncoder.encode( const bytes = textEncoder.encode(
serializeJavascriptValueToJSONString(data) serializeJavascriptValueToJSONString(data)
); );
@@ -42296,8 +43222,42 @@ var require_util12 = __commonJS({
} }
} }
} }
function isLetterOrDigit(code) {
return code >= 48 && code <= 57 || // 0-9
code >= 65 && code <= 90 || // A-Z
code >= 97 && code <= 122;
}
function validateCookieDomain(domain) { function validateCookieDomain(domain) {
if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { if (domain === " ") {
return;
}
if (domain.length > 255) {
throw new Error("Invalid cookie domain");
}
let labelLength = 0;
for (let i = 0; i < domain.length; ++i) {
const code = domain.charCodeAt(i);
if (code === 46) {
if (labelLength === 0) {
throw new Error("Invalid cookie domain");
}
if (domain.charCodeAt(i - 1) === 45) {
throw new Error("Invalid cookie domain");
}
labelLength = 0;
continue;
}
if (labelLength === 0 && !isLetterOrDigit(code)) {
throw new Error("Invalid cookie domain");
}
if (!isLetterOrDigit(code) && code !== 45) {
throw new Error("Invalid cookie domain");
}
if (++labelLength > 63) {
throw new Error("Invalid cookie domain");
}
}
if (labelLength === 0 || domain.charCodeAt(domain.length - 1) === 45) {
throw new Error("Invalid cookie domain"); throw new Error("Invalid cookie domain");
} }
} }
@@ -42380,7 +43340,11 @@ var require_util12 = __commonJS({
throw new Error("Invalid unparsed"); throw new Error("Invalid unparsed");
} }
const [key, ...value] = part.split("="); const [key, ...value] = part.split("=");
out.push(`${key.trim()}=${value.join("=")}`); const trimmedKey = key.trim();
const joinedValue = value.join("=");
validateCookieName(trimmedKey);
validateCookieValue(joinedValue);
out.push(`${trimmedKey}=${joinedValue}`);
} }
return out.join("; "); return out.join("; ");
} }
@@ -43980,6 +44944,8 @@ var require_websocket2 = __commonJS({
var { SendQueue } = require_sender2(); var { SendQueue } = require_sender2();
var { WebsocketFrameSend } = require_frame2(); var { WebsocketFrameSend } = require_frame2();
var { channels } = require_diagnostics2(); var { channels } = require_diagnostics2();
var kRef = /* @__PURE__ */ Symbol.for("nodejs.ref");
var kUnref = /* @__PURE__ */ Symbol.for("nodejs.unref");
function getSocketAddress(socket) { function getSocketAddress(socket) {
if (typeof socket?.address === "function") { if (typeof socket?.address === "function") {
return socket.address(); return socket.address();
@@ -43999,6 +44965,7 @@ var require_websocket2 = __commonJS({
#bufferedAmount = 0; #bufferedAmount = 0;
#protocol = ""; #protocol = "";
#extensions = ""; #extensions = "";
#refed = true;
/** @type {SendQueue} */ /** @type {SendQueue} */
#sendQueue; #sendQueue;
/** @type {Handler} */ /** @type {Handler} */
@@ -44081,6 +45048,16 @@ var require_websocket2 = __commonJS({
this.#handler.readyState = _WebSocket.CONNECTING; this.#handler.readyState = _WebSocket.CONNECTING;
this.#binaryType = "blob"; this.#binaryType = "blob";
} }
[kRef]() {
webidl.brandCheck(this, _WebSocket);
this.#refed = true;
this.#handler.socket?.ref?.();
}
[kUnref]() {
webidl.brandCheck(this, _WebSocket);
this.#refed = false;
this.#handler.socket?.unref?.();
}
/** /**
* @see https://websockets.spec.whatwg.org/#dom-websocket-close * @see https://websockets.spec.whatwg.org/#dom-websocket-close
* @param {number|undefined} code * @param {number|undefined} code
@@ -44242,6 +45219,9 @@ var require_websocket2 = __commonJS({
*/ */
#onConnectionEstablished(response, parsedExtensions) { #onConnectionEstablished(response, parsedExtensions) {
this.#handler.socket = response.socket; this.#handler.socket = response.socket;
if (!this.#refed) {
this.#handler.socket.unref?.();
}
const maxFragments = this.#handler.controller.dispatcher?.webSocketOptions?.maxFragments; const maxFragments = this.#handler.controller.dispatcher?.webSocketOptions?.maxFragments;
const maxPayloadSize = this.#handler.controller.dispatcher?.webSocketOptions?.maxPayloadSize; const maxPayloadSize = this.#handler.controller.dispatcher?.webSocketOptions?.maxPayloadSize;
const parser = new ByteParser(this.#handler, parsedExtensions, { const parser = new ByteParser(this.#handler, parsedExtensions, {
+85 -85
View File
@@ -16,11 +16,11 @@
"@actions/io": "^3.0.2", "@actions/io": "^3.0.2",
"@actions/tool-cache": "^4.0.0", "@actions/tool-cache": "^4.0.0",
"@renovatebot/pep440": "^5.0.0", "@renovatebot/pep440": "^5.0.0",
"smol-toml": "^1.7.0", "smol-toml": "^1.7.1",
"undici": "^8.7.0" "undici": "^8.10.0"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.5.4", "@biomejs/biome": "^2.5.6",
"@types/js-yaml": "^4.0.9", "@types/js-yaml": "^4.0.9",
"@types/node": "^26.1.1", "@types/node": "^26.1.1",
"@types/semver": "^7.7.1", "@types/semver": "^7.7.1",
@@ -863,9 +863,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@biomejs/biome": { "node_modules/@biomejs/biome": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.6.tgz",
"integrity": "sha512-xy5FNE5kQJKyK5MR1gJy6ztXYx4WBAbYGlK04lMEgmyPRWKybY9NFwiG9yo0XdzOU8Xvhj41u034J1ywfoWfMw==", "integrity": "sha512-lxVNjv7UF6KfhMJfL9gaUHbWdJdHbsAj6OSmwSYNdhRuG67NxNQ4Xdvh3TUxsSK9sBzJBQhEJj3AopmmNJ5pSA==",
"dev": true, "dev": true,
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"bin": { "bin": {
@@ -879,20 +879,20 @@
"url": "https://opencollective.com/biome" "url": "https://opencollective.com/biome"
}, },
"optionalDependencies": { "optionalDependencies": {
"@biomejs/cli-darwin-arm64": "2.5.4", "@biomejs/cli-darwin-arm64": "2.5.6",
"@biomejs/cli-darwin-x64": "2.5.4", "@biomejs/cli-darwin-x64": "2.5.6",
"@biomejs/cli-linux-arm64": "2.5.4", "@biomejs/cli-linux-arm64": "2.5.6",
"@biomejs/cli-linux-arm64-musl": "2.5.4", "@biomejs/cli-linux-arm64-musl": "2.5.6",
"@biomejs/cli-linux-x64": "2.5.4", "@biomejs/cli-linux-x64": "2.5.6",
"@biomejs/cli-linux-x64-musl": "2.5.4", "@biomejs/cli-linux-x64-musl": "2.5.6",
"@biomejs/cli-win32-arm64": "2.5.4", "@biomejs/cli-win32-arm64": "2.5.6",
"@biomejs/cli-win32-x64": "2.5.4" "@biomejs/cli-win32-x64": "2.5.6"
} }
}, },
"node_modules/@biomejs/cli-darwin-arm64": { "node_modules/@biomejs/cli-darwin-arm64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.6.tgz",
"integrity": "sha512-4o3NFRobXHynkgcFVrlZsoDAFtF2ldlEGN8sORSws5ZQqyY4PXnPUIylu4ksfyHuwkfvDREuWh3JK+niRwGq3w==", "integrity": "sha512-zMOLZP4oMrjh6m1zcSj1ud2awUPgTuMVbmQhYYWL7J8HwCnbHHBvTm7VBTRuY7epT5bez76IpKYQ11ZAqHFlnw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -907,9 +907,9 @@
} }
}, },
"node_modules/@biomejs/cli-darwin-x64": { "node_modules/@biomejs/cli-darwin-x64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.6.tgz",
"integrity": "sha512-D32P5HkU2Y6PySuC/WsVDTOgsDwVFmujzhhhOQjajtATpVWFDXuVd3oRbsWNSEA+aaFzyzZm22szsyydBYlSyQ==", "integrity": "sha512-JAC1VqzvO7Th5ZplU0G2uGfkZbxEe9uDDektPAhF0JLusoz1w+T4okp2bkykI0bbaO2vslKiRfj4gU43JaGreA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -924,9 +924,9 @@
} }
}, },
"node_modules/@biomejs/cli-linux-arm64": { "node_modules/@biomejs/cli-linux-arm64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.6.tgz",
"integrity": "sha512-pSEfW7B8kTsXUjUxC1xVVK+y85Ht3C5XxZ9gclmC7/3Ku9Vqz8jmI7k0p/BNIjQ6t4sFERI2sFeH73ybiZl6YQ==", "integrity": "sha512-6XsYwCFkp5sMxl85ffhgeGpGgs6A7dRYFnkceZ7WVxvycuTnGdD5xa534Z3xfrBQ0JCMK/mujT6ZNPJoghedwg==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -941,9 +941,9 @@
} }
}, },
"node_modules/@biomejs/cli-linux-arm64-musl": { "node_modules/@biomejs/cli-linux-arm64-musl": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.6.tgz",
"integrity": "sha512-Rpm5/AT1m+DlJmUoYvS4/vXc+0tXJPJ2NQz25TGPyHVF5JrWy75PE0GH6kVxsKtQDuCH4OgzquZq0R4kj/wCVg==", "integrity": "sha512-eUa3jeeYvfMt19LBeh6E5PUZpxnTC4JqNWo+EDjTtQjAr2xLGnWaxACtVU1DQqmHYbvThlJzLX+ZsYgrqh2qVw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -958,9 +958,9 @@
} }
}, },
"node_modules/@biomejs/cli-linux-x64": { "node_modules/@biomejs/cli-linux-x64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.6.tgz",
"integrity": "sha512-FNxojWJkL7EajAuzBgoLe0T2G0y112M4lBrDIFl/DomFTx8yqenYOIdsRLNXvOvBBofE8hJi85LjzLmBDpY7/Q==", "integrity": "sha512-Pop9VXCFUhFTMfFefZ39S+u2rOPyNp5iHlxbZRwXGACHLy2r0jjiRgJHmaEKJzL3SyxlVeGShXhvvElvWowonA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -975,9 +975,9 @@
} }
}, },
"node_modules/@biomejs/cli-linux-x64-musl": { "node_modules/@biomejs/cli-linux-x64-musl": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.6.tgz",
"integrity": "sha512-aby/PohmmgbShcHqFsZVzG8H6D98+P+A6xRWRrQcLW1pCjabcov5UUlke4UqNQBYTkDQav+jB4zyyDDeKB2GaA==", "integrity": "sha512-2Vp13QdKysH3HIWLaYLhUUwbK+jbZonJD1K+Lr0d0RO4wH7mkYd43vJixEDm8cUWrowoRz4UUHF1nm9Ae7ym8A==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -992,9 +992,9 @@
} }
}, },
"node_modules/@biomejs/cli-win32-arm64": { "node_modules/@biomejs/cli-win32-arm64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.6.tgz",
"integrity": "sha512-emoXexPZIPAZkz2RKmA95WJUqK3I5MJNYtwEbL5ESciRzhmFMMyekDhNG8hpeOaK+ZGRDxAU4wvGuA5IHQ0h0w==", "integrity": "sha512-tDGshcm6BdkZOCGnTDX0Y8/U4IfBSlnUU7T56nNDuPEfed+aHg+u8G36NB43fJVl0Os6+QURXIE1yuD7AaEofA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@@ -1009,9 +1009,9 @@
} }
}, },
"node_modules/@biomejs/cli-win32-x64": { "node_modules/@biomejs/cli-win32-x64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.6.tgz",
"integrity": "sha512-U1jaluLw1qQc2Tx7/CeSoL9N5XcqIH+GWjpUAy1ouB5nVjSCMNO+NNHdY3RAs8zxNurLWAdj6pehQdCA2zyU+Q==", "integrity": "sha512-WN05KwXnTO/2J45RQPvzZMXf7tZUIofHoR35xIPfCo7pQ2RFidxI8sfb5mGsaTxdMmEOzHzOPRCdA5/fCpc7xQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@@ -4994,9 +4994,9 @@
} }
}, },
"node_modules/smol-toml": { "node_modules/smol-toml": {
"version": "1.7.0", "version": "1.7.1",
"resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.1.tgz",
"integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", "integrity": "sha512-PPlsspAZ4jbMBu5DMFhfUGDQLu/vrL4SyBROVS37x8ynnVmFIs1VPBz1Co8Xks3TvpIaZXmU85y4DrQ+UyVFoQ==",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"engines": { "engines": {
"node": ">= 18" "node": ">= 18"
@@ -5436,9 +5436,9 @@
} }
}, },
"node_modules/undici": { "node_modules/undici": {
"version": "8.7.0", "version": "8.10.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-8.7.0.tgz", "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz",
"integrity": "sha512-N7iQtfyLhIMOFgQubvmLV26svHpO0bqKnAiWotTQCVKCmWrcGbBotPuW1x+xwYZ2VHdSTVUfPQQnlEt1/LouTQ==", "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=22.19.0" "node": ">=22.19.0"
@@ -6377,74 +6377,74 @@
"dev": true "dev": true
}, },
"@biomejs/biome": { "@biomejs/biome": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.6.tgz",
"integrity": "sha512-xy5FNE5kQJKyK5MR1gJy6ztXYx4WBAbYGlK04lMEgmyPRWKybY9NFwiG9yo0XdzOU8Xvhj41u034J1ywfoWfMw==", "integrity": "sha512-lxVNjv7UF6KfhMJfL9gaUHbWdJdHbsAj6OSmwSYNdhRuG67NxNQ4Xdvh3TUxsSK9sBzJBQhEJj3AopmmNJ5pSA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@biomejs/cli-darwin-arm64": "2.5.4", "@biomejs/cli-darwin-arm64": "2.5.6",
"@biomejs/cli-darwin-x64": "2.5.4", "@biomejs/cli-darwin-x64": "2.5.6",
"@biomejs/cli-linux-arm64": "2.5.4", "@biomejs/cli-linux-arm64": "2.5.6",
"@biomejs/cli-linux-arm64-musl": "2.5.4", "@biomejs/cli-linux-arm64-musl": "2.5.6",
"@biomejs/cli-linux-x64": "2.5.4", "@biomejs/cli-linux-x64": "2.5.6",
"@biomejs/cli-linux-x64-musl": "2.5.4", "@biomejs/cli-linux-x64-musl": "2.5.6",
"@biomejs/cli-win32-arm64": "2.5.4", "@biomejs/cli-win32-arm64": "2.5.6",
"@biomejs/cli-win32-x64": "2.5.4" "@biomejs/cli-win32-x64": "2.5.6"
} }
}, },
"@biomejs/cli-darwin-arm64": { "@biomejs/cli-darwin-arm64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.6.tgz",
"integrity": "sha512-4o3NFRobXHynkgcFVrlZsoDAFtF2ldlEGN8sORSws5ZQqyY4PXnPUIylu4ksfyHuwkfvDREuWh3JK+niRwGq3w==", "integrity": "sha512-zMOLZP4oMrjh6m1zcSj1ud2awUPgTuMVbmQhYYWL7J8HwCnbHHBvTm7VBTRuY7epT5bez76IpKYQ11ZAqHFlnw==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@biomejs/cli-darwin-x64": { "@biomejs/cli-darwin-x64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.6.tgz",
"integrity": "sha512-D32P5HkU2Y6PySuC/WsVDTOgsDwVFmujzhhhOQjajtATpVWFDXuVd3oRbsWNSEA+aaFzyzZm22szsyydBYlSyQ==", "integrity": "sha512-JAC1VqzvO7Th5ZplU0G2uGfkZbxEe9uDDektPAhF0JLusoz1w+T4okp2bkykI0bbaO2vslKiRfj4gU43JaGreA==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@biomejs/cli-linux-arm64": { "@biomejs/cli-linux-arm64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.6.tgz",
"integrity": "sha512-pSEfW7B8kTsXUjUxC1xVVK+y85Ht3C5XxZ9gclmC7/3Ku9Vqz8jmI7k0p/BNIjQ6t4sFERI2sFeH73ybiZl6YQ==", "integrity": "sha512-6XsYwCFkp5sMxl85ffhgeGpGgs6A7dRYFnkceZ7WVxvycuTnGdD5xa534Z3xfrBQ0JCMK/mujT6ZNPJoghedwg==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@biomejs/cli-linux-arm64-musl": { "@biomejs/cli-linux-arm64-musl": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.6.tgz",
"integrity": "sha512-Rpm5/AT1m+DlJmUoYvS4/vXc+0tXJPJ2NQz25TGPyHVF5JrWy75PE0GH6kVxsKtQDuCH4OgzquZq0R4kj/wCVg==", "integrity": "sha512-eUa3jeeYvfMt19LBeh6E5PUZpxnTC4JqNWo+EDjTtQjAr2xLGnWaxACtVU1DQqmHYbvThlJzLX+ZsYgrqh2qVw==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@biomejs/cli-linux-x64": { "@biomejs/cli-linux-x64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.6.tgz",
"integrity": "sha512-FNxojWJkL7EajAuzBgoLe0T2G0y112M4lBrDIFl/DomFTx8yqenYOIdsRLNXvOvBBofE8hJi85LjzLmBDpY7/Q==", "integrity": "sha512-Pop9VXCFUhFTMfFefZ39S+u2rOPyNp5iHlxbZRwXGACHLy2r0jjiRgJHmaEKJzL3SyxlVeGShXhvvElvWowonA==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@biomejs/cli-linux-x64-musl": { "@biomejs/cli-linux-x64-musl": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.6.tgz",
"integrity": "sha512-aby/PohmmgbShcHqFsZVzG8H6D98+P+A6xRWRrQcLW1pCjabcov5UUlke4UqNQBYTkDQav+jB4zyyDDeKB2GaA==", "integrity": "sha512-2Vp13QdKysH3HIWLaYLhUUwbK+jbZonJD1K+Lr0d0RO4wH7mkYd43vJixEDm8cUWrowoRz4UUHF1nm9Ae7ym8A==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@biomejs/cli-win32-arm64": { "@biomejs/cli-win32-arm64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.6.tgz",
"integrity": "sha512-emoXexPZIPAZkz2RKmA95WJUqK3I5MJNYtwEbL5ESciRzhmFMMyekDhNG8hpeOaK+ZGRDxAU4wvGuA5IHQ0h0w==", "integrity": "sha512-tDGshcm6BdkZOCGnTDX0Y8/U4IfBSlnUU7T56nNDuPEfed+aHg+u8G36NB43fJVl0Os6+QURXIE1yuD7AaEofA==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"@biomejs/cli-win32-x64": { "@biomejs/cli-win32-x64": {
"version": "2.5.4", "version": "2.5.6",
"resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.4.tgz", "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.6.tgz",
"integrity": "sha512-U1jaluLw1qQc2Tx7/CeSoL9N5XcqIH+GWjpUAy1ouB5nVjSCMNO+NNHdY3RAs8zxNurLWAdj6pehQdCA2zyU+Q==", "integrity": "sha512-WN05KwXnTO/2J45RQPvzZMXf7tZUIofHoR35xIPfCo7pQ2RFidxI8sfb5mGsaTxdMmEOzHzOPRCdA5/fCpc7xQ==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
@@ -9035,9 +9035,9 @@
"dev": true "dev": true
}, },
"smol-toml": { "smol-toml": {
"version": "1.7.0", "version": "1.7.1",
"resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.1.tgz",
"integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==" "integrity": "sha512-PPlsspAZ4jbMBu5DMFhfUGDQLu/vrL4SyBROVS37x8ynnVmFIs1VPBz1Co8Xks3TvpIaZXmU85y4DrQ+UyVFoQ=="
}, },
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
@@ -9303,9 +9303,9 @@
"optional": true "optional": true
}, },
"undici": { "undici": {
"version": "8.7.0", "version": "8.10.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-8.7.0.tgz", "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz",
"integrity": "sha512-N7iQtfyLhIMOFgQubvmLV26svHpO0bqKnAiWotTQCVKCmWrcGbBotPuW1x+xwYZ2VHdSTVUfPQQnlEt1/LouTQ==" "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ=="
}, },
"undici-types": { "undici-types": {
"version": "8.3.0", "version": "8.3.0",
+3 -3
View File
@@ -35,11 +35,11 @@
"@actions/io": "^3.0.2", "@actions/io": "^3.0.2",
"@actions/tool-cache": "^4.0.0", "@actions/tool-cache": "^4.0.0",
"@renovatebot/pep440": "^5.0.0", "@renovatebot/pep440": "^5.0.0",
"smol-toml": "^1.7.0", "smol-toml": "^1.7.1",
"undici": "^8.7.0" "undici": "^8.10.0"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.5.4", "@biomejs/biome": "^2.5.6",
"@types/js-yaml": "^4.0.9", "@types/js-yaml": "^4.0.9",
"@types/node": "^26.1.1", "@types/node": "^26.1.1",
"@types/semver": "^7.7.1", "@types/semver": "^7.7.1",