@reclaimprotocol/attestor-core 3.0.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.
- package/README.md +39 -0
- package/lib/avs/abis/avsDirectoryABI.d.ts +60 -0
- package/lib/avs/abis/avsDirectoryABI.js +344 -0
- package/lib/avs/abis/delegationABI.d.ts +126 -0
- package/lib/avs/abis/delegationABI.js +5 -0
- package/lib/avs/abis/registryABI.d.ts +136 -0
- package/lib/avs/abis/registryABI.js +729 -0
- package/lib/avs/client/create-claim-on-avs.d.ts +10 -0
- package/lib/avs/client/create-claim-on-avs.js +147 -0
- package/lib/avs/config.d.ts +7 -0
- package/lib/avs/config.js +24 -0
- package/lib/avs/contracts/ReclaimServiceManager.d.ts +697 -0
- package/lib/avs/contracts/ReclaimServiceManager.js +3 -0
- package/lib/avs/contracts/common.d.ts +21 -0
- package/lib/avs/contracts/common.js +3 -0
- package/lib/avs/contracts/factories/ReclaimServiceManager__factory.d.ts +888 -0
- package/lib/avs/contracts/factories/ReclaimServiceManager__factory.js +1174 -0
- package/lib/avs/contracts/factories/index.d.ts +1 -0
- package/lib/avs/contracts/factories/index.js +9 -0
- package/lib/avs/contracts/index.d.ts +3 -0
- package/lib/avs/contracts/index.js +30 -0
- package/lib/avs/tests/test.operator.d.ts +11 -0
- package/lib/avs/tests/test.operator.js +313 -0
- package/lib/avs/tests/utils.d.ts +2 -0
- package/lib/avs/tests/utils.js +50 -0
- package/lib/avs/types/index.d.ts +55 -0
- package/lib/avs/types/index.js +3 -0
- package/lib/avs/utils/contracts.d.ts +21 -0
- package/lib/avs/utils/contracts.js +38 -0
- package/lib/avs/utils/register.d.ts +27 -0
- package/lib/avs/utils/register.js +76 -0
- package/lib/avs/utils/tasks.d.ts +22 -0
- package/lib/avs/utils/tasks.js +45 -0
- package/lib/client/create-claim.d.ts +5 -0
- package/lib/client/create-claim.js +357 -0
- package/lib/client/index.d.ts +3 -0
- package/lib/client/index.js +20 -0
- package/lib/client/tunnels/make-rpc-tcp-tunnel.d.ts +16 -0
- package/lib/client/tunnels/make-rpc-tcp-tunnel.js +60 -0
- package/lib/client/tunnels/make-rpc-tls-tunnel.d.ts +25 -0
- package/lib/client/tunnels/make-rpc-tls-tunnel.js +135 -0
- package/lib/client/utils/attestor-pool.d.ts +6 -0
- package/lib/client/utils/attestor-pool.js +28 -0
- package/lib/client/utils/client-socket.d.ts +9 -0
- package/lib/client/utils/client-socket.js +77 -0
- package/lib/client/utils/message-handler.d.ts +4 -0
- package/lib/client/utils/message-handler.js +93 -0
- package/lib/config/index.d.ts +23 -0
- package/lib/config/index.js +35 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +39 -0
- package/lib/proto/api.d.ts +414 -0
- package/lib/proto/api.js +2756 -0
- package/lib/providers/http/index.d.ts +3 -0
- package/lib/providers/http/index.js +472 -0
- package/lib/providers/http/utils.d.ts +44 -0
- package/lib/providers/http/utils.js +302 -0
- package/lib/providers/index.d.ts +4 -0
- package/lib/providers/index.js +11 -0
- package/lib/scripts/check-avs-registration.d.ts +1 -0
- package/lib/scripts/check-avs-registration.js +28 -0
- package/lib/scripts/generate-provider-types.d.ts +5 -0
- package/lib/scripts/generate-provider-types.js +82 -0
- package/lib/scripts/generate-receipt.d.ts +9 -0
- package/lib/scripts/generate-receipt.js +93 -0
- package/lib/scripts/register-avs-operator.d.ts +1 -0
- package/lib/scripts/register-avs-operator.js +6 -0
- package/lib/scripts/start-server.d.ts +1 -0
- package/lib/scripts/start-server.js +6 -0
- package/lib/scripts/verify-root-ca.d.ts +1 -0
- package/lib/scripts/verify-root-ca.js +51 -0
- package/lib/server/create-server.d.ts +7 -0
- package/lib/server/create-server.js +85 -0
- package/lib/server/handlers/claimTunnel.d.ts +2 -0
- package/lib/server/handlers/claimTunnel.js +55 -0
- package/lib/server/handlers/completeClaimOnChain.d.ts +2 -0
- package/lib/server/handlers/completeClaimOnChain.js +28 -0
- package/lib/server/handlers/createClaimOnChain.d.ts +2 -0
- package/lib/server/handlers/createClaimOnChain.js +31 -0
- package/lib/server/handlers/createTunnel.d.ts +2 -0
- package/lib/server/handlers/createTunnel.js +65 -0
- package/lib/server/handlers/disconnectTunnel.d.ts +2 -0
- package/lib/server/handlers/disconnectTunnel.js +10 -0
- package/lib/server/handlers/index.d.ts +4 -0
- package/lib/server/handlers/index.js +18 -0
- package/lib/server/handlers/init.d.ts +2 -0
- package/lib/server/handlers/init.js +21 -0
- package/lib/server/index.d.ts +4 -0
- package/lib/server/index.js +21 -0
- package/lib/server/socket.d.ts +11 -0
- package/lib/server/socket.js +95 -0
- package/lib/server/tunnels/make-tcp-tunnel.d.ts +20 -0
- package/lib/server/tunnels/make-tcp-tunnel.js +182 -0
- package/lib/server/utils/apm.d.ts +11 -0
- package/lib/server/utils/apm.js +39 -0
- package/lib/server/utils/assert-valid-claim-request.d.ts +29 -0
- package/lib/server/utils/assert-valid-claim-request.js +189 -0
- package/lib/server/utils/config-env.d.ts +1 -0
- package/lib/server/utils/config-env.js +7 -0
- package/lib/server/utils/generics.d.ts +22 -0
- package/lib/server/utils/generics.js +59 -0
- package/lib/server/utils/iso.d.ts +1 -0
- package/lib/server/utils/iso.js +260 -0
- package/lib/server/utils/keep-alive.d.ts +7 -0
- package/lib/server/utils/keep-alive.js +42 -0
- package/lib/server/utils/process-handshake.d.ts +13 -0
- package/lib/server/utils/process-handshake.js +179 -0
- package/lib/server/utils/verify-server-certificates.d.ts +7 -0
- package/lib/server/utils/verify-server-certificates.js +102 -0
- package/lib/tests/describe-with-server.d.ts +21 -0
- package/lib/tests/describe-with-server.js +67 -0
- package/lib/tests/mock-provider-server.d.ts +13 -0
- package/lib/tests/mock-provider-server.js +65 -0
- package/lib/tests/mocks.d.ts +4 -0
- package/lib/tests/mocks.js +23 -0
- package/lib/tests/test.claim-creation.d.ts +1 -0
- package/lib/tests/test.claim-creation.js +187 -0
- package/lib/tests/test.http-parser.d.ts +1 -0
- package/lib/tests/test.http-parser.js +118 -0
- package/lib/tests/test.http-provider-utils.d.ts +1 -0
- package/lib/tests/test.http-provider-utils.js +1932 -0
- package/lib/tests/test.http-provider.d.ts +1 -0
- package/lib/tests/test.http-provider.js +43 -0
- package/lib/tests/test.rpc-communication.d.ts +1 -0
- package/lib/tests/test.rpc-communication.js +64 -0
- package/lib/tests/test.rpc-tunnel.d.ts +1 -0
- package/lib/tests/test.rpc-tunnel.js +168 -0
- package/lib/tests/test.signatures.d.ts +1 -0
- package/lib/tests/test.signatures.js +24 -0
- package/lib/tests/test.tcp-tunnel.d.ts +1 -0
- package/lib/tests/test.tcp-tunnel.js +64 -0
- package/lib/tests/test.zk.d.ts +1 -0
- package/lib/tests/test.zk.js +169 -0
- package/lib/tests/utils.d.ts +12 -0
- package/lib/tests/utils.js +49 -0
- package/lib/types/claims.d.ts +64 -0
- package/lib/types/claims.js +3 -0
- package/lib/types/client.d.ts +136 -0
- package/lib/types/client.js +3 -0
- package/lib/types/general.d.ts +39 -0
- package/lib/types/general.js +3 -0
- package/lib/types/handlers.d.ts +10 -0
- package/lib/types/handlers.js +3 -0
- package/lib/types/index.d.ts +9 -0
- package/lib/types/index.js +26 -0
- package/lib/types/providers.d.ts +135 -0
- package/lib/types/providers.gen.d.ts +414 -0
- package/lib/types/providers.gen.js +14 -0
- package/lib/types/providers.js +3 -0
- package/lib/types/rpc.d.ts +35 -0
- package/lib/types/rpc.js +3 -0
- package/lib/types/signatures.d.ts +28 -0
- package/lib/types/signatures.js +3 -0
- package/lib/types/tunnel.d.ts +18 -0
- package/lib/types/tunnel.js +3 -0
- package/lib/types/zk.d.ts +16 -0
- package/lib/types/zk.js +3 -0
- package/lib/utils/benchmark.d.ts +1 -0
- package/lib/utils/benchmark.js +70 -0
- package/lib/utils/claims.d.ts +33 -0
- package/lib/utils/claims.js +112 -0
- package/lib/utils/env.d.ts +3 -0
- package/lib/utils/env.js +20 -0
- package/lib/utils/error.d.ts +27 -0
- package/lib/utils/error.js +43 -0
- package/lib/utils/generics.d.ts +112 -0
- package/lib/utils/generics.js +348 -0
- package/lib/utils/http-parser.d.ts +55 -0
- package/lib/utils/http-parser.js +249 -0
- package/lib/utils/index.d.ts +10 -0
- package/lib/utils/index.js +27 -0
- package/lib/utils/logger.d.ts +13 -0
- package/lib/utils/logger.js +100 -0
- package/lib/utils/prepare-packets.d.ts +16 -0
- package/lib/utils/prepare-packets.js +61 -0
- package/lib/utils/redactions.d.ts +41 -0
- package/lib/utils/redactions.js +111 -0
- package/lib/utils/retries.d.ts +12 -0
- package/lib/utils/retries.js +28 -0
- package/lib/utils/signatures/eth.d.ts +2 -0
- package/lib/utils/signatures/eth.js +33 -0
- package/lib/utils/signatures/index.d.ts +5 -0
- package/lib/utils/signatures/index.js +11 -0
- package/lib/utils/socket-base.d.ts +21 -0
- package/lib/utils/socket-base.js +89 -0
- package/lib/utils/tls.d.ts +2 -0
- package/lib/utils/tls.js +32 -0
- package/lib/utils/validation.d.ts +2 -0
- package/lib/utils/validation.js +46 -0
- package/lib/utils/ws.d.ts +12 -0
- package/lib/utils/ws.js +21 -0
- package/lib/utils/zk.d.ts +50 -0
- package/lib/utils/zk.js +282 -0
- package/lib/window-rpc/index.d.ts +3 -0
- package/lib/window-rpc/index.js +20 -0
- package/lib/window-rpc/setup-window-rpc.d.ts +5 -0
- package/lib/window-rpc/setup-window-rpc.js +239 -0
- package/lib/window-rpc/types.d.ts +184 -0
- package/lib/window-rpc/types.js +3 -0
- package/lib/window-rpc/utils.d.ts +13 -0
- package/lib/window-rpc/utils.js +76 -0
- package/lib/window-rpc/window-rpc-zk.d.ts +11 -0
- package/lib/window-rpc/window-rpc-zk.js +72 -0
- package/package.json +117 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unixTimestampSeconds = void 0;
|
|
4
|
+
exports.uint8ArrayToStr = uint8ArrayToStr;
|
|
5
|
+
exports.getTranscriptString = getTranscriptString;
|
|
6
|
+
exports.findIndexInUint8Array = findIndexInUint8Array;
|
|
7
|
+
exports.uint8ArrayToBinaryStr = uint8ArrayToBinaryStr;
|
|
8
|
+
exports.gunzipSync = gunzipSync;
|
|
9
|
+
exports.getZkAlgorithmForCipherSuite = getZkAlgorithmForCipherSuite;
|
|
10
|
+
exports.getPureCiphertext = getPureCiphertext;
|
|
11
|
+
exports.getRecordIV = getRecordIV;
|
|
12
|
+
exports.getProviderValue = getProviderValue;
|
|
13
|
+
exports.generateRpcMessageId = generateRpcMessageId;
|
|
14
|
+
exports.generateSessionId = generateSessionId;
|
|
15
|
+
exports.generateTunnelId = generateTunnelId;
|
|
16
|
+
exports.makeRpcEvent = makeRpcEvent;
|
|
17
|
+
exports.getRpcTypeFromKey = getRpcTypeFromKey;
|
|
18
|
+
exports.getRpcResponseType = getRpcResponseType;
|
|
19
|
+
exports.getRpcRequestType = getRpcRequestType;
|
|
20
|
+
exports.isApplicationData = isApplicationData;
|
|
21
|
+
exports.extractArrayBufferFromWsData = extractArrayBufferFromWsData;
|
|
22
|
+
exports.getRpcRequest = getRpcRequest;
|
|
23
|
+
exports.extractApplicationDataFromTranscript = extractApplicationDataFromTranscript;
|
|
24
|
+
exports.extractHandshakeFromTranscript = extractHandshakeFromTranscript;
|
|
25
|
+
exports.decryptDirect = decryptDirect;
|
|
26
|
+
exports.packRpcMessages = packRpcMessages;
|
|
27
|
+
exports.ethersStructToPlainObject = ethersStructToPlainObject;
|
|
28
|
+
const circom_symmetric_crypto_1 = require("@reclaimprotocol/circom-symmetric-crypto");
|
|
29
|
+
const tls_1 = require("@reclaimprotocol/tls");
|
|
30
|
+
const api_1 = require("src/proto/api");
|
|
31
|
+
const DEFAULT_REDACTION_DATA = new Uint8Array(4)
|
|
32
|
+
.fill(circom_symmetric_crypto_1.REDACTION_CHAR_CODE);
|
|
33
|
+
function uint8ArrayToStr(arr) {
|
|
34
|
+
return new TextDecoder().decode(arr);
|
|
35
|
+
}
|
|
36
|
+
function getTranscriptString(receipt) {
|
|
37
|
+
var _a;
|
|
38
|
+
const applMsgs = extractApplicationDataFromTranscript(receipt);
|
|
39
|
+
const strList = [];
|
|
40
|
+
for (const { message, sender } of applMsgs) {
|
|
41
|
+
const content = uint8ArrayToStr(message);
|
|
42
|
+
if ((_a = strList[strList.length - 1]) === null || _a === void 0 ? void 0 : _a.startsWith(sender)) {
|
|
43
|
+
strList[strList.length - 1] += content;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
strList.push(`${sender}: ${content}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return strList.join('\n');
|
|
50
|
+
}
|
|
51
|
+
const unixTimestampSeconds = () => Math.floor(Date.now() / 1000);
|
|
52
|
+
exports.unixTimestampSeconds = unixTimestampSeconds;
|
|
53
|
+
/**
|
|
54
|
+
* Find index of needle in haystack
|
|
55
|
+
*/
|
|
56
|
+
function findIndexInUint8Array(haystack, needle) {
|
|
57
|
+
for (let i = 0; i < haystack.length; i++) {
|
|
58
|
+
if ((0, tls_1.areUint8ArraysEqual)(haystack.slice(i, i + needle.length), needle)) {
|
|
59
|
+
return i;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return -1;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* convert a Uint8Array to a binary encoded str
|
|
66
|
+
* from: https://github.com/feross/buffer/blob/795bbb5bda1b39f1370ebd784bea6107b087e3a7/index.js#L1063
|
|
67
|
+
* @param buf
|
|
68
|
+
* @returns
|
|
69
|
+
*/
|
|
70
|
+
function uint8ArrayToBinaryStr(buf) {
|
|
71
|
+
let ret = '';
|
|
72
|
+
for (const v of buf) {
|
|
73
|
+
(ret += String.fromCharCode(v));
|
|
74
|
+
}
|
|
75
|
+
return ret;
|
|
76
|
+
}
|
|
77
|
+
function gunzipSync(buf) {
|
|
78
|
+
const { gunzipSync } = require('zlib');
|
|
79
|
+
return gunzipSync(buf);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Fetch the ZK algorithm for the specified cipher suite
|
|
83
|
+
*/
|
|
84
|
+
function getZkAlgorithmForCipherSuite(cipherSuite) {
|
|
85
|
+
if (cipherSuite.includes('CHACHA20')) {
|
|
86
|
+
return 'chacha20';
|
|
87
|
+
}
|
|
88
|
+
if (cipherSuite.includes('AES_256_GCM')) {
|
|
89
|
+
return 'aes-256-ctr';
|
|
90
|
+
}
|
|
91
|
+
if (cipherSuite.includes('AES_128_GCM')) {
|
|
92
|
+
return 'aes-128-ctr';
|
|
93
|
+
}
|
|
94
|
+
throw new Error(`${cipherSuite} not supported for ZK ops`);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get the pure ciphertext without any MAC,
|
|
98
|
+
* or authentication tag,
|
|
99
|
+
* @param content content w/o header
|
|
100
|
+
* @param cipherSuite
|
|
101
|
+
*/
|
|
102
|
+
function getPureCiphertext(content, cipherSuite) {
|
|
103
|
+
// assert that the cipher suite is supported
|
|
104
|
+
getZkAlgorithmForCipherSuite(cipherSuite);
|
|
105
|
+
// 16 => auth tag length
|
|
106
|
+
content = content.slice(0, -16);
|
|
107
|
+
const { ivLength: fixedIvLength, } = tls_1.SUPPORTED_CIPHER_SUITE_MAP[cipherSuite];
|
|
108
|
+
// 12 => total IV length
|
|
109
|
+
const recordIvLength = 12 - fixedIvLength;
|
|
110
|
+
// record IV is prefixed to the ciphertext
|
|
111
|
+
content = content.slice(recordIvLength);
|
|
112
|
+
return content;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get the 8 byte IV part that's stored in the record for some cipher suites
|
|
116
|
+
* @param content content w/o header
|
|
117
|
+
* @param cipherSuite
|
|
118
|
+
*/
|
|
119
|
+
function getRecordIV(content, cipherSuite) {
|
|
120
|
+
// assert that the cipher suite is supported
|
|
121
|
+
getZkAlgorithmForCipherSuite(cipherSuite);
|
|
122
|
+
const { ivLength: fixedIvLength, } = tls_1.SUPPORTED_CIPHER_SUITE_MAP[cipherSuite];
|
|
123
|
+
// 12 => total IV length
|
|
124
|
+
const recordIvLength = 12 - fixedIvLength;
|
|
125
|
+
return content.slice(0, recordIvLength);
|
|
126
|
+
}
|
|
127
|
+
function getProviderValue(params, fn) {
|
|
128
|
+
return typeof fn === 'function'
|
|
129
|
+
// @ts-ignore
|
|
130
|
+
? fn(params)
|
|
131
|
+
: fn;
|
|
132
|
+
}
|
|
133
|
+
function generateRpcMessageId() {
|
|
134
|
+
return (0, tls_1.uint8ArrayToDataView)(tls_1.crypto.randomBytes(8)).getUint32(0);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Random session ID for a WebSocket client.
|
|
138
|
+
*/
|
|
139
|
+
function generateSessionId() {
|
|
140
|
+
return generateRpcMessageId();
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Random ID for a tunnel.
|
|
144
|
+
*/
|
|
145
|
+
function generateTunnelId() {
|
|
146
|
+
return generateRpcMessageId();
|
|
147
|
+
}
|
|
148
|
+
function makeRpcEvent(type, data) {
|
|
149
|
+
const ev = new Event(type);
|
|
150
|
+
ev.data = data;
|
|
151
|
+
return ev;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get the RPC type from the key.
|
|
155
|
+
* For eg. "claimTunnelRequest" ->
|
|
156
|
+
* { type: 'claimTunnel', direction: 'request' }
|
|
157
|
+
*/
|
|
158
|
+
function getRpcTypeFromKey(key) {
|
|
159
|
+
if (key.endsWith('Request')) {
|
|
160
|
+
return {
|
|
161
|
+
type: key.slice(0, -7),
|
|
162
|
+
direction: 'request'
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
if (key.endsWith('Response')) {
|
|
166
|
+
return {
|
|
167
|
+
type: key.slice(0, -8),
|
|
168
|
+
direction: 'response'
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get the RPC response type from the RPC type.
|
|
174
|
+
* For eg. "claimTunnel" -> "claimTunnelResponse"
|
|
175
|
+
*/
|
|
176
|
+
function getRpcResponseType(type) {
|
|
177
|
+
return `${type}Response`;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get the RPC request type from the RPC type.
|
|
181
|
+
* For eg. "claimTunnel" -> "claimTunnelRequest"
|
|
182
|
+
*/
|
|
183
|
+
function getRpcRequestType(type) {
|
|
184
|
+
return `${type}Request`;
|
|
185
|
+
}
|
|
186
|
+
function isApplicationData(packet, tlsVersion) {
|
|
187
|
+
return packet.type === 'ciphertext'
|
|
188
|
+
&& (packet.contentType === 'APPLICATION_DATA'
|
|
189
|
+
|| (packet.data[0] === tls_1.PACKET_TYPE.WRAPPED_RECORD
|
|
190
|
+
&& tlsVersion === 'TLS1_2'));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Convert the received data from a WS to a Uint8Array
|
|
194
|
+
*/
|
|
195
|
+
async function extractArrayBufferFromWsData(data) {
|
|
196
|
+
if (data instanceof ArrayBuffer) {
|
|
197
|
+
return new Uint8Array(data);
|
|
198
|
+
}
|
|
199
|
+
// uint8array/Buffer
|
|
200
|
+
if (typeof data === 'object' && data && 'buffer' in data) {
|
|
201
|
+
return data;
|
|
202
|
+
}
|
|
203
|
+
if (typeof data === 'string') {
|
|
204
|
+
return (0, tls_1.strToUint8Array)(data);
|
|
205
|
+
}
|
|
206
|
+
if (data instanceof Blob) {
|
|
207
|
+
return new Uint8Array(await data.arrayBuffer());
|
|
208
|
+
}
|
|
209
|
+
throw new Error('unsupported data: ' + String(data));
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Check if the RPC message is a request or a response.
|
|
213
|
+
*/
|
|
214
|
+
function getRpcRequest(msg) {
|
|
215
|
+
if (msg.requestError) {
|
|
216
|
+
return {
|
|
217
|
+
direction: 'response',
|
|
218
|
+
type: 'error'
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
for (const key in msg) {
|
|
222
|
+
if (!msg[key]) {
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
const rpcType = getRpcTypeFromKey(key);
|
|
226
|
+
if (!rpcType) {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
return rpcType;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Finds all application data messages in a transcript
|
|
234
|
+
* and returns them. Removes the "contentType" suffix from the message.
|
|
235
|
+
* in TLS 1.3
|
|
236
|
+
*/
|
|
237
|
+
function extractApplicationDataFromTranscript({ transcript, tlsVersion }) {
|
|
238
|
+
const msgs = [];
|
|
239
|
+
for (const m of transcript) {
|
|
240
|
+
let message;
|
|
241
|
+
// redacted msgs but with a valid packet header
|
|
242
|
+
// can be considered application data messages
|
|
243
|
+
if (m.redacted) {
|
|
244
|
+
if (!m.plaintextLength) {
|
|
245
|
+
message = DEFAULT_REDACTION_DATA;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
const len = tlsVersion === 'TLS1_3'
|
|
249
|
+
// remove content type suffix
|
|
250
|
+
? m.plaintextLength - 1
|
|
251
|
+
: m.plaintextLength;
|
|
252
|
+
message = new Uint8Array(len)
|
|
253
|
+
.fill(circom_symmetric_crypto_1.REDACTION_CHAR_CODE);
|
|
254
|
+
}
|
|
255
|
+
// otherwise, we need to check the content type
|
|
256
|
+
}
|
|
257
|
+
else if (tlsVersion === 'TLS1_3') {
|
|
258
|
+
const contentType = m.message[m.message.length - 1];
|
|
259
|
+
if (contentType !== tls_1.CONTENT_TYPE_MAP['APPLICATION_DATA']) {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
message = m.message.slice(0, -1);
|
|
263
|
+
}
|
|
264
|
+
else if (m.recordHeader[0] === tls_1.PACKET_TYPE.WRAPPED_RECORD) {
|
|
265
|
+
message = m.message;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
msgs.push({ message, sender: m.sender });
|
|
271
|
+
}
|
|
272
|
+
return msgs;
|
|
273
|
+
}
|
|
274
|
+
function extractHandshakeFromTranscript({ transcript, tlsVersion }) {
|
|
275
|
+
const msgs = [];
|
|
276
|
+
for (const [i, m] of transcript.entries()) {
|
|
277
|
+
if (m.redacted) {
|
|
278
|
+
break; // stop at first encrypted message
|
|
279
|
+
}
|
|
280
|
+
let message;
|
|
281
|
+
if (m.recordHeader[0] === tls_1.PACKET_TYPE.HELLO) {
|
|
282
|
+
message = m.message;
|
|
283
|
+
}
|
|
284
|
+
else if (m.recordHeader[0] === tls_1.PACKET_TYPE.WRAPPED_RECORD) {
|
|
285
|
+
if (tlsVersion === 'TLS1_3') {
|
|
286
|
+
const contentType = m.message[m.message.length - 1];
|
|
287
|
+
if (contentType !== tls_1.CONTENT_TYPE_MAP['HANDSHAKE']) {
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
message = m.message.slice(0, -1);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
if (!message.length) {
|
|
300
|
+
throw new Error('unsupported handshake message');
|
|
301
|
+
}
|
|
302
|
+
msgs.push({ message, sender: m.sender, index: i });
|
|
303
|
+
}
|
|
304
|
+
return msgs;
|
|
305
|
+
}
|
|
306
|
+
async function decryptDirect(directReveal, cipherSuite, recordHeader, serverTlsVersion, content) {
|
|
307
|
+
const { key, iv, recordNumber } = directReveal;
|
|
308
|
+
const { cipher } = tls_1.SUPPORTED_CIPHER_SUITE_MAP[cipherSuite];
|
|
309
|
+
const importedKey = await tls_1.crypto.importKey(cipher, key);
|
|
310
|
+
return await (0, tls_1.decryptWrappedRecord)(content, {
|
|
311
|
+
iv,
|
|
312
|
+
key: importedKey,
|
|
313
|
+
recordHeader,
|
|
314
|
+
recordNumber,
|
|
315
|
+
version: serverTlsVersion,
|
|
316
|
+
cipherSuite,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
function packRpcMessages(...msgs) {
|
|
320
|
+
return api_1.RPCMessages.create({
|
|
321
|
+
messages: msgs.map(msg => (api_1.RPCMessage.create({
|
|
322
|
+
...msg,
|
|
323
|
+
id: msg.id || generateRpcMessageId()
|
|
324
|
+
})))
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Converts an Ethers struct (an array w named keys) to
|
|
329
|
+
* a plain object. Recursively converts all structs inside.
|
|
330
|
+
* Required to correctly JSON.stringify the struct.
|
|
331
|
+
*/
|
|
332
|
+
function ethersStructToPlainObject(struct) {
|
|
333
|
+
if (!Array.isArray(struct)) {
|
|
334
|
+
return struct;
|
|
335
|
+
}
|
|
336
|
+
const namedKeys = Object.keys(struct)
|
|
337
|
+
.filter(key => isNaN(Number(key)));
|
|
338
|
+
// seems to be an actual array
|
|
339
|
+
if (!namedKeys.length) {
|
|
340
|
+
return struct.map(ethersStructToPlainObject);
|
|
341
|
+
}
|
|
342
|
+
const obj = {};
|
|
343
|
+
for (const key of namedKeys) {
|
|
344
|
+
obj[key] = ethersStructToPlainObject(struct[key]);
|
|
345
|
+
}
|
|
346
|
+
return obj;
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZ2VuZXJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMEJBLDBDQUVDO0FBRUQsa0RBYUM7QUFPRCxzREFXQztBQVFELHNEQVNDO0FBRUQsZ0NBR0M7QUFLRCxvRUFjQztBQVFELDhDQW1CQztBQVFELGtDQWFDO0FBRUQsNENBS0M7QUFFRCxvREFJQztBQUtELDhDQUVDO0FBS0QsNENBRUM7QUFFRCxvQ0FPQztBQU9ELDhDQWNDO0FBTUQsZ0RBRUM7QUFNRCw4Q0FFQztBQUVELDhDQVlDO0FBS0Qsb0VBcUJDO0FBS0Qsc0NBb0JDO0FBT0Qsb0ZBcUNDO0FBUUQsd0VBb0NDO0FBRUQsc0NBZUM7QUFFRCwwQ0FTQztBQU9ELDhEQWtCQztBQTdhRCxzRkFBOEU7QUFDOUUsOENBUzZCO0FBQzdCLHVDQUF1RDtBQVl2RCxNQUFNLHNCQUFzQixHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQztLQUM5QyxJQUFJLENBQUMsNkNBQW1CLENBQUMsQ0FBQTtBQUUzQixTQUFnQixlQUFlLENBQUMsR0FBZTtJQUM5QyxPQUFPLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3JDLENBQUM7QUFFRCxTQUFnQixtQkFBbUIsQ0FBQyxPQUE2Qjs7SUFDaEUsTUFBTSxRQUFRLEdBQUcsb0NBQW9DLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDOUQsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFBO0lBQzVCLEtBQUksTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDeEMsSUFBRyxNQUFBLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQywwQ0FBRSxVQUFVLENBQUMsTUFBTSxDQUFD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
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { IncomingHttpHeaders } from 'http';
|
|
2
|
+
import type { ArraySlice, Transcript } from 'src/types';
|
|
3
|
+
export type HttpRequest = {
|
|
4
|
+
method: string;
|
|
5
|
+
url: string;
|
|
6
|
+
protocol: string;
|
|
7
|
+
headers: IncomingHttpHeaders;
|
|
8
|
+
body?: Uint8Array;
|
|
9
|
+
};
|
|
10
|
+
export type HttpResponse = {
|
|
11
|
+
statusCode: number;
|
|
12
|
+
statusMessage: string;
|
|
13
|
+
headers: IncomingHttpHeaders;
|
|
14
|
+
body: Uint8Array;
|
|
15
|
+
headersComplete: boolean;
|
|
16
|
+
complete: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Index of the first byte of the status line
|
|
19
|
+
*/
|
|
20
|
+
statusLineEndIndex?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Index of the first byte of the body
|
|
23
|
+
* in the complete response
|
|
24
|
+
*/
|
|
25
|
+
bodyStartIndex?: number;
|
|
26
|
+
/**
|
|
27
|
+
* If using chunked transfer encoding,
|
|
28
|
+
* this will be set & contain indices of each
|
|
29
|
+
* chunk in the complete response
|
|
30
|
+
*/
|
|
31
|
+
chunks?: ArraySlice[];
|
|
32
|
+
headerIndices: Map<string, ArraySlice>;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* parses http/1.1 responses
|
|
36
|
+
*/
|
|
37
|
+
export declare function makeHttpResponseParser(): {
|
|
38
|
+
res: HttpResponse;
|
|
39
|
+
/**
|
|
40
|
+
* Parse the next chunk of data
|
|
41
|
+
* @param data the data to parse
|
|
42
|
+
*/
|
|
43
|
+
onChunk(data: Uint8Array): void;
|
|
44
|
+
/**
|
|
45
|
+
* Call to prevent further parsing; indicating the end of the request
|
|
46
|
+
* Checks that the response is valid & complete, otherwise throws an error
|
|
47
|
+
*/
|
|
48
|
+
streamEnded(): void;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Read the HTTP request from a TLS receipt transcript.
|
|
52
|
+
* @param receipt the transcript to read from or application messages if they were extracted beforehand
|
|
53
|
+
* @returns the parsed HTTP request
|
|
54
|
+
*/
|
|
55
|
+
export declare function getHttpRequestDataFromTranscript(receipt: Transcript<Uint8Array>): HttpRequest;
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeHttpResponseParser = makeHttpResponseParser;
|
|
4
|
+
exports.getHttpRequestDataFromTranscript = getHttpRequestDataFromTranscript;
|
|
5
|
+
const tls_1 = require("@reclaimprotocol/tls");
|
|
6
|
+
const generics_1 = require("src/utils/generics");
|
|
7
|
+
const redactions_1 = require("src/utils/redactions");
|
|
8
|
+
const HTTP_HEADER_LINE_END = (0, tls_1.strToUint8Array)('\r\n');
|
|
9
|
+
/**
|
|
10
|
+
* parses http/1.1 responses
|
|
11
|
+
*/
|
|
12
|
+
function makeHttpResponseParser() {
|
|
13
|
+
/** the HTTP response data */
|
|
14
|
+
const res = {
|
|
15
|
+
statusCode: 0,
|
|
16
|
+
statusMessage: '',
|
|
17
|
+
headers: {},
|
|
18
|
+
body: new Uint8Array(),
|
|
19
|
+
complete: false,
|
|
20
|
+
headersComplete: false,
|
|
21
|
+
headerIndices: new Map()
|
|
22
|
+
};
|
|
23
|
+
let remainingBodyBytes = 0;
|
|
24
|
+
let isChunked = false;
|
|
25
|
+
let remaining = new Uint8Array();
|
|
26
|
+
let currentByteIdx = 0;
|
|
27
|
+
return {
|
|
28
|
+
res,
|
|
29
|
+
/**
|
|
30
|
+
* Parse the next chunk of data
|
|
31
|
+
* @param data the data to parse
|
|
32
|
+
*/
|
|
33
|
+
onChunk(data) {
|
|
34
|
+
var _a, _b;
|
|
35
|
+
// concatenate the remaining data from the last chunk
|
|
36
|
+
remaining = (0, tls_1.concatenateUint8Arrays)([remaining, data]);
|
|
37
|
+
// if we don't have the headers yet, keep reading lines
|
|
38
|
+
// as each header is in a line
|
|
39
|
+
if (!res.headersComplete) {
|
|
40
|
+
for (let line = getLine(); typeof line !== 'undefined'; line = getLine()) {
|
|
41
|
+
// first line is the HTTP version, status code & message
|
|
42
|
+
if (!res.statusCode) {
|
|
43
|
+
const [, statusCode, statusMessage] = line.match(/HTTP\/\d\.\d (\d+) (.*)/) || [];
|
|
44
|
+
res.statusCode = Number(statusCode);
|
|
45
|
+
res.statusMessage = statusMessage;
|
|
46
|
+
res.statusLineEndIndex = currentByteIdx - HTTP_HEADER_LINE_END.length;
|
|
47
|
+
}
|
|
48
|
+
else if (line === '') { // empty line signifies end of headers
|
|
49
|
+
res.headersComplete = true;
|
|
50
|
+
// if the response is chunked, we need to process the body differently
|
|
51
|
+
if ((_a = res.headers['transfer-encoding']) === null || _a === void 0 ? void 0 : _a.includes('chunked')) {
|
|
52
|
+
isChunked = true;
|
|
53
|
+
res.chunks = [];
|
|
54
|
+
break;
|
|
55
|
+
// if the response has a content-length, we know how many bytes to read
|
|
56
|
+
}
|
|
57
|
+
else if (res.headers['content-length']) {
|
|
58
|
+
remainingBodyBytes = Number(res.headers['content-length']);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
remainingBodyBytes = -1;
|
|
63
|
+
// otherwise,
|
|
64
|
+
// no content-length, no chunked transfer encoding
|
|
65
|
+
// means wait till the stream ends
|
|
66
|
+
// https://stackoverflow.com/a/11376887
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (!res.complete) { // parse the header
|
|
70
|
+
const [key, value] = line.split(': ');
|
|
71
|
+
res.headers[key.toLowerCase()] = value;
|
|
72
|
+
res.headerIndices[key.toLowerCase()] = {
|
|
73
|
+
fromIndex: currentByteIdx - line.length - HTTP_HEADER_LINE_END.length,
|
|
74
|
+
toIndex: currentByteIdx - HTTP_HEADER_LINE_END.length
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
throw new Error('got more data after response was complete');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (res.headersComplete) {
|
|
83
|
+
if (remainingBodyBytes) {
|
|
84
|
+
readBody();
|
|
85
|
+
// if no more body bytes to read,
|
|
86
|
+
// and the response was not chunked we're done
|
|
87
|
+
if (!remainingBodyBytes && !isChunked) {
|
|
88
|
+
res.complete = true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (res.headers['content-length'] === '0') {
|
|
92
|
+
res.complete = true;
|
|
93
|
+
}
|
|
94
|
+
if (isChunked) {
|
|
95
|
+
for (let line = getLine(); typeof line !== 'undefined'; line = getLine()) {
|
|
96
|
+
if (line === '') {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const chunkSize = Number.parseInt(line, 16);
|
|
100
|
+
// if chunk size is 0, we're done
|
|
101
|
+
if (!chunkSize) {
|
|
102
|
+
res.complete = true;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
(_b = res.chunks) === null || _b === void 0 ? void 0 : _b.push({
|
|
106
|
+
fromIndex: currentByteIdx,
|
|
107
|
+
toIndex: currentByteIdx + chunkSize,
|
|
108
|
+
});
|
|
109
|
+
// otherwise read the chunk
|
|
110
|
+
remainingBodyBytes = chunkSize;
|
|
111
|
+
readBody();
|
|
112
|
+
// if we read all the data we had,
|
|
113
|
+
// but there's still data left,
|
|
114
|
+
// break the loop and wait for the next chunk
|
|
115
|
+
if (remainingBodyBytes) {
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
/**
|
|
123
|
+
* Call to prevent further parsing; indicating the end of the request
|
|
124
|
+
* Checks that the response is valid & complete, otherwise throws an error
|
|
125
|
+
*/
|
|
126
|
+
streamEnded() {
|
|
127
|
+
if (!res.headersComplete) {
|
|
128
|
+
throw new Error('stream ended before headers were complete');
|
|
129
|
+
}
|
|
130
|
+
if (remaining.length) {
|
|
131
|
+
throw new Error('stream ended with remaining data');
|
|
132
|
+
}
|
|
133
|
+
if (remainingBodyBytes > 0) {
|
|
134
|
+
throw new Error('stream ended before all body bytes were received');
|
|
135
|
+
}
|
|
136
|
+
res.complete = true;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
function readBody() {
|
|
140
|
+
if (res.complete) {
|
|
141
|
+
throw new Error('got more data after response was complete');
|
|
142
|
+
}
|
|
143
|
+
if (!res.bodyStartIndex) {
|
|
144
|
+
res.bodyStartIndex = currentByteIdx;
|
|
145
|
+
}
|
|
146
|
+
let bytesToCopy;
|
|
147
|
+
if (remainingBodyBytes === -1) {
|
|
148
|
+
// all bytes are body bytes
|
|
149
|
+
bytesToCopy = remaining.length;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// take the number of bytes we need to read, or the number of bytes remaining
|
|
153
|
+
// and append to the bytes of the body
|
|
154
|
+
bytesToCopy = Math.min(remainingBodyBytes, remaining.length);
|
|
155
|
+
remainingBodyBytes -= bytesToCopy;
|
|
156
|
+
}
|
|
157
|
+
res.body = (0, tls_1.concatenateUint8Arrays)([
|
|
158
|
+
res.body,
|
|
159
|
+
remaining.slice(0, bytesToCopy)
|
|
160
|
+
]);
|
|
161
|
+
remaining = remaining.slice(bytesToCopy);
|
|
162
|
+
currentByteIdx += bytesToCopy;
|
|
163
|
+
}
|
|
164
|
+
function getLine() {
|
|
165
|
+
// find end of line, if it exists
|
|
166
|
+
// otherwise return undefined
|
|
167
|
+
const idx = (0, generics_1.findIndexInUint8Array)(remaining, HTTP_HEADER_LINE_END);
|
|
168
|
+
if (idx === -1) {
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
const line = (0, generics_1.uint8ArrayToStr)(remaining.slice(0, idx));
|
|
172
|
+
remaining = remaining.slice(idx + HTTP_HEADER_LINE_END.length);
|
|
173
|
+
currentByteIdx += idx + HTTP_HEADER_LINE_END.length;
|
|
174
|
+
return line;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Read the HTTP request from a TLS receipt transcript.
|
|
179
|
+
* @param receipt the transcript to read from or application messages if they were extracted beforehand
|
|
180
|
+
* @returns the parsed HTTP request
|
|
181
|
+
*/
|
|
182
|
+
function getHttpRequestDataFromTranscript(receipt) {
|
|
183
|
+
const clientMsgs = receipt
|
|
184
|
+
.filter(s => s.sender === 'client');
|
|
185
|
+
// if the first message is redacted, we can't parse it
|
|
186
|
+
// as we don't know what the request was
|
|
187
|
+
if (clientMsgs[0].message[0] === redactions_1.REDACTION_CHAR_CODE) {
|
|
188
|
+
throw new Error('First client message request is redacted. Cannot parse');
|
|
189
|
+
}
|
|
190
|
+
const request = {
|
|
191
|
+
method: '',
|
|
192
|
+
url: '',
|
|
193
|
+
protocol: '',
|
|
194
|
+
headers: {}
|
|
195
|
+
};
|
|
196
|
+
let requestBuffer = (0, tls_1.concatenateUint8Arrays)(clientMsgs.map(m => m.message));
|
|
197
|
+
// keep reading lines until we get to the end of the headers
|
|
198
|
+
for (let line = getLine(); typeof line !== 'undefined'; line = getLine()) {
|
|
199
|
+
if (line === '') {
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
if (!request.method) {
|
|
203
|
+
const [, method, url, protocol] = line.match(/(\w+) (.*) (.*)/) || [];
|
|
204
|
+
request.method = method.toLowerCase();
|
|
205
|
+
request.url = url;
|
|
206
|
+
request.protocol = protocol;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
let keyIdx = line.indexOf(':');
|
|
210
|
+
if (keyIdx === -1) {
|
|
211
|
+
keyIdx = line.length - 1;
|
|
212
|
+
}
|
|
213
|
+
const key = line.slice(0, keyIdx)
|
|
214
|
+
.toLowerCase()
|
|
215
|
+
.trim();
|
|
216
|
+
const value = line.slice(keyIdx + 1)
|
|
217
|
+
.trim();
|
|
218
|
+
const oldValue = request.headers[key];
|
|
219
|
+
if (typeof oldValue === 'string') {
|
|
220
|
+
request.headers[key] = [oldValue, value];
|
|
221
|
+
}
|
|
222
|
+
else if (Array.isArray(oldValue)) {
|
|
223
|
+
oldValue.push(value);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
request.headers[key] = value;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//the rest is request body
|
|
231
|
+
if (requestBuffer.length) {
|
|
232
|
+
request.body = requestBuffer;
|
|
233
|
+
}
|
|
234
|
+
if (!request.method) {
|
|
235
|
+
throw new Error('Client request is incomplete');
|
|
236
|
+
}
|
|
237
|
+
return request;
|
|
238
|
+
function getLine() {
|
|
239
|
+
const idx = (0, generics_1.findIndexInUint8Array)(requestBuffer, HTTP_HEADER_LINE_END);
|
|
240
|
+
if (idx === -1) {
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
const line = (0, generics_1.uint8ArrayToStr)(requestBuffer.slice(0, idx));
|
|
244
|
+
requestBuffer = requestBuffer
|
|
245
|
+
.slice(idx + HTTP_HEADER_LINE_END.length);
|
|
246
|
+
return line;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1wYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaHR0cC1wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4Q0Esd0RBaUxDO0FBT0QsNEVBeUVDO0FBL1NELDhDQUE4RTtBQUc5RSxpREFBMkU7QUFDM0UscURBQTBEO0FBcUMxRCxNQUFNLG9CQUFvQixHQUFHLElBQUEscUJBQWUsRUFBQyxNQUFNLENBQUMsQ0FBQTtBQUVwRDs7R0FFRztBQUNILFNBQWdCLHNCQUFzQjtJQUNyQyw2QkFBNkI7SUFDN0IsTUFBTSxHQUFHLEdBQWlCO1FBQ3pCLFVBQVUsRUFBRSxDQUFDO1FBQ2IsYUFBYSxFQUFFLEVBQUU7UUFDakIsT0FBTyxFQUFFLEVBQUU7UUFDWCxJQUFJLEVBQUUsSUFBSSxVQUFVLEVBQUU7UUFDdEIsUUFBUSxFQUFFLEtBQUs7UUFDZixlQUFlLEVBQUUsS0FBSztRQUN0QixhQUFhLEVBQUMsSUFBSSxHQUFHLEVBQXNCO0tBQzNDLENBQUE7SUFFRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQTtJQUMxQixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUE7SUFDckIsSUFBSSxTQUFTLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQTtJQUNoQyxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUE7SUFFdEIsT0FBTztRQUNOLEdBQUc7UUFDSDs7O1dBR1M7UUFDVCxPQUFPLENBQUMsSUFBZ0I7O1lBQ3ZCLHFEQUFxRDtZQUNyRCxTQUFTLEdBQUcsSUFBQSw0QkFBc0IsRUFBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBQ3JELHVEQUF1RDtZQUN2RCw4QkFBOEI7WUFDOUIsSUFBRyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDekIsS0FBSSxJQUFJLElBQUksR0FBRyxPQUFPLEVBQUUsRUFBRSxPQUFPLElBQUksS0FBSyxXQUFXLEVBQUUsSUFBSSxHQUFHLE9B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
|