@reclaimprotocol/attestor-core 4.0.3 → 5.0.1-beta.2

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.
Files changed (297) hide show
  1. package/LICENSE +660 -660
  2. package/README.md +1 -2
  3. package/lib/avs/abis/avsDirectoryABI.js +341 -342
  4. package/lib/avs/abis/delegationABI.js +4 -5
  5. package/lib/avs/abis/registryABI.js +722 -723
  6. package/lib/avs/client/create-claim-on-avs.d.ts +5 -5
  7. package/lib/avs/client/create-claim-on-avs.js +160 -139
  8. package/lib/avs/config.d.ts +1 -1
  9. package/lib/avs/config.js +25 -23
  10. package/lib/avs/contracts/ReclaimServiceManager.d.ts +436 -532
  11. package/lib/avs/contracts/ReclaimServiceManager.js +0 -3
  12. package/lib/avs/contracts/common.d.ts +40 -11
  13. package/lib/avs/contracts/common.js +0 -3
  14. package/lib/avs/contracts/factories/ReclaimServiceManager__factory.d.ts +13 -11
  15. package/lib/avs/contracts/factories/ReclaimServiceManager__factory.js +1157 -1148
  16. package/lib/avs/contracts/factories/index.d.ts +1 -1
  17. package/lib/avs/contracts/factories/index.js +4 -9
  18. package/lib/avs/contracts/index.d.ts +3 -3
  19. package/lib/avs/contracts/index.js +6 -40
  20. package/lib/avs/types/index.d.ts +6 -6
  21. package/lib/avs/types/index.js +0 -3
  22. package/lib/avs/utils/contracts.d.ts +14 -14
  23. package/lib/avs/utils/contracts.js +50 -35
  24. package/lib/avs/utils/register.d.ts +3 -3
  25. package/lib/avs/utils/register.js +71 -79
  26. package/lib/avs/utils/tasks.d.ts +4 -4
  27. package/lib/avs/utils/tasks.js +44 -41
  28. package/lib/client/create-claim.d.ts +2 -2
  29. package/lib/client/create-claim.js +437 -400
  30. package/lib/client/index.d.ts +3 -3
  31. package/lib/client/index.js +3 -20
  32. package/lib/client/tunnels/make-rpc-tcp-tunnel.d.ts +2 -2
  33. package/lib/client/tunnels/make-rpc-tcp-tunnel.js +49 -56
  34. package/lib/client/tunnels/make-rpc-tls-tunnel.d.ts +4 -3
  35. package/lib/client/tunnels/make-rpc-tls-tunnel.js +123 -131
  36. package/lib/client/utils/attestor-pool.d.ts +3 -1
  37. package/lib/client/utils/attestor-pool.js +21 -25
  38. package/lib/client/utils/client-socket.d.ts +4 -4
  39. package/lib/client/utils/client-socket.js +114 -94
  40. package/lib/client/utils/message-handler.d.ts +2 -2
  41. package/lib/client/utils/message-handler.js +89 -86
  42. package/lib/config/index.d.ts +6 -3
  43. package/lib/config/index.js +60 -37
  44. package/lib/external-rpc/benchmark.d.ts +1 -0
  45. package/lib/external-rpc/benchmark.js +82 -0
  46. package/lib/external-rpc/event-bus.d.ts +7 -0
  47. package/lib/external-rpc/event-bus.js +17 -0
  48. package/lib/external-rpc/global.d.js +0 -0
  49. package/lib/external-rpc/handle-incoming-msg.d.ts +2 -0
  50. package/lib/external-rpc/handle-incoming-msg.js +241 -0
  51. package/lib/external-rpc/index.d.ts +3 -0
  52. package/lib/external-rpc/index.js +3 -0
  53. package/lib/external-rpc/jsc-polyfills/1.d.ts +14 -0
  54. package/lib/external-rpc/jsc-polyfills/1.js +80 -0
  55. package/lib/external-rpc/jsc-polyfills/2.js +15 -0
  56. package/lib/external-rpc/jsc-polyfills/event.d.ts +10 -0
  57. package/lib/external-rpc/jsc-polyfills/event.js +19 -0
  58. package/lib/external-rpc/jsc-polyfills/index.d.ts +2 -0
  59. package/lib/external-rpc/jsc-polyfills/index.js +2 -0
  60. package/lib/external-rpc/jsc-polyfills/ws.d.ts +21 -0
  61. package/lib/external-rpc/jsc-polyfills/ws.js +83 -0
  62. package/lib/external-rpc/setup-browser.d.ts +6 -0
  63. package/lib/external-rpc/setup-browser.js +33 -0
  64. package/lib/external-rpc/setup-jsc.d.ts +24 -0
  65. package/lib/external-rpc/setup-jsc.js +22 -0
  66. package/lib/{window-rpc → external-rpc}/types.d.ts +56 -35
  67. package/lib/external-rpc/types.js +0 -0
  68. package/lib/external-rpc/utils.d.ts +20 -0
  69. package/lib/external-rpc/utils.js +100 -0
  70. package/lib/external-rpc/zk.d.ts +14 -0
  71. package/lib/external-rpc/zk.js +58 -0
  72. package/lib/index.d.ts +8 -9
  73. package/lib/index.js +12 -49
  74. package/lib/mechain/abis/governanceABI.js +460 -461
  75. package/lib/mechain/abis/taskABI.js +505 -506
  76. package/lib/mechain/client/create-claim-on-mechain.d.ts +3 -3
  77. package/lib/mechain/client/create-claim-on-mechain.js +31 -30
  78. package/lib/mechain/client/index.d.ts +1 -1
  79. package/lib/mechain/client/index.js +1 -18
  80. package/lib/mechain/constants/index.js +8 -7
  81. package/lib/mechain/index.d.ts +2 -2
  82. package/lib/mechain/index.js +2 -19
  83. package/lib/mechain/types/index.d.ts +2 -2
  84. package/lib/mechain/types/index.js +0 -3
  85. package/lib/proto/api.d.ts +182 -39
  86. package/lib/proto/api.js +4105 -3555
  87. package/lib/proto/tee-bundle.d.ts +156 -0
  88. package/lib/proto/tee-bundle.js +1296 -0
  89. package/lib/providers/http/index.d.ts +16 -1
  90. package/lib/providers/http/index.js +603 -576
  91. package/lib/providers/http/patch-parse5-tree.d.ts +6 -0
  92. package/lib/providers/http/patch-parse5-tree.js +34 -0
  93. package/lib/providers/http/utils.d.ts +7 -4
  94. package/lib/providers/http/utils.js +240 -317
  95. package/lib/providers/index.d.ts +1 -1
  96. package/lib/providers/index.js +5 -9
  97. package/lib/scripts/check-avs-registration.d.ts +1 -1
  98. package/lib/scripts/check-avs-registration.js +24 -25
  99. package/lib/scripts/fallbacks/crypto.d.ts +1 -0
  100. package/lib/scripts/fallbacks/crypto.js +4 -0
  101. package/lib/scripts/fallbacks/empty.d.ts +3 -0
  102. package/lib/scripts/fallbacks/empty.js +4 -0
  103. package/lib/scripts/fallbacks/re2.d.ts +1 -0
  104. package/lib/scripts/fallbacks/re2.js +7 -0
  105. package/lib/scripts/fallbacks/snarkjs.d.ts +1 -0
  106. package/lib/scripts/fallbacks/snarkjs.js +10 -0
  107. package/lib/scripts/fallbacks/stwo.d.ts +6 -0
  108. package/lib/scripts/fallbacks/stwo.js +159 -0
  109. package/lib/scripts/generate-provider-types.js +92 -73
  110. package/lib/scripts/generate-receipt.d.ts +2 -2
  111. package/lib/scripts/generate-receipt.js +94 -83
  112. package/lib/scripts/generate-toprf-keys.js +17 -16
  113. package/lib/scripts/jsc-cli-rpc.d.ts +1 -0
  114. package/lib/scripts/jsc-cli-rpc.js +35 -0
  115. package/lib/scripts/register-avs-operator.d.ts +1 -1
  116. package/lib/scripts/register-avs-operator.js +3 -7
  117. package/lib/scripts/start-server.d.ts +1 -1
  118. package/lib/scripts/start-server.js +9 -11
  119. package/lib/scripts/update-avs-metadata.d.ts +1 -1
  120. package/lib/scripts/update-avs-metadata.js +17 -19
  121. package/lib/scripts/utils.js +8 -9
  122. package/lib/scripts/whitelist-operator.d.ts +1 -1
  123. package/lib/scripts/whitelist-operator.js +13 -15
  124. package/lib/server/create-server.d.ts +3 -2
  125. package/lib/server/create-server.js +98 -85
  126. package/lib/server/handlers/claimTeeBundle.d.ts +6 -0
  127. package/lib/server/handlers/claimTeeBundle.js +232 -0
  128. package/lib/server/handlers/claimTunnel.d.ts +1 -1
  129. package/lib/server/handlers/claimTunnel.js +75 -73
  130. package/lib/server/handlers/completeClaimOnChain.d.ts +1 -1
  131. package/lib/server/handlers/completeClaimOnChain.js +27 -26
  132. package/lib/server/handlers/createClaimOnChain.d.ts +1 -1
  133. package/lib/server/handlers/createClaimOnChain.js +30 -29
  134. package/lib/server/handlers/createTaskOnMechain.d.ts +1 -1
  135. package/lib/server/handlers/createTaskOnMechain.js +54 -49
  136. package/lib/server/handlers/createTunnel.d.ts +1 -1
  137. package/lib/server/handlers/createTunnel.js +91 -94
  138. package/lib/server/handlers/disconnectTunnel.d.ts +1 -1
  139. package/lib/server/handlers/disconnectTunnel.js +6 -8
  140. package/lib/server/handlers/fetchCertificateBytes.d.ts +2 -0
  141. package/lib/server/handlers/fetchCertificateBytes.js +57 -0
  142. package/lib/server/handlers/index.d.ts +1 -1
  143. package/lib/server/handlers/index.js +24 -21
  144. package/lib/server/handlers/init.d.ts +1 -1
  145. package/lib/server/handlers/init.js +31 -34
  146. package/lib/server/handlers/toprf.d.ts +1 -1
  147. package/lib/server/handlers/toprf.js +17 -19
  148. package/lib/server/index.d.ts +4 -4
  149. package/lib/server/index.js +4 -21
  150. package/lib/server/socket.d.ts +7 -7
  151. package/lib/server/socket.js +104 -106
  152. package/lib/server/tunnels/make-tcp-tunnel.d.ts +5 -3
  153. package/lib/server/tunnels/make-tcp-tunnel.js +189 -162
  154. package/lib/server/utils/apm.d.ts +1 -1
  155. package/lib/server/utils/apm.js +26 -40
  156. package/lib/server/utils/assert-valid-claim-request.d.ts +6 -5
  157. package/lib/server/utils/assert-valid-claim-request.js +339 -185
  158. package/lib/server/utils/config-env.js +4 -7
  159. package/lib/server/utils/dns.js +18 -16
  160. package/lib/server/utils/gcp-attestation.d.ts +17 -0
  161. package/lib/server/utils/gcp-attestation.js +237 -0
  162. package/lib/server/utils/generics.d.ts +3 -3
  163. package/lib/server/utils/generics.js +37 -51
  164. package/lib/server/utils/iso.js +255 -256
  165. package/lib/server/utils/keep-alive.d.ts +2 -2
  166. package/lib/server/utils/keep-alive.js +36 -40
  167. package/lib/server/utils/nitro-attestation.d.ts +33 -0
  168. package/lib/server/utils/nitro-attestation.js +249 -0
  169. package/lib/server/utils/oprf-raw.d.ts +21 -0
  170. package/lib/server/utils/oprf-raw.js +61 -0
  171. package/lib/server/utils/process-handshake.d.ts +3 -3
  172. package/lib/server/utils/process-handshake.js +217 -175
  173. package/lib/server/utils/proxy-session.d.ts +1 -0
  174. package/lib/server/utils/proxy-session.js +6 -0
  175. package/lib/server/utils/tee-oprf-mpc-verification.d.ts +16 -0
  176. package/lib/server/utils/tee-oprf-mpc-verification.js +86 -0
  177. package/lib/server/utils/tee-oprf-verification.d.ts +24 -0
  178. package/lib/server/utils/tee-oprf-verification.js +151 -0
  179. package/lib/server/utils/tee-transcript-reconstruction.d.ts +24 -0
  180. package/lib/server/utils/tee-transcript-reconstruction.js +140 -0
  181. package/lib/server/utils/tee-verification.d.ts +28 -0
  182. package/lib/server/utils/tee-verification.js +358 -0
  183. package/lib/{utils → server/utils}/validation.d.ts +1 -1
  184. package/lib/server/utils/validation.js +45 -0
  185. package/lib/types/bgp.js +0 -3
  186. package/lib/types/claims.d.ts +7 -10
  187. package/lib/types/claims.js +0 -3
  188. package/lib/types/client.d.ts +5 -5
  189. package/lib/types/client.js +0 -3
  190. package/lib/types/general.d.ts +29 -4
  191. package/lib/types/general.js +0 -3
  192. package/lib/types/handlers.d.ts +3 -3
  193. package/lib/types/handlers.js +0 -3
  194. package/lib/types/index.d.ts +10 -10
  195. package/lib/types/index.js +10 -27
  196. package/lib/types/providers.d.ts +15 -4
  197. package/lib/types/providers.gen.d.ts +15 -1
  198. package/lib/types/providers.gen.js +15 -13
  199. package/lib/types/providers.js +0 -3
  200. package/lib/types/rpc.d.ts +2 -2
  201. package/lib/types/rpc.js +0 -3
  202. package/lib/types/signatures.js +0 -3
  203. package/lib/types/tunnel.d.ts +2 -2
  204. package/lib/types/tunnel.js +0 -3
  205. package/lib/types/zk.d.ts +17 -2
  206. package/lib/types/zk.js +0 -3
  207. package/lib/utils/auth.d.ts +2 -1
  208. package/lib/utils/auth.js +66 -59
  209. package/lib/utils/b64-json.js +13 -19
  210. package/lib/utils/bgp-listener.d.ts +1 -1
  211. package/lib/utils/bgp-listener.js +111 -114
  212. package/lib/utils/claims.d.ts +3 -3
  213. package/lib/utils/claims.js +78 -101
  214. package/lib/utils/env.js +15 -16
  215. package/lib/utils/error.d.ts +6 -7
  216. package/lib/utils/error.js +50 -39
  217. package/lib/utils/generics.d.ts +15 -13
  218. package/lib/utils/generics.js +217 -297
  219. package/lib/utils/http-parser.d.ts +1 -1
  220. package/lib/utils/http-parser.js +186 -237
  221. package/lib/utils/index.d.ts +13 -12
  222. package/lib/utils/index.js +13 -29
  223. package/lib/utils/logger.d.ts +1 -1
  224. package/lib/utils/logger.js +69 -87
  225. package/lib/utils/prepare-packets.d.ts +3 -3
  226. package/lib/utils/prepare-packets.js +66 -58
  227. package/lib/utils/redactions.d.ts +20 -1
  228. package/lib/utils/redactions.js +116 -129
  229. package/lib/utils/retries.d.ts +1 -1
  230. package/lib/utils/retries.js +24 -26
  231. package/lib/utils/signatures/eth.d.ts +1 -1
  232. package/lib/utils/signatures/eth.js +28 -30
  233. package/lib/utils/signatures/index.d.ts +3 -3
  234. package/lib/utils/signatures/index.js +11 -10
  235. package/lib/utils/socket-base.d.ts +6 -5
  236. package/lib/utils/socket-base.js +89 -88
  237. package/lib/utils/tls.d.ts +1 -1
  238. package/lib/utils/tls.js +54 -28
  239. package/lib/utils/ws.d.ts +1 -6
  240. package/lib/utils/ws.js +17 -33
  241. package/lib/utils/zk.d.ts +28 -12
  242. package/lib/utils/zk.js +587 -406
  243. package/package.json +72 -60
  244. package/lib/avs/tests/test.operator.d.ts +0 -11
  245. package/lib/avs/tests/test.operator.js +0 -313
  246. package/lib/avs/tests/utils.d.ts +0 -2
  247. package/lib/avs/tests/utils.js +0 -50
  248. package/lib/scripts/verify-root-ca.d.ts +0 -1
  249. package/lib/scripts/verify-root-ca.js +0 -51
  250. package/lib/tests/describe-with-server.d.ts +0 -20
  251. package/lib/tests/describe-with-server.js +0 -64
  252. package/lib/tests/mock-provider-server.d.ts +0 -13
  253. package/lib/tests/mock-provider-server.js +0 -65
  254. package/lib/tests/mocks.d.ts +0 -4
  255. package/lib/tests/mocks.js +0 -23
  256. package/lib/tests/test.auth.js +0 -75
  257. package/lib/tests/test.bgp-listener.js +0 -169
  258. package/lib/tests/test.claim-creation.js +0 -280
  259. package/lib/tests/test.http-parser.d.ts +0 -1
  260. package/lib/tests/test.http-parser.js +0 -120
  261. package/lib/tests/test.http-provider-utils.js +0 -2416
  262. package/lib/tests/test.http-provider.d.ts +0 -1
  263. package/lib/tests/test.http-provider.js +0 -114
  264. package/lib/tests/test.rpc-communication.d.ts +0 -1
  265. package/lib/tests/test.rpc-communication.js +0 -64
  266. package/lib/tests/test.rpc-tunnel.d.ts +0 -1
  267. package/lib/tests/test.rpc-tunnel.js +0 -172
  268. package/lib/tests/test.signatures.d.ts +0 -1
  269. package/lib/tests/test.signatures.js +0 -24
  270. package/lib/tests/test.tcp-tunnel.d.ts +0 -1
  271. package/lib/tests/test.tcp-tunnel.js +0 -64
  272. package/lib/tests/test.zk.d.ts +0 -1
  273. package/lib/tests/test.zk.js +0 -337
  274. package/lib/tests/utils.d.ts +0 -18
  275. package/lib/tests/utils.js +0 -64
  276. package/lib/utils/atomic-operations.d.ts +0 -24
  277. package/lib/utils/atomic-operations.js +0 -65
  278. package/lib/utils/benchmark.d.ts +0 -1
  279. package/lib/utils/benchmark.js +0 -70
  280. package/lib/utils/connection-state-machine.d.ts +0 -43
  281. package/lib/utils/connection-state-machine.js +0 -129
  282. package/lib/utils/resource-monitor.d.ts +0 -61
  283. package/lib/utils/resource-monitor.js +0 -107
  284. package/lib/utils/validation.js +0 -46
  285. package/lib/window-rpc/index.d.ts +0 -3
  286. package/lib/window-rpc/index.js +0 -20
  287. package/lib/window-rpc/setup-window-rpc.d.ts +0 -5
  288. package/lib/window-rpc/setup-window-rpc.js +0 -291
  289. package/lib/window-rpc/types.js +0 -3
  290. package/lib/window-rpc/utils.d.ts +0 -14
  291. package/lib/window-rpc/utils.js +0 -102
  292. package/lib/window-rpc/window-rpc-zk.d.ts +0 -15
  293. package/lib/window-rpc/window-rpc-zk.js +0 -85
  294. /package/lib/{tests/test.auth.d.ts → external-rpc/jsc-polyfills/2.d.ts} +0 -0
  295. /package/lib/{tests/test.bgp-listener.d.ts → scripts/build-browser.d.ts} +0 -0
  296. /package/lib/{tests/test.claim-creation.d.ts → scripts/build-jsc.d.ts} +0 -0
  297. /package/lib/{tests/test.http-provider-utils.d.ts → scripts/build-lib.d.ts} +0 -0
@@ -1,613 +1,640 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tls_1 = require("@reclaimprotocol/tls");
4
- const utils_1 = require("ethers/lib/utils");
5
- const config_1 = require("../../config");
6
- const api_1 = require("../../proto/api");
7
- const utils_2 = require("../../providers/http/utils");
8
- const utils_3 = require("../../utils");
9
- const OK_HTTP_HEADER = 'HTTP/1.1 200';
10
- const dateHeaderRegex = '[dD]ate: ((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), (?:[0-3][0-9]) (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (?:[0-9]{4}) (?:[01][0-9]|2[0-3])(?::[0-5][0-9]){2} GMT)';
11
- const dateDiff = 1000 * 60 * 10; // allow 10 min difference
1
+ import { areUint8ArraysEqual, concatenateUint8Arrays, uint8ArrayToBinaryStr } from "@reclaimprotocol/tls";
2
+ import { encodeBase64 } from "ethers";
3
+ import { DEFAULT_HTTPS_PORT, RECLAIM_USER_AGENT } from "../../config/index.js";
4
+ import { AttestorVersion } from "../../proto/api.js";
5
+ import {
6
+ buildHeaders,
7
+ convertResponsePosToAbsolutePos,
8
+ extractHTMLElementsIndexes,
9
+ extractJSONValueIndexes,
10
+ getRedactionsForChunkHeaders,
11
+ makeRegex,
12
+ matchRedactedStrings,
13
+ parseHttpResponse
14
+ } from "../../providers/http/utils.js";
15
+ import { isValidProxySessionId } from "../../server/utils/proxy-session.js";
16
+ import {
17
+ findIndexInUint8Array,
18
+ getHttpRequestDataFromTranscript,
19
+ logger,
20
+ REDACTION_CHAR_CODE,
21
+ strToUint8Array,
22
+ uint8ArrayToStr
23
+ } from "../../utils/index.js";
24
+ const OK_HTTP_HEADER = "HTTP/1.1 200";
25
+ const dateHeaderRegex = "[dD]ate: ((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), (?:[0-3][0-9]) (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (?:[0-9]{4}) (?:[01][0-9]|2[0-3])(?::[0-5][0-9]){2} GMT)";
26
+ const dateDiff = 1e3 * 60 * 10;
12
27
  const HTTP_PROVIDER = {
13
- hostPort: getHostPort,
14
- writeRedactionMode(params) {
15
- return ('writeRedactionMode' in params)
16
- ? params.writeRedactionMode
17
- : undefined;
18
- },
19
- geoLocation(params, secretParams) {
20
- return ('geoLocation' in params)
21
- ? getGeoLocation(params, secretParams)
22
- : undefined;
23
- },
24
- additionalClientOptions(params) {
25
- let defaultOptions = {
26
- applicationLayerProtocols: ['http/1.1']
27
- };
28
- if ('additionalClientOptions' in params) {
29
- defaultOptions = {
30
- ...defaultOptions,
31
- ...params.additionalClientOptions
32
- };
33
- }
34
- return defaultOptions;
35
- },
36
- createRequest(secretParams, params, logger) {
37
- var _a, _b;
38
- if (!secretParams.cookieStr &&
39
- !secretParams.authorisationHeader &&
40
- !secretParams.headers) {
41
- throw new Error('auth parameters are not set');
42
- }
43
- const pubHeaders = params.headers || {};
44
- const secHeaders = { ...secretParams.headers };
45
- if (secretParams.cookieStr) {
46
- secHeaders['Cookie'] = secretParams.cookieStr;
47
- }
48
- if (secretParams.authorisationHeader) {
49
- secHeaders['Authorization'] = secretParams.authorisationHeader;
50
- }
51
- const hasUserAgent = Object.keys(pubHeaders)
52
- .some(k => k.toLowerCase() === 'user-agent') ||
53
- Object.keys(secHeaders)
54
- .some(k => k.toLowerCase() === 'user-agent');
55
- if (!hasUserAgent) {
56
- //only set user-agent if not set by provider
57
- pubHeaders['User-Agent'] = config_1.RECLAIM_USER_AGENT;
58
- }
59
- const newParams = substituteParamValues(params, secretParams);
60
- params = newParams.newParams;
61
- const url = new URL(params.url);
62
- const { pathname } = url;
63
- const searchParams = params.url.includes('?') ? params.url.split('?')[1] : '';
64
- logger.info({ url: params.url, path: pathname, query: searchParams.toString() });
65
- const body = params.body instanceof Uint8Array
66
- ? params.body
67
- : (0, tls_1.strToUint8Array)(params.body || '');
68
- const contentLength = body.length;
69
- const reqLine = `${params.method} ${pathname}${(searchParams === null || searchParams === void 0 ? void 0 : searchParams.length) ? '?' + searchParams : ''} HTTP/1.1`;
70
- const secHeadersList = (0, utils_2.buildHeaders)(secHeaders);
71
- logger.info({ requestLine: reqLine });
72
- const httpReqHeaderStr = [
73
- reqLine,
74
- `Host: ${getHostHeaderString(url)}`,
75
- `Content-Length: ${contentLength}`,
76
- 'Connection: close',
77
- //no compression
78
- 'Accept-Encoding: identity',
79
- ...(0, utils_2.buildHeaders)(pubHeaders),
80
- ...secHeadersList,
81
- '\r\n',
82
- ].join('\r\n');
83
- const headerStr = (0, tls_1.strToUint8Array)(httpReqHeaderStr);
84
- const data = (0, tls_1.concatenateUint8Arrays)([headerStr, body]);
85
- // hide all secret headers
86
- const secHeadersStr = secHeadersList.join('\r\n');
87
- const tokenStartIndex = (0, utils_3.findIndexInUint8Array)(data, (0, tls_1.strToUint8Array)(secHeadersStr));
88
- const redactions = [
89
- {
90
- fromIndex: tokenStartIndex,
91
- toIndex: tokenStartIndex + secHeadersStr.length,
92
- }
93
- ];
94
- if (((_a = newParams.hiddenBodyParts) === null || _a === void 0 ? void 0 : _a.length) > 0) {
95
- for (const hiddenBodyPart of newParams.hiddenBodyParts) {
96
- if (hiddenBodyPart.length) {
97
- redactions.push({
98
- fromIndex: headerStr.length + hiddenBodyPart.index,
99
- toIndex: headerStr.length + hiddenBodyPart.index + hiddenBodyPart.length,
100
- });
101
- }
102
- }
103
- }
104
- if (((_b = newParams.hiddenURLParts) === null || _b === void 0 ? void 0 : _b.length) > 0) {
105
- for (const hiddenURLPart of newParams.hiddenURLParts) {
106
- if (hiddenURLPart.length) {
107
- redactions.push({
108
- fromIndex: hiddenURLPart.index,
109
- toIndex: hiddenURLPart.index + hiddenURLPart.length,
110
- });
111
- }
112
- }
113
- }
114
- redactions.sort((a, b) => a.toIndex - b.toIndex);
115
- return {
116
- data,
117
- redactions: redactions,
118
- };
119
- },
120
- getResponseRedactions({ response, params: rawParams, logger, ctx }) {
121
- var _a, _b;
122
- logger.debug({ response: utils_1.base64.encode(response), params: rawParams });
123
- const res = (0, utils_2.parseHttpResponse)(response);
124
- if (!((_a = rawParams.responseRedactions) === null || _a === void 0 ? void 0 : _a.length)) {
125
- return [];
126
- }
127
- if (((res.statusCode / 100) >> 0) !== 2) {
128
- logger.error({ response: utils_1.base64.encode(response), params: rawParams });
129
- throw new Error(`Expected status 2xx, got ${res.statusCode} (${res.statusMessage})`);
130
- }
131
- const newParams = substituteParamValues(rawParams, undefined, true);
132
- const params = newParams.newParams;
133
- const headerEndIndex = res.statusLineEndIndex;
134
- const bodyStartIdx = (_b = res.bodyStartIndex) !== null && _b !== void 0 ? _b : 0;
135
- if (bodyStartIdx < 4) {
136
- logger.error({ response: (0, utils_3.uint8ArrayToBinaryStr)(response) });
137
- throw new Error('Failed to find response body');
138
- }
139
- const reveals = [
140
- { fromIndex: 0, toIndex: headerEndIndex }
141
- ];
142
- //reveal double CRLF which separates headers from body
143
- if (shouldRevealCrlf(ctx)) {
144
- const crlfs = response
145
- .slice(res.headerEndIdx, res.headerEndIdx + 4);
146
- if (!(0, tls_1.areUint8ArraysEqual)(crlfs, (0, tls_1.strToUint8Array)('\r\n\r\n'))) {
147
- logger.error({ response: (0, utils_3.uint8ArrayToBinaryStr)(response) });
148
- throw new Error(`Failed to find header/body separator at index ${res.headerEndIdx}`);
149
- }
150
- }
151
- reveals.push({ fromIndex: res.headerEndIdx, toIndex: res.headerEndIdx + 4 });
152
- //reveal date header
153
- if (res.headerIndices['date']) {
154
- reveals.push(res.headerIndices['date']);
155
- }
156
- const body = (0, utils_3.uint8ArrayToBinaryStr)(res.body);
157
- const redactions = [];
158
- for (const rs of params.responseRedactions || []) {
159
- const processor = processRedactionRequest(body, rs, bodyStartIdx, res.chunks);
160
- for (const { reveal, redactions: reds } of processor) {
161
- reveals.push(reveal);
162
- redactions.push(...reds);
163
- }
164
- }
165
- reveals.sort((a, b) => a.toIndex - b.toIndex);
166
- if (reveals.length > 1) {
167
- let currentIndex = 0;
168
- for (const r of reveals) {
169
- if (currentIndex < r.fromIndex) {
170
- redactions.push({ fromIndex: currentIndex, toIndex: r.fromIndex });
171
- }
172
- currentIndex = r.toIndex;
173
- }
174
- redactions.push({ fromIndex: currentIndex, toIndex: response.length });
175
- }
176
- for (const r of reveals) {
177
- if (!r.hash) {
178
- continue;
179
- }
180
- redactions.push(r);
181
- }
182
- redactions.sort((a, b) => a.toIndex - b.toIndex);
183
- return redactions;
184
- },
185
- assertValidProviderReceipt({ receipt, params: paramsAny, logger, ctx }) {
186
- logTranscript();
187
- let extractedParams = {};
188
- const secretParams = ('secretParams' in paramsAny)
189
- ? paramsAny.secretParams
190
- : undefined;
191
- const newParams = substituteParamValues(paramsAny, secretParams, !secretParams);
192
- const params = newParams.newParams;
193
- extractedParams = { ...extractedParams, ...newParams.extractedValues };
194
- const req = (0, utils_3.getHttpRequestDataFromTranscript)(receipt);
195
- if (req.method !== params.method.toLowerCase()) {
196
- throw new Error(`Invalid method: ${req.method}`);
197
- }
198
- const url = new URL(params.url);
199
- const { protocol, pathname } = url;
200
- if (protocol !== 'https:') {
201
- logger.error('params URL: %s', params.url);
202
- throw new Error(`Expected protocol: https, found: ${protocol}`);
203
- }
204
- const searchParams = params.url.includes('?') ? params.url.split('?')[1] : '';
205
- //brackets in URL path turn into %7B and %7D, so replace them back
206
- const expectedPath = pathname.replaceAll('%7B', '{').replaceAll('%7D', '}') + ((searchParams === null || searchParams === void 0 ? void 0 : searchParams.length) ? '?' + searchParams : '');
207
- if (!(0, utils_2.matchRedactedStrings)((0, tls_1.strToUint8Array)(expectedPath), (0, tls_1.strToUint8Array)(req.url))) {
208
- logger.error('params URL: %s', params.url);
209
- throw new Error(`Expected path: ${expectedPath}, found: ${req.url}`);
210
- }
211
- const expectedHostStr = getHostHeaderString(url);
212
- if (req.headers.host !== expectedHostStr) {
213
- throw new Error(`Expected host: ${expectedHostStr}, found: ${req.headers.host}`);
214
- }
215
- const connectionHeader = req.headers['connection'];
216
- if (connectionHeader !== 'close') {
217
- throw new Error(`Connection header must be "close", got "${connectionHeader}"`);
218
- }
219
- const serverBlocks = receipt
220
- .filter(s => s.sender === 'server')
221
- .map((r) => r.message)
222
- .filter(b => !b.every(b => b === utils_3.REDACTION_CHAR_CODE)); // filter out fully redacted blocks
223
- const response = concatArrays(...serverBlocks);
224
- let res;
225
- res = (0, utils_3.uint8ArrayToStr)(response);
226
- const okRegex = (0, utils_2.makeRegex)('^HTTP\\/1.1 2\\d{2}');
227
- const matchRes = okRegex.exec(res);
228
- if (!matchRes) {
229
- const statusRegex = (0, utils_2.makeRegex)('^HTTP\\/1.1 (\\d{3})');
230
- const matchRes = statusRegex.exec(res);
231
- if (matchRes && matchRes.length > 1) {
232
- throw new Error(`Provider returned error ${matchRes[1]}"`);
233
- }
234
- let lineEnd = res.indexOf('*');
235
- if (lineEnd === -1) {
236
- lineEnd = res.indexOf('\n');
237
- }
238
- if (lineEnd === -1) {
239
- lineEnd = OK_HTTP_HEADER.length;
240
- }
241
- throw new Error(`Response did not start with \"HTTP/1.1 2XX\" got "${res.slice(0, lineEnd)}"`);
242
- }
243
- let bodyStart;
244
- if (shouldRevealCrlf(ctx)) {
245
- bodyStart = res.indexOf('\r\n\r\n', OK_HTTP_HEADER.length) + 4;
246
- if (bodyStart < 4) {
247
- throw new Error('Response body start not found');
248
- }
249
- }
250
- else {
251
- bodyStart = OK_HTTP_HEADER.length;
252
- }
253
- //validate server Date header if present
254
- const dateHeader = (0, utils_2.makeRegex)(dateHeaderRegex).exec(res);
255
- if ((dateHeader === null || dateHeader === void 0 ? void 0 : dateHeader.length) > 1) {
256
- const serverDate = new Date(dateHeader[1]);
257
- if ((Date.now() - serverDate.getTime()) > dateDiff) {
258
- logger.info({ dateHeader: dateHeader[0], current: Date.now() }, 'date header is off');
259
- throw new Error(`Server date is off by "${(Date.now() - serverDate.getTime()) / 1000} s"`);
260
- }
261
- }
262
- const paramBody = params.body instanceof Uint8Array
263
- ? params.body
264
- : (0, tls_1.strToUint8Array)(params.body || '');
265
- if (paramBody.length > 0 && !(0, utils_2.matchRedactedStrings)(paramBody, req.body)) {
266
- throw new Error('request body mismatch');
267
- }
268
- //remove asterisks to account for chunks in the middle of revealed strings
269
- if (!secretParams) {
270
- res = res.slice(bodyStart).replace(/(\*){3,}/g, '');
271
- }
272
- for (const { type, value, invert } of params.responseMatches || []) {
273
- const inv = Boolean(invert); // explicitly cast to boolean
274
- switch (type) {
275
- case 'regex':
276
- const regexRes = (0, utils_2.makeRegex)(value).exec(res);
277
- const match = regexRes !== null;
278
- if (match === inv) { // if both true or both false then fail
279
- throw new Error('Invalid receipt.'
280
- + ` Regex "${value}" ${invert ? 'matched' : "didn't match"}`);
281
- }
282
- if (!match) {
283
- continue;
284
- }
285
- const groups = regexRes === null || regexRes === void 0 ? void 0 : regexRes.groups;
286
- for (const paramName in groups || []) {
287
- if (paramName in extractedParams) {
288
- throw new Error(`Duplicate parameter ${paramName}`);
289
- }
290
- extractedParams[paramName] = groups[paramName];
291
- }
292
- break;
293
- case 'contains':
294
- const includes = res.includes(value);
295
- if (includes === inv) {
296
- throw new Error(`Invalid receipt. Response ${invert ? 'contains' : 'does not contain'} "${value}"`);
297
- }
298
- break;
299
- default:
300
- throw new Error(`Invalid response match type ${type}`);
28
+ hostPort: getHostPort,
29
+ writeRedactionMode(params) {
30
+ return "writeRedactionMode" in params ? params.writeRedactionMode : void 0;
31
+ },
32
+ geoLocation(params, secretParams) {
33
+ return "geoLocation" in params ? getGeoLocation(params, secretParams) : void 0;
34
+ },
35
+ proxySessionId(params, secretParams) {
36
+ return "proxySessionId" in params ? getProxySessionId(params, secretParams) : void 0;
37
+ },
38
+ additionalClientOptions(params) {
39
+ let defaultOptions = {
40
+ applicationLayerProtocols: ["http/1.1"]
41
+ };
42
+ if ("additionalClientOptions" in params) {
43
+ defaultOptions = {
44
+ ...defaultOptions,
45
+ ...params.additionalClientOptions
46
+ };
47
+ }
48
+ return defaultOptions;
49
+ },
50
+ createRequest(secretParams, params, logger2) {
51
+ if (!secretParams.cookieStr && !secretParams.authorisationHeader && !secretParams.headers) {
52
+ throw new Error("auth parameters are not set");
53
+ }
54
+ const pubHeaders = params.headers || {};
55
+ const secHeaders = { ...secretParams.headers };
56
+ if (secretParams.cookieStr) {
57
+ secHeaders["Cookie"] = secretParams.cookieStr;
58
+ }
59
+ if (secretParams.authorisationHeader) {
60
+ secHeaders["Authorization"] = secretParams.authorisationHeader;
61
+ }
62
+ const hasUserAgent = Object.keys(pubHeaders).some((k) => k.toLowerCase() === "user-agent") || Object.keys(secHeaders).some((k) => k.toLowerCase() === "user-agent");
63
+ if (!hasUserAgent) {
64
+ pubHeaders["User-Agent"] = RECLAIM_USER_AGENT;
65
+ }
66
+ const newParams = substituteParamValues(params, secretParams);
67
+ params = newParams.newParams;
68
+ const url = new URL(params.url);
69
+ const { pathname } = url;
70
+ const searchParams = params.url.includes("?") ? params.url.split("?")[1] : "";
71
+ logger2.info({ url: params.url, path: pathname, query: searchParams.toString() });
72
+ const body = params.body instanceof Uint8Array ? params.body : strToUint8Array(params.body || "");
73
+ const contentLength = body.length;
74
+ const reqLine = `${params.method} ${pathname}${searchParams?.length ? "?" + searchParams : ""} HTTP/1.1`;
75
+ const secHeadersList = buildHeaders(secHeaders);
76
+ logger2.info({ requestLine: reqLine });
77
+ const httpReqHeaderStr = [
78
+ reqLine,
79
+ `Host: ${getHostHeaderString(url)}`,
80
+ `Content-Length: ${contentLength}`,
81
+ "Connection: close",
82
+ //no compression
83
+ "Accept-Encoding: identity",
84
+ ...buildHeaders(pubHeaders),
85
+ ...secHeadersList,
86
+ "\r\n"
87
+ ].join("\r\n");
88
+ const headerStr = strToUint8Array(httpReqHeaderStr);
89
+ const data = concatenateUint8Arrays([headerStr, body]);
90
+ const secHeadersStr = secHeadersList.join("\r\n");
91
+ const tokenStartIndex = findIndexInUint8Array(data, strToUint8Array(secHeadersStr));
92
+ const redactions = [
93
+ {
94
+ fromIndex: tokenStartIndex,
95
+ toIndex: tokenStartIndex + secHeadersStr.length
96
+ }
97
+ ];
98
+ if (newParams.hiddenBodyParts?.length > 0) {
99
+ for (const hiddenBodyPart of newParams.hiddenBodyParts) {
100
+ if (hiddenBodyPart.length) {
101
+ redactions.push({
102
+ fromIndex: headerStr.length + hiddenBodyPart.index,
103
+ toIndex: headerStr.length + hiddenBodyPart.index + hiddenBodyPart.length
104
+ });
105
+ }
106
+ }
107
+ }
108
+ if (newParams.hiddenURLParts?.length > 0) {
109
+ for (const hiddenURLPart of newParams.hiddenURLParts) {
110
+ if (hiddenURLPart.length) {
111
+ redactions.push({
112
+ fromIndex: hiddenURLPart.index,
113
+ toIndex: hiddenURLPart.index + hiddenURLPart.length
114
+ });
115
+ }
116
+ }
117
+ }
118
+ redactions.sort((a, b) => a.toIndex - b.toIndex);
119
+ return {
120
+ data,
121
+ redactions
122
+ };
123
+ },
124
+ getResponseRedactions({ response, params: rawParams, logger: logger2, ctx }) {
125
+ logger2.debug({ response: encodeBase64(response), params: rawParams });
126
+ const res = parseHttpResponse(response);
127
+ if (!rawParams.responseRedactions?.length) {
128
+ return [];
129
+ }
130
+ if (res.statusCode / 100 >> 0 !== 2) {
131
+ logger2.error({ response: encodeBase64(response), params: rawParams });
132
+ throw new Error(
133
+ `Expected status 2xx, got ${res.statusCode} (${res.statusMessage})`
134
+ );
135
+ }
136
+ const newParams = substituteParamValues(rawParams, void 0, true);
137
+ const params = newParams.newParams;
138
+ const headerEndIndex = res.statusLineEndIndex;
139
+ const bodyStartIdx = res.bodyStartIndex ?? 0;
140
+ if (bodyStartIdx < 4) {
141
+ logger2.error({ response: encodeBase64(response) });
142
+ throw new Error("Failed to find response body");
143
+ }
144
+ const reveals = [
145
+ { fromIndex: 0, toIndex: headerEndIndex }
146
+ ];
147
+ if (shouldRevealCrlf(ctx)) {
148
+ const crlfs = response.slice(res.headerEndIdx, res.headerEndIdx + 4);
149
+ if (!areUint8ArraysEqual(crlfs, strToUint8Array("\r\n\r\n"))) {
150
+ logger2.error({ response: encodeBase64(response) });
151
+ throw new Error(
152
+ `Failed to find header/body separator at index ${res.headerEndIdx}`
153
+ );
154
+ }
155
+ }
156
+ reveals.push({ fromIndex: res.headerEndIdx, toIndex: res.headerEndIdx + 4 });
157
+ if (res.headerIndices["date"]) {
158
+ reveals.push(res.headerIndices["date"]);
159
+ }
160
+ const body = uint8ArrayToBinaryStr(res.body);
161
+ const redactions = [];
162
+ for (const rs of params.responseRedactions || []) {
163
+ const processor = processRedactionRequest(
164
+ body,
165
+ rs,
166
+ bodyStartIdx,
167
+ res.chunks
168
+ );
169
+ for (const { reveal, redactions: reds } of processor) {
170
+ reveals.push(reveal);
171
+ redactions.push(...reds);
172
+ }
173
+ }
174
+ reveals.sort((a, b) => a.toIndex - b.toIndex);
175
+ if (reveals.length > 1) {
176
+ let currentIndex = 0;
177
+ for (const r of reveals) {
178
+ if (currentIndex < r.fromIndex) {
179
+ redactions.push({ fromIndex: currentIndex, toIndex: r.fromIndex });
180
+ }
181
+ currentIndex = r.toIndex;
182
+ }
183
+ redactions.push({ fromIndex: currentIndex, toIndex: response.length });
184
+ }
185
+ for (const r of reveals) {
186
+ if (!r.hash) {
187
+ continue;
188
+ }
189
+ redactions.push(r);
190
+ }
191
+ redactions.sort((a, b) => a.toIndex - b.toIndex);
192
+ return redactions;
193
+ },
194
+ assertValidProviderReceipt({ receipt, params: paramsAny, logger: logger2, ctx }) {
195
+ logTranscript();
196
+ let extractedParams = {};
197
+ const secretParams = "secretParams" in paramsAny ? paramsAny.secretParams : void 0;
198
+ const newParams = substituteParamValues(paramsAny, secretParams, !secretParams);
199
+ const params = newParams.newParams;
200
+ extractedParams = { ...extractedParams, ...newParams.extractedValues };
201
+ const req = getHttpRequestDataFromTranscript(receipt);
202
+ if (req.method !== params.method.toLowerCase()) {
203
+ throw new Error(`Invalid method: ${req.method}`);
204
+ }
205
+ const url = new URL(params.url);
206
+ const { protocol, pathname } = url;
207
+ if (protocol !== "https:") {
208
+ logger2.error("params URL: %s", params.url);
209
+ throw new Error(`Expected protocol: https, found: ${protocol}`);
210
+ }
211
+ const searchParams = params.url.includes("?") ? params.url.split("?")[1] : "";
212
+ const expectedPath = pathname.replaceAll("%7B", "{").replaceAll("%7D", "}") + (searchParams?.length ? "?" + searchParams : "");
213
+ if (!matchRedactedStrings(strToUint8Array(expectedPath), strToUint8Array(req.url))) {
214
+ logger2.error("params URL: %s", params.url);
215
+ throw new Error(`Expected path: ${expectedPath}, found: ${req.url}`);
216
+ }
217
+ const expectedHostStr = getHostHeaderString(url);
218
+ if (req.headers.host !== expectedHostStr) {
219
+ throw new Error(`Expected host: ${expectedHostStr}, found: ${req.headers.host}`);
220
+ }
221
+ const connectionHeader = req.headers["connection"];
222
+ if (connectionHeader !== "close") {
223
+ throw new Error(`Connection header must be "close", got "${connectionHeader}"`);
224
+ }
225
+ const serverBlocks = receipt.filter((s) => s.sender === "server").map((r) => r.message).filter((b) => !b.every((b2) => b2 === REDACTION_CHAR_CODE));
226
+ const response = concatArrays(...serverBlocks);
227
+ let res;
228
+ res = uint8ArrayToStr(response);
229
+ const okRegex = makeRegex("^HTTP\\/1.1 2\\d{2}");
230
+ const matchRes = okRegex.exec(res);
231
+ if (!matchRes) {
232
+ const statusRegex = makeRegex("^HTTP\\/1.1 (\\d{3})");
233
+ const matchRes2 = statusRegex.exec(res);
234
+ if (matchRes2 && matchRes2.length > 1) {
235
+ throw new Error(`Provider returned error ${matchRes2[1]}`);
236
+ }
237
+ let lineEnd = res.indexOf("*");
238
+ if (lineEnd === -1) {
239
+ lineEnd = res.indexOf("\n");
240
+ }
241
+ if (lineEnd === -1) {
242
+ lineEnd = OK_HTTP_HEADER.length;
243
+ }
244
+ throw new Error(
245
+ `Response did not start with "HTTP/1.1 2XX" got "${res.slice(0, lineEnd)}"`
246
+ );
247
+ }
248
+ let bodyStart;
249
+ if (shouldRevealCrlf(ctx)) {
250
+ bodyStart = res.indexOf("\r\n\r\n", OK_HTTP_HEADER.length) + 4;
251
+ if (bodyStart < 4) {
252
+ throw new Error("Response body start not found");
253
+ }
254
+ } else {
255
+ bodyStart = OK_HTTP_HEADER.length;
256
+ }
257
+ const dateHeader = makeRegex(dateHeaderRegex).exec(res);
258
+ if (dateHeader && dateHeader.length > 1) {
259
+ const serverDate = new Date(dateHeader[1]);
260
+ if (Date.now() - serverDate.getTime() > dateDiff) {
261
+ logger2.info({ dateHeader: dateHeader[0], current: Date.now() }, "date header is off");
262
+ }
263
+ }
264
+ const paramBody = params.body instanceof Uint8Array ? params.body : strToUint8Array(params.body || "");
265
+ if (paramBody.length > 0 && !matchRedactedStrings(paramBody, req.body)) {
266
+ throw new Error("request body mismatch");
267
+ }
268
+ if (!secretParams) {
269
+ res = res.slice(bodyStart).replace(/(\*){3,}/g, "");
270
+ }
271
+ for (const { type, value, invert } of params.responseMatches || []) {
272
+ const inv = Boolean(invert);
273
+ switch (type) {
274
+ case "regex":
275
+ const regexRes = makeRegex(value).exec(res);
276
+ const match = regexRes !== null;
277
+ if (match === inv) {
278
+ throw new Error(
279
+ `Invalid receipt. Regex "${value}" ${invert ? "matched" : "didn't match"}`
280
+ );
281
+ }
282
+ if (!match) {
283
+ continue;
284
+ }
285
+ const groups = regexRes?.groups;
286
+ for (const paramName in groups || []) {
287
+ if (paramName in extractedParams) {
288
+ throw new Error(`Duplicate parameter ${paramName}`);
301
289
  }
302
- }
303
- function concatArrays(...bufs) {
304
- const totalSize = bufs.reduce((acc, e) => acc + e.length, 0);
305
- const merged = new Uint8Array(totalSize);
306
- let lenDone = 0;
307
- for (const array of bufs) {
308
- merged.set(array, lenDone);
309
- lenDone += array.length;
290
+ const value2 = groups?.[paramName];
291
+ if (typeof value2 !== "string") {
292
+ continue;
310
293
  }
311
- return merged;
312
- }
313
- return { extractedParameters: extractedParams };
314
- function logTranscript() {
315
- const clientMsgs = receipt.filter(s => s.sender === 'client').map(m => m.message);
316
- const serverMsgs = receipt.filter(s => s.sender === 'server').map(m => m.message);
317
- const clientTranscript = utils_1.base64.encode((0, tls_1.concatenateUint8Arrays)(clientMsgs));
318
- const serverTranscript = utils_1.base64.encode((0, tls_1.concatenateUint8Arrays)(serverMsgs));
319
- logger.debug({ request: clientTranscript, response: serverTranscript, params: paramsAny });
320
- }
321
- },
294
+ extractedParams[paramName] = value2;
295
+ }
296
+ break;
297
+ case "contains":
298
+ const includes = res.includes(value);
299
+ if (includes === inv) {
300
+ throw new Error(
301
+ `Invalid receipt. Response ${invert ? "contains" : "does not contain"} "${value}"`
302
+ );
303
+ }
304
+ break;
305
+ default:
306
+ throw new Error(`Invalid response match type ${type}`);
307
+ }
308
+ }
309
+ function concatArrays(...bufs) {
310
+ const totalSize = bufs.reduce((acc, e) => acc + e.length, 0);
311
+ const merged = new Uint8Array(totalSize);
312
+ let lenDone = 0;
313
+ for (const array of bufs) {
314
+ merged.set(array, lenDone);
315
+ lenDone += array.length;
316
+ }
317
+ return merged;
318
+ }
319
+ return { extractedParameters: extractedParams };
320
+ function logTranscript() {
321
+ const clientMsgs = receipt.filter((s) => s.sender === "client").map((m) => m.message);
322
+ const serverMsgs = receipt.filter((s) => s.sender === "server").map((m) => m.message);
323
+ const clientTranscript = encodeBase64(concatenateUint8Arrays(clientMsgs));
324
+ const serverTranscript = encodeBase64(concatenateUint8Arrays(serverMsgs));
325
+ logger2.debug({ request: clientTranscript, response: serverTranscript, params: paramsAny });
326
+ }
327
+ }
322
328
  };
323
- // revealing CRLF is a breaking change -- and should only be done
324
- // if the client's version supports it
325
329
  function shouldRevealCrlf({ version }) {
326
- return version >= api_1.AttestorVersion.ATTESTOR_VERSION_2_0_1;
330
+ return version >= AttestorVersion.ATTESTOR_VERSION_2_0_1;
327
331
  }
328
332
  function getHostPort(params, secretParams) {
329
- const { host } = new URL(getURL(params, secretParams));
330
- if (!host) {
331
- throw new Error('url is incorrect');
332
- }
333
- return host;
333
+ const { host } = new URL(getURL(params, secretParams));
334
+ if (!host) {
335
+ throw new Error("url is incorrect");
336
+ }
337
+ return host;
334
338
  }
335
- /**
336
- * Obtain the host header string from the URL.
337
- * https://stackoverflow.com/a/3364396
338
- */
339
339
  function getHostHeaderString(url) {
340
- const host = url.hostname;
341
- const port = url.port;
342
- return port && +port !== config_1.DEFAULT_HTTPS_PORT
343
- ? `${host}:${port}`
344
- : host;
340
+ const host = url.hostname;
341
+ const port = url.port;
342
+ return port && +port !== DEFAULT_HTTPS_PORT ? `${host}:${port}` : host;
345
343
  }
346
344
  const paramsRegex = /{{([^{}]+)}}/sgi;
347
345
  function* processRedactionRequest(body, rs, bodyStartIdx, resChunks) {
348
- let element = body;
349
- let elementIdx = 0;
350
- let elementLength = -1;
351
- if (rs.xPath) {
352
- const indexes = (0, utils_2.extractHTMLElementsIndexes)(body, rs.xPath, !!rs.jsonPath);
353
- for (const { start, end } of indexes) {
354
- element = body.slice(start, end);
355
- elementIdx = start;
356
- elementLength = end - start;
357
- if (rs.jsonPath) {
358
- yield* processJsonPath();
359
- }
360
- else if (rs.regex) {
361
- yield* processRegexp();
362
- }
363
- else {
364
- yield* addRedaction();
365
- }
366
- }
367
- }
368
- else if (rs.jsonPath) {
346
+ let element = body;
347
+ let elementIdx = 0;
348
+ let elementLength = -1;
349
+ if (rs.xPath) {
350
+ const indexes = extractHTMLElementsIndexes(body, rs.xPath, !!rs.jsonPath);
351
+ for (const { start, end } of indexes) {
352
+ element = body.slice(start, end);
353
+ elementIdx = start;
354
+ elementLength = end - start;
355
+ if (rs.jsonPath) {
369
356
  yield* processJsonPath();
357
+ } else if (rs.regex) {
358
+ yield* processRegexp();
359
+ } else {
360
+ yield* addRedaction();
361
+ }
370
362
  }
371
- else if (rs.regex) {
363
+ } else if (rs.jsonPath) {
364
+ yield* processJsonPath();
365
+ } else if (rs.regex) {
366
+ yield* processRegexp();
367
+ } else {
368
+ throw new Error(
369
+ "Expected either xPath, jsonPath or regex for redaction"
370
+ );
371
+ }
372
+ function* processJsonPath() {
373
+ const jsonPathIndexes = extractJSONValueIndexes(element, rs.jsonPath);
374
+ const eIndex = elementIdx;
375
+ for (const ji of jsonPathIndexes) {
376
+ const jStart = ji.start;
377
+ const jEnd = ji.end;
378
+ element = body.slice(eIndex + jStart, eIndex + jEnd);
379
+ elementIdx = eIndex + jStart;
380
+ elementLength = jEnd - jStart;
381
+ if (rs.regex) {
372
382
  yield* processRegexp();
383
+ } else {
384
+ yield* addRedaction();
385
+ }
373
386
  }
374
- else {
375
- throw new Error('Expected either xPath, jsonPath or regex for redaction');
376
- }
377
- function* processJsonPath() {
378
- const jsonPathIndexes = (0, utils_2.extractJSONValueIndexes)(element, rs.jsonPath);
379
- // eslint-disable-next-line max-depth
380
- const eIndex = elementIdx;
381
- for (const ji of jsonPathIndexes) {
382
- const jStart = ji.start;
383
- const jEnd = ji.end;
384
- element = body.slice(eIndex + jStart, eIndex + jEnd);
385
- elementIdx = eIndex + jStart;
386
- elementLength = jEnd - jStart;
387
- // eslint-disable-next-line max-depth
388
- if (rs.regex) {
389
- yield* processRegexp();
390
- }
391
- else {
392
- yield* addRedaction();
393
- }
394
- }
387
+ }
388
+ function* processRegexp() {
389
+ logger.debug({
390
+ element: encodeBase64(strToUint8Array(element)),
391
+ body: encodeBase64(strToUint8Array(body))
392
+ });
393
+ const regexp = makeRegex(rs.regex);
394
+ const elem = element || body;
395
+ const match = regexp.exec(elem);
396
+ if (!match?.[0]) {
397
+ throw new Error(
398
+ `regexp ${rs.regex} does not match found element '${encodeBase64(strToUint8Array(elem))}'`
399
+ );
395
400
  }
396
- function* processRegexp() {
397
- utils_3.logger.debug({ element: utils_1.base64.encode((0, tls_1.strToUint8Array)(element)), body: utils_1.base64.encode((0, tls_1.strToUint8Array)(body)) });
398
- const regexp = (0, utils_2.makeRegex)(rs.regex);
399
- const elem = element || body;
400
- const match = regexp.exec(elem);
401
- // eslint-disable-next-line max-depth
402
- if (!(match === null || match === void 0 ? void 0 : match[0])) {
403
- throw new Error(`regexp ${rs.regex} does not match found element '${utils_1.base64.encode((0, tls_1.strToUint8Array)(elem))}'`);
404
- }
405
- elementIdx += match.index;
406
- elementLength = regexp.lastIndex - match.index;
407
- element = match[0];
408
- if (rs.hash && (!match.groups || Object.keys(match.groups).length > 1)) {
409
- throw new Error('Exactly one named capture group is needed per hashed redaction');
410
- }
411
- // if there are groups in the regex,
412
- // we'll only hash the group values
413
- if (!rs.hash || !match.groups) {
414
- yield* addRedaction();
415
- return;
416
- }
417
- const fullStr = match[0];
418
- const grp = Object.values(match.groups)[0];
419
- const grpIdx = fullStr.indexOf(grp);
420
- // don't hash the entire regex, we'll hash the group values
421
- elementLength = grpIdx;
422
- element = fullStr.slice(0, grpIdx);
423
- yield* addRedaction(null);
424
- elementIdx += grpIdx;
425
- element = grp;
426
- elementLength = grp.length;
427
- const reveal = getReveal(elementIdx, elementLength, rs.hash);
428
- const chunkReds = (0, utils_2.getRedactionsForChunkHeaders)(reveal.fromIndex, reveal.toIndex, resChunks);
429
- if (chunkReds.length) {
430
- throw new Error('Hash redactions cannot be performed if '
431
- + 'the redacted string is split between 2'
432
- + ' or more HTTP chunks');
433
- }
434
- yield { reveal, redactions: chunkReds };
435
- elementIdx += grp.length;
436
- element = fullStr.slice(grpIdx + grp.length);
437
- elementLength = element.length;
438
- yield* addRedaction(null);
439
- }
440
- // eslint-disable-next-line unicorn/consistent-function-scoping
441
- function* addRedaction(hash = rs.hash, _resChunks = resChunks) {
442
- if (elementIdx < 0 || !elementLength) {
443
- return;
444
- }
445
- const reveal = getReveal(elementIdx, elementLength, hash || undefined);
446
- yield {
447
- reveal,
448
- redactions: (0, utils_2.getRedactionsForChunkHeaders)(reveal.fromIndex, reveal.toIndex, _resChunks)
449
- };
401
+ elementIdx += match.index;
402
+ elementLength = regexp.lastIndex - match.index;
403
+ element = match[0];
404
+ if (rs.hash && (!match.groups || Object.keys(match.groups).length > 1)) {
405
+ throw new Error(
406
+ "Exactly one named capture group is needed per hashed redaction"
407
+ );
408
+ }
409
+ if (!rs.hash || !match.groups) {
410
+ yield* addRedaction();
411
+ return;
450
412
  }
451
- function getReveal(startIdx, len, hash) {
452
- const from = (0, utils_2.convertResponsePosToAbsolutePos)(startIdx, bodyStartIdx, resChunks);
453
- const to = (0, utils_2.convertResponsePosToAbsolutePos)(startIdx + len, bodyStartIdx, resChunks);
454
- return { fromIndex: from, toIndex: to, hash };
413
+ const fullStr = match[0];
414
+ const grp = Object.values(match.groups)[0];
415
+ const grpIdx = fullStr.indexOf(grp);
416
+ elementLength = grpIdx;
417
+ element = fullStr.slice(0, grpIdx);
418
+ yield* addRedaction(null);
419
+ elementIdx += grpIdx;
420
+ element = grp;
421
+ elementLength = grp.length;
422
+ const reveal = getReveal(elementIdx, elementLength, rs.hash);
423
+ const chunkReds = getRedactionsForChunkHeaders(reveal.fromIndex, reveal.toIndex, resChunks);
424
+ if (chunkReds.length) {
425
+ throw new Error(
426
+ "Hash redactions cannot be performed if the redacted string is split between 2 or more HTTP chunks"
427
+ );
455
428
  }
429
+ yield { reveal, redactions: chunkReds };
430
+ elementIdx += grp.length;
431
+ element = fullStr.slice(grpIdx + grp.length);
432
+ elementLength = element.length;
433
+ yield* addRedaction(null);
434
+ }
435
+ function* addRedaction(hash = rs.hash, _resChunks = resChunks) {
436
+ if (elementIdx < 0 || !elementLength) {
437
+ return;
438
+ }
439
+ const reveal = getReveal(elementIdx, elementLength, hash || void 0);
440
+ yield {
441
+ reveal,
442
+ redactions: getRedactionsForChunkHeaders(
443
+ reveal.fromIndex,
444
+ reveal.toIndex,
445
+ _resChunks
446
+ )
447
+ };
448
+ }
449
+ function getReveal(startIdx, len, hash) {
450
+ const from = convertResponsePosToAbsolutePos(
451
+ startIdx,
452
+ bodyStartIdx,
453
+ resChunks
454
+ );
455
+ const to = convertResponsePosToAbsolutePos(
456
+ startIdx + len,
457
+ bodyStartIdx,
458
+ resChunks
459
+ );
460
+ return { fromIndex: from, toIndex: to, hash };
461
+ }
456
462
  }
457
463
  function substituteParamValues(currentParams, secretParams, ignoreMissingParams) {
458
- const params = JSON.parse(JSON.stringify(currentParams));
459
- let extractedValues = {};
460
- const hiddenURLParts = [];
461
- const urlParams = extractAndReplaceTemplateValues(params.url, ignoreMissingParams);
462
- if (urlParams) {
463
- params.url = urlParams.newParam;
464
- extractedValues = { ...urlParams.extractedValues };
465
- if (urlParams.hiddenParts.length) {
466
- const host = getHostHeaderString(new URL(params.url));
467
- const offset = `https://${host}`.length - currentParams.method.length - 1; //space between method and start of the path
468
- for (const hiddenURLPart of urlParams.hiddenParts) {
469
- hiddenURLParts.push({ index: hiddenURLPart.index - offset, length: hiddenURLPart.length });
470
- }
471
- }
464
+ const params = JSON.parse(JSON.stringify(currentParams));
465
+ let extractedValues = {};
466
+ const hiddenURLParts = [];
467
+ const urlParams = extractAndReplaceTemplateValues(params.url, ignoreMissingParams);
468
+ if (urlParams) {
469
+ params.url = urlParams.newParam;
470
+ extractedValues = { ...urlParams.extractedValues };
471
+ if (urlParams.hiddenParts.length) {
472
+ const host = getHostHeaderString(new URL(params.url));
473
+ const offset = `https://${host}`.length - currentParams.method.length - 1;
474
+ for (const hiddenURLPart of urlParams.hiddenParts) {
475
+ hiddenURLParts.push({ index: hiddenURLPart.index - offset, length: hiddenURLPart.length });
476
+ }
472
477
  }
473
- let bodyParams;
474
- let hiddenBodyParts = [];
475
- if (params.body) {
476
- const strBody = typeof params.body === 'string' ? params.body : (0, utils_3.uint8ArrayToStr)(params.body);
477
- bodyParams = extractAndReplaceTemplateValues(strBody, ignoreMissingParams);
478
- if (bodyParams) {
479
- params.body = bodyParams.newParam;
480
- extractedValues = { ...extractedValues, ...bodyParams.extractedValues };
481
- hiddenBodyParts = bodyParams.hiddenParts;
482
- }
478
+ }
479
+ let bodyParams;
480
+ let hiddenBodyParts = [];
481
+ if (params.body) {
482
+ const strBody = typeof params.body === "string" ? params.body : uint8ArrayToStr(params.body);
483
+ bodyParams = extractAndReplaceTemplateValues(strBody, ignoreMissingParams);
484
+ if (bodyParams) {
485
+ params.body = bodyParams.newParam;
486
+ extractedValues = { ...extractedValues, ...bodyParams.extractedValues };
487
+ hiddenBodyParts = bodyParams.hiddenParts;
483
488
  }
484
- const geoParams = extractAndReplaceTemplateValues(params.geoLocation);
485
- if (geoParams) {
486
- params.geoLocation = geoParams.newParam;
487
- extractedValues = { ...extractedValues, ...geoParams.extractedValues };
489
+ }
490
+ const geoParams = extractAndReplaceTemplateValues(params.geoLocation);
491
+ if (geoParams) {
492
+ params.geoLocation = geoParams.newParam;
493
+ extractedValues = { ...extractedValues, ...geoParams.extractedValues };
494
+ }
495
+ const proxySessionIdParams = extractAndReplaceTemplateValues(params.proxySessionId);
496
+ if (proxySessionIdParams) {
497
+ params.proxySessionId = proxySessionIdParams.newParam;
498
+ extractedValues = { ...extractedValues, ...proxySessionIdParams.extractedValues };
499
+ }
500
+ if (params.responseRedactions) {
501
+ for (const r of params.responseRedactions) {
502
+ if (r.regex) {
503
+ const regexParams = extractAndReplaceTemplateValues(r.regex);
504
+ r.regex = regexParams?.newParam;
505
+ }
506
+ if (r.xPath) {
507
+ const xpathParams = extractAndReplaceTemplateValues(r.xPath);
508
+ r.xPath = xpathParams?.newParam;
509
+ }
510
+ if (r.jsonPath) {
511
+ const jsonPathParams = extractAndReplaceTemplateValues(r.jsonPath);
512
+ r.jsonPath = jsonPathParams?.newParam;
513
+ }
488
514
  }
489
- if (params.responseRedactions) {
490
- for (const r of params.responseRedactions) {
491
- if (r.regex) {
492
- const regexParams = extractAndReplaceTemplateValues(r.regex);
493
- r.regex = regexParams === null || regexParams === void 0 ? void 0 : regexParams.newParam;
494
- }
495
- if (r.xPath) {
496
- const xpathParams = extractAndReplaceTemplateValues(r.xPath);
497
- r.xPath = xpathParams === null || xpathParams === void 0 ? void 0 : xpathParams.newParam;
498
- }
499
- if (r.jsonPath) {
500
- const jsonPathParams = extractAndReplaceTemplateValues(r.jsonPath);
501
- r.jsonPath = jsonPathParams === null || jsonPathParams === void 0 ? void 0 : jsonPathParams.newParam;
502
- }
503
- }
515
+ }
516
+ if (params.responseMatches) {
517
+ for (const r of params.responseMatches) {
518
+ if (r.value !== "") {
519
+ const matchParam = extractAndReplaceTemplateValues(r.value);
520
+ r.value = matchParam?.newParam;
521
+ extractedValues = { ...extractedValues, ...matchParam?.extractedValues };
522
+ }
504
523
  }
505
- if (params.responseMatches) {
506
- for (const r of params.responseMatches) {
507
- if (r.value !== '') {
508
- const matchParam = extractAndReplaceTemplateValues(r.value);
509
- r.value = matchParam === null || matchParam === void 0 ? void 0 : matchParam.newParam;
510
- extractedValues = { ...extractedValues, ...matchParam === null || matchParam === void 0 ? void 0 : matchParam.extractedValues };
511
- }
512
- }
524
+ }
525
+ return {
526
+ newParams: params,
527
+ extractedValues,
528
+ hiddenBodyParts,
529
+ hiddenURLParts
530
+ };
531
+ function extractAndReplaceTemplateValues(param, ignoreMissingParams2) {
532
+ if (!param) {
533
+ return null;
513
534
  }
535
+ const extractedValues2 = {};
536
+ const hiddenParts = [];
537
+ let totalOffset = 0;
538
+ param = param.replace(paramsRegex, (match, pn, offset) => {
539
+ if (params.paramValues && pn in params.paramValues) {
540
+ extractedValues2[pn] = params.paramValues[pn];
541
+ totalOffset += params.paramValues[pn].length - match.length;
542
+ return params.paramValues[pn];
543
+ } else if (secretParams) {
544
+ if (secretParams?.paramValues && pn in secretParams?.paramValues) {
545
+ hiddenParts.push({
546
+ index: offset + totalOffset,
547
+ length: secretParams.paramValues[pn].length
548
+ });
549
+ totalOffset += secretParams.paramValues[pn].length - match.length;
550
+ return secretParams.paramValues[pn];
551
+ } else {
552
+ throw new Error(`parameter's "${pn}" value not found in paramValues and secret parameter's paramValues`);
553
+ }
554
+ } else {
555
+ if (!!!ignoreMissingParams2) {
556
+ throw new Error(`parameter's "${pn}" value not found in paramValues`);
557
+ } else {
558
+ return match;
559
+ }
560
+ }
561
+ });
514
562
  return {
515
- newParams: params,
516
- extractedValues: extractedValues,
517
- hiddenBodyParts: hiddenBodyParts,
518
- hiddenURLParts: hiddenURLParts
563
+ newParam: param,
564
+ extractedValues: extractedValues2,
565
+ hiddenParts
519
566
  };
520
- function extractAndReplaceTemplateValues(param, ignoreMissingParams) {
521
- if (!param) {
522
- return null;
523
- }
524
- //const paramNames: Set<string> = new Set()
525
- const extractedValues = {};
526
- const hiddenParts = [];
527
- let totalOffset = 0;
528
- param = param.replace(paramsRegex, (match, pn, offset) => {
529
- if (params.paramValues && pn in params.paramValues) {
530
- extractedValues[pn] = params.paramValues[pn];
531
- totalOffset += params.paramValues[pn].length - match.length;
532
- return params.paramValues[pn];
533
- }
534
- else if (secretParams) {
535
- if ((secretParams === null || secretParams === void 0 ? void 0 : secretParams.paramValues) && pn in (secretParams === null || secretParams === void 0 ? void 0 : secretParams.paramValues)) {
536
- hiddenParts.push({
537
- index: offset + totalOffset,
538
- length: secretParams.paramValues[pn].length,
539
- });
540
- totalOffset += secretParams.paramValues[pn].length - match.length;
541
- return secretParams.paramValues[pn];
542
- }
543
- else {
544
- throw new Error(`parameter's "${pn}" value not found in paramValues and secret parameter's paramValues`);
545
- }
546
- }
547
- else {
548
- if (!(!!ignoreMissingParams)) {
549
- throw new Error(`parameter's "${pn}" value not found in paramValues`);
550
- }
551
- else {
552
- return match;
553
- }
554
- }
555
- });
556
- return {
557
- newParam: param,
558
- extractedValues: extractedValues,
559
- hiddenParts: hiddenParts
560
- };
561
- }
567
+ }
562
568
  }
563
569
  function getGeoLocation(v2Params, secretParams) {
564
- if (v2Params === null || v2Params === void 0 ? void 0 : v2Params.geoLocation) {
565
- const paramNames = new Set();
566
- let geo = v2Params.geoLocation;
567
- //extract param names
568
- let match = null;
569
- while (match = paramsRegex.exec(geo)) {
570
- paramNames.add(match[1]);
571
- }
572
- for (const pn of paramNames) {
573
- if (v2Params.paramValues && pn in v2Params.paramValues) {
574
- geo = geo === null || geo === void 0 ? void 0 : geo.replaceAll(`{{${pn}}}`, v2Params.paramValues[pn].toString());
575
- }
576
- else if ((secretParams === null || secretParams === void 0 ? void 0 : secretParams.paramValues) && pn in secretParams.paramValues) {
577
- geo = geo === null || geo === void 0 ? void 0 : geo.replaceAll(`{{${pn}}}`, secretParams.paramValues[pn].toString());
578
- }
579
- else {
580
- throw new Error(`parameter "${pn}" value not found in templateParams`);
581
- }
582
- }
583
- const geoRegex = /^[A-Za-z]{2}$/sgiu;
584
- if (!geoRegex.test(geo)) {
585
- throw new Error(`Geolocation ${geo} is invalid`);
586
- }
587
- return geo;
570
+ if (v2Params?.geoLocation) {
571
+ const paramNames = /* @__PURE__ */ new Set();
572
+ let geo = v2Params.geoLocation;
573
+ let match = null;
574
+ while (match = paramsRegex.exec(geo)) {
575
+ paramNames.add(match[1]);
576
+ }
577
+ for (const pn of paramNames) {
578
+ if (v2Params.paramValues && pn in v2Params.paramValues) {
579
+ geo = geo?.replaceAll(`{{${pn}}}`, v2Params.paramValues[pn].toString());
580
+ } else if (secretParams?.paramValues && pn in secretParams.paramValues) {
581
+ geo = geo?.replaceAll(`{{${pn}}}`, secretParams.paramValues[pn].toString());
582
+ } else {
583
+ throw new Error(`parameter "${pn}" value not found in templateParams`);
584
+ }
585
+ }
586
+ const geoRegex = /^[A-Za-z]{2}$/sgiu;
587
+ if (!geoRegex.test(geo)) {
588
+ throw new Error(`Geolocation ${geo} is invalid`);
588
589
  }
589
- return undefined;
590
+ return geo;
591
+ }
592
+ return void 0;
590
593
  }
591
- function getURL(v2Params, secretParams) {
592
- let hostPort = v2Params === null || v2Params === void 0 ? void 0 : v2Params.url;
593
- const paramNames = new Set();
594
- //extract param names
594
+ function getProxySessionId(v2Params, secretParams) {
595
+ if (v2Params?.proxySessionId) {
596
+ const paramNames = /* @__PURE__ */ new Set();
597
+ let proxySessionIdValue = v2Params.proxySessionId;
595
598
  let match = null;
596
- while (match = paramsRegex.exec(hostPort)) {
597
- paramNames.add(match[1]);
599
+ while (match = paramsRegex.exec(proxySessionIdValue)) {
600
+ paramNames.add(match[1]);
598
601
  }
599
602
  for (const pn of paramNames) {
600
- if (v2Params.paramValues && pn in v2Params.paramValues) {
601
- hostPort = hostPort === null || hostPort === void 0 ? void 0 : hostPort.replaceAll(`{{${pn}}}`, v2Params.paramValues[pn].toString());
602
- }
603
- else if ((secretParams === null || secretParams === void 0 ? void 0 : secretParams.paramValues) && pn in secretParams.paramValues) {
604
- hostPort = hostPort === null || hostPort === void 0 ? void 0 : hostPort.replaceAll(`{{${pn}}}`, secretParams.paramValues[pn].toString());
605
- }
606
- else {
607
- throw new Error(`parameter "${pn}" value not found in templateParams`);
608
- }
603
+ if (v2Params.paramValues && pn in v2Params.paramValues) {
604
+ proxySessionIdValue = proxySessionIdValue?.replaceAll(`{{${pn}}}`, v2Params.paramValues[pn].toString());
605
+ } else if (secretParams?.paramValues && pn in secretParams.paramValues) {
606
+ proxySessionIdValue = proxySessionIdValue?.replaceAll(`{{${pn}}}`, secretParams.paramValues[pn].toString());
607
+ } else {
608
+ throw new Error(`parameter "${pn}" value not found in templateParams`);
609
+ }
609
610
  }
610
- return hostPort;
611
+ if (!isValidProxySessionId(proxySessionIdValue)) {
612
+ throw new Error(`proxySessionId ${proxySessionIdValue} is invalid`);
613
+ }
614
+ return proxySessionIdValue;
615
+ }
616
+ return void 0;
611
617
  }
612
- exports.default = HTTP_PROVIDER;
613
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2h0dHAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw4Q0FBeUg7QUFDekgsNENBQXlDO0FBQ3pDLHVDQUFtRTtBQUNuRSx1Q0FBK0M7QUFDL0Msb0RBUWlDO0FBRWpDLHFDQU1rQjtBQUVsQixNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUE7QUFDckMsTUFBTSxlQUFlLEdBQUcsd0tBQXdLLENBQUE7QUFDaE0sTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUEsQ0FBQywwQkFBMEI7QUFNMUQsTUFBTSxhQUFhLEdBQXFCO0lBQ3ZDLFFBQVEsRUFBRSxXQUFXO0lBQ3JCLGtCQUFrQixDQUFDLE1BQU07UUFDeEIsT0FBTyxDQUFDLG9CQUFvQixJQUFJLE1BQU0sQ0FBQztZQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtZQUMzQixDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ2IsQ0FBQztJQUNELFdBQVcsQ0FBQyxNQUFNLEVBQUUsWUFBWTtRQUMvQixPQUFPLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQztZQUMvQixDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7WUFDdEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNiLENBQUM7SUFDRCx1QkFBdUIsQ0FBQyxNQUFNO1FBQzdCLElBQUksY0FBYyxHQUF5QjtZQUMxQyx5QkFBeUIsRUFBRyxDQUFDLFVBQVUsQ0FBQztTQUN4QyxDQUFBO1FBQ0QsSUFBRyx5QkFBeUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN4QyxjQUFjLEdBQUc7Z0JBQ2hCLEdBQUcsY0FBYztnQkFDakIsR0FBRyxNQUFNLENBQUMsdUJBQXVCO2FBQ2pDLENBQUE7UUFDRixDQUFDO1FBRUQsT0FBTyxjQUFjLENBQUE7SUFDdEIsQ0FBQztJQUNELGFBQWEsQ0FB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
618
+ function getURL(v2Params, secretParams) {
619
+ let hostPort = v2Params?.url;
620
+ const paramNames = /* @__PURE__ */ new Set();
621
+ let match = null;
622
+ while (match = paramsRegex.exec(hostPort)) {
623
+ paramNames.add(match[1]);
624
+ }
625
+ for (const pn of paramNames) {
626
+ if (v2Params.paramValues && pn in v2Params.paramValues) {
627
+ hostPort = hostPort?.replaceAll(`{{${pn}}}`, v2Params.paramValues[pn].toString());
628
+ } else if (secretParams?.paramValues && pn in secretParams.paramValues) {
629
+ hostPort = hostPort?.replaceAll(`{{${pn}}}`, secretParams.paramValues[pn].toString());
630
+ } else {
631
+ throw new Error(`parameter "${pn}" value not found in templateParams`);
632
+ }
633
+ }
634
+ return hostPort;
635
+ }
636
+ var http_default = HTTP_PROVIDER;
637
+ export {
638
+ http_default as default,
639
+ substituteParamValues
640
+ };