@testsmith/api-spector-agent 0.4.8 → 0.4.9
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/dist/index.cjs +667 -146
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -463,11 +463,11 @@ var require_dom = __commonJS({
|
|
|
463
463
|
function splitOnASCIIWhitespace(input) {
|
|
464
464
|
return input ? input.split(/[\t\n\f\r ]+/).filter(notEmptyString) : [];
|
|
465
465
|
}
|
|
466
|
-
function orderedSetReducer(
|
|
467
|
-
if (!
|
|
468
|
-
|
|
466
|
+
function orderedSetReducer(current2, element) {
|
|
467
|
+
if (!current2.hasOwnProperty(element)) {
|
|
468
|
+
current2[element] = true;
|
|
469
469
|
}
|
|
470
|
-
return
|
|
470
|
+
return current2;
|
|
471
471
|
}
|
|
472
472
|
function toOrderedSet(input) {
|
|
473
473
|
if (!input) return [];
|
|
@@ -4709,9 +4709,9 @@ var require_dom_parser = __commonJS({
|
|
|
4709
4709
|
}
|
|
4710
4710
|
},
|
|
4711
4711
|
endElement: function(namespaceURI, localName, qName) {
|
|
4712
|
-
var
|
|
4713
|
-
var tagName =
|
|
4714
|
-
this.currentElement =
|
|
4712
|
+
var current2 = this.currentElement;
|
|
4713
|
+
var tagName = current2.tagName;
|
|
4714
|
+
this.currentElement = current2.parentNode;
|
|
4715
4715
|
},
|
|
4716
4716
|
startPrefixMapping: function(prefix, uri) {
|
|
4717
4717
|
},
|
|
@@ -7472,9 +7472,9 @@ var require_dispatcher_base = __commonJS({
|
|
|
7472
7472
|
}
|
|
7473
7473
|
close(callback) {
|
|
7474
7474
|
if (callback === void 0) {
|
|
7475
|
-
return new Promise((
|
|
7475
|
+
return new Promise((resolve4, reject) => {
|
|
7476
7476
|
this.close((err, data) => {
|
|
7477
|
-
return err ? reject(err) :
|
|
7477
|
+
return err ? reject(err) : resolve4(data);
|
|
7478
7478
|
});
|
|
7479
7479
|
});
|
|
7480
7480
|
}
|
|
@@ -7512,9 +7512,9 @@ var require_dispatcher_base = __commonJS({
|
|
|
7512
7512
|
err = null;
|
|
7513
7513
|
}
|
|
7514
7514
|
if (callback === void 0) {
|
|
7515
|
-
return new Promise((
|
|
7515
|
+
return new Promise((resolve4, reject) => {
|
|
7516
7516
|
this.destroy(err, (err2, data) => {
|
|
7517
|
-
return err2 ? reject(err2) :
|
|
7517
|
+
return err2 ? reject(err2) : resolve4(data);
|
|
7518
7518
|
});
|
|
7519
7519
|
});
|
|
7520
7520
|
}
|
|
@@ -10991,8 +10991,8 @@ var require_promise = __commonJS({
|
|
|
10991
10991
|
function createDeferredPromise() {
|
|
10992
10992
|
let res;
|
|
10993
10993
|
let rej;
|
|
10994
|
-
const promise = new Promise((
|
|
10995
|
-
res =
|
|
10994
|
+
const promise = new Promise((resolve4, reject) => {
|
|
10995
|
+
res = resolve4;
|
|
10996
10996
|
rej = reject;
|
|
10997
10997
|
});
|
|
10998
10998
|
return { promise, resolve: res, reject: rej };
|
|
@@ -12293,12 +12293,12 @@ upgrade: ${upgrade}\r
|
|
|
12293
12293
|
cb();
|
|
12294
12294
|
}
|
|
12295
12295
|
}
|
|
12296
|
-
const waitForDrain = () => new Promise((
|
|
12296
|
+
const waitForDrain = () => new Promise((resolve4, reject) => {
|
|
12297
12297
|
assert(callback === null);
|
|
12298
12298
|
if (socket[kError]) {
|
|
12299
12299
|
reject(socket[kError]);
|
|
12300
12300
|
} else {
|
|
12301
|
-
callback =
|
|
12301
|
+
callback = resolve4;
|
|
12302
12302
|
}
|
|
12303
12303
|
});
|
|
12304
12304
|
socket.on("close", onDrain).on("drain", onDrain);
|
|
@@ -13143,12 +13143,12 @@ var require_client_h2 = __commonJS({
|
|
|
13143
13143
|
cb();
|
|
13144
13144
|
}
|
|
13145
13145
|
}
|
|
13146
|
-
const waitForDrain = () => new Promise((
|
|
13146
|
+
const waitForDrain = () => new Promise((resolve4, reject) => {
|
|
13147
13147
|
assert(callback === null);
|
|
13148
13148
|
if (socket[kError]) {
|
|
13149
13149
|
reject(socket[kError]);
|
|
13150
13150
|
} else {
|
|
13151
|
-
callback =
|
|
13151
|
+
callback = resolve4;
|
|
13152
13152
|
}
|
|
13153
13153
|
});
|
|
13154
13154
|
h2stream.on("close", onDrain).on("drain", onDrain);
|
|
@@ -13459,16 +13459,16 @@ var require_client = __commonJS({
|
|
|
13459
13459
|
return this[kNeedDrain] < 2;
|
|
13460
13460
|
}
|
|
13461
13461
|
[kClose]() {
|
|
13462
|
-
return new Promise((
|
|
13462
|
+
return new Promise((resolve4) => {
|
|
13463
13463
|
if (this[kSize]) {
|
|
13464
|
-
this[kClosedResolve] =
|
|
13464
|
+
this[kClosedResolve] = resolve4;
|
|
13465
13465
|
} else {
|
|
13466
|
-
|
|
13466
|
+
resolve4(null);
|
|
13467
13467
|
}
|
|
13468
13468
|
});
|
|
13469
13469
|
}
|
|
13470
13470
|
[kDestroy](err) {
|
|
13471
|
-
return new Promise((
|
|
13471
|
+
return new Promise((resolve4) => {
|
|
13472
13472
|
const requests = this[kQueue].splice(this[kPendingIdx]);
|
|
13473
13473
|
for (let i68 = 0; i68 < requests.length; i68++) {
|
|
13474
13474
|
const request = requests[i68];
|
|
@@ -13479,7 +13479,7 @@ var require_client = __commonJS({
|
|
|
13479
13479
|
this[kClosedResolve]();
|
|
13480
13480
|
this[kClosedResolve] = null;
|
|
13481
13481
|
}
|
|
13482
|
-
|
|
13482
|
+
resolve4(null);
|
|
13483
13483
|
};
|
|
13484
13484
|
if (this[kHTTPContext]) {
|
|
13485
13485
|
this[kHTTPContext].destroy(err, callback);
|
|
@@ -13879,8 +13879,8 @@ var require_pool_base = __commonJS({
|
|
|
13879
13879
|
}
|
|
13880
13880
|
return Promise.all(closeAll);
|
|
13881
13881
|
} else {
|
|
13882
|
-
return new Promise((
|
|
13883
|
-
this[kClosedResolve] =
|
|
13882
|
+
return new Promise((resolve4) => {
|
|
13883
|
+
this[kClosedResolve] = resolve4;
|
|
13884
13884
|
});
|
|
13885
13885
|
}
|
|
13886
13886
|
}
|
|
@@ -14972,10 +14972,10 @@ var require_socks5_proxy_agent = __commonJS({
|
|
|
14972
14972
|
const proxyHost = this[kProxyUrl].hostname;
|
|
14973
14973
|
const proxyPort = parseInt(this[kProxyUrl].port) || 1080;
|
|
14974
14974
|
debug("creating SOCKS5 connection to", proxyHost, proxyPort);
|
|
14975
|
-
const socket = await new Promise((
|
|
14975
|
+
const socket = await new Promise((resolve4, reject) => {
|
|
14976
14976
|
const onConnect = () => {
|
|
14977
14977
|
socket2.removeListener("error", onError);
|
|
14978
|
-
|
|
14978
|
+
resolve4(socket2);
|
|
14979
14979
|
};
|
|
14980
14980
|
const onError = (err) => {
|
|
14981
14981
|
socket2.removeListener("connect", onConnect);
|
|
@@ -14994,14 +14994,14 @@ var require_socks5_proxy_agent = __commonJS({
|
|
|
14994
14994
|
socket.destroy();
|
|
14995
14995
|
});
|
|
14996
14996
|
await socks5Client.handshake();
|
|
14997
|
-
await new Promise((
|
|
14997
|
+
await new Promise((resolve4, reject) => {
|
|
14998
14998
|
const timeout = setTimeout(() => {
|
|
14999
14999
|
reject(new Error("SOCKS5 authentication timeout"));
|
|
15000
15000
|
}, 5e3);
|
|
15001
15001
|
const onAuthenticated = () => {
|
|
15002
15002
|
clearTimeout(timeout);
|
|
15003
15003
|
socks5Client.removeListener("error", onError);
|
|
15004
|
-
|
|
15004
|
+
resolve4();
|
|
15005
15005
|
};
|
|
15006
15006
|
const onError = (err) => {
|
|
15007
15007
|
clearTimeout(timeout);
|
|
@@ -15010,14 +15010,14 @@ var require_socks5_proxy_agent = __commonJS({
|
|
|
15010
15010
|
};
|
|
15011
15011
|
if (socks5Client.state === "authenticated") {
|
|
15012
15012
|
clearTimeout(timeout);
|
|
15013
|
-
|
|
15013
|
+
resolve4();
|
|
15014
15014
|
} else {
|
|
15015
15015
|
socks5Client.once("authenticated", onAuthenticated);
|
|
15016
15016
|
socks5Client.once("error", onError);
|
|
15017
15017
|
}
|
|
15018
15018
|
});
|
|
15019
15019
|
await socks5Client.connect(targetHost, targetPort);
|
|
15020
|
-
await new Promise((
|
|
15020
|
+
await new Promise((resolve4, reject) => {
|
|
15021
15021
|
const timeout = setTimeout(() => {
|
|
15022
15022
|
reject(new Error("SOCKS5 connection timeout"));
|
|
15023
15023
|
}, 5e3);
|
|
@@ -15025,7 +15025,7 @@ var require_socks5_proxy_agent = __commonJS({
|
|
|
15025
15025
|
debug("SOCKS5 tunnel established to", targetHost, targetPort, "via", info);
|
|
15026
15026
|
clearTimeout(timeout);
|
|
15027
15027
|
socks5Client.removeListener("error", onError);
|
|
15028
|
-
|
|
15028
|
+
resolve4();
|
|
15029
15029
|
};
|
|
15030
15030
|
const onError = (err) => {
|
|
15031
15031
|
clearTimeout(timeout);
|
|
@@ -15066,8 +15066,8 @@ var require_socks5_proxy_agent = __commonJS({
|
|
|
15066
15066
|
servername: targetHost,
|
|
15067
15067
|
...connectOpts.tls || {}
|
|
15068
15068
|
});
|
|
15069
|
-
await new Promise((
|
|
15070
|
-
finalSocket.once("secureConnect",
|
|
15069
|
+
await new Promise((resolve4, reject) => {
|
|
15070
|
+
finalSocket.once("secureConnect", resolve4);
|
|
15071
15071
|
finalSocket.once("error", reject);
|
|
15072
15072
|
});
|
|
15073
15073
|
}
|
|
@@ -16092,7 +16092,7 @@ var require_readable = __commonJS({
|
|
|
16092
16092
|
if (this._readableState.closeEmitted) {
|
|
16093
16093
|
return Promise.resolve(null);
|
|
16094
16094
|
}
|
|
16095
|
-
return new Promise((
|
|
16095
|
+
return new Promise((resolve4, reject) => {
|
|
16096
16096
|
if (this[kContentLength] && this[kContentLength] > limit || this[kBytesRead] > limit) {
|
|
16097
16097
|
this.destroy(new AbortError());
|
|
16098
16098
|
}
|
|
@@ -16106,11 +16106,11 @@ var require_readable = __commonJS({
|
|
|
16106
16106
|
if (signal.aborted) {
|
|
16107
16107
|
reject(signal.reason ?? new AbortError());
|
|
16108
16108
|
} else {
|
|
16109
|
-
|
|
16109
|
+
resolve4(null);
|
|
16110
16110
|
}
|
|
16111
16111
|
});
|
|
16112
16112
|
} else {
|
|
16113
|
-
this.on("close",
|
|
16113
|
+
this.on("close", resolve4);
|
|
16114
16114
|
}
|
|
16115
16115
|
this.on("error", noop).on("data", () => {
|
|
16116
16116
|
if (this[kBytesRead] > limit) {
|
|
@@ -16138,7 +16138,7 @@ var require_readable = __commonJS({
|
|
|
16138
16138
|
}
|
|
16139
16139
|
function consume(stream, type) {
|
|
16140
16140
|
assert(!stream[kConsume]);
|
|
16141
|
-
return new Promise((
|
|
16141
|
+
return new Promise((resolve4, reject) => {
|
|
16142
16142
|
if (isUnusable(stream)) {
|
|
16143
16143
|
const rState = stream._readableState;
|
|
16144
16144
|
if (rState.destroyed && rState.closeEmitted === false) {
|
|
@@ -16153,7 +16153,7 @@ var require_readable = __commonJS({
|
|
|
16153
16153
|
stream[kConsume] = {
|
|
16154
16154
|
type,
|
|
16155
16155
|
stream,
|
|
16156
|
-
resolve,
|
|
16156
|
+
resolve: resolve4,
|
|
16157
16157
|
reject,
|
|
16158
16158
|
length: 0,
|
|
16159
16159
|
body: []
|
|
@@ -16227,18 +16227,18 @@ var require_readable = __commonJS({
|
|
|
16227
16227
|
return buffer;
|
|
16228
16228
|
}
|
|
16229
16229
|
function consumeEnd(consume2, encoding) {
|
|
16230
|
-
const { type, body, resolve, stream, length } = consume2;
|
|
16230
|
+
const { type, body, resolve: resolve4, stream, length } = consume2;
|
|
16231
16231
|
try {
|
|
16232
16232
|
if (type === "text") {
|
|
16233
|
-
|
|
16233
|
+
resolve4(chunksDecode(body, length, encoding));
|
|
16234
16234
|
} else if (type === "json") {
|
|
16235
|
-
|
|
16235
|
+
resolve4(JSON.parse(chunksDecode(body, length, encoding)));
|
|
16236
16236
|
} else if (type === "arrayBuffer") {
|
|
16237
|
-
|
|
16237
|
+
resolve4(chunksConcat(body, length).buffer);
|
|
16238
16238
|
} else if (type === "blob") {
|
|
16239
|
-
|
|
16239
|
+
resolve4(new Blob(body, { type: stream[kContentType] }));
|
|
16240
16240
|
} else if (type === "bytes") {
|
|
16241
|
-
|
|
16241
|
+
resolve4(chunksConcat(body, length));
|
|
16242
16242
|
}
|
|
16243
16243
|
consumeFinish(consume2);
|
|
16244
16244
|
} catch (err) {
|
|
@@ -16428,9 +16428,9 @@ var require_api_request = __commonJS({
|
|
|
16428
16428
|
};
|
|
16429
16429
|
function request(opts, callback) {
|
|
16430
16430
|
if (callback === void 0) {
|
|
16431
|
-
return new Promise((
|
|
16431
|
+
return new Promise((resolve4, reject) => {
|
|
16432
16432
|
request.call(this, opts, (err, data) => {
|
|
16433
|
-
return err ? reject(err) :
|
|
16433
|
+
return err ? reject(err) : resolve4(data);
|
|
16434
16434
|
});
|
|
16435
16435
|
});
|
|
16436
16436
|
}
|
|
@@ -16642,9 +16642,9 @@ var require_api_stream = __commonJS({
|
|
|
16642
16642
|
};
|
|
16643
16643
|
function stream(opts, factory, callback) {
|
|
16644
16644
|
if (callback === void 0) {
|
|
16645
|
-
return new Promise((
|
|
16645
|
+
return new Promise((resolve4, reject) => {
|
|
16646
16646
|
stream.call(this, opts, factory, (err, data) => {
|
|
16647
|
-
return err ? reject(err) :
|
|
16647
|
+
return err ? reject(err) : resolve4(data);
|
|
16648
16648
|
});
|
|
16649
16649
|
});
|
|
16650
16650
|
}
|
|
@@ -16932,9 +16932,9 @@ var require_api_upgrade = __commonJS({
|
|
|
16932
16932
|
};
|
|
16933
16933
|
function upgrade(opts, callback) {
|
|
16934
16934
|
if (callback === void 0) {
|
|
16935
|
-
return new Promise((
|
|
16935
|
+
return new Promise((resolve4, reject) => {
|
|
16936
16936
|
upgrade.call(this, opts, (err, data) => {
|
|
16937
|
-
return err ? reject(err) :
|
|
16937
|
+
return err ? reject(err) : resolve4(data);
|
|
16938
16938
|
});
|
|
16939
16939
|
});
|
|
16940
16940
|
}
|
|
@@ -17027,9 +17027,9 @@ var require_api_connect = __commonJS({
|
|
|
17027
17027
|
};
|
|
17028
17028
|
function connect(opts, callback) {
|
|
17029
17029
|
if (callback === void 0) {
|
|
17030
|
-
return new Promise((
|
|
17030
|
+
return new Promise((resolve4, reject) => {
|
|
17031
17031
|
connect.call(this, opts, (err, data) => {
|
|
17032
|
-
return err ? reject(err) :
|
|
17032
|
+
return err ? reject(err) : resolve4(data);
|
|
17033
17033
|
});
|
|
17034
17034
|
});
|
|
17035
17035
|
}
|
|
@@ -18297,7 +18297,7 @@ var require_snapshot_recorder = __commonJS({
|
|
|
18297
18297
|
"node_modules/undici/lib/mock/snapshot-recorder.js"(exports2, module2) {
|
|
18298
18298
|
"use strict";
|
|
18299
18299
|
var { writeFile: writeFile2, readFile: readFile4, mkdir } = require("node:fs/promises");
|
|
18300
|
-
var { dirname, resolve } = require("node:path");
|
|
18300
|
+
var { dirname, resolve: resolve4 } = require("node:path");
|
|
18301
18301
|
var { setTimeout: setTimeout2, clearTimeout: clearTimeout2 } = require("node:timers");
|
|
18302
18302
|
var { InvalidArgumentError, UndiciError } = require_errors();
|
|
18303
18303
|
var { hashId, isUrlExcludedFactory, normalizeHeaders, createHeaderFilters } = require_snapshot_utils();
|
|
@@ -18498,7 +18498,7 @@ var require_snapshot_recorder = __commonJS({
|
|
|
18498
18498
|
throw new InvalidArgumentError("Snapshot path is required");
|
|
18499
18499
|
}
|
|
18500
18500
|
try {
|
|
18501
|
-
const data = await readFile4(
|
|
18501
|
+
const data = await readFile4(resolve4(path), "utf8");
|
|
18502
18502
|
const parsed = JSON.parse(data);
|
|
18503
18503
|
if (Array.isArray(parsed)) {
|
|
18504
18504
|
this.#snapshots.clear();
|
|
@@ -18527,7 +18527,7 @@ var require_snapshot_recorder = __commonJS({
|
|
|
18527
18527
|
if (!path) {
|
|
18528
18528
|
throw new InvalidArgumentError("Snapshot path is required");
|
|
18529
18529
|
}
|
|
18530
|
-
const resolvedPath =
|
|
18530
|
+
const resolvedPath = resolve4(path);
|
|
18531
18531
|
await mkdir(dirname(resolvedPath), { recursive: true });
|
|
18532
18532
|
const data = Array.from(this.#snapshots.entries()).map(([hash, snapshot]) => ({
|
|
18533
18533
|
hash,
|
|
@@ -25365,7 +25365,7 @@ var require_fetch = __commonJS({
|
|
|
25365
25365
|
const agent = fetchParams.controller.dispatcher;
|
|
25366
25366
|
const path = url.pathname + url.search;
|
|
25367
25367
|
const hasTrailingQuestionMark = url.search.length === 0 && url.href[url.href.length - url.hash.length - 1] === "?";
|
|
25368
|
-
return new Promise((
|
|
25368
|
+
return new Promise((resolve4, reject) => agent.dispatch(
|
|
25369
25369
|
{
|
|
25370
25370
|
path: hasTrailingQuestionMark ? `${path}?` : path,
|
|
25371
25371
|
origin: url.origin,
|
|
@@ -25445,7 +25445,7 @@ var require_fetch = __commonJS({
|
|
|
25445
25445
|
}
|
|
25446
25446
|
}
|
|
25447
25447
|
const onError = this.onError.bind(this);
|
|
25448
|
-
|
|
25448
|
+
resolve4({
|
|
25449
25449
|
status,
|
|
25450
25450
|
statusText,
|
|
25451
25451
|
headersList,
|
|
@@ -25498,7 +25498,7 @@ var require_fetch = __commonJS({
|
|
|
25498
25498
|
headersList.append(headerName, String(value), true);
|
|
25499
25499
|
}
|
|
25500
25500
|
}
|
|
25501
|
-
|
|
25501
|
+
resolve4({
|
|
25502
25502
|
status,
|
|
25503
25503
|
statusText: STATUS_CODES2[status],
|
|
25504
25504
|
headersList,
|
|
@@ -25514,7 +25514,7 @@ var require_fetch = __commonJS({
|
|
|
25514
25514
|
for (let i68 = 0; i68 < rawHeaders.length; i68 += 2) {
|
|
25515
25515
|
headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i68]), rawHeaders[i68 + 1].toString("latin1"), true);
|
|
25516
25516
|
}
|
|
25517
|
-
|
|
25517
|
+
resolve4({
|
|
25518
25518
|
status,
|
|
25519
25519
|
statusText: STATUS_CODES2[status],
|
|
25520
25520
|
headersList,
|
|
@@ -25901,8 +25901,8 @@ var require_cache3 = __commonJS({
|
|
|
25901
25901
|
* @returns {requestResponseList}
|
|
25902
25902
|
*/
|
|
25903
25903
|
#batchCacheOperations(operations) {
|
|
25904
|
-
const
|
|
25905
|
-
const backupCache = [...
|
|
25904
|
+
const cache2 = this.#relevantRequestResponseList;
|
|
25905
|
+
const backupCache = [...cache2];
|
|
25906
25906
|
const addedItems = [];
|
|
25907
25907
|
const resultList = [];
|
|
25908
25908
|
try {
|
|
@@ -25929,9 +25929,9 @@ var require_cache3 = __commonJS({
|
|
|
25929
25929
|
return [];
|
|
25930
25930
|
}
|
|
25931
25931
|
for (const requestResponse of requestResponses) {
|
|
25932
|
-
const idx =
|
|
25932
|
+
const idx = cache2.indexOf(requestResponse);
|
|
25933
25933
|
assert(idx !== -1);
|
|
25934
|
-
|
|
25934
|
+
cache2.splice(idx, 1);
|
|
25935
25935
|
}
|
|
25936
25936
|
} else if (operation.type === "put") {
|
|
25937
25937
|
if (operation.response == null) {
|
|
@@ -25961,11 +25961,11 @@ var require_cache3 = __commonJS({
|
|
|
25961
25961
|
}
|
|
25962
25962
|
requestResponses = this.#queryCache(operation.request);
|
|
25963
25963
|
for (const requestResponse of requestResponses) {
|
|
25964
|
-
const idx =
|
|
25964
|
+
const idx = cache2.indexOf(requestResponse);
|
|
25965
25965
|
assert(idx !== -1);
|
|
25966
|
-
|
|
25966
|
+
cache2.splice(idx, 1);
|
|
25967
25967
|
}
|
|
25968
|
-
|
|
25968
|
+
cache2.push([operation.request, operation.response]);
|
|
25969
25969
|
addedItems.push([operation.request, operation.response]);
|
|
25970
25970
|
}
|
|
25971
25971
|
resultList.push([operation.request, operation.response]);
|
|
@@ -26142,13 +26142,13 @@ var require_cachestorage = __commonJS({
|
|
|
26142
26142
|
if (options.cacheName != null) {
|
|
26143
26143
|
if (this.#caches.has(options.cacheName)) {
|
|
26144
26144
|
const cacheList = this.#caches.get(options.cacheName);
|
|
26145
|
-
const
|
|
26146
|
-
return await
|
|
26145
|
+
const cache2 = new Cache(kConstruct, cacheList);
|
|
26146
|
+
return await cache2.match(request, options);
|
|
26147
26147
|
}
|
|
26148
26148
|
} else {
|
|
26149
26149
|
for (const cacheList of this.#caches.values()) {
|
|
26150
|
-
const
|
|
26151
|
-
const response = await
|
|
26150
|
+
const cache2 = new Cache(kConstruct, cacheList);
|
|
26151
|
+
const response = await cache2.match(request, options);
|
|
26152
26152
|
if (response !== void 0) {
|
|
26153
26153
|
return response;
|
|
26154
26154
|
}
|
|
@@ -26178,12 +26178,12 @@ var require_cachestorage = __commonJS({
|
|
|
26178
26178
|
webidl.argumentLengthCheck(arguments, 1, prefix);
|
|
26179
26179
|
cacheName = webidl.converters.DOMString(cacheName, prefix, "cacheName");
|
|
26180
26180
|
if (this.#caches.has(cacheName)) {
|
|
26181
|
-
const
|
|
26182
|
-
return new Cache(kConstruct,
|
|
26181
|
+
const cache3 = this.#caches.get(cacheName);
|
|
26182
|
+
return new Cache(kConstruct, cache3);
|
|
26183
26183
|
}
|
|
26184
|
-
const
|
|
26185
|
-
this.#caches.set(cacheName,
|
|
26186
|
-
return new Cache(kConstruct,
|
|
26184
|
+
const cache2 = [];
|
|
26185
|
+
this.#caches.set(cacheName, cache2);
|
|
26186
|
+
return new Cache(kConstruct, cache2);
|
|
26187
26187
|
}
|
|
26188
26188
|
/**
|
|
26189
26189
|
* @see https://w3c.github.io/ServiceWorker/#cache-storage-delete
|
|
@@ -40543,20 +40543,20 @@ var require_compile = __commonJS({
|
|
|
40543
40543
|
var util_1 = require_util7();
|
|
40544
40544
|
var validate_1 = require_validate();
|
|
40545
40545
|
var SchemaEnv = class {
|
|
40546
|
-
constructor(
|
|
40546
|
+
constructor(env5) {
|
|
40547
40547
|
var _a3;
|
|
40548
40548
|
this.refs = {};
|
|
40549
40549
|
this.dynamicAnchors = {};
|
|
40550
40550
|
let schema;
|
|
40551
|
-
if (typeof
|
|
40552
|
-
schema =
|
|
40553
|
-
this.schema =
|
|
40554
|
-
this.schemaId =
|
|
40555
|
-
this.root =
|
|
40556
|
-
this.baseId = (_a3 =
|
|
40557
|
-
this.schemaPath =
|
|
40558
|
-
this.localRefs =
|
|
40559
|
-
this.meta =
|
|
40551
|
+
if (typeof env5.schema == "object")
|
|
40552
|
+
schema = env5.schema;
|
|
40553
|
+
this.schema = env5.schema;
|
|
40554
|
+
this.schemaId = env5.schemaId;
|
|
40555
|
+
this.root = env5.root || this;
|
|
40556
|
+
this.baseId = (_a3 = env5.baseId) !== null && _a3 !== void 0 ? _a3 : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env5.schemaId || "$id"]);
|
|
40557
|
+
this.schemaPath = env5.schemaPath;
|
|
40558
|
+
this.localRefs = env5.localRefs;
|
|
40559
|
+
this.meta = env5.meta;
|
|
40560
40560
|
this.$async = schema === null || schema === void 0 ? void 0 : schema.$async;
|
|
40561
40561
|
this.refs = {};
|
|
40562
40562
|
}
|
|
@@ -40654,7 +40654,7 @@ var require_compile = __commonJS({
|
|
|
40654
40654
|
const schOrFunc = root.refs[ref];
|
|
40655
40655
|
if (schOrFunc)
|
|
40656
40656
|
return schOrFunc;
|
|
40657
|
-
let _sch =
|
|
40657
|
+
let _sch = resolve4.call(this, root, ref);
|
|
40658
40658
|
if (_sch === void 0) {
|
|
40659
40659
|
const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref];
|
|
40660
40660
|
const { schemaId } = this.opts;
|
|
@@ -40681,7 +40681,7 @@ var require_compile = __commonJS({
|
|
|
40681
40681
|
function sameSchemaEnv(s1, s210) {
|
|
40682
40682
|
return s1.schema === s210.schema && s1.root === s210.root && s1.baseId === s210.baseId;
|
|
40683
40683
|
}
|
|
40684
|
-
function
|
|
40684
|
+
function resolve4(root, ref) {
|
|
40685
40685
|
let sch;
|
|
40686
40686
|
while (typeof (sch = this.refs[ref]) == "string")
|
|
40687
40687
|
ref = sch;
|
|
@@ -40740,15 +40740,15 @@ var require_compile = __commonJS({
|
|
|
40740
40740
|
baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId);
|
|
40741
40741
|
}
|
|
40742
40742
|
}
|
|
40743
|
-
let
|
|
40743
|
+
let env5;
|
|
40744
40744
|
if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) {
|
|
40745
40745
|
const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref);
|
|
40746
|
-
|
|
40746
|
+
env5 = resolveSchema.call(this, root, $ref);
|
|
40747
40747
|
}
|
|
40748
40748
|
const { schemaId } = this.opts;
|
|
40749
|
-
|
|
40750
|
-
if (
|
|
40751
|
-
return
|
|
40749
|
+
env5 = env5 || new SchemaEnv({ schema, schemaId, root, baseId });
|
|
40750
|
+
if (env5.schema !== env5.root.schema)
|
|
40751
|
+
return env5;
|
|
40752
40752
|
return void 0;
|
|
40753
40753
|
}
|
|
40754
40754
|
}
|
|
@@ -41256,7 +41256,7 @@ var require_fast_uri = __commonJS({
|
|
|
41256
41256
|
}
|
|
41257
41257
|
return uri;
|
|
41258
41258
|
}
|
|
41259
|
-
function
|
|
41259
|
+
function resolve4(baseURI, relativeURI, options) {
|
|
41260
41260
|
const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
|
|
41261
41261
|
const resolved = resolveComponent(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true);
|
|
41262
41262
|
schemelessOptions.skipEscape = true;
|
|
@@ -41483,7 +41483,7 @@ var require_fast_uri = __commonJS({
|
|
|
41483
41483
|
var fastUri = {
|
|
41484
41484
|
SCHEMES,
|
|
41485
41485
|
normalize,
|
|
41486
|
-
resolve,
|
|
41486
|
+
resolve: resolve4,
|
|
41487
41487
|
resolveComponent,
|
|
41488
41488
|
equal,
|
|
41489
41489
|
serialize,
|
|
@@ -42149,8 +42149,8 @@ var require_ref = __commonJS({
|
|
|
42149
42149
|
schemaType: "string",
|
|
42150
42150
|
code(cxt) {
|
|
42151
42151
|
const { gen, schema: $ref, it: it4 } = cxt;
|
|
42152
|
-
const { baseId, schemaEnv:
|
|
42153
|
-
const { root } =
|
|
42152
|
+
const { baseId, schemaEnv: env5, validateName, opts, self: self2 } = it4;
|
|
42153
|
+
const { root } = env5;
|
|
42154
42154
|
if (($ref === "#" || $ref === "#/") && baseId === root.baseId)
|
|
42155
42155
|
return callRootRef();
|
|
42156
42156
|
const schOrEnv = compile_1.resolveRef.call(self2, root, baseId, $ref);
|
|
@@ -42160,8 +42160,8 @@ var require_ref = __commonJS({
|
|
|
42160
42160
|
return callValidate(schOrEnv);
|
|
42161
42161
|
return inlineRefSchema(schOrEnv);
|
|
42162
42162
|
function callRootRef() {
|
|
42163
|
-
if (
|
|
42164
|
-
return callRef(cxt, validateName,
|
|
42163
|
+
if (env5 === root)
|
|
42164
|
+
return callRef(cxt, validateName, env5, env5.$async);
|
|
42165
42165
|
const rootName = gen.scopeValue("root", { ref: root });
|
|
42166
42166
|
return callRef(cxt, (0, codegen_1._)`${rootName}.validate`, root, root.$async);
|
|
42167
42167
|
}
|
|
@@ -42191,14 +42191,14 @@ var require_ref = __commonJS({
|
|
|
42191
42191
|
exports2.getValidate = getValidate;
|
|
42192
42192
|
function callRef(cxt, v60, sch, $async) {
|
|
42193
42193
|
const { gen, it: it4 } = cxt;
|
|
42194
|
-
const { allErrors, schemaEnv:
|
|
42194
|
+
const { allErrors, schemaEnv: env5, opts } = it4;
|
|
42195
42195
|
const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil;
|
|
42196
42196
|
if ($async)
|
|
42197
42197
|
callAsyncRef();
|
|
42198
42198
|
else
|
|
42199
42199
|
callSyncRef();
|
|
42200
42200
|
function callAsyncRef() {
|
|
42201
|
-
if (!
|
|
42201
|
+
if (!env5.$async)
|
|
42202
42202
|
throw new Error("async schema referenced by sync schema");
|
|
42203
42203
|
const valid = gen.let("valid");
|
|
42204
42204
|
gen.try(() => {
|
|
@@ -44338,6 +44338,479 @@ async function readStream(body, kind, startMs, opts = {}) {
|
|
|
44338
44338
|
return { events, text, close, firstEventMs: firstEventMs < 0 ? 0 : firstEventMs };
|
|
44339
44339
|
}
|
|
44340
44340
|
|
|
44341
|
+
// src/main/secrets/registry.ts
|
|
44342
|
+
var providers = /* @__PURE__ */ new Map();
|
|
44343
|
+
function registerSecretProvider(provider) {
|
|
44344
|
+
providers.set(provider.scheme.toLowerCase(), provider);
|
|
44345
|
+
}
|
|
44346
|
+
function schemeOf(ref) {
|
|
44347
|
+
const m75 = /^([a-z][a-z0-9+.-]*):/i.exec(ref);
|
|
44348
|
+
if (!m75) return null;
|
|
44349
|
+
const scheme = m75[1].toLowerCase();
|
|
44350
|
+
return providers.has(scheme) ? scheme : null;
|
|
44351
|
+
}
|
|
44352
|
+
function hasSecretScheme(ref) {
|
|
44353
|
+
return schemeOf(ref) !== null;
|
|
44354
|
+
}
|
|
44355
|
+
async function resolveExternalSecret(ref, ctx = {}) {
|
|
44356
|
+
const scheme = schemeOf(ref);
|
|
44357
|
+
if (!scheme) return null;
|
|
44358
|
+
const provider = providers.get(scheme);
|
|
44359
|
+
const refBody = ref.slice(scheme.length + 1);
|
|
44360
|
+
return provider.resolve(refBody, ctx);
|
|
44361
|
+
}
|
|
44362
|
+
|
|
44363
|
+
// src/main/secrets/providers/vault.ts
|
|
44364
|
+
var import_node_fs = require("node:fs");
|
|
44365
|
+
var import_node_os = require("node:os");
|
|
44366
|
+
var import_node_path = require("node:path");
|
|
44367
|
+
|
|
44368
|
+
// src/main/secrets/config.ts
|
|
44369
|
+
var current;
|
|
44370
|
+
function getSecretsConfig() {
|
|
44371
|
+
return current;
|
|
44372
|
+
}
|
|
44373
|
+
|
|
44374
|
+
// src/main/secrets/providers/vault.ts
|
|
44375
|
+
function env(...names) {
|
|
44376
|
+
for (const n63 of names) {
|
|
44377
|
+
const v60 = process.env[n63];
|
|
44378
|
+
if (v60 !== void 0 && v60 !== "") return v60;
|
|
44379
|
+
}
|
|
44380
|
+
return void 0;
|
|
44381
|
+
}
|
|
44382
|
+
function readFileTrim(path) {
|
|
44383
|
+
try {
|
|
44384
|
+
return (0, import_node_fs.readFileSync)(path, "utf8").trim() || void 0;
|
|
44385
|
+
} catch {
|
|
44386
|
+
return void 0;
|
|
44387
|
+
}
|
|
44388
|
+
}
|
|
44389
|
+
function resolveConn() {
|
|
44390
|
+
const cfg = getSecretsConfig()?.vault ?? {};
|
|
44391
|
+
const address = env("VAULT_ADDR", "API_SPECTOR_VAULT_ADDR") ?? cfg.address;
|
|
44392
|
+
if (!address) {
|
|
44393
|
+
throw new Error("Vault is not configured: set VAULT_ADDR (or settings.secrets.vault.address)");
|
|
44394
|
+
}
|
|
44395
|
+
const token = env("VAULT_TOKEN", "API_SPECTOR_VAULT_TOKEN") ?? readFileTrim((0, import_node_path.join)((0, import_node_os.homedir)(), ".vault-token"));
|
|
44396
|
+
const roleId = env("VAULT_ROLE_ID", "API_SPECTOR_VAULT_ROLE_ID") ?? cfg.roleId;
|
|
44397
|
+
const secretId = env("VAULT_SECRET_ID", "API_SPECTOR_VAULT_SECRET_ID");
|
|
44398
|
+
const jwt = env("VAULT_JWT", "API_SPECTOR_VAULT_JWT") ?? (env("VAULT_JWT_PATH", "API_SPECTOR_VAULT_JWT_PATH") ? readFileTrim(env("VAULT_JWT_PATH", "API_SPECTOR_VAULT_JWT_PATH")) : void 0);
|
|
44399
|
+
const jwtRole = env("VAULT_JWT_ROLE", "API_SPECTOR_VAULT_JWT_ROLE") ?? cfg.jwtRole;
|
|
44400
|
+
const explicit = env("VAULT_AUTH_METHOD", "API_SPECTOR_VAULT_AUTH_METHOD") ?? cfg.authMethod;
|
|
44401
|
+
const authMethod = explicit ?? (token ? "token" : roleId ? "approle" : jwt ? "jwt" : "token");
|
|
44402
|
+
return {
|
|
44403
|
+
address: address.replace(/\/+$/, ""),
|
|
44404
|
+
namespace: env("VAULT_NAMESPACE", "API_SPECTOR_VAULT_NAMESPACE") ?? cfg.namespace,
|
|
44405
|
+
authMethod,
|
|
44406
|
+
token,
|
|
44407
|
+
roleId,
|
|
44408
|
+
secretId,
|
|
44409
|
+
jwt,
|
|
44410
|
+
jwtRole,
|
|
44411
|
+
loginMount: cfg.loginMount,
|
|
44412
|
+
kvVersion: env("VAULT_KV_VERSION", "API_SPECTOR_VAULT_KV_VERSION") ?? cfg.kvVersion ?? "auto",
|
|
44413
|
+
skipVerify: (env("VAULT_SKIP_VERIFY", "API_SPECTOR_VAULT_SKIP_VERIFY") ?? "").toLowerCase() === "true" || cfg.skipVerify === true,
|
|
44414
|
+
caPath: env("VAULT_CACERT", "API_SPECTOR_VAULT_CACERT")
|
|
44415
|
+
};
|
|
44416
|
+
}
|
|
44417
|
+
var cachedToken = null;
|
|
44418
|
+
var secretCache = /* @__PURE__ */ new Map();
|
|
44419
|
+
var _dispatcher;
|
|
44420
|
+
var _dispatcherKey = "";
|
|
44421
|
+
async function dispatcherFor(conn) {
|
|
44422
|
+
if (!conn.skipVerify && !conn.caPath) return void 0;
|
|
44423
|
+
const key = `${conn.skipVerify}|${conn.caPath ?? ""}`;
|
|
44424
|
+
if (_dispatcher && _dispatcherKey === key) return _dispatcher;
|
|
44425
|
+
const { Agent: Agent2 } = await Promise.resolve().then(() => __toESM(require_undici()));
|
|
44426
|
+
const connect = {};
|
|
44427
|
+
if (conn.skipVerify) connect.rejectUnauthorized = false;
|
|
44428
|
+
if (conn.caPath) {
|
|
44429
|
+
const ca7 = readFileTrim(conn.caPath);
|
|
44430
|
+
if (ca7) connect.ca = ca7;
|
|
44431
|
+
}
|
|
44432
|
+
_dispatcher = new Agent2({ connect });
|
|
44433
|
+
_dispatcherKey = key;
|
|
44434
|
+
return _dispatcher;
|
|
44435
|
+
}
|
|
44436
|
+
async function vaultFetch(conn, path, init = {}) {
|
|
44437
|
+
const headers = { ...init.headers };
|
|
44438
|
+
if (conn.namespace) headers["X-Vault-Namespace"] = conn.namespace;
|
|
44439
|
+
if (init.token) headers["X-Vault-Token"] = init.token;
|
|
44440
|
+
const dispatcher = await dispatcherFor(conn);
|
|
44441
|
+
const res = await fetch(`${conn.address}/v1/${path}`, {
|
|
44442
|
+
...init,
|
|
44443
|
+
headers,
|
|
44444
|
+
// undici honours `dispatcher`; the field is not in the DOM RequestInit type.
|
|
44445
|
+
...dispatcher ? { dispatcher } : {}
|
|
44446
|
+
});
|
|
44447
|
+
if (!res.ok) {
|
|
44448
|
+
const body = await res.text().catch(() => "");
|
|
44449
|
+
throw new Error(`Vault ${res.status} on /v1/${path}: ${body.slice(0, 300)}`);
|
|
44450
|
+
}
|
|
44451
|
+
return res.json();
|
|
44452
|
+
}
|
|
44453
|
+
async function clientToken(conn) {
|
|
44454
|
+
if (conn.authMethod === "token") {
|
|
44455
|
+
if (!conn.token) {
|
|
44456
|
+
throw new Error("Vault token auth selected but no token found (set VAULT_TOKEN or run `vault login`)");
|
|
44457
|
+
}
|
|
44458
|
+
return conn.token;
|
|
44459
|
+
}
|
|
44460
|
+
const now = Date.now();
|
|
44461
|
+
if (cachedToken && cachedToken.expiresAt > now + 5e3) return cachedToken.value;
|
|
44462
|
+
let mount;
|
|
44463
|
+
let body;
|
|
44464
|
+
if (conn.authMethod === "approle") {
|
|
44465
|
+
if (!conn.roleId || !conn.secretId) {
|
|
44466
|
+
throw new Error("Vault AppRole auth needs VAULT_ROLE_ID and VAULT_SECRET_ID");
|
|
44467
|
+
}
|
|
44468
|
+
mount = conn.loginMount ?? "approle";
|
|
44469
|
+
body = { role_id: conn.roleId, secret_id: conn.secretId };
|
|
44470
|
+
} else {
|
|
44471
|
+
if (!conn.jwt || !conn.jwtRole) {
|
|
44472
|
+
throw new Error("Vault JWT/OIDC auth needs a JWT (VAULT_JWT or VAULT_JWT_PATH) and a role (VAULT_JWT_ROLE)");
|
|
44473
|
+
}
|
|
44474
|
+
mount = conn.loginMount ?? "jwt";
|
|
44475
|
+
body = { role: conn.jwtRole, jwt: conn.jwt };
|
|
44476
|
+
}
|
|
44477
|
+
const json = await vaultFetch(conn, `auth/${mount}/login`, {
|
|
44478
|
+
method: "POST",
|
|
44479
|
+
headers: { "content-type": "application/json" },
|
|
44480
|
+
body: JSON.stringify(body)
|
|
44481
|
+
});
|
|
44482
|
+
const token = json?.auth?.client_token;
|
|
44483
|
+
if (!token) throw new Error("Vault login did not return a client token");
|
|
44484
|
+
const ttl = Number(json?.auth?.lease_duration ?? 0);
|
|
44485
|
+
cachedToken = { value: token, expiresAt: ttl > 0 ? now + ttl * 1e3 : now + 5 * 6e4 };
|
|
44486
|
+
return token;
|
|
44487
|
+
}
|
|
44488
|
+
async function readSecret(refBody) {
|
|
44489
|
+
const hash = refBody.lastIndexOf("#");
|
|
44490
|
+
if (hash < 0) {
|
|
44491
|
+
throw new Error(`Vault reference must be 'vault:<path>#<key>' (got 'vault:${refBody}')`);
|
|
44492
|
+
}
|
|
44493
|
+
const path = refBody.slice(0, hash).replace(/^\/+/, "");
|
|
44494
|
+
const key = refBody.slice(hash + 1);
|
|
44495
|
+
if (!path || !key) {
|
|
44496
|
+
throw new Error(`Vault reference must be 'vault:<path>#<key>' (got 'vault:${refBody}')`);
|
|
44497
|
+
}
|
|
44498
|
+
const conn = resolveConn();
|
|
44499
|
+
const cacheKey = `${conn.address}|${conn.namespace ?? ""}|${path}`;
|
|
44500
|
+
const now = Date.now();
|
|
44501
|
+
let bag;
|
|
44502
|
+
const hit = secretCache.get(cacheKey);
|
|
44503
|
+
if (hit && hit.expiresAt > now) {
|
|
44504
|
+
bag = hit.bag;
|
|
44505
|
+
} else {
|
|
44506
|
+
const json = await vaultFetch(conn, path, { token: await clientToken(conn) });
|
|
44507
|
+
const isV2 = conn.kvVersion === "2" || conn.kvVersion === "auto" && json?.data?.data !== void 0 && json?.data?.metadata !== void 0;
|
|
44508
|
+
bag = isV2 ? json?.data?.data : json?.data;
|
|
44509
|
+
const lease = Number(json?.lease_duration ?? 0);
|
|
44510
|
+
if (bag) {
|
|
44511
|
+
secretCache.set(cacheKey, { bag, expiresAt: lease > 0 ? now + lease * 1e3 : now + 5 * 6e4 });
|
|
44512
|
+
}
|
|
44513
|
+
}
|
|
44514
|
+
if (!bag || !(key in bag)) {
|
|
44515
|
+
throw new Error(`Vault secret at '${path}' has no key '${key}'`);
|
|
44516
|
+
}
|
|
44517
|
+
return String(bag[key]);
|
|
44518
|
+
}
|
|
44519
|
+
var vaultProvider = {
|
|
44520
|
+
scheme: "vault",
|
|
44521
|
+
resolve: (refBody) => readSecret(refBody)
|
|
44522
|
+
};
|
|
44523
|
+
|
|
44524
|
+
// src/main/secrets/providers/sigv4.ts
|
|
44525
|
+
var import_node_crypto = require("node:crypto");
|
|
44526
|
+
function hmac(key, data) {
|
|
44527
|
+
return (0, import_node_crypto.createHmac)("sha256", key).update(data, "utf8").digest();
|
|
44528
|
+
}
|
|
44529
|
+
function sha256hex(data) {
|
|
44530
|
+
return (0, import_node_crypto.createHash)("sha256").update(data, "utf8").digest("hex");
|
|
44531
|
+
}
|
|
44532
|
+
function signSigV4(input) {
|
|
44533
|
+
const amzDate = input.now.toISOString().replace(/[:-]|\.\d{3}/g, "");
|
|
44534
|
+
const dateStamp = amzDate.slice(0, 8);
|
|
44535
|
+
const headers = { ...input.headers, host: input.host, "x-amz-date": amzDate };
|
|
44536
|
+
if (input.sessionToken) headers["x-amz-security-token"] = input.sessionToken;
|
|
44537
|
+
const lower = {};
|
|
44538
|
+
for (const k68 of Object.keys(headers)) lower[k68.toLowerCase()] = headers[k68].trim().replace(/\s+/g, " ");
|
|
44539
|
+
const sortedKeys = Object.keys(lower).sort();
|
|
44540
|
+
const canonicalHeaders = sortedKeys.map((k68) => `${k68}:${lower[k68]}
|
|
44541
|
+
`).join("");
|
|
44542
|
+
const signedHeaders = sortedKeys.join(";");
|
|
44543
|
+
const payloadHash = sha256hex(input.body);
|
|
44544
|
+
const canonicalRequest = [input.method, input.path, input.query ?? "", canonicalHeaders, signedHeaders, payloadHash].join("\n");
|
|
44545
|
+
const scope = `${dateStamp}/${input.region}/${input.service}/aws4_request`;
|
|
44546
|
+
const stringToSign = ["AWS4-HMAC-SHA256", amzDate, scope, sha256hex(canonicalRequest)].join("\n");
|
|
44547
|
+
const kDate = hmac(`AWS4${input.secretAccessKey}`, dateStamp);
|
|
44548
|
+
const kRegion = hmac(kDate, input.region);
|
|
44549
|
+
const kService = hmac(kRegion, input.service);
|
|
44550
|
+
const kSigning = hmac(kService, "aws4_request");
|
|
44551
|
+
const signature = (0, import_node_crypto.createHmac)("sha256", kSigning).update(stringToSign, "utf8").digest("hex");
|
|
44552
|
+
return {
|
|
44553
|
+
...headers,
|
|
44554
|
+
Authorization: `AWS4-HMAC-SHA256 Credential=${input.accessKeyId}/${scope}, SignedHeaders=${signedHeaders}, Signature=${signature}`
|
|
44555
|
+
};
|
|
44556
|
+
}
|
|
44557
|
+
|
|
44558
|
+
// src/main/secrets/providers/aws.ts
|
|
44559
|
+
function env2(...names) {
|
|
44560
|
+
for (const n63 of names) {
|
|
44561
|
+
const v60 = process.env[n63];
|
|
44562
|
+
if (v60 !== void 0 && v60 !== "") return v60;
|
|
44563
|
+
}
|
|
44564
|
+
return void 0;
|
|
44565
|
+
}
|
|
44566
|
+
function resolveConn2() {
|
|
44567
|
+
const cfg = getSecretsConfig()?.aws ?? {};
|
|
44568
|
+
const region = env2("AWS_REGION", "AWS_DEFAULT_REGION", "API_SPECTOR_AWS_REGION") ?? cfg.region;
|
|
44569
|
+
const accessKeyId = env2("AWS_ACCESS_KEY_ID");
|
|
44570
|
+
const secretAccessKey = env2("AWS_SECRET_ACCESS_KEY");
|
|
44571
|
+
if (!region) throw new Error("AWS Secrets Manager: no region (set AWS_REGION or settings.secrets.aws.region)");
|
|
44572
|
+
if (!accessKeyId || !secretAccessKey) {
|
|
44573
|
+
throw new Error("AWS Secrets Manager: no credentials (set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY)");
|
|
44574
|
+
}
|
|
44575
|
+
return { region, accessKeyId, secretAccessKey, sessionToken: env2("AWS_SESSION_TOKEN") };
|
|
44576
|
+
}
|
|
44577
|
+
var cache = /* @__PURE__ */ new Map();
|
|
44578
|
+
async function getSecretString(conn, secretId) {
|
|
44579
|
+
const cacheKey = `${conn.region}|${secretId}`;
|
|
44580
|
+
const now = Date.now();
|
|
44581
|
+
const hit = cache.get(cacheKey);
|
|
44582
|
+
if (hit && hit.expiresAt > now) return hit.raw;
|
|
44583
|
+
const host = `secretsmanager.${conn.region}.amazonaws.com`;
|
|
44584
|
+
const body = JSON.stringify({ SecretId: secretId });
|
|
44585
|
+
const headers = signSigV4({
|
|
44586
|
+
method: "POST",
|
|
44587
|
+
host,
|
|
44588
|
+
path: "/",
|
|
44589
|
+
headers: {
|
|
44590
|
+
"content-type": "application/x-amz-json-1.1",
|
|
44591
|
+
"x-amz-target": "secretsmanager.GetSecretValue"
|
|
44592
|
+
},
|
|
44593
|
+
body,
|
|
44594
|
+
service: "secretsmanager",
|
|
44595
|
+
region: conn.region,
|
|
44596
|
+
accessKeyId: conn.accessKeyId,
|
|
44597
|
+
secretAccessKey: conn.secretAccessKey,
|
|
44598
|
+
sessionToken: conn.sessionToken,
|
|
44599
|
+
now: new Date(now)
|
|
44600
|
+
});
|
|
44601
|
+
const res = await fetch(`https://${host}/`, { method: "POST", headers, body });
|
|
44602
|
+
if (!res.ok) {
|
|
44603
|
+
const text = await res.text().catch(() => "");
|
|
44604
|
+
throw new Error(`AWS Secrets Manager ${res.status} for '${secretId}': ${text.slice(0, 300)}`);
|
|
44605
|
+
}
|
|
44606
|
+
const json = await res.json();
|
|
44607
|
+
const raw = json?.SecretString;
|
|
44608
|
+
if (raw === void 0) throw new Error(`AWS secret '${secretId}' has no SecretString (binary secrets are not supported)`);
|
|
44609
|
+
cache.set(cacheKey, { raw, expiresAt: now + 5 * 6e4 });
|
|
44610
|
+
return raw;
|
|
44611
|
+
}
|
|
44612
|
+
async function resolve(refBody) {
|
|
44613
|
+
const hash = refBody.lastIndexOf("#");
|
|
44614
|
+
const secretId = hash < 0 ? refBody : refBody.slice(0, hash);
|
|
44615
|
+
const key = hash < 0 ? null : refBody.slice(hash + 1);
|
|
44616
|
+
if (!secretId) throw new Error(`AWS reference must be 'aws:<secretId>[#<key>]' (got 'aws:${refBody}')`);
|
|
44617
|
+
const raw = await getSecretString(resolveConn2(), secretId);
|
|
44618
|
+
if (key === null) return raw;
|
|
44619
|
+
let parsed;
|
|
44620
|
+
try {
|
|
44621
|
+
parsed = JSON.parse(raw);
|
|
44622
|
+
} catch {
|
|
44623
|
+
throw new Error(`AWS secret '${secretId}' is not JSON, so key '${key}' cannot be read (drop the '#${key}')`);
|
|
44624
|
+
}
|
|
44625
|
+
if (!(key in parsed)) throw new Error(`AWS secret '${secretId}' has no key '${key}'`);
|
|
44626
|
+
return String(parsed[key]);
|
|
44627
|
+
}
|
|
44628
|
+
var awsSecretsProvider = {
|
|
44629
|
+
scheme: "aws",
|
|
44630
|
+
resolve: (refBody) => resolve(refBody)
|
|
44631
|
+
};
|
|
44632
|
+
|
|
44633
|
+
// src/main/secrets/providers/azure.ts
|
|
44634
|
+
function env3(...names) {
|
|
44635
|
+
for (const n63 of names) {
|
|
44636
|
+
const v60 = process.env[n63];
|
|
44637
|
+
if (v60 !== void 0 && v60 !== "") return v60;
|
|
44638
|
+
}
|
|
44639
|
+
return void 0;
|
|
44640
|
+
}
|
|
44641
|
+
function resolveConn3() {
|
|
44642
|
+
const cfg = getSecretsConfig()?.azure ?? {};
|
|
44643
|
+
const tenantId = env3("AZURE_TENANT_ID", "API_SPECTOR_AZURE_TENANT_ID") ?? cfg.tenantId;
|
|
44644
|
+
const clientId = env3("AZURE_CLIENT_ID", "API_SPECTOR_AZURE_CLIENT_ID") ?? cfg.clientId;
|
|
44645
|
+
const clientSecret = env3("AZURE_CLIENT_SECRET", "API_SPECTOR_AZURE_CLIENT_SECRET");
|
|
44646
|
+
if (!tenantId || !clientId || !clientSecret) {
|
|
44647
|
+
throw new Error("Azure Key Vault: set AZURE_TENANT_ID, AZURE_CLIENT_ID and AZURE_CLIENT_SECRET");
|
|
44648
|
+
}
|
|
44649
|
+
return { tenantId, clientId, clientSecret, defaultVault: cfg.vault };
|
|
44650
|
+
}
|
|
44651
|
+
var cachedToken2 = null;
|
|
44652
|
+
var secretCache2 = /* @__PURE__ */ new Map();
|
|
44653
|
+
async function accessToken(conn) {
|
|
44654
|
+
const now = Date.now();
|
|
44655
|
+
if (cachedToken2 && cachedToken2.expiresAt > now + 3e4) return cachedToken2.value;
|
|
44656
|
+
const form = new URLSearchParams({
|
|
44657
|
+
grant_type: "client_credentials",
|
|
44658
|
+
client_id: conn.clientId,
|
|
44659
|
+
client_secret: conn.clientSecret,
|
|
44660
|
+
scope: "https://vault.azure.net/.default"
|
|
44661
|
+
});
|
|
44662
|
+
const res = await fetch(`https://login.microsoftonline.com/${conn.tenantId}/oauth2/v2.0/token`, {
|
|
44663
|
+
method: "POST",
|
|
44664
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
44665
|
+
body: form.toString()
|
|
44666
|
+
});
|
|
44667
|
+
if (!res.ok) {
|
|
44668
|
+
const text = await res.text().catch(() => "");
|
|
44669
|
+
throw new Error(`Azure AD token ${res.status}: ${text.slice(0, 300)}`);
|
|
44670
|
+
}
|
|
44671
|
+
const json = await res.json();
|
|
44672
|
+
const token = json?.access_token;
|
|
44673
|
+
if (!token) throw new Error("Azure AD did not return an access token");
|
|
44674
|
+
const ttl = Number(json?.expires_in ?? 0);
|
|
44675
|
+
cachedToken2 = { value: token, expiresAt: ttl > 0 ? now + ttl * 1e3 : now + 5 * 6e4 };
|
|
44676
|
+
return token;
|
|
44677
|
+
}
|
|
44678
|
+
function secretUrl(refBody, defaultVault) {
|
|
44679
|
+
if (/^https?:\/\//i.test(refBody)) {
|
|
44680
|
+
return refBody.split("#")[0];
|
|
44681
|
+
}
|
|
44682
|
+
const parts = refBody.replace(/^\/+/, "").split("/");
|
|
44683
|
+
let vault;
|
|
44684
|
+
let name;
|
|
44685
|
+
let version = "";
|
|
44686
|
+
if (parts.length >= 2) {
|
|
44687
|
+
[vault, name, version = ""] = parts;
|
|
44688
|
+
} else if (parts.length === 1 && defaultVault) {
|
|
44689
|
+
vault = defaultVault;
|
|
44690
|
+
name = parts[0];
|
|
44691
|
+
} else {
|
|
44692
|
+
throw new Error(`Azure reference must be 'azure:<vault>/<secret>[/<version>]' (got 'azure:${refBody}')`);
|
|
44693
|
+
}
|
|
44694
|
+
const base = /^https?:\/\//i.test(vault) ? vault.replace(/\/+$/, "") : `https://${vault}.vault.azure.net`;
|
|
44695
|
+
const path = version ? `secrets/${name}/${version}` : `secrets/${name}`;
|
|
44696
|
+
return `${base}/${path}?api-version=7.4`;
|
|
44697
|
+
}
|
|
44698
|
+
async function resolve2(refBody) {
|
|
44699
|
+
const conn = resolveConn3();
|
|
44700
|
+
const url = secretUrl(refBody, conn.defaultVault);
|
|
44701
|
+
const now = Date.now();
|
|
44702
|
+
const hit = secretCache2.get(url);
|
|
44703
|
+
if (hit && hit.expiresAt > now) return hit.value;
|
|
44704
|
+
const res = await fetch(url, { headers: { authorization: `Bearer ${await accessToken(conn)}` } });
|
|
44705
|
+
if (!res.ok) {
|
|
44706
|
+
const text = await res.text().catch(() => "");
|
|
44707
|
+
throw new Error(`Azure Key Vault ${res.status} for '${refBody}': ${text.slice(0, 300)}`);
|
|
44708
|
+
}
|
|
44709
|
+
const json = await res.json();
|
|
44710
|
+
const value = json?.value;
|
|
44711
|
+
if (value === void 0) throw new Error(`Azure Key Vault secret '${refBody}' has no value`);
|
|
44712
|
+
secretCache2.set(url, { value, expiresAt: now + 5 * 6e4 });
|
|
44713
|
+
return value;
|
|
44714
|
+
}
|
|
44715
|
+
var azureKeyVaultProvider = {
|
|
44716
|
+
scheme: "azure",
|
|
44717
|
+
resolve: (refBody) => resolve2(refBody)
|
|
44718
|
+
};
|
|
44719
|
+
|
|
44720
|
+
// src/main/secrets/providers/onepassword.ts
|
|
44721
|
+
function env4(...names) {
|
|
44722
|
+
for (const n63 of names) {
|
|
44723
|
+
const v60 = process.env[n63];
|
|
44724
|
+
if (v60 !== void 0 && v60 !== "") return v60;
|
|
44725
|
+
}
|
|
44726
|
+
return void 0;
|
|
44727
|
+
}
|
|
44728
|
+
function resolveConn4() {
|
|
44729
|
+
const cfg = getSecretsConfig()?.onePassword ?? {};
|
|
44730
|
+
const host = env4("OP_CONNECT_HOST", "API_SPECTOR_OP_CONNECT_HOST") ?? cfg.connectHost;
|
|
44731
|
+
const token = env4("OP_CONNECT_TOKEN", "API_SPECTOR_OP_CONNECT_TOKEN");
|
|
44732
|
+
if (!host || !token) {
|
|
44733
|
+
throw new Error("1Password: set OP_CONNECT_HOST and OP_CONNECT_TOKEN (1Password Connect)");
|
|
44734
|
+
}
|
|
44735
|
+
return { host: host.replace(/\/+$/, ""), token };
|
|
44736
|
+
}
|
|
44737
|
+
var itemCache = /* @__PURE__ */ new Map();
|
|
44738
|
+
var idCache = /* @__PURE__ */ new Map();
|
|
44739
|
+
async function opGet(conn, path) {
|
|
44740
|
+
const res = await fetch(`${conn.host}${path}`, { headers: { authorization: `Bearer ${conn.token}` } });
|
|
44741
|
+
if (!res.ok) {
|
|
44742
|
+
const text = await res.text().catch(() => "");
|
|
44743
|
+
throw new Error(`1Password Connect ${res.status} on ${path}: ${text.slice(0, 300)}`);
|
|
44744
|
+
}
|
|
44745
|
+
return res.json();
|
|
44746
|
+
}
|
|
44747
|
+
var isId = (s71) => /^[a-z0-9]{26}$/i.test(s71);
|
|
44748
|
+
async function vaultId(conn, vault) {
|
|
44749
|
+
if (isId(vault)) return vault;
|
|
44750
|
+
const cacheKey = `vaults:${vault}`;
|
|
44751
|
+
const cached = idCache.get(cacheKey);
|
|
44752
|
+
if (cached) return cached;
|
|
44753
|
+
const list = await opGet(conn, `/v1/vaults?filter=${encodeURIComponent(`name eq "${vault}"`)}`);
|
|
44754
|
+
const id = Array.isArray(list) && list[0]?.id;
|
|
44755
|
+
if (!id) throw new Error(`1Password: vault '${vault}' not found`);
|
|
44756
|
+
idCache.set(cacheKey, id);
|
|
44757
|
+
return id;
|
|
44758
|
+
}
|
|
44759
|
+
async function itemId(conn, vid, item) {
|
|
44760
|
+
if (isId(item)) return item;
|
|
44761
|
+
const cacheKey = `items:${vid}:${item}`;
|
|
44762
|
+
const cached = idCache.get(cacheKey);
|
|
44763
|
+
if (cached) return cached;
|
|
44764
|
+
const list = await opGet(conn, `/v1/vaults/${vid}/items?filter=${encodeURIComponent(`title eq "${item}"`)}`);
|
|
44765
|
+
const id = Array.isArray(list) && list[0]?.id;
|
|
44766
|
+
if (!id) throw new Error(`1Password: item '${item}' not found in vault`);
|
|
44767
|
+
idCache.set(cacheKey, id);
|
|
44768
|
+
return id;
|
|
44769
|
+
}
|
|
44770
|
+
async function resolve3(refBody) {
|
|
44771
|
+
const parts = refBody.replace(/^\/\//, "").replace(/^\/+/, "").split("/").filter(Boolean);
|
|
44772
|
+
if (parts.length < 3) {
|
|
44773
|
+
throw new Error(`1Password reference must be 'op://<vault>/<item>/<field>' (got 'op:${refBody}')`);
|
|
44774
|
+
}
|
|
44775
|
+
const [vault, item, ...rest] = parts;
|
|
44776
|
+
const sectionLabel = rest.length >= 2 ? rest[0] : null;
|
|
44777
|
+
const fieldLabel = rest[rest.length - 1];
|
|
44778
|
+
const conn = resolveConn4();
|
|
44779
|
+
const vid = await vaultId(conn, vault);
|
|
44780
|
+
const iid = await itemId(conn, vid, item);
|
|
44781
|
+
const cacheKey = `${vid}/${iid}`;
|
|
44782
|
+
const now = Date.now();
|
|
44783
|
+
let fields;
|
|
44784
|
+
const hit = itemCache.get(cacheKey);
|
|
44785
|
+
if (hit && hit.expiresAt > now) {
|
|
44786
|
+
fields = hit.fields;
|
|
44787
|
+
} else {
|
|
44788
|
+
const doc = await opGet(conn, `/v1/vaults/${vid}/items/${iid}`);
|
|
44789
|
+
fields = Array.isArray(doc?.fields) ? doc.fields : [];
|
|
44790
|
+
itemCache.set(cacheKey, { fields, expiresAt: now + 5 * 6e4 });
|
|
44791
|
+
}
|
|
44792
|
+
const match = fields.find((f74) => {
|
|
44793
|
+
const labelOk = String(f74?.label ?? "").toLowerCase() === fieldLabel.toLowerCase() || f74?.id === fieldLabel;
|
|
44794
|
+
if (!labelOk) return false;
|
|
44795
|
+
if (!sectionLabel) return true;
|
|
44796
|
+
return String(f74?.section?.label ?? "").toLowerCase() === sectionLabel.toLowerCase();
|
|
44797
|
+
});
|
|
44798
|
+
if (!match || match.value === void 0) {
|
|
44799
|
+
throw new Error(`1Password: field '${fieldLabel}' not found on item '${item}'`);
|
|
44800
|
+
}
|
|
44801
|
+
return String(match.value);
|
|
44802
|
+
}
|
|
44803
|
+
var onePasswordProvider = {
|
|
44804
|
+
scheme: "op",
|
|
44805
|
+
resolve: (refBody) => resolve3(refBody)
|
|
44806
|
+
};
|
|
44807
|
+
|
|
44808
|
+
// src/main/secrets/index.ts
|
|
44809
|
+
registerSecretProvider(vaultProvider);
|
|
44810
|
+
registerSecretProvider(awsSecretsProvider);
|
|
44811
|
+
registerSecretProvider(azureKeyVaultProvider);
|
|
44812
|
+
registerSecretProvider(onePasswordProvider);
|
|
44813
|
+
|
|
44341
44814
|
// src/main/ipc/secret-handler.ts
|
|
44342
44815
|
var secretStore = {};
|
|
44343
44816
|
function getSafeStorage() {
|
|
@@ -44350,6 +44823,9 @@ function getSafeStorage() {
|
|
|
44350
44823
|
}
|
|
44351
44824
|
}
|
|
44352
44825
|
async function getSecret(ref) {
|
|
44826
|
+
if (hasSecretScheme(ref)) {
|
|
44827
|
+
return resolveExternalSecret(ref);
|
|
44828
|
+
}
|
|
44353
44829
|
const stored = secretStore[ref];
|
|
44354
44830
|
if (stored) {
|
|
44355
44831
|
const ss = getSafeStorage();
|
|
@@ -44488,10 +44964,10 @@ var Hooks = class {
|
|
|
44488
44964
|
* @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.
|
|
44489
44965
|
* @public
|
|
44490
44966
|
*/
|
|
44491
|
-
run(name,
|
|
44967
|
+
run(name, env5) {
|
|
44492
44968
|
this[name] = this[name] || [];
|
|
44493
44969
|
this[name].forEach(function(callback) {
|
|
44494
|
-
callback.call(
|
|
44970
|
+
callback.call(env5 && env5.context ? env5.context : env5, env5);
|
|
44495
44971
|
});
|
|
44496
44972
|
}
|
|
44497
44973
|
};
|
|
@@ -44744,12 +45220,12 @@ var Jsep = class _Jsep {
|
|
|
44744
45220
|
*/
|
|
44745
45221
|
runHook(name, node) {
|
|
44746
45222
|
if (_Jsep.hooks[name]) {
|
|
44747
|
-
const
|
|
45223
|
+
const env5 = {
|
|
44748
45224
|
context: this,
|
|
44749
45225
|
node
|
|
44750
45226
|
};
|
|
44751
|
-
_Jsep.hooks.run(name,
|
|
44752
|
-
return
|
|
45227
|
+
_Jsep.hooks.run(name, env5);
|
|
45228
|
+
return env5.node;
|
|
44753
45229
|
}
|
|
44754
45230
|
return node;
|
|
44755
45231
|
}
|
|
@@ -44760,14 +45236,14 @@ var Jsep = class _Jsep {
|
|
|
44760
45236
|
*/
|
|
44761
45237
|
searchHook(name) {
|
|
44762
45238
|
if (_Jsep.hooks[name]) {
|
|
44763
|
-
const
|
|
45239
|
+
const env5 = {
|
|
44764
45240
|
context: this
|
|
44765
45241
|
};
|
|
44766
45242
|
_Jsep.hooks[name].find(function(callback) {
|
|
44767
|
-
callback.call(
|
|
44768
|
-
return
|
|
45243
|
+
callback.call(env5.context, env5);
|
|
45244
|
+
return env5.node;
|
|
44769
45245
|
});
|
|
44770
|
-
return
|
|
45246
|
+
return env5.node;
|
|
44771
45247
|
}
|
|
44772
45248
|
}
|
|
44773
45249
|
/**
|
|
@@ -45365,10 +45841,10 @@ var CONDITIONAL_EXP = "ConditionalExpression";
|
|
|
45365
45841
|
var ternary = {
|
|
45366
45842
|
name: "ternary",
|
|
45367
45843
|
init(jsep2) {
|
|
45368
|
-
jsep2.hooks.add("after-expression", function gobbleTernary(
|
|
45369
|
-
if (
|
|
45844
|
+
jsep2.hooks.add("after-expression", function gobbleTernary(env5) {
|
|
45845
|
+
if (env5.node && this.code === jsep2.QUMARK_CODE) {
|
|
45370
45846
|
this.index++;
|
|
45371
|
-
const test =
|
|
45847
|
+
const test = env5.node;
|
|
45372
45848
|
const consequent = this.gobbleExpression();
|
|
45373
45849
|
if (!consequent) {
|
|
45374
45850
|
this.throwError("Expected expression");
|
|
@@ -45380,7 +45856,7 @@ var ternary = {
|
|
|
45380
45856
|
if (!alternate) {
|
|
45381
45857
|
this.throwError("Expected expression");
|
|
45382
45858
|
}
|
|
45383
|
-
|
|
45859
|
+
env5.node = {
|
|
45384
45860
|
type: CONDITIONAL_EXP,
|
|
45385
45861
|
test,
|
|
45386
45862
|
consequent,
|
|
@@ -45391,9 +45867,9 @@ var ternary = {
|
|
|
45391
45867
|
while (newTest.right.operator && jsep2.binary_ops[newTest.right.operator] <= 0.9) {
|
|
45392
45868
|
newTest = newTest.right;
|
|
45393
45869
|
}
|
|
45394
|
-
|
|
45395
|
-
newTest.right =
|
|
45396
|
-
|
|
45870
|
+
env5.node.test = newTest.right;
|
|
45871
|
+
newTest.right = env5.node;
|
|
45872
|
+
env5.node = test;
|
|
45397
45873
|
}
|
|
45398
45874
|
} else {
|
|
45399
45875
|
this.throwError("Expected :");
|
|
@@ -45408,7 +45884,7 @@ var BSLASH_CODE = 92;
|
|
|
45408
45884
|
var index = {
|
|
45409
45885
|
name: "regex",
|
|
45410
45886
|
init(jsep2) {
|
|
45411
|
-
jsep2.hooks.add("gobble-token", function gobbleRegexLiteral(
|
|
45887
|
+
jsep2.hooks.add("gobble-token", function gobbleRegexLiteral(env5) {
|
|
45412
45888
|
if (this.code === FSLASH_CODE) {
|
|
45413
45889
|
const patternIndex = ++this.index;
|
|
45414
45890
|
let inCharSet = false;
|
|
@@ -45430,13 +45906,13 @@ var index = {
|
|
|
45430
45906
|
} catch (e20) {
|
|
45431
45907
|
this.throwError(e20.message);
|
|
45432
45908
|
}
|
|
45433
|
-
|
|
45909
|
+
env5.node = {
|
|
45434
45910
|
type: jsep2.LITERAL,
|
|
45435
45911
|
value,
|
|
45436
45912
|
raw: this.expr.slice(patternIndex - 1, this.index)
|
|
45437
45913
|
};
|
|
45438
|
-
|
|
45439
|
-
return
|
|
45914
|
+
env5.node = this.gobbleTokenProperty(env5.node);
|
|
45915
|
+
return env5.node;
|
|
45440
45916
|
}
|
|
45441
45917
|
if (this.code === jsep2.OBRACK_CODE) {
|
|
45442
45918
|
inCharSet = true;
|
|
@@ -45460,41 +45936,41 @@ var plugin = {
|
|
|
45460
45936
|
init(jsep2) {
|
|
45461
45937
|
const updateNodeTypes = [jsep2.IDENTIFIER, jsep2.MEMBER_EXP];
|
|
45462
45938
|
plugin.assignmentOperators.forEach((op) => jsep2.addBinaryOp(op, plugin.assignmentPrecedence, true));
|
|
45463
|
-
jsep2.hooks.add("gobble-token", function gobbleUpdatePrefix(
|
|
45939
|
+
jsep2.hooks.add("gobble-token", function gobbleUpdatePrefix(env5) {
|
|
45464
45940
|
const code = this.code;
|
|
45465
45941
|
if (plugin.updateOperators.some((c70) => c70 === code && c70 === this.expr.charCodeAt(this.index + 1))) {
|
|
45466
45942
|
this.index += 2;
|
|
45467
|
-
|
|
45943
|
+
env5.node = {
|
|
45468
45944
|
type: "UpdateExpression",
|
|
45469
45945
|
operator: code === PLUS_CODE ? "++" : "--",
|
|
45470
45946
|
argument: this.gobbleTokenProperty(this.gobbleIdentifier()),
|
|
45471
45947
|
prefix: true
|
|
45472
45948
|
};
|
|
45473
|
-
if (!
|
|
45474
|
-
this.throwError(`Unexpected ${
|
|
45949
|
+
if (!env5.node.argument || !updateNodeTypes.includes(env5.node.argument.type)) {
|
|
45950
|
+
this.throwError(`Unexpected ${env5.node.operator}`);
|
|
45475
45951
|
}
|
|
45476
45952
|
}
|
|
45477
45953
|
});
|
|
45478
|
-
jsep2.hooks.add("after-token", function gobbleUpdatePostfix(
|
|
45479
|
-
if (
|
|
45954
|
+
jsep2.hooks.add("after-token", function gobbleUpdatePostfix(env5) {
|
|
45955
|
+
if (env5.node) {
|
|
45480
45956
|
const code = this.code;
|
|
45481
45957
|
if (plugin.updateOperators.some((c70) => c70 === code && c70 === this.expr.charCodeAt(this.index + 1))) {
|
|
45482
|
-
if (!updateNodeTypes.includes(
|
|
45483
|
-
this.throwError(`Unexpected ${
|
|
45958
|
+
if (!updateNodeTypes.includes(env5.node.type)) {
|
|
45959
|
+
this.throwError(`Unexpected ${env5.node.operator}`);
|
|
45484
45960
|
}
|
|
45485
45961
|
this.index += 2;
|
|
45486
|
-
|
|
45962
|
+
env5.node = {
|
|
45487
45963
|
type: "UpdateExpression",
|
|
45488
45964
|
operator: code === PLUS_CODE ? "++" : "--",
|
|
45489
|
-
argument:
|
|
45965
|
+
argument: env5.node,
|
|
45490
45966
|
prefix: false
|
|
45491
45967
|
};
|
|
45492
45968
|
}
|
|
45493
45969
|
}
|
|
45494
45970
|
});
|
|
45495
|
-
jsep2.hooks.add("after-expression", function gobbleAssignment(
|
|
45496
|
-
if (
|
|
45497
|
-
updateBinariesToAssignments(
|
|
45971
|
+
jsep2.hooks.add("after-expression", function gobbleAssignment(env5) {
|
|
45972
|
+
if (env5.node) {
|
|
45973
|
+
updateBinariesToAssignments(env5.node);
|
|
45498
45974
|
}
|
|
45499
45975
|
});
|
|
45500
45976
|
function updateBinariesToAssignments(node) {
|
|
@@ -46112,10 +46588,10 @@ JSONPath.toPointer = function(pointer) {
|
|
|
46112
46588
|
};
|
|
46113
46589
|
JSONPath.toPathArray = function(expr) {
|
|
46114
46590
|
const {
|
|
46115
|
-
cache
|
|
46591
|
+
cache: cache2
|
|
46116
46592
|
} = JSONPath;
|
|
46117
|
-
if (
|
|
46118
|
-
return
|
|
46593
|
+
if (cache2[expr]) {
|
|
46594
|
+
return cache2[expr].concat();
|
|
46119
46595
|
}
|
|
46120
46596
|
const subx = [];
|
|
46121
46597
|
const normalized = expr.replaceAll(/@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\(\)/gu, ";$&;").replaceAll(/[['](\??\(.*?\))[\]'](?!.\])/gu, function($0, $1) {
|
|
@@ -46129,8 +46605,8 @@ JSONPath.toPathArray = function(expr) {
|
|
|
46129
46605
|
const match = exp.match(/#(\d+)/u);
|
|
46130
46606
|
return !match || !match[1] ? exp : subx[match[1]];
|
|
46131
46607
|
});
|
|
46132
|
-
|
|
46133
|
-
return
|
|
46608
|
+
cache2[expr] = exprList;
|
|
46609
|
+
return cache2[expr].concat();
|
|
46134
46610
|
};
|
|
46135
46611
|
JSONPath.prototype.safeVm = {
|
|
46136
46612
|
Script: SafeScript
|
|
@@ -46392,9 +46868,9 @@ function buildAt(ctx, testResults, consoleOutput) {
|
|
|
46392
46868
|
const counterBuf = Buffer.alloc(8);
|
|
46393
46869
|
counterBuf.writeUInt32BE(Math.floor(counter / 4294967296), 0);
|
|
46394
46870
|
counterBuf.writeUInt32BE(counter >>> 0, 4);
|
|
46395
|
-
const
|
|
46396
|
-
const offset =
|
|
46397
|
-
const binCode = (
|
|
46871
|
+
const hmac2 = crypto.createHmac(algorithm, keyBytes).update(counterBuf).digest();
|
|
46872
|
+
const offset = hmac2[hmac2.length - 1] & 15;
|
|
46873
|
+
const binCode = (hmac2[offset] & 127) << 24 | (hmac2[offset + 1] & 255) << 16 | (hmac2[offset + 2] & 255) << 8 | hmac2[offset + 3] & 255;
|
|
46398
46874
|
return String(binCode % 10 ** digits).padStart(digits, "0");
|
|
46399
46875
|
}
|
|
46400
46876
|
};
|
|
@@ -46914,12 +47390,12 @@ async function fetchOAuth2Token(auth, vars) {
|
|
|
46914
47390
|
throw new Error(`OAuth 2.0 token request failed (${resp.status}): ${body}`);
|
|
46915
47391
|
}
|
|
46916
47392
|
const json = await resp.json();
|
|
46917
|
-
const
|
|
46918
|
-
if (!
|
|
47393
|
+
const accessToken2 = String(json["access_token"] ?? "");
|
|
47394
|
+
if (!accessToken2) throw new Error("OAuth 2.0: token response missing access_token.");
|
|
46919
47395
|
const expiresIn = Number(json["expires_in"] ?? 3600);
|
|
46920
47396
|
const expiresAt = Date.now() + expiresIn * 1e3;
|
|
46921
47397
|
return {
|
|
46922
|
-
accessToken,
|
|
47398
|
+
accessToken: accessToken2,
|
|
46923
47399
|
expiresAt,
|
|
46924
47400
|
refreshToken: json["refresh_token"] ? String(json["refresh_token"]) : void 0
|
|
46925
47401
|
};
|
|
@@ -47185,7 +47661,10 @@ function buildBodyAndApplyHeaders(req, vars, headers) {
|
|
|
47185
47661
|
return body;
|
|
47186
47662
|
}
|
|
47187
47663
|
async function performHttpExchange(opts) {
|
|
47188
|
-
const { req,
|
|
47664
|
+
const { req, resolvedUrl, dispatcher, proxy, tls, onSent } = opts;
|
|
47665
|
+
let vars = opts.vars;
|
|
47666
|
+
const inlineSecrets = await resolveInlineSecrets(req);
|
|
47667
|
+
if (Object.keys(inlineSecrets).length) vars = { ...vars, ...inlineSecrets };
|
|
47189
47668
|
const start = Date.now();
|
|
47190
47669
|
if (req.auth.type === "oauth2") {
|
|
47191
47670
|
const now = Date.now();
|
|
@@ -47299,6 +47778,29 @@ function syntheticHttpFailure(status, statusText) {
|
|
|
47299
47778
|
error: `Request returned ${status} - no assertion was defined to verify the status code.`
|
|
47300
47779
|
};
|
|
47301
47780
|
}
|
|
47781
|
+
async function resolveInlineSecrets(req) {
|
|
47782
|
+
const haystack = [
|
|
47783
|
+
req.url ?? "",
|
|
47784
|
+
JSON.stringify(req.params ?? []),
|
|
47785
|
+
JSON.stringify(req.headers ?? []),
|
|
47786
|
+
JSON.stringify(req.body ?? {}),
|
|
47787
|
+
JSON.stringify(req.auth ?? {}),
|
|
47788
|
+
req.preRequestScript ?? "",
|
|
47789
|
+
req.postRequestScript ?? ""
|
|
47790
|
+
].join("\n");
|
|
47791
|
+
const refs = /* @__PURE__ */ new Set();
|
|
47792
|
+
for (const m75 of haystack.matchAll(/\{\{\s*([^}]+?)\s*\}\}/g)) {
|
|
47793
|
+
const inner = m75[1].trim();
|
|
47794
|
+
if (hasSecretScheme(inner)) refs.add(inner);
|
|
47795
|
+
}
|
|
47796
|
+
if (refs.size === 0) return {};
|
|
47797
|
+
const out = {};
|
|
47798
|
+
await Promise.all([...refs].map(async (ref) => {
|
|
47799
|
+
const value = await resolveExternalSecret(ref);
|
|
47800
|
+
if (value !== null) out[ref] = value;
|
|
47801
|
+
}));
|
|
47802
|
+
return out;
|
|
47803
|
+
}
|
|
47302
47804
|
async function executeRunnerRequest(opts) {
|
|
47303
47805
|
const { req, collectionVars, envVars, globals: globals2, dispatcher, piiMaskPatterns, proxy, tls, onScriptOutput } = opts;
|
|
47304
47806
|
let { localVars } = opts;
|
|
@@ -47316,6 +47818,24 @@ async function executeRunnerRequest(opts) {
|
|
|
47316
47818
|
let updatedCollectionVars = { ...collectionVars };
|
|
47317
47819
|
let updatedGlobals = { ...globals2 };
|
|
47318
47820
|
let preScriptError;
|
|
47821
|
+
let inlineSecrets = {};
|
|
47822
|
+
try {
|
|
47823
|
+
inlineSecrets = await resolveInlineSecrets(req);
|
|
47824
|
+
} catch (err) {
|
|
47825
|
+
return {
|
|
47826
|
+
result: {
|
|
47827
|
+
...base,
|
|
47828
|
+
status: "error",
|
|
47829
|
+
durationMs: 0,
|
|
47830
|
+
error: err instanceof Error ? err.message : String(err)
|
|
47831
|
+
},
|
|
47832
|
+
updatedEnvVars,
|
|
47833
|
+
updatedCollectionVars,
|
|
47834
|
+
updatedGlobals,
|
|
47835
|
+
updatedLocalVars: localVars
|
|
47836
|
+
};
|
|
47837
|
+
}
|
|
47838
|
+
if (Object.keys(inlineSecrets).length) vars = { ...vars, ...inlineSecrets };
|
|
47319
47839
|
if (req.preRequestScript?.trim()) {
|
|
47320
47840
|
const r52 = await runScript(interpolate(req.preRequestScript, vars), {
|
|
47321
47841
|
envVars: { ...envVars },
|
|
@@ -47333,6 +47853,7 @@ async function executeRunnerRequest(opts) {
|
|
|
47333
47853
|
await persistGlobals();
|
|
47334
47854
|
onScriptOutput?.("pre", r52.consoleOutput, r52.error);
|
|
47335
47855
|
vars = mergeVars(updatedEnvVars, updatedCollectionVars, updatedGlobals, localVars, dynamicVars);
|
|
47856
|
+
if (Object.keys(inlineSecrets).length) vars = { ...vars, ...inlineSecrets };
|
|
47336
47857
|
}
|
|
47337
47858
|
const resolvedUrl = buildUrl(req.url, req.params, vars);
|
|
47338
47859
|
base.resolvedUrl = resolvedUrl;
|
|
@@ -47423,7 +47944,7 @@ var APP_URL = (process.env.APP_URL || "").replace(/\/+$/, "");
|
|
|
47423
47944
|
var AGENT_TOKEN = process.env.AGENT_TOKEN || "";
|
|
47424
47945
|
var RUNTIME_TOKEN = process.env.RUNTIME_TOKEN || "";
|
|
47425
47946
|
var POLL_MS = Number(process.env.POLL_INTERVAL_MS || 5e3);
|
|
47426
|
-
var VERSION = true ? "0.4.
|
|
47947
|
+
var VERSION = true ? "0.4.9" : "";
|
|
47427
47948
|
var authHeaders = AGENT_TOKEN ? { Authorization: `Bearer ${AGENT_TOKEN}` } : RUNTIME_TOKEN ? { "X-Runtime-Token": RUNTIME_TOKEN } : {};
|
|
47428
47949
|
async function postResult(m75, fields) {
|
|
47429
47950
|
await fetch(`${APP_URL}/api/monitor-runtime/${m75.id}/result`, {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testsmith/api-spector-agent",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.9",
|
|
4
4
|
"description": "API Spector private runner: monitor internal/local APIs the cloud cannot reach, with no inbound connections.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://api-spector.dev",
|