@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
package/lib/utils/tls.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDefaultTlsOptions = getDefaultTlsOptions;
|
|
4
|
+
const tls_1 = require("@reclaimprotocol/tls");
|
|
5
|
+
const env_1 = require("src/utils/env");
|
|
6
|
+
// we only support the following cipher suites
|
|
7
|
+
// for ZK proof generation
|
|
8
|
+
const ZK_CIPHER_SUITES = [
|
|
9
|
+
// chacha-20
|
|
10
|
+
'TLS_CHACHA20_POLY1305_SHA256',
|
|
11
|
+
'TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256',
|
|
12
|
+
'TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256',
|
|
13
|
+
// aes-256
|
|
14
|
+
'TLS_AES_256_GCM_SHA384',
|
|
15
|
+
'TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384',
|
|
16
|
+
'TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384',
|
|
17
|
+
// aes-128
|
|
18
|
+
'TLS_AES_128_GCM_SHA256',
|
|
19
|
+
'TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256',
|
|
20
|
+
'TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256',
|
|
21
|
+
];
|
|
22
|
+
const NAMED_CURVE_LIST = (0, env_1.detectEnvironment)() === 'node'
|
|
23
|
+
? tls_1.SUPPORTED_NAMED_CURVES
|
|
24
|
+
// X25519 is not supported in the browser
|
|
25
|
+
: tls_1.SUPPORTED_NAMED_CURVES.filter(c => c !== 'X25519');
|
|
26
|
+
function getDefaultTlsOptions() {
|
|
27
|
+
return {
|
|
28
|
+
cipherSuites: ZK_CIPHER_SUITES,
|
|
29
|
+
namedCurves: NAMED_CURVE_LIST,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3Rscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXlCQSxvREFLQztBQTlCRCw4Q0FBZ0c7QUFDaEcsdUNBQWlEO0FBRWpELDhDQUE4QztBQUM5QywwQkFBMEI7QUFDMUIsTUFBTSxnQkFBZ0IsR0FBa0I7SUFDdkMsWUFBWTtJQUNaLDhCQUE4QjtJQUM5Qiw2Q0FBNkM7SUFDN0MsK0NBQStDO0lBQy9DLFVBQVU7SUFDVix3QkFBd0I7SUFDeEIseUNBQXlDO0lBQ3pDLHVDQUF1QztJQUN2QyxVQUFVO0lBQ1Ysd0JBQXdCO0lBQ3hCLHlDQUF5QztJQUN6Qyx1Q0FBdUM7Q0FDdkMsQ0FBQTtBQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSx1QkFBaUIsR0FBRSxLQUFLLE1BQU07SUFDdEQsQ0FBQyxDQUFDLDRCQUFzQjtJQUN4Qix5Q0FBeUM7SUFDekMsQ0FBQyxDQUFDLDRCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQTtBQUVyRCxTQUFnQixvQkFBb0I7SUFDbkMsT0FBTztRQUNOLFlBQVksRUFBRSxnQkFBZ0I7UUFDOUIsV0FBVyxFQUFFLGdCQUFnQjtLQUM3QixDQUFBO0FBQ0YsQ0FBQyJ9
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.assertValidateProviderParams = assertValidateProviderParams;
|
|
7
|
+
const ajv_1 = __importDefault(require("ajv"));
|
|
8
|
+
const providers_gen_1 = require("src/types/providers.gen");
|
|
9
|
+
const error_1 = require("src/utils/error");
|
|
10
|
+
const PROVIDER_VALIDATOR_MAP = {};
|
|
11
|
+
const AJV = new ajv_1.default({
|
|
12
|
+
allErrors: true,
|
|
13
|
+
strict: true,
|
|
14
|
+
strictRequired: false,
|
|
15
|
+
formats: {
|
|
16
|
+
binary(data) {
|
|
17
|
+
return data instanceof Uint8Array
|
|
18
|
+
|| (typeof Buffer !== 'undefined'
|
|
19
|
+
&& Buffer.isBuffer(data));
|
|
20
|
+
},
|
|
21
|
+
url(data) {
|
|
22
|
+
try {
|
|
23
|
+
new URL(data);
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
catch (_a) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
function assertValidateProviderParams(name, params) {
|
|
33
|
+
var _a;
|
|
34
|
+
let validate = PROVIDER_VALIDATOR_MAP[name];
|
|
35
|
+
if (!validate) {
|
|
36
|
+
const schema = (_a = providers_gen_1.PROVIDER_SCHEMAS[name]) === null || _a === void 0 ? void 0 : _a.parameters;
|
|
37
|
+
if (!schema) {
|
|
38
|
+
throw new error_1.AttestorError('ERROR_BAD_REQUEST', `Invalid provider name "${name}"`);
|
|
39
|
+
}
|
|
40
|
+
validate = AJV.compile(schema);
|
|
41
|
+
}
|
|
42
|
+
if (!validate(params)) {
|
|
43
|
+
throw new error_1.AttestorError('ERROR_BAD_REQUEST', 'Params validation failed', { errors: JSON.stringify(validate.errors) });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBOEJBLG9FQXdCQztBQXRERCw4Q0FBMkM7QUFFM0MsMkRBQTBEO0FBQzFELDJDQUErQztBQUUvQyxNQUFNLHNCQUFzQixHQUErQyxFQUFFLENBQUE7QUFFN0UsTUFBTSxHQUFHLEdBQUcsSUFBSSxhQUFHLENBQUM7SUFDbkIsU0FBUyxFQUFFLElBQUk7SUFDZixNQUFNLEVBQUUsSUFBSTtJQUNaLGNBQWMsRUFBRSxLQUFLO0lBQ3JCLE9BQU8sRUFBRTtRQUNSLE1BQU0sQ0FBQyxJQUFhO1lBQ25CLE9BQU8sSUFBSSxZQUFZLFVBQVU7bUJBQzdCLENBQ0YsT0FBTyxNQUFNLEtBQUssV0FBVzt1QkFDMUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDeEIsQ0FBQTtRQUNILENBQUM7UUFDRCxHQUFHLENBQUMsSUFBYTtZQUNoQixJQUFJLENBQUM7Z0JBQ0osSUFBSSxHQUFHLENBQUMsSUFBYyxDQUFDLENBQUE7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFBO1lBQ1osQ0FBQztZQUFDLFdBQUssQ0FBQztnQkFDUCxPQUFPLEtBQUssQ0FBQTtZQUNiLENBQUM7UUFDRixDQUFDO0tBQ0Q7Q0FDRCxDQUFDLENBQUE7QUFFRixTQUFnQiw0QkFBNEIsQ0FDM0MsSUFBTyxFQUNQLE1BQWU7O0lBRWYsSUFBSSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDM0MsSUFBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxNQUFNLEdBQUcsTUFBQSxnQ0FBZ0IsQ0FBQyxJQUFJLENBQUMsMENBQUUsVUFBVSxDQUFBO1FBQ2pELElBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxxQkFBYSxDQUN0QixtQkFBbUIsRUFDbkIsMEJBQTBCLElBQUksR0FBRyxDQUNqQyxDQUFBO1FBQ0YsQ0FBQztRQUVELFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFFRCxJQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLHFCQUFhLENBQ3RCLG1CQUFtQixFQUNuQiwwQkFBMEIsRUFDMUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FDM0MsQ0FBQTtJQUNGLENBQUM7QUFDRixDQUFDIn0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AnyWebSocketConstructor } from 'src/types';
|
|
2
|
+
/**
|
|
3
|
+
* Default WebSocket implementation, uses `ws` package
|
|
4
|
+
* for Node.js and the native WebSocket for the browser & other
|
|
5
|
+
* environments.
|
|
6
|
+
*/
|
|
7
|
+
export declare let Websocket: AnyWebSocketConstructor;
|
|
8
|
+
/**
|
|
9
|
+
* Replace the default WebSocket implementation utilised
|
|
10
|
+
* by the Attestor client.
|
|
11
|
+
*/
|
|
12
|
+
export declare function setWebsocket(ws: AnyWebSocketConstructor): void;
|
package/lib/utils/ws.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Websocket = void 0;
|
|
4
|
+
exports.setWebsocket = setWebsocket;
|
|
5
|
+
const env_1 = require("src/utils/env");
|
|
6
|
+
/**
|
|
7
|
+
* Default WebSocket implementation, uses `ws` package
|
|
8
|
+
* for Node.js and the native WebSocket for the browser & other
|
|
9
|
+
* environments.
|
|
10
|
+
*/
|
|
11
|
+
exports.Websocket = ((0, env_1.detectEnvironment)() === 'node'
|
|
12
|
+
? require('ws').WebSocket
|
|
13
|
+
: WebSocket);
|
|
14
|
+
/**
|
|
15
|
+
* Replace the default WebSocket implementation utilised
|
|
16
|
+
* by the Attestor client.
|
|
17
|
+
*/
|
|
18
|
+
function setWebsocket(ws) {
|
|
19
|
+
exports.Websocket = ws;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBa0JBLG9DQUVDO0FBbkJELHVDQUFpRDtBQUVqRDs7OztHQUlHO0FBQ1EsUUFBQSxTQUFTLEdBQTRCLENBQy9DLElBQUEsdUJBQWlCLEdBQUUsS0FBSyxNQUFNO0lBQzdCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUztJQUN6QixDQUFDLENBQUMsU0FBUyxDQUNaLENBQUE7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixZQUFZLENBQUMsRUFBMkI7SUFDdkQsaUJBQVMsR0FBRyxFQUFFLENBQUE7QUFDZixDQUFDIn0=
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { EncryptionAlgorithm, PrivateInput, PublicInput, ZKOperator } from '@reclaimprotocol/circom-symmetric-crypto';
|
|
2
|
+
import { CipherSuite } from '@reclaimprotocol/tls';
|
|
3
|
+
import { MessageReveal_MessageRevealZk as ZKReveal, MessageReveal_ZKProof as ZKProof } from 'src/proto/api';
|
|
4
|
+
import { CompleteTLSPacket, Logger, PrepareZKProofsBaseOpts, ZKEngine, ZKOperators, ZKRevealInfo } from 'src/types';
|
|
5
|
+
type PrepareZKProofsOpts = {
|
|
6
|
+
logger?: Logger;
|
|
7
|
+
cipherSuite: CipherSuite;
|
|
8
|
+
} & PrepareZKProofsBaseOpts;
|
|
9
|
+
type ZKVerifyOpts = {
|
|
10
|
+
cipherSuite: CipherSuite;
|
|
11
|
+
ciphertext: Uint8Array;
|
|
12
|
+
zkReveal: ZKReveal;
|
|
13
|
+
logger?: Logger;
|
|
14
|
+
/** get ZK operator for specified algorithm */
|
|
15
|
+
zkOperators?: ZKOperators;
|
|
16
|
+
zkEngine?: ZKEngine;
|
|
17
|
+
iv: Uint8Array;
|
|
18
|
+
recordNumber: number;
|
|
19
|
+
};
|
|
20
|
+
type ZKProofToGenerate = {
|
|
21
|
+
startIdx: number;
|
|
22
|
+
redactedPlaintext: Uint8Array;
|
|
23
|
+
privateInput: PrivateInput;
|
|
24
|
+
publicInput: PublicInput;
|
|
25
|
+
};
|
|
26
|
+
type ZKPacketToProve = {
|
|
27
|
+
onGeneratedProofs(proofs: ZKProof[]): void;
|
|
28
|
+
algorithm: EncryptionAlgorithm;
|
|
29
|
+
proofsToGenerate: ZKProofToGenerate[];
|
|
30
|
+
iv: Uint8Array;
|
|
31
|
+
};
|
|
32
|
+
export declare function makeZkProofGenerator({ zkOperators, logger, zkProofConcurrency, maxZkChunks, cipherSuite, zkEngine }: PrepareZKProofsOpts): Promise<{
|
|
33
|
+
/**
|
|
34
|
+
* Adds the given packet to the list of packets to
|
|
35
|
+
* generate ZK proofs for.
|
|
36
|
+
*
|
|
37
|
+
* Call `generateProofs()` to finally generate the proofs
|
|
38
|
+
*/
|
|
39
|
+
addPacketToProve(packet: CompleteTLSPacket, reveal: ZKRevealInfo, onGeneratedProofs: ZKPacketToProve["onGeneratedProofs"]): Promise<void>;
|
|
40
|
+
getTotalChunksToProve(): number;
|
|
41
|
+
generateProofs(onChunkDone?: () => void): Promise<void>;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Verify the given ZK proof
|
|
45
|
+
*/
|
|
46
|
+
export declare function verifyZkPacket({ cipherSuite, ciphertext, zkReveal, zkOperators, logger, zkEngine, iv, recordNumber }: ZKVerifyOpts): Promise<{
|
|
47
|
+
redactedPlaintext: Uint8Array;
|
|
48
|
+
}>;
|
|
49
|
+
export declare function makeDefaultZkOperator(algorithm: EncryptionAlgorithm, zkEngine: ZKEngine, logger: Logger): Promise<ZKOperator>;
|
|
50
|
+
export {};
|
package/lib/utils/zk.js
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeZkProofGenerator = makeZkProofGenerator;
|
|
4
|
+
exports.verifyZkPacket = verifyZkPacket;
|
|
5
|
+
exports.makeDefaultZkOperator = makeDefaultZkOperator;
|
|
6
|
+
const circom_symmetric_crypto_1 = require("@reclaimprotocol/circom-symmetric-crypto");
|
|
7
|
+
const gnark_1 = require("@reclaimprotocol/circom-symmetric-crypto/lib/gnark");
|
|
8
|
+
const tls_1 = require("@reclaimprotocol/tls");
|
|
9
|
+
const config_1 = require("src/config");
|
|
10
|
+
const env_1 = require("src/utils/env");
|
|
11
|
+
const error_1 = require("src/utils/error");
|
|
12
|
+
const generics_1 = require("src/utils/generics");
|
|
13
|
+
const logger_1 = require("src/utils/logger");
|
|
14
|
+
const redactions_1 = require("src/utils/redactions");
|
|
15
|
+
const retries_1 = require("src/utils/retries");
|
|
16
|
+
const ZK_CONCURRENCY = +((0, env_1.getEnvVariable)('ZK_CONCURRENCY')
|
|
17
|
+
|| config_1.DEFAULT_ZK_CONCURRENCY);
|
|
18
|
+
async function makeZkProofGenerator({ zkOperators, logger = logger_1.logger, zkProofConcurrency = ZK_CONCURRENCY, maxZkChunks = config_1.MAX_ZK_CHUNKS, cipherSuite, zkEngine = 'snarkJS' }) {
|
|
19
|
+
const { default: PQueue } = await import('p-queue');
|
|
20
|
+
const zkQueue = new PQueue({
|
|
21
|
+
concurrency: zkProofConcurrency,
|
|
22
|
+
autoStart: true,
|
|
23
|
+
});
|
|
24
|
+
const packetsToProve = [];
|
|
25
|
+
logger = (logger || logger_1.logger).child({ module: 'zk', zkEngine: zkEngine });
|
|
26
|
+
let zkChunksToProve = 0;
|
|
27
|
+
return {
|
|
28
|
+
/**
|
|
29
|
+
* Adds the given packet to the list of packets to
|
|
30
|
+
* generate ZK proofs for.
|
|
31
|
+
*
|
|
32
|
+
* Call `generateProofs()` to finally generate the proofs
|
|
33
|
+
*/
|
|
34
|
+
async addPacketToProve(packet, reveal, onGeneratedProofs) {
|
|
35
|
+
if (packet.type === 'plaintext') {
|
|
36
|
+
throw new Error('Cannot generate proof for plaintext');
|
|
37
|
+
}
|
|
38
|
+
const alg = (0, generics_1.getZkAlgorithmForCipherSuite)(cipherSuite);
|
|
39
|
+
const chunkSizeBytes = getChunkSizeBytes(alg);
|
|
40
|
+
const { redactedPlaintext } = reveal;
|
|
41
|
+
const key = await tls_1.crypto.exportKey(packet.encKey);
|
|
42
|
+
const iv = packet.iv;
|
|
43
|
+
const ciphertext = (0, generics_1.getPureCiphertext)(packet.ciphertext, cipherSuite);
|
|
44
|
+
const chunks = Math.ceil(ciphertext.length / chunkSizeBytes);
|
|
45
|
+
const packetToProve = {
|
|
46
|
+
onGeneratedProofs,
|
|
47
|
+
algorithm: alg,
|
|
48
|
+
proofsToGenerate: [],
|
|
49
|
+
iv: packet.fixedIv
|
|
50
|
+
};
|
|
51
|
+
for (let i = 0; i < chunks; i++) {
|
|
52
|
+
const proof = getProofGenerationParamsForChunk(alg, {
|
|
53
|
+
key,
|
|
54
|
+
iv,
|
|
55
|
+
ciphertext,
|
|
56
|
+
redactedPlaintext,
|
|
57
|
+
offsetChunks: i,
|
|
58
|
+
});
|
|
59
|
+
if (!proof) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
packetToProve.proofsToGenerate.push(proof);
|
|
63
|
+
zkChunksToProve += 1;
|
|
64
|
+
if (zkChunksToProve > maxZkChunks) {
|
|
65
|
+
throw new Error(`Too many chunks to prove: ${zkChunksToProve} > ${maxZkChunks}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
packetsToProve.push(packetToProve);
|
|
69
|
+
},
|
|
70
|
+
getTotalChunksToProve() {
|
|
71
|
+
return zkChunksToProve;
|
|
72
|
+
},
|
|
73
|
+
async generateProofs(onChunkDone) {
|
|
74
|
+
var _a;
|
|
75
|
+
if (!packetsToProve.length) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const start = Date.now();
|
|
79
|
+
const tasks = [];
|
|
80
|
+
for (const { onGeneratedProofs, algorithm, proofsToGenerate } of packetsToProve) {
|
|
81
|
+
const proofs = [];
|
|
82
|
+
let proofsLeft = proofsToGenerate.length;
|
|
83
|
+
for (const proofToGen of proofsToGenerate) {
|
|
84
|
+
tasks.push(zkQueue.add(async () => {
|
|
85
|
+
const proof = await generateProofForChunk(algorithm, proofToGen);
|
|
86
|
+
onChunkDone === null || onChunkDone === void 0 ? void 0 : onChunkDone();
|
|
87
|
+
proofs.push(proof);
|
|
88
|
+
proofsLeft -= 1;
|
|
89
|
+
if (proofsLeft === 0) {
|
|
90
|
+
onGeneratedProofs(proofs);
|
|
91
|
+
}
|
|
92
|
+
}, { throwOnTimeout: true }));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
await Promise.all(tasks);
|
|
96
|
+
logger === null || logger === void 0 ? void 0 : logger.info({
|
|
97
|
+
durationMs: Date.now() - start,
|
|
98
|
+
chunks: zkChunksToProve,
|
|
99
|
+
}, 'generated ZK proofs');
|
|
100
|
+
// reset the packets to prove
|
|
101
|
+
packetsToProve.splice(0, packetsToProve.length);
|
|
102
|
+
zkChunksToProve = 0;
|
|
103
|
+
// release ZK resources to free up memory
|
|
104
|
+
const alg = (0, generics_1.getZkAlgorithmForCipherSuite)(cipherSuite);
|
|
105
|
+
const zkOperator = await getZkOperatorForAlgorithm(alg);
|
|
106
|
+
(_a = zkOperator.release) === null || _a === void 0 ? void 0 : _a.call(zkOperator);
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
async function generateProofForChunk(algorithm, { startIdx, redactedPlaintext, privateInput, publicInput }) {
|
|
110
|
+
const operator = await getZkOperatorForAlgorithm(algorithm);
|
|
111
|
+
const proof = await (0, circom_symmetric_crypto_1.generateProof)({
|
|
112
|
+
algorithm,
|
|
113
|
+
privateInput,
|
|
114
|
+
publicInput,
|
|
115
|
+
operator,
|
|
116
|
+
logger
|
|
117
|
+
});
|
|
118
|
+
logger === null || logger === void 0 ? void 0 : logger.debug({ startIdx }, 'generated proof for chunk');
|
|
119
|
+
return {
|
|
120
|
+
proofJson: proof.proofJson,
|
|
121
|
+
decryptedRedactedCiphertext: proof.plaintext,
|
|
122
|
+
redactedPlaintext,
|
|
123
|
+
startIdx
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
async function getZkOperatorForAlgorithm(algorithm) {
|
|
127
|
+
return (zkOperators === null || zkOperators === void 0 ? void 0 : zkOperators[algorithm])
|
|
128
|
+
|| await makeDefaultZkOperator(algorithm, zkEngine, logger);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Verify the given ZK proof
|
|
133
|
+
*/
|
|
134
|
+
async function verifyZkPacket({ cipherSuite, ciphertext, zkReveal, zkOperators, logger = logger_1.logger, zkEngine = 'snarkJS', iv, recordNumber }) {
|
|
135
|
+
if (!zkReveal) {
|
|
136
|
+
throw new Error('No ZK reveal');
|
|
137
|
+
}
|
|
138
|
+
const { proofs } = zkReveal;
|
|
139
|
+
const algorithm = (0, generics_1.getZkAlgorithmForCipherSuite)(cipherSuite);
|
|
140
|
+
const operator = (zkOperators === null || zkOperators === void 0 ? void 0 : zkOperators[algorithm])
|
|
141
|
+
|| await makeDefaultZkOperator(algorithm, zkEngine, logger);
|
|
142
|
+
const recordIV = (0, generics_1.getRecordIV)(ciphertext, cipherSuite);
|
|
143
|
+
ciphertext = (0, generics_1.getPureCiphertext)(ciphertext, cipherSuite);
|
|
144
|
+
/**
|
|
145
|
+
* to verify if the user has given us the correct redacted plaintext,
|
|
146
|
+
* and isn't providing plaintext that they haven't proven they have
|
|
147
|
+
* we start with a fully redacted plaintext, and then replace the
|
|
148
|
+
* redacted parts with the plaintext that the user has provided
|
|
149
|
+
* in the proofs
|
|
150
|
+
*/
|
|
151
|
+
const realRedactedPlaintext = new Uint8Array(ciphertext.length).fill(redactions_1.REDACTION_CHAR_CODE);
|
|
152
|
+
const alg = (0, generics_1.getZkAlgorithmForCipherSuite)(cipherSuite);
|
|
153
|
+
const chunkSizeBytes = getChunkSizeBytes(alg);
|
|
154
|
+
const { blocksPerChunk } = circom_symmetric_crypto_1.CONFIG[algorithm];
|
|
155
|
+
await Promise.all(proofs.map(async ({ proofJson, decryptedRedactedCiphertext, redactedPlaintext, startIdx }, i) => {
|
|
156
|
+
// get the ciphertext chunk we received from the server
|
|
157
|
+
// the ZK library, will verify that the decrypted redacted
|
|
158
|
+
// ciphertext matches the ciphertext received from the server
|
|
159
|
+
const ciphertextChunk = ciphertext.slice(startIdx, startIdx + redactedPlaintext.length);
|
|
160
|
+
// redact ciphertext if plaintext is redacted
|
|
161
|
+
// to prepare for decryption in ZK circuit
|
|
162
|
+
// the ZK circuit will take in the redacted ciphertext,
|
|
163
|
+
// which shall produce the redacted plaintext
|
|
164
|
+
for (let i = 0; i < ciphertextChunk.length; i++) {
|
|
165
|
+
if (redactedPlaintext[i] === redactions_1.REDACTION_CHAR_CODE) {
|
|
166
|
+
ciphertextChunk[i] = redactions_1.REDACTION_CHAR_CODE;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (!(0, redactions_1.isRedactionCongruent)(redactedPlaintext, decryptedRedactedCiphertext)) {
|
|
170
|
+
throw new Error(`redacted ciphertext (${i}) not congruent`);
|
|
171
|
+
}
|
|
172
|
+
const chunkIndex = startIdx / chunkSizeBytes * blocksPerChunk;
|
|
173
|
+
let nonce = (0, tls_1.concatenateUint8Arrays)([iv, recordIV]);
|
|
174
|
+
if (!recordIV.length) {
|
|
175
|
+
nonce = (0, tls_1.generateIV)(nonce, recordNumber);
|
|
176
|
+
}
|
|
177
|
+
await (0, circom_symmetric_crypto_1.verifyProof)({
|
|
178
|
+
proof: {
|
|
179
|
+
algorithm,
|
|
180
|
+
proofJson,
|
|
181
|
+
plaintext: decryptedRedactedCiphertext,
|
|
182
|
+
},
|
|
183
|
+
publicInput: { ciphertext: ciphertextChunk, iv: nonce, offset: chunkIndex },
|
|
184
|
+
operator,
|
|
185
|
+
logger,
|
|
186
|
+
});
|
|
187
|
+
logger === null || logger === void 0 ? void 0 : logger.debug({ startIdx, endIdx: startIdx + redactedPlaintext.length }, 'verified proof');
|
|
188
|
+
realRedactedPlaintext.set(redactedPlaintext, startIdx);
|
|
189
|
+
}));
|
|
190
|
+
return { redactedPlaintext: realRedactedPlaintext };
|
|
191
|
+
}
|
|
192
|
+
function getChunkSizeBytes(alg) {
|
|
193
|
+
const { chunkSize, bitsPerWord } = circom_symmetric_crypto_1.CONFIG[alg];
|
|
194
|
+
return chunkSize * bitsPerWord / 8;
|
|
195
|
+
}
|
|
196
|
+
const zkEngines = {};
|
|
197
|
+
const operatorMakers = {
|
|
198
|
+
'snarkJS': snarkJSOperator,
|
|
199
|
+
'gnark': gnark_1.makeLocalGnarkZkOperator
|
|
200
|
+
};
|
|
201
|
+
function makeDefaultZkOperator(algorithm, zkEngine, logger) {
|
|
202
|
+
const engine = zkEngine || 'snarkJS';
|
|
203
|
+
let zkOperators = zkEngines[engine];
|
|
204
|
+
if (!zkOperators) {
|
|
205
|
+
zkEngines[engine] = {};
|
|
206
|
+
zkOperators = zkEngines[engine];
|
|
207
|
+
}
|
|
208
|
+
if (!zkOperators[algorithm]) {
|
|
209
|
+
zkOperators[algorithm] = operatorMakers[engine](algorithm, logger);
|
|
210
|
+
}
|
|
211
|
+
return zkOperators[algorithm];
|
|
212
|
+
}
|
|
213
|
+
function snarkJSOperator(algorithm, logger) {
|
|
214
|
+
const isNode = (0, env_1.detectEnvironment)() === 'node';
|
|
215
|
+
const opType = isNode ? 'local' : 'remote';
|
|
216
|
+
logger === null || logger === void 0 ? void 0 : logger.info({
|
|
217
|
+
type: opType,
|
|
218
|
+
algorithm
|
|
219
|
+
}, 'fetching zk operator');
|
|
220
|
+
if (isNode) {
|
|
221
|
+
return (0, circom_symmetric_crypto_1.makeLocalSnarkJsZkOperator)(algorithm);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
const { zkeyUrl, circuitWasmUrl } = config_1.DEFAULT_REMOTE_ZK_PARAMS;
|
|
225
|
+
const operator = makeRemoteSnarkJsZkOperator(zkeyUrl.replace('{algorithm}', algorithm), circuitWasmUrl.replace('{algorithm}', algorithm), logger);
|
|
226
|
+
return Promise.resolve(operator);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function makeRemoteSnarkJsZkOperator(zkeyUrl, wasmUrl, logger) {
|
|
230
|
+
return (0, circom_symmetric_crypto_1.makeSnarkJsZKOperator)({
|
|
231
|
+
getCircuitWasm: () => fetchArrayBuffer('wasm', wasmUrl),
|
|
232
|
+
getZkey: () => (fetchArrayBuffer('zkey', zkeyUrl)
|
|
233
|
+
.then(data => ({ data }))),
|
|
234
|
+
});
|
|
235
|
+
async function fetchArrayBuffer(type, url) {
|
|
236
|
+
const res = await (0, retries_1.executeWithRetries)(async () => {
|
|
237
|
+
const res = await fetch(url);
|
|
238
|
+
if (!res.ok) {
|
|
239
|
+
throw new error_1.AttestorError('ERROR_NETWORK_ERROR', `${type} fetch failed with code: ${res.status}`, { url, status: res.status });
|
|
240
|
+
}
|
|
241
|
+
return await res.arrayBuffer();
|
|
242
|
+
}, {
|
|
243
|
+
logger: logger.child({ type }),
|
|
244
|
+
maxRetries: 3,
|
|
245
|
+
shouldRetry(error) {
|
|
246
|
+
// network errors are TypeErrors
|
|
247
|
+
// in fetch
|
|
248
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API#concepts_and_usage
|
|
249
|
+
return error instanceof TypeError;
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
return new Uint8Array(res);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function getProofGenerationParamsForChunk(algorithm, { key, iv, ciphertext, redactedPlaintext, offsetChunks, }) {
|
|
256
|
+
const chunkSize = getChunkSizeBytes(algorithm);
|
|
257
|
+
const startIdx = offsetChunks * chunkSize;
|
|
258
|
+
const endIdx = (offsetChunks + 1) * chunkSize;
|
|
259
|
+
const ciphertextChunk = ciphertext
|
|
260
|
+
.slice(startIdx, endIdx);
|
|
261
|
+
const plaintextChunk = redactedPlaintext
|
|
262
|
+
.slice(startIdx, endIdx);
|
|
263
|
+
if ((0, redactions_1.isFullyRedacted)(plaintextChunk)) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
// redact ciphertext if plaintext is redacted
|
|
267
|
+
// to prepare for decryption in ZK circuit
|
|
268
|
+
// the ZK circuit will take in the redacted ciphertext,
|
|
269
|
+
// which shall produce the redacted plaintext
|
|
270
|
+
for (let i = 0; i < ciphertextChunk.length; i++) {
|
|
271
|
+
if (plaintextChunk[i] === redactions_1.REDACTION_CHAR_CODE) {
|
|
272
|
+
ciphertextChunk[i] = redactions_1.REDACTION_CHAR_CODE;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
startIdx,
|
|
277
|
+
redactedPlaintext: plaintextChunk,
|
|
278
|
+
privateInput: { key },
|
|
279
|
+
publicInput: { ciphertext: ciphertextChunk, iv, offset: offsetChunks }
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvemsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFzRUEsb0RBMEtDO0FBS0Qsd0NBc0dDO0FBb0JELHNEQWtCQztBQWpZRCxzRkFTaUQ7QUFDakQsOEVBQTZGO0FBQzdGLDhDQUE4RjtBQUM5Rix1Q0FBNEY7QUFHNUYsdUNBQWlFO0FBQ2pFLDJDQUErQztBQUMvQyxpREFBaUc7QUFDakcsNkNBQW1EO0FBQ25ELHFEQUFpRztBQUNqRywrQ0FBc0Q7QUE2Q3RELE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FDdkIsSUFBQSxvQkFBYyxFQUFDLGdCQUFnQixDQUFDO09BQzdCLCtCQUFzQixDQUN6QixDQUFBO0FBRU0sS0FBSyxVQUFVLG9CQUFvQixDQUN6QyxFQUNDLFdBQVcsRUFDWCxNQUFNLEdBQUcsZUFBTSxFQUNmLGtCQUFrQixHQUFHLGNBQWMsRUFDbkMsV0FBVyxHQUFHLHNCQUFhLEVBQzNCLFdBQVcsRUFDWCxRQUFRLEdBQUcsU0FBUyxFQUNDO0lBR3RCLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUM7UUFDMUIsV0FBVyxFQUFFLGtCQUFrQjtRQUMvQixTQUFTLEVBQUUsSUFBSTtLQUNmLENBQUMsQ0FBQTtJQUVGLE1BQU0sY0FBYyxHQUFzQixFQUFFLENBQUE7SUFFNUMsTUFBTSxHQUFHLENBQUMsTUFBTSxJQUFJLGVBQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDdkUsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFBO0lBRXZCLE9BQU87UUFDTjs7Ozs7V0FLRztRQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FDckIsTUFBeUIsRUFDekIs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
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./setup-window-rpc"), exports);
|
|
19
|
+
__exportStar(require("./utils"), exports);
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2luZG93LXJwYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMENBQXVCO0FBQ3ZCLHFEQUFrQztBQUNsQywwQ0FBdUIifQ==
|