@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,21 @@
|
|
|
1
|
+
import { AttestorClient } from 'src/client/utils/client-socket';
|
|
2
|
+
import { createMockServer } from 'src/tests/mock-provider-server';
|
|
3
|
+
import { IAttestorServerSocket, ZKEngine } from 'src/types';
|
|
4
|
+
type ServerOpts = {
|
|
5
|
+
/**
|
|
6
|
+
* Get the client's connection on the server.
|
|
7
|
+
*/
|
|
8
|
+
getClientOnServer(): IAttestorServerSocket | undefined;
|
|
9
|
+
client: AttestorClient;
|
|
10
|
+
privateKeyHex: string;
|
|
11
|
+
mockHttpsServer: ReturnType<typeof createMockServer>;
|
|
12
|
+
mockhttpsServerPort: number;
|
|
13
|
+
serverUrl: string;
|
|
14
|
+
zkEngine: ZKEngine;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Boots up a attestor server, a mock https server,
|
|
18
|
+
* and a client that is renewed for each test.
|
|
19
|
+
*/
|
|
20
|
+
export declare const describeWithServer: (name: string, fn: (opts: ServerOpts) => void) => void;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.describeWithServer = void 0;
|
|
4
|
+
const client_socket_1 = require("src/client/utils/client-socket");
|
|
5
|
+
const config_1 = require("src/config");
|
|
6
|
+
const server_1 = require("src/server");
|
|
7
|
+
const mock_provider_server_1 = require("src/tests/mock-provider-server");
|
|
8
|
+
const mocks_1 = require("src/tests/mocks");
|
|
9
|
+
const utils_1 = require("src/tests/utils");
|
|
10
|
+
const utils_2 = require("src/utils");
|
|
11
|
+
const ws_1 = require("ws");
|
|
12
|
+
/**
|
|
13
|
+
* Boots up a attestor server, a mock https server,
|
|
14
|
+
* and a client that is renewed for each test.
|
|
15
|
+
*/
|
|
16
|
+
const describeWithServer = (name, fn) => describe(name, () => {
|
|
17
|
+
let wsServer;
|
|
18
|
+
let wsServerUrl;
|
|
19
|
+
let privateKeyHex;
|
|
20
|
+
let client;
|
|
21
|
+
const wsServerPort = (0, utils_1.getRandomPort)();
|
|
22
|
+
const httpsServerPort = (0, utils_1.getRandomPort)();
|
|
23
|
+
const mockHttpsServer = (0, mock_provider_server_1.createMockServer)(httpsServerPort);
|
|
24
|
+
beforeAll(async () => {
|
|
25
|
+
wsServer = await (0, server_1.createServer)(wsServerPort);
|
|
26
|
+
wsServerUrl = `ws://localhost:${wsServerPort}${config_1.WS_PATHNAME}`;
|
|
27
|
+
});
|
|
28
|
+
afterAll(() => {
|
|
29
|
+
wsServer.close();
|
|
30
|
+
mockHttpsServer.server.close();
|
|
31
|
+
});
|
|
32
|
+
beforeEach(async () => {
|
|
33
|
+
mocks_1.SPY_PREPARER.mockClear();
|
|
34
|
+
privateKeyHex = (0, utils_1.randomPrivateKey)();
|
|
35
|
+
client = new client_socket_1.AttestorClient({
|
|
36
|
+
logger: utils_2.logger.child({ client: 1 }),
|
|
37
|
+
url: wsServerUrl,
|
|
38
|
+
Websocket: ws_1.WebSocket
|
|
39
|
+
});
|
|
40
|
+
await client.waitForInit();
|
|
41
|
+
});
|
|
42
|
+
afterEach(async () => {
|
|
43
|
+
await client.terminateConnection();
|
|
44
|
+
});
|
|
45
|
+
fn({
|
|
46
|
+
getClientOnServer,
|
|
47
|
+
get client() {
|
|
48
|
+
return client;
|
|
49
|
+
},
|
|
50
|
+
get privateKeyHex() {
|
|
51
|
+
return privateKeyHex;
|
|
52
|
+
},
|
|
53
|
+
get serverUrl() {
|
|
54
|
+
return wsServerUrl;
|
|
55
|
+
},
|
|
56
|
+
mockHttpsServer,
|
|
57
|
+
mockhttpsServerPort: httpsServerPort,
|
|
58
|
+
zkEngine: 'snarkJS'
|
|
59
|
+
});
|
|
60
|
+
function getClientOnServer() {
|
|
61
|
+
var _a;
|
|
62
|
+
const serverSockets = [...wsServer.clients.values()];
|
|
63
|
+
return (_a = serverSockets.at(-1)) === null || _a === void 0 ? void 0 : _a.serverSocket;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
exports.describeWithServer = describeWithServer;
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtd2l0aC1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdHMvZGVzY3JpYmUtd2l0aC1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0VBQStEO0FBQy9ELHVDQUF3QztBQUN4Qyx1Q0FBeUM7QUFDekMseUVBQWlFO0FBQ2pFLDJDQUE4QztBQUM5QywyQ0FBaUU7QUFFakUscUNBQWtDO0FBQ2xDLDJCQUFvRDtBQWdCcEQ7OztHQUdHO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxDQUNqQyxJQUFZLEVBQ1osRUFBOEIsRUFDN0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO0lBQ3hCLElBQUksUUFBeUIsQ0FBQTtJQUU3QixJQUFJLFdBQW1CLENBQUE7SUFFdkIsSUFBSSxhQUFxQixDQUFBO0lBQ3pCLElBQUksTUFBc0IsQ0FBQTtJQUUxQixNQUFNLFlBQVksR0FBRyxJQUFBLHFCQUFhLEdBQUUsQ0FBQTtJQUNwQyxNQUFNLGVBQWUsR0FBRyxJQUFBLHFCQUFhLEdBQUUsQ0FBQTtJQUV2QyxNQUFNLGVBQWUsR0FBRyxJQUFBLHVDQUFnQixFQUFDLGVBQWUsQ0FBQyxDQUFBO0lBRXpELFNBQVMsQ0FBQyxLQUFLLElBQUcsRUFBRTtRQUNuQixRQUFRLEdBQUcsTUFBTSxJQUFBLHFCQUFZLEVBQUMsWUFBWSxDQUFDLENBQUE7UUFDM0MsV0FBVyxHQUFHLGtCQUFrQixZQUFZLEdBQUcsb0JBQVcsRUFBRSxDQUFBO0lBQzdELENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNiLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNoQixlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQy9CLENBQUMsQ0FBQyxDQUFBO0lBRUYsVUFBVSxDQUFDLEtBQUssSUFBRyxFQUFFO1FBQ3BCLG9CQUFZLENBQUMsU0FBUyxFQUFFLENBQUE7UUFFeEIsYUFBYSxHQUFHLElBQUEsd0JBQWdCLEdBQUUsQ0FBQTtRQUNsQyxNQUFNLEdBQUcsSUFBSSw4QkFBYyxDQUFDO1lBQzNCLE1BQU0sRUFBRSxjQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25DLEdBQUcsRUFBRSxXQUFXO1lBQ2hCLFNBQVMsRUFBRSxjQUFTO1NBQ3BCLENBQUMsQ0FBQTtRQUNGLE1BQU0sTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzNCLENBQUMsQ0FBQyxDQUFBO0lBRUYsU0FBUyxDQUFDLEtBQUssSUFBRyxFQUFFO1FBQ25CLE1BQU0sTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUE7SUFDbkMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUM7UUFDRixpQkFBaUI7UUFDakIsSUFBSSxNQUFNO1lBQ1QsT0FBTyxNQUFNLENBQUE7UUFDZCxDQUFDO1FBQ0QsSUFBSSxhQUFhO1lBQ2hCLE9BQU8sYUFBYSxDQUFBO1FBQ3JCLENBQUM7UUFDRCxJQUFJLFNBQVM7WUFDWixPQUFPLFdBQVcsQ0FBQTtRQUNuQixDQUFDO1FBQ0QsZUFBZTtRQUNmLG1CQUFtQixFQUFFLGVBQWU7UUFDcEMsUUFBUSxFQUFFLFNBQVM7S0FDbkIsQ0FBQyxDQUFBO0lBRUYsU0FBUyxpQkFBaUI7O1FBQ3pCLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFnQixDQUFBO1FBQ25FLE9BQU8sTUFBQSxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUFFLFlBQVksQ0FBQTtJQUMxQyxDQUFDO0FBQ0YsQ0FBQyxDQUFDLENBQUE7QUE5RFcsUUFBQSxrQkFBa0Isc0JBOEQ3QiJ9
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock https server to test claim creation.
|
|
3
|
+
* It implements a GET /me endpoint that returns the email address
|
|
4
|
+
* of the user. A bearer token is expected in the Authorization header.
|
|
5
|
+
*
|
|
6
|
+
* The bearer token is expected to be the email address without the domain.
|
|
7
|
+
* Eg. to claim the email address "abcd@mock.com", the header
|
|
8
|
+
* should be "Authorization: Bearer abcd".
|
|
9
|
+
*/
|
|
10
|
+
export declare function createMockServer(port: number): {
|
|
11
|
+
server: import("https").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
|
|
12
|
+
tlsSessionStore: Record<string, Buffer>;
|
|
13
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMockServer = createMockServer;
|
|
4
|
+
/**
|
|
5
|
+
* Mock HTTPS server to implement the "mock-login" provider
|
|
6
|
+
*/
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const https_1 = require("https");
|
|
9
|
+
const utils_1 = require("src/utils");
|
|
10
|
+
/**
|
|
11
|
+
* Mock https server to test claim creation.
|
|
12
|
+
* It implements a GET /me endpoint that returns the email address
|
|
13
|
+
* of the user. A bearer token is expected in the Authorization header.
|
|
14
|
+
*
|
|
15
|
+
* The bearer token is expected to be the email address without the domain.
|
|
16
|
+
* Eg. to claim the email address "abcd@mock.com", the header
|
|
17
|
+
* should be "Authorization: Bearer abcd".
|
|
18
|
+
*/
|
|
19
|
+
function createMockServer(port) {
|
|
20
|
+
const tlsSessionStore = {};
|
|
21
|
+
const server = (0, https_1.createServer)({
|
|
22
|
+
key: (0, fs_1.readFileSync)('./cert/private-key.pem'),
|
|
23
|
+
cert: (0, fs_1.readFileSync)('./cert/public-cert.pem'),
|
|
24
|
+
});
|
|
25
|
+
server.on('request', (req, res) => {
|
|
26
|
+
var _a;
|
|
27
|
+
if (req.method !== 'GET') {
|
|
28
|
+
endWithError(405, 'invalid method');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!((_a = req.url) === null || _a === void 0 ? void 0 : _a.startsWith('/me'))) {
|
|
32
|
+
endWithError(404, 'invalid path');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const auth = req.headers.authorization;
|
|
36
|
+
if (!auth) {
|
|
37
|
+
endWithError(401, 'missing authorization header');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (!(auth === null || auth === void 0 ? void 0 : auth.startsWith('Bearer '))) {
|
|
41
|
+
endWithError(401, 'invalid authorization header');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const emailAddress = auth.slice('Bearer '.length) + '@mock.com';
|
|
45
|
+
endWithJson(200, { emailAddress });
|
|
46
|
+
utils_1.logger.info({ emailAddress }, 'ended with success');
|
|
47
|
+
function endWithError(status, message) {
|
|
48
|
+
endWithJson(status, { error: message });
|
|
49
|
+
utils_1.logger.info({ status, message }, 'ended with error');
|
|
50
|
+
}
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
function endWithJson(status, json) {
|
|
53
|
+
const str = JSON.stringify(json);
|
|
54
|
+
res.writeHead(status, {
|
|
55
|
+
'Content-Type': 'application/json',
|
|
56
|
+
'Content-Length': str.length.toString(),
|
|
57
|
+
});
|
|
58
|
+
res.write(str);
|
|
59
|
+
res.end();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
server.listen(port);
|
|
63
|
+
return { server, tlsSessionStore };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay1wcm92aWRlci1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdHMvbW9jay1wcm92aWRlci1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnQkEsNENBMERDO0FBMUVEOztHQUVHO0FBQ0gsMkJBQWlDO0FBQ2pDLGlDQUFvQztBQUNwQyxxQ0FBa0M7QUFFbEM7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxJQUFZO0lBQzVDLE1BQU0sZUFBZSxHQUEyQixFQUFFLENBQUE7SUFFbEQsTUFBTSxNQUFNLEdBQUcsSUFBQSxvQkFBWSxFQUMxQjtRQUNDLEdBQUcsRUFBRSxJQUFBLGlCQUFZLEVBQUMsd0JBQXdCLENBQUM7UUFDM0MsSUFBSSxFQUFFLElBQUEsaUJBQVksRUFBQyx3QkFBd0IsQ0FBQztLQUM1QyxDQUNELENBQUE7SUFFRCxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTs7UUFDakMsSUFBRyxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3pCLFlBQVksQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtZQUNuQyxPQUFNO1FBQ1AsQ0FBQztRQUVELElBQUcsQ0FBQyxDQUFBLE1BQUEsR0FBRyxDQUFDLEdBQUcsMENBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFBLEVBQUUsQ0FBQztZQUNoQyxZQUFZLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1lBQ2pDLE9BQU07UUFDUCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUE7UUFDdEMsSUFBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsWUFBWSxDQUFDLEdBQUcsRUFBRSw4QkFBOEIsQ0FBQyxDQUFBO1lBQ2pELE9BQU07UUFDUCxDQUFDO1FBRUQsSUFBRyxDQUFDLENBQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQSxFQUFFLENBQUM7WUFDakMsWUFBWSxDQUFDLEdBQUcsRUFBRSw4QkFBOEIsQ0FBQyxDQUFBO1lBQ2pELE9BQU07UUFDUCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFBO1FBQy9ELFdBQVcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBRWxDLGNBQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1FBRW5ELFNBQVMsWUFBWSxDQUFDLE1BQWMsRUFBRSxPQUFlO1lBQ3BELFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUV2QyxjQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUE7UUFDckQsQ0FBQztRQUVELDhEQUE4RDtRQUM5RCxTQUFTLFdBQVcsQ0FBQyxNQUFjLEVBQUUsSUFBUztZQUM3QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2hDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO2dCQUNyQixjQUFjLEVBQUUsa0JBQWtCO2dCQUNsQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTthQUN2QyxDQUFDLENBQUE7WUFDRixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2QsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ1YsQ0FBQztJQUNGLENBQUMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVuQixPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxDQUFBO0FBQ25DLENBQUMifQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spies on the preparePacketsForReveal function
|
|
3
|
+
*/
|
|
4
|
+
export declare const SPY_PREPARER: jest.Mock<Promise<import("../proto/api").ClaimTunnelRequest_TranscriptMessage[]>, [tlsTranscript: import("..").Transcript<import("..").CompleteTLSPacket>, reveals: Map<import("@reclaimprotocol/tls").TLSPacketContext, import("..").MessageRevealInfo>, import("src/utils/prepare-packets").PreparePacketsForRevealOpts], any>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SPY_PREPARER = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Spies on the preparePacketsForReveal function
|
|
6
|
+
*/
|
|
7
|
+
exports.SPY_PREPARER = jest.fn();
|
|
8
|
+
jest.mock('../utils/prepare-packets', () => {
|
|
9
|
+
const actual = jest.requireActual('../utils/prepare-packets');
|
|
10
|
+
exports.SPY_PREPARER.mockImplementation(actual.preparePacketsForReveal);
|
|
11
|
+
return {
|
|
12
|
+
__esModule: true,
|
|
13
|
+
...actual,
|
|
14
|
+
preparePacketsForReveal: exports.SPY_PREPARER
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
jest.mock('../server/utils/apm', () => {
|
|
18
|
+
return {
|
|
19
|
+
__esModule: true,
|
|
20
|
+
getApm: jest.fn()
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdHMvbW9ja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUE7O0dBRUc7QUFDVSxRQUFBLFlBQVksR0FBRyxJQUFJLENBQUMsRUFBRSxFQUdoQyxDQUFBO0FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0lBQzdELG9CQUFZLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUE7SUFDL0QsT0FBTztRQUNOLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLEdBQUcsTUFBTTtRQUNULHVCQUF1QixFQUFFLG9CQUFZO0tBQ3JDLENBQUE7QUFDRixDQUFDLENBQUMsQ0FBQTtBQUVGLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLE9BQU87UUFDTixVQUFVLEVBQUUsSUFBSTtRQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtLQUNqQixDQUFBO0FBQ0YsQ0FBQyxDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tls_1 = require("@reclaimprotocol/tls");
|
|
4
|
+
const client_1 = require("src/client");
|
|
5
|
+
const providers_1 = require("src/providers");
|
|
6
|
+
const server_1 = require("src/server");
|
|
7
|
+
const describe_with_server_1 = require("src/tests/describe-with-server");
|
|
8
|
+
const mocks_1 = require("src/tests/mocks");
|
|
9
|
+
const utils_1 = require("src/tests/utils");
|
|
10
|
+
const utils_2 = require("src/utils");
|
|
11
|
+
const TLS_VERSIONS = [
|
|
12
|
+
'TLS1_3',
|
|
13
|
+
'TLS1_2',
|
|
14
|
+
];
|
|
15
|
+
jest.setTimeout(90000);
|
|
16
|
+
jest.mock('@reclaimprotocol/tls/lib/utils/parse-certificate', () => {
|
|
17
|
+
const actual = jest.requireActual('@reclaimprotocol/tls/lib/utils/parse-certificate');
|
|
18
|
+
return {
|
|
19
|
+
__esModule: true,
|
|
20
|
+
...actual,
|
|
21
|
+
verifyCertificateChain: jest.fn().mockImplementation()
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
(0, describe_with_server_1.describeWithServer)('Claim Creation', opts => {
|
|
25
|
+
let client;
|
|
26
|
+
let claimUrl;
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
client = opts.client;
|
|
29
|
+
claimUrl = `https://localhost:${opts.mockhttpsServerPort}/me`;
|
|
30
|
+
// we need to disable certificate verification
|
|
31
|
+
// for testing purposes
|
|
32
|
+
providers_1.providers.http.additionalClientOptions = {
|
|
33
|
+
verifyServerCertificate: false
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
it.each(TLS_VERSIONS)('should successfully create a claim (%s)', async (version) => {
|
|
37
|
+
var _a, _b, _c;
|
|
38
|
+
// we need to disable certificate verification
|
|
39
|
+
// for testing purposes
|
|
40
|
+
providers_1.providers.http.additionalClientOptions = {
|
|
41
|
+
...providers_1.providers.http.additionalClientOptions,
|
|
42
|
+
supportedProtocolVersions: [version]
|
|
43
|
+
};
|
|
44
|
+
const user = 'adhiraj';
|
|
45
|
+
const result = await (0, client_1.createClaimOnAttestor)({
|
|
46
|
+
name: 'http',
|
|
47
|
+
params: {
|
|
48
|
+
url: claimUrl,
|
|
49
|
+
method: 'GET',
|
|
50
|
+
responseRedactions: [],
|
|
51
|
+
responseMatches: [
|
|
52
|
+
{
|
|
53
|
+
type: 'contains',
|
|
54
|
+
value: `${user}@mock.com`
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
secretParams: {
|
|
59
|
+
authorisationHeader: `Bearer ${user}`
|
|
60
|
+
},
|
|
61
|
+
ownerPrivateKey: opts.privateKeyHex,
|
|
62
|
+
client,
|
|
63
|
+
zkEngine: opts.zkEngine
|
|
64
|
+
});
|
|
65
|
+
expect(result.error).toBeUndefined();
|
|
66
|
+
expect((_a = result.request) === null || _a === void 0 ? void 0 : _a.transcript).toBeTruthy();
|
|
67
|
+
// decrypt the transcript and check we didn't accidentally
|
|
68
|
+
// leak our secrets in the application data
|
|
69
|
+
const transcript = result.request.transcript;
|
|
70
|
+
const applMsgs = (0, utils_2.extractApplicationDataFromTranscript)(await (0, server_1.decryptTranscript)(transcript, utils_2.logger, opts.zkEngine, (_b = result.request) === null || _b === void 0 ? void 0 : _b.fixedServerIV, (_c = result.request) === null || _c === void 0 ? void 0 : _c.fixedClientIV));
|
|
71
|
+
const requestData = applMsgs
|
|
72
|
+
.filter(m => m.sender === 'client')
|
|
73
|
+
.map(m => (0, tls_1.uint8ArrayToStr)(m.message))
|
|
74
|
+
.join('');
|
|
75
|
+
// ensure the secret authorisation header is not leaked
|
|
76
|
+
expect(requestData).not.toContain(user);
|
|
77
|
+
await expect((0, utils_2.assertValidClaimSignatures)(result, client.metadata)).resolves.toBeUndefined();
|
|
78
|
+
// check all direct message reveals and
|
|
79
|
+
// ensure we've not accidentally re-used a key
|
|
80
|
+
// for multiple application data messages that
|
|
81
|
+
// were not meant to be revealed.
|
|
82
|
+
expect(mocks_1.SPY_PREPARER).toHaveBeenCalledTimes(1);
|
|
83
|
+
await (0, utils_1.verifyNoDirectRevealLeaks)();
|
|
84
|
+
});
|
|
85
|
+
it('should not create a claim with invalid response', async () => {
|
|
86
|
+
await expect(async () => {
|
|
87
|
+
await (0, client_1.createClaimOnAttestor)({
|
|
88
|
+
name: 'http',
|
|
89
|
+
params: {
|
|
90
|
+
url: claimUrl,
|
|
91
|
+
method: 'GET',
|
|
92
|
+
responseRedactions: [],
|
|
93
|
+
responseMatches: [
|
|
94
|
+
{
|
|
95
|
+
type: 'contains',
|
|
96
|
+
value: 'something@mock.com'
|
|
97
|
+
}
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
secretParams: {
|
|
101
|
+
authorisationHeader: 'Fail'
|
|
102
|
+
},
|
|
103
|
+
ownerPrivateKey: opts.privateKeyHex,
|
|
104
|
+
client,
|
|
105
|
+
});
|
|
106
|
+
}).rejects.toThrow('Provider returned error 401');
|
|
107
|
+
});
|
|
108
|
+
describe('Pool', () => {
|
|
109
|
+
it('should correctly throw error when tunnel creation fails', async () => {
|
|
110
|
+
await expect((0, client_1.createClaimOnAttestor)({
|
|
111
|
+
name: 'http',
|
|
112
|
+
params: {
|
|
113
|
+
url: 'https://some.dns.not.exist',
|
|
114
|
+
method: 'GET',
|
|
115
|
+
responseRedactions: [],
|
|
116
|
+
responseMatches: [
|
|
117
|
+
{
|
|
118
|
+
type: 'contains',
|
|
119
|
+
value: 'test'
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
},
|
|
123
|
+
secretParams: {
|
|
124
|
+
authorisationHeader: 'Bearer abcd'
|
|
125
|
+
},
|
|
126
|
+
ownerPrivateKey: opts.privateKeyHex,
|
|
127
|
+
client: { url: opts.serverUrl }
|
|
128
|
+
})).rejects.toMatchObject({
|
|
129
|
+
message: /ENOTFOUND/
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
it('should reconnect client when found disconnected', async () => {
|
|
133
|
+
await createClaim();
|
|
134
|
+
// since we're using a pool, we'll find the client
|
|
135
|
+
// disconnected and when we create the claim again
|
|
136
|
+
// we expect a new connection to be established
|
|
137
|
+
const client = (0, client_1.getAttestorClientFromPool)(opts.serverUrl);
|
|
138
|
+
await client.terminateConnection();
|
|
139
|
+
// ensure claim is still successful
|
|
140
|
+
const result2 = await createClaim();
|
|
141
|
+
expect(result2.claim).toBeTruthy();
|
|
142
|
+
const client2 = (0, client_1.getAttestorClientFromPool)(opts.serverUrl);
|
|
143
|
+
expect(client2).not.toBe(client);
|
|
144
|
+
});
|
|
145
|
+
it('should retry on network errors', async () => {
|
|
146
|
+
const client = (0, client_1.getAttestorClientFromPool)(opts.serverUrl);
|
|
147
|
+
client.sendMessage = async () => {
|
|
148
|
+
// @ts-ignore
|
|
149
|
+
client.sendMessage = () => { };
|
|
150
|
+
const err = new utils_2.AttestorError('ERROR_NETWORK_ERROR', 'F');
|
|
151
|
+
client.terminateConnection(err);
|
|
152
|
+
throw err;
|
|
153
|
+
};
|
|
154
|
+
// first the client will mock disconnection when
|
|
155
|
+
// sending a message -- that should trigger a retry
|
|
156
|
+
// and result in a successful claim creation
|
|
157
|
+
await expect(createClaim()).resolves.toBeTruthy();
|
|
158
|
+
// ensure new client is created to replace
|
|
159
|
+
// the disconnected one
|
|
160
|
+
const client2 = (0, client_1.getAttestorClientFromPool)(opts.serverUrl);
|
|
161
|
+
expect(client2).not.toBe(client);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
function createClaim() {
|
|
165
|
+
const user = 'testing-123';
|
|
166
|
+
return (0, client_1.createClaimOnAttestor)({
|
|
167
|
+
name: 'http',
|
|
168
|
+
params: {
|
|
169
|
+
url: claimUrl,
|
|
170
|
+
method: 'GET',
|
|
171
|
+
responseRedactions: [],
|
|
172
|
+
responseMatches: [
|
|
173
|
+
{
|
|
174
|
+
type: 'contains',
|
|
175
|
+
value: `${user}@mock.com`
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
},
|
|
179
|
+
secretParams: {
|
|
180
|
+
authorisationHeader: `Bearer ${user}`
|
|
181
|
+
},
|
|
182
|
+
ownerPrivateKey: opts.privateKeyHex,
|
|
183
|
+
client: { url: opts.serverUrl }
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5jbGFpbS1jcmVhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0cy90ZXN0LmNsYWltLWNyZWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsOENBQTBFO0FBRTFFLHVDQUE2RTtBQUM3RSw2Q0FBeUM7QUFDekMsdUNBQThDO0FBQzlDLHlFQUFtRTtBQUNuRSwyQ0FBOEM7QUFDOUMsMkNBQTJEO0FBQzNELHFDQUkwQjtBQUUxQixNQUFNLFlBQVksR0FBeUI7SUFDMUMsUUFBUTtJQUNSLFFBQVE7Q0FDUixDQUFBO0FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFNLENBQUMsQ0FBQTtBQUV2QixJQUFJLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtJQUNsRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGtEQUFrRCxDQUFDLENBQUE7SUFDckYsT0FBTztRQUNOLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLEdBQUcsTUFBTTtRQUNULHNCQUFzQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRTtLQUN0RCxDQUFBO0FBQ0YsQ0FBQyxDQUFDLENBQUE7QUFHRixJQUFBLHlDQUFrQixFQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxFQUFFO0lBRTNDLElBQUksTUFBc0IsQ0FBQTtJQUMxQixJQUFJLFFBQWdCLENBQUE7SUFDcEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNmLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBO1FBQ3BCLFFBQVEsR0FBRyxxQkFBcUIsSUFBSSxDQUFDLG1CQUFtQixLQUFLLENBQUE7UUFFN0QsOENBQThDO1FBQzlDLHVCQUF1QjtRQUN2QixxQkFBUyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsR0FBRztZQUN4Qyx1QkFBdUIsRUFBRSxLQUFLO1NBQzlCLENBQUE7SUFDRixDQUFDLENBQUMsQ0FBQTtJQUVG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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tls_1 = require("@reclaimprotocol/tls");
|
|
4
|
+
const generics_1 = require("src/utils/generics");
|
|
5
|
+
const http_parser_1 = require("src/utils/http-parser");
|
|
6
|
+
describe.each(['complete', 'byte-by-byte'])('HTTP Parser tests (mode=%s)', (parseMode) => {
|
|
7
|
+
it('should parse a response', () => {
|
|
8
|
+
const res = parseHttpResponse(RES1, parseMode);
|
|
9
|
+
expect(RES1
|
|
10
|
+
.subarray(0, res.statusLineEndIndex)
|
|
11
|
+
.toString()).toEqual('HTTP/1.1 401 Unauthorized');
|
|
12
|
+
expect(res.complete).toEqual(true);
|
|
13
|
+
expect(res.statusCode).toEqual(401);
|
|
14
|
+
expect(res.body.length).toBeGreaterThan(0);
|
|
15
|
+
const json = JSON.parse((0, generics_1.uint8ArrayToStr)(res.body));
|
|
16
|
+
expect(json.error.code).toEqual(401);
|
|
17
|
+
});
|
|
18
|
+
it('should parse an empty body response', () => {
|
|
19
|
+
const res = parseHttpResponse((0, tls_1.strToUint8Array)(RES_EMPTY), parseMode);
|
|
20
|
+
expect(res.complete).toEqual(true);
|
|
21
|
+
expect(res.statusCode).toEqual(200);
|
|
22
|
+
expect(res.body.length).toEqual(0);
|
|
23
|
+
});
|
|
24
|
+
it('should parse an empty chunked response', () => {
|
|
25
|
+
const res = parseHttpResponse((0, tls_1.strToUint8Array)(RES_EMPTY_CHUNKED), parseMode);
|
|
26
|
+
expect(res.complete).toEqual(true);
|
|
27
|
+
expect(res.statusCode).toEqual(200);
|
|
28
|
+
expect(res.body.length).toEqual(0);
|
|
29
|
+
});
|
|
30
|
+
it('should read a set content-length', () => {
|
|
31
|
+
const buff = (0, tls_1.strToUint8Array)(RES_BODY);
|
|
32
|
+
const res = parseHttpResponse(buff, parseMode);
|
|
33
|
+
expect(res.complete).toEqual(true);
|
|
34
|
+
expect(res.bodyStartIndex).toBeTruthy();
|
|
35
|
+
expect(buff.slice(res.bodyStartIndex)).toEqual(res.body);
|
|
36
|
+
const json = JSON.parse((0, generics_1.uint8ArrayToStr)(res.body));
|
|
37
|
+
expect(json.name).toBeTruthy();
|
|
38
|
+
});
|
|
39
|
+
it('should correctly set chunk indices', () => {
|
|
40
|
+
var _a;
|
|
41
|
+
const buff = (0, tls_1.strToUint8Array)(RES_CHUNKED_PARTIAL_BODY);
|
|
42
|
+
const res = parseHttpResponse(buff, parseMode);
|
|
43
|
+
expect(res.complete).toEqual(true);
|
|
44
|
+
// ensure all chunks are parsed correctly
|
|
45
|
+
const parsedChunks = (_a = res.chunks) === null || _a === void 0 ? void 0 : _a.map((chunk) => {
|
|
46
|
+
return (0, generics_1.uint8ArrayToStr)(buff.slice(chunk.fromIndex, chunk.toIndex));
|
|
47
|
+
});
|
|
48
|
+
expect(parsedChunks).toEqual(CHUNKS);
|
|
49
|
+
const json = JSON.parse((0, generics_1.uint8ArrayToStr)(res.body));
|
|
50
|
+
expect(json.name).toBeTruthy();
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('General HTTP Parser Tests', () => {
|
|
54
|
+
it('should correctly parse an empty body response', () => {
|
|
55
|
+
const str = 'HTTP/1.1 302 \r\nset-cookie: JSESSIONID=X; Path=/; Secure; HttpOnly\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nstrict-transport-security: max-age=31536000 ; includeSubDomains\r\nlocation: https://xyz.com/abcd\r\ncontent-length: 0\r\ndate: Sun, 16 Jun 2024 07:12:03 GMT\r\nconnection: close\r\nSet-Cookie: XYZ; path=/; Httponly; Secure\r\nSet-Cookie: ROUTEID=.node-U01; Path=/; Httponly; Secure\r\n\r\n';
|
|
56
|
+
const buff = (0, tls_1.strToUint8Array)(str);
|
|
57
|
+
const parser = (0, http_parser_1.makeHttpResponseParser)();
|
|
58
|
+
parser.onChunk(buff);
|
|
59
|
+
expect(parser.res.complete).toEqual(true);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
function parseHttpResponse(buff, mode) {
|
|
63
|
+
const parser = (0, http_parser_1.makeHttpResponseParser)();
|
|
64
|
+
if (mode === 'complete') {
|
|
65
|
+
parser.onChunk(buff);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
for (const byte of buff) {
|
|
69
|
+
parser.onChunk(new Uint8Array([byte]));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
parser.streamEnded();
|
|
73
|
+
return parser.res;
|
|
74
|
+
}
|
|
75
|
+
const RES1 = Buffer.from('SFRUUC8xLjEgNDAxIFVuYXV0aG9yaXplZA0KV1dXLUF1dGhlbnRpY2F0ZTogQmVhcmVyIHJlYWxtPSJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vIiwgZXJyb3I9ImludmFsaWRfdG9rZW4iDQpWYXJ5OiBYLU9yaWdpbg0KVmFyeTogUmVmZXJlcg0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04DQpEYXRlOiBUdWUsIDEzIERlYyAyMDIyIDAzOjU1OjM1IEdNVA0KU2VydmVyOiBFU0YNCkNhY2hlLUNvbnRyb2w6IHByaXZhdGUNClgtWFNTLVByb3RlY3Rpb246IDANClgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTg0KWC1Db250ZW50LVR5cGUtT3B0aW9uczogbm9zbmlmZg0KQWNjZXB0LVJhbmdlczogbm9uZQ0KVmFyeTogT3JpZ2luLEFjY2VwdC1FbmNvZGluZw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNCkFsdC1TdmM6IGgzPSI6NDQzIjsgbWE9MjU5MjAwMCxoMy0yOT0iOjQ0MyI7IG1hPTI1OTIwMDAsaDMtUTA1MD0iOjQ0MyI7IG1hPTI1OTIwMDAsaDMtUTA0Nj0iOjQ0MyI7IG1hPTI1OTIwMDAsaDMtUTA0Mz0iOjQ0MyI7IG1hPTI1OTIwMDAscXVpYz0iOjQ0MyI7IG1hPTI1OTIwMDA7IHY9IjQ2LDQzIg0KQ29ubmVjdGlvbjogY2xvc2UNCg0KMTI5DQp7CiAgImVycm9yIjogewogICAgImNvZGUiOiA0MDEsCiAgICAibWVzc2FnZSI6ICJSZXF1ZXN0IGhhZCBpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzLiBFeHBlY3RlZCBPQXV0aCAyIGFjY2VzcyB0b2tlbiwgbG9naW4gY29va2llIG9yIG90aGVyIHZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWwuIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9pZGVudGl0eS9zaWduLWluL3dlYi9kZXZjb25zb2xlLXByb2plY3QuIiwKICAgICJzdGF0dXMiOiAiVU5BVVRIRU5USUNBVEVEIgogIH0KfQoNCg==', 'base64');
|
|
76
|
+
const RES_EMPTY = [
|
|
77
|
+
'HTTP/1.1 200 OK',
|
|
78
|
+
'Content-Type: application/json',
|
|
79
|
+
'Content-Length: 0',
|
|
80
|
+
'', //empty line
|
|
81
|
+
'',
|
|
82
|
+
].join('\r\n');
|
|
83
|
+
const BODY_JSON = '{"name":"John","age":30,"car":null}';
|
|
84
|
+
const RES_BODY = [
|
|
85
|
+
'HTTP/1.1 200 OK',
|
|
86
|
+
'Content-Type: application/json',
|
|
87
|
+
'Content-Length: ' + BODY_JSON.length,
|
|
88
|
+
'',
|
|
89
|
+
BODY_JSON
|
|
90
|
+
].join('\r\n');
|
|
91
|
+
const RES_EMPTY_CHUNKED = [
|
|
92
|
+
'HTTP/1.1 200 OK',
|
|
93
|
+
'Content-Type: application/json',
|
|
94
|
+
'Transfer-Encoding: chunked',
|
|
95
|
+
'',
|
|
96
|
+
'0',
|
|
97
|
+
'',
|
|
98
|
+
].join('\r\n');
|
|
99
|
+
const CHUNKS = [
|
|
100
|
+
'{"name":"John",',
|
|
101
|
+
'"age":30,',
|
|
102
|
+
'"car":null',
|
|
103
|
+
'}'
|
|
104
|
+
];
|
|
105
|
+
const RES_CHUNKED_PARTIAL_BODY = [
|
|
106
|
+
'HTTP/1.1 200 OK',
|
|
107
|
+
'Content-Type: application/json',
|
|
108
|
+
'Transfer-Encoding: chunked',
|
|
109
|
+
'',
|
|
110
|
+
...CHUNKS.flatMap((chunk) => {
|
|
111
|
+
const chunkSize = chunk.length.toString(16);
|
|
112
|
+
return [chunkSize, chunk];
|
|
113
|
+
}),
|
|
114
|
+
'0',
|
|
115
|
+
'',
|
|
116
|
+
''
|
|
117
|
+
].join('\r\n');
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5odHRwLXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0cy90ZXN0Lmh0dHAtcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsOENBQXNEO0FBQ3RELGlEQUFvRDtBQUNwRCx1REFBOEQ7QUFFOUQsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQVUsQ0FBQyxDQUFDLDZCQUE2QixFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUU7SUFFakcsRUFBRSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtRQUNsQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDOUMsTUFBTSxDQUNMLElBQUk7YUFDRixRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQzthQUNuQyxRQUFRLEVBQUUsQ0FDWixDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO1FBRXRDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUUxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUEsMEJBQWUsRUFBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNsRCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMscUNBQXFDLEVBQUUs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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|