agent-shim 8.2.0 → 8.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/cli.cjs +1623 -643
- package/dist/index.cjs +951 -42
- package/dist/index.mjs +924 -33
- package/dist/types/index.d.ts +314 -2
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -7566,10 +7566,10 @@ var require_util2 = __commonJS({
|
|
|
7566
7566
|
}
|
|
7567
7567
|
return obj;
|
|
7568
7568
|
}
|
|
7569
|
-
function errorRequest(client,
|
|
7569
|
+
function errorRequest(client, request7, err) {
|
|
7570
7570
|
try {
|
|
7571
|
-
|
|
7572
|
-
assert2(
|
|
7571
|
+
request7.onError(err);
|
|
7572
|
+
assert2(request7.aborted);
|
|
7573
7573
|
} catch (err2) {
|
|
7574
7574
|
client.emit("error", err2);
|
|
7575
7575
|
}
|
|
@@ -8243,7 +8243,7 @@ var require_request = __commonJS({
|
|
|
8243
8243
|
return this;
|
|
8244
8244
|
}
|
|
8245
8245
|
};
|
|
8246
|
-
function processHeader(
|
|
8246
|
+
function processHeader(request7, key, val) {
|
|
8247
8247
|
if (val && (typeof val === "object" && !Array.isArray(val))) {
|
|
8248
8248
|
throw new InvalidArgumentError2(`invalid ${key} header`);
|
|
8249
8249
|
} else if (val === void 0) {
|
|
@@ -8290,24 +8290,24 @@ var require_request = __commonJS({
|
|
|
8290
8290
|
}
|
|
8291
8291
|
}
|
|
8292
8292
|
if (headerName === "host") {
|
|
8293
|
-
if (
|
|
8293
|
+
if (request7.host !== null) {
|
|
8294
8294
|
throw new InvalidArgumentError2("duplicate host header");
|
|
8295
8295
|
}
|
|
8296
8296
|
if (typeof val !== "string") {
|
|
8297
8297
|
throw new InvalidArgumentError2("invalid host header");
|
|
8298
8298
|
}
|
|
8299
|
-
|
|
8299
|
+
request7.host = val;
|
|
8300
8300
|
} else if (headerName === "content-length") {
|
|
8301
|
-
if (
|
|
8301
|
+
if (request7.contentLength !== null) {
|
|
8302
8302
|
throw new InvalidArgumentError2("duplicate content-length header");
|
|
8303
8303
|
}
|
|
8304
8304
|
if (!isValidContentLengthHeaderValue(val)) {
|
|
8305
8305
|
throw new InvalidArgumentError2("invalid content-length header");
|
|
8306
8306
|
}
|
|
8307
|
-
|
|
8308
|
-
} else if (
|
|
8309
|
-
|
|
8310
|
-
|
|
8307
|
+
request7.contentLength = parseInt(val, 10);
|
|
8308
|
+
} else if (request7.contentType === null && headerName === "content-type") {
|
|
8309
|
+
request7.contentType = val;
|
|
8310
|
+
request7.headers.push(key, val);
|
|
8311
8311
|
} else if (headerName === "transfer-encoding" || headerName === "keep-alive" || headerName === "upgrade") {
|
|
8312
8312
|
throw new InvalidArgumentError2(`invalid ${headerName} header`);
|
|
8313
8313
|
} else if (headerName === "connection") {
|
|
@@ -8321,13 +8321,13 @@ var require_request = __commonJS({
|
|
|
8321
8321
|
throw new InvalidArgumentError2("invalid connection header");
|
|
8322
8322
|
}
|
|
8323
8323
|
if (trimmed === "close") {
|
|
8324
|
-
|
|
8324
|
+
request7.reset = true;
|
|
8325
8325
|
}
|
|
8326
8326
|
}
|
|
8327
8327
|
} else if (headerName === "expect") {
|
|
8328
8328
|
throw new NotSupportedError("expect header not supported");
|
|
8329
8329
|
} else {
|
|
8330
|
-
|
|
8330
|
+
request7.headers.push(key, val);
|
|
8331
8331
|
}
|
|
8332
8332
|
}
|
|
8333
8333
|
module2.exports = Request;
|
|
@@ -10920,11 +10920,11 @@ var require_util3 = __commonJS({
|
|
|
10920
10920
|
function normalizeBinaryStringToUtf8(value) {
|
|
10921
10921
|
return Buffer.from(value, "binary").toString("utf8");
|
|
10922
10922
|
}
|
|
10923
|
-
function requestCurrentURL(
|
|
10924
|
-
return
|
|
10923
|
+
function requestCurrentURL(request7) {
|
|
10924
|
+
return request7.urlList[request7.urlList.length - 1];
|
|
10925
10925
|
}
|
|
10926
|
-
function requestBadPort(
|
|
10927
|
-
const url2 = requestCurrentURL(
|
|
10926
|
+
function requestBadPort(request7) {
|
|
10927
|
+
const url2 = requestCurrentURL(request7);
|
|
10928
10928
|
if (urlIsHttpHttpsScheme(url2) && badPortsSet.has(url2.port)) {
|
|
10929
10929
|
return "blocked";
|
|
10930
10930
|
}
|
|
@@ -10962,10 +10962,10 @@ var require_util3 = __commonJS({
|
|
|
10962
10962
|
}
|
|
10963
10963
|
return policy;
|
|
10964
10964
|
}
|
|
10965
|
-
function setRequestReferrerPolicyOnRedirect(
|
|
10965
|
+
function setRequestReferrerPolicyOnRedirect(request7, actualResponse) {
|
|
10966
10966
|
const policy = parseReferrerPolicy(actualResponse);
|
|
10967
10967
|
if (policy !== "") {
|
|
10968
|
-
|
|
10968
|
+
request7.referrerPolicy = policy;
|
|
10969
10969
|
}
|
|
10970
10970
|
}
|
|
10971
10971
|
function crossOriginResourcePolicyCheck() {
|
|
@@ -10982,33 +10982,33 @@ var require_util3 = __commonJS({
|
|
|
10982
10982
|
header = httpRequest.mode;
|
|
10983
10983
|
httpRequest.headersList.set("sec-fetch-mode", header, true);
|
|
10984
10984
|
}
|
|
10985
|
-
function appendRequestOriginHeader(
|
|
10986
|
-
let serializedOrigin =
|
|
10985
|
+
function appendRequestOriginHeader(request7) {
|
|
10986
|
+
let serializedOrigin = request7.origin;
|
|
10987
10987
|
if (serializedOrigin === "client" || serializedOrigin === void 0) {
|
|
10988
10988
|
return;
|
|
10989
10989
|
}
|
|
10990
|
-
if (
|
|
10991
|
-
|
|
10992
|
-
} else if (
|
|
10993
|
-
switch (
|
|
10990
|
+
if (request7.responseTainting === "cors" || request7.mode === "websocket") {
|
|
10991
|
+
request7.headersList.append("origin", serializedOrigin, true);
|
|
10992
|
+
} else if (request7.method !== "GET" && request7.method !== "HEAD") {
|
|
10993
|
+
switch (request7.referrerPolicy) {
|
|
10994
10994
|
case "no-referrer":
|
|
10995
10995
|
serializedOrigin = null;
|
|
10996
10996
|
break;
|
|
10997
10997
|
case "no-referrer-when-downgrade":
|
|
10998
10998
|
case "strict-origin":
|
|
10999
10999
|
case "strict-origin-when-cross-origin":
|
|
11000
|
-
if (
|
|
11000
|
+
if (request7.origin && urlHasHttpsScheme(request7.origin) && !urlHasHttpsScheme(requestCurrentURL(request7))) {
|
|
11001
11001
|
serializedOrigin = null;
|
|
11002
11002
|
}
|
|
11003
11003
|
break;
|
|
11004
11004
|
case "same-origin":
|
|
11005
|
-
if (!sameOrigin(
|
|
11005
|
+
if (!sameOrigin(request7, requestCurrentURL(request7))) {
|
|
11006
11006
|
serializedOrigin = null;
|
|
11007
11007
|
}
|
|
11008
11008
|
break;
|
|
11009
11009
|
default:
|
|
11010
11010
|
}
|
|
11011
|
-
|
|
11011
|
+
request7.headersList.append("origin", serializedOrigin, true);
|
|
11012
11012
|
}
|
|
11013
11013
|
}
|
|
11014
11014
|
function coarsenTime(timestamp, crossOriginIsolatedCapability) {
|
|
@@ -11062,18 +11062,18 @@ var require_util3 = __commonJS({
|
|
|
11062
11062
|
referrerPolicy: policyContainer.referrerPolicy
|
|
11063
11063
|
};
|
|
11064
11064
|
}
|
|
11065
|
-
function determineRequestsReferrer(
|
|
11066
|
-
const policy =
|
|
11065
|
+
function determineRequestsReferrer(request7) {
|
|
11066
|
+
const policy = request7.referrerPolicy;
|
|
11067
11067
|
assert2(policy);
|
|
11068
11068
|
let referrerSource = null;
|
|
11069
|
-
if (
|
|
11069
|
+
if (request7.referrer === "client") {
|
|
11070
11070
|
const globalOrigin = getGlobalOrigin();
|
|
11071
11071
|
if (!globalOrigin || globalOrigin.origin === "null") {
|
|
11072
11072
|
return "no-referrer";
|
|
11073
11073
|
}
|
|
11074
11074
|
referrerSource = new URL(globalOrigin);
|
|
11075
|
-
} else if (webidl.is.URL(
|
|
11076
|
-
referrerSource =
|
|
11075
|
+
} else if (webidl.is.URL(request7.referrer)) {
|
|
11076
|
+
referrerSource = request7.referrer;
|
|
11077
11077
|
}
|
|
11078
11078
|
let referrerURL = stripURLForReferrer(referrerSource);
|
|
11079
11079
|
const referrerOrigin = stripURLForReferrer(referrerSource, true);
|
|
@@ -11091,14 +11091,14 @@ var require_util3 = __commonJS({
|
|
|
11091
11091
|
case "unsafe-url":
|
|
11092
11092
|
return referrerURL;
|
|
11093
11093
|
case "strict-origin": {
|
|
11094
|
-
const currentURL = requestCurrentURL(
|
|
11094
|
+
const currentURL = requestCurrentURL(request7);
|
|
11095
11095
|
if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {
|
|
11096
11096
|
return "no-referrer";
|
|
11097
11097
|
}
|
|
11098
11098
|
return referrerOrigin;
|
|
11099
11099
|
}
|
|
11100
11100
|
case "strict-origin-when-cross-origin": {
|
|
11101
|
-
const currentURL = requestCurrentURL(
|
|
11101
|
+
const currentURL = requestCurrentURL(request7);
|
|
11102
11102
|
if (sameOrigin(referrerURL, currentURL)) {
|
|
11103
11103
|
return referrerURL;
|
|
11104
11104
|
}
|
|
@@ -11108,17 +11108,17 @@ var require_util3 = __commonJS({
|
|
|
11108
11108
|
return referrerOrigin;
|
|
11109
11109
|
}
|
|
11110
11110
|
case "same-origin":
|
|
11111
|
-
if (sameOrigin(
|
|
11111
|
+
if (sameOrigin(request7, referrerURL)) {
|
|
11112
11112
|
return referrerURL;
|
|
11113
11113
|
}
|
|
11114
11114
|
return "no-referrer";
|
|
11115
11115
|
case "origin-when-cross-origin":
|
|
11116
|
-
if (sameOrigin(
|
|
11116
|
+
if (sameOrigin(request7, referrerURL)) {
|
|
11117
11117
|
return referrerURL;
|
|
11118
11118
|
}
|
|
11119
11119
|
return referrerOrigin;
|
|
11120
11120
|
case "no-referrer-when-downgrade": {
|
|
11121
|
-
const currentURL = requestCurrentURL(
|
|
11121
|
+
const currentURL = requestCurrentURL(request7);
|
|
11122
11122
|
if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {
|
|
11123
11123
|
return "no-referrer";
|
|
11124
11124
|
}
|
|
@@ -11185,7 +11185,7 @@ var require_util3 = __commonJS({
|
|
|
11185
11185
|
if (url2.protocol === "blob:") return true;
|
|
11186
11186
|
return isOriginPotentiallyTrustworthy(url2.origin);
|
|
11187
11187
|
}
|
|
11188
|
-
function tryUpgradeRequestToAPotentiallyTrustworthyURL(
|
|
11188
|
+
function tryUpgradeRequestToAPotentiallyTrustworthyURL(request7) {
|
|
11189
11189
|
}
|
|
11190
11190
|
function sameOrigin(A, B) {
|
|
11191
11191
|
if (A.origin === B.origin && A.origin === "null") {
|
|
@@ -11564,7 +11564,7 @@ var require_util3 = __commonJS({
|
|
|
11564
11564
|
}
|
|
11565
11565
|
return gettingDecodingSplitting(value);
|
|
11566
11566
|
}
|
|
11567
|
-
function hasAuthenticationEntry(
|
|
11567
|
+
function hasAuthenticationEntry(request7) {
|
|
11568
11568
|
return false;
|
|
11569
11569
|
}
|
|
11570
11570
|
function includesCredentials(url2) {
|
|
@@ -12792,11 +12792,11 @@ var require_client_h1 = __commonJS({
|
|
|
12792
12792
|
util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket)));
|
|
12793
12793
|
return -1;
|
|
12794
12794
|
}
|
|
12795
|
-
const
|
|
12796
|
-
if (!
|
|
12795
|
+
const request7 = client[kQueue][client[kRunningIdx]];
|
|
12796
|
+
if (!request7) {
|
|
12797
12797
|
return -1;
|
|
12798
12798
|
}
|
|
12799
|
-
|
|
12799
|
+
request7.onResponseStarted();
|
|
12800
12800
|
return 0;
|
|
12801
12801
|
}
|
|
12802
12802
|
/**
|
|
@@ -12858,9 +12858,9 @@ var require_client_h1 = __commonJS({
|
|
|
12858
12858
|
assert2(!socket.destroyed);
|
|
12859
12859
|
assert2(!this.paused);
|
|
12860
12860
|
assert2((headers.length & 1) === 0);
|
|
12861
|
-
const
|
|
12862
|
-
assert2(
|
|
12863
|
-
assert2(
|
|
12861
|
+
const request7 = client[kQueue][client[kRunningIdx]];
|
|
12862
|
+
assert2(request7);
|
|
12863
|
+
assert2(request7.upgrade || request7.method === "CONNECT");
|
|
12864
12864
|
this.statusCode = 0;
|
|
12865
12865
|
this.statusText = "";
|
|
12866
12866
|
this.shouldKeepAlive = false;
|
|
@@ -12877,7 +12877,7 @@ var require_client_h1 = __commonJS({
|
|
|
12877
12877
|
client[kQueue][client[kRunningIdx]++] = null;
|
|
12878
12878
|
client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade"));
|
|
12879
12879
|
try {
|
|
12880
|
-
|
|
12880
|
+
request7.onUpgrade(statusCode, headers, socket);
|
|
12881
12881
|
} catch (err) {
|
|
12882
12882
|
util.destroy(socket, err);
|
|
12883
12883
|
}
|
|
@@ -12898,8 +12898,8 @@ var require_client_h1 = __commonJS({
|
|
|
12898
12898
|
util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket)));
|
|
12899
12899
|
return -1;
|
|
12900
12900
|
}
|
|
12901
|
-
const
|
|
12902
|
-
if (!
|
|
12901
|
+
const request7 = client[kQueue][client[kRunningIdx]];
|
|
12902
|
+
if (!request7) {
|
|
12903
12903
|
return -1;
|
|
12904
12904
|
}
|
|
12905
12905
|
assert2(!this.upgrade);
|
|
@@ -12908,23 +12908,23 @@ var require_client_h1 = __commonJS({
|
|
|
12908
12908
|
util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket)));
|
|
12909
12909
|
return -1;
|
|
12910
12910
|
}
|
|
12911
|
-
if (upgrade && !
|
|
12911
|
+
if (upgrade && !request7.upgrade) {
|
|
12912
12912
|
util.destroy(socket, new SocketError("bad upgrade", util.getSocketInfo(socket)));
|
|
12913
12913
|
return -1;
|
|
12914
12914
|
}
|
|
12915
12915
|
assert2(this.timeoutType === TIMEOUT_HEADERS);
|
|
12916
12916
|
this.statusCode = statusCode;
|
|
12917
12917
|
this.shouldKeepAlive = shouldKeepAlive || // Override llhttp value which does not allow keepAlive for HEAD.
|
|
12918
|
-
|
|
12918
|
+
request7.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive";
|
|
12919
12919
|
if (this.statusCode >= 200) {
|
|
12920
|
-
const bodyTimeout =
|
|
12920
|
+
const bodyTimeout = request7.bodyTimeout != null ? request7.bodyTimeout : client[kBodyTimeout];
|
|
12921
12921
|
this.setTimeout(bodyTimeout, TIMEOUT_BODY);
|
|
12922
12922
|
} else if (this.timeout) {
|
|
12923
12923
|
if (this.timeout.refresh) {
|
|
12924
12924
|
this.timeout.refresh();
|
|
12925
12925
|
}
|
|
12926
12926
|
}
|
|
12927
|
-
if (
|
|
12927
|
+
if (request7.method === "CONNECT") {
|
|
12928
12928
|
assert2(client[kRunning] === 1);
|
|
12929
12929
|
this.upgrade = true;
|
|
12930
12930
|
return 2;
|
|
@@ -12955,11 +12955,11 @@ var require_client_h1 = __commonJS({
|
|
|
12955
12955
|
} else {
|
|
12956
12956
|
socket[kReset] = true;
|
|
12957
12957
|
}
|
|
12958
|
-
const pause =
|
|
12959
|
-
if (
|
|
12958
|
+
const pause = request7.onHeaders(statusCode, headers, this.resume, statusText) === false;
|
|
12959
|
+
if (request7.aborted) {
|
|
12960
12960
|
return -1;
|
|
12961
12961
|
}
|
|
12962
|
-
if (
|
|
12962
|
+
if (request7.method === "HEAD") {
|
|
12963
12963
|
return 1;
|
|
12964
12964
|
}
|
|
12965
12965
|
if (statusCode < 200) {
|
|
@@ -12980,8 +12980,8 @@ var require_client_h1 = __commonJS({
|
|
|
12980
12980
|
if (socket.destroyed) {
|
|
12981
12981
|
return -1;
|
|
12982
12982
|
}
|
|
12983
|
-
const
|
|
12984
|
-
assert2(
|
|
12983
|
+
const request7 = client[kQueue][client[kRunningIdx]];
|
|
12984
|
+
assert2(request7);
|
|
12985
12985
|
assert2(this.timeoutType === TIMEOUT_BODY);
|
|
12986
12986
|
if (this.timeout) {
|
|
12987
12987
|
if (this.timeout.refresh) {
|
|
@@ -12994,7 +12994,7 @@ var require_client_h1 = __commonJS({
|
|
|
12994
12994
|
return -1;
|
|
12995
12995
|
}
|
|
12996
12996
|
this.bytesRead += buf.length;
|
|
12997
|
-
if (
|
|
12997
|
+
if (request7.onData(buf) === false) {
|
|
12998
12998
|
return constants.ERROR.PAUSED;
|
|
12999
12999
|
}
|
|
13000
13000
|
return 0;
|
|
@@ -13012,8 +13012,8 @@ var require_client_h1 = __commonJS({
|
|
|
13012
13012
|
}
|
|
13013
13013
|
assert2(statusCode >= 100);
|
|
13014
13014
|
assert2((this.headers.length & 1) === 0);
|
|
13015
|
-
const
|
|
13016
|
-
assert2(
|
|
13015
|
+
const request7 = client[kQueue][client[kRunningIdx]];
|
|
13016
|
+
assert2(request7);
|
|
13017
13017
|
this.statusCode = 0;
|
|
13018
13018
|
this.statusText = "";
|
|
13019
13019
|
this.bytesRead = 0;
|
|
@@ -13025,11 +13025,11 @@ var require_client_h1 = __commonJS({
|
|
|
13025
13025
|
if (statusCode < 200) {
|
|
13026
13026
|
return 0;
|
|
13027
13027
|
}
|
|
13028
|
-
if (
|
|
13028
|
+
if (request7.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) {
|
|
13029
13029
|
util.destroy(socket, new ResponseContentLengthMismatchError());
|
|
13030
13030
|
return -1;
|
|
13031
13031
|
}
|
|
13032
|
-
|
|
13032
|
+
request7.onComplete(headers);
|
|
13033
13033
|
client[kQueue][client[kRunningIdx]++] = null;
|
|
13034
13034
|
socket[kSocketUsed] = client[kPending] === 0;
|
|
13035
13035
|
if (socket[kWriting]) {
|
|
@@ -13098,8 +13098,8 @@ var require_client_h1 = __commonJS({
|
|
|
13098
13098
|
return {
|
|
13099
13099
|
version: "h1",
|
|
13100
13100
|
defaultPipelining: 1,
|
|
13101
|
-
write(
|
|
13102
|
-
return writeH1(client,
|
|
13101
|
+
write(request7) {
|
|
13102
|
+
return writeH1(client, request7);
|
|
13103
13103
|
},
|
|
13104
13104
|
resume() {
|
|
13105
13105
|
resumeH1(client);
|
|
@@ -13126,18 +13126,18 @@ var require_client_h1 = __commonJS({
|
|
|
13126
13126
|
* @param {import('../core/request.js')} request
|
|
13127
13127
|
* @returns {boolean}
|
|
13128
13128
|
*/
|
|
13129
|
-
busy(
|
|
13129
|
+
busy(request7) {
|
|
13130
13130
|
if (socket[kWriting] || socket[kReset] || socket[kBlocking] || socket[kIdleSocketValidation] === 1) {
|
|
13131
13131
|
return true;
|
|
13132
13132
|
}
|
|
13133
|
-
if (
|
|
13134
|
-
if (client[kRunning] > 0 && !
|
|
13133
|
+
if (request7) {
|
|
13134
|
+
if (client[kRunning] > 0 && !request7.idempotent) {
|
|
13135
13135
|
return true;
|
|
13136
13136
|
}
|
|
13137
|
-
if (client[kRunning] > 0 && (
|
|
13137
|
+
if (client[kRunning] > 0 && (request7.upgrade || request7.method === "CONNECT")) {
|
|
13138
13138
|
return true;
|
|
13139
13139
|
}
|
|
13140
|
-
if (client[kRunning] > 0 && util.bodyLength(
|
|
13140
|
+
if (client[kRunning] > 0 && util.bodyLength(request7.body) !== 0 && (util.isStream(request7.body) || util.isAsyncIterable(request7.body) || util.isFormDataLike(request7.body))) {
|
|
13141
13141
|
return true;
|
|
13142
13142
|
}
|
|
13143
13143
|
}
|
|
@@ -13191,13 +13191,13 @@ var require_client_h1 = __commonJS({
|
|
|
13191
13191
|
assert2(client[kPending] === 0);
|
|
13192
13192
|
const requests = client[kQueue].splice(client[kRunningIdx]);
|
|
13193
13193
|
for (let i2 = 0; i2 < requests.length; i2++) {
|
|
13194
|
-
const
|
|
13195
|
-
util.errorRequest(client,
|
|
13194
|
+
const request7 = requests[i2];
|
|
13195
|
+
util.errorRequest(client, request7, err);
|
|
13196
13196
|
}
|
|
13197
13197
|
} else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") {
|
|
13198
|
-
const
|
|
13198
|
+
const request7 = client[kQueue][client[kRunningIdx]];
|
|
13199
13199
|
client[kQueue][client[kRunningIdx]++] = null;
|
|
13200
|
-
util.errorRequest(client,
|
|
13200
|
+
util.errorRequest(client, request7, err);
|
|
13201
13201
|
}
|
|
13202
13202
|
client[kPendingIdx] = client[kRunningIdx];
|
|
13203
13203
|
assert2(client[kRunning] === 0);
|
|
@@ -13265,8 +13265,8 @@ var require_client_h1 = __commonJS({
|
|
|
13265
13265
|
}
|
|
13266
13266
|
} else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) {
|
|
13267
13267
|
if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) {
|
|
13268
|
-
const
|
|
13269
|
-
const headersTimeout =
|
|
13268
|
+
const request7 = client[kQueue][client[kRunningIdx]];
|
|
13269
|
+
const headersTimeout = request7.headersTimeout != null ? request7.headersTimeout : client[kHeadersTimeout];
|
|
13270
13270
|
socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS);
|
|
13271
13271
|
}
|
|
13272
13272
|
}
|
|
@@ -13275,26 +13275,26 @@ var require_client_h1 = __commonJS({
|
|
|
13275
13275
|
function shouldSendContentLength(method) {
|
|
13276
13276
|
return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT";
|
|
13277
13277
|
}
|
|
13278
|
-
function writeH1(client,
|
|
13279
|
-
const { method, path: path41, host, upgrade, blocking, reset } =
|
|
13280
|
-
let { body, headers, contentLength } =
|
|
13278
|
+
function writeH1(client, request7) {
|
|
13279
|
+
const { method, path: path41, host, upgrade, blocking, reset } = request7;
|
|
13280
|
+
let { body, headers, contentLength } = request7;
|
|
13281
13281
|
const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH" || method === "QUERY" || method === "PROPFIND" || method === "PROPPATCH";
|
|
13282
13282
|
if (util.isFormDataLike(body)) {
|
|
13283
13283
|
if (!extractBody) {
|
|
13284
13284
|
extractBody = require_body().extractBody;
|
|
13285
13285
|
}
|
|
13286
13286
|
const [bodyStream, contentType] = extractBody(body);
|
|
13287
|
-
if (
|
|
13287
|
+
if (request7.contentType == null) {
|
|
13288
13288
|
headers.push("content-type", contentType);
|
|
13289
13289
|
}
|
|
13290
13290
|
body = bodyStream.stream;
|
|
13291
13291
|
contentLength = bodyStream.length;
|
|
13292
|
-
} else if (util.isBlobLike(body) &&
|
|
13292
|
+
} else if (util.isBlobLike(body) && request7.contentType == null) {
|
|
13293
13293
|
const contentType = body.type;
|
|
13294
13294
|
if (contentType) {
|
|
13295
13295
|
const contentTypeValue = `${contentType}`;
|
|
13296
13296
|
if (!util.isValidHeaderValue(contentTypeValue)) {
|
|
13297
|
-
util.errorRequest(client,
|
|
13297
|
+
util.errorRequest(client, request7, new InvalidArgumentError2("invalid content-type header"));
|
|
13298
13298
|
return false;
|
|
13299
13299
|
}
|
|
13300
13300
|
headers.push("content-type", contentTypeValue);
|
|
@@ -13306,14 +13306,14 @@ var require_client_h1 = __commonJS({
|
|
|
13306
13306
|
const bodyLength = util.bodyLength(body);
|
|
13307
13307
|
contentLength = bodyLength ?? contentLength;
|
|
13308
13308
|
if (contentLength === null) {
|
|
13309
|
-
contentLength =
|
|
13309
|
+
contentLength = request7.contentLength;
|
|
13310
13310
|
}
|
|
13311
13311
|
if (contentLength === 0 && !expectsPayload) {
|
|
13312
13312
|
contentLength = null;
|
|
13313
13313
|
}
|
|
13314
|
-
if (shouldSendContentLength(method) && contentLength > 0 &&
|
|
13314
|
+
if (shouldSendContentLength(method) && contentLength > 0 && request7.contentLength !== null && request7.contentLength !== contentLength) {
|
|
13315
13315
|
if (client[kStrictContentLength]) {
|
|
13316
|
-
util.errorRequest(client,
|
|
13316
|
+
util.errorRequest(client, request7, new RequestContentLengthMismatchError());
|
|
13317
13317
|
return false;
|
|
13318
13318
|
}
|
|
13319
13319
|
process.emitWarning(new RequestContentLengthMismatchError());
|
|
@@ -13321,19 +13321,19 @@ var require_client_h1 = __commonJS({
|
|
|
13321
13321
|
const socket = client[kSocket];
|
|
13322
13322
|
clearIdleSocketValidation(socket);
|
|
13323
13323
|
const abort = (err) => {
|
|
13324
|
-
if (
|
|
13324
|
+
if (request7.aborted || request7.completed) {
|
|
13325
13325
|
return;
|
|
13326
13326
|
}
|
|
13327
|
-
util.errorRequest(client,
|
|
13327
|
+
util.errorRequest(client, request7, err || new RequestAbortedError());
|
|
13328
13328
|
util.destroy(body);
|
|
13329
13329
|
util.destroy(socket, new InformationalError("aborted"));
|
|
13330
13330
|
};
|
|
13331
13331
|
try {
|
|
13332
|
-
|
|
13332
|
+
request7.onConnect(abort);
|
|
13333
13333
|
} catch (err) {
|
|
13334
|
-
util.errorRequest(client,
|
|
13334
|
+
util.errorRequest(client, request7, err);
|
|
13335
13335
|
}
|
|
13336
|
-
if (
|
|
13336
|
+
if (request7.aborted) {
|
|
13337
13337
|
return false;
|
|
13338
13338
|
}
|
|
13339
13339
|
if (method === "HEAD") {
|
|
@@ -13352,7 +13352,7 @@ var require_client_h1 = __commonJS({
|
|
|
13352
13352
|
socket[kBlocking] = true;
|
|
13353
13353
|
}
|
|
13354
13354
|
if (socket.setTypeOfService) {
|
|
13355
|
-
socket.setTypeOfService(
|
|
13355
|
+
socket.setTypeOfService(request7.typeOfService);
|
|
13356
13356
|
}
|
|
13357
13357
|
let header = `${method} ${path41} HTTP/1.1\r
|
|
13358
13358
|
`;
|
|
@@ -13387,31 +13387,31 @@ upgrade: ${upgrade}\r
|
|
|
13387
13387
|
}
|
|
13388
13388
|
}
|
|
13389
13389
|
if (channels.sendHeaders.hasSubscribers) {
|
|
13390
|
-
channels.sendHeaders.publish({ request:
|
|
13390
|
+
channels.sendHeaders.publish({ request: request7, headers: header, socket });
|
|
13391
13391
|
}
|
|
13392
13392
|
if (!body || bodyLength === 0) {
|
|
13393
|
-
writeBuffer(abort, null, client,
|
|
13393
|
+
writeBuffer(abort, null, client, request7, socket, contentLength, header, expectsPayload);
|
|
13394
13394
|
} else if (util.isBuffer(body)) {
|
|
13395
|
-
writeBuffer(abort, body, client,
|
|
13395
|
+
writeBuffer(abort, body, client, request7, socket, contentLength, header, expectsPayload);
|
|
13396
13396
|
} else if (util.isBlobLike(body)) {
|
|
13397
13397
|
if (typeof body.stream === "function") {
|
|
13398
|
-
writeIterable(abort, body.stream(), client,
|
|
13398
|
+
writeIterable(abort, body.stream(), client, request7, socket, contentLength, header, expectsPayload);
|
|
13399
13399
|
} else {
|
|
13400
|
-
writeBlob(abort, body, client,
|
|
13400
|
+
writeBlob(abort, body, client, request7, socket, contentLength, header, expectsPayload);
|
|
13401
13401
|
}
|
|
13402
13402
|
} else if (util.isStream(body)) {
|
|
13403
|
-
writeStream(abort, body, client,
|
|
13403
|
+
writeStream(abort, body, client, request7, socket, contentLength, header, expectsPayload);
|
|
13404
13404
|
} else if (util.isIterable(body)) {
|
|
13405
|
-
writeIterable(abort, body, client,
|
|
13405
|
+
writeIterable(abort, body, client, request7, socket, contentLength, header, expectsPayload);
|
|
13406
13406
|
} else {
|
|
13407
13407
|
assert2(false);
|
|
13408
13408
|
}
|
|
13409
13409
|
return true;
|
|
13410
13410
|
}
|
|
13411
|
-
function writeStream(abort, body, client,
|
|
13411
|
+
function writeStream(abort, body, client, request7, socket, contentLength, header, expectsPayload) {
|
|
13412
13412
|
assert2(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined");
|
|
13413
13413
|
let finished = false;
|
|
13414
|
-
const writer = new AsyncWriter({ abort, socket, request:
|
|
13414
|
+
const writer = new AsyncWriter({ abort, socket, request: request7, contentLength, client, expectsPayload, header });
|
|
13415
13415
|
const onData = function(chunk) {
|
|
13416
13416
|
if (finished) {
|
|
13417
13417
|
return;
|
|
@@ -13477,7 +13477,7 @@ upgrade: ${upgrade}\r
|
|
|
13477
13477
|
setImmediate(onClose);
|
|
13478
13478
|
}
|
|
13479
13479
|
}
|
|
13480
|
-
function writeBuffer(abort, body, client,
|
|
13480
|
+
function writeBuffer(abort, body, client, request7, socket, contentLength, header, expectsPayload) {
|
|
13481
13481
|
try {
|
|
13482
13482
|
if (!body) {
|
|
13483
13483
|
if (contentLength === 0) {
|
|
@@ -13497,18 +13497,18 @@ upgrade: ${upgrade}\r
|
|
|
13497
13497
|
`, "latin1");
|
|
13498
13498
|
socket.write(body);
|
|
13499
13499
|
socket.uncork();
|
|
13500
|
-
|
|
13501
|
-
if (!expectsPayload &&
|
|
13500
|
+
request7.onBodySent(body);
|
|
13501
|
+
if (!expectsPayload && request7.reset !== false) {
|
|
13502
13502
|
socket[kReset] = true;
|
|
13503
13503
|
}
|
|
13504
13504
|
}
|
|
13505
|
-
|
|
13505
|
+
request7.onRequestSent();
|
|
13506
13506
|
client[kResume]();
|
|
13507
13507
|
} catch (err) {
|
|
13508
13508
|
abort(err);
|
|
13509
13509
|
}
|
|
13510
13510
|
}
|
|
13511
|
-
async function writeBlob(abort, body, client,
|
|
13511
|
+
async function writeBlob(abort, body, client, request7, socket, contentLength, header, expectsPayload) {
|
|
13512
13512
|
assert2(contentLength === body.size, "blob body must have content length");
|
|
13513
13513
|
try {
|
|
13514
13514
|
if (contentLength != null && contentLength !== body.size) {
|
|
@@ -13521,9 +13521,9 @@ upgrade: ${upgrade}\r
|
|
|
13521
13521
|
`, "latin1");
|
|
13522
13522
|
socket.write(buffer);
|
|
13523
13523
|
socket.uncork();
|
|
13524
|
-
|
|
13525
|
-
|
|
13526
|
-
if (!expectsPayload &&
|
|
13524
|
+
request7.onBodySent(buffer);
|
|
13525
|
+
request7.onRequestSent();
|
|
13526
|
+
if (!expectsPayload && request7.reset !== false) {
|
|
13527
13527
|
socket[kReset] = true;
|
|
13528
13528
|
}
|
|
13529
13529
|
client[kResume]();
|
|
@@ -13531,7 +13531,7 @@ upgrade: ${upgrade}\r
|
|
|
13531
13531
|
abort(err);
|
|
13532
13532
|
}
|
|
13533
13533
|
}
|
|
13534
|
-
async function writeIterable(abort, body, client,
|
|
13534
|
+
async function writeIterable(abort, body, client, request7, socket, contentLength, header, expectsPayload) {
|
|
13535
13535
|
assert2(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined");
|
|
13536
13536
|
let callback = null;
|
|
13537
13537
|
function onDrain() {
|
|
@@ -13550,7 +13550,7 @@ upgrade: ${upgrade}\r
|
|
|
13550
13550
|
}
|
|
13551
13551
|
});
|
|
13552
13552
|
socket.on("close", onDrain).on("drain", onDrain);
|
|
13553
|
-
const writer = new AsyncWriter({ abort, socket, request:
|
|
13553
|
+
const writer = new AsyncWriter({ abort, socket, request: request7, contentLength, client, expectsPayload, header });
|
|
13554
13554
|
try {
|
|
13555
13555
|
for await (const chunk of body) {
|
|
13556
13556
|
if (socket[kError]) {
|
|
@@ -13579,9 +13579,9 @@ upgrade: ${upgrade}\r
|
|
|
13579
13579
|
* @param {boolean} arg.expectsPayload
|
|
13580
13580
|
* @param {string} arg.header
|
|
13581
13581
|
*/
|
|
13582
|
-
constructor({ abort, socket, request:
|
|
13582
|
+
constructor({ abort, socket, request: request7, contentLength, client, expectsPayload, header }) {
|
|
13583
13583
|
this.socket = socket;
|
|
13584
|
-
this.request =
|
|
13584
|
+
this.request = request7;
|
|
13585
13585
|
this.contentLength = contentLength;
|
|
13586
13586
|
this.client = client;
|
|
13587
13587
|
this.bytesWritten = 0;
|
|
@@ -13595,7 +13595,7 @@ upgrade: ${upgrade}\r
|
|
|
13595
13595
|
* @returns
|
|
13596
13596
|
*/
|
|
13597
13597
|
write(chunk) {
|
|
13598
|
-
const { socket, request:
|
|
13598
|
+
const { socket, request: request7, contentLength, client, bytesWritten, expectsPayload, header } = this;
|
|
13599
13599
|
if (socket[kError]) {
|
|
13600
13600
|
throw socket[kError];
|
|
13601
13601
|
}
|
|
@@ -13614,7 +13614,7 @@ upgrade: ${upgrade}\r
|
|
|
13614
13614
|
}
|
|
13615
13615
|
socket.cork();
|
|
13616
13616
|
if (bytesWritten === 0) {
|
|
13617
|
-
if (!expectsPayload &&
|
|
13617
|
+
if (!expectsPayload && request7.reset !== false) {
|
|
13618
13618
|
socket[kReset] = true;
|
|
13619
13619
|
}
|
|
13620
13620
|
if (contentLength === null) {
|
|
@@ -13634,7 +13634,7 @@ ${len.toString(16)}\r
|
|
|
13634
13634
|
this.bytesWritten += len;
|
|
13635
13635
|
const ret = socket.write(chunk);
|
|
13636
13636
|
socket.uncork();
|
|
13637
|
-
|
|
13637
|
+
request7.onBodySent(chunk);
|
|
13638
13638
|
if (!ret) {
|
|
13639
13639
|
if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) {
|
|
13640
13640
|
if (socket[kParser].timeout.refresh) {
|
|
@@ -13648,8 +13648,8 @@ ${len.toString(16)}\r
|
|
|
13648
13648
|
* @returns {void}
|
|
13649
13649
|
*/
|
|
13650
13650
|
end() {
|
|
13651
|
-
const { socket, contentLength, client, bytesWritten, expectsPayload, header, request:
|
|
13652
|
-
|
|
13651
|
+
const { socket, contentLength, client, bytesWritten, expectsPayload, header, request: request7 } = this;
|
|
13652
|
+
request7.onRequestSent();
|
|
13653
13653
|
socket[kWriting] = false;
|
|
13654
13654
|
if (socket[kError]) {
|
|
13655
13655
|
throw socket[kError];
|
|
@@ -13829,8 +13829,8 @@ var require_client_h2 = __commonJS({
|
|
|
13829
13829
|
* @param {import('../core/request.js')} request
|
|
13830
13830
|
* @returns {boolean}
|
|
13831
13831
|
*/
|
|
13832
|
-
write(
|
|
13833
|
-
return writeH2(client,
|
|
13832
|
+
write(request7) {
|
|
13833
|
+
return writeH2(client, request7);
|
|
13834
13834
|
},
|
|
13835
13835
|
/**
|
|
13836
13836
|
* @returns {void}
|
|
@@ -13859,14 +13859,14 @@ var require_client_h2 = __commonJS({
|
|
|
13859
13859
|
* @param {import('../core/request.js')} request
|
|
13860
13860
|
* @returns {boolean}
|
|
13861
13861
|
*/
|
|
13862
|
-
busy(
|
|
13863
|
-
if (
|
|
13862
|
+
busy(request7) {
|
|
13863
|
+
if (request7 != null) {
|
|
13864
13864
|
if (client[kRunning] > 0) {
|
|
13865
|
-
if (
|
|
13866
|
-
if ((
|
|
13867
|
-
if (util.bodyLength(
|
|
13865
|
+
if (request7.idempotent === false) return true;
|
|
13866
|
+
if ((request7.upgrade === "websocket" || request7.method === "CONNECT") && session[kRemoteSettings] === false) return true;
|
|
13867
|
+
if (util.bodyLength(request7.body) !== 0 && (util.isStream(request7.body) || util.isAsyncIterable(request7.body) || util.isFormDataLike(request7.body))) return true;
|
|
13868
13868
|
} else {
|
|
13869
|
-
return (
|
|
13869
|
+
return (request7.upgrade === "websocket" || request7.method === "CONNECT") && session[kRemoteSettings] === false;
|
|
13870
13870
|
}
|
|
13871
13871
|
}
|
|
13872
13872
|
return false;
|
|
@@ -13942,15 +13942,15 @@ var require_client_h2 = __commonJS({
|
|
|
13942
13942
|
this.destroy(err);
|
|
13943
13943
|
util.destroy(this[kSocket], err);
|
|
13944
13944
|
}
|
|
13945
|
-
function completeRequest(client,
|
|
13945
|
+
function completeRequest(client, request7, resetPendingIdx = false) {
|
|
13946
13946
|
const queue = client[kQueue];
|
|
13947
13947
|
const runningIdx = client[kRunningIdx];
|
|
13948
|
-
if (runningIdx < client[kPendingIdx] && queue[runningIdx] ===
|
|
13948
|
+
if (runningIdx < client[kPendingIdx] && queue[runningIdx] === request7) {
|
|
13949
13949
|
queue[runningIdx] = null;
|
|
13950
13950
|
client[kRunningIdx] = runningIdx + 1;
|
|
13951
13951
|
return;
|
|
13952
13952
|
}
|
|
13953
|
-
const index = queue.indexOf(
|
|
13953
|
+
const index = queue.indexOf(request7, runningIdx);
|
|
13954
13954
|
if (index === -1 || index >= client[kPendingIdx]) {
|
|
13955
13955
|
return;
|
|
13956
13956
|
}
|
|
@@ -13969,10 +13969,10 @@ var require_client_h2 = __commonJS({
|
|
|
13969
13969
|
this[kHTTP2Session] = null;
|
|
13970
13970
|
util.destroy(this[kSocket], err);
|
|
13971
13971
|
if (client[kRunningIdx] < client[kQueue].length) {
|
|
13972
|
-
const
|
|
13972
|
+
const request7 = client[kQueue][client[kRunningIdx]];
|
|
13973
13973
|
client[kQueue][client[kRunningIdx]++] = null;
|
|
13974
|
-
if (
|
|
13975
|
-
util.errorRequest(client,
|
|
13974
|
+
if (request7 != null) {
|
|
13975
|
+
util.errorRequest(client, request7, err);
|
|
13976
13976
|
}
|
|
13977
13977
|
client[kPendingIdx] = client[kRunningIdx];
|
|
13978
13978
|
}
|
|
@@ -13995,9 +13995,9 @@ var require_client_h2 = __commonJS({
|
|
|
13995
13995
|
assert2(client[kPending] === 0);
|
|
13996
13996
|
const requests = client[kQueue].splice(client[kRunningIdx]);
|
|
13997
13997
|
for (let i2 = 0; i2 < requests.length; i2++) {
|
|
13998
|
-
const
|
|
13999
|
-
if (
|
|
14000
|
-
util.errorRequest(client,
|
|
13998
|
+
const request7 = requests[i2];
|
|
13999
|
+
if (request7 != null) {
|
|
14000
|
+
util.errorRequest(client, request7, err);
|
|
14001
14001
|
}
|
|
14002
14002
|
}
|
|
14003
14003
|
}
|
|
@@ -14029,14 +14029,14 @@ var require_client_h2 = __commonJS({
|
|
|
14029
14029
|
function shouldSendContentLength(method) {
|
|
14030
14030
|
return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT";
|
|
14031
14031
|
}
|
|
14032
|
-
function writeH2(client,
|
|
14033
|
-
const headersTimeout =
|
|
14034
|
-
const bodyTimeout =
|
|
14032
|
+
function writeH2(client, request7) {
|
|
14033
|
+
const headersTimeout = request7.headersTimeout ?? client[kHeadersTimeout];
|
|
14034
|
+
const bodyTimeout = request7.bodyTimeout ?? client[kBodyTimeout];
|
|
14035
14035
|
const session = client[kHTTP2Session];
|
|
14036
|
-
const { method, path: path41, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } =
|
|
14037
|
-
let { body } =
|
|
14036
|
+
const { method, path: path41, host, upgrade, expectContinue, signal, protocol, headers: reqHeaders } = request7;
|
|
14037
|
+
let { body } = request7;
|
|
14038
14038
|
if (upgrade != null && upgrade !== "websocket") {
|
|
14039
|
-
util.errorRequest(client,
|
|
14039
|
+
util.errorRequest(client, request7, new InvalidArgumentError2(`Custom upgrade "${upgrade}" not supported over HTTP/2`));
|
|
14040
14040
|
return false;
|
|
14041
14041
|
}
|
|
14042
14042
|
const headers = {};
|
|
@@ -14070,33 +14070,33 @@ var require_client_h2 = __commonJS({
|
|
|
14070
14070
|
headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname3}${port ? `:${port}` : ""}`;
|
|
14071
14071
|
headers[HTTP2_HEADER_METHOD] = method;
|
|
14072
14072
|
const abort = (err) => {
|
|
14073
|
-
if (
|
|
14073
|
+
if (request7.aborted || request7.completed) {
|
|
14074
14074
|
return;
|
|
14075
14075
|
}
|
|
14076
14076
|
err = err || new RequestAbortedError();
|
|
14077
|
-
util.errorRequest(client,
|
|
14077
|
+
util.errorRequest(client, request7, err);
|
|
14078
14078
|
if (stream != null) {
|
|
14079
14079
|
stream.removeAllListeners("data");
|
|
14080
14080
|
stream.close();
|
|
14081
14081
|
client[kOnError](err);
|
|
14082
|
-
completeRequest(client,
|
|
14082
|
+
completeRequest(client, request7);
|
|
14083
14083
|
client[kResume]();
|
|
14084
14084
|
}
|
|
14085
14085
|
util.destroy(body, err);
|
|
14086
14086
|
};
|
|
14087
14087
|
try {
|
|
14088
|
-
|
|
14088
|
+
request7.onConnect(abort);
|
|
14089
14089
|
} catch (err) {
|
|
14090
|
-
util.errorRequest(client,
|
|
14090
|
+
util.errorRequest(client, request7, err);
|
|
14091
14091
|
}
|
|
14092
|
-
if (
|
|
14092
|
+
if (request7.aborted) {
|
|
14093
14093
|
return false;
|
|
14094
14094
|
}
|
|
14095
14095
|
if (upgrade || method === "CONNECT") {
|
|
14096
14096
|
session.ref();
|
|
14097
14097
|
if (upgrade === "websocket") {
|
|
14098
14098
|
if (session[kEnableConnectProtocol] === false) {
|
|
14099
|
-
util.errorRequest(client,
|
|
14099
|
+
util.errorRequest(client, request7, new InformationalError("HTTP/2: Extended CONNECT protocol not supported by server"));
|
|
14100
14100
|
session.unref();
|
|
14101
14101
|
return false;
|
|
14102
14102
|
}
|
|
@@ -14112,9 +14112,9 @@ var require_client_h2 = __commonJS({
|
|
|
14112
14112
|
stream[kHTTP2Stream] = true;
|
|
14113
14113
|
stream.once("response", (headers2, _flags) => {
|
|
14114
14114
|
const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2;
|
|
14115
|
-
|
|
14115
|
+
request7.onUpgrade(statusCode, parseH2Headers(realHeaders), stream);
|
|
14116
14116
|
++session[kOpenStreams];
|
|
14117
|
-
completeRequest(client,
|
|
14117
|
+
completeRequest(client, request7);
|
|
14118
14118
|
});
|
|
14119
14119
|
stream.on("error", () => {
|
|
14120
14120
|
if (stream.rstCode === NGHTTP2_REFUSED_STREAM || stream.rstCode === NGHTTP2_CANCEL) {
|
|
@@ -14132,9 +14132,9 @@ var require_client_h2 = __commonJS({
|
|
|
14132
14132
|
stream[kHTTP2Stream] = true;
|
|
14133
14133
|
stream.on("response", (headers2) => {
|
|
14134
14134
|
const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2;
|
|
14135
|
-
|
|
14135
|
+
request7.onUpgrade(statusCode, parseH2Headers(realHeaders), stream);
|
|
14136
14136
|
++session[kOpenStreams];
|
|
14137
|
-
completeRequest(client,
|
|
14137
|
+
completeRequest(client, request7);
|
|
14138
14138
|
});
|
|
14139
14139
|
stream.on("error", abort);
|
|
14140
14140
|
stream.once("close", () => {
|
|
@@ -14159,14 +14159,14 @@ var require_client_h2 = __commonJS({
|
|
|
14159
14159
|
contentLength = bodyStream.length;
|
|
14160
14160
|
}
|
|
14161
14161
|
if (contentLength == null) {
|
|
14162
|
-
contentLength =
|
|
14162
|
+
contentLength = request7.contentLength;
|
|
14163
14163
|
}
|
|
14164
14164
|
if (!expectsPayload) {
|
|
14165
14165
|
contentLength = null;
|
|
14166
14166
|
}
|
|
14167
|
-
if (shouldSendContentLength(method) && contentLength > 0 &&
|
|
14167
|
+
if (shouldSendContentLength(method) && contentLength > 0 && request7.contentLength != null && request7.contentLength !== contentLength) {
|
|
14168
14168
|
if (client[kStrictContentLength]) {
|
|
14169
|
-
util.errorRequest(client,
|
|
14169
|
+
util.errorRequest(client, request7, new RequestContentLengthMismatchError());
|
|
14170
14170
|
return false;
|
|
14171
14171
|
}
|
|
14172
14172
|
process.emitWarning(new RequestContentLengthMismatchError());
|
|
@@ -14182,7 +14182,7 @@ var require_client_h2 = __commonJS({
|
|
|
14182
14182
|
header += `${key}: ${headers[key]}\r
|
|
14183
14183
|
`;
|
|
14184
14184
|
}
|
|
14185
|
-
channels.sendHeaders.publish({ request:
|
|
14185
|
+
channels.sendHeaders.publish({ request: request7, headers: header, socket: session[kSocket] });
|
|
14186
14186
|
}
|
|
14187
14187
|
const shouldEndStream = method === "GET" || method === "HEAD" || body === null;
|
|
14188
14188
|
if (expectContinue) {
|
|
@@ -14203,21 +14203,21 @@ var require_client_h2 = __commonJS({
|
|
|
14203
14203
|
let responseReceived = false;
|
|
14204
14204
|
stream.once("response", (headers2) => {
|
|
14205
14205
|
const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2;
|
|
14206
|
-
|
|
14206
|
+
request7.onResponseStarted();
|
|
14207
14207
|
responseReceived = true;
|
|
14208
14208
|
stream.setTimeout(bodyTimeout);
|
|
14209
|
-
if (
|
|
14209
|
+
if (request7.aborted) {
|
|
14210
14210
|
stream.removeAllListeners("data");
|
|
14211
14211
|
return;
|
|
14212
14212
|
}
|
|
14213
|
-
if (
|
|
14213
|
+
if (request7.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), "") === false) {
|
|
14214
14214
|
stream.pause();
|
|
14215
14215
|
}
|
|
14216
14216
|
stream.on("data", (chunk) => {
|
|
14217
|
-
if (
|
|
14217
|
+
if (request7.aborted || request7.completed) {
|
|
14218
14218
|
return;
|
|
14219
14219
|
}
|
|
14220
|
-
if (
|
|
14220
|
+
if (request7.onData(chunk) === false) {
|
|
14221
14221
|
stream.pause();
|
|
14222
14222
|
}
|
|
14223
14223
|
});
|
|
@@ -14225,14 +14225,14 @@ var require_client_h2 = __commonJS({
|
|
|
14225
14225
|
stream.once("end", () => {
|
|
14226
14226
|
stream.removeAllListeners("data");
|
|
14227
14227
|
if (responseReceived) {
|
|
14228
|
-
if (!
|
|
14229
|
-
|
|
14228
|
+
if (!request7.aborted && !request7.completed) {
|
|
14229
|
+
request7.onComplete({});
|
|
14230
14230
|
}
|
|
14231
|
-
completeRequest(client,
|
|
14231
|
+
completeRequest(client, request7);
|
|
14232
14232
|
client[kResume]();
|
|
14233
14233
|
} else {
|
|
14234
14234
|
abort(new InformationalError("HTTP/2: stream half-closed (remote)"));
|
|
14235
|
-
completeRequest(client,
|
|
14235
|
+
completeRequest(client, request7, true);
|
|
14236
14236
|
client[kResume]();
|
|
14237
14237
|
}
|
|
14238
14238
|
});
|
|
@@ -14242,7 +14242,7 @@ var require_client_h2 = __commonJS({
|
|
|
14242
14242
|
if (session[kOpenStreams] === 0) {
|
|
14243
14243
|
session.unref();
|
|
14244
14244
|
}
|
|
14245
|
-
if (!
|
|
14245
|
+
if (!request7.aborted && !request7.completed) {
|
|
14246
14246
|
abort(new InformationalError("HTTP/2: stream closed before the response was complete"));
|
|
14247
14247
|
}
|
|
14248
14248
|
});
|
|
@@ -14267,11 +14267,11 @@ var require_client_h2 = __commonJS({
|
|
|
14267
14267
|
abort(err);
|
|
14268
14268
|
});
|
|
14269
14269
|
stream.once("trailers", (trailers) => {
|
|
14270
|
-
if (
|
|
14270
|
+
if (request7.aborted || request7.completed) {
|
|
14271
14271
|
return;
|
|
14272
14272
|
}
|
|
14273
14273
|
stream.removeAllListeners("data");
|
|
14274
|
-
|
|
14274
|
+
request7.onComplete(trailers);
|
|
14275
14275
|
});
|
|
14276
14276
|
return true;
|
|
14277
14277
|
function writeBodyH2() {
|
|
@@ -14281,7 +14281,7 @@ var require_client_h2 = __commonJS({
|
|
|
14281
14281
|
stream,
|
|
14282
14282
|
null,
|
|
14283
14283
|
client,
|
|
14284
|
-
|
|
14284
|
+
request7,
|
|
14285
14285
|
client[kSocket],
|
|
14286
14286
|
contentLength,
|
|
14287
14287
|
expectsPayload
|
|
@@ -14292,7 +14292,7 @@ var require_client_h2 = __commonJS({
|
|
|
14292
14292
|
stream,
|
|
14293
14293
|
body,
|
|
14294
14294
|
client,
|
|
14295
|
-
|
|
14295
|
+
request7,
|
|
14296
14296
|
client[kSocket],
|
|
14297
14297
|
contentLength,
|
|
14298
14298
|
expectsPayload
|
|
@@ -14304,7 +14304,7 @@ var require_client_h2 = __commonJS({
|
|
|
14304
14304
|
stream,
|
|
14305
14305
|
body.stream(),
|
|
14306
14306
|
client,
|
|
14307
|
-
|
|
14307
|
+
request7,
|
|
14308
14308
|
client[kSocket],
|
|
14309
14309
|
contentLength,
|
|
14310
14310
|
expectsPayload
|
|
@@ -14315,7 +14315,7 @@ var require_client_h2 = __commonJS({
|
|
|
14315
14315
|
stream,
|
|
14316
14316
|
body,
|
|
14317
14317
|
client,
|
|
14318
|
-
|
|
14318
|
+
request7,
|
|
14319
14319
|
client[kSocket],
|
|
14320
14320
|
contentLength,
|
|
14321
14321
|
expectsPayload
|
|
@@ -14329,7 +14329,7 @@ var require_client_h2 = __commonJS({
|
|
|
14329
14329
|
stream,
|
|
14330
14330
|
body,
|
|
14331
14331
|
client,
|
|
14332
|
-
|
|
14332
|
+
request7,
|
|
14333
14333
|
contentLength
|
|
14334
14334
|
);
|
|
14335
14335
|
} else if (util.isIterable(body)) {
|
|
@@ -14338,7 +14338,7 @@ var require_client_h2 = __commonJS({
|
|
|
14338
14338
|
stream,
|
|
14339
14339
|
body,
|
|
14340
14340
|
client,
|
|
14341
|
-
|
|
14341
|
+
request7,
|
|
14342
14342
|
client[kSocket],
|
|
14343
14343
|
contentLength,
|
|
14344
14344
|
expectsPayload
|
|
@@ -14348,7 +14348,7 @@ var require_client_h2 = __commonJS({
|
|
|
14348
14348
|
}
|
|
14349
14349
|
}
|
|
14350
14350
|
}
|
|
14351
|
-
function writeBuffer(abort, h2stream, body, client,
|
|
14351
|
+
function writeBuffer(abort, h2stream, body, client, request7, socket, contentLength, expectsPayload) {
|
|
14352
14352
|
try {
|
|
14353
14353
|
if (body != null && util.isBuffer(body)) {
|
|
14354
14354
|
assert2(contentLength === body.byteLength, "buffer body must have content length");
|
|
@@ -14356,18 +14356,18 @@ var require_client_h2 = __commonJS({
|
|
|
14356
14356
|
h2stream.write(body);
|
|
14357
14357
|
h2stream.uncork();
|
|
14358
14358
|
h2stream.end();
|
|
14359
|
-
|
|
14359
|
+
request7.onBodySent(body);
|
|
14360
14360
|
}
|
|
14361
14361
|
if (!expectsPayload) {
|
|
14362
14362
|
socket[kReset] = true;
|
|
14363
14363
|
}
|
|
14364
|
-
|
|
14364
|
+
request7.onRequestSent();
|
|
14365
14365
|
client[kResume]();
|
|
14366
14366
|
} catch (error62) {
|
|
14367
14367
|
abort(error62);
|
|
14368
14368
|
}
|
|
14369
14369
|
}
|
|
14370
|
-
function writeStream(abort, socket, expectsPayload, h2stream, body, client,
|
|
14370
|
+
function writeStream(abort, socket, expectsPayload, h2stream, body, client, request7, contentLength) {
|
|
14371
14371
|
assert2(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined");
|
|
14372
14372
|
const pipe2 = pipeline(
|
|
14373
14373
|
body,
|
|
@@ -14378,7 +14378,7 @@ var require_client_h2 = __commonJS({
|
|
|
14378
14378
|
abort(err);
|
|
14379
14379
|
} else {
|
|
14380
14380
|
util.removeAllListeners(pipe2);
|
|
14381
|
-
|
|
14381
|
+
request7.onRequestSent();
|
|
14382
14382
|
if (!expectsPayload) {
|
|
14383
14383
|
socket[kReset] = true;
|
|
14384
14384
|
}
|
|
@@ -14388,10 +14388,10 @@ var require_client_h2 = __commonJS({
|
|
|
14388
14388
|
);
|
|
14389
14389
|
util.addListener(pipe2, "data", onPipeData);
|
|
14390
14390
|
function onPipeData(chunk) {
|
|
14391
|
-
|
|
14391
|
+
request7.onBodySent(chunk);
|
|
14392
14392
|
}
|
|
14393
14393
|
}
|
|
14394
|
-
async function writeBlob(abort, h2stream, body, client,
|
|
14394
|
+
async function writeBlob(abort, h2stream, body, client, request7, socket, contentLength, expectsPayload) {
|
|
14395
14395
|
assert2(contentLength === body.size, "blob body must have content length");
|
|
14396
14396
|
try {
|
|
14397
14397
|
if (contentLength != null && contentLength !== body.size) {
|
|
@@ -14402,8 +14402,8 @@ var require_client_h2 = __commonJS({
|
|
|
14402
14402
|
h2stream.write(buffer);
|
|
14403
14403
|
h2stream.uncork();
|
|
14404
14404
|
h2stream.end();
|
|
14405
|
-
|
|
14406
|
-
|
|
14405
|
+
request7.onBodySent(buffer);
|
|
14406
|
+
request7.onRequestSent();
|
|
14407
14407
|
if (!expectsPayload) {
|
|
14408
14408
|
socket[kReset] = true;
|
|
14409
14409
|
}
|
|
@@ -14412,7 +14412,7 @@ var require_client_h2 = __commonJS({
|
|
|
14412
14412
|
abort(err);
|
|
14413
14413
|
}
|
|
14414
14414
|
}
|
|
14415
|
-
async function writeIterable(abort, h2stream, body, client,
|
|
14415
|
+
async function writeIterable(abort, h2stream, body, client, request7, socket, contentLength, expectsPayload) {
|
|
14416
14416
|
assert2(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined");
|
|
14417
14417
|
let callback = null;
|
|
14418
14418
|
function onDrain() {
|
|
@@ -14437,13 +14437,13 @@ var require_client_h2 = __commonJS({
|
|
|
14437
14437
|
throw socket[kError];
|
|
14438
14438
|
}
|
|
14439
14439
|
const res = h2stream.write(chunk);
|
|
14440
|
-
|
|
14440
|
+
request7.onBodySent(chunk);
|
|
14441
14441
|
if (!res) {
|
|
14442
14442
|
await waitForDrain();
|
|
14443
14443
|
}
|
|
14444
14444
|
}
|
|
14445
14445
|
h2stream.end();
|
|
14446
|
-
|
|
14446
|
+
request7.onRequestSent();
|
|
14447
14447
|
if (!expectsPayload) {
|
|
14448
14448
|
socket[kReset] = true;
|
|
14449
14449
|
}
|
|
@@ -14728,10 +14728,10 @@ var require_client = __commonJS({
|
|
|
14728
14728
|
this.once("connect", cb);
|
|
14729
14729
|
}
|
|
14730
14730
|
[kDispatch](opts, handler) {
|
|
14731
|
-
const
|
|
14732
|
-
this[kQueue].push(
|
|
14731
|
+
const request7 = new Request(this[kUrl].origin, opts, handler);
|
|
14732
|
+
this[kQueue].push(request7);
|
|
14733
14733
|
if (this[kResuming]) {
|
|
14734
|
-
} else if (util.bodyLength(
|
|
14734
|
+
} else if (util.bodyLength(request7.body) == null && util.isIterable(request7.body)) {
|
|
14735
14735
|
this[kResuming] = 1;
|
|
14736
14736
|
queueMicrotask(() => resume(this));
|
|
14737
14737
|
} else {
|
|
@@ -14755,9 +14755,9 @@ var require_client = __commonJS({
|
|
|
14755
14755
|
return new Promise((resolve) => {
|
|
14756
14756
|
const requests = this[kQueue].splice(this[kPendingIdx]);
|
|
14757
14757
|
for (let i2 = 0; i2 < requests.length; i2++) {
|
|
14758
|
-
const
|
|
14759
|
-
if (
|
|
14760
|
-
util.errorRequest(this,
|
|
14758
|
+
const request7 = requests[i2];
|
|
14759
|
+
if (request7 != null) {
|
|
14760
|
+
util.errorRequest(this, request7, err);
|
|
14761
14761
|
}
|
|
14762
14762
|
}
|
|
14763
14763
|
const callback = () => {
|
|
@@ -14782,9 +14782,9 @@ var require_client = __commonJS({
|
|
|
14782
14782
|
assert2(client[kPendingIdx] === client[kRunningIdx]);
|
|
14783
14783
|
const requests = client[kQueue].splice(client[kRunningIdx]);
|
|
14784
14784
|
for (let i2 = 0; i2 < requests.length; i2++) {
|
|
14785
|
-
const
|
|
14786
|
-
if (
|
|
14787
|
-
util.errorRequest(client,
|
|
14785
|
+
const request7 = requests[i2];
|
|
14786
|
+
if (request7 != null) {
|
|
14787
|
+
util.errorRequest(client, request7, err);
|
|
14788
14788
|
}
|
|
14789
14789
|
}
|
|
14790
14790
|
assert2(client[kSize] === 0);
|
|
@@ -14895,8 +14895,8 @@ var require_client = __commonJS({
|
|
|
14895
14895
|
if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") {
|
|
14896
14896
|
assert2(client[kRunning] === 0);
|
|
14897
14897
|
while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) {
|
|
14898
|
-
const
|
|
14899
|
-
util.errorRequest(client,
|
|
14898
|
+
const request7 = client[kQueue][client[kPendingIdx]++];
|
|
14899
|
+
util.errorRequest(client, request7, err);
|
|
14900
14900
|
}
|
|
14901
14901
|
} else {
|
|
14902
14902
|
onError(client, err);
|
|
@@ -14951,15 +14951,15 @@ var require_client = __commonJS({
|
|
|
14951
14951
|
if (client[kRunning] >= (getPipelining(client) || 1)) {
|
|
14952
14952
|
return;
|
|
14953
14953
|
}
|
|
14954
|
-
const
|
|
14955
|
-
if (
|
|
14954
|
+
const request7 = client[kQueue][client[kPendingIdx]];
|
|
14955
|
+
if (request7 === null) {
|
|
14956
14956
|
return;
|
|
14957
14957
|
}
|
|
14958
|
-
if (client[kUrl].protocol === "https:" && client[kServerName] !==
|
|
14958
|
+
if (client[kUrl].protocol === "https:" && client[kServerName] !== request7.servername) {
|
|
14959
14959
|
if (client[kRunning] > 0) {
|
|
14960
14960
|
return;
|
|
14961
14961
|
}
|
|
14962
|
-
client[kServerName] =
|
|
14962
|
+
client[kServerName] = request7.servername;
|
|
14963
14963
|
client[kHTTPContext]?.destroy(new InformationalError("servername changed"), () => {
|
|
14964
14964
|
client[kHTTPContext] = null;
|
|
14965
14965
|
resume(client);
|
|
@@ -14975,10 +14975,10 @@ var require_client = __commonJS({
|
|
|
14975
14975
|
if (client[kHTTPContext].destroyed) {
|
|
14976
14976
|
return;
|
|
14977
14977
|
}
|
|
14978
|
-
if (client[kHTTPContext].busy(
|
|
14978
|
+
if (client[kHTTPContext].busy(request7)) {
|
|
14979
14979
|
return;
|
|
14980
14980
|
}
|
|
14981
|
-
if (!
|
|
14981
|
+
if (!request7.aborted && client[kHTTPContext].write(request7)) {
|
|
14982
14982
|
client[kPendingIdx]++;
|
|
14983
14983
|
} else {
|
|
14984
14984
|
client[kQueue].splice(client[kPendingIdx], 1);
|
|
@@ -16030,13 +16030,13 @@ var require_socks5_client = __commonJS({
|
|
|
16030
16030
|
}
|
|
16031
16031
|
debug("starting handshake with", this.authMethods.length, "auth methods");
|
|
16032
16032
|
this.state = STATES.HANDSHAKING;
|
|
16033
|
-
const
|
|
16034
|
-
|
|
16035
|
-
|
|
16033
|
+
const request7 = Buffer2.alloc(2 + this.authMethods.length);
|
|
16034
|
+
request7[0] = SOCKS_VERSION;
|
|
16035
|
+
request7[1] = this.authMethods.length;
|
|
16036
16036
|
this.authMethods.forEach((method, i2) => {
|
|
16037
|
-
|
|
16037
|
+
request7[2 + i2] = method;
|
|
16038
16038
|
});
|
|
16039
|
-
this.socket.write(
|
|
16039
|
+
this.socket.write(request7);
|
|
16040
16040
|
}
|
|
16041
16041
|
/**
|
|
16042
16042
|
* Handle handshake response from server
|
|
@@ -16078,13 +16078,13 @@ var require_socks5_client = __commonJS({
|
|
|
16078
16078
|
if (usernameBuffer.length > 255 || passwordBuffer.length > 255) {
|
|
16079
16079
|
throw new InvalidArgumentError2("Username or password too long");
|
|
16080
16080
|
}
|
|
16081
|
-
const
|
|
16082
|
-
|
|
16083
|
-
|
|
16084
|
-
usernameBuffer.copy(
|
|
16085
|
-
|
|
16086
|
-
passwordBuffer.copy(
|
|
16087
|
-
this.socket.write(
|
|
16081
|
+
const request7 = Buffer2.alloc(3 + usernameBuffer.length + passwordBuffer.length);
|
|
16082
|
+
request7[0] = 1;
|
|
16083
|
+
request7[1] = usernameBuffer.length;
|
|
16084
|
+
usernameBuffer.copy(request7, 2);
|
|
16085
|
+
request7[2 + usernameBuffer.length] = passwordBuffer.length;
|
|
16086
|
+
passwordBuffer.copy(request7, 3 + usernameBuffer.length);
|
|
16087
|
+
this.socket.write(request7);
|
|
16088
16088
|
}
|
|
16089
16089
|
/**
|
|
16090
16090
|
* Handle authentication response
|
|
@@ -16119,22 +16119,22 @@ var require_socks5_client = __commonJS({
|
|
|
16119
16119
|
}
|
|
16120
16120
|
debug("connecting to", address, port);
|
|
16121
16121
|
this.state = STATES.CONNECTING;
|
|
16122
|
-
const
|
|
16123
|
-
this.socket.write(
|
|
16122
|
+
const request7 = this.buildConnectRequest(COMMANDS.CONNECT, address, port);
|
|
16123
|
+
this.socket.write(request7);
|
|
16124
16124
|
}
|
|
16125
16125
|
/**
|
|
16126
16126
|
* Build a SOCKS5 request
|
|
16127
16127
|
*/
|
|
16128
16128
|
buildConnectRequest(command, address, port) {
|
|
16129
16129
|
const { type: addressType, buffer: addressBuffer } = parseAddress(address);
|
|
16130
|
-
const
|
|
16131
|
-
|
|
16132
|
-
|
|
16133
|
-
|
|
16134
|
-
|
|
16135
|
-
addressBuffer.copy(
|
|
16136
|
-
|
|
16137
|
-
return
|
|
16130
|
+
const request7 = Buffer2.alloc(4 + addressBuffer.length + 2);
|
|
16131
|
+
request7[0] = SOCKS_VERSION;
|
|
16132
|
+
request7[1] = command;
|
|
16133
|
+
request7[2] = 0;
|
|
16134
|
+
request7[3] = addressType;
|
|
16135
|
+
addressBuffer.copy(request7, 4);
|
|
16136
|
+
request7.writeUInt16BE(port, 4 + addressBuffer.length);
|
|
16137
|
+
return request7;
|
|
16138
16138
|
}
|
|
16139
16139
|
/**
|
|
16140
16140
|
* Handle CONNECT response
|
|
@@ -17803,10 +17803,10 @@ var require_api_request = __commonJS({
|
|
|
17803
17803
|
}
|
|
17804
17804
|
}
|
|
17805
17805
|
};
|
|
17806
|
-
function
|
|
17806
|
+
function request7(opts, callback) {
|
|
17807
17807
|
if (callback === void 0) {
|
|
17808
17808
|
return new Promise((resolve, reject) => {
|
|
17809
|
-
|
|
17809
|
+
request7.call(this, opts, (err, data) => {
|
|
17810
17810
|
return err ? reject(err) : resolve(data);
|
|
17811
17811
|
});
|
|
17812
17812
|
});
|
|
@@ -17822,7 +17822,7 @@ var require_api_request = __commonJS({
|
|
|
17822
17822
|
queueMicrotask(() => callback(err, { opaque }));
|
|
17823
17823
|
}
|
|
17824
17824
|
}
|
|
17825
|
-
module2.exports =
|
|
17825
|
+
module2.exports = request7;
|
|
17826
17826
|
module2.exports.RequestHandler = RequestHandler;
|
|
17827
17827
|
}
|
|
17828
17828
|
});
|
|
@@ -19805,8 +19805,8 @@ var require_snapshot_recorder = __commonJS({
|
|
|
19805
19805
|
if (this.isUrlExcluded(requestOpts)) {
|
|
19806
19806
|
return;
|
|
19807
19807
|
}
|
|
19808
|
-
const
|
|
19809
|
-
const hash2 = createRequestHash(
|
|
19808
|
+
const request7 = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions);
|
|
19809
|
+
const hash2 = createRequestHash(request7);
|
|
19810
19810
|
const normalizedHeaders = normalizeHeaders(response.headers);
|
|
19811
19811
|
const responseData = {
|
|
19812
19812
|
statusCode: response.statusCode,
|
|
@@ -19824,7 +19824,7 @@ var require_snapshot_recorder = __commonJS({
|
|
|
19824
19824
|
existingSnapshot.timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
19825
19825
|
} else {
|
|
19826
19826
|
this.#snapshots.set(hash2, {
|
|
19827
|
-
request:
|
|
19827
|
+
request: request7,
|
|
19828
19828
|
responses: [responseData],
|
|
19829
19829
|
// Always store as array for consistency
|
|
19830
19830
|
callCount: 0,
|
|
@@ -19858,8 +19858,8 @@ var require_snapshot_recorder = __commonJS({
|
|
|
19858
19858
|
if (this.isUrlExcluded(requestOpts)) {
|
|
19859
19859
|
return void 0;
|
|
19860
19860
|
}
|
|
19861
|
-
const
|
|
19862
|
-
const hash2 = createRequestHash(
|
|
19861
|
+
const request7 = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions);
|
|
19862
|
+
const hash2 = createRequestHash(request7);
|
|
19863
19863
|
const snapshot = this.#snapshots.get(hash2);
|
|
19864
19864
|
if (!snapshot) return void 0;
|
|
19865
19865
|
const currentCallCount = snapshot.callCount || 0;
|
|
@@ -19954,8 +19954,8 @@ var require_snapshot_recorder = __commonJS({
|
|
|
19954
19954
|
* @returns {boolean} - True if snapshot was deleted, false if not found
|
|
19955
19955
|
*/
|
|
19956
19956
|
deleteSnapshot(requestOpts) {
|
|
19957
|
-
const
|
|
19958
|
-
const hash2 = createRequestHash(
|
|
19957
|
+
const request7 = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions);
|
|
19958
|
+
const hash2 = createRequestHash(request7);
|
|
19959
19959
|
return this.#snapshots.delete(hash2);
|
|
19960
19960
|
}
|
|
19961
19961
|
/**
|
|
@@ -19964,8 +19964,8 @@ var require_snapshot_recorder = __commonJS({
|
|
|
19964
19964
|
* @returns {SnapshotInfo|null} - Snapshot information or null if not found
|
|
19965
19965
|
*/
|
|
19966
19966
|
getSnapshotInfo(requestOpts) {
|
|
19967
|
-
const
|
|
19968
|
-
const hash2 = createRequestHash(
|
|
19967
|
+
const request7 = formatRequestKey(requestOpts, this.#headerFilters, this.matchOptions);
|
|
19968
|
+
const hash2 = createRequestHash(request7);
|
|
19969
19969
|
const snapshot = this.#snapshots.get(hash2);
|
|
19970
19970
|
if (!snapshot) return null;
|
|
19971
19971
|
return {
|
|
@@ -20256,16 +20256,16 @@ var require_snapshot_agent = __commonJS({
|
|
|
20256
20256
|
*/
|
|
20257
20257
|
#setupMockInterceptors() {
|
|
20258
20258
|
for (const snapshot of this[kSnapshotRecorder].getSnapshots()) {
|
|
20259
|
-
const { request:
|
|
20260
|
-
const url2 = new URL(
|
|
20259
|
+
const { request: request7, responses, response } = snapshot;
|
|
20260
|
+
const url2 = new URL(request7.url);
|
|
20261
20261
|
const mockPool = this.get(url2.origin);
|
|
20262
20262
|
const responseData = responses ? responses[0] : response;
|
|
20263
20263
|
if (!responseData) continue;
|
|
20264
20264
|
mockPool.intercept({
|
|
20265
20265
|
path: url2.pathname + url2.search,
|
|
20266
|
-
method:
|
|
20267
|
-
headers:
|
|
20268
|
-
body:
|
|
20266
|
+
method: request7.method,
|
|
20267
|
+
headers: request7.headers,
|
|
20268
|
+
body: request7.body
|
|
20269
20269
|
}).reply(responseData.statusCode, responseData.body, {
|
|
20270
20270
|
headers: responseData.headers,
|
|
20271
20271
|
trailers: responseData.trailers
|
|
@@ -25566,7 +25566,7 @@ var require_request2 = __commonJS({
|
|
|
25566
25566
|
webidl.argumentLengthCheck(arguments, 1, prefix);
|
|
25567
25567
|
input2 = webidl.converters.RequestInfo(input2);
|
|
25568
25568
|
init = webidl.converters.RequestInit(init);
|
|
25569
|
-
let
|
|
25569
|
+
let request7 = null;
|
|
25570
25570
|
let fallbackMode = null;
|
|
25571
25571
|
const baseUrl = environmentSettingsObject.settingsObject.baseUrl;
|
|
25572
25572
|
let signal = null;
|
|
@@ -25583,18 +25583,18 @@ var require_request2 = __commonJS({
|
|
|
25583
25583
|
"Request cannot be constructed from a URL that includes credentials: " + input2
|
|
25584
25584
|
);
|
|
25585
25585
|
}
|
|
25586
|
-
|
|
25586
|
+
request7 = makeRequest({ urlList: [parsedURL] });
|
|
25587
25587
|
fallbackMode = "cors";
|
|
25588
25588
|
} else {
|
|
25589
25589
|
assert2(webidl.is.Request(input2));
|
|
25590
|
-
|
|
25590
|
+
request7 = input2.#state;
|
|
25591
25591
|
signal = input2.#signal;
|
|
25592
25592
|
this.#dispatcher = init.dispatcher || input2.#dispatcher;
|
|
25593
25593
|
}
|
|
25594
25594
|
const origin = environmentSettingsObject.settingsObject.origin;
|
|
25595
25595
|
let window = "client";
|
|
25596
|
-
if (
|
|
25597
|
-
window =
|
|
25596
|
+
if (request7.window?.constructor?.name === "EnvironmentSettingsObject" && sameOrigin(request7.window, origin)) {
|
|
25597
|
+
window = request7.window;
|
|
25598
25598
|
}
|
|
25599
25599
|
if (init.window != null) {
|
|
25600
25600
|
throw new TypeError(`'window' option '${window}' must be null`);
|
|
@@ -25602,66 +25602,66 @@ var require_request2 = __commonJS({
|
|
|
25602
25602
|
if ("window" in init) {
|
|
25603
25603
|
window = "no-window";
|
|
25604
25604
|
}
|
|
25605
|
-
|
|
25605
|
+
request7 = makeRequest({
|
|
25606
25606
|
// URL request’s URL.
|
|
25607
25607
|
// undici implementation note: this is set as the first item in request's urlList in makeRequest
|
|
25608
25608
|
// method request’s method.
|
|
25609
|
-
method:
|
|
25609
|
+
method: request7.method,
|
|
25610
25610
|
// header list A copy of request’s header list.
|
|
25611
25611
|
// undici implementation note: headersList is cloned in makeRequest
|
|
25612
|
-
headersList:
|
|
25612
|
+
headersList: request7.headersList,
|
|
25613
25613
|
// unsafe-request flag Set.
|
|
25614
|
-
unsafeRequest:
|
|
25614
|
+
unsafeRequest: request7.unsafeRequest,
|
|
25615
25615
|
// client This’s relevant settings object.
|
|
25616
25616
|
client: environmentSettingsObject.settingsObject,
|
|
25617
25617
|
// window window.
|
|
25618
25618
|
window,
|
|
25619
25619
|
// priority request’s priority.
|
|
25620
|
-
priority:
|
|
25620
|
+
priority: request7.priority,
|
|
25621
25621
|
// origin request’s origin. The propagation of the origin is only significant for navigation requests
|
|
25622
25622
|
// being handled by a service worker. In this scenario a request can have an origin that is different
|
|
25623
25623
|
// from the current client.
|
|
25624
|
-
origin:
|
|
25624
|
+
origin: request7.origin,
|
|
25625
25625
|
// referrer request’s referrer.
|
|
25626
|
-
referrer:
|
|
25626
|
+
referrer: request7.referrer,
|
|
25627
25627
|
// referrer policy request’s referrer policy.
|
|
25628
|
-
referrerPolicy:
|
|
25628
|
+
referrerPolicy: request7.referrerPolicy,
|
|
25629
25629
|
// mode request’s mode.
|
|
25630
|
-
mode:
|
|
25630
|
+
mode: request7.mode,
|
|
25631
25631
|
// credentials mode request’s credentials mode.
|
|
25632
|
-
credentials:
|
|
25632
|
+
credentials: request7.credentials,
|
|
25633
25633
|
// cache mode request’s cache mode.
|
|
25634
|
-
cache:
|
|
25634
|
+
cache: request7.cache,
|
|
25635
25635
|
// redirect mode request’s redirect mode.
|
|
25636
|
-
redirect:
|
|
25636
|
+
redirect: request7.redirect,
|
|
25637
25637
|
// integrity metadata request’s integrity metadata.
|
|
25638
|
-
integrity:
|
|
25638
|
+
integrity: request7.integrity,
|
|
25639
25639
|
// keepalive request’s keepalive.
|
|
25640
|
-
keepalive:
|
|
25640
|
+
keepalive: request7.keepalive,
|
|
25641
25641
|
// reload-navigation flag request’s reload-navigation flag.
|
|
25642
|
-
reloadNavigation:
|
|
25642
|
+
reloadNavigation: request7.reloadNavigation,
|
|
25643
25643
|
// history-navigation flag request’s history-navigation flag.
|
|
25644
|
-
historyNavigation:
|
|
25644
|
+
historyNavigation: request7.historyNavigation,
|
|
25645
25645
|
// URL list A clone of request’s URL list.
|
|
25646
|
-
urlList: [...
|
|
25646
|
+
urlList: [...request7.urlList]
|
|
25647
25647
|
});
|
|
25648
25648
|
const initHasKey = Object.keys(init).length !== 0;
|
|
25649
25649
|
if (initHasKey) {
|
|
25650
|
-
if (
|
|
25651
|
-
|
|
25650
|
+
if (request7.mode === "navigate") {
|
|
25651
|
+
request7.mode = "same-origin";
|
|
25652
25652
|
}
|
|
25653
|
-
|
|
25654
|
-
|
|
25655
|
-
|
|
25656
|
-
|
|
25657
|
-
|
|
25658
|
-
|
|
25659
|
-
|
|
25653
|
+
request7.reloadNavigation = false;
|
|
25654
|
+
request7.historyNavigation = false;
|
|
25655
|
+
request7.origin = "client";
|
|
25656
|
+
request7.referrer = "client";
|
|
25657
|
+
request7.referrerPolicy = "";
|
|
25658
|
+
request7.url = request7.urlList[request7.urlList.length - 1];
|
|
25659
|
+
request7.urlList = [request7.url];
|
|
25660
25660
|
}
|
|
25661
25661
|
if (init.referrer !== void 0) {
|
|
25662
25662
|
const referrer = init.referrer;
|
|
25663
25663
|
if (referrer === "") {
|
|
25664
|
-
|
|
25664
|
+
request7.referrer = "no-referrer";
|
|
25665
25665
|
} else {
|
|
25666
25666
|
let parsedReferrer;
|
|
25667
25667
|
try {
|
|
@@ -25670,14 +25670,14 @@ var require_request2 = __commonJS({
|
|
|
25670
25670
|
throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err });
|
|
25671
25671
|
}
|
|
25672
25672
|
if (parsedReferrer.protocol === "about:" && parsedReferrer.hostname === "client" || origin && !sameOrigin(parsedReferrer, environmentSettingsObject.settingsObject.baseUrl)) {
|
|
25673
|
-
|
|
25673
|
+
request7.referrer = "client";
|
|
25674
25674
|
} else {
|
|
25675
|
-
|
|
25675
|
+
request7.referrer = parsedReferrer;
|
|
25676
25676
|
}
|
|
25677
25677
|
}
|
|
25678
25678
|
}
|
|
25679
25679
|
if (init.referrerPolicy !== void 0) {
|
|
25680
|
-
|
|
25680
|
+
request7.referrerPolicy = init.referrerPolicy;
|
|
25681
25681
|
}
|
|
25682
25682
|
let mode;
|
|
25683
25683
|
if (init.mode !== void 0) {
|
|
@@ -25692,33 +25692,33 @@ var require_request2 = __commonJS({
|
|
|
25692
25692
|
});
|
|
25693
25693
|
}
|
|
25694
25694
|
if (mode != null) {
|
|
25695
|
-
|
|
25695
|
+
request7.mode = mode;
|
|
25696
25696
|
}
|
|
25697
25697
|
if (init.credentials !== void 0) {
|
|
25698
|
-
|
|
25698
|
+
request7.credentials = init.credentials;
|
|
25699
25699
|
}
|
|
25700
25700
|
if (init.cache !== void 0) {
|
|
25701
|
-
|
|
25701
|
+
request7.cache = init.cache;
|
|
25702
25702
|
}
|
|
25703
|
-
if (
|
|
25703
|
+
if (request7.cache === "only-if-cached" && request7.mode !== "same-origin") {
|
|
25704
25704
|
throw new TypeError(
|
|
25705
25705
|
"'only-if-cached' can be set only with 'same-origin' mode"
|
|
25706
25706
|
);
|
|
25707
25707
|
}
|
|
25708
25708
|
if (init.redirect !== void 0) {
|
|
25709
|
-
|
|
25709
|
+
request7.redirect = init.redirect;
|
|
25710
25710
|
}
|
|
25711
25711
|
if (init.integrity != null) {
|
|
25712
|
-
|
|
25712
|
+
request7.integrity = String(init.integrity);
|
|
25713
25713
|
}
|
|
25714
25714
|
if (init.keepalive !== void 0) {
|
|
25715
|
-
|
|
25715
|
+
request7.keepalive = Boolean(init.keepalive);
|
|
25716
25716
|
}
|
|
25717
25717
|
if (init.method !== void 0) {
|
|
25718
25718
|
let method = init.method;
|
|
25719
25719
|
const mayBeNormalized = normalizedMethodRecords[method];
|
|
25720
25720
|
if (mayBeNormalized !== void 0) {
|
|
25721
|
-
|
|
25721
|
+
request7.method = mayBeNormalized;
|
|
25722
25722
|
} else {
|
|
25723
25723
|
if (!isValidHTTPToken(method)) {
|
|
25724
25724
|
throw new TypeError(`'${method}' is not a valid HTTP method.`);
|
|
@@ -25728,9 +25728,9 @@ var require_request2 = __commonJS({
|
|
|
25728
25728
|
throw new TypeError(`'${method}' HTTP method is unsupported.`);
|
|
25729
25729
|
}
|
|
25730
25730
|
method = normalizedMethodRecordsBase[upperCase] ?? method;
|
|
25731
|
-
|
|
25731
|
+
request7.method = method;
|
|
25732
25732
|
}
|
|
25733
|
-
if (!patchMethodWarning &&
|
|
25733
|
+
if (!patchMethodWarning && request7.method === "patch") {
|
|
25734
25734
|
process.emitWarning("Using `patch` is highly likely to result in a `405 Method Not Allowed`. `PATCH` is much more likely to succeed.", {
|
|
25735
25735
|
code: "UNDICI-FETCH-patch"
|
|
25736
25736
|
});
|
|
@@ -25740,7 +25740,7 @@ var require_request2 = __commonJS({
|
|
|
25740
25740
|
if (init.signal !== void 0) {
|
|
25741
25741
|
signal = init.signal;
|
|
25742
25742
|
}
|
|
25743
|
-
this.#state =
|
|
25743
|
+
this.#state = request7;
|
|
25744
25744
|
const ac = new AbortController();
|
|
25745
25745
|
this.#signal = ac.signal;
|
|
25746
25746
|
if (signal != null) {
|
|
@@ -25758,12 +25758,12 @@ var require_request2 = __commonJS({
|
|
|
25758
25758
|
}
|
|
25759
25759
|
}
|
|
25760
25760
|
this.#headers = new Headers(kConstruct);
|
|
25761
|
-
setHeadersList(this.#headers,
|
|
25761
|
+
setHeadersList(this.#headers, request7.headersList);
|
|
25762
25762
|
setHeadersGuard(this.#headers, "request");
|
|
25763
25763
|
if (mode === "no-cors") {
|
|
25764
|
-
if (!corsSafeListedMethodsSet.has(
|
|
25764
|
+
if (!corsSafeListedMethodsSet.has(request7.method)) {
|
|
25765
25765
|
throw new TypeError(
|
|
25766
|
-
`'${
|
|
25766
|
+
`'${request7.method} is unsupported in no-cors mode.`
|
|
25767
25767
|
);
|
|
25768
25768
|
}
|
|
25769
25769
|
setHeadersGuard(this.#headers, "request-no-cors");
|
|
@@ -25782,14 +25782,14 @@ var require_request2 = __commonJS({
|
|
|
25782
25782
|
}
|
|
25783
25783
|
}
|
|
25784
25784
|
const inputBody = webidl.is.Request(input2) ? input2.#state.body : null;
|
|
25785
|
-
if ((init.body != null || inputBody != null) && (
|
|
25785
|
+
if ((init.body != null || inputBody != null) && (request7.method === "GET" || request7.method === "HEAD")) {
|
|
25786
25786
|
throw new TypeError("Request with GET/HEAD method cannot have body.");
|
|
25787
25787
|
}
|
|
25788
25788
|
let initBody = null;
|
|
25789
25789
|
if (init.body != null) {
|
|
25790
25790
|
const [extractedBody, contentType] = extractBody(
|
|
25791
25791
|
init.body,
|
|
25792
|
-
|
|
25792
|
+
request7.keepalive
|
|
25793
25793
|
);
|
|
25794
25794
|
initBody = extractedBody;
|
|
25795
25795
|
if (contentType && !getHeadersList(this.#headers).contains("content-type", true)) {
|
|
@@ -25801,12 +25801,12 @@ var require_request2 = __commonJS({
|
|
|
25801
25801
|
if (initBody != null && init.duplex == null) {
|
|
25802
25802
|
throw new TypeError("RequestInit: duplex option is required when sending a body.");
|
|
25803
25803
|
}
|
|
25804
|
-
if (
|
|
25804
|
+
if (request7.mode !== "same-origin" && request7.mode !== "cors") {
|
|
25805
25805
|
throw new TypeError(
|
|
25806
25806
|
'If request is made from ReadableStream, mode should be "same-origin" or "cors"'
|
|
25807
25807
|
);
|
|
25808
25808
|
}
|
|
25809
|
-
|
|
25809
|
+
request7.useCORSPreflightFlag = true;
|
|
25810
25810
|
}
|
|
25811
25811
|
let finalBody = inputOrInitBody;
|
|
25812
25812
|
if (initBody == null && inputBody != null) {
|
|
@@ -25996,42 +25996,42 @@ var require_request2 = __commonJS({
|
|
|
25996
25996
|
* @param {Request} request
|
|
25997
25997
|
* @param {AbortSignal} newSignal
|
|
25998
25998
|
*/
|
|
25999
|
-
static setRequestSignal(
|
|
26000
|
-
|
|
26001
|
-
return
|
|
25999
|
+
static setRequestSignal(request7, newSignal) {
|
|
26000
|
+
request7.#signal = newSignal;
|
|
26001
|
+
return request7;
|
|
26002
26002
|
}
|
|
26003
26003
|
/**
|
|
26004
26004
|
* @param {Request} request
|
|
26005
26005
|
*/
|
|
26006
|
-
static getRequestDispatcher(
|
|
26007
|
-
return
|
|
26006
|
+
static getRequestDispatcher(request7) {
|
|
26007
|
+
return request7.#dispatcher;
|
|
26008
26008
|
}
|
|
26009
26009
|
/**
|
|
26010
26010
|
* @param {Request} request
|
|
26011
26011
|
* @param {import('../../dispatcher/dispatcher')} newDispatcher
|
|
26012
26012
|
*/
|
|
26013
|
-
static setRequestDispatcher(
|
|
26014
|
-
|
|
26013
|
+
static setRequestDispatcher(request7, newDispatcher) {
|
|
26014
|
+
request7.#dispatcher = newDispatcher;
|
|
26015
26015
|
}
|
|
26016
26016
|
/**
|
|
26017
26017
|
* @param {Request} request
|
|
26018
26018
|
* @param {Headers} newHeaders
|
|
26019
26019
|
*/
|
|
26020
|
-
static setRequestHeaders(
|
|
26021
|
-
|
|
26020
|
+
static setRequestHeaders(request7, newHeaders) {
|
|
26021
|
+
request7.#headers = newHeaders;
|
|
26022
26022
|
}
|
|
26023
26023
|
/**
|
|
26024
26024
|
* @param {Request} request
|
|
26025
26025
|
*/
|
|
26026
|
-
static getRequestState(
|
|
26027
|
-
return
|
|
26026
|
+
static getRequestState(request7) {
|
|
26027
|
+
return request7.#state;
|
|
26028
26028
|
}
|
|
26029
26029
|
/**
|
|
26030
26030
|
* @param {Request} request
|
|
26031
26031
|
* @param {any} newState
|
|
26032
26032
|
*/
|
|
26033
|
-
static setRequestState(
|
|
26034
|
-
|
|
26033
|
+
static setRequestState(request7, newState) {
|
|
26034
|
+
request7.#state = newState;
|
|
26035
26035
|
}
|
|
26036
26036
|
};
|
|
26037
26037
|
var { setRequestSignal, getRequestDispatcher, setRequestDispatcher, setRequestHeaders, getRequestState, setRequestState } = Request;
|
|
@@ -26086,23 +26086,23 @@ var require_request2 = __commonJS({
|
|
|
26086
26086
|
headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList()
|
|
26087
26087
|
};
|
|
26088
26088
|
}
|
|
26089
|
-
function cloneRequest(
|
|
26090
|
-
const newRequest = makeRequest({ ...
|
|
26091
|
-
if (
|
|
26092
|
-
newRequest.body = cloneBody(
|
|
26089
|
+
function cloneRequest(request7) {
|
|
26090
|
+
const newRequest = makeRequest({ ...request7, body: null });
|
|
26091
|
+
if (request7.body != null) {
|
|
26092
|
+
newRequest.body = cloneBody(request7.body);
|
|
26093
26093
|
}
|
|
26094
26094
|
return newRequest;
|
|
26095
26095
|
}
|
|
26096
26096
|
function fromInnerRequest(innerRequest, dispatcher, signal, guard) {
|
|
26097
|
-
const
|
|
26098
|
-
setRequestState(
|
|
26099
|
-
setRequestDispatcher(
|
|
26100
|
-
setRequestSignal(
|
|
26097
|
+
const request7 = new Request(kConstruct);
|
|
26098
|
+
setRequestState(request7, innerRequest);
|
|
26099
|
+
setRequestDispatcher(request7, dispatcher);
|
|
26100
|
+
setRequestSignal(request7, signal);
|
|
26101
26101
|
const headers = new Headers(kConstruct);
|
|
26102
|
-
setRequestHeaders(
|
|
26102
|
+
setRequestHeaders(request7, headers);
|
|
26103
26103
|
setHeadersList(headers, innerRequest.headersList);
|
|
26104
26104
|
setHeadersGuard(headers, guard);
|
|
26105
|
-
return
|
|
26105
|
+
return request7;
|
|
26106
26106
|
}
|
|
26107
26107
|
Object.defineProperties(Request.prototype, {
|
|
26108
26108
|
method: kEnumerableProperty,
|
|
@@ -26494,14 +26494,14 @@ var require_fetch = __commonJS({
|
|
|
26494
26494
|
p.reject(e);
|
|
26495
26495
|
return p.promise;
|
|
26496
26496
|
}
|
|
26497
|
-
const
|
|
26497
|
+
const request7 = getRequestState(requestObject);
|
|
26498
26498
|
if (requestObject.signal.aborted) {
|
|
26499
|
-
abortFetch(p,
|
|
26499
|
+
abortFetch(p, request7, null, requestObject.signal.reason, null);
|
|
26500
26500
|
return p.promise;
|
|
26501
26501
|
}
|
|
26502
|
-
const globalObject =
|
|
26502
|
+
const globalObject = request7.client.globalObject;
|
|
26503
26503
|
if (globalObject?.constructor?.name === "ServiceWorkerGlobalScope") {
|
|
26504
|
-
|
|
26504
|
+
request7.serviceWorkers = "none";
|
|
26505
26505
|
}
|
|
26506
26506
|
let responseObject = null;
|
|
26507
26507
|
let locallyAborted = false;
|
|
@@ -26513,7 +26513,7 @@ var require_fetch = __commonJS({
|
|
|
26513
26513
|
assert2(controller != null);
|
|
26514
26514
|
controller.abort(requestObject.signal.reason);
|
|
26515
26515
|
const realResponse = responseObject?.deref();
|
|
26516
|
-
abortFetch(p,
|
|
26516
|
+
abortFetch(p, request7, realResponse, requestObject.signal.reason, controller.controller);
|
|
26517
26517
|
}
|
|
26518
26518
|
);
|
|
26519
26519
|
const processResponse = (response) => {
|
|
@@ -26521,7 +26521,7 @@ var require_fetch = __commonJS({
|
|
|
26521
26521
|
return;
|
|
26522
26522
|
}
|
|
26523
26523
|
if (response.aborted) {
|
|
26524
|
-
abortFetch(p,
|
|
26524
|
+
abortFetch(p, request7, responseObject, controller.serializedAbortReason, controller.controller);
|
|
26525
26525
|
return;
|
|
26526
26526
|
}
|
|
26527
26527
|
if (response.type === "error") {
|
|
@@ -26533,7 +26533,7 @@ var require_fetch = __commonJS({
|
|
|
26533
26533
|
p = null;
|
|
26534
26534
|
};
|
|
26535
26535
|
controller = fetching({
|
|
26536
|
-
request:
|
|
26536
|
+
request: request7,
|
|
26537
26537
|
processResponseEndOfBody: handleFetchDone,
|
|
26538
26538
|
processResponse,
|
|
26539
26539
|
dispatcher: getRequestDispatcher(requestObject),
|
|
@@ -26580,12 +26580,12 @@ var require_fetch = __commonJS({
|
|
|
26580
26580
|
);
|
|
26581
26581
|
}
|
|
26582
26582
|
var markResourceTiming = performance.markResourceTiming;
|
|
26583
|
-
function abortFetch(p,
|
|
26583
|
+
function abortFetch(p, request7, responseObject, error62, controller) {
|
|
26584
26584
|
if (p) {
|
|
26585
26585
|
p.reject(error62);
|
|
26586
26586
|
}
|
|
26587
|
-
if (
|
|
26588
|
-
|
|
26587
|
+
if (request7.body?.stream != null && isReadable(request7.body.stream)) {
|
|
26588
|
+
request7.body.stream.cancel(error62).catch((err) => {
|
|
26589
26589
|
if (err.code === "ERR_INVALID_STATE") {
|
|
26590
26590
|
return;
|
|
26591
26591
|
}
|
|
@@ -26601,7 +26601,7 @@ var require_fetch = __commonJS({
|
|
|
26601
26601
|
}
|
|
26602
26602
|
}
|
|
26603
26603
|
function fetching({
|
|
26604
|
-
request:
|
|
26604
|
+
request: request7,
|
|
26605
26605
|
processRequestBodyChunkLength,
|
|
26606
26606
|
processRequestEndOfBody,
|
|
26607
26607
|
processResponse,
|
|
@@ -26616,9 +26616,9 @@ var require_fetch = __commonJS({
|
|
|
26616
26616
|
assert2(dispatcher);
|
|
26617
26617
|
let taskDestination = null;
|
|
26618
26618
|
let crossOriginIsolatedCapability = false;
|
|
26619
|
-
if (
|
|
26620
|
-
taskDestination =
|
|
26621
|
-
crossOriginIsolatedCapability =
|
|
26619
|
+
if (request7.client != null) {
|
|
26620
|
+
taskDestination = request7.client.globalObject;
|
|
26621
|
+
crossOriginIsolatedCapability = request7.client.crossOriginIsolatedCapability;
|
|
26622
26622
|
}
|
|
26623
26623
|
const currentTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability);
|
|
26624
26624
|
const timingInfo = createOpaqueTimingInfo({
|
|
@@ -26626,7 +26626,7 @@ var require_fetch = __commonJS({
|
|
|
26626
26626
|
});
|
|
26627
26627
|
const fetchParams = {
|
|
26628
26628
|
controller: new Fetch(dispatcher),
|
|
26629
|
-
request:
|
|
26629
|
+
request: request7,
|
|
26630
26630
|
timingInfo,
|
|
26631
26631
|
processRequestBodyChunkLength,
|
|
26632
26632
|
processRequestEndOfBody,
|
|
@@ -26638,79 +26638,79 @@ var require_fetch = __commonJS({
|
|
|
26638
26638
|
// Keep requestObject alive to prevent its AbortController from being GC'd
|
|
26639
26639
|
requestObject
|
|
26640
26640
|
};
|
|
26641
|
-
assert2(!
|
|
26642
|
-
if (
|
|
26643
|
-
|
|
26641
|
+
assert2(!request7.body || request7.body.stream);
|
|
26642
|
+
if (request7.window === "client") {
|
|
26643
|
+
request7.window = request7.client?.globalObject?.constructor?.name === "Window" ? request7.client : "no-window";
|
|
26644
26644
|
}
|
|
26645
|
-
if (
|
|
26646
|
-
|
|
26645
|
+
if (request7.origin === "client") {
|
|
26646
|
+
request7.origin = request7.client.origin;
|
|
26647
26647
|
}
|
|
26648
|
-
if (
|
|
26649
|
-
if (
|
|
26650
|
-
|
|
26651
|
-
|
|
26648
|
+
if (request7.policyContainer === "client") {
|
|
26649
|
+
if (request7.client != null) {
|
|
26650
|
+
request7.policyContainer = clonePolicyContainer(
|
|
26651
|
+
request7.client.policyContainer
|
|
26652
26652
|
);
|
|
26653
26653
|
} else {
|
|
26654
|
-
|
|
26654
|
+
request7.policyContainer = makePolicyContainer();
|
|
26655
26655
|
}
|
|
26656
26656
|
}
|
|
26657
|
-
if (!
|
|
26657
|
+
if (!request7.headersList.contains("accept", true)) {
|
|
26658
26658
|
const value = "*/*";
|
|
26659
|
-
|
|
26659
|
+
request7.headersList.append("accept", value, true);
|
|
26660
26660
|
}
|
|
26661
|
-
if (!
|
|
26662
|
-
|
|
26661
|
+
if (!request7.headersList.contains("accept-language", true)) {
|
|
26662
|
+
request7.headersList.append("accept-language", "*", true);
|
|
26663
26663
|
}
|
|
26664
|
-
if (
|
|
26664
|
+
if (request7.priority === null) {
|
|
26665
26665
|
}
|
|
26666
|
-
if (subresourceSet.has(
|
|
26666
|
+
if (subresourceSet.has(request7.destination)) {
|
|
26667
26667
|
}
|
|
26668
26668
|
mainFetch(fetchParams, false);
|
|
26669
26669
|
return fetchParams.controller;
|
|
26670
26670
|
}
|
|
26671
26671
|
async function mainFetch(fetchParams, recursive2) {
|
|
26672
26672
|
try {
|
|
26673
|
-
const
|
|
26673
|
+
const request7 = fetchParams.request;
|
|
26674
26674
|
let response = null;
|
|
26675
|
-
if (
|
|
26675
|
+
if (request7.localURLsOnly && !urlIsLocal(requestCurrentURL(request7))) {
|
|
26676
26676
|
response = makeNetworkError("local URLs only");
|
|
26677
26677
|
}
|
|
26678
|
-
tryUpgradeRequestToAPotentiallyTrustworthyURL(
|
|
26679
|
-
if (requestBadPort(
|
|
26678
|
+
tryUpgradeRequestToAPotentiallyTrustworthyURL(request7);
|
|
26679
|
+
if (requestBadPort(request7) === "blocked") {
|
|
26680
26680
|
response = makeNetworkError("bad port");
|
|
26681
26681
|
}
|
|
26682
|
-
if (
|
|
26683
|
-
|
|
26682
|
+
if (request7.referrerPolicy === "") {
|
|
26683
|
+
request7.referrerPolicy = request7.policyContainer.referrerPolicy;
|
|
26684
26684
|
}
|
|
26685
|
-
if (
|
|
26686
|
-
|
|
26685
|
+
if (request7.referrer !== "no-referrer") {
|
|
26686
|
+
request7.referrer = determineRequestsReferrer(request7);
|
|
26687
26687
|
}
|
|
26688
26688
|
if (response === null) {
|
|
26689
|
-
const currentURL = requestCurrentURL(
|
|
26689
|
+
const currentURL = requestCurrentURL(request7);
|
|
26690
26690
|
if (
|
|
26691
26691
|
// - request’s current URL’s origin is same origin with request’s origin,
|
|
26692
26692
|
// and request’s response tainting is "basic"
|
|
26693
|
-
sameOrigin(currentURL,
|
|
26693
|
+
sameOrigin(currentURL, request7.url) && request7.responseTainting === "basic" || // request’s current URL’s scheme is "data"
|
|
26694
26694
|
currentURL.protocol === "data:" || // - request’s mode is "navigate" or "websocket"
|
|
26695
|
-
(
|
|
26695
|
+
(request7.mode === "navigate" || request7.mode === "websocket")
|
|
26696
26696
|
) {
|
|
26697
|
-
|
|
26697
|
+
request7.responseTainting = "basic";
|
|
26698
26698
|
response = await schemeFetch(fetchParams);
|
|
26699
|
-
} else if (
|
|
26699
|
+
} else if (request7.mode === "same-origin") {
|
|
26700
26700
|
response = makeNetworkError('request mode cannot be "same-origin"');
|
|
26701
|
-
} else if (
|
|
26702
|
-
if (
|
|
26701
|
+
} else if (request7.mode === "no-cors") {
|
|
26702
|
+
if (request7.redirect !== "follow") {
|
|
26703
26703
|
response = makeNetworkError(
|
|
26704
26704
|
'redirect mode cannot be "follow" for "no-cors" request'
|
|
26705
26705
|
);
|
|
26706
26706
|
} else {
|
|
26707
|
-
|
|
26707
|
+
request7.responseTainting = "opaque";
|
|
26708
26708
|
response = await schemeFetch(fetchParams);
|
|
26709
26709
|
}
|
|
26710
|
-
} else if (!urlIsHttpHttpsScheme(requestCurrentURL(
|
|
26710
|
+
} else if (!urlIsHttpHttpsScheme(requestCurrentURL(request7))) {
|
|
26711
26711
|
response = makeNetworkError("URL scheme must be a HTTP(S) scheme");
|
|
26712
26712
|
} else {
|
|
26713
|
-
|
|
26713
|
+
request7.responseTainting = "cors";
|
|
26714
26714
|
response = await httpFetch(fetchParams);
|
|
26715
26715
|
}
|
|
26716
26716
|
}
|
|
@@ -26718,13 +26718,13 @@ var require_fetch = __commonJS({
|
|
|
26718
26718
|
return response;
|
|
26719
26719
|
}
|
|
26720
26720
|
if (response.status !== 0 && !response.internalResponse) {
|
|
26721
|
-
if (
|
|
26721
|
+
if (request7.responseTainting === "cors") {
|
|
26722
26722
|
}
|
|
26723
|
-
if (
|
|
26723
|
+
if (request7.responseTainting === "basic") {
|
|
26724
26724
|
response = filterResponse(response, "basic");
|
|
26725
|
-
} else if (
|
|
26725
|
+
} else if (request7.responseTainting === "cors") {
|
|
26726
26726
|
response = filterResponse(response, "cors");
|
|
26727
|
-
} else if (
|
|
26727
|
+
} else if (request7.responseTainting === "opaque") {
|
|
26728
26728
|
response = filterResponse(response, "opaque");
|
|
26729
26729
|
} else {
|
|
26730
26730
|
assert2(false);
|
|
@@ -26732,26 +26732,26 @@ var require_fetch = __commonJS({
|
|
|
26732
26732
|
}
|
|
26733
26733
|
let internalResponse = response.status === 0 ? response : response.internalResponse;
|
|
26734
26734
|
if (internalResponse.urlList.length === 0) {
|
|
26735
|
-
internalResponse.urlList.push(...
|
|
26735
|
+
internalResponse.urlList.push(...request7.urlList);
|
|
26736
26736
|
}
|
|
26737
|
-
if (!
|
|
26737
|
+
if (!request7.timingAllowFailed) {
|
|
26738
26738
|
response.timingAllowPassed = true;
|
|
26739
26739
|
}
|
|
26740
|
-
if (response.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !
|
|
26740
|
+
if (response.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request7.headers.contains("range", true)) {
|
|
26741
26741
|
response = internalResponse = makeNetworkError();
|
|
26742
26742
|
}
|
|
26743
|
-
if (response.status !== 0 && (
|
|
26743
|
+
if (response.status !== 0 && (request7.method === "HEAD" || request7.method === "CONNECT" || nullBodyStatus.includes(internalResponse.status))) {
|
|
26744
26744
|
internalResponse.body = null;
|
|
26745
26745
|
fetchParams.controller.dump = true;
|
|
26746
26746
|
}
|
|
26747
|
-
if (
|
|
26747
|
+
if (request7.integrity) {
|
|
26748
26748
|
const processBodyError = (reason) => fetchFinale(fetchParams, makeNetworkError(reason));
|
|
26749
|
-
if (
|
|
26749
|
+
if (request7.responseTainting === "opaque" || response.body == null) {
|
|
26750
26750
|
processBodyError(response.error);
|
|
26751
26751
|
return;
|
|
26752
26752
|
}
|
|
26753
26753
|
const processBody = (bytes) => {
|
|
26754
|
-
if (!bytesMatch(bytes,
|
|
26754
|
+
if (!bytesMatch(bytes, request7.integrity)) {
|
|
26755
26755
|
processBodyError("integrity mismatch");
|
|
26756
26756
|
return;
|
|
26757
26757
|
}
|
|
@@ -26770,8 +26770,8 @@ var require_fetch = __commonJS({
|
|
|
26770
26770
|
if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {
|
|
26771
26771
|
return Promise.resolve(makeAppropriateNetworkError(fetchParams));
|
|
26772
26772
|
}
|
|
26773
|
-
const { request:
|
|
26774
|
-
const { protocol: scheme } = requestCurrentURL(
|
|
26773
|
+
const { request: request7 } = fetchParams;
|
|
26774
|
+
const { protocol: scheme } = requestCurrentURL(request7);
|
|
26775
26775
|
switch (scheme) {
|
|
26776
26776
|
case "about:": {
|
|
26777
26777
|
return Promise.resolve(makeNetworkError("about scheme is not supported"));
|
|
@@ -26780,19 +26780,19 @@ var require_fetch = __commonJS({
|
|
|
26780
26780
|
if (!resolveObjectURL) {
|
|
26781
26781
|
resolveObjectURL = require("node:buffer").resolveObjectURL;
|
|
26782
26782
|
}
|
|
26783
|
-
const blobURLEntry = requestCurrentURL(
|
|
26783
|
+
const blobURLEntry = requestCurrentURL(request7);
|
|
26784
26784
|
if (blobURLEntry.search.length !== 0) {
|
|
26785
26785
|
return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource."));
|
|
26786
26786
|
}
|
|
26787
26787
|
const blob = resolveObjectURL(blobURLEntry.toString());
|
|
26788
|
-
if (
|
|
26788
|
+
if (request7.method !== "GET" || !webidl.is.Blob(blob)) {
|
|
26789
26789
|
return Promise.resolve(makeNetworkError("invalid method"));
|
|
26790
26790
|
}
|
|
26791
26791
|
const response = makeResponse();
|
|
26792
26792
|
const fullLength = blob.size;
|
|
26793
26793
|
const serializedFullLength = isomorphicEncode(`${fullLength}`);
|
|
26794
26794
|
const type = blob.type;
|
|
26795
|
-
if (!
|
|
26795
|
+
if (!request7.headersList.contains("range", true)) {
|
|
26796
26796
|
const bodyWithType = extractBody(blob);
|
|
26797
26797
|
response.statusText = "OK";
|
|
26798
26798
|
response.body = bodyWithType[0];
|
|
@@ -26800,7 +26800,7 @@ var require_fetch = __commonJS({
|
|
|
26800
26800
|
response.headersList.set("content-type", type, true);
|
|
26801
26801
|
} else {
|
|
26802
26802
|
response.rangeRequested = true;
|
|
26803
|
-
const rangeHeader =
|
|
26803
|
+
const rangeHeader = request7.headersList.get("range", true);
|
|
26804
26804
|
const rangeValue = simpleRangeHeaderValue(rangeHeader, true);
|
|
26805
26805
|
if (rangeValue === "failure") {
|
|
26806
26806
|
return Promise.resolve(makeNetworkError("failed to fetch the data URL"));
|
|
@@ -26831,7 +26831,7 @@ var require_fetch = __commonJS({
|
|
|
26831
26831
|
return Promise.resolve(response);
|
|
26832
26832
|
}
|
|
26833
26833
|
case "data:": {
|
|
26834
|
-
const currentURL = requestCurrentURL(
|
|
26834
|
+
const currentURL = requestCurrentURL(request7);
|
|
26835
26835
|
const dataURLStruct = dataURLProcessor(currentURL);
|
|
26836
26836
|
if (dataURLStruct === "failure") {
|
|
26837
26837
|
return Promise.resolve(makeNetworkError("failed to fetch the data URL"));
|
|
@@ -26920,41 +26920,41 @@ var require_fetch = __commonJS({
|
|
|
26920
26920
|
}
|
|
26921
26921
|
}
|
|
26922
26922
|
async function httpFetch(fetchParams) {
|
|
26923
|
-
const
|
|
26923
|
+
const request7 = fetchParams.request;
|
|
26924
26924
|
let response = null;
|
|
26925
26925
|
let actualResponse = null;
|
|
26926
26926
|
const timingInfo = fetchParams.timingInfo;
|
|
26927
|
-
if (
|
|
26927
|
+
if (request7.serviceWorkers === "all") {
|
|
26928
26928
|
}
|
|
26929
26929
|
if (response === null) {
|
|
26930
|
-
if (
|
|
26931
|
-
|
|
26930
|
+
if (request7.redirect === "follow") {
|
|
26931
|
+
request7.serviceWorkers = "none";
|
|
26932
26932
|
}
|
|
26933
26933
|
actualResponse = response = await httpNetworkOrCacheFetch(fetchParams);
|
|
26934
|
-
if (
|
|
26934
|
+
if (request7.responseTainting === "cors" && corsCheck(request7, response) === "failure") {
|
|
26935
26935
|
return makeNetworkError("cors failure");
|
|
26936
26936
|
}
|
|
26937
|
-
if (TAOCheck(
|
|
26938
|
-
|
|
26937
|
+
if (TAOCheck(request7, response) === "failure") {
|
|
26938
|
+
request7.timingAllowFailed = true;
|
|
26939
26939
|
}
|
|
26940
26940
|
}
|
|
26941
|
-
if ((
|
|
26942
|
-
|
|
26943
|
-
|
|
26944
|
-
|
|
26941
|
+
if ((request7.responseTainting === "opaque" || response.type === "opaque") && crossOriginResourcePolicyCheck(
|
|
26942
|
+
request7.origin,
|
|
26943
|
+
request7.client,
|
|
26944
|
+
request7.destination,
|
|
26945
26945
|
actualResponse
|
|
26946
26946
|
) === "blocked") {
|
|
26947
26947
|
return makeNetworkError("blocked");
|
|
26948
26948
|
}
|
|
26949
26949
|
if (redirectStatusSet.has(actualResponse.status)) {
|
|
26950
|
-
if (
|
|
26950
|
+
if (request7.redirect !== "manual") {
|
|
26951
26951
|
fetchParams.controller.connection.destroy(void 0, false);
|
|
26952
26952
|
}
|
|
26953
|
-
if (
|
|
26953
|
+
if (request7.redirect === "error") {
|
|
26954
26954
|
response = makeNetworkError("unexpected redirect");
|
|
26955
|
-
} else if (
|
|
26955
|
+
} else if (request7.redirect === "manual") {
|
|
26956
26956
|
response = actualResponse;
|
|
26957
|
-
} else if (
|
|
26957
|
+
} else if (request7.redirect === "follow") {
|
|
26958
26958
|
response = await httpRedirectFetch(fetchParams, response);
|
|
26959
26959
|
} else {
|
|
26960
26960
|
assert2(false);
|
|
@@ -26964,13 +26964,13 @@ var require_fetch = __commonJS({
|
|
|
26964
26964
|
return response;
|
|
26965
26965
|
}
|
|
26966
26966
|
function httpRedirectFetch(fetchParams, response) {
|
|
26967
|
-
const
|
|
26967
|
+
const request7 = fetchParams.request;
|
|
26968
26968
|
const actualResponse = response.internalResponse ? response.internalResponse : response;
|
|
26969
26969
|
let locationURL;
|
|
26970
26970
|
try {
|
|
26971
26971
|
locationURL = responseLocationURL(
|
|
26972
26972
|
actualResponse,
|
|
26973
|
-
requestCurrentURL(
|
|
26973
|
+
requestCurrentURL(request7).hash
|
|
26974
26974
|
);
|
|
26975
26975
|
if (locationURL == null) {
|
|
26976
26976
|
return response;
|
|
@@ -26981,63 +26981,63 @@ var require_fetch = __commonJS({
|
|
|
26981
26981
|
if (!urlIsHttpHttpsScheme(locationURL)) {
|
|
26982
26982
|
return Promise.resolve(makeNetworkError("URL scheme must be a HTTP(S) scheme"));
|
|
26983
26983
|
}
|
|
26984
|
-
if (
|
|
26984
|
+
if (request7.redirectCount === 20) {
|
|
26985
26985
|
return Promise.resolve(makeNetworkError("redirect count exceeded"));
|
|
26986
26986
|
}
|
|
26987
|
-
|
|
26988
|
-
if (
|
|
26987
|
+
request7.redirectCount += 1;
|
|
26988
|
+
if (request7.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request7, locationURL)) {
|
|
26989
26989
|
return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"'));
|
|
26990
26990
|
}
|
|
26991
|
-
if (
|
|
26991
|
+
if (request7.responseTainting === "cors" && (locationURL.username || locationURL.password)) {
|
|
26992
26992
|
return Promise.resolve(makeNetworkError(
|
|
26993
26993
|
'URL cannot contain credentials for request mode "cors"'
|
|
26994
26994
|
));
|
|
26995
26995
|
}
|
|
26996
|
-
if (actualResponse.status !== 303 &&
|
|
26996
|
+
if (actualResponse.status !== 303 && request7.body != null && request7.body.source == null) {
|
|
26997
26997
|
return Promise.resolve(makeNetworkError());
|
|
26998
26998
|
}
|
|
26999
|
-
if ([301, 302].includes(actualResponse.status) &&
|
|
27000
|
-
|
|
27001
|
-
|
|
26999
|
+
if ([301, 302].includes(actualResponse.status) && request7.method === "POST" || actualResponse.status === 303 && !GET_OR_HEAD.includes(request7.method)) {
|
|
27000
|
+
request7.method = "GET";
|
|
27001
|
+
request7.body = null;
|
|
27002
27002
|
for (const headerName of requestBodyHeader) {
|
|
27003
|
-
|
|
27003
|
+
request7.headersList.delete(headerName);
|
|
27004
27004
|
}
|
|
27005
27005
|
}
|
|
27006
|
-
if (!sameOrigin(requestCurrentURL(
|
|
27007
|
-
|
|
27008
|
-
|
|
27009
|
-
|
|
27010
|
-
|
|
27006
|
+
if (!sameOrigin(requestCurrentURL(request7), locationURL)) {
|
|
27007
|
+
request7.headersList.delete("authorization", true);
|
|
27008
|
+
request7.headersList.delete("proxy-authorization", true);
|
|
27009
|
+
request7.headersList.delete("cookie", true);
|
|
27010
|
+
request7.headersList.delete("host", true);
|
|
27011
27011
|
}
|
|
27012
|
-
if (
|
|
27013
|
-
assert2(
|
|
27014
|
-
|
|
27012
|
+
if (request7.body != null) {
|
|
27013
|
+
assert2(request7.body.source != null);
|
|
27014
|
+
request7.body = safelyExtractBody(request7.body.source)[0];
|
|
27015
27015
|
}
|
|
27016
27016
|
const timingInfo = fetchParams.timingInfo;
|
|
27017
27017
|
timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability);
|
|
27018
27018
|
if (timingInfo.redirectStartTime === 0) {
|
|
27019
27019
|
timingInfo.redirectStartTime = timingInfo.startTime;
|
|
27020
27020
|
}
|
|
27021
|
-
|
|
27022
|
-
setRequestReferrerPolicyOnRedirect(
|
|
27021
|
+
request7.urlList.push(locationURL);
|
|
27022
|
+
setRequestReferrerPolicyOnRedirect(request7, actualResponse);
|
|
27023
27023
|
return mainFetch(fetchParams, true);
|
|
27024
27024
|
}
|
|
27025
27025
|
async function httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch = false, isNewConnectionFetch = false) {
|
|
27026
|
-
const
|
|
27026
|
+
const request7 = fetchParams.request;
|
|
27027
27027
|
let httpFetchParams = null;
|
|
27028
27028
|
let httpRequest = null;
|
|
27029
27029
|
let response = null;
|
|
27030
27030
|
const httpCache = null;
|
|
27031
27031
|
const revalidatingFlag = false;
|
|
27032
|
-
if (
|
|
27032
|
+
if (request7.window === "no-window" && request7.redirect === "error") {
|
|
27033
27033
|
httpFetchParams = fetchParams;
|
|
27034
|
-
httpRequest =
|
|
27034
|
+
httpRequest = request7;
|
|
27035
27035
|
} else {
|
|
27036
|
-
httpRequest = cloneRequest(
|
|
27036
|
+
httpRequest = cloneRequest(request7);
|
|
27037
27037
|
httpFetchParams = { ...fetchParams };
|
|
27038
27038
|
httpFetchParams.request = httpRequest;
|
|
27039
27039
|
}
|
|
27040
|
-
const includeCredentials =
|
|
27040
|
+
const includeCredentials = request7.credentials === "include" || request7.credentials === "same-origin" && request7.responseTainting === "basic";
|
|
27041
27041
|
const contentLength = httpRequest.body ? httpRequest.body.length : null;
|
|
27042
27042
|
let contentLengthHeaderValue = null;
|
|
27043
27043
|
if (httpRequest.body == null && ["POST", "PUT"].includes(httpRequest.method)) {
|
|
@@ -27124,14 +27124,14 @@ var require_fetch = __commonJS({
|
|
|
27124
27124
|
response.rangeRequested = true;
|
|
27125
27125
|
}
|
|
27126
27126
|
response.requestIncludesCredentials = includeCredentials;
|
|
27127
|
-
if (response.status === 401 && httpRequest.responseTainting !== "cors" && includeCredentials && (
|
|
27128
|
-
if (
|
|
27129
|
-
if (
|
|
27127
|
+
if (response.status === 401 && httpRequest.responseTainting !== "cors" && includeCredentials && (request7.useURLCredentials !== void 0 || isTraversableNavigable(request7.traversableForUserPrompts))) {
|
|
27128
|
+
if (request7.body != null) {
|
|
27129
|
+
if (request7.body.source == null) {
|
|
27130
27130
|
return response;
|
|
27131
27131
|
}
|
|
27132
|
-
|
|
27132
|
+
request7.body = safelyExtractBody(request7.body.source)[0];
|
|
27133
27133
|
}
|
|
27134
|
-
if (
|
|
27134
|
+
if (request7.useURLCredentials === void 0 || isAuthenticationFetch) {
|
|
27135
27135
|
if (isCancelled(fetchParams)) {
|
|
27136
27136
|
return makeAppropriateNetworkError(fetchParams);
|
|
27137
27137
|
}
|
|
@@ -27141,7 +27141,7 @@ var require_fetch = __commonJS({
|
|
|
27141
27141
|
response = await httpNetworkOrCacheFetch(fetchParams, true);
|
|
27142
27142
|
}
|
|
27143
27143
|
if (response.status === 407) {
|
|
27144
|
-
if (
|
|
27144
|
+
if (request7.window === "no-window") {
|
|
27145
27145
|
return makeNetworkError();
|
|
27146
27146
|
}
|
|
27147
27147
|
if (isCancelled(fetchParams)) {
|
|
@@ -27153,7 +27153,7 @@ var require_fetch = __commonJS({
|
|
|
27153
27153
|
// response’s status is 421
|
|
27154
27154
|
response.status === 421 && // isNewConnectionFetch is false
|
|
27155
27155
|
!isNewConnectionFetch && // request’s body is null, or request’s body is non-null and request’s body’s source is non-null
|
|
27156
|
-
(
|
|
27156
|
+
(request7.body == null || request7.body.source != null)
|
|
27157
27157
|
) {
|
|
27158
27158
|
if (isCancelled(fetchParams)) {
|
|
27159
27159
|
return makeAppropriateNetworkError(fetchParams);
|
|
@@ -27183,21 +27183,21 @@ var require_fetch = __commonJS({
|
|
|
27183
27183
|
}
|
|
27184
27184
|
}
|
|
27185
27185
|
};
|
|
27186
|
-
const
|
|
27186
|
+
const request7 = fetchParams.request;
|
|
27187
27187
|
let response = null;
|
|
27188
27188
|
const timingInfo = fetchParams.timingInfo;
|
|
27189
27189
|
const httpCache = null;
|
|
27190
27190
|
if (httpCache == null) {
|
|
27191
|
-
|
|
27191
|
+
request7.cache = "no-store";
|
|
27192
27192
|
}
|
|
27193
27193
|
const newConnection = forceNewConnection ? "yes" : "no";
|
|
27194
|
-
if (
|
|
27194
|
+
if (request7.mode === "websocket") {
|
|
27195
27195
|
} else {
|
|
27196
27196
|
}
|
|
27197
27197
|
let requestBody = null;
|
|
27198
|
-
if (
|
|
27198
|
+
if (request7.body == null && fetchParams.processRequestEndOfBody) {
|
|
27199
27199
|
queueMicrotask(() => fetchParams.processRequestEndOfBody());
|
|
27200
|
-
} else if (
|
|
27200
|
+
} else if (request7.body != null) {
|
|
27201
27201
|
const processBodyChunk = async function* (bytes) {
|
|
27202
27202
|
if (isCancelled(fetchParams)) {
|
|
27203
27203
|
return;
|
|
@@ -27225,7 +27225,7 @@ var require_fetch = __commonJS({
|
|
|
27225
27225
|
};
|
|
27226
27226
|
requestBody = (async function* () {
|
|
27227
27227
|
try {
|
|
27228
|
-
for await (const bytes of
|
|
27228
|
+
for await (const bytes of request7.body.stream) {
|
|
27229
27229
|
yield* processBodyChunk(bytes);
|
|
27230
27230
|
}
|
|
27231
27231
|
processEndOfBody();
|
|
@@ -27332,7 +27332,7 @@ var require_fetch = __commonJS({
|
|
|
27332
27332
|
}
|
|
27333
27333
|
return response;
|
|
27334
27334
|
function dispatch({ body }) {
|
|
27335
|
-
const url2 = requestCurrentURL(
|
|
27335
|
+
const url2 = requestCurrentURL(request7);
|
|
27336
27336
|
const agent = fetchParams.controller.dispatcher;
|
|
27337
27337
|
const path41 = url2.pathname + url2.search;
|
|
27338
27338
|
const hasTrailingQuestionMark = url2.search.length === 0 && url2.href[url2.href.length - url2.hash.length - 1] === "?";
|
|
@@ -27340,11 +27340,11 @@ var require_fetch = __commonJS({
|
|
|
27340
27340
|
{
|
|
27341
27341
|
path: hasTrailingQuestionMark ? `${path41}?` : path41,
|
|
27342
27342
|
origin: url2.origin,
|
|
27343
|
-
method:
|
|
27344
|
-
body: agent.isMockActive ?
|
|
27345
|
-
headers:
|
|
27343
|
+
method: request7.method,
|
|
27344
|
+
body: agent.isMockActive ? request7.body && (request7.body.source || request7.body.stream) : body,
|
|
27345
|
+
headers: request7.headersList.entries,
|
|
27346
27346
|
maxRedirections: 0,
|
|
27347
|
-
upgrade:
|
|
27347
|
+
upgrade: request7.mode === "websocket" ? "websocket" : void 0
|
|
27348
27348
|
},
|
|
27349
27349
|
{
|
|
27350
27350
|
body: null,
|
|
@@ -27381,9 +27381,9 @@ var require_fetch = __commonJS({
|
|
|
27381
27381
|
}
|
|
27382
27382
|
const location = headersList.get("location", true);
|
|
27383
27383
|
this.body = new Readable({ read: resume });
|
|
27384
|
-
const willFollow = location &&
|
|
27384
|
+
const willFollow = location && request7.redirect === "follow" && redirectStatusSet.has(status);
|
|
27385
27385
|
const decoders = [];
|
|
27386
|
-
if (
|
|
27386
|
+
if (request7.method !== "HEAD" && request7.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) {
|
|
27387
27387
|
const contentEncoding = headersList.get("content-encoding", true);
|
|
27388
27388
|
const codings = contentEncoding ? contentEncoding.toLowerCase().split(",") : [];
|
|
27389
27389
|
const maxContentEncodings = 5;
|
|
@@ -27579,31 +27579,31 @@ var require_cache3 = __commonJS({
|
|
|
27579
27579
|
webidl.util.markAsUncloneable(this);
|
|
27580
27580
|
this.#relevantRequestResponseList = arguments[1];
|
|
27581
27581
|
}
|
|
27582
|
-
async match(
|
|
27582
|
+
async match(request7, options = {}) {
|
|
27583
27583
|
webidl.brandCheck(this, _Cache);
|
|
27584
27584
|
const prefix = "Cache.match";
|
|
27585
27585
|
webidl.argumentLengthCheck(arguments, 1, prefix);
|
|
27586
|
-
|
|
27586
|
+
request7 = webidl.converters.RequestInfo(request7);
|
|
27587
27587
|
options = webidl.converters.CacheQueryOptions(options, prefix, "options");
|
|
27588
|
-
const p = this.#internalMatchAll(
|
|
27588
|
+
const p = this.#internalMatchAll(request7, options, 1);
|
|
27589
27589
|
if (p.length === 0) {
|
|
27590
27590
|
return;
|
|
27591
27591
|
}
|
|
27592
27592
|
return p[0];
|
|
27593
27593
|
}
|
|
27594
|
-
async matchAll(
|
|
27594
|
+
async matchAll(request7 = void 0, options = {}) {
|
|
27595
27595
|
webidl.brandCheck(this, _Cache);
|
|
27596
27596
|
const prefix = "Cache.matchAll";
|
|
27597
|
-
if (
|
|
27597
|
+
if (request7 !== void 0) request7 = webidl.converters.RequestInfo(request7);
|
|
27598
27598
|
options = webidl.converters.CacheQueryOptions(options, prefix, "options");
|
|
27599
|
-
return this.#internalMatchAll(
|
|
27599
|
+
return this.#internalMatchAll(request7, options);
|
|
27600
27600
|
}
|
|
27601
|
-
async add(
|
|
27601
|
+
async add(request7) {
|
|
27602
27602
|
webidl.brandCheck(this, _Cache);
|
|
27603
27603
|
const prefix = "Cache.add";
|
|
27604
27604
|
webidl.argumentLengthCheck(arguments, 1, prefix);
|
|
27605
|
-
|
|
27606
|
-
const requests = [
|
|
27605
|
+
request7 = webidl.converters.RequestInfo(request7);
|
|
27606
|
+
const requests = [request7];
|
|
27607
27607
|
const responseArrayPromise = this.addAll(requests);
|
|
27608
27608
|
return await responseArrayPromise;
|
|
27609
27609
|
}
|
|
@@ -27613,19 +27613,19 @@ var require_cache3 = __commonJS({
|
|
|
27613
27613
|
webidl.argumentLengthCheck(arguments, 1, prefix);
|
|
27614
27614
|
const responsePromises = [];
|
|
27615
27615
|
const requestList = [];
|
|
27616
|
-
for (let
|
|
27617
|
-
if (
|
|
27616
|
+
for (let request7 of requests) {
|
|
27617
|
+
if (request7 === void 0) {
|
|
27618
27618
|
throw webidl.errors.conversionFailed({
|
|
27619
27619
|
prefix,
|
|
27620
27620
|
argument: "Argument 1",
|
|
27621
27621
|
types: ["undefined is not allowed"]
|
|
27622
27622
|
});
|
|
27623
27623
|
}
|
|
27624
|
-
|
|
27625
|
-
if (typeof
|
|
27624
|
+
request7 = webidl.converters.RequestInfo(request7);
|
|
27625
|
+
if (typeof request7 === "string") {
|
|
27626
27626
|
continue;
|
|
27627
27627
|
}
|
|
27628
|
-
const r2 = getRequestState(
|
|
27628
|
+
const r2 = getRequestState(request7);
|
|
27629
27629
|
if (!urlIsHttpHttpsScheme(r2.url) || r2.method !== "GET") {
|
|
27630
27630
|
throw webidl.errors.exception({
|
|
27631
27631
|
header: prefix,
|
|
@@ -27634,8 +27634,8 @@ var require_cache3 = __commonJS({
|
|
|
27634
27634
|
}
|
|
27635
27635
|
}
|
|
27636
27636
|
const fetchControllers = [];
|
|
27637
|
-
for (const
|
|
27638
|
-
const r2 = getRequestState(new Request(
|
|
27637
|
+
for (const request7 of requests) {
|
|
27638
|
+
const r2 = getRequestState(new Request(request7));
|
|
27639
27639
|
if (!urlIsHttpHttpsScheme(r2.url)) {
|
|
27640
27640
|
throw webidl.errors.exception({
|
|
27641
27641
|
header: prefix,
|
|
@@ -27712,17 +27712,17 @@ var require_cache3 = __commonJS({
|
|
|
27712
27712
|
});
|
|
27713
27713
|
return cacheJobPromise.promise;
|
|
27714
27714
|
}
|
|
27715
|
-
async put(
|
|
27715
|
+
async put(request7, response) {
|
|
27716
27716
|
webidl.brandCheck(this, _Cache);
|
|
27717
27717
|
const prefix = "Cache.put";
|
|
27718
27718
|
webidl.argumentLengthCheck(arguments, 2, prefix);
|
|
27719
|
-
|
|
27719
|
+
request7 = webidl.converters.RequestInfo(request7);
|
|
27720
27720
|
response = webidl.converters.Response(response, prefix, "response");
|
|
27721
27721
|
let innerRequest = null;
|
|
27722
|
-
if (webidl.is.Request(
|
|
27723
|
-
innerRequest = getRequestState(
|
|
27722
|
+
if (webidl.is.Request(request7)) {
|
|
27723
|
+
innerRequest = getRequestState(request7);
|
|
27724
27724
|
} else {
|
|
27725
|
-
innerRequest = getRequestState(new Request(
|
|
27725
|
+
innerRequest = getRequestState(new Request(request7));
|
|
27726
27726
|
}
|
|
27727
27727
|
if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== "GET") {
|
|
27728
27728
|
throw webidl.errors.exception({
|
|
@@ -27793,21 +27793,21 @@ var require_cache3 = __commonJS({
|
|
|
27793
27793
|
});
|
|
27794
27794
|
return cacheJobPromise.promise;
|
|
27795
27795
|
}
|
|
27796
|
-
async delete(
|
|
27796
|
+
async delete(request7, options = {}) {
|
|
27797
27797
|
webidl.brandCheck(this, _Cache);
|
|
27798
27798
|
const prefix = "Cache.delete";
|
|
27799
27799
|
webidl.argumentLengthCheck(arguments, 1, prefix);
|
|
27800
|
-
|
|
27800
|
+
request7 = webidl.converters.RequestInfo(request7);
|
|
27801
27801
|
options = webidl.converters.CacheQueryOptions(options, prefix, "options");
|
|
27802
27802
|
let r2 = null;
|
|
27803
|
-
if (webidl.is.Request(
|
|
27804
|
-
r2 = getRequestState(
|
|
27803
|
+
if (webidl.is.Request(request7)) {
|
|
27804
|
+
r2 = getRequestState(request7);
|
|
27805
27805
|
if (r2.method !== "GET" && !options.ignoreMethod) {
|
|
27806
27806
|
return false;
|
|
27807
27807
|
}
|
|
27808
27808
|
} else {
|
|
27809
|
-
assert2(typeof
|
|
27810
|
-
r2 = getRequestState(new Request(
|
|
27809
|
+
assert2(typeof request7 === "string");
|
|
27810
|
+
r2 = getRequestState(new Request(request7));
|
|
27811
27811
|
}
|
|
27812
27812
|
const operations = [];
|
|
27813
27813
|
const operation = {
|
|
@@ -27839,25 +27839,25 @@ var require_cache3 = __commonJS({
|
|
|
27839
27839
|
* @param {import('../../../types/cache').CacheQueryOptions} options
|
|
27840
27840
|
* @returns {Promise<readonly Request[]>}
|
|
27841
27841
|
*/
|
|
27842
|
-
async keys(
|
|
27842
|
+
async keys(request7 = void 0, options = {}) {
|
|
27843
27843
|
webidl.brandCheck(this, _Cache);
|
|
27844
27844
|
const prefix = "Cache.keys";
|
|
27845
|
-
if (
|
|
27845
|
+
if (request7 !== void 0) request7 = webidl.converters.RequestInfo(request7);
|
|
27846
27846
|
options = webidl.converters.CacheQueryOptions(options, prefix, "options");
|
|
27847
27847
|
let r2 = null;
|
|
27848
|
-
if (
|
|
27849
|
-
if (webidl.is.Request(
|
|
27850
|
-
r2 = getRequestState(
|
|
27848
|
+
if (request7 !== void 0) {
|
|
27849
|
+
if (webidl.is.Request(request7)) {
|
|
27850
|
+
r2 = getRequestState(request7);
|
|
27851
27851
|
if (r2.method !== "GET" && !options.ignoreMethod) {
|
|
27852
27852
|
return [];
|
|
27853
27853
|
}
|
|
27854
|
-
} else if (typeof
|
|
27855
|
-
r2 = getRequestState(new Request(
|
|
27854
|
+
} else if (typeof request7 === "string") {
|
|
27855
|
+
r2 = getRequestState(new Request(request7));
|
|
27856
27856
|
}
|
|
27857
27857
|
}
|
|
27858
27858
|
const promise2 = createDeferredPromise();
|
|
27859
27859
|
const requests = [];
|
|
27860
|
-
if (
|
|
27860
|
+
if (request7 === void 0) {
|
|
27861
27861
|
for (const requestResponse of this.#relevantRequestResponseList) {
|
|
27862
27862
|
requests.push(requestResponse[0]);
|
|
27863
27863
|
}
|
|
@@ -27869,9 +27869,9 @@ var require_cache3 = __commonJS({
|
|
|
27869
27869
|
}
|
|
27870
27870
|
queueMicrotask(() => {
|
|
27871
27871
|
const requestList = [];
|
|
27872
|
-
for (const
|
|
27872
|
+
for (const request8 of requests) {
|
|
27873
27873
|
const requestObject = fromInnerRequest(
|
|
27874
|
-
|
|
27874
|
+
request8,
|
|
27875
27875
|
void 0,
|
|
27876
27876
|
new AbortController().signal,
|
|
27877
27877
|
"immutable"
|
|
@@ -27990,9 +27990,9 @@ var require_cache3 = __commonJS({
|
|
|
27990
27990
|
* @param {import('../../../types/cache').CacheQueryOptions | undefined} options
|
|
27991
27991
|
* @returns {boolean}
|
|
27992
27992
|
*/
|
|
27993
|
-
#requestMatchesCachedItem(requestQuery,
|
|
27993
|
+
#requestMatchesCachedItem(requestQuery, request7, response = null, options) {
|
|
27994
27994
|
const queryURL = new URL(requestQuery.url);
|
|
27995
|
-
const cachedURL = new URL(
|
|
27995
|
+
const cachedURL = new URL(request7.url);
|
|
27996
27996
|
if (options?.ignoreSearch) {
|
|
27997
27997
|
cachedURL.search = "";
|
|
27998
27998
|
queryURL.search = "";
|
|
@@ -28008,7 +28008,7 @@ var require_cache3 = __commonJS({
|
|
|
28008
28008
|
if (fieldValue === "*") {
|
|
28009
28009
|
return false;
|
|
28010
28010
|
}
|
|
28011
|
-
const requestValue =
|
|
28011
|
+
const requestValue = request7.headersList.get(fieldValue);
|
|
28012
28012
|
const queryValue = requestQuery.headersList.get(fieldValue);
|
|
28013
28013
|
if (requestValue !== queryValue) {
|
|
28014
28014
|
return false;
|
|
@@ -28016,20 +28016,20 @@ var require_cache3 = __commonJS({
|
|
|
28016
28016
|
}
|
|
28017
28017
|
return true;
|
|
28018
28018
|
}
|
|
28019
|
-
#internalMatchAll(
|
|
28019
|
+
#internalMatchAll(request7, options, maxResponses = Infinity) {
|
|
28020
28020
|
let r2 = null;
|
|
28021
|
-
if (
|
|
28022
|
-
if (webidl.is.Request(
|
|
28023
|
-
r2 = getRequestState(
|
|
28021
|
+
if (request7 !== void 0) {
|
|
28022
|
+
if (webidl.is.Request(request7)) {
|
|
28023
|
+
r2 = getRequestState(request7);
|
|
28024
28024
|
if (r2.method !== "GET" && !options.ignoreMethod) {
|
|
28025
28025
|
return [];
|
|
28026
28026
|
}
|
|
28027
|
-
} else if (typeof
|
|
28028
|
-
r2 = getRequestState(new Request(
|
|
28027
|
+
} else if (typeof request7 === "string") {
|
|
28028
|
+
r2 = getRequestState(new Request(request7));
|
|
28029
28029
|
}
|
|
28030
28030
|
}
|
|
28031
28031
|
const responses = [];
|
|
28032
|
-
if (
|
|
28032
|
+
if (request7 === void 0) {
|
|
28033
28033
|
for (const requestResponse of this.#relevantRequestResponseList) {
|
|
28034
28034
|
responses.push(requestResponse[1]);
|
|
28035
28035
|
}
|
|
@@ -28121,21 +28121,21 @@ var require_cachestorage = __commonJS({
|
|
|
28121
28121
|
}
|
|
28122
28122
|
webidl.util.markAsUncloneable(this);
|
|
28123
28123
|
}
|
|
28124
|
-
async match(
|
|
28124
|
+
async match(request7, options = {}) {
|
|
28125
28125
|
webidl.brandCheck(this, _CacheStorage);
|
|
28126
28126
|
webidl.argumentLengthCheck(arguments, 1, "CacheStorage.match");
|
|
28127
|
-
|
|
28127
|
+
request7 = webidl.converters.RequestInfo(request7);
|
|
28128
28128
|
options = webidl.converters.MultiCacheQueryOptions(options);
|
|
28129
28129
|
if (options.cacheName != null) {
|
|
28130
28130
|
if (this.#caches.has(options.cacheName)) {
|
|
28131
28131
|
const cacheList = this.#caches.get(options.cacheName);
|
|
28132
28132
|
const cache = new Cache(kConstruct, cacheList);
|
|
28133
|
-
return await cache.match(
|
|
28133
|
+
return await cache.match(request7, options);
|
|
28134
28134
|
}
|
|
28135
28135
|
} else {
|
|
28136
28136
|
for (const cacheList of this.#caches.values()) {
|
|
28137
28137
|
const cache = new Cache(kConstruct, cacheList);
|
|
28138
|
-
const response = await cache.match(
|
|
28138
|
+
const response = await cache.match(request7, options);
|
|
28139
28139
|
if (response !== void 0) {
|
|
28140
28140
|
return response;
|
|
28141
28141
|
}
|
|
@@ -29327,7 +29327,7 @@ var require_connection = __commonJS({
|
|
|
29327
29327
|
function establishWebSocketConnection(url2, protocols, client, handler, options) {
|
|
29328
29328
|
const requestURL = url2;
|
|
29329
29329
|
requestURL.protocol = url2.protocol === "ws:" ? "http:" : "https:";
|
|
29330
|
-
const
|
|
29330
|
+
const request7 = makeRequest({
|
|
29331
29331
|
urlList: [requestURL],
|
|
29332
29332
|
client,
|
|
29333
29333
|
serviceWorkers: "none",
|
|
@@ -29340,18 +29340,18 @@ var require_connection = __commonJS({
|
|
|
29340
29340
|
});
|
|
29341
29341
|
if (options.headers) {
|
|
29342
29342
|
const headersList = getHeadersList(new Headers(options.headers));
|
|
29343
|
-
|
|
29343
|
+
request7.headersList = headersList;
|
|
29344
29344
|
}
|
|
29345
29345
|
const keyValue = crypto.randomBytes(16).toString("base64");
|
|
29346
|
-
|
|
29347
|
-
|
|
29346
|
+
request7.headersList.append("sec-websocket-key", keyValue, true);
|
|
29347
|
+
request7.headersList.append("sec-websocket-version", "13", true);
|
|
29348
29348
|
for (const protocol of protocols) {
|
|
29349
|
-
|
|
29349
|
+
request7.headersList.append("sec-websocket-protocol", protocol, true);
|
|
29350
29350
|
}
|
|
29351
29351
|
const permessageDeflate = "permessage-deflate; client_max_window_bits";
|
|
29352
|
-
|
|
29352
|
+
request7.headersList.append("sec-websocket-extensions", permessageDeflate, true);
|
|
29353
29353
|
const controller = fetching({
|
|
29354
|
-
request:
|
|
29354
|
+
request: request7,
|
|
29355
29355
|
useParallelQueue: true,
|
|
29356
29356
|
dispatcher: options.dispatcher,
|
|
29357
29357
|
processResponse(response) {
|
|
@@ -29398,7 +29398,7 @@ var require_connection = __commonJS({
|
|
|
29398
29398
|
}
|
|
29399
29399
|
const secProtocol = response.headersList.get("Sec-WebSocket-Protocol");
|
|
29400
29400
|
if (secProtocol !== null) {
|
|
29401
|
-
const requestProtocols = getDecodeSplit("sec-websocket-protocol",
|
|
29401
|
+
const requestProtocols = getDecodeSplit("sec-websocket-protocol", request7.headersList);
|
|
29402
29402
|
if (requestProtocols === null || !requestProtocols.includes(secProtocol)) {
|
|
29403
29403
|
failWebsocketConnection(handler, 1002, "Protocol was not set in the opening handshake.");
|
|
29404
29404
|
return;
|
|
@@ -59667,6 +59667,7 @@ function buildLayoutPaths(root) {
|
|
|
59667
59667
|
frontdoorCaBundlesDir: import_node_path17.default.join(root, "frontdoor", "ca", "bundles"),
|
|
59668
59668
|
frontdoorStateFile: import_node_path17.default.join(root, "frontdoor", "state.json"),
|
|
59669
59669
|
frontdoorLockFile: import_node_path17.default.join(root, "frontdoor", "start.lock"),
|
|
59670
|
+
frontdoorControlTokenFile: import_node_path17.default.join(root, "frontdoor", "control-token"),
|
|
59670
59671
|
frontdoorSessionsDir: import_node_path17.default.join(root, "frontdoor", "sessions"),
|
|
59671
59672
|
frontdoorLogPath: import_node_path17.default.join(root, "logs", "frontdoor.log"),
|
|
59672
59673
|
usageDir: import_node_path17.default.join(root, "usage"),
|
|
@@ -61039,7 +61040,7 @@ function registerIdentityCommand(program2, deps) {
|
|
|
61039
61040
|
// package.json
|
|
61040
61041
|
var package_default = {
|
|
61041
61042
|
name: "agent-shim",
|
|
61042
|
-
version: "8.
|
|
61043
|
+
version: "8.4.0",
|
|
61043
61044
|
description: "A profile manager and launcher for Claude Code that lets one person run multiple logins from one machine while controlling what gets shared between them.",
|
|
61044
61045
|
license: "MIT",
|
|
61045
61046
|
author: "Joseph Mearman <joseph@mearman.co.uk>",
|
|
@@ -63637,9 +63638,9 @@ function headersFor(credentials, sessionId) {
|
|
|
63637
63638
|
session_id: sessionId
|
|
63638
63639
|
};
|
|
63639
63640
|
}
|
|
63640
|
-
async function callCodex(ports,
|
|
63641
|
+
async function callCodex(ports, request7, sessionId, signal) {
|
|
63641
63642
|
const url2 = ports.url ?? CODEX_RESPONSES_URL;
|
|
63642
|
-
const body = JSON.stringify(
|
|
63643
|
+
const body = JSON.stringify(request7);
|
|
63643
63644
|
const send = async (credentials2) => await fetchUntilHeaders(ports.fetch, ports.timers, url2, {
|
|
63644
63645
|
method: "POST",
|
|
63645
63646
|
headers: headersFor(credentials2, sessionId),
|
|
@@ -63913,23 +63914,23 @@ function singleValue(value) {
|
|
|
63913
63914
|
return typeof value === "string" ? value : void 0;
|
|
63914
63915
|
}
|
|
63915
63916
|
function admitLaunch(isLiveToken) {
|
|
63916
|
-
return (
|
|
63917
|
-
const token = singleValue(
|
|
63918
|
-
return token !== void 0 && isLiveToken(token) ? { ok: true, headers: { ...
|
|
63917
|
+
return (request7) => {
|
|
63918
|
+
const token = singleValue(request7.headers[AUTH_HEADER]);
|
|
63919
|
+
return token !== void 0 && isLiveToken(token) ? { ok: true, headers: { ...request7.forwardable } } : { ok: false, message: "agent-shim front door: this request carries no capability from a live agent-shim launch" };
|
|
63919
63920
|
};
|
|
63920
63921
|
}
|
|
63921
63922
|
function admitHop(hopSecret, custody) {
|
|
63922
|
-
return (
|
|
63923
|
-
if (singleValue(
|
|
63923
|
+
return (request7) => {
|
|
63924
|
+
if (singleValue(request7.headers[HOP_SECRET_HEADER]) !== hopSecret) {
|
|
63924
63925
|
return { ok: false, message: "agent-shim front door: the direct listener serves only this door's own headroom hop" };
|
|
63925
63926
|
}
|
|
63926
|
-
const hopId = singleValue(
|
|
63927
|
-
const provider = parseProviderPath(new URL(
|
|
63927
|
+
const hopId = singleValue(request7.headers[HOP_ID_HEADER]);
|
|
63928
|
+
const provider = parseProviderPath(new URL(request7.url, "http://127.0.0.1").pathname)?.provider;
|
|
63928
63929
|
const credentials = hopId === void 0 || provider === void 0 ? void 0 : custody.redeem(hopId, provider);
|
|
63929
63930
|
if (credentials === void 0) {
|
|
63930
63931
|
return { ok: false, message: "agent-shim front door: this request names no live headroom hop for its provider" };
|
|
63931
63932
|
}
|
|
63932
|
-
return { ok: true, headers: restoreCredentials(
|
|
63933
|
+
return { ok: true, headers: restoreCredentials(request7.forwardable, credentials) };
|
|
63933
63934
|
};
|
|
63934
63935
|
}
|
|
63935
63936
|
function createDoorPipelines(deps) {
|
|
@@ -64047,8 +64048,8 @@ function createFileCapture(file2, now = () => /* @__PURE__ */ new Date()) {
|
|
|
64047
64048
|
connect: (target, intercepted) => {
|
|
64048
64049
|
append({ kind: "connect", host: target.host, port: target.port, intercepted });
|
|
64049
64050
|
},
|
|
64050
|
-
upgrade: (
|
|
64051
|
-
append({ kind: "upgrade", method:
|
|
64051
|
+
upgrade: (request7) => {
|
|
64052
|
+
append({ kind: "upgrade", method: request7.method ?? "?", url: request7.url ?? "?", headers: redactHeaders(request7.headers) });
|
|
64052
64053
|
},
|
|
64053
64054
|
tapStream: (host) => {
|
|
64054
64055
|
nextId += 1;
|
|
@@ -64063,19 +64064,19 @@ function createFileCapture(file2, now = () => /* @__PURE__ */ new Date()) {
|
|
|
64063
64064
|
if (budget <= 0) {
|
|
64064
64065
|
return;
|
|
64065
64066
|
}
|
|
64066
|
-
const
|
|
64067
|
-
stored[direction] +=
|
|
64068
|
-
const text2 =
|
|
64069
|
-
const faithful = Buffer.from(text2, "utf8").equals(
|
|
64067
|
+
const excerpt2 = chunk.subarray(0, Math.min(CHUNK_LOG_CAP_BYTES, budget));
|
|
64068
|
+
stored[direction] += excerpt2.length;
|
|
64069
|
+
const text2 = excerpt2.toString("utf8");
|
|
64070
|
+
const faithful = Buffer.from(text2, "utf8").equals(excerpt2);
|
|
64070
64071
|
append({
|
|
64071
64072
|
kind: "stream-chunk",
|
|
64072
64073
|
id,
|
|
64073
64074
|
dir: direction,
|
|
64074
64075
|
seq: sequences[direction],
|
|
64075
64076
|
bytes: chunk.length,
|
|
64076
|
-
stored:
|
|
64077
|
-
truncated:
|
|
64078
|
-
...faithful ? { body: redactText(text2) } : { b64:
|
|
64077
|
+
stored: excerpt2.length,
|
|
64078
|
+
truncated: excerpt2.length < chunk.length,
|
|
64079
|
+
...faithful ? { body: redactText(text2) } : { b64: excerpt2.toString("base64") }
|
|
64079
64080
|
});
|
|
64080
64081
|
},
|
|
64081
64082
|
onEnd: () => {
|
|
@@ -64083,10 +64084,10 @@ function createFileCapture(file2, now = () => /* @__PURE__ */ new Date()) {
|
|
|
64083
64084
|
}
|
|
64084
64085
|
};
|
|
64085
64086
|
},
|
|
64086
|
-
observePassthrough: (
|
|
64087
|
+
observePassthrough: (request7) => {
|
|
64087
64088
|
nextId += 1;
|
|
64088
64089
|
const id = nextId;
|
|
64089
|
-
append({ kind: "request", id, method:
|
|
64090
|
+
append({ kind: "request", id, method: request7.method ?? "?", url: request7.url ?? "?", headers: redactHeaders(request7.headers) });
|
|
64090
64091
|
const logged = { request: 0, response: 0 };
|
|
64091
64092
|
const sequences = { request: 0, response: 0 };
|
|
64092
64093
|
const chunk = (direction, incoming) => {
|
|
@@ -64095,16 +64096,16 @@ function createFileCapture(file2, now = () => /* @__PURE__ */ new Date()) {
|
|
|
64095
64096
|
if (budget <= 0) {
|
|
64096
64097
|
return;
|
|
64097
64098
|
}
|
|
64098
|
-
const
|
|
64099
|
-
logged[direction] +=
|
|
64099
|
+
const excerpt2 = incoming.subarray(0, Math.min(CHUNK_LOG_CAP_BYTES, budget));
|
|
64100
|
+
logged[direction] += excerpt2.length;
|
|
64100
64101
|
append({
|
|
64101
64102
|
kind: `${direction}-chunk`,
|
|
64102
64103
|
id,
|
|
64103
64104
|
seq: sequences[direction],
|
|
64104
64105
|
bytes: incoming.length,
|
|
64105
|
-
stored:
|
|
64106
|
-
truncated:
|
|
64107
|
-
body: redactBody(
|
|
64106
|
+
stored: excerpt2.length,
|
|
64107
|
+
truncated: excerpt2.length < incoming.length,
|
|
64108
|
+
body: redactBody(excerpt2)
|
|
64108
64109
|
});
|
|
64109
64110
|
};
|
|
64110
64111
|
return {
|
|
@@ -64651,14 +64652,14 @@ function caParses(ca) {
|
|
|
64651
64652
|
var TAP_ALPN_PROTOCOLS = ["h2", "http/1.1"];
|
|
64652
64653
|
async function startConnectServer(config2, effects, preferredPort) {
|
|
64653
64654
|
const tunnelTokens = /* @__PURE__ */ new WeakMap();
|
|
64654
|
-
const onUpgrade = (host) => (
|
|
64655
|
-
config2.capture?.upgrade(
|
|
64655
|
+
const onUpgrade = (host) => (request7, socket, head) => {
|
|
64656
|
+
config2.capture?.upgrade(request7);
|
|
64656
64657
|
if (head.length > 0) {
|
|
64657
64658
|
socket.pause();
|
|
64658
64659
|
socket.unshift(head);
|
|
64659
64660
|
}
|
|
64660
|
-
const headText = `${
|
|
64661
|
-
${
|
|
64661
|
+
const headText = `${request7.method ?? "GET"} ${request7.url ?? "/"} HTTP/1.1\r
|
|
64662
|
+
${request7.rawHeaders.reduce((accumulated, value, index) => index % 2 === 0 ? `${accumulated}${value}: ` : `${accumulated}${value}\r
|
|
64662
64663
|
`, "")}\r
|
|
64663
64664
|
`;
|
|
64664
64665
|
pumpTapSession(socket, async (clientAlpn) => await effects.connectTlsUpstream(host, HTTPS_PORT, clientAlpn), config2.capture?.tapStream?.(host), Buffer.from(headText, "utf8"));
|
|
@@ -64671,16 +64672,16 @@ ${request6.rawHeaders.reduce((accumulated, value, index) => index % 2 === 0 ? `$
|
|
|
64671
64672
|
const tlsAcceptor2 = effects.createTlsAcceptor(config2.leafFor(host), serveSecure2, TAP_ALPN_PROTOCOLS);
|
|
64672
64673
|
return { host, serveSecure: serveSecure2, tlsAcceptor: tlsAcceptor2 };
|
|
64673
64674
|
}
|
|
64674
|
-
const handler = (
|
|
64675
|
-
if (host === config2.routedHost && servedByPipeline(
|
|
64676
|
-
const tunnelToken = tunnelTokens.get(
|
|
64677
|
-
if (tunnelToken !== void 0 &&
|
|
64678
|
-
|
|
64675
|
+
const handler = (request7, response) => {
|
|
64676
|
+
if (host === config2.routedHost && servedByPipeline(request7.url)) {
|
|
64677
|
+
const tunnelToken = tunnelTokens.get(request7.socket);
|
|
64678
|
+
if (tunnelToken !== void 0 && request7.headers[AUTH_HEADER] === void 0) {
|
|
64679
|
+
request7.headers[AUTH_HEADER] = tunnelToken;
|
|
64679
64680
|
}
|
|
64680
|
-
config2.serveRouted(
|
|
64681
|
+
config2.serveRouted(request7, response);
|
|
64681
64682
|
return;
|
|
64682
64683
|
}
|
|
64683
|
-
effects.forwardHttp(config2.upstreamFor(host),
|
|
64684
|
+
effects.forwardHttp(config2.upstreamFor(host), request7, response, config2.capture?.observePassthrough(request7));
|
|
64684
64685
|
};
|
|
64685
64686
|
const httpSession = effects.createHttpSession(handler, onUpgrade(host));
|
|
64686
64687
|
const serveSecure = (secure, capability) => {
|
|
@@ -64977,6 +64978,40 @@ var ExemptTlsAgent = class extends https.Agent {
|
|
|
64977
64978
|
return tls.connect(tlsOptions);
|
|
64978
64979
|
}
|
|
64979
64980
|
};
|
|
64981
|
+
function realRcEventDial(target = { host: CONNECT_INTERCEPT_HOST, port: HTTPS_PORT }) {
|
|
64982
|
+
const agent = new ExemptTlsAgent();
|
|
64983
|
+
return {
|
|
64984
|
+
writeEvents: async (sessionId, headers, body) => await new Promise((resolve, reject) => {
|
|
64985
|
+
const options = {
|
|
64986
|
+
host: target.host,
|
|
64987
|
+
port: target.port,
|
|
64988
|
+
method: "POST",
|
|
64989
|
+
path: `/v1/code/sessions/${encodeURIComponent(sessionId)}/events`,
|
|
64990
|
+
// The Host header names the host whose API this is, not the address dialled: a redirected test dials a loopback stand-in while still speaking to the API host by name, exactly as the forwarded paths present their SNI.
|
|
64991
|
+
headers: { ...headers, host: target.servername ?? target.host, "content-length": String(Buffer.byteLength(body, "utf8")) },
|
|
64992
|
+
agent
|
|
64993
|
+
};
|
|
64994
|
+
options.servername = target.servername ?? target.host;
|
|
64995
|
+
if (target.ca !== void 0) {
|
|
64996
|
+
options.ca = [...target.ca];
|
|
64997
|
+
}
|
|
64998
|
+
if (target.rejectUnauthorized !== void 0) {
|
|
64999
|
+
options.rejectUnauthorized = target.rejectUnauthorized;
|
|
65000
|
+
}
|
|
65001
|
+
const request7 = https.request(options, (response) => {
|
|
65002
|
+
const chunks = [];
|
|
65003
|
+
response.on("data", (chunk) => {
|
|
65004
|
+
chunks.push(chunk);
|
|
65005
|
+
});
|
|
65006
|
+
response.on("end", () => {
|
|
65007
|
+
resolve({ status: response.statusCode ?? HTTP_BAD_GATEWAY, body: Buffer.concat(chunks).toString("utf8") });
|
|
65008
|
+
});
|
|
65009
|
+
});
|
|
65010
|
+
request7.once("error", reject);
|
|
65011
|
+
request7.end(body);
|
|
65012
|
+
})
|
|
65013
|
+
};
|
|
65014
|
+
}
|
|
64980
65015
|
function realConnectEffects() {
|
|
64981
65016
|
const plainAgent = new ExemptHttpAgent();
|
|
64982
65017
|
const tlsAgent = new ExemptTlsAgent();
|
|
@@ -65082,8 +65117,8 @@ function realConnectEffects() {
|
|
|
65082
65117
|
socket.destroy();
|
|
65083
65118
|
});
|
|
65084
65119
|
if (onUpgrade !== void 0) {
|
|
65085
|
-
server.on("upgrade", (
|
|
65086
|
-
onUpgrade(
|
|
65120
|
+
server.on("upgrade", (request7, socket, head) => {
|
|
65121
|
+
onUpgrade(request7, socket, head);
|
|
65087
65122
|
});
|
|
65088
65123
|
}
|
|
65089
65124
|
return {
|
|
@@ -65122,14 +65157,14 @@ function realConnectEffects() {
|
|
|
65122
65157
|
});
|
|
65123
65158
|
socket.once("error", reject);
|
|
65124
65159
|
}),
|
|
65125
|
-
forwardHttp: (target,
|
|
65126
|
-
const headers = forwardableHeaders(
|
|
65160
|
+
forwardHttp: (target, request7, response, observer) => {
|
|
65161
|
+
const headers = forwardableHeaders(request7.headers);
|
|
65127
65162
|
const options = {
|
|
65128
65163
|
host: target.host,
|
|
65129
65164
|
port: target.port,
|
|
65130
65165
|
lookup: realAddressLookup,
|
|
65131
|
-
method:
|
|
65132
|
-
path:
|
|
65166
|
+
method: request7.method,
|
|
65167
|
+
path: request7.url,
|
|
65133
65168
|
headers,
|
|
65134
65169
|
agent: target.tls ? tlsAgent : plainAgent
|
|
65135
65170
|
};
|
|
@@ -65164,15 +65199,20 @@ function realConnectEffects() {
|
|
|
65164
65199
|
response.end(body);
|
|
65165
65200
|
});
|
|
65166
65201
|
if (observer !== void 0) {
|
|
65167
|
-
|
|
65202
|
+
request7.on("data", (chunk) => {
|
|
65168
65203
|
observer.onRequestChunk(chunk);
|
|
65169
65204
|
});
|
|
65205
|
+
if (observer.onRequestEnd !== void 0) {
|
|
65206
|
+
request7.on("end", () => {
|
|
65207
|
+
observer.onRequestEnd?.();
|
|
65208
|
+
});
|
|
65209
|
+
}
|
|
65170
65210
|
response.on("close", () => {
|
|
65171
65211
|
observer.onEnd();
|
|
65172
65212
|
});
|
|
65173
65213
|
}
|
|
65174
|
-
|
|
65175
|
-
|
|
65214
|
+
request7.pipe(upstream);
|
|
65215
|
+
request7.socket.setNoDelay(true);
|
|
65176
65216
|
upstream.on("socket", (socket) => {
|
|
65177
65217
|
socket.setNoDelay(true);
|
|
65178
65218
|
});
|
|
@@ -65186,16 +65226,360 @@ var http3 = __toESM(require("node:http"), 1);
|
|
|
65186
65226
|
// src/frontdoor/server.ts
|
|
65187
65227
|
var import_node_http = __toESM(require("node:http"), 1);
|
|
65188
65228
|
var import_node_https = __toESM(require("node:https"), 1);
|
|
65229
|
+
|
|
65230
|
+
// src/frontdoor/rcControl.ts
|
|
65231
|
+
var https2 = __toESM(require("node:https"), 1);
|
|
65232
|
+
var CONTROL_PATH_PREFIX = "/__agent-shim/rc";
|
|
65233
|
+
var CONTROL_BODY_CAP_BYTES = 10485760;
|
|
65234
|
+
function answerJson(response, status, body) {
|
|
65235
|
+
const text2 = JSON.stringify(body);
|
|
65236
|
+
response.writeHead(status, { "content-type": "application/json", "content-length": String(Buffer.byteLength(text2, "utf8")) });
|
|
65237
|
+
response.end(text2);
|
|
65238
|
+
}
|
|
65239
|
+
async function readBody(request7) {
|
|
65240
|
+
return await new Promise((resolve, reject) => {
|
|
65241
|
+
const chunks = [];
|
|
65242
|
+
let total = 0;
|
|
65243
|
+
request7.on("data", (chunk) => {
|
|
65244
|
+
total += chunk.length;
|
|
65245
|
+
if (total > CONTROL_BODY_CAP_BYTES) {
|
|
65246
|
+
request7.destroy();
|
|
65247
|
+
reject(new Error("too large"));
|
|
65248
|
+
return;
|
|
65249
|
+
}
|
|
65250
|
+
chunks.push(chunk);
|
|
65251
|
+
});
|
|
65252
|
+
request7.on("end", () => {
|
|
65253
|
+
resolve(Buffer.concat(chunks).toString("utf8"));
|
|
65254
|
+
});
|
|
65255
|
+
request7.on("error", () => {
|
|
65256
|
+
reject(new Error("the request body ended early"));
|
|
65257
|
+
});
|
|
65258
|
+
});
|
|
65259
|
+
}
|
|
65260
|
+
function createRcControlHandler(deps) {
|
|
65261
|
+
const sessionsPath = `${CONTROL_PATH_PREFIX}/sessions`;
|
|
65262
|
+
const statusPath = `${CONTROL_PATH_PREFIX}/status`;
|
|
65263
|
+
const pendingPath = `${CONTROL_PATH_PREFIX}/pending`;
|
|
65264
|
+
const injectPath = `${CONTROL_PATH_PREFIX}/inject`;
|
|
65265
|
+
const answerPath = `${CONTROL_PATH_PREFIX}/answer`;
|
|
65266
|
+
return (request7, response) => {
|
|
65267
|
+
const presented = request7.headers.authorization;
|
|
65268
|
+
const bearerPrefix = "bearer ".length;
|
|
65269
|
+
const token = typeof presented === "string" && presented.slice(0, bearerPrefix).toLowerCase() === "bearer " ? presented.slice(bearerPrefix) : void 0;
|
|
65270
|
+
if (token === void 0 || !isLiveCapability(token, [deps.expectedToken])) {
|
|
65271
|
+
answerJson(response, HTTP_STATUS.unauthorized, { error: "the front door's control routes demand this generation's control token as a Bearer credential" });
|
|
65272
|
+
return;
|
|
65273
|
+
}
|
|
65274
|
+
const url2 = new URL(request7.url ?? "/", "http://127.0.0.1");
|
|
65275
|
+
const handle = async () => {
|
|
65276
|
+
if (url2.pathname === sessionsPath) {
|
|
65277
|
+
if (request7.method !== "GET") {
|
|
65278
|
+
answerJson(response, HTTP_STATUS.methodNotAllowed, { error: "the session list is a GET" });
|
|
65279
|
+
return;
|
|
65280
|
+
}
|
|
65281
|
+
answerJson(response, HTTP_STATUS.ok, { sessions: deps.list() });
|
|
65282
|
+
return;
|
|
65283
|
+
}
|
|
65284
|
+
if (url2.pathname === statusPath || url2.pathname === pendingPath) {
|
|
65285
|
+
if (request7.method !== "GET") {
|
|
65286
|
+
answerJson(response, HTTP_STATUS.methodNotAllowed, { error: "the status and pending reads are GETs" });
|
|
65287
|
+
return;
|
|
65288
|
+
}
|
|
65289
|
+
const session = url2.searchParams.get("session") ?? void 0;
|
|
65290
|
+
if (session !== void 0 && !deps.statusOf(session).some((entry) => entry.id === session)) {
|
|
65291
|
+
answerJson(response, HTTP_STATUS.notFound, { error: `the front door has not observed Remote Control session ${session}: it may never have passed through this door, or it ended or expired (an entry lives only a bounded idle period past its last observed traffic)` });
|
|
65292
|
+
return;
|
|
65293
|
+
}
|
|
65294
|
+
answerJson(response, HTTP_STATUS.ok, url2.pathname === statusPath ? { statuses: deps.statusOf(session) } : { pending: deps.pendingOf(session) });
|
|
65295
|
+
return;
|
|
65296
|
+
}
|
|
65297
|
+
if (url2.pathname === injectPath) {
|
|
65298
|
+
if (request7.method !== "POST") {
|
|
65299
|
+
answerJson(response, HTTP_STATUS.methodNotAllowed, { error: "the inject operation is a POST" });
|
|
65300
|
+
return;
|
|
65301
|
+
}
|
|
65302
|
+
let parsed;
|
|
65303
|
+
try {
|
|
65304
|
+
parsed = JSON.parse(await readBody(request7));
|
|
65305
|
+
} catch {
|
|
65306
|
+
answerJson(response, HTTP_STATUS.badRequest, { error: "the inject body is not readable JSON within the control body cap" });
|
|
65307
|
+
return;
|
|
65308
|
+
}
|
|
65309
|
+
if (typeof parsed !== "object" || parsed === null || !("session" in parsed) || !("text" in parsed) || typeof parsed.session !== "string" || typeof parsed.text !== "string" || parsed.session === "" || parsed.text === "") {
|
|
65310
|
+
answerJson(response, HTTP_STATUS.badRequest, { error: "the inject body must be JSON naming a non-empty session id and text" });
|
|
65311
|
+
return;
|
|
65312
|
+
}
|
|
65313
|
+
const result = await deps.inject(parsed.session, parsed.text);
|
|
65314
|
+
if (result.ok) {
|
|
65315
|
+
answerJson(response, HTTP_STATUS.ok, { session: parsed.session, sequenceNums: result.sequenceNums });
|
|
65316
|
+
return;
|
|
65317
|
+
}
|
|
65318
|
+
answerJson(response, HTTP_STATUS.badGateway, { error: result.message });
|
|
65319
|
+
return;
|
|
65320
|
+
}
|
|
65321
|
+
if (url2.pathname === answerPath) {
|
|
65322
|
+
if (request7.method !== "POST") {
|
|
65323
|
+
answerJson(response, HTTP_STATUS.methodNotAllowed, { error: "the answer operation is a POST" });
|
|
65324
|
+
return;
|
|
65325
|
+
}
|
|
65326
|
+
let parsed;
|
|
65327
|
+
try {
|
|
65328
|
+
parsed = JSON.parse(await readBody(request7));
|
|
65329
|
+
} catch {
|
|
65330
|
+
answerJson(response, HTTP_STATUS.badRequest, { error: "the answer body is not readable JSON within the control body cap" });
|
|
65331
|
+
return;
|
|
65332
|
+
}
|
|
65333
|
+
if (typeof parsed !== "object" || parsed === null || !("session" in parsed) || !("request" in parsed) || !("approve" in parsed) || typeof parsed.session !== "string" || typeof parsed.request !== "string" || typeof parsed.approve !== "boolean" || parsed.session === "" || parsed.request === "") {
|
|
65334
|
+
answerJson(response, HTTP_STATUS.badRequest, { error: "the answer body must be JSON naming a non-empty session id, request id, and an approve boolean" });
|
|
65335
|
+
return;
|
|
65336
|
+
}
|
|
65337
|
+
const text2 = "text" in parsed && typeof parsed.text === "string" ? parsed.text : void 0;
|
|
65338
|
+
if (parsed.approve && text2 !== void 0 && text2 !== "") {
|
|
65339
|
+
answerJson(response, HTTP_STATUS.badRequest, { error: "an approval carries no text (the protocol's allow result has no message field); text is the denial message" });
|
|
65340
|
+
return;
|
|
65341
|
+
}
|
|
65342
|
+
const result = await deps.answer(parsed.session, parsed.request, { approve: parsed.approve, message: parsed.approve ? void 0 : text2 });
|
|
65343
|
+
if (result.ok) {
|
|
65344
|
+
answerJson(response, HTTP_STATUS.ok, { session: parsed.session, request: parsed.request, sequenceNums: result.sequenceNums });
|
|
65345
|
+
return;
|
|
65346
|
+
}
|
|
65347
|
+
answerJson(response, HTTP_STATUS.badGateway, { error: result.message });
|
|
65348
|
+
return;
|
|
65349
|
+
}
|
|
65350
|
+
answerJson(response, HTTP_STATUS.notFound, { error: `no such control route: ${url2.pathname}` });
|
|
65351
|
+
};
|
|
65352
|
+
handle().catch((error62) => {
|
|
65353
|
+
answerJson(response, HTTP_STATUS.internalServerError, { error: `the control route failed: ${error62 instanceof Error ? error62.message : String(error62)}` });
|
|
65354
|
+
});
|
|
65355
|
+
};
|
|
65356
|
+
}
|
|
65357
|
+
function realRcControlTransport(port, ca) {
|
|
65358
|
+
return {
|
|
65359
|
+
request: async (options) => await new Promise((resolve, reject) => {
|
|
65360
|
+
const request7 = https2.request(
|
|
65361
|
+
{
|
|
65362
|
+
host: "127.0.0.1",
|
|
65363
|
+
port,
|
|
65364
|
+
method: options.method,
|
|
65365
|
+
path: options.path,
|
|
65366
|
+
headers: options.body === void 0 ? options.headers : { ...options.headers, "content-length": String(Buffer.byteLength(options.body, "utf8")) },
|
|
65367
|
+
agent: false,
|
|
65368
|
+
ca: [ca]
|
|
65369
|
+
},
|
|
65370
|
+
(response) => {
|
|
65371
|
+
const chunks = [];
|
|
65372
|
+
response.on("data", (chunk) => {
|
|
65373
|
+
chunks.push(chunk);
|
|
65374
|
+
});
|
|
65375
|
+
response.on("end", () => {
|
|
65376
|
+
resolve({ status: response.statusCode ?? 0, body: Buffer.concat(chunks).toString("utf8") });
|
|
65377
|
+
});
|
|
65378
|
+
}
|
|
65379
|
+
);
|
|
65380
|
+
request7.once("error", reject);
|
|
65381
|
+
if (options.body === void 0) {
|
|
65382
|
+
request7.end();
|
|
65383
|
+
} else {
|
|
65384
|
+
request7.end(options.body);
|
|
65385
|
+
}
|
|
65386
|
+
})
|
|
65387
|
+
};
|
|
65388
|
+
}
|
|
65389
|
+
function controlErrorOf(body) {
|
|
65390
|
+
try {
|
|
65391
|
+
const parsed = JSON.parse(body);
|
|
65392
|
+
if (typeof parsed === "object" && parsed !== null && "error" in parsed && typeof parsed.error === "string") {
|
|
65393
|
+
return parsed.error;
|
|
65394
|
+
}
|
|
65395
|
+
} catch {
|
|
65396
|
+
return body;
|
|
65397
|
+
}
|
|
65398
|
+
return void 0;
|
|
65399
|
+
}
|
|
65400
|
+
function isRcSessionSummary(value) {
|
|
65401
|
+
if (typeof value !== "object" || value === null) {
|
|
65402
|
+
return false;
|
|
65403
|
+
}
|
|
65404
|
+
if (!("id" in value) || !("createdAt" in value) || !("lastSeenAt" in value)) {
|
|
65405
|
+
return false;
|
|
65406
|
+
}
|
|
65407
|
+
return typeof value.id === "string" && typeof value.createdAt === "number" && typeof value.lastSeenAt === "number";
|
|
65408
|
+
}
|
|
65409
|
+
function isRcWorkerFact(value, valueIs) {
|
|
65410
|
+
if (typeof value !== "object" || value === null) {
|
|
65411
|
+
return false;
|
|
65412
|
+
}
|
|
65413
|
+
if (!("value" in value) || !("observedAt" in value)) {
|
|
65414
|
+
return false;
|
|
65415
|
+
}
|
|
65416
|
+
return valueIs(value.value) && typeof value.observedAt === "number";
|
|
65417
|
+
}
|
|
65418
|
+
function isRcSessionStatus(value) {
|
|
65419
|
+
if (!isRcSessionSummary(value)) {
|
|
65420
|
+
return false;
|
|
65421
|
+
}
|
|
65422
|
+
if (!("pending" in value) || !Array.isArray(value.pending)) {
|
|
65423
|
+
return false;
|
|
65424
|
+
}
|
|
65425
|
+
if ("workerState" in value && value.workerState !== void 0 && !isRcWorkerFact(value.workerState, (candidate) => typeof candidate === "string")) {
|
|
65426
|
+
return false;
|
|
65427
|
+
}
|
|
65428
|
+
if ("workerIdleSeconds" in value && value.workerIdleSeconds !== void 0 && !isRcWorkerFact(value.workerIdleSeconds, (candidate) => typeof candidate === "number")) {
|
|
65429
|
+
return false;
|
|
65430
|
+
}
|
|
65431
|
+
return value.pending.every((candidate) => isRcPendingRequestSummary(candidate));
|
|
65432
|
+
}
|
|
65433
|
+
function isRcPendingRequestSummary(value) {
|
|
65434
|
+
if (typeof value !== "object" || value === null) {
|
|
65435
|
+
return false;
|
|
65436
|
+
}
|
|
65437
|
+
if (!("sessionId" in value) || !("requestId" in value) || !("type" in value) || !("summary" in value) || !("observedAt" in value)) {
|
|
65438
|
+
return false;
|
|
65439
|
+
}
|
|
65440
|
+
return typeof value.sessionId === "string" && typeof value.requestId === "string" && typeof value.type === "string" && typeof value.summary === "string" && typeof value.observedAt === "number";
|
|
65441
|
+
}
|
|
65442
|
+
function sequenceNumsOfBody(body) {
|
|
65443
|
+
let parsed;
|
|
65444
|
+
try {
|
|
65445
|
+
parsed = JSON.parse(body);
|
|
65446
|
+
} catch {
|
|
65447
|
+
return void 0;
|
|
65448
|
+
}
|
|
65449
|
+
if (typeof parsed !== "object" || parsed === null || !("sequenceNums" in parsed) || !Array.isArray(parsed.sequenceNums)) {
|
|
65450
|
+
return void 0;
|
|
65451
|
+
}
|
|
65452
|
+
const sequenceNums = [];
|
|
65453
|
+
const values = parsed.sequenceNums;
|
|
65454
|
+
for (const value of values) {
|
|
65455
|
+
if (typeof value !== "number") {
|
|
65456
|
+
return void 0;
|
|
65457
|
+
}
|
|
65458
|
+
sequenceNums.push(value);
|
|
65459
|
+
}
|
|
65460
|
+
return sequenceNums;
|
|
65461
|
+
}
|
|
65462
|
+
function frontDoorRcControl(transport, token) {
|
|
65463
|
+
const headers = { authorization: `Bearer ${token}` };
|
|
65464
|
+
const listAnswerOf = async (path41, what) => {
|
|
65465
|
+
try {
|
|
65466
|
+
return await transport.request({ method: "GET", path: path41, headers });
|
|
65467
|
+
} catch (error62) {
|
|
65468
|
+
throw new Error(`${what}: could not reach the front door's control listener: ${error62 instanceof Error ? error62.message : String(error62)}`, { cause: error62 });
|
|
65469
|
+
}
|
|
65470
|
+
};
|
|
65471
|
+
const sessionsOf = (answer, what) => {
|
|
65472
|
+
if (answer.status !== HTTP_STATUS.ok) {
|
|
65473
|
+
throw new Error(`${what} failed (HTTP ${String(answer.status)}): ${controlErrorOf(answer.body) ?? answer.body}`);
|
|
65474
|
+
}
|
|
65475
|
+
let parsed;
|
|
65476
|
+
try {
|
|
65477
|
+
parsed = JSON.parse(answer.body);
|
|
65478
|
+
} catch {
|
|
65479
|
+
throw new Error(`${what}: the door's answer was not JSON: ${answer.body}`);
|
|
65480
|
+
}
|
|
65481
|
+
if (typeof parsed !== "object" || parsed === null || !("sessions" in parsed) || !Array.isArray(parsed.sessions)) {
|
|
65482
|
+
throw new Error(`${what}: the door's answer named no sessions list: ${answer.body}`);
|
|
65483
|
+
}
|
|
65484
|
+
const candidates = parsed.sessions;
|
|
65485
|
+
const sessions = [];
|
|
65486
|
+
for (const value of candidates) {
|
|
65487
|
+
if (!isRcSessionSummary(value)) {
|
|
65488
|
+
throw new Error(`${what}: the door's answer named no sessions list: ${answer.body}`);
|
|
65489
|
+
}
|
|
65490
|
+
sessions.push(value);
|
|
65491
|
+
}
|
|
65492
|
+
return sessions;
|
|
65493
|
+
};
|
|
65494
|
+
const statusesOf = (answer, what) => {
|
|
65495
|
+
if (answer.status !== HTTP_STATUS.ok) {
|
|
65496
|
+
throw new Error(`${what} failed (HTTP ${String(answer.status)}): ${controlErrorOf(answer.body) ?? answer.body}`);
|
|
65497
|
+
}
|
|
65498
|
+
let parsed;
|
|
65499
|
+
try {
|
|
65500
|
+
parsed = JSON.parse(answer.body);
|
|
65501
|
+
} catch {
|
|
65502
|
+
throw new Error(`${what}: the door's answer was not JSON: ${answer.body}`);
|
|
65503
|
+
}
|
|
65504
|
+
if (typeof parsed !== "object" || parsed === null || !("statuses" in parsed) || !Array.isArray(parsed.statuses)) {
|
|
65505
|
+
throw new Error(`${what}: the door's answer named no status list: ${answer.body}`);
|
|
65506
|
+
}
|
|
65507
|
+
const statuses = [];
|
|
65508
|
+
for (const value of parsed.statuses) {
|
|
65509
|
+
if (!isRcSessionStatus(value)) {
|
|
65510
|
+
throw new Error(`${what}: the door's answer named no status list: ${answer.body}`);
|
|
65511
|
+
}
|
|
65512
|
+
statuses.push(value);
|
|
65513
|
+
}
|
|
65514
|
+
return statuses;
|
|
65515
|
+
};
|
|
65516
|
+
const pendingOfAnswer = (answer, what) => {
|
|
65517
|
+
if (answer.status !== HTTP_STATUS.ok) {
|
|
65518
|
+
throw new Error(`${what} failed (HTTP ${String(answer.status)}): ${controlErrorOf(answer.body) ?? answer.body}`);
|
|
65519
|
+
}
|
|
65520
|
+
let parsed;
|
|
65521
|
+
try {
|
|
65522
|
+
parsed = JSON.parse(answer.body);
|
|
65523
|
+
} catch {
|
|
65524
|
+
throw new Error(`${what}: the door's answer was not JSON: ${answer.body}`);
|
|
65525
|
+
}
|
|
65526
|
+
if (typeof parsed !== "object" || parsed === null || !("pending" in parsed) || !Array.isArray(parsed.pending)) {
|
|
65527
|
+
throw new Error(`${what}: the door's answer named no pending list: ${answer.body}`);
|
|
65528
|
+
}
|
|
65529
|
+
const pending = [];
|
|
65530
|
+
for (const value of parsed.pending) {
|
|
65531
|
+
if (!isRcPendingRequestSummary(value)) {
|
|
65532
|
+
throw new Error(`${what}: the door's answer named no pending list: ${answer.body}`);
|
|
65533
|
+
}
|
|
65534
|
+
pending.push(value);
|
|
65535
|
+
}
|
|
65536
|
+
return pending;
|
|
65537
|
+
};
|
|
65538
|
+
const writeOf = async (path41, body, describeFailure) => {
|
|
65539
|
+
let answer;
|
|
65540
|
+
try {
|
|
65541
|
+
answer = await transport.request({ method: "POST", path: path41, headers: { ...headers, "content-type": "application/json" }, body });
|
|
65542
|
+
} catch (error62) {
|
|
65543
|
+
return { ok: false, message: `could not reach the front door's control listener: ${error62 instanceof Error ? error62.message : String(error62)}` };
|
|
65544
|
+
}
|
|
65545
|
+
if (answer.status === HTTP_STATUS.ok) {
|
|
65546
|
+
const sequenceNums = sequenceNumsOfBody(answer.body);
|
|
65547
|
+
if (sequenceNums === void 0) {
|
|
65548
|
+
return { ok: false, message: `the door accepted the event but its answer named no sequence numbers: ${answer.body}` };
|
|
65549
|
+
}
|
|
65550
|
+
return { ok: true, sequenceNums };
|
|
65551
|
+
}
|
|
65552
|
+
return { ok: false, message: describeFailure(answer.status, controlErrorOf(answer.body) ?? answer.body) };
|
|
65553
|
+
};
|
|
65554
|
+
const sessionQuery = (sessionId) => sessionId === void 0 ? "" : `?session=${encodeURIComponent(sessionId)}`;
|
|
65555
|
+
return {
|
|
65556
|
+
listSessions: async () => sessionsOf(await listAnswerOf(`${CONTROL_PATH_PREFIX}/sessions`, "listing the door's Remote Control sessions"), "listing the door's Remote Control sessions"),
|
|
65557
|
+
statusOf: async (sessionId) => statusesOf(await listAnswerOf(`${CONTROL_PATH_PREFIX}/status${sessionQuery(sessionId)}`, "reading the door's Remote Control session status"), "reading the door's Remote Control session status"),
|
|
65558
|
+
pendingOf: async (sessionId) => pendingOfAnswer(await listAnswerOf(`${CONTROL_PATH_PREFIX}/pending${sessionQuery(sessionId)}`, "listing the door's pending Remote Control control requests"), "listing the door's pending Remote Control control requests"),
|
|
65559
|
+
sendPrompt: async (sessionId, text2) => await writeOf(`${CONTROL_PATH_PREFIX}/inject`, JSON.stringify({ session: sessionId, text: text2 }), (status, message) => `injecting into ${sessionId} failed (HTTP ${String(status)}): ${message}`),
|
|
65560
|
+
answerRequest: async (sessionId, requestId, decision) => await writeOf(
|
|
65561
|
+
`${CONTROL_PATH_PREFIX}/answer`,
|
|
65562
|
+
JSON.stringify({ session: sessionId, request: requestId, approve: decision.approve, ...decision.approve || decision.message === void 0 ? {} : { text: decision.message } }),
|
|
65563
|
+
(status, message) => `answering control request ${requestId} on ${sessionId} failed (HTTP ${String(status)}): ${message}`
|
|
65564
|
+
)
|
|
65565
|
+
};
|
|
65566
|
+
}
|
|
65567
|
+
|
|
65568
|
+
// src/frontdoor/server.ts
|
|
65189
65569
|
var HEALTH_TIMEOUT_MS = 2e3;
|
|
65190
65570
|
var HEALTH_START_BUDGET_MS = 5e3;
|
|
65191
65571
|
var HEALTH_RETRY_MS = 50;
|
|
65192
|
-
function createFrontDoorServer(pipeline, log, tls2) {
|
|
65193
|
-
const handler = (
|
|
65194
|
-
if (
|
|
65572
|
+
function createFrontDoorServer(pipeline, log, tls2, control) {
|
|
65573
|
+
const handler = (request7, response) => {
|
|
65574
|
+
if (request7.method === "GET" && request7.url === "/healthz") {
|
|
65195
65575
|
response.writeHead(HTTP_STATUS.ok, { "Content-Type": "text/plain" });
|
|
65196
65576
|
response.end("ok");
|
|
65197
65577
|
return;
|
|
65198
65578
|
}
|
|
65579
|
+
if (control !== void 0 && (request7.url ?? "/").startsWith(CONTROL_PATH_PREFIX)) {
|
|
65580
|
+
control(request7, response);
|
|
65581
|
+
return;
|
|
65582
|
+
}
|
|
65199
65583
|
const abort = new AbortController();
|
|
65200
65584
|
response.on("close", () => {
|
|
65201
65585
|
if (!response.writableFinished) {
|
|
@@ -65203,13 +65587,13 @@ function createFrontDoorServer(pipeline, log, tls2) {
|
|
|
65203
65587
|
}
|
|
65204
65588
|
});
|
|
65205
65589
|
const handle = async () => {
|
|
65206
|
-
await pipeline({ method:
|
|
65207
|
-
if (!
|
|
65208
|
-
|
|
65590
|
+
await pipeline({ method: request7.method ?? "GET", url: request7.url ?? "/", headers: aliasLegacyWireHeaders(request7.headers), body: request7, signal: abort.signal, response });
|
|
65591
|
+
if (!request7.readableEnded) {
|
|
65592
|
+
request7.resume();
|
|
65209
65593
|
}
|
|
65210
65594
|
};
|
|
65211
65595
|
handle().catch((error62) => {
|
|
65212
|
-
log(`request ${
|
|
65596
|
+
log(`request ${request7.method ?? "?"} ${request7.url ?? "?"} failed: ${error62 instanceof Error ? `${error62.name}: ${error62.message}` : String(error62)}`);
|
|
65213
65597
|
if (!response.headersSent) {
|
|
65214
65598
|
response.writeHead(HTTP_STATUS.internalServerError, { "Content-Type": "application/json" });
|
|
65215
65599
|
response.end(JSON.stringify({ type: "error", error: { type: "api_error", message: "internal error in the agent-shim front door" } }));
|
|
@@ -65234,11 +65618,11 @@ async function frontDoorHealthy(port, ca) {
|
|
|
65234
65618
|
resolve(response.statusCode === HTTP_STATUS.ok);
|
|
65235
65619
|
};
|
|
65236
65620
|
const options = { host: "127.0.0.1", port, path: "/healthz", agent: false, timeout: HEALTH_TIMEOUT_MS };
|
|
65237
|
-
const
|
|
65238
|
-
|
|
65239
|
-
|
|
65621
|
+
const request7 = ca === void 0 ? import_node_http.default.get(options, onResponse) : import_node_https.default.get({ ...options, ca: [ca] }, onResponse);
|
|
65622
|
+
request7.on("timeout", () => {
|
|
65623
|
+
request7.destroy();
|
|
65240
65624
|
});
|
|
65241
|
-
|
|
65625
|
+
request7.on("error", () => {
|
|
65242
65626
|
resolve(false);
|
|
65243
65627
|
});
|
|
65244
65628
|
});
|
|
@@ -65323,24 +65707,24 @@ function responseHeaders(headers) {
|
|
|
65323
65707
|
}
|
|
65324
65708
|
return result;
|
|
65325
65709
|
}
|
|
65326
|
-
async function applyHeadroomHop(
|
|
65710
|
+
async function applyHeadroomHop(request7, response, upstream, deps) {
|
|
65327
65711
|
const target = deps.headroomSocket();
|
|
65328
65712
|
if (target === void 0) {
|
|
65329
65713
|
await answerBadGateway(response, "agent-shim front door: the headroom daemon is restarting");
|
|
65330
65714
|
return;
|
|
65331
65715
|
}
|
|
65332
65716
|
if (target.refused !== void 0) {
|
|
65333
|
-
deps.log(`front door: refusing the headroom hop (${
|
|
65717
|
+
deps.log(`front door: refusing the headroom hop (${request7.method} ${new URL(request7.url, "http://127.0.0.1").pathname}): ${target.refused}`);
|
|
65334
65718
|
await answerBadGateway(response, `agent-shim front door: refusing to send this request to headroom: ${target.refused}`);
|
|
65335
65719
|
return;
|
|
65336
65720
|
}
|
|
65337
65721
|
const { socketPath } = target;
|
|
65338
|
-
let headers = forwardableHeaders(
|
|
65722
|
+
let headers = forwardableHeaders(request7.headers);
|
|
65339
65723
|
let hopId;
|
|
65340
65724
|
if (upstream !== void 0) {
|
|
65341
|
-
const provider = parseProviderPath(new URL(
|
|
65725
|
+
const provider = parseProviderPath(new URL(request7.url, "http://127.0.0.1").pathname)?.provider;
|
|
65342
65726
|
if (provider === void 0) {
|
|
65343
|
-
throw new Error(`headroom hop for ${
|
|
65727
|
+
throw new Error(`headroom hop for ${request7.url} names an upstream but no provider`);
|
|
65344
65728
|
}
|
|
65345
65729
|
const sequestered = deps.custody.sequester(headers, provider);
|
|
65346
65730
|
hopId = sequestered.hopId;
|
|
@@ -65348,12 +65732,12 @@ async function applyHeadroomHop(request6, response, upstream, deps) {
|
|
|
65348
65732
|
headers[HOP_ID_HEADER] = hopId;
|
|
65349
65733
|
headers[HEADROOM_BASE_URL_HEADER] = upstream;
|
|
65350
65734
|
}
|
|
65351
|
-
if (
|
|
65352
|
-
headers[PROJECT_ID_HEADER] =
|
|
65735
|
+
if (request7.session.projectId !== void 0) {
|
|
65736
|
+
headers[PROJECT_ID_HEADER] = request7.session.projectId;
|
|
65353
65737
|
}
|
|
65354
65738
|
headers[HOP_SECRET_HEADER] = deps.hopSecret;
|
|
65355
65739
|
try {
|
|
65356
|
-
await forwardThroughHeadroom(
|
|
65740
|
+
await forwardThroughHeadroom(request7, response, { socketPath, headers, log: deps.log });
|
|
65357
65741
|
} finally {
|
|
65358
65742
|
if (hopId !== void 0) {
|
|
65359
65743
|
deps.custody.release(hopId);
|
|
@@ -65366,7 +65750,7 @@ async function answerBadGateway(response, message) {
|
|
|
65366
65750
|
response.end();
|
|
65367
65751
|
}
|
|
65368
65752
|
var HOP_AGENT = new http3.Agent({ keepAlive: false });
|
|
65369
|
-
async function forwardThroughHeadroom(
|
|
65753
|
+
async function forwardThroughHeadroom(request7, response, target) {
|
|
65370
65754
|
const { socketPath, headers } = target;
|
|
65371
65755
|
await new Promise((resolve) => {
|
|
65372
65756
|
const onUpstreamResponse = (upstreamResponse) => {
|
|
@@ -65375,17 +65759,17 @@ async function forwardThroughHeadroom(request6, response, target) {
|
|
|
65375
65759
|
const stream = async () => {
|
|
65376
65760
|
try {
|
|
65377
65761
|
for await (const chunk of upstreamChunks(upstreamResponse)) {
|
|
65378
|
-
if (
|
|
65762
|
+
if (request7.signal.aborted) {
|
|
65379
65763
|
break;
|
|
65380
65764
|
}
|
|
65381
65765
|
await response.write(chunk);
|
|
65382
65766
|
}
|
|
65383
|
-
if (!
|
|
65767
|
+
if (!request7.signal.aborted) {
|
|
65384
65768
|
response.end();
|
|
65385
65769
|
}
|
|
65386
65770
|
} catch (error62) {
|
|
65387
|
-
if (!
|
|
65388
|
-
target.log(`front door: headroom hop to ${socketPath} ended mid-stream (${
|
|
65771
|
+
if (!request7.signal.aborted) {
|
|
65772
|
+
target.log(`front door: headroom hop to ${socketPath} ended mid-stream (${request7.method} ${new URL(request7.url, "http://127.0.0.1").pathname}): ${error62 instanceof Error ? error62.message : String(error62)}`);
|
|
65389
65773
|
}
|
|
65390
65774
|
response.destroy();
|
|
65391
65775
|
}
|
|
@@ -65393,11 +65777,11 @@ async function forwardThroughHeadroom(request6, response, target) {
|
|
|
65393
65777
|
};
|
|
65394
65778
|
void stream();
|
|
65395
65779
|
};
|
|
65396
|
-
const hop = http3.request({ socketPath, method:
|
|
65780
|
+
const hop = http3.request({ socketPath, method: request7.method, path: request7.url, headers, agent: HOP_AGENT }, onUpstreamResponse);
|
|
65397
65781
|
hop.on("error", (error62) => {
|
|
65398
65782
|
const phase = response.headersSent ? "mid-stream" : "before the response started";
|
|
65399
65783
|
const code = "code" in error62 && typeof error62.code === "string" ? ` ${error62.code}` : "";
|
|
65400
|
-
target.log(`front door: headroom hop to ${socketPath} failed (${
|
|
65784
|
+
target.log(`front door: headroom hop to ${socketPath} failed (${request7.method} ${new URL(request7.url, "http://127.0.0.1").pathname}, ${phase}): ${error62.message}${code}`);
|
|
65401
65785
|
if (!response.headersSent) {
|
|
65402
65786
|
response.start(HTTP_BAD_GATEWAY2, { "Content-Type": "application/json" });
|
|
65403
65787
|
void response.write(JSON.stringify({ type: "error", error: { type: "api_error", message: `agent-shim front door: the headroom daemon is unreachable (${error62.message})` } })).then(() => {
|
|
@@ -65408,11 +65792,11 @@ async function forwardThroughHeadroom(request6, response, target) {
|
|
|
65408
65792
|
}
|
|
65409
65793
|
resolve(void 0);
|
|
65410
65794
|
});
|
|
65411
|
-
|
|
65795
|
+
request7.signal.addEventListener("abort", () => {
|
|
65412
65796
|
hop.destroy();
|
|
65413
65797
|
});
|
|
65414
|
-
|
|
65415
|
-
|
|
65798
|
+
request7.body.pipe(hop);
|
|
65799
|
+
request7.body.on("error", () => {
|
|
65416
65800
|
hop.destroy();
|
|
65417
65801
|
});
|
|
65418
65802
|
});
|
|
@@ -65446,7 +65830,7 @@ function describeThrown(error62) {
|
|
|
65446
65830
|
return error62 instanceof Error ? error62.message : String(error62);
|
|
65447
65831
|
}
|
|
65448
65832
|
function createRoutedResponse(response, context) {
|
|
65449
|
-
const { deps, session, route, request:
|
|
65833
|
+
const { deps, session, route, request: request7 } = context;
|
|
65450
65834
|
let headersSent = false;
|
|
65451
65835
|
let bodyObservers = [];
|
|
65452
65836
|
let finished = false;
|
|
@@ -65492,7 +65876,7 @@ function createRoutedResponse(response, context) {
|
|
|
65492
65876
|
start: (status, headers) => {
|
|
65493
65877
|
for (const observe of deps.responseObservers) {
|
|
65494
65878
|
try {
|
|
65495
|
-
const body = observe({ session, route, method:
|
|
65879
|
+
const body = observe({ session, route, method: request7.method, path: request7.path, receivedAt: request7.receivedAt, status, headers });
|
|
65496
65880
|
if (body !== void 0) {
|
|
65497
65881
|
bodyObservers.push(body);
|
|
65498
65882
|
}
|
|
@@ -65532,34 +65916,34 @@ function createRoutedResponse(response, context) {
|
|
|
65532
65916
|
}
|
|
65533
65917
|
};
|
|
65534
65918
|
}
|
|
65535
|
-
async function serveRouted(
|
|
65536
|
-
const observed = { method:
|
|
65537
|
-
const identified = identifyRequest(
|
|
65538
|
-
const admission = deps.admit({ url:
|
|
65919
|
+
async function serveRouted(request7, deps) {
|
|
65920
|
+
const observed = { method: request7.method, path: pathOf(request7.url), receivedAt: deps.now() };
|
|
65921
|
+
const identified = identifyRequest(request7.headers);
|
|
65922
|
+
const admission = deps.admit({ url: request7.url, headers: request7.headers, forwardable: identified.forwardableHeaders });
|
|
65539
65923
|
if (!admission.ok) {
|
|
65540
|
-
const response2 = createRoutedResponse(
|
|
65924
|
+
const response2 = createRoutedResponse(request7.response, { deps, session: identified.session, route: "(unauthorized)", request: observed });
|
|
65541
65925
|
response2.start(HTTP_STATUS.unauthorized, { "Content-Type": "application/json" });
|
|
65542
65926
|
await response2.write(errorBody(HTTP_STATUS.unauthorized, admission.message));
|
|
65543
65927
|
response2.end();
|
|
65544
65928
|
return;
|
|
65545
65929
|
}
|
|
65546
65930
|
const routed = {
|
|
65547
|
-
method:
|
|
65548
|
-
url:
|
|
65931
|
+
method: request7.method,
|
|
65932
|
+
url: request7.url,
|
|
65549
65933
|
headers: admission.headers,
|
|
65550
|
-
body:
|
|
65551
|
-
signal:
|
|
65934
|
+
body: request7.body,
|
|
65935
|
+
signal: request7.signal,
|
|
65552
65936
|
session: identified.session
|
|
65553
65937
|
};
|
|
65554
65938
|
const resolution = await deps.resolveRoute(routed);
|
|
65555
65939
|
if (!resolution.ok) {
|
|
65556
|
-
const response2 = createRoutedResponse(
|
|
65940
|
+
const response2 = createRoutedResponse(request7.response, { deps, session: identified.session, route: "(unrouted)", request: observed });
|
|
65557
65941
|
response2.start(resolution.status, { "Content-Type": "application/json" });
|
|
65558
65942
|
await response2.write(errorBody(resolution.status, resolution.message));
|
|
65559
65943
|
response2.end();
|
|
65560
65944
|
return;
|
|
65561
65945
|
}
|
|
65562
|
-
const response = createRoutedResponse(
|
|
65946
|
+
const response = createRoutedResponse(request7.response, { deps, session: identified.session, route: resolution.route.name, request: observed });
|
|
65563
65947
|
try {
|
|
65564
65948
|
if (identified.session.headroom && resolution.route.headroomEligible && deps.headroom !== void 0) {
|
|
65565
65949
|
await applyHeadroomHop(routed, response, resolution.route.headroomUpstream, deps.headroom);
|
|
@@ -65567,7 +65951,7 @@ async function serveRouted(request6, deps) {
|
|
|
65567
65951
|
await resolution.route.serve(routed, response);
|
|
65568
65952
|
}
|
|
65569
65953
|
} catch (error62) {
|
|
65570
|
-
if (
|
|
65954
|
+
if (request7.signal.aborted) {
|
|
65571
65955
|
return;
|
|
65572
65956
|
}
|
|
65573
65957
|
deps.log(`front door: route ${resolution.route.name} failed: ${error62 instanceof Error ? `${error62.name}: ${error62.message}` : String(error62)}`);
|
|
@@ -65676,8 +66060,8 @@ var REQUESTABLE_EFFORTS = ["low", "medium", "high"];
|
|
|
65676
66060
|
function isRequestableEffort(value) {
|
|
65677
66061
|
return REQUESTABLE_EFFORTS.includes(value);
|
|
65678
66062
|
}
|
|
65679
|
-
function mapEffort(
|
|
65680
|
-
const requested =
|
|
66063
|
+
function mapEffort(request7, config2) {
|
|
66064
|
+
const requested = request7.output_config?.effort;
|
|
65681
66065
|
return requested !== void 0 && isRequestableEffort(requested) ? requested : config2.effort;
|
|
65682
66066
|
}
|
|
65683
66067
|
var BILLING_HEADER_LINE = /^x-anthropic-billing-header:[^\n]*\n/;
|
|
@@ -65803,7 +66187,7 @@ function translateRequest(body, config2) {
|
|
|
65803
66187
|
const tools = mapTools(body.tools, names);
|
|
65804
66188
|
const toolChoice = mapToolChoice(body.tool_choice, names);
|
|
65805
66189
|
const userId = body.metadata?.user_id;
|
|
65806
|
-
const
|
|
66190
|
+
const request7 = {
|
|
65807
66191
|
model: mapModel(body.model ?? "", config2),
|
|
65808
66192
|
instructions: systemToInstructions(body.system),
|
|
65809
66193
|
input: messagesToInput(body.messages, names),
|
|
@@ -65815,7 +66199,7 @@ function translateRequest(body, config2) {
|
|
|
65815
66199
|
...tools === void 0 ? {} : { tools },
|
|
65816
66200
|
...toolChoice === void 0 ? {} : { tool_choice: toolChoice }
|
|
65817
66201
|
};
|
|
65818
|
-
return { request:
|
|
66202
|
+
return { request: request7, toolNames: names };
|
|
65819
66203
|
}
|
|
65820
66204
|
|
|
65821
66205
|
// src/codex/events.ts
|
|
@@ -66190,7 +66574,7 @@ function describeError(error62) {
|
|
|
66190
66574
|
return error62 instanceof Error ? `${error62.name}: ${error62.message}` : String(error62);
|
|
66191
66575
|
}
|
|
66192
66576
|
function createCodexRoute(ports) {
|
|
66193
|
-
const handleMessages = async (
|
|
66577
|
+
const handleMessages = async (request7, config2, raw) => {
|
|
66194
66578
|
const parsed = MessagesRequestSchema.safeParse(raw);
|
|
66195
66579
|
if (!parsed.success) {
|
|
66196
66580
|
return errorResponse(HTTP_STATUS.badRequest, `not an Anthropic Messages request: ${parsed.error.issues.map((issue2) => `${issue2.path.join(".")}: ${issue2.message}`).join("; ")}`);
|
|
@@ -66202,9 +66586,9 @@ function createCodexRoute(ports) {
|
|
|
66202
66586
|
const elapsed = () => `${String(ports.now() - started)}ms`;
|
|
66203
66587
|
let upstream;
|
|
66204
66588
|
try {
|
|
66205
|
-
upstream = await callCodex(ports.upstream, upstreamRequest, sessionIdFor(body.metadata?.user_id, ports.upstream.randomId),
|
|
66589
|
+
upstream = await callCodex(ports.upstream, upstreamRequest, sessionIdFor(body.metadata?.user_id, ports.upstream.randomId), request7.signal);
|
|
66206
66590
|
} catch (error62) {
|
|
66207
|
-
if (
|
|
66591
|
+
if (request7.signal.aborted) {
|
|
66208
66592
|
return errorResponse(HTTP_STATUS.clientClosedRequest, "client disconnected");
|
|
66209
66593
|
}
|
|
66210
66594
|
ports.log(`${upstreamRequest.model} upstream fetch failed after ${elapsed()}: ${describeError(error62)}`);
|
|
@@ -66264,7 +66648,7 @@ function createCodexRoute(ports) {
|
|
|
66264
66648
|
ports.log(`${upstreamRequest.model} stream ended without completing after ${elapsed()}`);
|
|
66265
66649
|
yield errorFrame(HTTP_STATUS.badGateway, "codex backend stream ended without completing");
|
|
66266
66650
|
} catch (error62) {
|
|
66267
|
-
if (
|
|
66651
|
+
if (request7.signal.aborted) {
|
|
66268
66652
|
return;
|
|
66269
66653
|
}
|
|
66270
66654
|
ports.log(`${upstreamRequest.model} stream relay failed: ${describeError(error62)}`);
|
|
@@ -66290,7 +66674,7 @@ function createCodexRoute(ports) {
|
|
|
66290
66674
|
}
|
|
66291
66675
|
}
|
|
66292
66676
|
} catch (error62) {
|
|
66293
|
-
if (
|
|
66677
|
+
if (request7.signal.aborted) {
|
|
66294
66678
|
return errorResponse(HTTP_STATUS.clientClosedRequest, "client disconnected");
|
|
66295
66679
|
}
|
|
66296
66680
|
ports.log(`${upstreamRequest.model} stream relay failed: ${describeError(error62)}`);
|
|
@@ -66307,26 +66691,26 @@ function createCodexRoute(ports) {
|
|
|
66307
66691
|
const text2 = JSON.stringify({ system: parsed.data.system, messages: parsed.data.messages, tools: parsed.data.tools });
|
|
66308
66692
|
return { status: HTTP_STATUS.ok, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ input_tokens: Math.ceil(text2.length / CHARS_PER_TOKEN) }) };
|
|
66309
66693
|
};
|
|
66310
|
-
return async (
|
|
66311
|
-
if (
|
|
66694
|
+
return async (request7) => {
|
|
66695
|
+
if (request7.method === "GET" && request7.path === "/healthz") {
|
|
66312
66696
|
return { status: HTTP_STATUS.ok, headers: { "Content-Type": "text/plain" }, body: "ok" };
|
|
66313
66697
|
}
|
|
66314
|
-
if (
|
|
66315
|
-
return errorResponse(HTTP_STATUS.methodNotAllowed, `unsupported ${
|
|
66698
|
+
if (request7.method !== "POST") {
|
|
66699
|
+
return errorResponse(HTTP_STATUS.methodNotAllowed, `unsupported ${request7.method} ${request7.path}`);
|
|
66316
66700
|
}
|
|
66317
|
-
const scoped = parseProviderPath(
|
|
66701
|
+
const scoped = parseProviderPath(request7.path);
|
|
66318
66702
|
if (scoped === void 0 || scoped.rest !== "/v1/messages" && scoped.rest !== "/v1/messages/count_tokens") {
|
|
66319
|
-
return errorResponse(HTTP_STATUS.notFound, `no such endpoint: ${
|
|
66703
|
+
return errorResponse(HTTP_STATUS.notFound, `no such endpoint: ${request7.path}`);
|
|
66320
66704
|
}
|
|
66321
66705
|
const provider = ports.loadProvider(scoped.provider);
|
|
66322
66706
|
if (!provider.ok) {
|
|
66323
66707
|
return errorResponse(provider.status, provider.message);
|
|
66324
66708
|
}
|
|
66325
|
-
const json2 = parseJson3(
|
|
66709
|
+
const json2 = parseJson3(request7.body);
|
|
66326
66710
|
if (!json2.ok) {
|
|
66327
66711
|
return errorResponse(HTTP_STATUS.badRequest, json2.message);
|
|
66328
66712
|
}
|
|
66329
|
-
return scoped.rest === "/v1/messages" ? await handleMessages(
|
|
66713
|
+
return scoped.rest === "/v1/messages" ? await handleMessages(request7, provider.config, json2.value) : handleCountTokens(json2.value);
|
|
66330
66714
|
};
|
|
66331
66715
|
}
|
|
66332
66716
|
|
|
@@ -66338,10 +66722,10 @@ var BodyTooLargeError = class extends Error {
|
|
|
66338
66722
|
this.name = "BodyTooLargeError";
|
|
66339
66723
|
}
|
|
66340
66724
|
};
|
|
66341
|
-
async function
|
|
66725
|
+
async function readBody2(request7) {
|
|
66342
66726
|
const chunks = [];
|
|
66343
66727
|
let size = 0;
|
|
66344
|
-
for await (const chunk of
|
|
66728
|
+
for await (const chunk of request7.body) {
|
|
66345
66729
|
if (!Buffer.isBuffer(chunk)) {
|
|
66346
66730
|
throw new TypeError("request body chunk was not a Buffer");
|
|
66347
66731
|
}
|
|
@@ -66374,10 +66758,10 @@ function createCodexRouteMount(ports, upstreamBase, provider) {
|
|
|
66374
66758
|
name: `codex:${provider}`,
|
|
66375
66759
|
headroomEligible: true,
|
|
66376
66760
|
headroomUpstream: upstreamBase,
|
|
66377
|
-
serve: async (
|
|
66761
|
+
serve: async (request7, response) => {
|
|
66378
66762
|
let body;
|
|
66379
66763
|
try {
|
|
66380
|
-
body = await
|
|
66764
|
+
body = await readBody2(request7);
|
|
66381
66765
|
} catch (error62) {
|
|
66382
66766
|
const tooLarge = error62 instanceof BodyTooLargeError;
|
|
66383
66767
|
response.start(tooLarge ? HTTP_STATUS.payloadTooLarge : HTTP_STATUS.badRequest, { "Content-Type": "application/json" });
|
|
@@ -66385,23 +66769,23 @@ function createCodexRouteMount(ports, upstreamBase, provider) {
|
|
|
66385
66769
|
JSON.stringify({ type: "error", error: { type: "invalid_request_error", message: error62 instanceof Error ? error62.message : String(error62) } })
|
|
66386
66770
|
);
|
|
66387
66771
|
response.end();
|
|
66388
|
-
|
|
66772
|
+
request7.body.resume();
|
|
66389
66773
|
return;
|
|
66390
66774
|
}
|
|
66391
|
-
const path41 = new URL(
|
|
66392
|
-
const translated = { method:
|
|
66775
|
+
const path41 = new URL(request7.url, "http://127.0.0.1").pathname;
|
|
66776
|
+
const translated = { method: request7.method, path: path41, body, signal: request7.signal };
|
|
66393
66777
|
const routed = await route(translated);
|
|
66394
|
-
if (
|
|
66778
|
+
if (request7.signal.aborted) {
|
|
66395
66779
|
return;
|
|
66396
66780
|
}
|
|
66397
|
-
await writeRouteResponse(routed, response,
|
|
66781
|
+
await writeRouteResponse(routed, response, request7.signal);
|
|
66398
66782
|
}
|
|
66399
66783
|
};
|
|
66400
66784
|
}
|
|
66401
66785
|
|
|
66402
66786
|
// src/frontdoor/passthrough.ts
|
|
66403
66787
|
var http4 = __toESM(require("node:http"), 1);
|
|
66404
|
-
var
|
|
66788
|
+
var https4 = __toESM(require("node:https"), 1);
|
|
66405
66789
|
function responseHeaders2(headers) {
|
|
66406
66790
|
const result = {};
|
|
66407
66791
|
for (const [name, value] of Object.entries(forwardableHeaders(headers))) {
|
|
@@ -66421,16 +66805,16 @@ function createPassthroughRoute(name, target) {
|
|
|
66421
66805
|
name,
|
|
66422
66806
|
headroomEligible: true,
|
|
66423
66807
|
headroomUpstream: target.headroomUpstream,
|
|
66424
|
-
serve: async (
|
|
66425
|
-
const incoming = new URL(
|
|
66808
|
+
serve: async (request7, response) => {
|
|
66809
|
+
const incoming = new URL(request7.url, "http://127.0.0.1");
|
|
66426
66810
|
const path41 = target.stripPrefix !== void 0 && incoming.pathname.startsWith(target.stripPrefix) ? incoming.pathname.slice(target.stripPrefix.length) : incoming.pathname;
|
|
66427
|
-
const headers = forwardableHeaders(
|
|
66811
|
+
const headers = forwardableHeaders(request7.headers);
|
|
66428
66812
|
delete headers.host;
|
|
66429
66813
|
await new Promise((resolve) => {
|
|
66430
66814
|
const options = {
|
|
66431
66815
|
host: base.hostname,
|
|
66432
66816
|
port: base.port === "" ? void 0 : Number(base.port),
|
|
66433
|
-
method:
|
|
66817
|
+
method: request7.method,
|
|
66434
66818
|
path: `${basePath}${path41}${incoming.search}`,
|
|
66435
66819
|
headers,
|
|
66436
66820
|
agent
|
|
@@ -66441,7 +66825,7 @@ function createPassthroughRoute(name, target) {
|
|
|
66441
66825
|
const stream = async () => {
|
|
66442
66826
|
try {
|
|
66443
66827
|
for await (const chunk of upstreamChunks(upstreamResponse)) {
|
|
66444
|
-
if (
|
|
66828
|
+
if (request7.signal.aborted) {
|
|
66445
66829
|
return;
|
|
66446
66830
|
}
|
|
66447
66831
|
await response.write(chunk);
|
|
@@ -66454,7 +66838,7 @@ function createPassthroughRoute(name, target) {
|
|
|
66454
66838
|
};
|
|
66455
66839
|
void stream();
|
|
66456
66840
|
};
|
|
66457
|
-
const forward = tls2 ?
|
|
66841
|
+
const forward = tls2 ? https4.request(options, onUpstreamResponse) : http4.request(options, onUpstreamResponse);
|
|
66458
66842
|
forward.on("error", (error62) => {
|
|
66459
66843
|
if (!response.headersSent) {
|
|
66460
66844
|
response.start(HTTP_STATUS.badGateway, { "Content-Type": "application/json" });
|
|
@@ -66466,11 +66850,11 @@ function createPassthroughRoute(name, target) {
|
|
|
66466
66850
|
}
|
|
66467
66851
|
resolve(void 0);
|
|
66468
66852
|
});
|
|
66469
|
-
|
|
66853
|
+
request7.signal.addEventListener("abort", () => {
|
|
66470
66854
|
forward.destroy();
|
|
66471
66855
|
});
|
|
66472
|
-
|
|
66473
|
-
|
|
66856
|
+
request7.body.pipe(forward);
|
|
66857
|
+
request7.body.on("error", () => {
|
|
66474
66858
|
forward.destroy();
|
|
66475
66859
|
});
|
|
66476
66860
|
});
|
|
@@ -66492,8 +66876,8 @@ function createProviderRouteResolver(deps) {
|
|
|
66492
66876
|
passthroughByTarget.set(key, route);
|
|
66493
66877
|
return route;
|
|
66494
66878
|
};
|
|
66495
|
-
const resolve = (
|
|
66496
|
-
const path41 = new URL(
|
|
66879
|
+
const resolve = (request7) => {
|
|
66880
|
+
const path41 = new URL(request7.url, "http://127.0.0.1").pathname;
|
|
66497
66881
|
const scoped = parseProviderPath(path41);
|
|
66498
66882
|
if (scoped === void 0) {
|
|
66499
66883
|
return path41.startsWith("/v1/") ? { ok: true, route: oauthRoute } : { ok: false, status: HTTP_STATUS.notFound, message: `no such endpoint: ${path41}` };
|
|
@@ -66532,7 +66916,452 @@ function createProviderRouteResolver(deps) {
|
|
|
66532
66916
|
})
|
|
66533
66917
|
};
|
|
66534
66918
|
};
|
|
66535
|
-
return async (
|
|
66919
|
+
return async (request7) => await Promise.resolve(resolve(request7));
|
|
66920
|
+
}
|
|
66921
|
+
|
|
66922
|
+
// src/frontdoor/rcSessions.ts
|
|
66923
|
+
var RC_SESSIONS_PATH_PREFIX = "/v1/code/sessions";
|
|
66924
|
+
var RC_SESSION_ID_PREFIX = "cse_";
|
|
66925
|
+
var RC_IDLE_EXPIRY_MS = 45e3;
|
|
66926
|
+
var RC_CREATE_RESPONSE_CAP_BYTES = 8192;
|
|
66927
|
+
var CONFLICT_REASON_HEADER = "x-ccr-conflict-reason";
|
|
66928
|
+
var RC_PENDING_DEADLINE_MS = 14e3;
|
|
66929
|
+
var RC_REQUEST_PARSE_CAP_BYTES = 262144;
|
|
66930
|
+
var RC_PENDING_SUMMARY_EXCERPT_CHARS = 300;
|
|
66931
|
+
var SUCCESS_STATUS_MAX_EXCLUSIVE = 300;
|
|
66932
|
+
function isSuccessful(status) {
|
|
66933
|
+
return status >= HTTP_STATUS.ok && status < SUCCESS_STATUS_MAX_EXCLUSIVE;
|
|
66934
|
+
}
|
|
66935
|
+
function singleHeader(headers, name) {
|
|
66936
|
+
const value = headers[name];
|
|
66937
|
+
return typeof value === "string" ? value : void 0;
|
|
66938
|
+
}
|
|
66939
|
+
function sessionCreateId(body) {
|
|
66940
|
+
let parsed;
|
|
66941
|
+
try {
|
|
66942
|
+
parsed = JSON.parse(body);
|
|
66943
|
+
} catch {
|
|
66944
|
+
return void 0;
|
|
66945
|
+
}
|
|
66946
|
+
if (typeof parsed !== "object" || parsed === null || !("session" in parsed)) {
|
|
66947
|
+
return void 0;
|
|
66948
|
+
}
|
|
66949
|
+
const session = parsed.session;
|
|
66950
|
+
if (typeof session !== "object" || session === null || !("id" in session)) {
|
|
66951
|
+
return void 0;
|
|
66952
|
+
}
|
|
66953
|
+
const id = session.id;
|
|
66954
|
+
return typeof id === "string" && id.startsWith(RC_SESSION_ID_PREFIX) ? id : void 0;
|
|
66955
|
+
}
|
|
66956
|
+
function isRecord3(value) {
|
|
66957
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
66958
|
+
}
|
|
66959
|
+
function parseJsonObject(body) {
|
|
66960
|
+
let parsed;
|
|
66961
|
+
try {
|
|
66962
|
+
parsed = JSON.parse(body);
|
|
66963
|
+
} catch {
|
|
66964
|
+
return void 0;
|
|
66965
|
+
}
|
|
66966
|
+
return isRecord3(parsed) ? parsed : void 0;
|
|
66967
|
+
}
|
|
66968
|
+
function nonEmptyString(record2, field) {
|
|
66969
|
+
const value = record2 === void 0 ? void 0 : record2[field];
|
|
66970
|
+
return typeof value === "string" && value !== "" ? value : void 0;
|
|
66971
|
+
}
|
|
66972
|
+
function finiteNumber(record2, field) {
|
|
66973
|
+
const value = record2 === void 0 ? void 0 : record2[field];
|
|
66974
|
+
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
66975
|
+
}
|
|
66976
|
+
function excerpt(text2) {
|
|
66977
|
+
return text2.length <= RC_PENDING_SUMMARY_EXCERPT_CHARS ? text2 : `${text2.slice(0, RC_PENDING_SUMMARY_EXCERPT_CHARS)}...`;
|
|
66978
|
+
}
|
|
66979
|
+
function payloadEventsOf(body) {
|
|
66980
|
+
const parsed = parseJsonObject(body);
|
|
66981
|
+
const events = parsed === void 0 ? void 0 : parsed.events;
|
|
66982
|
+
if (!Array.isArray(events)) {
|
|
66983
|
+
return [];
|
|
66984
|
+
}
|
|
66985
|
+
const payloads = [];
|
|
66986
|
+
for (const event of events) {
|
|
66987
|
+
if (!isRecord3(event)) {
|
|
66988
|
+
continue;
|
|
66989
|
+
}
|
|
66990
|
+
const payload = event.payload;
|
|
66991
|
+
if (!isRecord3(payload)) {
|
|
66992
|
+
continue;
|
|
66993
|
+
}
|
|
66994
|
+
payloads.push(payload);
|
|
66995
|
+
}
|
|
66996
|
+
return payloads;
|
|
66997
|
+
}
|
|
66998
|
+
function pendingOfControlRequestPayload(payload) {
|
|
66999
|
+
if (payload.type !== "control_request") {
|
|
67000
|
+
return void 0;
|
|
67001
|
+
}
|
|
67002
|
+
const requestId = nonEmptyString(payload, "request_id") ?? nonEmptyString(payload, "uuid");
|
|
67003
|
+
if (requestId === void 0) {
|
|
67004
|
+
return void 0;
|
|
67005
|
+
}
|
|
67006
|
+
const request7 = isRecord3(payload.request) ? payload.request : void 0;
|
|
67007
|
+
const subtype = nonEmptyString(request7, "subtype");
|
|
67008
|
+
const type = subtype ?? "control_request";
|
|
67009
|
+
let summary = "";
|
|
67010
|
+
if (subtype === "can_use_tool") {
|
|
67011
|
+
const toolName = nonEmptyString(request7, "tool_name") ?? "unknown tool";
|
|
67012
|
+
const input2 = request7 === void 0 ? void 0 : request7.input;
|
|
67013
|
+
summary = input2 === void 0 ? toolName : `${toolName} ${excerpt(JSON.stringify(input2))}`;
|
|
67014
|
+
} else if (request7 !== void 0) {
|
|
67015
|
+
summary = excerpt(JSON.stringify(request7));
|
|
67016
|
+
}
|
|
67017
|
+
return { requestId, type, summary };
|
|
67018
|
+
}
|
|
67019
|
+
function answeredRequestIdsOfControlResponsePayload(payload) {
|
|
67020
|
+
if (payload.type !== "control_response") {
|
|
67021
|
+
return [];
|
|
67022
|
+
}
|
|
67023
|
+
const response = isRecord3(payload.response) ? payload.response : void 0;
|
|
67024
|
+
const id = nonEmptyString(response, "request_id") ?? nonEmptyString(payload, "request_id") ?? nonEmptyString(payload, "uuid");
|
|
67025
|
+
return id === void 0 ? [] : [id];
|
|
67026
|
+
}
|
|
67027
|
+
function parseRcRequestBody(kind, body) {
|
|
67028
|
+
if (kind === "heartbeat") {
|
|
67029
|
+
return { controlRequests: [], answeredRequestIds: [], idleSeconds: finiteNumber(parseJsonObject(body), "idle_seconds"), workerStatus: void 0 };
|
|
67030
|
+
}
|
|
67031
|
+
if (kind === "worker-registration") {
|
|
67032
|
+
return { controlRequests: [], answeredRequestIds: [], idleSeconds: void 0, workerStatus: nonEmptyString(parseJsonObject(body), "status") };
|
|
67033
|
+
}
|
|
67034
|
+
const controlRequests = [];
|
|
67035
|
+
const answeredRequestIds = [];
|
|
67036
|
+
for (const payload of payloadEventsOf(body)) {
|
|
67037
|
+
const pending = pendingOfControlRequestPayload(payload);
|
|
67038
|
+
if (pending !== void 0) {
|
|
67039
|
+
controlRequests.push({ requestId: pending.requestId, type: pending.type, summary: pending.summary });
|
|
67040
|
+
continue;
|
|
67041
|
+
}
|
|
67042
|
+
answeredRequestIds.push(...answeredRequestIdsOfControlResponsePayload(payload));
|
|
67043
|
+
}
|
|
67044
|
+
return { controlRequests, answeredRequestIds, idleSeconds: void 0, workerStatus: void 0 };
|
|
67045
|
+
}
|
|
67046
|
+
function createRcSessionTracker(deps) {
|
|
67047
|
+
const entries = /* @__PURE__ */ new Map();
|
|
67048
|
+
const expire = (id) => {
|
|
67049
|
+
entries.delete(id);
|
|
67050
|
+
};
|
|
67051
|
+
const expirePendings = (entry, now) => {
|
|
67052
|
+
for (const [requestId, pending] of entry.pending) {
|
|
67053
|
+
if (now - pending.observedAt >= RC_PENDING_DEADLINE_MS) {
|
|
67054
|
+
entry.pending.delete(requestId);
|
|
67055
|
+
}
|
|
67056
|
+
}
|
|
67057
|
+
};
|
|
67058
|
+
const sweep = () => {
|
|
67059
|
+
for (const [id, entry] of entries) {
|
|
67060
|
+
if (deps.now() - entry.lastSeenAt >= deps.idleMs) {
|
|
67061
|
+
expire(id);
|
|
67062
|
+
continue;
|
|
67063
|
+
}
|
|
67064
|
+
expirePendings(entry, deps.now());
|
|
67065
|
+
}
|
|
67066
|
+
};
|
|
67067
|
+
const timer = setInterval(sweep, deps.idleMs);
|
|
67068
|
+
timer.unref();
|
|
67069
|
+
const birth = (id, facts) => {
|
|
67070
|
+
const record2 = { id, createdAt: deps.now(), lastSeenAt: deps.now(), ...facts, pending: /* @__PURE__ */ new Map(), workerState: void 0, workerIdleSeconds: void 0 };
|
|
67071
|
+
entries.set(id, record2);
|
|
67072
|
+
return record2;
|
|
67073
|
+
};
|
|
67074
|
+
const observeExchange = (request7) => {
|
|
67075
|
+
const method = (request7.method ?? "").toUpperCase();
|
|
67076
|
+
const path41 = new URL(request7.url ?? "/", "http://127.0.0.1").pathname;
|
|
67077
|
+
if (!path41.startsWith(RC_SESSIONS_PATH_PREFIX)) {
|
|
67078
|
+
return void 0;
|
|
67079
|
+
}
|
|
67080
|
+
const tail = path41.slice(RC_SESSIONS_PATH_PREFIX.length);
|
|
67081
|
+
const facts = {
|
|
67082
|
+
authorization: singleHeader(request7.headers, "authorization"),
|
|
67083
|
+
anthropicVersion: singleHeader(request7.headers, "anthropic-version"),
|
|
67084
|
+
anthropicClientPlatform: singleHeader(request7.headers, "anthropic-client-platform")
|
|
67085
|
+
};
|
|
67086
|
+
if (tail === "") {
|
|
67087
|
+
if (method !== "POST") {
|
|
67088
|
+
return void 0;
|
|
67089
|
+
}
|
|
67090
|
+
let accepted2 = false;
|
|
67091
|
+
let buffered2 = 0;
|
|
67092
|
+
let body = "";
|
|
67093
|
+
return {
|
|
67094
|
+
onResponse: (status) => {
|
|
67095
|
+
accepted2 = isSuccessful(status);
|
|
67096
|
+
},
|
|
67097
|
+
onBodyChunk: (chunk) => {
|
|
67098
|
+
if (!accepted2 || buffered2 >= RC_CREATE_RESPONSE_CAP_BYTES) {
|
|
67099
|
+
return;
|
|
67100
|
+
}
|
|
67101
|
+
const text2 = Buffer.from(chunk).toString("utf8");
|
|
67102
|
+
body = body + text2.slice(0, RC_CREATE_RESPONSE_CAP_BYTES - buffered2);
|
|
67103
|
+
buffered2 = body.length;
|
|
67104
|
+
},
|
|
67105
|
+
onEnd: () => {
|
|
67106
|
+
if (!accepted2) {
|
|
67107
|
+
return;
|
|
67108
|
+
}
|
|
67109
|
+
const id2 = sessionCreateId(body);
|
|
67110
|
+
if (id2 === void 0) {
|
|
67111
|
+
return;
|
|
67112
|
+
}
|
|
67113
|
+
birth(id2, facts);
|
|
67114
|
+
}
|
|
67115
|
+
};
|
|
67116
|
+
}
|
|
67117
|
+
const rest = tail.slice(1);
|
|
67118
|
+
const [id] = rest.split("/");
|
|
67119
|
+
if (id?.startsWith(RC_SESSION_ID_PREFIX) !== true) {
|
|
67120
|
+
return void 0;
|
|
67121
|
+
}
|
|
67122
|
+
const entry = entries.get(id) ?? birth(id, facts);
|
|
67123
|
+
entry.lastSeenAt = deps.now();
|
|
67124
|
+
entry.authorization = facts.authorization ?? entry.authorization;
|
|
67125
|
+
entry.anthropicVersion = facts.anthropicVersion ?? entry.anthropicVersion;
|
|
67126
|
+
entry.anthropicClientPlatform = facts.anthropicClientPlatform ?? entry.anthropicClientPlatform;
|
|
67127
|
+
const bodyKind = method === "POST" && rest === `${id}/worker/events` ? "worker-events" : method === "POST" && rest === `${id}/events` ? "client-events" : method === "POST" && rest === `${id}/worker/heartbeat` ? "heartbeat" : method === "PUT" && rest === `${id}/worker` ? "worker-registration" : void 0;
|
|
67128
|
+
let chunks = [];
|
|
67129
|
+
let buffered = 0;
|
|
67130
|
+
let oversized = false;
|
|
67131
|
+
let requestEnded = false;
|
|
67132
|
+
let accepted;
|
|
67133
|
+
let filed = false;
|
|
67134
|
+
const file2 = () => {
|
|
67135
|
+
if (filed || accepted !== true || !requestEnded || bodyKind === void 0) {
|
|
67136
|
+
return;
|
|
67137
|
+
}
|
|
67138
|
+
filed = true;
|
|
67139
|
+
const factsOfBody = oversized ? void 0 : parseRcRequestBody(bodyKind, Buffer.concat(chunks).toString("utf8"));
|
|
67140
|
+
chunks = [];
|
|
67141
|
+
const entryNow = entries.get(id);
|
|
67142
|
+
if (entryNow === void 0 || factsOfBody === void 0) {
|
|
67143
|
+
return;
|
|
67144
|
+
}
|
|
67145
|
+
const now = deps.now();
|
|
67146
|
+
for (const controlRequest of factsOfBody.controlRequests) {
|
|
67147
|
+
entryNow.pending.set(controlRequest.requestId, { sessionId: id, ...controlRequest, observedAt: now });
|
|
67148
|
+
}
|
|
67149
|
+
for (const requestId of factsOfBody.answeredRequestIds) {
|
|
67150
|
+
entryNow.pending.delete(requestId);
|
|
67151
|
+
}
|
|
67152
|
+
if (factsOfBody.idleSeconds !== void 0) {
|
|
67153
|
+
entryNow.workerIdleSeconds = { value: factsOfBody.idleSeconds, observedAt: now };
|
|
67154
|
+
}
|
|
67155
|
+
if (factsOfBody.workerStatus !== void 0) {
|
|
67156
|
+
entryNow.workerState = { value: factsOfBody.workerStatus, observedAt: now };
|
|
67157
|
+
}
|
|
67158
|
+
};
|
|
67159
|
+
const archiving = method === "POST" && rest === `${id}/archive`;
|
|
67160
|
+
return {
|
|
67161
|
+
...bodyKind === void 0 ? {} : {
|
|
67162
|
+
onRequestChunk: (chunk) => {
|
|
67163
|
+
if (oversized) {
|
|
67164
|
+
return;
|
|
67165
|
+
}
|
|
67166
|
+
chunks.push(Buffer.from(chunk));
|
|
67167
|
+
buffered += chunk.length;
|
|
67168
|
+
if (buffered > RC_REQUEST_PARSE_CAP_BYTES) {
|
|
67169
|
+
oversized = true;
|
|
67170
|
+
chunks = [];
|
|
67171
|
+
}
|
|
67172
|
+
},
|
|
67173
|
+
onRequestEnd: () => {
|
|
67174
|
+
requestEnded = true;
|
|
67175
|
+
file2();
|
|
67176
|
+
}
|
|
67177
|
+
},
|
|
67178
|
+
onResponse: (status, headers) => {
|
|
67179
|
+
if (singleHeader(headers, CONFLICT_REASON_HEADER) !== void 0 || archiving && isSuccessful(status)) {
|
|
67180
|
+
expire(id);
|
|
67181
|
+
return;
|
|
67182
|
+
}
|
|
67183
|
+
accepted = isSuccessful(status);
|
|
67184
|
+
file2();
|
|
67185
|
+
},
|
|
67186
|
+
onBodyChunk: () => {
|
|
67187
|
+
},
|
|
67188
|
+
onEnd: () => {
|
|
67189
|
+
}
|
|
67190
|
+
};
|
|
67191
|
+
};
|
|
67192
|
+
const summaryOf = ({ id, createdAt, lastSeenAt }) => ({ id, createdAt, lastSeenAt });
|
|
67193
|
+
const pendingSummaryOf = ({ sessionId, requestId, type, summary, observedAt: observedAt2 }) => ({ sessionId, requestId, type, summary, observedAt: observedAt2 });
|
|
67194
|
+
const sortedEntries = () => [...entries.values()].sort((left, right) => left.createdAt - right.createdAt || (left.id < right.id ? -1 : 1));
|
|
67195
|
+
const pendingSorted = (entry) => [...entry.pending.values()].sort((left, right) => left.observedAt - right.observedAt || (left.requestId < right.requestId ? -1 : 1)).map(pendingSummaryOf);
|
|
67196
|
+
return {
|
|
67197
|
+
observeExchange,
|
|
67198
|
+
list: () => {
|
|
67199
|
+
sweep();
|
|
67200
|
+
return sortedEntries().map(summaryOf);
|
|
67201
|
+
},
|
|
67202
|
+
statusOf: (sessionId) => {
|
|
67203
|
+
sweep();
|
|
67204
|
+
return sortedEntries().filter((entry) => sessionId === void 0 || entry.id === sessionId).map((entry) => ({ ...summaryOf(entry), workerState: entry.workerState, workerIdleSeconds: entry.workerIdleSeconds, pending: pendingSorted(entry) }));
|
|
67205
|
+
},
|
|
67206
|
+
pendingOf: (sessionId) => {
|
|
67207
|
+
sweep();
|
|
67208
|
+
return sortedEntries().filter((entry) => sessionId === void 0 || entry.id === sessionId).flatMap((entry) => pendingSorted(entry));
|
|
67209
|
+
},
|
|
67210
|
+
credentialOf: (sessionId) => {
|
|
67211
|
+
const entry = entries.get(sessionId);
|
|
67212
|
+
return entry === void 0 ? void 0 : { authorization: entry.authorization, anthropicVersion: entry.anthropicVersion, anthropicClientPlatform: entry.anthropicClientPlatform };
|
|
67213
|
+
},
|
|
67214
|
+
completePending: (sessionId, requestId) => {
|
|
67215
|
+
entries.get(sessionId)?.pending.delete(requestId);
|
|
67216
|
+
},
|
|
67217
|
+
close: () => {
|
|
67218
|
+
clearInterval(timer);
|
|
67219
|
+
}
|
|
67220
|
+
};
|
|
67221
|
+
}
|
|
67222
|
+
function observingRoutedRoute(route, tracker) {
|
|
67223
|
+
return {
|
|
67224
|
+
...route,
|
|
67225
|
+
serve: async (request7, response) => {
|
|
67226
|
+
const observed = tracker.observeExchange({ method: request7.method, url: request7.url, headers: request7.headers });
|
|
67227
|
+
if (observed?.onRequestChunk !== void 0) {
|
|
67228
|
+
request7.body.on("data", (chunk) => {
|
|
67229
|
+
observed.onRequestChunk?.(chunk);
|
|
67230
|
+
});
|
|
67231
|
+
request7.body.on("end", () => {
|
|
67232
|
+
observed.onRequestEnd?.();
|
|
67233
|
+
});
|
|
67234
|
+
}
|
|
67235
|
+
await route.serve(request7, observed === void 0 ? response : teeRoutedResponse(response, observed));
|
|
67236
|
+
}
|
|
67237
|
+
};
|
|
67238
|
+
}
|
|
67239
|
+
function teeRoutedResponse(response, observer) {
|
|
67240
|
+
return {
|
|
67241
|
+
get headersSent() {
|
|
67242
|
+
return response.headersSent;
|
|
67243
|
+
},
|
|
67244
|
+
start: (status, headers) => {
|
|
67245
|
+
observer.onResponse(status, headers);
|
|
67246
|
+
response.start(status, headers);
|
|
67247
|
+
},
|
|
67248
|
+
flush: () => {
|
|
67249
|
+
response.flush();
|
|
67250
|
+
},
|
|
67251
|
+
write: async (chunk) => {
|
|
67252
|
+
observer.onBodyChunk(typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk);
|
|
67253
|
+
await response.write(chunk);
|
|
67254
|
+
},
|
|
67255
|
+
end: () => {
|
|
67256
|
+
response.end();
|
|
67257
|
+
observer.onEnd();
|
|
67258
|
+
},
|
|
67259
|
+
destroy: () => {
|
|
67260
|
+
response.destroy();
|
|
67261
|
+
observer.onEnd();
|
|
67262
|
+
}
|
|
67263
|
+
};
|
|
67264
|
+
}
|
|
67265
|
+
function buildRcUserMessagePayload(uuid3, sessionId, text2) {
|
|
67266
|
+
return {
|
|
67267
|
+
type: "user",
|
|
67268
|
+
uuid: uuid3,
|
|
67269
|
+
session_id: sessionId,
|
|
67270
|
+
parent_tool_use_id: null,
|
|
67271
|
+
message: { role: "user", content: text2 }
|
|
67272
|
+
};
|
|
67273
|
+
}
|
|
67274
|
+
function buildRcEventWriteBody(payload) {
|
|
67275
|
+
return { events: [{ payload }] };
|
|
67276
|
+
}
|
|
67277
|
+
function sequenceNumsOf(body) {
|
|
67278
|
+
let parsed;
|
|
67279
|
+
try {
|
|
67280
|
+
parsed = JSON.parse(body);
|
|
67281
|
+
} catch {
|
|
67282
|
+
return void 0;
|
|
67283
|
+
}
|
|
67284
|
+
if (typeof parsed !== "object" || parsed === null || !("results" in parsed) || !Array.isArray(parsed.results)) {
|
|
67285
|
+
return void 0;
|
|
67286
|
+
}
|
|
67287
|
+
const sequenceNums = [];
|
|
67288
|
+
const results = parsed.results;
|
|
67289
|
+
for (const result of results) {
|
|
67290
|
+
if (typeof result !== "object" || result === null || !("sequence_num" in result)) {
|
|
67291
|
+
return void 0;
|
|
67292
|
+
}
|
|
67293
|
+
const sequenceNum = result.sequence_num;
|
|
67294
|
+
if (typeof sequenceNum !== "number") {
|
|
67295
|
+
return void 0;
|
|
67296
|
+
}
|
|
67297
|
+
sequenceNums.push(sequenceNum);
|
|
67298
|
+
}
|
|
67299
|
+
return sequenceNums.length === 0 ? void 0 : sequenceNums;
|
|
67300
|
+
}
|
|
67301
|
+
function rcEventWriteResultFromAnswer(answer) {
|
|
67302
|
+
if (!isSuccessful(answer.status)) {
|
|
67303
|
+
if (answer.status === HTTP_STATUS.unauthorized) {
|
|
67304
|
+
return { ok: false, message: `the API refused the observed Authorization bearer for this session (HTTP 401): the bearer went stale after the door last saw the session's traffic. The session's own client refreshes it on its next call, which the door will observe, so retry once Remote Control has been active again. API answer: ${answer.body}` };
|
|
67305
|
+
}
|
|
67306
|
+
return { ok: false, message: `the API answered HTTP ${String(answer.status)} to the injected event: ${answer.body}` };
|
|
67307
|
+
}
|
|
67308
|
+
const sequenceNums = sequenceNumsOf(answer.body);
|
|
67309
|
+
if (sequenceNums === void 0) {
|
|
67310
|
+
return { ok: false, message: `the API accepted the injected event but its answer named no results[].sequence_num, so delivery cannot be confirmed: ${answer.body}` };
|
|
67311
|
+
}
|
|
67312
|
+
return { ok: true, sequenceNums };
|
|
67313
|
+
}
|
|
67314
|
+
function rcWriteHeaders(credential) {
|
|
67315
|
+
const headers = { "content-type": "application/json" };
|
|
67316
|
+
if (credential.authorization !== void 0) {
|
|
67317
|
+
headers.authorization = credential.authorization;
|
|
67318
|
+
}
|
|
67319
|
+
if (credential.anthropicVersion !== void 0) {
|
|
67320
|
+
headers["anthropic-version"] = credential.anthropicVersion;
|
|
67321
|
+
}
|
|
67322
|
+
if (credential.anthropicClientPlatform !== void 0) {
|
|
67323
|
+
headers["anthropic-client-platform"] = credential.anthropicClientPlatform;
|
|
67324
|
+
}
|
|
67325
|
+
return headers;
|
|
67326
|
+
}
|
|
67327
|
+
async function injectRcUserMessage(deps, sessionId, text2) {
|
|
67328
|
+
const credential = deps.credentialOf(sessionId);
|
|
67329
|
+
if (credential === void 0) {
|
|
67330
|
+
return { ok: false, message: `the front door has not observed Remote Control session ${sessionId}: it may never have passed through this door, or it ended or expired (an entry lives only a bounded idle period past its last observed traffic)` };
|
|
67331
|
+
}
|
|
67332
|
+
const body = JSON.stringify(buildRcEventWriteBody(buildRcUserMessagePayload(deps.newUuid(), sessionId, text2)));
|
|
67333
|
+
let answer;
|
|
67334
|
+
try {
|
|
67335
|
+
answer = await deps.dial.writeEvents(sessionId, rcWriteHeaders(credential), body);
|
|
67336
|
+
} catch (error62) {
|
|
67337
|
+
return { ok: false, message: `the door could not reach the API host to inject into session ${sessionId}: ${error62 instanceof Error ? error62.message : String(error62)}` };
|
|
67338
|
+
}
|
|
67339
|
+
return rcEventWriteResultFromAnswer(answer);
|
|
67340
|
+
}
|
|
67341
|
+
function buildRcControlResponsePayload(requestId, decision) {
|
|
67342
|
+
const result = decision.approve ? { behavior: "allow" } : { behavior: "deny", message: decision.message ?? "" };
|
|
67343
|
+
return { type: "control_response", response: { subtype: "success", request_id: requestId, response: result } };
|
|
67344
|
+
}
|
|
67345
|
+
async function answerRcControlRequest(deps, sessionId, requestId, decision) {
|
|
67346
|
+
const credential = deps.credentialOf(sessionId);
|
|
67347
|
+
if (credential === void 0) {
|
|
67348
|
+
return { ok: false, message: `the front door has not observed Remote Control session ${sessionId}: it may never have passed through this door, or it ended or expired (an entry lives only a bounded idle period past its last observed traffic)` };
|
|
67349
|
+
}
|
|
67350
|
+
if (!deps.pendingOf(sessionId).some((pending) => pending.requestId === requestId)) {
|
|
67351
|
+
return { ok: false, message: `the front door has not observed control request ${requestId} pending on session ${sessionId}: it was answered already (by this door or by an attached client), it passed its answer deadline (the protocol's permission round-trip bound), or it never passed through this door` };
|
|
67352
|
+
}
|
|
67353
|
+
const body = JSON.stringify(buildRcEventWriteBody(buildRcControlResponsePayload(requestId, decision)));
|
|
67354
|
+
let answer;
|
|
67355
|
+
try {
|
|
67356
|
+
answer = await deps.dial.writeEvents(sessionId, rcWriteHeaders(credential), body);
|
|
67357
|
+
} catch (error62) {
|
|
67358
|
+
return { ok: false, message: `the door could not reach the API host to answer on session ${sessionId}: ${error62 instanceof Error ? error62.message : String(error62)}` };
|
|
67359
|
+
}
|
|
67360
|
+
const result = rcEventWriteResultFromAnswer(answer);
|
|
67361
|
+
if (result.ok) {
|
|
67362
|
+
deps.completePending(sessionId, requestId);
|
|
67363
|
+
}
|
|
67364
|
+
return result;
|
|
66536
67365
|
}
|
|
66537
67366
|
|
|
66538
67367
|
// src/usage/providerQuota.ts
|
|
@@ -66826,13 +67655,21 @@ function headroomSocketTarget(fsPort, trust, paths) {
|
|
|
66826
67655
|
const socketPath = readHeadroomState(fsPort, paths.headroomStateFile)?.socketPath;
|
|
66827
67656
|
return socketPath === void 0 ? void 0 : verifyHeadroomSocket(socketPath, trust);
|
|
66828
67657
|
}
|
|
67658
|
+
function rcObservingResolver(resolve, tracker) {
|
|
67659
|
+
return async (request7) => {
|
|
67660
|
+
const resolution = await resolve(request7);
|
|
67661
|
+
return resolution.ok ? { ok: true, route: observingRoutedRoute(resolution.route, tracker) } : resolution;
|
|
67662
|
+
};
|
|
67663
|
+
}
|
|
66829
67664
|
function realFrontDoorSupervisorPorts(paths) {
|
|
66830
67665
|
const log = (line) => {
|
|
66831
67666
|
appendLog(paths, `frontdoor ${String(process.pid)}: ${line}`);
|
|
66832
67667
|
};
|
|
66833
67668
|
let directPort = 0;
|
|
66834
67669
|
const codexPorts = createCodexRoutePorts(log);
|
|
66835
|
-
const
|
|
67670
|
+
const rcTracker = createRcSessionTracker({ now: () => Date.now(), idleMs: RC_IDLE_EXPIRY_MS });
|
|
67671
|
+
const rcControlToken = (0, import_node_crypto11.randomUUID)();
|
|
67672
|
+
const resolveRoute = rcObservingResolver(createProviderRouteResolver({ fs: realFsPort, providersDir: paths.providersDir, codexPorts, directPort: () => directPort }), rcTracker);
|
|
66836
67673
|
const isLiveToken = (token) => isLiveCapability(token, liveSessionTokens(realFarmFs, paths.frontdoorSessionsDir));
|
|
66837
67674
|
const usageStore = createUsageStore({
|
|
66838
67675
|
fs: realFarmFs,
|
|
@@ -66884,15 +67721,28 @@ function realFrontDoorSupervisorPorts(paths) {
|
|
|
66884
67721
|
isRunning: realIsProcessRunning,
|
|
66885
67722
|
startProviderListener: async (preferredPort) => {
|
|
66886
67723
|
const authority = loadCa();
|
|
67724
|
+
const rcDial = realRcEventDial();
|
|
67725
|
+
const rcInject = async (sessionId, text2) => await injectRcUserMessage({ credentialOf: rcTracker.credentialOf, dial: rcDial, newUuid: import_node_crypto11.randomUUID }, sessionId, text2);
|
|
67726
|
+
const rcAnswer = async (sessionId, requestId, decision) => await answerRcControlRequest({ credentialOf: rcTracker.credentialOf, pendingOf: (id) => rcTracker.pendingOf(id), completePending: rcTracker.completePending, dial: rcDial }, sessionId, requestId, decision);
|
|
67727
|
+
realFarmFs.mkdirp(paths.frontdoorDir);
|
|
67728
|
+
realFarmFs.writeFilePrivate(paths.frontdoorControlTokenFile, `${rcControlToken}
|
|
67729
|
+
`);
|
|
66887
67730
|
const server = createFrontDoorServer(
|
|
66888
|
-
async (
|
|
66889
|
-
await serveRouted(
|
|
67731
|
+
async (request7) => {
|
|
67732
|
+
await serveRouted(request7, pipelines.clientFacing);
|
|
66890
67733
|
},
|
|
66891
67734
|
log,
|
|
66892
|
-
mintLeaf(authority, LOOPBACK_LEAF_NAMES, /* @__PURE__ */ new Date())
|
|
67735
|
+
mintLeaf(authority, LOOPBACK_LEAF_NAMES, /* @__PURE__ */ new Date()),
|
|
67736
|
+
createRcControlHandler({ expectedToken: rcControlToken, list: rcTracker.list, statusOf: rcTracker.statusOf, pendingOf: rcTracker.pendingOf, inject: rcInject, answer: rcAnswer })
|
|
66893
67737
|
);
|
|
66894
67738
|
const handle = await listenFrontDoor(server, { ...preferredPort === void 0 ? {} : { preferredPort }, ca: authority.certPem, onError: onListenerError("provider") });
|
|
66895
|
-
return {
|
|
67739
|
+
return {
|
|
67740
|
+
port: handle.port,
|
|
67741
|
+
close: async () => {
|
|
67742
|
+
realFarmFs.removeRecursive(paths.frontdoorControlTokenFile);
|
|
67743
|
+
await handle.close();
|
|
67744
|
+
}
|
|
67745
|
+
};
|
|
66896
67746
|
},
|
|
66897
67747
|
startConnectListener: async (preferredPort) => {
|
|
66898
67748
|
const transparentPort = process.env.AGENT_SHIM_TRANSPARENT_SURFACE === void 0 ? void 0 : Number(process.env.AGENT_SHIM_TRANSPARENT_SURFACE);
|
|
@@ -66910,16 +67760,16 @@ function realFrontDoorSupervisorPorts(paths) {
|
|
|
66910
67760
|
interceptHosts: CONNECT_INTERCEPT_HOSTS,
|
|
66911
67761
|
tapHosts: CONNECT_TAP_HOSTS,
|
|
66912
67762
|
routedHost: CONNECT_INTERCEPT_HOST,
|
|
66913
|
-
serveRouted: (
|
|
67763
|
+
serveRouted: (request7, response) => {
|
|
66914
67764
|
const abort = new AbortController();
|
|
66915
67765
|
response.on("close", () => {
|
|
66916
67766
|
if (!response.writableFinished) {
|
|
66917
67767
|
abort.abort();
|
|
66918
67768
|
}
|
|
66919
67769
|
});
|
|
66920
|
-
void serveRouted({ method:
|
|
67770
|
+
void serveRouted({ method: request7.method ?? "GET", url: request7.url ?? "/", headers: request7.headers, body: request7, signal: abort.signal, response }, pipelines.clientFacing).catch(
|
|
66921
67771
|
(error62) => {
|
|
66922
|
-
log(`connect request ${
|
|
67772
|
+
log(`connect request ${request7.method ?? "?"} ${request7.url ?? "?"} failed: ${error62 instanceof Error ? `${error62.name}: ${error62.message}` : String(error62)}`);
|
|
66923
67773
|
if (!response.headersSent) {
|
|
66924
67774
|
response.writeHead(HTTP_STATUS.badGateway, { "Content-Type": "application/json" });
|
|
66925
67775
|
response.end(JSON.stringify({ type: "error", error: { type: "api_error", message: "internal error in the agent-shim front door" } }));
|
|
@@ -66942,8 +67792,8 @@ function realFrontDoorSupervisorPorts(paths) {
|
|
|
66942
67792
|
return { port: server.port, close: server.close };
|
|
66943
67793
|
},
|
|
66944
67794
|
startDirectListener: async (preferredPort) => {
|
|
66945
|
-
const server = createFrontDoorServer(async (
|
|
66946
|
-
await serveRouted(
|
|
67795
|
+
const server = createFrontDoorServer(async (request7) => {
|
|
67796
|
+
await serveRouted(request7, pipelines.direct);
|
|
66947
67797
|
}, log);
|
|
66948
67798
|
const handle = await listenFrontDoor(server, {
|
|
66949
67799
|
...preferredPort === void 0 ? {} : { preferredPort },
|
|
@@ -67006,6 +67856,56 @@ function formatFrontDoorStatus(status, caCertPath) {
|
|
|
67006
67856
|
lines.push(`daemon log: ${status.logPath}${status.logExists ? "" : " (not created yet)"}`);
|
|
67007
67857
|
return lines;
|
|
67008
67858
|
}
|
|
67859
|
+
function formatRcSessionList(sessions) {
|
|
67860
|
+
if (sessions.length === 0) {
|
|
67861
|
+
return ["no Remote Control sessions observed"];
|
|
67862
|
+
}
|
|
67863
|
+
return sessions.map((session) => `${session.id} created ${new Date(session.createdAt).toISOString()} last seen ${new Date(session.lastSeenAt).toISOString()}`);
|
|
67864
|
+
}
|
|
67865
|
+
function formatRcSessionStatus(statuses) {
|
|
67866
|
+
if (statuses.length === 0) {
|
|
67867
|
+
return ["no Remote Control sessions observed"];
|
|
67868
|
+
}
|
|
67869
|
+
const lines = [];
|
|
67870
|
+
for (const status of statuses) {
|
|
67871
|
+
lines.push(`${status.id} created ${new Date(status.createdAt).toISOString()} last seen ${new Date(status.lastSeenAt).toISOString()}`);
|
|
67872
|
+
const worker = status.workerState === void 0 && status.workerIdleSeconds === void 0 ? "not observed" : [
|
|
67873
|
+
status.workerState === void 0 ? "state unknown" : `state ${status.workerState.value} since ${new Date(status.workerState.observedAt).toISOString()}`,
|
|
67874
|
+
status.workerIdleSeconds === void 0 ? "idle unknown" : `idle ${String(status.workerIdleSeconds.value)} s as of ${new Date(status.workerIdleSeconds.observedAt).toISOString()}`
|
|
67875
|
+
].join(", ");
|
|
67876
|
+
lines.push(` worker: ${worker}`);
|
|
67877
|
+
if (status.pending.length === 0) {
|
|
67878
|
+
lines.push(" pending: none");
|
|
67879
|
+
} else {
|
|
67880
|
+
lines.push(" pending:");
|
|
67881
|
+
for (const pending of status.pending) {
|
|
67882
|
+
lines.push(...formatRcPendingList([pending]).map((line) => ` ${line}`));
|
|
67883
|
+
}
|
|
67884
|
+
}
|
|
67885
|
+
}
|
|
67886
|
+
return lines;
|
|
67887
|
+
}
|
|
67888
|
+
function formatRcPendingList(pending) {
|
|
67889
|
+
if (pending.length === 0) {
|
|
67890
|
+
return ["no pending control requests observed"];
|
|
67891
|
+
}
|
|
67892
|
+
return pending.map((request7) => `${request7.sessionId} ${request7.requestId} ${request7.type}${request7.summary === "" ? "" : ` ${request7.summary}`} observed ${new Date(request7.observedAt).toISOString()}`);
|
|
67893
|
+
}
|
|
67894
|
+
function frontDoorRcControlFromState(fsPort, paths) {
|
|
67895
|
+
const state = readFrontDoorState(fsPort, paths.frontdoorStateFile);
|
|
67896
|
+
if (state?.port === void 0) {
|
|
67897
|
+
throw new Error("the front door is not serving: Remote Control sessions are observed only while it runs, so start a session through the door first");
|
|
67898
|
+
}
|
|
67899
|
+
const ca = fsPort.readFileUtf8(paths.frontdoorCaCertFile);
|
|
67900
|
+
if (ca === void 0) {
|
|
67901
|
+
throw new Error(`the front door's CA certificate is missing at ${paths.frontdoorCaCertFile}, so its control listener cannot be authenticated`);
|
|
67902
|
+
}
|
|
67903
|
+
const token = fsPort.readFileUtf8(paths.frontdoorControlTokenFile)?.trim();
|
|
67904
|
+
if (token === void 0 || token === "") {
|
|
67905
|
+
throw new Error(`the serving front door's control token is missing at ${paths.frontdoorControlTokenFile}`);
|
|
67906
|
+
}
|
|
67907
|
+
return frontDoorRcControl(realRcControlTransport(state.port, ca), token);
|
|
67908
|
+
}
|
|
67009
67909
|
function registerFrontDoorCommand(program2, deps) {
|
|
67010
67910
|
const { paths } = deps;
|
|
67011
67911
|
const frontdoor = withExamples(program2.command("frontdoor").description("Inspect the front-door daemon that routes every agent-shim session."), [
|
|
@@ -67024,6 +67924,86 @@ function registerFrontDoorCommand(program2, deps) {
|
|
|
67024
67924
|
}),
|
|
67025
67925
|
["agent-shim frontdoor status", "agent-shim frontdoor status --json"]
|
|
67026
67926
|
);
|
|
67927
|
+
const rc = withExamples(
|
|
67928
|
+
frontdoor.command("rc").description("Observe the Remote Control sessions passing through the front door, send a prompt into one, and answer its pending control requests."),
|
|
67929
|
+
["agent-shim frontdoor rc list", "agent-shim frontdoor rc pending"]
|
|
67930
|
+
);
|
|
67931
|
+
withExamples(
|
|
67932
|
+
rc.command("list").description("List the Remote Control sessions the front door has observed, with when each was created and last seen. Read-only.").option("--json", "Print the sessions as JSON.").action(async (options) => {
|
|
67933
|
+
const sessions = await frontDoorRcControlFromState(realFarmFs, paths).listSessions();
|
|
67934
|
+
if (options.json === true) {
|
|
67935
|
+
printJson({ sessions });
|
|
67936
|
+
return;
|
|
67937
|
+
}
|
|
67938
|
+
for (const line of formatRcSessionList(sessions)) {
|
|
67939
|
+
console.log(line);
|
|
67940
|
+
}
|
|
67941
|
+
}),
|
|
67942
|
+
["agent-shim frontdoor rc list", "agent-shim frontdoor rc list --json"]
|
|
67943
|
+
);
|
|
67944
|
+
withExamples(
|
|
67945
|
+
rc.command("status").description("Report each observed Remote Control session's worker state and idle from its latest observed heartbeat and registration, with its pending control requests. Read-only.").argument("[session]", "One cse_ session id, as `frontdoor rc list` shows it; every observed session when omitted.").option("--json", "Print the statuses as JSON.").action(async (session, options) => {
|
|
67946
|
+
const statuses = await frontDoorRcControlFromState(realFarmFs, paths).statusOf(session);
|
|
67947
|
+
if (options.json === true) {
|
|
67948
|
+
printJson({ statuses });
|
|
67949
|
+
return;
|
|
67950
|
+
}
|
|
67951
|
+
for (const line of formatRcSessionStatus(statuses)) {
|
|
67952
|
+
console.log(line);
|
|
67953
|
+
}
|
|
67954
|
+
}),
|
|
67955
|
+
["agent-shim frontdoor rc status", "agent-shim frontdoor rc status cse_00000000-0000-4000-8000-000000000000 --json"]
|
|
67956
|
+
);
|
|
67957
|
+
withExamples(
|
|
67958
|
+
rc.command("pending").description("List the control requests (tool and plan approvals above all) the front door has observed and that are still awaiting an answer. Read-only.").argument("[session]", "One cse_ session id, as `frontdoor rc list` shows it; every observed session when omitted.").option("--json", "Print the pending requests as JSON.").action(async (session, options) => {
|
|
67959
|
+
const pending = await frontDoorRcControlFromState(realFarmFs, paths).pendingOf(session);
|
|
67960
|
+
if (options.json === true) {
|
|
67961
|
+
printJson({ pending });
|
|
67962
|
+
return;
|
|
67963
|
+
}
|
|
67964
|
+
for (const line of formatRcPendingList(pending)) {
|
|
67965
|
+
console.log(line);
|
|
67966
|
+
}
|
|
67967
|
+
}),
|
|
67968
|
+
["agent-shim frontdoor rc pending", "agent-shim frontdoor rc pending --json"]
|
|
67969
|
+
);
|
|
67970
|
+
withExamples(
|
|
67971
|
+
rc.command("send").description("Send a text prompt into one observed Remote Control session, arriving as a message from an attached client would.").requiredOption("--session <id>", "The cse_ session id, as `frontdoor rc list` shows it.").requiredOption("--text <text>", "The prompt text to deliver.").option("--json", "Print the delivery result as JSON.").action(async (options) => {
|
|
67972
|
+
const result = await frontDoorRcControlFromState(realFarmFs, paths).sendPrompt(options.session, options.text);
|
|
67973
|
+
if (!result.ok) {
|
|
67974
|
+
throw new Error(result.message);
|
|
67975
|
+
}
|
|
67976
|
+
if (options.json === true) {
|
|
67977
|
+
printJson({ session: options.session, sequenceNums: result.sequenceNums });
|
|
67978
|
+
return;
|
|
67979
|
+
}
|
|
67980
|
+
console.log(`sent to ${options.session}: sequence_num ${result.sequenceNums.join(", ")}`);
|
|
67981
|
+
}),
|
|
67982
|
+
['agent-shim frontdoor rc send --session cse_00000000-0000-4000-8000-000000000000 --text "run the tests"']
|
|
67983
|
+
);
|
|
67984
|
+
withExamples(
|
|
67985
|
+
rc.command("answer").description("Answer one pending control request on an observed session, approving or denying it as an attached client's approval would.").requiredOption("--session <id>", "The cse_ session id, as `frontdoor rc list` shows it.").requiredOption("--request <id>", "The control request's id, as `frontdoor rc pending` shows it.").option("--approve", "Approve the request.").option("--deny", "Deny the request.").option("--text <text>", "The denial message the worker sees; applies to --deny only.").option("--json", "Print the delivery result as JSON.").action(async (options) => {
|
|
67986
|
+
if (options.approve === options.deny) {
|
|
67987
|
+
throw new UsageError("answer exactly one way: pass --approve or --deny, not both and not neither");
|
|
67988
|
+
}
|
|
67989
|
+
if (options.approve === true && options.text !== void 0) {
|
|
67990
|
+
throw new UsageError("--text is the denial message; an approval carries no text (the protocol's allow result has no message field)");
|
|
67991
|
+
}
|
|
67992
|
+
const result = await frontDoorRcControlFromState(realFarmFs, paths).answerRequest(options.session, options.request, { approve: options.approve === true, message: options.deny === true ? options.text : void 0 });
|
|
67993
|
+
if (!result.ok) {
|
|
67994
|
+
throw new Error(result.message);
|
|
67995
|
+
}
|
|
67996
|
+
if (options.json === true) {
|
|
67997
|
+
printJson({ session: options.session, request: options.request, sequenceNums: result.sequenceNums });
|
|
67998
|
+
return;
|
|
67999
|
+
}
|
|
68000
|
+
console.log(`${options.approve === true ? "approved" : "denied"} ${options.request} on ${options.session}: sequence_num ${result.sequenceNums.join(", ")}`);
|
|
68001
|
+
}),
|
|
68002
|
+
[
|
|
68003
|
+
"agent-shim frontdoor rc answer --session cse_00000000-0000-4000-8000-000000000000 --request req_00000000-0000-4000-8000-000000000000 --approve",
|
|
68004
|
+
'agent-shim frontdoor rc answer --session cse_00000000-0000-4000-8000-000000000000 --request req_00000000-0000-4000-8000-000000000000 --deny --text "not today"'
|
|
68005
|
+
]
|
|
68006
|
+
);
|
|
67027
68007
|
program2.command("__frontdoor-supervisor", { hidden: true }).description("Internal: serve the front-door routing listeners. Started by the launcher; never run by hand.").allowUnknownOption().action(async () => {
|
|
67028
68008
|
const idleShutdownMinutes = readGlobalConfig(paths)?.frontdoor?.idleShutdownMinutes ?? FRONTDOOR_DEFAULT_IDLE_SHUTDOWN_MINUTES;
|
|
67029
68009
|
process.on("SIGTERM", () => {
|