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

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 (249) hide show
  1. package/LICENSE +660 -660
  2. package/README.md +1 -2
  3. package/package.json +72 -60
  4. package/lib/avs/abis/avsDirectoryABI.d.ts +0 -60
  5. package/lib/avs/abis/avsDirectoryABI.js +0 -344
  6. package/lib/avs/abis/delegationABI.d.ts +0 -126
  7. package/lib/avs/abis/delegationABI.js +0 -5
  8. package/lib/avs/abis/registryABI.d.ts +0 -136
  9. package/lib/avs/abis/registryABI.js +0 -729
  10. package/lib/avs/client/create-claim-on-avs.d.ts +0 -12
  11. package/lib/avs/client/create-claim-on-avs.js +0 -147
  12. package/lib/avs/config.d.ts +0 -7
  13. package/lib/avs/config.js +0 -24
  14. package/lib/avs/contracts/ReclaimServiceManager.d.ts +0 -697
  15. package/lib/avs/contracts/ReclaimServiceManager.js +0 -3
  16. package/lib/avs/contracts/common.d.ts +0 -21
  17. package/lib/avs/contracts/common.js +0 -3
  18. package/lib/avs/contracts/factories/ReclaimServiceManager__factory.d.ts +0 -888
  19. package/lib/avs/contracts/factories/ReclaimServiceManager__factory.js +0 -1174
  20. package/lib/avs/contracts/factories/index.d.ts +0 -1
  21. package/lib/avs/contracts/factories/index.js +0 -9
  22. package/lib/avs/contracts/index.d.ts +0 -3
  23. package/lib/avs/contracts/index.js +0 -40
  24. package/lib/avs/tests/test.operator.d.ts +0 -11
  25. package/lib/avs/tests/test.operator.js +0 -313
  26. package/lib/avs/tests/utils.d.ts +0 -2
  27. package/lib/avs/tests/utils.js +0 -50
  28. package/lib/avs/types/index.d.ts +0 -55
  29. package/lib/avs/types/index.js +0 -3
  30. package/lib/avs/utils/contracts.d.ts +0 -21
  31. package/lib/avs/utils/contracts.js +0 -38
  32. package/lib/avs/utils/register.d.ts +0 -27
  33. package/lib/avs/utils/register.js +0 -82
  34. package/lib/avs/utils/tasks.d.ts +0 -22
  35. package/lib/avs/utils/tasks.js +0 -45
  36. package/lib/client/create-claim.d.ts +0 -5
  37. package/lib/client/create-claim.js +0 -424
  38. package/lib/client/index.d.ts +0 -3
  39. package/lib/client/index.js +0 -20
  40. package/lib/client/tunnels/make-rpc-tcp-tunnel.d.ts +0 -16
  41. package/lib/client/tunnels/make-rpc-tcp-tunnel.js +0 -60
  42. package/lib/client/tunnels/make-rpc-tls-tunnel.d.ts +0 -25
  43. package/lib/client/tunnels/make-rpc-tls-tunnel.js +0 -135
  44. package/lib/client/utils/attestor-pool.d.ts +0 -6
  45. package/lib/client/utils/attestor-pool.js +0 -28
  46. package/lib/client/utils/client-socket.d.ts +0 -11
  47. package/lib/client/utils/client-socket.js +0 -100
  48. package/lib/client/utils/message-handler.d.ts +0 -4
  49. package/lib/client/utils/message-handler.js +0 -94
  50. package/lib/config/index.d.ts +0 -28
  51. package/lib/config/index.js +0 -39
  52. package/lib/index.d.ts +0 -10
  53. package/lib/index.js +0 -50
  54. package/lib/mechain/abis/governanceABI.d.ts +0 -50
  55. package/lib/mechain/abis/governanceABI.js +0 -462
  56. package/lib/mechain/abis/taskABI.d.ts +0 -157
  57. package/lib/mechain/abis/taskABI.js +0 -513
  58. package/lib/mechain/client/create-claim-on-mechain.d.ts +0 -10
  59. package/lib/mechain/client/create-claim-on-mechain.js +0 -32
  60. package/lib/mechain/client/index.d.ts +0 -1
  61. package/lib/mechain/client/index.js +0 -18
  62. package/lib/mechain/constants/index.d.ts +0 -3
  63. package/lib/mechain/constants/index.js +0 -7
  64. package/lib/mechain/index.d.ts +0 -2
  65. package/lib/mechain/index.js +0 -19
  66. package/lib/mechain/types/index.d.ts +0 -23
  67. package/lib/mechain/types/index.js +0 -3
  68. package/lib/proto/api.d.ts +0 -508
  69. package/lib/proto/api.js +0 -3700
  70. package/lib/providers/http/index.d.ts +0 -3
  71. package/lib/providers/http/index.js +0 -613
  72. package/lib/providers/http/utils.d.ts +0 -74
  73. package/lib/providers/http/utils.js +0 -360
  74. package/lib/providers/index.d.ts +0 -4
  75. package/lib/providers/index.js +0 -11
  76. package/lib/scripts/check-avs-registration.d.ts +0 -1
  77. package/lib/scripts/check-avs-registration.js +0 -29
  78. package/lib/scripts/generate-provider-types.d.ts +0 -5
  79. package/lib/scripts/generate-provider-types.js +0 -82
  80. package/lib/scripts/generate-receipt.d.ts +0 -9
  81. package/lib/scripts/generate-receipt.js +0 -90
  82. package/lib/scripts/generate-toprf-keys.d.ts +0 -1
  83. package/lib/scripts/generate-toprf-keys.js +0 -23
  84. package/lib/scripts/register-avs-operator.d.ts +0 -1
  85. package/lib/scripts/register-avs-operator.js +0 -7
  86. package/lib/scripts/start-server.d.ts +0 -1
  87. package/lib/scripts/start-server.js +0 -13
  88. package/lib/scripts/update-avs-metadata.d.ts +0 -1
  89. package/lib/scripts/update-avs-metadata.js +0 -22
  90. package/lib/scripts/utils.d.ts +0 -1
  91. package/lib/scripts/utils.js +0 -11
  92. package/lib/scripts/verify-root-ca.d.ts +0 -1
  93. package/lib/scripts/verify-root-ca.js +0 -51
  94. package/lib/scripts/whitelist-operator.d.ts +0 -1
  95. package/lib/scripts/whitelist-operator.js +0 -18
  96. package/lib/server/create-server.d.ts +0 -7
  97. package/lib/server/create-server.js +0 -92
  98. package/lib/server/handlers/claimTunnel.d.ts +0 -2
  99. package/lib/server/handlers/claimTunnel.js +0 -78
  100. package/lib/server/handlers/completeClaimOnChain.d.ts +0 -2
  101. package/lib/server/handlers/completeClaimOnChain.js +0 -28
  102. package/lib/server/handlers/createClaimOnChain.d.ts +0 -2
  103. package/lib/server/handlers/createClaimOnChain.js +0 -31
  104. package/lib/server/handlers/createTaskOnMechain.d.ts +0 -2
  105. package/lib/server/handlers/createTaskOnMechain.js +0 -52
  106. package/lib/server/handlers/createTunnel.d.ts +0 -2
  107. package/lib/server/handlers/createTunnel.js +0 -101
  108. package/lib/server/handlers/disconnectTunnel.d.ts +0 -2
  109. package/lib/server/handlers/disconnectTunnel.js +0 -10
  110. package/lib/server/handlers/index.d.ts +0 -4
  111. package/lib/server/handlers/index.js +0 -22
  112. package/lib/server/handlers/init.d.ts +0 -2
  113. package/lib/server/handlers/init.js +0 -36
  114. package/lib/server/handlers/toprf.d.ts +0 -2
  115. package/lib/server/handlers/toprf.js +0 -21
  116. package/lib/server/index.d.ts +0 -4
  117. package/lib/server/index.js +0 -21
  118. package/lib/server/socket.d.ts +0 -13
  119. package/lib/server/socket.js +0 -114
  120. package/lib/server/tunnels/make-tcp-tunnel.d.ts +0 -20
  121. package/lib/server/tunnels/make-tcp-tunnel.js +0 -175
  122. package/lib/server/utils/apm.d.ts +0 -11
  123. package/lib/server/utils/apm.js +0 -43
  124. package/lib/server/utils/assert-valid-claim-request.d.ts +0 -30
  125. package/lib/server/utils/assert-valid-claim-request.js +0 -200
  126. package/lib/server/utils/config-env.d.ts +0 -1
  127. package/lib/server/utils/config-env.js +0 -7
  128. package/lib/server/utils/dns.d.ts +0 -1
  129. package/lib/server/utils/dns.js +0 -22
  130. package/lib/server/utils/generics.d.ts +0 -22
  131. package/lib/server/utils/generics.js +0 -59
  132. package/lib/server/utils/iso.d.ts +0 -1
  133. package/lib/server/utils/iso.js +0 -260
  134. package/lib/server/utils/keep-alive.d.ts +0 -7
  135. package/lib/server/utils/keep-alive.js +0 -42
  136. package/lib/server/utils/process-handshake.d.ts +0 -13
  137. package/lib/server/utils/process-handshake.js +0 -191
  138. package/lib/tests/describe-with-server.d.ts +0 -20
  139. package/lib/tests/describe-with-server.js +0 -64
  140. package/lib/tests/mock-provider-server.d.ts +0 -13
  141. package/lib/tests/mock-provider-server.js +0 -65
  142. package/lib/tests/mocks.d.ts +0 -4
  143. package/lib/tests/mocks.js +0 -23
  144. package/lib/tests/test.auth.d.ts +0 -1
  145. package/lib/tests/test.auth.js +0 -75
  146. package/lib/tests/test.bgp-listener.d.ts +0 -1
  147. package/lib/tests/test.bgp-listener.js +0 -169
  148. package/lib/tests/test.claim-creation.d.ts +0 -1
  149. package/lib/tests/test.claim-creation.js +0 -280
  150. package/lib/tests/test.http-parser.d.ts +0 -1
  151. package/lib/tests/test.http-parser.js +0 -120
  152. package/lib/tests/test.http-provider-utils.d.ts +0 -1
  153. package/lib/tests/test.http-provider-utils.js +0 -2416
  154. package/lib/tests/test.http-provider.d.ts +0 -1
  155. package/lib/tests/test.http-provider.js +0 -114
  156. package/lib/tests/test.rpc-communication.d.ts +0 -1
  157. package/lib/tests/test.rpc-communication.js +0 -64
  158. package/lib/tests/test.rpc-tunnel.d.ts +0 -1
  159. package/lib/tests/test.rpc-tunnel.js +0 -172
  160. package/lib/tests/test.signatures.d.ts +0 -1
  161. package/lib/tests/test.signatures.js +0 -24
  162. package/lib/tests/test.tcp-tunnel.d.ts +0 -1
  163. package/lib/tests/test.tcp-tunnel.js +0 -64
  164. package/lib/tests/test.zk.d.ts +0 -1
  165. package/lib/tests/test.zk.js +0 -337
  166. package/lib/tests/utils.d.ts +0 -18
  167. package/lib/tests/utils.js +0 -64
  168. package/lib/types/bgp.d.ts +0 -11
  169. package/lib/types/bgp.js +0 -3
  170. package/lib/types/claims.d.ts +0 -73
  171. package/lib/types/claims.js +0 -3
  172. package/lib/types/client.d.ts +0 -163
  173. package/lib/types/client.js +0 -3
  174. package/lib/types/general.d.ts +0 -51
  175. package/lib/types/general.js +0 -3
  176. package/lib/types/handlers.d.ts +0 -10
  177. package/lib/types/handlers.js +0 -3
  178. package/lib/types/index.d.ts +0 -10
  179. package/lib/types/index.js +0 -27
  180. package/lib/types/providers.d.ts +0 -150
  181. package/lib/types/providers.gen.d.ts +0 -429
  182. package/lib/types/providers.gen.js +0 -14
  183. package/lib/types/providers.js +0 -3
  184. package/lib/types/rpc.d.ts +0 -35
  185. package/lib/types/rpc.js +0 -3
  186. package/lib/types/signatures.d.ts +0 -28
  187. package/lib/types/signatures.js +0 -3
  188. package/lib/types/tunnel.d.ts +0 -18
  189. package/lib/types/tunnel.js +0 -3
  190. package/lib/types/zk.d.ts +0 -23
  191. package/lib/types/zk.js +0 -3
  192. package/lib/utils/atomic-operations.d.ts +0 -24
  193. package/lib/utils/atomic-operations.js +0 -65
  194. package/lib/utils/auth.d.ts +0 -7
  195. package/lib/utils/auth.js +0 -64
  196. package/lib/utils/b64-json.d.ts +0 -2
  197. package/lib/utils/b64-json.js +0 -23
  198. package/lib/utils/benchmark.d.ts +0 -1
  199. package/lib/utils/benchmark.js +0 -70
  200. package/lib/utils/bgp-listener.d.ts +0 -7
  201. package/lib/utils/bgp-listener.js +0 -126
  202. package/lib/utils/claims.d.ts +0 -33
  203. package/lib/utils/claims.js +0 -112
  204. package/lib/utils/connection-state-machine.d.ts +0 -43
  205. package/lib/utils/connection-state-machine.js +0 -129
  206. package/lib/utils/env.d.ts +0 -3
  207. package/lib/utils/env.js +0 -20
  208. package/lib/utils/error.d.ts +0 -27
  209. package/lib/utils/error.js +0 -43
  210. package/lib/utils/generics.d.ts +0 -112
  211. package/lib/utils/generics.js +0 -348
  212. package/lib/utils/http-parser.d.ts +0 -59
  213. package/lib/utils/http-parser.js +0 -252
  214. package/lib/utils/index.d.ts +0 -12
  215. package/lib/utils/index.js +0 -29
  216. package/lib/utils/logger.d.ts +0 -13
  217. package/lib/utils/logger.js +0 -100
  218. package/lib/utils/prepare-packets.d.ts +0 -16
  219. package/lib/utils/prepare-packets.js +0 -61
  220. package/lib/utils/redactions.d.ts +0 -54
  221. package/lib/utils/redactions.js +0 -148
  222. package/lib/utils/resource-monitor.d.ts +0 -61
  223. package/lib/utils/resource-monitor.js +0 -107
  224. package/lib/utils/retries.d.ts +0 -12
  225. package/lib/utils/retries.js +0 -28
  226. package/lib/utils/signatures/eth.d.ts +0 -2
  227. package/lib/utils/signatures/eth.js +0 -33
  228. package/lib/utils/signatures/index.d.ts +0 -5
  229. package/lib/utils/signatures/index.js +0 -11
  230. package/lib/utils/socket-base.d.ts +0 -22
  231. package/lib/utils/socket-base.js +0 -95
  232. package/lib/utils/tls.d.ts +0 -2
  233. package/lib/utils/tls.js +0 -32
  234. package/lib/utils/validation.d.ts +0 -2
  235. package/lib/utils/validation.js +0 -46
  236. package/lib/utils/ws.d.ts +0 -12
  237. package/lib/utils/ws.js +0 -38
  238. package/lib/utils/zk.d.ts +0 -55
  239. package/lib/utils/zk.js +0 -444
  240. package/lib/window-rpc/index.d.ts +0 -3
  241. package/lib/window-rpc/index.js +0 -20
  242. package/lib/window-rpc/setup-window-rpc.d.ts +0 -5
  243. package/lib/window-rpc/setup-window-rpc.js +0 -291
  244. package/lib/window-rpc/types.d.ts +0 -192
  245. package/lib/window-rpc/types.js +0 -3
  246. package/lib/window-rpc/utils.d.ts +0 -14
  247. package/lib/window-rpc/utils.js +0 -102
  248. package/lib/window-rpc/window-rpc-zk.d.ts +0 -15
  249. package/lib/window-rpc/window-rpc-zk.js +0 -85
@@ -1,613 +0,0 @@
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
12
- 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}`);
301
- }
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;
310
- }
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
- },
322
- };
323
- // revealing CRLF is a breaking change -- and should only be done
324
- // if the client's version supports it
325
- function shouldRevealCrlf({ version }) {
326
- return version >= api_1.AttestorVersion.ATTESTOR_VERSION_2_0_1;
327
- }
328
- 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;
334
- }
335
- /**
336
- * Obtain the host header string from the URL.
337
- * https://stackoverflow.com/a/3364396
338
- */
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;
345
- }
346
- const paramsRegex = /{{([^{}]+)}}/sgi;
347
- 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) {
369
- yield* processJsonPath();
370
- }
371
- else if (rs.regex) {
372
- yield* processRegexp();
373
- }
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
- }
395
- }
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
- };
450
- }
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 };
455
- }
456
- }
457
- 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
- }
472
- }
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
- }
483
- }
484
- const geoParams = extractAndReplaceTemplateValues(params.geoLocation);
485
- if (geoParams) {
486
- params.geoLocation = geoParams.newParam;
487
- extractedValues = { ...extractedValues, ...geoParams.extractedValues };
488
- }
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
- }
504
- }
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
- }
513
- }
514
- return {
515
- newParams: params,
516
- extractedValues: extractedValues,
517
- hiddenBodyParts: hiddenBodyParts,
518
- hiddenURLParts: hiddenURLParts
519
- };
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
- }
562
- }
563
- 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;
588
- }
589
- return undefined;
590
- }
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
595
- let match = null;
596
- while (match = paramsRegex.exec(hostPort)) {
597
- paramNames.add(match[1]);
598
- }
599
- 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
- }
609
- }
610
- return hostPort;
611
- }
612
- exports.default = HTTP_PROVIDER;
613
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2h0dHAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw4Q0FBeUg7QUFDekgsNENBQXlDO0FBQ3pDLHVDQUFtRTtBQUNuRSx1Q0FBK0M7QUFDL0Msb0RBUWlDO0FBRWpDLHFDQU1rQjtBQUVsQixNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUE7QUFDckMsTUFBTSxlQUFlLEdBQUcsd0tBQXdLLENBQUE7QUFDaE0sTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUEsQ0FBQywwQkFBMEI7QUFNMUQsTUFBTSxhQUFhLEdBQXFCO0lBQ3ZDLFFBQVEsRUFBRSxXQUFXO0lBQ3JCLGtCQUFrQixDQUFDLE1BQU07UUFDeEIsT0FBTyxDQUFDLG9CQUFvQixJQUFJLE1BQU0sQ0FBQztZQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtZQUMzQixDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ2IsQ0FBQztJQUNELFdBQVcsQ0FBQyxNQUFNLEVBQUUsWUFBWTtRQUMvQixPQUFPLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQztZQUMvQixDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7WUFDdEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNiLENBQUM7SUFDRCx1QkFBdUIsQ0FBQyxNQUFNO1FBQzdCLElBQUksY0FBYyxHQUF5QjtZQUMxQyx5QkFBeUIsRUFBRyxDQUFDLFVBQVUsQ0FBQztTQUN4QyxDQUFBO1FBQ0QsSUFBRyx5QkFBeUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN4QyxjQUFjLEdBQUc7Z0JBQ2hCLEdBQUcsY0FBYztnQkFDakIsR0FBRyxNQUFNLENBQUMsdUJBQXVCO2FBQ2pDLENBQUE7UUFDRixDQUFDO1FBRUQsT0FBTyxjQUFjLENBQUE7SUFDdEIsQ0FBQztJQUNELGFBQWEsQ0FB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