@zama-fhe/sdk 3.0.0-alpha.2 → 3.0.0-alpha.21
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 +207 -122
- package/dist/cjs/build.cjs +2 -0
- package/dist/cjs/build.cjs.map +1 -0
- package/dist/cjs/chains/index.cjs +1 -0
- package/dist/cjs/chains.cjs +2 -0
- package/dist/cjs/chains.cjs.map +1 -0
- package/dist/cjs/cleartext/index.cjs +1 -1
- package/dist/cjs/eip1193-subscribe.cjs +1 -1
- package/dist/cjs/eip1193-subscribe.cjs.map +1 -1
- package/dist/cjs/encryption.cjs +2 -0
- package/dist/cjs/encryption.cjs.map +1 -0
- package/dist/cjs/ethers/index.cjs +1 -1
- package/dist/cjs/ethers/index.cjs.map +1 -1
- package/dist/cjs/index.cjs +73 -73
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/query/index.cjs +1 -1
- package/dist/cjs/query/index.cjs.map +1 -1
- package/dist/cjs/readonly-token.cjs +1 -1
- package/dist/cjs/readonly-token.cjs.map +1 -1
- package/dist/cjs/relayer-cleartext.cjs +2 -0
- package/dist/cjs/relayer-cleartext.cjs.map +1 -0
- package/dist/cjs/relayer-sdk.worker.js +71 -71
- package/dist/cjs/relayer.cjs +1 -1
- package/dist/cjs/relayer.cjs.map +1 -1
- package/dist/cjs/viem/index.cjs +1 -1
- package/dist/cjs/viem/index.cjs.map +1 -1
- package/dist/cjs/wrappers-registry.cjs +1 -1
- package/dist/cjs/wrappers-registry.cjs.map +1 -1
- package/dist/esm/{assertions-BARApuMj.js → assertions-CfqI3AJv.js} +1 -1
- package/dist/esm/{assertions-BARApuMj.js.map → assertions-CfqI3AJv.js.map} +1 -1
- package/dist/esm/build-CvenCk6R.js +2 -0
- package/dist/esm/build-CvenCk6R.js.map +1 -0
- package/dist/esm/chains/index.d.ts +3 -0
- package/dist/esm/chains/index.js +1 -0
- package/dist/esm/chains-aHmrozPh.js +2 -0
- package/dist/esm/chains-aHmrozPh.js.map +1 -0
- package/dist/esm/cleartext/index.d.ts +2 -86
- package/dist/esm/cleartext/index.js +1 -1
- package/dist/esm/cleartext-BHu6-LCv.d.ts +19 -0
- package/dist/esm/cleartext-I-etE_7S.js +2 -0
- package/dist/esm/cleartext-I-etE_7S.js.map +1 -0
- package/dist/esm/eip1193-subscribe-CcotSOIm.js +2 -0
- package/dist/esm/eip1193-subscribe-CcotSOIm.js.map +1 -0
- package/dist/esm/{encryption-CmIPBcfP.js → encryption-YS-Kb7qm.js} +2 -2
- package/dist/esm/{encryption-CmIPBcfP.js.map → encryption-YS-Kb7qm.js.map} +1 -1
- package/dist/esm/ethers/index.d.ts +53 -8
- package/dist/esm/ethers/index.js +1 -1
- package/dist/esm/ethers/index.js.map +1 -1
- package/dist/esm/{hex-D_B-zoId.js → hex-BZVTzEK6.js} +2 -2
- package/dist/esm/{hex-D_B-zoId.js.map → hex-BZVTzEK6.js.map} +1 -1
- package/dist/esm/{relayer-utils-iSPis4x-.d.ts → index-BTY0MxOt.d.ts} +50 -23
- package/dist/esm/{onchain-events-2VNiL78c.d.ts → index-BdyljG1F.d.ts} +387 -1505
- package/dist/esm/index.d.ts +61 -93
- package/dist/esm/index.js +73 -73
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/memory-storage-CFXqXUcm.js +2 -0
- package/dist/esm/memory-storage-CFXqXUcm.js.map +1 -0
- package/dist/esm/node/index.d.ts +88 -110
- package/dist/esm/node/index.js +1 -1
- package/dist/esm/node/index.js.map +1 -1
- package/dist/esm/node/relayer-sdk.node-worker.js +1 -1
- package/dist/esm/node/relayer-sdk.node-worker.js.map +1 -1
- package/dist/esm/query/index.d.ts +40 -50
- package/dist/esm/query/index.js +1 -1
- package/dist/esm/query/index.js.map +1 -1
- package/dist/esm/readonly-token-DCLOYhws.js +2 -0
- package/dist/esm/readonly-token-DCLOYhws.js.map +1 -0
- package/dist/esm/{relayer-C6u3eOlN.js → relayer-7Hd00A6X.js} +2 -2
- package/dist/esm/relayer-7Hd00A6X.js.map +1 -0
- package/dist/esm/{relayer-sdk.types-CGfXwKcB.d.ts → relayer-cleartext-DJkSUlZ2.d.ts} +263 -106
- package/dist/esm/relayer-cleartext-SZCM9wTx.js +2 -0
- package/dist/esm/relayer-cleartext-SZCM9wTx.js.map +1 -0
- package/dist/esm/relayer-sdk.worker.js +71 -71
- package/dist/esm/types-C1S426x4.d.ts +48 -0
- package/dist/esm/types-CVyJHEya.d.ts +14 -0
- package/dist/esm/types-DePjTTbo.d.ts +30 -0
- package/dist/esm/types-FY7ciI37.d.ts +615 -0
- package/dist/esm/viem/index.d.ts +39 -11
- package/dist/esm/viem/index.js +1 -1
- package/dist/esm/viem/index.js.map +1 -1
- package/dist/esm/wrappers-registry-CXNs4eR0.js +2 -0
- package/dist/esm/wrappers-registry-CXNs4eR0.js.map +1 -0
- package/package.json +17 -3
- package/dist/cjs/cleartext.cjs +0 -2
- package/dist/cjs/cleartext.cjs.map +0 -1
- package/dist/esm/cleartext-Cs28cTsa.js +0 -2
- package/dist/esm/cleartext-Cs28cTsa.js.map +0 -1
- package/dist/esm/eip1193-subscribe-Cl_wlVuQ.js +0 -2
- package/dist/esm/eip1193-subscribe-Cl_wlVuQ.js.map +0 -1
- package/dist/esm/memory-storage-F8xjMzVy.js +0 -2
- package/dist/esm/memory-storage-F8xjMzVy.js.map +0 -1
- package/dist/esm/readonly-token-D4GjTj0q.js +0 -2
- package/dist/esm/readonly-token-D4GjTj0q.js.map +0 -1
- package/dist/esm/relayer-C6u3eOlN.js.map +0 -1
- package/dist/esm/relayer-sdk-DPqytEbO.d.ts +0 -44
- package/dist/esm/relayer-utils-BeoTNDM4.js +0 -2
- package/dist/esm/relayer-utils-BeoTNDM4.js.map +0 -1
- package/dist/esm/wrappers-registry-ydyySM9g.js +0 -2
- package/dist/esm/wrappers-registry-ydyySM9g.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-storage-CFXqXUcm.js","names":["#map"],"sources":["../../src/storage/memory-storage.ts"],"sourcesContent":["import type { GenericStorage } from \"../types\";\n\n/** In-memory credential store. Credentials are lost on page reload. */\nexport class MemoryStorage implements GenericStorage {\n #map = new Map<string, unknown>();\n\n async get<T = unknown>(key: string): Promise<T | null> {\n return (this.#map.get(key) as T) ?? null;\n }\n\n async set<T = unknown>(key: string, value: T): Promise<void> {\n this.#map.set(key, value);\n }\n\n async delete(key: string): Promise<void> {\n this.#map.delete(key);\n }\n}\n\n/** Default singleton for application-wide use. */\nexport const memoryStorage = new MemoryStorage();\n"],"mappings":"AAGA,IAAa,EAAb,KAAqD,CACnD,GAAO,IAAI,IAEX,MAAM,IAAiB,EAAgC,CACrD,OAAQ,MAAA,EAAU,IAAI,EAAI,EAAU,KAGtC,MAAM,IAAiB,EAAa,EAAyB,CAC3D,MAAA,EAAU,IAAI,EAAK,EAAM,CAG3B,MAAM,OAAO,EAA4B,CACvC,MAAA,EAAU,OAAO,EAAI,GAKzB,MAAa,EAAgB,IAAI"}
|
package/dist/esm/node/index.d.ts
CHANGED
|
@@ -1,112 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as
|
|
3
|
-
import { n as
|
|
1
|
+
import { n as FheChain } from "../types-C1S426x4.js";
|
|
2
|
+
import { a as mainnet, i as hoodi, n as chains, o as sepolia, r as hardhat, t as anvil } from "../index-BTY0MxOt.js";
|
|
3
|
+
import { $ as DelegatedUserDecryptRequest, Ct as UserDecryptResponseData, Dt as WorkerResponse, Et as WorkerRequestType, G as BaseRequest, J as CreateDelegatedEIP712ResponseData, K as CreateDelegatedEIP712Payload, O as GenericStorage, Q as DelegatedUserDecryptPayload, St as UserDecryptRequest, Tt as WorkerRequest, X as CreateEIP712Request, Y as CreateEIP712Payload, Z as CreateEIP712ResponseData, _ as UserDecryptParams, _t as RequestZKProofVerificationRequest, a as EIP712TypedData, at as GenerateKeypairRequest, bt as UpdateCsrfRequest, c as EncryptResult, ct as GetPublicKeyRequest, d as PublicDecryptResult, dt as GetPublicParamsResponseData, et as DelegatedUserDecryptResponseData, f as PublicKeyData, ft as InitPayload, gt as PublicDecryptResponseData, ht as PublicDecryptRequest, i as DelegatedUserDecryptParams, it as ErrorResponse, l as Handle, lt as GetPublicKeyResponseData, mt as PublicDecryptPayload, n as RelayerSDK, nt as EncryptRequest, ot as GenerateKeypairResponseData, p as PublicParamsData, pt as InitRequest, q as CreateDelegatedEIP712Request, r as ClearValueType, rt as EncryptResponseData, s as EncryptParams, st as GenericLogger, tt as EncryptPayload, ut as GetPublicParamsRequest, vt as RequestZKProofVerificationResponseData, wt as WorkerEnv, xt as UserDecryptPayload, y as BaseWorkerClient, yt as SuccessResponse } from "../relayer-cleartext-DJkSUlZ2.js";
|
|
4
|
+
import { l as BaseRelayer, n as RelayerConfig } from "../types-FY7ciI37.js";
|
|
5
|
+
import { t as cleartext } from "../cleartext-BHu6-LCv.js";
|
|
4
6
|
import { Address, Hex } from "viem";
|
|
5
7
|
import { Worker } from "node:worker_threads";
|
|
6
|
-
import {
|
|
7
|
-
import { FhevmInstanceConfig as FhevmInstanceConfig$1, ZKProofLike as ZKProofLike$1 } from "@zama-fhe/relayer-sdk/bundle";
|
|
8
|
+
import { InputProofBytesType, KeypairType, KmsDelegatedUserDecryptEIP712Type, ZKProofLike } from "@zama-fhe/relayer-sdk/node";
|
|
8
9
|
|
|
9
|
-
//#region src/relayer/relayer-node.d.ts
|
|
10
|
-
interface RelayerNodeConfig {
|
|
11
|
-
transports: Record<number, Partial<FhevmInstanceConfig>>;
|
|
12
|
-
/** Resolve the current chain ID. Called lazily before each operation; the pool is re-initialized when the value changes. */
|
|
13
|
-
getChainId: () => Promise<number>;
|
|
14
|
-
poolSize?: number;
|
|
15
|
-
/** Optional logger for observing worker lifecycle and request timing. */
|
|
16
|
-
logger?: GenericLogger;
|
|
17
|
-
/**
|
|
18
|
-
* Persistent storage for caching FHE public key and params across sessions.
|
|
19
|
-
* Defaults to `new MemoryStorage()` (in-process, lost on restart).
|
|
20
|
-
* Pass a custom `GenericStorage` with redis for cross-restart persistence.
|
|
21
|
-
*/
|
|
22
|
-
fheArtifactStorage?: GenericStorage;
|
|
23
|
-
/** Cache TTL in seconds for FHE public material. Default: 86 400 (24 h). Set to 0 to revalidate on every operation. */
|
|
24
|
-
fheArtifactCacheTTL?: number;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* RelayerNode — Node.js encryption/decryption layer using a worker thread pool.
|
|
28
|
-
* Offloads CPU-intensive WASM/FHE operations to `node:worker_threads`.
|
|
29
|
-
*
|
|
30
|
-
* Uses the same promise lock pattern as {@link RelayerWeb}:
|
|
31
|
-
* `#ensureLock` serializes concurrent callers, `#initPromise` caches the
|
|
32
|
-
* resolved pool, and chain switches tear down the old pool within the lock.
|
|
33
|
-
* See the RelayerWeb class doc for a detailed explanation.
|
|
34
|
-
*/
|
|
35
|
-
declare class RelayerNode implements RelayerSDK, Disposable {
|
|
36
|
-
#private;
|
|
37
|
-
constructor(config: RelayerNodeConfig);
|
|
38
|
-
terminate(): void;
|
|
39
|
-
/** Calls {@link terminate}, shutting down the worker thread pool. */
|
|
40
|
-
[Symbol.dispose](): void;
|
|
41
|
-
generateKeypair(): Promise<KeypairType<Hex>>;
|
|
42
|
-
createEIP712(publicKey: Hex, contractAddresses: Address[], startTimestamp: number, durationDays?: number): Promise<EIP712TypedData>;
|
|
43
|
-
encrypt(params: EncryptParams): Promise<EncryptResult>;
|
|
44
|
-
userDecrypt(params: UserDecryptParams): Promise<Readonly<Record<Handle, ClearValueType>>>;
|
|
45
|
-
publicDecrypt(handles: Handle[]): Promise<PublicDecryptResult>;
|
|
46
|
-
createDelegatedUserDecryptEIP712(publicKey: Hex, contractAddresses: Address[], delegatorAddress: Address, startTimestamp: number, durationDays?: number): Promise<KmsDelegatedUserDecryptEIP712Type>;
|
|
47
|
-
delegatedUserDecrypt(params: DelegatedUserDecryptParams): Promise<Readonly<Record<Handle, ClearValueType>>>;
|
|
48
|
-
requestZKProofVerification(zkProof: ZKProofLike): Promise<InputProofBytesType>;
|
|
49
|
-
getPublicKey(): Promise<{
|
|
50
|
-
publicKeyId: string;
|
|
51
|
-
publicKey: Uint8Array;
|
|
52
|
-
} | null>;
|
|
53
|
-
getPublicParams(bits: number): Promise<{
|
|
54
|
-
publicParams: Uint8Array;
|
|
55
|
-
publicParamsId: string;
|
|
56
|
-
} | null>;
|
|
57
|
-
getAclAddress(): Promise<Address>;
|
|
58
|
-
}
|
|
59
|
-
//#endregion
|
|
60
|
-
//#region src/worker/worker.base-client.d.ts
|
|
61
|
-
/**
|
|
62
|
-
* Abstract base class for worker clients (browser Web Worker and Node.js worker_threads).
|
|
63
|
-
* Encapsulates all shared logic: pending request tracking, timeouts, init dedup, domain methods.
|
|
64
|
-
* Subclasses implement the abstract hooks for platform-specific worker creation and messaging.
|
|
65
|
-
*/
|
|
66
|
-
declare abstract class BaseWorkerClient<TWorker, TConfig> {
|
|
67
|
-
#private;
|
|
68
|
-
protected readonly config: TConfig;
|
|
69
|
-
protected readonly logger: GenericLogger | undefined;
|
|
70
|
-
constructor(config: TConfig, logger: GenericLogger | undefined);
|
|
71
|
-
/** Create the platform-specific worker instance. */
|
|
72
|
-
protected abstract createWorker(): TWorker;
|
|
73
|
-
/** Wire message/error/messageerror events on the worker. */
|
|
74
|
-
protected abstract wireEvents(worker: TWorker): void;
|
|
75
|
-
/** Post a message to the worker. */
|
|
76
|
-
protected abstract postMessage(worker: TWorker, request: WorkerRequest): void;
|
|
77
|
-
/** Terminate the platform-specific worker. */
|
|
78
|
-
protected abstract terminateWorker(worker: TWorker): void;
|
|
79
|
-
/** Generate a unique request ID. */
|
|
80
|
-
protected abstract generateRequestId(): string;
|
|
81
|
-
/** Return the init request type and payload. */
|
|
82
|
-
protected abstract getInitPayload(): {
|
|
83
|
-
type: WorkerRequestType;
|
|
84
|
-
payload: WorkerRequest["payload"];
|
|
85
|
-
};
|
|
86
|
-
/** Optional hook called after worker init succeeds (e.g. for node worker.unref()). */
|
|
87
|
-
protected onWorkerReady?(_worker: TWorker): void;
|
|
88
|
-
initWorker(): Promise<TWorker>;
|
|
89
|
-
terminate(): void;
|
|
90
|
-
protected handleResponse(response: WorkerResponse<unknown>): void;
|
|
91
|
-
protected handleWorkerError(message: string): void;
|
|
92
|
-
protected handleWorkerMessageError(): void;
|
|
93
|
-
protected sendRequestTo<T>(worker: TWorker, type: WorkerRequestType, payload: WorkerRequest["payload"], timeoutMs?: number): Promise<T>;
|
|
94
|
-
protected sendRequest<T>(type: WorkerRequestType, payload: WorkerRequest["payload"], timeoutMs?: number): Promise<T>;
|
|
95
|
-
generateKeypair(): Promise<GenerateKeypairResponseData>;
|
|
96
|
-
createEIP712(params: CreateEIP712Payload): Promise<CreateEIP712ResponseData>;
|
|
97
|
-
encrypt(params: EncryptPayload): Promise<EncryptResponseData>;
|
|
98
|
-
userDecrypt(params: UserDecryptPayload): Promise<UserDecryptResponseData>;
|
|
99
|
-
publicDecrypt(handles: Handle[]): Promise<PublicDecryptResponseData>;
|
|
100
|
-
createDelegatedUserDecryptEIP712(params: CreateDelegatedEIP712Payload): Promise<CreateDelegatedEIP712ResponseData>;
|
|
101
|
-
delegatedUserDecrypt(params: DelegatedUserDecryptPayload): Promise<DelegatedUserDecryptResponseData>;
|
|
102
|
-
requestZKProofVerification(zkProof: ZKProofLike$1): Promise<RequestZKProofVerificationResponseData>;
|
|
103
|
-
getPublicKey(): Promise<GetPublicKeyResponseData>;
|
|
104
|
-
getPublicParams(bits: number): Promise<GetPublicParamsResponseData>;
|
|
105
|
-
}
|
|
106
|
-
//#endregion
|
|
107
10
|
//#region src/worker/worker.node-client.d.ts
|
|
108
11
|
interface NodeWorkerClientConfig {
|
|
109
|
-
|
|
12
|
+
chains: FheChain[];
|
|
110
13
|
/** Optional logger for tracing worker request lifecycle. */
|
|
111
14
|
logger?: GenericLogger;
|
|
112
15
|
}
|
|
@@ -115,6 +18,7 @@ interface NodeWorkerClientConfig {
|
|
|
115
18
|
* Provides a promise-based API for FHE operations using node:worker_threads.
|
|
116
19
|
*/
|
|
117
20
|
declare class NodeWorkerClient extends BaseWorkerClient<Worker, NodeWorkerClientConfig> {
|
|
21
|
+
protected readonly env: WorkerEnv;
|
|
118
22
|
constructor(config: NodeWorkerClientConfig);
|
|
119
23
|
protected createWorker(): Worker;
|
|
120
24
|
protected wireEvents(worker: Worker): void;
|
|
@@ -164,18 +68,92 @@ declare class NodeWorkerPool {
|
|
|
164
68
|
get poolSize(): number;
|
|
165
69
|
initPool(): Promise<void>;
|
|
166
70
|
terminate(): void;
|
|
167
|
-
generateKeypair(): Promise<GenerateKeypairResponseData>;
|
|
71
|
+
generateKeypair(params: GenerateKeypairRequest["payload"]): Promise<GenerateKeypairResponseData>;
|
|
168
72
|
createEIP712(params: CreateEIP712Payload): Promise<CreateEIP712ResponseData>;
|
|
169
73
|
encrypt(params: EncryptPayload): Promise<EncryptResponseData>;
|
|
170
74
|
userDecrypt(params: UserDecryptPayload): Promise<UserDecryptResponseData>;
|
|
171
|
-
publicDecrypt(
|
|
75
|
+
publicDecrypt(params: PublicDecryptPayload): Promise<PublicDecryptResponseData>;
|
|
172
76
|
createDelegatedUserDecryptEIP712(params: CreateDelegatedEIP712Payload): Promise<CreateDelegatedEIP712ResponseData>;
|
|
173
77
|
delegatedUserDecrypt(params: DelegatedUserDecryptPayload): Promise<DelegatedUserDecryptResponseData>;
|
|
174
|
-
requestZKProofVerification(
|
|
175
|
-
getPublicKey(): Promise<GetPublicKeyResponseData>;
|
|
176
|
-
getPublicParams(
|
|
78
|
+
requestZKProofVerification(params: RequestZKProofVerificationRequest["payload"]): Promise<RequestZKProofVerificationResponseData>;
|
|
79
|
+
getPublicKey(params: GetPublicKeyRequest["payload"]): Promise<GetPublicKeyResponseData>;
|
|
80
|
+
getPublicParams(params: GetPublicParamsRequest["payload"]): Promise<GetPublicParamsResponseData>;
|
|
177
81
|
}
|
|
178
82
|
//#endregion
|
|
83
|
+
//#region src/relayer/relayer-node.d.ts
|
|
84
|
+
interface RelayerNodeConfig {
|
|
85
|
+
/** FHE chain configuration. */
|
|
86
|
+
chain: FheChain;
|
|
87
|
+
/** Worker thread pool — handles WASM operations off the main thread. */
|
|
88
|
+
pool: NodeWorkerPool;
|
|
89
|
+
/** Optional logger for observing worker lifecycle and request timing. */
|
|
90
|
+
logger?: GenericLogger;
|
|
91
|
+
/**
|
|
92
|
+
* Persistent storage for caching FHE public key and params across sessions.
|
|
93
|
+
* Defaults to `new MemoryStorage()` (in-process, lost on restart).
|
|
94
|
+
* Pass a custom `GenericStorage` with redis for cross-restart persistence.
|
|
95
|
+
*/
|
|
96
|
+
fheArtifactStorage?: GenericStorage;
|
|
97
|
+
/** Cache TTL in seconds for FHE public material. Default: 86 400 (24 h). Set to 0 to revalidate on every operation. */
|
|
98
|
+
fheArtifactCacheTTL?: number;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* RelayerNode — Node.js encryption/decryption layer.
|
|
102
|
+
* The pool is injected at construction time; the relayer does not own its lifecycle.
|
|
103
|
+
*/
|
|
104
|
+
declare class RelayerNode extends BaseRelayer implements RelayerSDK, Disposable {
|
|
105
|
+
#private;
|
|
106
|
+
constructor(config: RelayerNodeConfig);
|
|
107
|
+
protected get chain(): FheChain;
|
|
108
|
+
protected init(): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Terminate clears the artifact cache only.
|
|
111
|
+
* The pool is externally owned — the relayer does not terminate it.
|
|
112
|
+
*/
|
|
113
|
+
terminate(): void;
|
|
114
|
+
/** Calls {@link terminate}. */
|
|
115
|
+
[Symbol.dispose](): void;
|
|
116
|
+
generateKeypair(): Promise<KeypairType<Hex>>;
|
|
117
|
+
createEIP712(publicKey: Hex, contractAddresses: Address[], startTimestamp: number, durationDays?: number): Promise<EIP712TypedData>;
|
|
118
|
+
encrypt(params: EncryptParams): Promise<EncryptResult>;
|
|
119
|
+
userDecrypt(params: UserDecryptParams): Promise<Readonly<Record<Handle, ClearValueType>>>;
|
|
120
|
+
publicDecrypt(handles: Handle[]): Promise<PublicDecryptResult>;
|
|
121
|
+
createDelegatedUserDecryptEIP712(publicKey: Hex, contractAddresses: Address[], delegatorAddress: Address, startTimestamp: number, durationDays?: number): Promise<KmsDelegatedUserDecryptEIP712Type>;
|
|
122
|
+
delegatedUserDecrypt(params: DelegatedUserDecryptParams): Promise<Readonly<Record<Handle, ClearValueType>>>;
|
|
123
|
+
requestZKProofVerification(zkProof: ZKProofLike): Promise<InputProofBytesType>;
|
|
124
|
+
getPublicKey(): Promise<PublicKeyData | null>;
|
|
125
|
+
getPublicParams(bits: number): Promise<PublicParamsData | null>;
|
|
126
|
+
}
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region src/node/config.d.ts
|
|
129
|
+
/** Pool options for the `node()` transport factory. */
|
|
130
|
+
interface NodePoolOptions {
|
|
131
|
+
poolSize?: number;
|
|
132
|
+
logger?: GenericLogger;
|
|
133
|
+
fheArtifactStorage?: GenericStorage;
|
|
134
|
+
fheArtifactCacheTTL?: number;
|
|
135
|
+
}
|
|
136
|
+
/** Node transport — narrows worker type to `NodeWorkerPool`. */
|
|
137
|
+
interface NodeRelayerConfig extends RelayerConfig {
|
|
138
|
+
readonly type: "node";
|
|
139
|
+
readonly createWorker: (chains: FheChain[]) => NodeWorkerPool;
|
|
140
|
+
readonly createRelayer: (chain: FheChain, worker: NodeWorkerPool) => RelayerNode;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Node.js transport — routes to RelayerNode (worker thread pool).
|
|
144
|
+
*
|
|
145
|
+
* @param options - Pool options (poolSize, logger, fheArtifactStorage, fheArtifactCacheTTL).
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```ts
|
|
149
|
+
* relayers: {
|
|
150
|
+
* [sepolia.id]: node(),
|
|
151
|
+
* [mainnet.id]: node({ poolSize: 4 }),
|
|
152
|
+
* }
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
declare function node(options?: NodePoolOptions): NodeRelayerConfig;
|
|
156
|
+
//#endregion
|
|
179
157
|
//#region src/storage/async-local-storage.d.ts
|
|
180
158
|
/**
|
|
181
159
|
* {@link GenericStorage} backed by Node.js {@link AsyncLocalStorage}.
|
|
@@ -207,5 +185,5 @@ declare class AsyncLocalMapStorage implements GenericStorage {
|
|
|
207
185
|
/** Default singleton for application-wide use. */
|
|
208
186
|
declare const asyncLocalStorage: AsyncLocalMapStorage;
|
|
209
187
|
//#endregion
|
|
210
|
-
export { AsyncLocalMapStorage, type BaseRequest, BaseWorkerClient, type ClearValueType, type CreateDelegatedEIP712Payload, type CreateDelegatedEIP712Request, type CreateDelegatedEIP712ResponseData, type CreateEIP712Payload, type CreateEIP712Request, type CreateEIP712ResponseData, type DelegatedUserDecryptParams, type DelegatedUserDecryptPayload, type DelegatedUserDecryptRequest, type DelegatedUserDecryptResponseData, type EIP712TypedData, type EncryptParams, type EncryptPayload, type EncryptRequest, type EncryptResponseData, type EncryptResult, type ErrorResponse, type GenerateKeypairRequest, type GenerateKeypairResponseData, type GenericLogger, type GetPublicKeyRequest, type GetPublicKeyResponseData, type GetPublicParamsRequest, type GetPublicParamsResponseData,
|
|
188
|
+
export { AsyncLocalMapStorage, type BaseRequest, BaseWorkerClient, type ClearValueType, type CreateDelegatedEIP712Payload, type CreateDelegatedEIP712Request, type CreateDelegatedEIP712ResponseData, type CreateEIP712Payload, type CreateEIP712Request, type CreateEIP712ResponseData, type DelegatedUserDecryptParams, type DelegatedUserDecryptPayload, type DelegatedUserDecryptRequest, type DelegatedUserDecryptResponseData, type EIP712TypedData, type EncryptParams, type EncryptPayload, type EncryptRequest, type EncryptResponseData, type EncryptResult, type ErrorResponse, type GenerateKeypairRequest, type GenerateKeypairResponseData, type GenericLogger, type GetPublicKeyRequest, type GetPublicKeyResponseData, type GetPublicParamsRequest, type GetPublicParamsResponseData, type InitPayload, type InitRequest, type NodePoolOptions, type NodeRelayerConfig, NodeWorkerClient, type NodeWorkerClientConfig, NodeWorkerPool, type NodeWorkerPoolConfig, type PublicDecryptRequest, type PublicDecryptResponseData, type PublicDecryptResult, type RelayerConfig, RelayerNode, type RelayerNodeConfig, type RelayerSDK, type RequestZKProofVerificationRequest, type RequestZKProofVerificationResponseData, type SuccessResponse, type UpdateCsrfRequest, type UserDecryptParams, type UserDecryptPayload, type UserDecryptRequest, type UserDecryptResponseData, type WorkerEnv, type WorkerRequest, type WorkerRequestType, type WorkerResponse, anvil, asyncLocalStorage, chains, cleartext, hardhat, hoodi, mainnet, node, sepolia };
|
|
211
189
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/node/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{a as e,i as t,n,r,t as i}from"../cleartext-I-etE_7S.js";import{r as a}from"../assertions-CfqI3AJv.js";import{t as o}from"../memory-storage-CFXqXUcm.js";import{a as s,i as c,n as l,o as u,r as d,t as f}from"../chains-aHmrozPh.js";import{availableParallelism as p}from"node:os";import{Worker as m}from"node:worker_threads";import{randomUUID as h}from"node:crypto";import{AsyncLocalStorage as g}from"node:async_hooks";var _=class extends e{#e;#t=null;constructor(e){super(),this.#e={fheArtifactStorage:new o,...e}}get chain(){return this.#e.chain}async init(){await this.#n.initPool()}get#n(){return this.#e.pool}#r(){return this.#e.fheArtifactStorage?(this.#t||=new t({storage:this.#e.fheArtifactStorage,chainId:this.chain.id,relayerUrl:this.chain.relayerUrl,ttl:this.#e.fheArtifactCacheTTL,logger:this.#e.logger}),this.#t):null}terminate(){this.#t=null,this.resetInit()}[Symbol.dispose](){this.terminate()}async generateKeypair(){await this.ensureInit();let e=this.chain.id,t=await this.#n.generateKeypair({chainId:e});return{publicKey:t.publicKey,privateKey:t.privateKey}}async createEIP712(e,t,n,r=7){await this.ensureInit();let i=this.chain.id;return this.#n.createEIP712({chainId:i,publicKey:e,contractAddresses:t,startTimestamp:n,durationDays:r})}async encrypt(e){await this.ensureInit();let t=this.chain.id;return r(async()=>{let n=await this.#n.encrypt({chainId:t,...e});return{handles:n.handles,inputProof:n.inputProof}})}async userDecrypt(e){await this.ensureInit();let t=this.chain.id;return r(async()=>(await this.#n.userDecrypt({chainId:t,...e})).clearValues)}async publicDecrypt(e){await this.ensureInit();let t=this.chain.id;return r(async()=>{let n=await this.#n.publicDecrypt({chainId:t,handles:e});return{clearValues:n.clearValues,abiEncodedClearValues:n.abiEncodedClearValues,decryptionProof:n.decryptionProof}})}async createDelegatedUserDecryptEIP712(e,t,n,r,i=7){await this.ensureInit();let a=this.chain.id;return this.#n.createDelegatedUserDecryptEIP712({chainId:a,publicKey:e,contractAddresses:t,delegatorAddress:n,startTimestamp:r,durationDays:i})}async delegatedUserDecrypt(e){await this.ensureInit();let t=this.chain.id;return r(async()=>(await this.#n.delegatedUserDecrypt({chainId:t,...e})).clearValues)}async requestZKProofVerification(e){await this.ensureInit();let t=this.chain.id;return r(async()=>this.#n.requestZKProofVerification({chainId:t,zkProof:e}))}async getPublicKey(){await this.ensureInit();let e=this.chain.id,t=this.#r();return t?t.getPublicKey(async()=>(await this.#n.getPublicKey({chainId:e})).result):(await this.#n.getPublicKey({chainId:e})).result}async getPublicParams(e){await this.ensureInit();let t=this.chain.id,n=this.#r();return n?n.getPublicParams(e,async()=>(await this.#n.getPublicParams({chainId:t,bits:e})).result):(await this.#n.getPublicParams({chainId:t,bits:e})).result}},v=class extends n{env=`node`;constructor(e){super(e,e.logger)}createWorker(){let e=new URL(import.meta.resolve(`@zama-fhe/sdk/node`));return new m(new URL(`relayer-sdk.node-worker.js`,e))}wireEvents(e){e.on(`message`,e=>this.handleResponse(e)),e.on(`error`,e=>this.handleWorkerError(e.message)),e.on(`messageerror`,()=>this.handleWorkerMessageError())}postMessage(e,t){e.postMessage(t)}terminateWorker(e){e.terminate()}generateRequestId(){return h()}getInitPayload(){return{type:`INIT`,payload:{env:`node`,chains:this.config.chains}}}onWorkerReady(e){e.unref()}},y=class{#e=[];#t=[];#n;#r;#i=null;constructor(e){this.#n=e,this.#r=e.poolSize??Math.min(p(),4)}get poolSize(){return this.#r}async initPool(){if(!(this.#e.length>0))return this.#i||=this.#a().finally(()=>{this.#i=null}),this.#i}async#a(){for(let e=0;e<this.#r;e++)this.#e.push(new v(this.#n)),this.#t.push(0);try{await Promise.all(this.#e.map(e=>e.initWorker()))}catch(e){for(let e of this.#e)e.terminate();throw this.#e.length=0,this.#t.length=0,e}}terminate(){let e=[];for(let t of this.#e)try{t.terminate()}catch(t){e.push(t instanceof Error?t:Error(String(t)))}if(this.#e.length=0,this.#t.length=0,e.length>0)throw AggregateError(e,`Failed to terminate worker pool`)}#o(){let e=0,t=this.#t[0];for(let n=1;n<this.#t.length;n++)this.#t[n]<t&&(t=this.#t[n],e=n);return e}async#s(e){if(this.#e.length===0)throw Error(`NodeWorkerPool not initialized. Call initPool() first.`);let t=this.#o();this.#t[t]++;try{return await e(this.#e[t])}finally{this.#t[t]--}}async generateKeypair(e){return this.#s(t=>t.generateKeypair(e))}async createEIP712(e){return this.#s(t=>t.createEIP712(e))}async encrypt(e){return this.#s(t=>t.encrypt(e))}async userDecrypt(e){return this.#s(t=>t.userDecrypt(e))}async publicDecrypt(e){return this.#s(t=>t.publicDecrypt(e))}async createDelegatedUserDecryptEIP712(e){return this.#s(t=>t.createDelegatedUserDecryptEIP712(e))}async delegatedUserDecrypt(e){return this.#s(t=>t.delegatedUserDecrypt(e))}async requestZKProofVerification(e){return this.#s(t=>t.requestZKProofVerification(e))}async getPublicKey(e){return this.#s(t=>t.getPublicKey(e))}async getPublicParams(e){return this.#s(t=>t.getPublicParams(e))}};function b(e){return{type:`node`,createWorker:t=>new y({chains:t,...e}),createRelayer:(t,n)=>(a(!!n,`node() relayer requires a worker pool — createWorker must be called first.`),new _({chain:t,pool:n,...e}))}}var x=class{#e=new g;run(e){return this.#e.run(new Map,e)}async get(e){return this.#e.getStore()?.get(e)??null}async set(e,t){this.#e.getStore()?.set(e,t)}async delete(e){this.#e.getStore()?.delete(e)}};const S=new x;export{x as AsyncLocalMapStorage,n as BaseWorkerClient,v as NodeWorkerClient,y as NodeWorkerPool,_ as RelayerNode,f as anvil,S as asyncLocalStorage,l as chains,i as cleartext,d as hardhat,c as hoodi,s as mainnet,b as node,u as sepolia};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#workers","#activeCount","#config","#poolSize","#initPromise","#doInitPool","#dispatch","#leastBusyIndex","#config","#getPoolConfig","#ensurePool","#ensureLock","#ensurePoolInner","#pool","#initPromise","#artifactCache","#terminated","#resolvedChainId","#tearDown","#initPool","#als"],"sources":["../../../src/worker/worker.node-client.ts","../../../src/worker/worker.node-pool.ts","../../../src/relayer/relayer-node.ts","../../../src/storage/async-local-storage.ts"],"sourcesContent":["import { Worker } from \"node:worker_threads\";\nimport { randomUUID } from \"node:crypto\";\nimport type { FhevmInstanceConfig } from \"@zama-fhe/relayer-sdk/bundle\";\nimport type {\n GenericLogger,\n WorkerRequest,\n WorkerRequestType,\n WorkerResponse,\n} from \"./worker.types\";\nimport { BaseWorkerClient } from \"./worker.base-client\";\n\nexport interface NodeWorkerClientConfig {\n fhevmConfig: FhevmInstanceConfig;\n /** Optional logger for tracing worker request lifecycle. */\n logger?: GenericLogger;\n}\n\n/**\n * Client for communicating with the RelayerSDK Node.js worker thread.\n * Provides a promise-based API for FHE operations using node:worker_threads.\n */\nexport class NodeWorkerClient extends BaseWorkerClient<Worker, NodeWorkerClientConfig> {\n constructor(config: NodeWorkerClientConfig) {\n super(config, config.logger);\n }\n\n protected createWorker(): Worker {\n return new Worker(new URL(\"relayer-sdk.node-worker.js\", import.meta.url));\n }\n\n protected wireEvents(worker: Worker): void {\n worker.on(\"message\", (response: WorkerResponse<unknown>) => this.handleResponse(response));\n worker.on(\"error\", (error: Error) => this.handleWorkerError(error.message));\n worker.on(\"messageerror\", () => this.handleWorkerMessageError());\n }\n\n protected postMessage(worker: Worker, request: WorkerRequest): void {\n worker.postMessage(request);\n }\n\n protected terminateWorker(worker: Worker): void {\n void worker.terminate();\n }\n\n protected generateRequestId(): string {\n return randomUUID();\n }\n\n protected getInitPayload(): {\n type: WorkerRequestType;\n payload: WorkerRequest[\"payload\"];\n } {\n return {\n type: \"NODE_INIT\",\n payload: { fhevmConfig: this.config.fhevmConfig },\n };\n }\n\n protected override onWorkerReady(worker: Worker): void {\n worker.unref();\n }\n}\n","import { availableParallelism } from \"node:os\";\nimport { NodeWorkerClient } from \"./worker.node-client\";\nimport type { NodeWorkerClientConfig } from \"./worker.node-client\";\nimport type { Handle } from \"../relayer/relayer-sdk.types\";\nimport type { ZKProofLike } from \"@zama-fhe/relayer-sdk/bundle\";\nimport type {\n CreateDelegatedEIP712Payload,\n CreateDelegatedEIP712ResponseData,\n CreateEIP712Payload,\n CreateEIP712ResponseData,\n DelegatedUserDecryptPayload,\n DelegatedUserDecryptResponseData,\n EncryptPayload,\n EncryptResponseData,\n GenerateKeypairResponseData,\n GetPublicKeyResponseData,\n GetPublicParamsResponseData,\n PublicDecryptResponseData,\n RequestZKProofVerificationResponseData,\n UserDecryptPayload,\n UserDecryptResponseData,\n} from \"./worker.types\";\n\nexport interface NodeWorkerPoolConfig extends NodeWorkerClientConfig {\n poolSize?: number;\n}\n\nconst MAX_DEFAULT_POOL_SIZE = 4;\n\n/**\n * Pool of Node.js worker threads for parallel FHE operations.\n *\n * **Default pool size:** `min(os.availableParallelism(), 4)`. Each worker loads\n * the full WASM module (~50–100 MB), so size the pool based on available memory.\n *\n * **Scheduling:** Least-connections — each request is dispatched to the worker\n * with the fewest in-flight operations.\n *\n * **When to override pool size:**\n * - High-throughput batch processing (e.g. bulk encryptions): increase to match CPU cores.\n * - Memory-constrained environments: decrease to 1–2 workers.\n *\n * **Lifecycle:**\n * 1. Construct with config: `new NodeWorkerPool({ fhevmConfig })`\n * 2. Initialize all workers: `await pool.initPool()`\n * 3. Use: `await pool.encrypt(...)`, `await pool.userDecrypt(...)`, etc.\n * 4. Shut down: `pool.terminate()`\n *\n * `initPool()` is idempotent — concurrent calls share the same initialization promise.\n * If any worker fails to initialize, all workers are terminated and the error is propagated.\n */\nexport class NodeWorkerPool {\n readonly #workers: NodeWorkerClient[] = [];\n readonly #activeCount: number[] = [];\n readonly #config: NodeWorkerPoolConfig;\n readonly #poolSize: number;\n #initPromise: Promise<void> | null = null;\n\n /**\n * @param config - Pool configuration. Set `poolSize` to override the default\n * (`min(os.availableParallelism(), 4)`).\n */\n constructor(config: NodeWorkerPoolConfig) {\n this.#config = config;\n this.#poolSize = config.poolSize ?? Math.min(availableParallelism(), MAX_DEFAULT_POOL_SIZE);\n }\n\n get poolSize(): number {\n return this.#poolSize;\n }\n\n async initPool(): Promise<void> {\n if (this.#workers.length > 0) {\n return;\n }\n if (!this.#initPromise) {\n this.#initPromise = this.#doInitPool().finally(() => {\n this.#initPromise = null;\n });\n }\n return this.#initPromise;\n }\n\n async #doInitPool(): Promise<void> {\n for (let i = 0; i < this.#poolSize; i++) {\n this.#workers.push(new NodeWorkerClient(this.#config));\n this.#activeCount.push(0);\n }\n try {\n await Promise.all(this.#workers.map((w) => w.initWorker()));\n } catch (error) {\n // Terminate any workers that did initialize and reset state\n for (const worker of this.#workers) {\n worker.terminate();\n }\n this.#workers.length = 0;\n this.#activeCount.length = 0;\n throw error;\n }\n }\n\n terminate(): void {\n for (const worker of this.#workers) {\n worker.terminate();\n }\n this.#workers.length = 0;\n this.#activeCount.length = 0;\n }\n\n /**\n * Pick the worker with the fewest in-flight requests (least-connections).\n * Returns the index so #dispatch can track the active count.\n */\n #leastBusyIndex(): number {\n let minIndex = 0;\n let minCount = this.#activeCount[0]!;\n for (let i = 1; i < this.#activeCount.length; i++) {\n if (this.#activeCount[i]! < minCount) {\n minCount = this.#activeCount[i]!;\n minIndex = i;\n }\n }\n return minIndex;\n }\n\n async #dispatch<T>(fn: (worker: NodeWorkerClient) => Promise<T>): Promise<T> {\n if (this.#workers.length === 0) {\n throw new Error(\"NodeWorkerPool not initialized. Call initPool() first.\");\n }\n const index = this.#leastBusyIndex();\n this.#activeCount[index]!++;\n try {\n return await fn(this.#workers[index]!);\n } finally {\n this.#activeCount[index]!--;\n }\n }\n\n async generateKeypair(): Promise<GenerateKeypairResponseData> {\n return this.#dispatch((w) => w.generateKeypair());\n }\n\n async createEIP712(params: CreateEIP712Payload): Promise<CreateEIP712ResponseData> {\n return this.#dispatch((w) => w.createEIP712(params));\n }\n\n async encrypt(params: EncryptPayload): Promise<EncryptResponseData> {\n return this.#dispatch((w) => w.encrypt(params));\n }\n\n async userDecrypt(params: UserDecryptPayload): Promise<UserDecryptResponseData> {\n return this.#dispatch((w) => w.userDecrypt(params));\n }\n\n async publicDecrypt(handles: Handle[]): Promise<PublicDecryptResponseData> {\n return this.#dispatch((w) => w.publicDecrypt(handles));\n }\n\n async createDelegatedUserDecryptEIP712(\n params: CreateDelegatedEIP712Payload,\n ): Promise<CreateDelegatedEIP712ResponseData> {\n return this.#dispatch((w) => w.createDelegatedUserDecryptEIP712(params));\n }\n\n async delegatedUserDecrypt(\n params: DelegatedUserDecryptPayload,\n ): Promise<DelegatedUserDecryptResponseData> {\n return this.#dispatch((w) => w.delegatedUserDecrypt(params));\n }\n\n async requestZKProofVerification(\n zkProof: ZKProofLike,\n ): Promise<RequestZKProofVerificationResponseData> {\n return this.#dispatch((w) => w.requestZKProofVerification(zkProof));\n }\n\n async getPublicKey(): Promise<GetPublicKeyResponseData> {\n return this.#dispatch((w) => w.getPublicKey());\n }\n\n async getPublicParams(bits: number): Promise<GetPublicParamsResponseData> {\n return this.#dispatch((w) => w.getPublicParams(bits));\n }\n}\n","import type {\n FhevmInstanceConfig,\n InputProofBytesType,\n KeypairType,\n KmsDelegatedUserDecryptEIP712Type,\n ZKProofLike,\n} from \"@zama-fhe/relayer-sdk/node\";\nimport type { Address, Hex } from \"viem\";\nimport { ConfigurationError, ZamaError } from \"../errors\";\nimport { MemoryStorage } from \"../storage/memory-storage\";\nimport type { GenericStorage } from \"../types\";\nimport { NodeWorkerPool, type NodeWorkerPoolConfig } from \"../worker/worker.node-pool\";\nimport type { GenericLogger } from \"../worker/worker.types\";\nimport { FheArtifactCache } from \"./fhe-artifact-cache\";\nimport type { RelayerSDK } from \"./relayer-sdk\";\nimport type {\n ClearValueType,\n DelegatedUserDecryptParams,\n EIP712TypedData,\n EncryptParams,\n EncryptResult,\n Handle,\n PublicDecryptResult,\n UserDecryptParams,\n} from \"./relayer-sdk.types\";\nimport { buildEIP712DomainType, DefaultConfigs, withRetry } from \"./relayer-utils\";\n\nexport interface RelayerNodeConfig {\n transports: Record<number, Partial<FhevmInstanceConfig>>;\n /** Resolve the current chain ID. Called lazily before each operation; the pool is re-initialized when the value changes. */\n getChainId: () => Promise<number>;\n poolSize?: number;\n /** Optional logger for observing worker lifecycle and request timing. */\n logger?: GenericLogger;\n /**\n * Persistent storage for caching FHE public key and params across sessions.\n * Defaults to `new MemoryStorage()` (in-process, lost on restart).\n * Pass a custom `GenericStorage` with redis for cross-restart persistence.\n */\n fheArtifactStorage?: GenericStorage;\n /** Cache TTL in seconds for FHE public material. Default: 86 400 (24 h). Set to 0 to revalidate on every operation. */\n fheArtifactCacheTTL?: number;\n}\n\n/**\n * RelayerNode — Node.js encryption/decryption layer using a worker thread pool.\n * Offloads CPU-intensive WASM/FHE operations to `node:worker_threads`.\n *\n * Uses the same promise lock pattern as {@link RelayerWeb}:\n * `#ensureLock` serializes concurrent callers, `#initPromise` caches the\n * resolved pool, and chain switches tear down the old pool within the lock.\n * See the RelayerWeb class doc for a detailed explanation.\n */\nexport class RelayerNode implements RelayerSDK, Disposable {\n readonly #config: RelayerNodeConfig;\n #pool: NodeWorkerPool | null = null;\n #initPromise: Promise<NodeWorkerPool> | null = null;\n #ensureLock: Promise<NodeWorkerPool> | null = null;\n #terminated = false;\n #resolvedChainId: number | null = null;\n #artifactCache: FheArtifactCache | null = null;\n\n constructor(config: RelayerNodeConfig) {\n this.#config = { fheArtifactStorage: new MemoryStorage(), ...config };\n }\n\n async #getPoolConfig(): Promise<NodeWorkerPoolConfig> {\n const chainId = await this.#config.getChainId();\n const { transports, poolSize } = this.#config;\n\n return {\n fhevmConfig: Object.assign({}, DefaultConfigs[chainId], transports[chainId]),\n poolSize,\n logger: this.#config.logger,\n };\n }\n\n async #ensurePool(): Promise<NodeWorkerPool> {\n if (this.#ensureLock) {\n return this.#ensureLock;\n }\n this.#ensureLock = this.#ensurePoolInner();\n try {\n return await this.#ensureLock;\n } finally {\n this.#ensureLock = null;\n }\n }\n\n #tearDown(): void {\n this.#pool?.terminate();\n this.#pool = null;\n this.#initPromise = null;\n this.#artifactCache = null;\n }\n\n async #ensurePoolInner(): Promise<NodeWorkerPool> {\n if (this.#terminated) {\n throw new ConfigurationError(\"RelayerNode has been terminated\");\n }\n\n const chainId = await this.#config.getChainId();\n\n // Chain changed → tear down old pool, re-init\n if (this.#resolvedChainId !== null && chainId !== this.#resolvedChainId) {\n this.#tearDown();\n }\n\n this.#resolvedChainId = chainId;\n\n // Create cache for current chain (when storage is provided)\n if (!this.#artifactCache && this.#config.fheArtifactStorage) {\n const config = Object.assign({}, DefaultConfigs[chainId], this.#config.transports[chainId]);\n this.#artifactCache = new FheArtifactCache({\n storage: this.#config.fheArtifactStorage,\n chainId,\n relayerUrl: config.relayerUrl,\n ttl: this.#config.fheArtifactCacheTTL,\n logger: this.#config.logger,\n });\n }\n\n // Revalidate cached artifacts if due — never let revalidation block init\n if (this.#artifactCache) {\n let stale = false;\n try {\n stale = await this.#artifactCache.revalidateIfDue();\n } catch (err) {\n this.#config.logger?.warn(\n \"Artifact revalidation failed, proceeding with potentially stale cache\",\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n if (stale) {\n this.#config.logger?.info(\"Cached FHE artifacts are stale — reinitializing\");\n this.#tearDown();\n }\n }\n\n if (!this.#initPromise) {\n this.#initPromise = this.#initPool().catch((error) => {\n this.#initPromise = null;\n throw error instanceof ZamaError\n ? error\n : new ConfigurationError(\"Failed to initialize FHE worker pool\", {\n cause: error,\n });\n });\n }\n return this.#initPromise;\n }\n\n async #initPool(): Promise<NodeWorkerPool> {\n const poolConfig = await this.#getPoolConfig();\n const pool = new NodeWorkerPool(poolConfig);\n await pool.initPool();\n if (this.#terminated) {\n pool.terminate();\n throw new Error(\"RelayerNode was terminated during initialization\");\n }\n this.#pool = pool;\n return pool;\n }\n\n terminate(): void {\n this.#terminated = true;\n if (this.#pool) {\n this.#pool.terminate();\n this.#pool = null;\n }\n this.#initPromise = null;\n this.#ensureLock = null;\n }\n\n /** Calls {@link terminate}, shutting down the worker thread pool. */\n [Symbol.dispose](): void {\n this.terminate();\n }\n\n async generateKeypair(): Promise<KeypairType<Hex>> {\n const pool = await this.#ensurePool();\n const result = await pool.generateKeypair();\n return {\n publicKey: result.publicKey,\n privateKey: result.privateKey,\n };\n }\n\n async createEIP712(\n publicKey: Hex,\n contractAddresses: Address[],\n startTimestamp: number,\n durationDays = 7,\n ): Promise<EIP712TypedData> {\n const pool = await this.#ensurePool();\n const result = await pool.createEIP712({\n publicKey,\n contractAddresses,\n startTimestamp,\n durationDays,\n });\n\n const domain = {\n name: result.domain.name,\n version: result.domain.version,\n chainId: result.domain.chainId,\n verifyingContract: result.domain.verifyingContract,\n };\n\n return {\n domain,\n types: {\n EIP712Domain: buildEIP712DomainType(domain),\n UserDecryptRequestVerification: result.types.UserDecryptRequestVerification,\n },\n message: {\n publicKey: result.message.publicKey,\n contractAddresses: result.message.contractAddresses,\n startTimestamp: result.message.startTimestamp,\n durationDays: result.message.durationDays,\n extraData: result.message.extraData,\n },\n };\n }\n\n async encrypt(params: EncryptParams): Promise<EncryptResult> {\n return withRetry(async () => {\n const pool = await this.#ensurePool();\n const result = await pool.encrypt(params);\n return { handles: result.handles, inputProof: result.inputProof };\n });\n }\n\n async userDecrypt(params: UserDecryptParams): Promise<Readonly<Record<Handle, ClearValueType>>> {\n return withRetry(async () => {\n const pool = await this.#ensurePool();\n const result = await pool.userDecrypt(params);\n return result.clearValues;\n });\n }\n\n async publicDecrypt(handles: Handle[]): Promise<PublicDecryptResult> {\n return withRetry(async () => {\n const pool = await this.#ensurePool();\n const result = await pool.publicDecrypt(handles);\n return {\n clearValues: result.clearValues,\n abiEncodedClearValues: result.abiEncodedClearValues,\n decryptionProof: result.decryptionProof,\n };\n });\n }\n\n async createDelegatedUserDecryptEIP712(\n publicKey: Hex,\n contractAddresses: Address[],\n delegatorAddress: Address,\n startTimestamp: number,\n durationDays = 7,\n ): Promise<KmsDelegatedUserDecryptEIP712Type> {\n const pool = await this.#ensurePool();\n return pool.createDelegatedUserDecryptEIP712({\n publicKey,\n contractAddresses,\n delegatorAddress,\n startTimestamp,\n durationDays,\n });\n }\n\n async delegatedUserDecrypt(\n params: DelegatedUserDecryptParams,\n ): Promise<Readonly<Record<Handle, ClearValueType>>> {\n return withRetry(async () => {\n const pool = await this.#ensurePool();\n const result = await pool.delegatedUserDecrypt(params);\n return result.clearValues;\n });\n }\n\n async requestZKProofVerification(zkProof: ZKProofLike): Promise<InputProofBytesType> {\n return withRetry(async () => {\n const pool = await this.#ensurePool();\n return pool.requestZKProofVerification(zkProof);\n });\n }\n\n async getPublicKey(): Promise<{\n publicKeyId: string;\n publicKey: Uint8Array;\n } | null> {\n const pool = await this.#ensurePool();\n if (this.#artifactCache) {\n return this.#artifactCache.getPublicKey(async () => (await pool.getPublicKey()).result);\n }\n return (await pool.getPublicKey()).result;\n }\n\n async getPublicParams(\n bits: number,\n ): Promise<{ publicParams: Uint8Array; publicParamsId: string } | null> {\n const pool = await this.#ensurePool();\n if (this.#artifactCache) {\n return this.#artifactCache.getPublicParams(\n bits,\n async () => (await pool.getPublicParams(bits)).result,\n );\n }\n return (await pool.getPublicParams(bits)).result;\n }\n\n async getAclAddress(): Promise<Address> {\n const chainId = await this.#config.getChainId();\n const config = Object.assign({}, DefaultConfigs[chainId], this.#config.transports[chainId]);\n if (!config.aclContractAddress) {\n throw new ConfigurationError(`No ACL address configured for chain ${chainId}`);\n }\n return config.aclContractAddress as Address;\n }\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { GenericStorage } from \"../types\";\n\n/**\n * {@link GenericStorage} backed by Node.js {@link AsyncLocalStorage}.\n *\n * Each async context (e.g. HTTP request) gets its own isolated `Map`,\n * so credentials from one request never leak into another.\n *\n * Call {@link run} to establish a context before using the SDK:\n *\n * ```ts\n * import { asyncLocalStorage } from \"@zama-fhe/sdk/node\";\n *\n * app.post(\"/api/transfer\", (req, res) => {\n * asyncLocalStorage.run(async () => {\n * const sdk = new ZamaSDK({ relayer, signer, storage: asyncLocalStorage });\n * // credentials are scoped to this request\n * });\n * });\n * ```\n */\nexport class AsyncLocalMapStorage implements GenericStorage {\n readonly #als = new AsyncLocalStorage<Map<string, unknown>>();\n\n /** Execute `fn` within an isolated storage context. */\n run<R>(fn: () => R | Promise<R>): R | Promise<R> {\n return this.#als.run(new Map(), fn);\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n return (this.#als.getStore()?.get(key) as T) ?? null;\n }\n\n async set<T = unknown>(key: string, value: T): Promise<void> {\n this.#als.getStore()?.set(key, value);\n }\n\n async delete(key: string): Promise<void> {\n this.#als.getStore()?.delete(key);\n }\n}\n\n/** Default singleton for application-wide use. */\nexport const asyncLocalStorage = new AsyncLocalMapStorage();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["#config","#pool","#artifactCache","#getArtifactCache","#workers","#activeCount","#config","#poolSize","#initPromise","#doInitPool","#dispatch","#leastBusyIndex","#als"],"sources":["../../../src/relayer/relayer-node.ts","../../../src/worker/worker.node-client.ts","../../../src/worker/worker.node-pool.ts","../../../src/node/config.ts","../../../src/storage/async-local-storage.ts"],"sourcesContent":["import type {\n InputProofBytesType,\n KeypairType,\n KmsDelegatedUserDecryptEIP712Type,\n ZKProofLike,\n} from \"@zama-fhe/relayer-sdk/node\";\nimport type { Address, Hex } from \"viem\";\nimport { MemoryStorage } from \"../storage/memory-storage\";\nimport type { GenericStorage } from \"../types\";\nimport type { NodeWorkerPool } from \"../worker/worker.node-pool\";\nimport type { GenericLogger } from \"../worker/worker.types\";\nimport type { FheChain } from \"../chains/types\";\nimport { BaseRelayer } from \"./base-relayer\";\nimport { FheArtifactCache } from \"./fhe-artifact-cache\";\nimport type { RelayerSDK } from \"./relayer-sdk\";\nimport type {\n ClearValueType,\n DelegatedUserDecryptParams,\n EIP712TypedData,\n EncryptParams,\n EncryptResult,\n Handle,\n PublicDecryptResult,\n PublicKeyData,\n PublicParamsData,\n UserDecryptParams,\n} from \"./relayer-sdk.types\";\nimport { withRetry } from \"./relayer-utils\";\n\nexport interface RelayerNodeConfig {\n /** FHE chain configuration. */\n chain: FheChain;\n /** Worker thread pool — handles WASM operations off the main thread. */\n pool: NodeWorkerPool;\n /** Optional logger for observing worker lifecycle and request timing. */\n logger?: GenericLogger;\n /**\n * Persistent storage for caching FHE public key and params across sessions.\n * Defaults to `new MemoryStorage()` (in-process, lost on restart).\n * Pass a custom `GenericStorage` with redis for cross-restart persistence.\n */\n fheArtifactStorage?: GenericStorage;\n /** Cache TTL in seconds for FHE public material. Default: 86 400 (24 h). Set to 0 to revalidate on every operation. */\n fheArtifactCacheTTL?: number;\n}\n\n/**\n * RelayerNode — Node.js encryption/decryption layer.\n * The pool is injected at construction time; the relayer does not own its lifecycle.\n */\nexport class RelayerNode extends BaseRelayer implements RelayerSDK, Disposable {\n readonly #config: RelayerNodeConfig;\n #artifactCache: FheArtifactCache | null = null;\n\n constructor(config: RelayerNodeConfig) {\n super();\n this.#config = { fheArtifactStorage: new MemoryStorage(), ...config };\n }\n\n protected get chain(): FheChain {\n return this.#config.chain;\n }\n\n protected async init(): Promise<void> {\n await this.#pool.initPool();\n }\n\n get #pool(): NodeWorkerPool {\n return this.#config.pool;\n }\n\n #getArtifactCache(): FheArtifactCache | null {\n if (!this.#config.fheArtifactStorage) {\n return null;\n }\n if (!this.#artifactCache) {\n this.#artifactCache = new FheArtifactCache({\n storage: this.#config.fheArtifactStorage,\n chainId: this.chain.id,\n relayerUrl: this.chain.relayerUrl,\n ttl: this.#config.fheArtifactCacheTTL,\n logger: this.#config.logger,\n });\n }\n return this.#artifactCache;\n }\n\n /**\n * Terminate clears the artifact cache only.\n * The pool is externally owned — the relayer does not terminate it.\n */\n terminate(): void {\n this.#artifactCache = null;\n this.resetInit();\n }\n\n /** Calls {@link terminate}. */\n [Symbol.dispose](): void {\n this.terminate();\n }\n\n async generateKeypair(): Promise<KeypairType<Hex>> {\n await this.ensureInit();\n const chainId = this.chain.id;\n const result = await this.#pool.generateKeypair({ chainId });\n return {\n publicKey: result.publicKey,\n privateKey: result.privateKey,\n };\n }\n\n async createEIP712(\n publicKey: Hex,\n contractAddresses: Address[],\n startTimestamp: number,\n durationDays = 7,\n ): Promise<EIP712TypedData> {\n await this.ensureInit();\n const chainId = this.chain.id;\n return this.#pool.createEIP712({\n chainId,\n publicKey,\n contractAddresses,\n startTimestamp,\n durationDays,\n });\n }\n\n async encrypt(params: EncryptParams): Promise<EncryptResult> {\n await this.ensureInit();\n const chainId = this.chain.id;\n return withRetry(async () => {\n const result = await this.#pool.encrypt({ chainId, ...params });\n return { handles: result.handles, inputProof: result.inputProof };\n });\n }\n\n async userDecrypt(params: UserDecryptParams): Promise<Readonly<Record<Handle, ClearValueType>>> {\n await this.ensureInit();\n const chainId = this.chain.id;\n return withRetry(async () => {\n const result = await this.#pool.userDecrypt({ chainId, ...params });\n return result.clearValues;\n });\n }\n\n async publicDecrypt(handles: Handle[]): Promise<PublicDecryptResult> {\n await this.ensureInit();\n const chainId = this.chain.id;\n return withRetry(async () => {\n const result = await this.#pool.publicDecrypt({ chainId, handles });\n return {\n clearValues: result.clearValues,\n abiEncodedClearValues: result.abiEncodedClearValues,\n decryptionProof: result.decryptionProof,\n };\n });\n }\n\n async createDelegatedUserDecryptEIP712(\n publicKey: Hex,\n contractAddresses: Address[],\n delegatorAddress: Address,\n startTimestamp: number,\n durationDays = 7,\n ): Promise<KmsDelegatedUserDecryptEIP712Type> {\n await this.ensureInit();\n const chainId = this.chain.id;\n return this.#pool.createDelegatedUserDecryptEIP712({\n chainId,\n publicKey,\n contractAddresses,\n delegatorAddress,\n startTimestamp,\n durationDays,\n });\n }\n\n async delegatedUserDecrypt(\n params: DelegatedUserDecryptParams,\n ): Promise<Readonly<Record<Handle, ClearValueType>>> {\n await this.ensureInit();\n const chainId = this.chain.id;\n return withRetry(async () => {\n const result = await this.#pool.delegatedUserDecrypt({\n chainId,\n ...params,\n });\n return result.clearValues;\n });\n }\n\n async requestZKProofVerification(zkProof: ZKProofLike): Promise<InputProofBytesType> {\n await this.ensureInit();\n const chainId = this.chain.id;\n return withRetry(async () => {\n return this.#pool.requestZKProofVerification({ chainId, zkProof });\n });\n }\n\n async getPublicKey(): Promise<PublicKeyData | null> {\n await this.ensureInit();\n const chainId = this.chain.id;\n const artifactCache = this.#getArtifactCache();\n if (artifactCache) {\n return artifactCache.getPublicKey(\n async () => (await this.#pool.getPublicKey({ chainId })).result,\n );\n }\n return (await this.#pool.getPublicKey({ chainId })).result;\n }\n\n async getPublicParams(bits: number): Promise<PublicParamsData | null> {\n await this.ensureInit();\n const chainId = this.chain.id;\n const artifactCache = this.#getArtifactCache();\n if (artifactCache) {\n return artifactCache.getPublicParams(\n bits,\n async () => (await this.#pool.getPublicParams({ chainId, bits })).result,\n );\n }\n return (await this.#pool.getPublicParams({ chainId, bits })).result;\n }\n}\n","import { Worker } from \"node:worker_threads\";\nimport { randomUUID } from \"node:crypto\";\nimport type { FheChain } from \"../chains/types\";\nimport type {\n GenericLogger,\n WorkerEnv,\n WorkerRequest,\n WorkerRequestType,\n WorkerResponse,\n} from \"./worker.types\";\nimport { BaseWorkerClient } from \"./worker.base-client\";\n\nexport interface NodeWorkerClientConfig {\n chains: FheChain[];\n /** Optional logger for tracing worker request lifecycle. */\n logger?: GenericLogger;\n}\n\n/**\n * Client for communicating with the RelayerSDK Node.js worker thread.\n * Provides a promise-based API for FHE operations using node:worker_threads.\n */\nexport class NodeWorkerClient extends BaseWorkerClient<Worker, NodeWorkerClientConfig> {\n protected readonly env: WorkerEnv = \"node\";\n\n constructor(config: NodeWorkerClientConfig) {\n super(config, config.logger);\n }\n\n protected createWorker(): Worker {\n // Resolve relative to the @zama-fhe/sdk/node entry point so the path is\n // correct regardless of which rolldown chunk this code lands in.\n const nodeEntry = new URL(import.meta.resolve(\"@zama-fhe/sdk/node\"));\n return new Worker(new URL(\"relayer-sdk.node-worker.js\", nodeEntry));\n }\n\n protected wireEvents(worker: Worker): void {\n worker.on(\"message\", (response: WorkerResponse<unknown>) => this.handleResponse(response));\n worker.on(\"error\", (error: Error) => this.handleWorkerError(error.message));\n worker.on(\"messageerror\", () => this.handleWorkerMessageError());\n }\n\n protected postMessage(worker: Worker, request: WorkerRequest): void {\n worker.postMessage(request);\n }\n\n protected terminateWorker(worker: Worker): void {\n void worker.terminate();\n }\n\n protected generateRequestId(): string {\n return randomUUID();\n }\n\n protected getInitPayload(): {\n type: WorkerRequestType;\n payload: WorkerRequest[\"payload\"];\n } {\n return {\n type: \"INIT\",\n payload: { env: \"node\" as const, chains: this.config.chains },\n };\n }\n\n protected override onWorkerReady(worker: Worker): void {\n worker.unref();\n }\n}\n","import { availableParallelism } from \"node:os\";\nimport { NodeWorkerClient } from \"./worker.node-client\";\nimport type { NodeWorkerClientConfig } from \"./worker.node-client\";\nimport type {\n CreateDelegatedEIP712Payload,\n CreateDelegatedEIP712ResponseData,\n CreateEIP712Payload,\n CreateEIP712ResponseData,\n DelegatedUserDecryptPayload,\n DelegatedUserDecryptResponseData,\n EncryptPayload,\n EncryptResponseData,\n GenerateKeypairRequest,\n GenerateKeypairResponseData,\n GetPublicKeyRequest,\n GetPublicKeyResponseData,\n GetPublicParamsRequest,\n GetPublicParamsResponseData,\n PublicDecryptPayload,\n PublicDecryptResponseData,\n RequestZKProofVerificationRequest,\n RequestZKProofVerificationResponseData,\n UserDecryptPayload,\n UserDecryptResponseData,\n} from \"./worker.types\";\n\nexport interface NodeWorkerPoolConfig extends NodeWorkerClientConfig {\n poolSize?: number;\n}\n\nconst MAX_DEFAULT_POOL_SIZE = 4;\n\n/**\n * Pool of Node.js worker threads for parallel FHE operations.\n *\n * **Default pool size:** `min(os.availableParallelism(), 4)`. Each worker loads\n * the full WASM module (~50–100 MB), so size the pool based on available memory.\n *\n * **Scheduling:** Least-connections — each request is dispatched to the worker\n * with the fewest in-flight operations.\n *\n * **When to override pool size:**\n * - High-throughput batch processing (e.g. bulk encryptions): increase to match CPU cores.\n * - Memory-constrained environments: decrease to 1–2 workers.\n *\n * **Lifecycle:**\n * 1. Construct with config: `new NodeWorkerPool({ fhevmConfig })`\n * 2. Initialize all workers: `await pool.initPool()`\n * 3. Use: `await pool.encrypt(...)`, `await pool.userDecrypt(...)`, etc.\n * 4. Shut down: `pool.terminate()`\n *\n * `initPool()` is idempotent — concurrent calls share the same initialization promise.\n * If any worker fails to initialize, all workers are terminated and the error is propagated.\n */\nexport class NodeWorkerPool {\n readonly #workers: NodeWorkerClient[] = [];\n readonly #activeCount: number[] = [];\n readonly #config: NodeWorkerPoolConfig;\n readonly #poolSize: number;\n #initPromise: Promise<void> | null = null;\n\n /**\n * @param config - Pool configuration. Set `poolSize` to override the default\n * (`min(os.availableParallelism(), 4)`).\n */\n constructor(config: NodeWorkerPoolConfig) {\n this.#config = config;\n this.#poolSize = config.poolSize ?? Math.min(availableParallelism(), MAX_DEFAULT_POOL_SIZE);\n }\n\n get poolSize(): number {\n return this.#poolSize;\n }\n\n async initPool(): Promise<void> {\n if (this.#workers.length > 0) {\n return;\n }\n if (!this.#initPromise) {\n this.#initPromise = this.#doInitPool().finally(() => {\n this.#initPromise = null;\n });\n }\n return this.#initPromise;\n }\n\n async #doInitPool(): Promise<void> {\n for (let i = 0; i < this.#poolSize; i++) {\n this.#workers.push(new NodeWorkerClient(this.#config));\n this.#activeCount.push(0);\n }\n try {\n await Promise.all(this.#workers.map((w) => w.initWorker()));\n } catch (error) {\n // Terminate any workers that did initialize and reset state\n for (const worker of this.#workers) {\n worker.terminate();\n }\n this.#workers.length = 0;\n this.#activeCount.length = 0;\n throw error;\n }\n }\n\n terminate(): void {\n const errors: Error[] = [];\n for (const worker of this.#workers) {\n try {\n worker.terminate();\n } catch (e) {\n errors.push(e instanceof Error ? e : new Error(String(e)));\n }\n }\n this.#workers.length = 0;\n this.#activeCount.length = 0;\n if (errors.length > 0) {\n throw new AggregateError(errors, \"Failed to terminate worker pool\");\n }\n }\n\n /**\n * Pick the worker with the fewest in-flight requests (least-connections).\n * Returns the index so #dispatch can track the active count.\n */\n #leastBusyIndex(): number {\n let minIndex = 0;\n let minCount = this.#activeCount[0]!;\n for (let i = 1; i < this.#activeCount.length; i++) {\n if (this.#activeCount[i]! < minCount) {\n minCount = this.#activeCount[i]!;\n minIndex = i;\n }\n }\n return minIndex;\n }\n\n async #dispatch<T>(fn: (worker: NodeWorkerClient) => Promise<T>): Promise<T> {\n if (this.#workers.length === 0) {\n throw new Error(\"NodeWorkerPool not initialized. Call initPool() first.\");\n }\n const index = this.#leastBusyIndex();\n this.#activeCount[index]!++;\n try {\n return await fn(this.#workers[index]!);\n } finally {\n this.#activeCount[index]!--;\n }\n }\n\n async generateKeypair(\n params: GenerateKeypairRequest[\"payload\"],\n ): Promise<GenerateKeypairResponseData> {\n return this.#dispatch((w) => w.generateKeypair(params));\n }\n\n async createEIP712(params: CreateEIP712Payload): Promise<CreateEIP712ResponseData> {\n return this.#dispatch((w) => w.createEIP712(params));\n }\n\n async encrypt(params: EncryptPayload): Promise<EncryptResponseData> {\n return this.#dispatch((w) => w.encrypt(params));\n }\n\n async userDecrypt(params: UserDecryptPayload): Promise<UserDecryptResponseData> {\n return this.#dispatch((w) => w.userDecrypt(params));\n }\n\n async publicDecrypt(params: PublicDecryptPayload): Promise<PublicDecryptResponseData> {\n return this.#dispatch((w) => w.publicDecrypt(params));\n }\n\n async createDelegatedUserDecryptEIP712(\n params: CreateDelegatedEIP712Payload,\n ): Promise<CreateDelegatedEIP712ResponseData> {\n return this.#dispatch((w) => w.createDelegatedUserDecryptEIP712(params));\n }\n\n async delegatedUserDecrypt(\n params: DelegatedUserDecryptPayload,\n ): Promise<DelegatedUserDecryptResponseData> {\n return this.#dispatch((w) => w.delegatedUserDecrypt(params));\n }\n\n async requestZKProofVerification(\n params: RequestZKProofVerificationRequest[\"payload\"],\n ): Promise<RequestZKProofVerificationResponseData> {\n return this.#dispatch((w) => w.requestZKProofVerification(params));\n }\n\n async getPublicKey(params: GetPublicKeyRequest[\"payload\"]): Promise<GetPublicKeyResponseData> {\n return this.#dispatch((w) => w.getPublicKey(params));\n }\n\n async getPublicParams(\n params: GetPublicParamsRequest[\"payload\"],\n ): Promise<GetPublicParamsResponseData> {\n return this.#dispatch((w) => w.getPublicParams(params));\n }\n}\n","import type { RelayerConfig } from \"../config/types\";\nimport { RelayerNode } from \"../relayer/relayer-node\";\nimport type { FheChain } from \"../chains/types\";\nimport type { GenericStorage } from \"../types\";\nimport { NodeWorkerPool } from \"../worker/worker.node-pool\";\nimport type { GenericLogger } from \"../worker/worker.types\";\nimport { assertCondition } from \"../utils\";\n\n/** Pool options for the `node()` transport factory. */\nexport interface NodePoolOptions {\n poolSize?: number;\n logger?: GenericLogger;\n fheArtifactStorage?: GenericStorage;\n fheArtifactCacheTTL?: number;\n}\n\n/** Node transport — narrows worker type to `NodeWorkerPool`. */\nexport interface NodeRelayerConfig extends RelayerConfig {\n readonly type: \"node\";\n readonly createWorker: (chains: FheChain[]) => NodeWorkerPool;\n readonly createRelayer: (chain: FheChain, worker: NodeWorkerPool) => RelayerNode;\n}\n\n/**\n * Node.js transport — routes to RelayerNode (worker thread pool).\n *\n * @param options - Pool options (poolSize, logger, fheArtifactStorage, fheArtifactCacheTTL).\n *\n * @example\n * ```ts\n * relayers: {\n * [sepolia.id]: node(),\n * [mainnet.id]: node({ poolSize: 4 }),\n * }\n * ```\n */\nexport function node(options?: NodePoolOptions): NodeRelayerConfig {\n return {\n type: \"node\",\n createWorker: (chains) => new NodeWorkerPool({ chains, ...options }),\n createRelayer: (chain, pool) => {\n assertCondition(\n !!pool,\n \"node() relayer requires a worker pool — createWorker must be called first.\",\n );\n return new RelayerNode({ chain, pool, ...options });\n },\n };\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { GenericStorage } from \"../types\";\n\n/**\n * {@link GenericStorage} backed by Node.js {@link AsyncLocalStorage}.\n *\n * Each async context (e.g. HTTP request) gets its own isolated `Map`,\n * so credentials from one request never leak into another.\n *\n * Call {@link run} to establish a context before using the SDK:\n *\n * ```ts\n * import { asyncLocalStorage } from \"@zama-fhe/sdk/node\";\n *\n * app.post(\"/api/transfer\", (req, res) => {\n * asyncLocalStorage.run(async () => {\n * const sdk = new ZamaSDK({ relayer, signer, storage: asyncLocalStorage });\n * // credentials are scoped to this request\n * });\n * });\n * ```\n */\nexport class AsyncLocalMapStorage implements GenericStorage {\n readonly #als = new AsyncLocalStorage<Map<string, unknown>>();\n\n /** Execute `fn` within an isolated storage context. */\n run<R>(fn: () => R | Promise<R>): R | Promise<R> {\n return this.#als.run(new Map(), fn);\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n return (this.#als.getStore()?.get(key) as T) ?? null;\n }\n\n async set<T = unknown>(key: string, value: T): Promise<void> {\n this.#als.getStore()?.set(key, value);\n }\n\n async delete(key: string): Promise<void> {\n this.#als.getStore()?.delete(key);\n }\n}\n\n/** Default singleton for application-wide use. */\nexport const asyncLocalStorage = new AsyncLocalMapStorage();\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{n as e,t}from"../hex-BZVTzEK6.js";import{parentPort as n}from"node:worker_threads";if(!n)throw Error(`This script must be run as a worker thread`);const r=n,i=new Map,a=new Map,o=new Map;function s(e){return{...e,chainId:e.id}}async function c(e){let t=i.get(e);if(t)return t;let n=a.get(e);if(n)return n;let r=o.get(e);if(!r)throw Error(`No config for chain ${e}. Available: [${[...o.keys()].join(`, `)}]`);let c=(async()=>(await import(`@zama-fhe/relayer-sdk/node`)).createInstance({...s(r),batchRpcCalls:!1}))().then(t=>(i.set(e,t),a.delete(e),t)).catch(t=>{throw a.delete(e),t});return a.set(e,c),c}function l(e,t,n,i){let a={id:e,type:t,success:!0,data:n};r.postMessage(a,i)}function u(e,t,n){let i={id:e,type:t,success:!1,error:n};r.postMessage(i)}async function d(e){let{id:t,type:n,payload:r}=e;try{for(let e of r.chains)o.set(e.id,e);l(t,n,{initialized:!0})}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[NodeWorker] Init error:`,r),u(t,n,r)}}function f(e){return typeof e==`boolean`?e?1n:0n:e}function p(e){throw Error(`Unsupported FHE type`)}async function m(e){let{id:t,type:n,payload:r}=e,{values:i,contractAddress:a,userAddress:o}=r;try{let e=(await c(r.chainId)).createEncryptedInput(a,o);for(let t of i){let{value:n,type:r}=t;switch(r){case`ebool`:e.addBool(typeof n==`boolean`?n:n!==0n);break;case`euint8`:e.add8(f(n));break;case`euint16`:e.add16(f(n));break;case`euint32`:e.add32(f(n));break;case`euint64`:e.add64(f(n));break;case`euint128`:e.add128(f(n));break;case`euint256`:e.add256(f(n));break;case`eaddress`:e.addAddress(n);break;default:p(r)}}let s=await e.encrypt();l(t,n,{handles:s.handles,inputProof:s.inputProof},[s.inputProof.buffer,...s.handles.map(e=>e.buffer)])}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[NodeWorker] Encrypt error:`,r),u(t,n,r)}}async function h(t){let{id:n,type:r,payload:i}=t;try{let t=await c(i.chainId),a=i.handles.map(e=>({handle:e,contractAddress:i.contractAddress}));l(n,r,{clearValues:await t.userDecrypt(a,e(i.privateKey),e(i.publicKey),i.signature,i.signedContractAddresses,i.signerAddress,i.startTimestamp,i.durationDays)})}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`[NodeWorker] UserDecrypt error:`,t),u(n,r,t)}}async function g(e){let{id:t,type:n,payload:r}=e;try{l(t,n,{...await(await c(r.chainId)).publicDecrypt(r.handles)})}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[NodeWorker] PublicDecrypt error:`,r),u(t,n,r)}}async function _(e){let{id:n,type:r,payload:i}=e;try{let e=(await c(i.chainId)).generateKeypair();l(n,r,{publicKey:t(e.publicKey),privateKey:t(e.privateKey)})}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`[NodeWorker] GenerateKeypair error:`,t),u(n,r,t)}}async function v(t){let{id:n,type:r,payload:i}=t;try{l(n,r,(await c(i.chainId)).createEIP712(e(i.publicKey),i.contractAddresses,i.startTimestamp,i.durationDays))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`[NodeWorker] CreateEIP712 error:`,t),u(n,r,t)}}async function y(t){let{id:n,type:r,payload:i}=t;try{l(n,r,(await c(i.chainId)).createDelegatedUserDecryptEIP712(e(i.publicKey),i.contractAddresses,i.delegatorAddress,i.startTimestamp,i.durationDays))}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`[NodeWorker] CreateDelegatedEIP712 error:`,t),u(n,r,t)}}async function b(t){let{id:n,type:r,payload:i}=t;try{let t=await c(i.chainId),a=i.handles.map(e=>({handle:e,contractAddress:i.contractAddress}));l(n,r,{clearValues:await t.delegatedUserDecrypt(a,e(i.privateKey),e(i.publicKey),i.signature,i.signedContractAddresses,i.delegatorAddress,i.delegateAddress,i.startTimestamp,i.durationDays)})}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`[NodeWorker] DelegatedUserDecrypt error:`,t),u(n,r,t)}}async function x(e){let{id:t,type:n,payload:r}=e;try{let e=await(await c(r.chainId)).requestZKProofVerification(r.zkProof);l(t,n,e,[e.inputProof.buffer,...e.handles.map(e=>e.buffer)])}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[NodeWorker] RequestZKProofVerification error:`,r),u(t,n,r)}}async function S(e){let{id:t,type:n,payload:r}=e;try{l(t,n,{result:(await c(r.chainId)).getPublicKey()})}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[NodeWorker] GetPublicKey error:`,r),u(t,n,r)}}async function C(e){let{id:t,type:n,payload:r}=e;try{l(t,n,{result:(await c(r.chainId)).getPublicParams(r.bits)})}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[NodeWorker] GetPublicParams error:`,r),u(t,n,r)}}async function w(e){try{switch(e.type){case`INIT`:await d(e);break;case`ENCRYPT`:await m(e);break;case`USER_DECRYPT`:await h(e);break;case`PUBLIC_DECRYPT`:await g(e);break;case`GENERATE_KEYPAIR`:await _(e);break;case`CREATE_EIP712`:await v(e);break;case`CREATE_DELEGATED_EIP712`:await y(e);break;case`DELEGATED_USER_DECRYPT`:await b(e);break;case`REQUEST_ZK_PROOF_VERIFICATION`:await x(e);break;case`GET_PUBLIC_KEY`:await S(e);break;case`GET_PUBLIC_PARAMS`:await C(e);break;default:console.error(`[NodeWorker] Unknown request type:`,e.type)}}catch(t){let n=t instanceof Error?t.message:String(t);u(e.id,e.type,n)}}r.on(`message`,e=>{w(e)});
|
|
2
2
|
//# sourceMappingURL=relayer-sdk.node-worker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relayer-sdk.node-worker.js","names":[],"sources":["../../../src/worker/relayer-sdk.node-worker.ts"],"sourcesContent":["/**\n * Node.js worker thread for RelayerSDK FHE operations.\n * Handles CPU-intensive WASM operations off the main thread using node:worker_threads.\n */\n\nimport type { FhevmInstance, FhevmInstanceConfig } from \"@zama-fhe/relayer-sdk/node\";\nimport { parentPort, type Transferable } from \"node:worker_threads\";\nimport type {\n CreateDelegatedEIP712Request,\n CreateEIP712Request,\n CreateEIP712ResponseData,\n DelegatedUserDecryptRequest,\n DelegatedUserDecryptResponseData,\n EncryptRequest,\n EncryptResponseData,\n ErrorResponse,\n GenerateKeypairRequest,\n GenerateKeypairResponseData,\n GetPublicKeyRequest,\n GetPublicKeyResponseData,\n GetPublicParamsRequest,\n GetPublicParamsResponseData,\n NodeInitRequest,\n PublicDecryptRequest,\n PublicDecryptResponseData,\n RequestZKProofVerificationRequest,\n SuccessResponse,\n UserDecryptRequest,\n UserDecryptResponseData,\n WorkerRequest,\n} from \"./worker.types\";\nimport { assertNonNullable, prefixHex, unprefixHex } from \"../utils\";\n\nif (!parentPort) {\n throw new Error(\"This script must be run as a worker thread\");\n}\n\nconst port = parentPort;\n\nlet sdkInstance: FhevmInstance | null = null;\n\nfunction assertSdkInstance(\n instance: FhevmInstance | null,\n): asserts instance is NonNullable<FhevmInstance> {\n try {\n assertNonNullable(instance, \"Relayer SDK instance\");\n } catch (error) {\n throw new Error(\"Relayer SDK is not initialized. Call INIT first.\", {\n cause: error,\n });\n }\n}\n\nfunction sendSuccess<T>(\n id: string,\n type: WorkerRequest[\"type\"],\n data: T,\n transfer?: readonly Transferable[],\n): void {\n const response: SuccessResponse<T> = { id, type, success: true, data };\n port.postMessage(response, transfer);\n}\n\nfunction sendError(id: string, type: WorkerRequest[\"type\"], error: string): void {\n const response: ErrorResponse = { id, type, success: false, error };\n port.postMessage(response);\n}\n\nasync function handleNodeInit(request: NodeInitRequest): Promise<void> {\n const { id, type, payload } = request;\n const { fhevmConfig } = payload;\n\n try {\n const nodeSdk = await import(\"@zama-fhe/relayer-sdk/node\");\n\n const config: FhevmInstanceConfig = {\n ...fhevmConfig,\n batchRpcCalls: false,\n };\n\n sdkInstance = await nodeSdk.createInstance(config);\n\n sendSuccess(id, type, { initialized: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] Init error:\", message);\n sendError(id, type, message);\n }\n}\n\n/** Coerce a boolean to bigint for numeric FHE types. */\nfunction toBigInt(value: bigint | boolean): bigint {\n return typeof value === \"boolean\" ? (value ? 1n : 0n) : value;\n}\n\nfunction unreachableFheType(_: never): never {\n throw new Error(\"Unsupported FHE type\");\n}\n\nasync function handleEncrypt(request: EncryptRequest): Promise<void> {\n const { id, type, payload } = request;\n const { values, contractAddress, userAddress } = payload;\n\n try {\n assertSdkInstance(sdkInstance);\n\n const input = sdkInstance.createEncryptedInput(contractAddress, userAddress);\n\n for (const entry of values) {\n const { value, type: fheType } = entry;\n switch (fheType) {\n case \"ebool\":\n input.addBool(typeof value === \"boolean\" ? value : value !== 0n);\n break;\n case \"euint8\":\n input.add8(toBigInt(value));\n break;\n case \"euint16\":\n input.add16(toBigInt(value));\n break;\n case \"euint32\":\n input.add32(toBigInt(value));\n break;\n case \"euint64\":\n input.add64(toBigInt(value));\n break;\n case \"euint128\":\n input.add128(toBigInt(value));\n break;\n case \"euint256\":\n input.add256(toBigInt(value));\n break;\n case \"eaddress\":\n input.addAddress(value);\n break;\n default:\n unreachableFheType(fheType);\n }\n }\n\n const encrypted = await input.encrypt();\n\n const response: EncryptResponseData = {\n handles: encrypted.handles,\n inputProof: encrypted.inputProof,\n };\n\n const transferList: Transferable[] = [\n encrypted.inputProof.buffer as ArrayBuffer,\n ...encrypted.handles.map((h) => h.buffer as ArrayBuffer),\n ];\n\n sendSuccess(id, type, response, transferList);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] Encrypt error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleUserDecrypt(request: UserDecryptRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n assertSdkInstance(sdkInstance);\n\n const handleContractPairs = payload.handles.map((handle) => ({\n handle,\n contractAddress: payload.contractAddress,\n }));\n\n const result = await sdkInstance.userDecrypt(\n handleContractPairs,\n unprefixHex(payload.privateKey),\n unprefixHex(payload.publicKey),\n payload.signature,\n payload.signedContractAddresses,\n payload.signerAddress,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n const response: UserDecryptResponseData = { clearValues: result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] UserDecrypt error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handlePublicDecrypt(request: PublicDecryptRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n assertSdkInstance(sdkInstance);\n\n const result = await sdkInstance.publicDecrypt(payload.handles);\n\n const response: PublicDecryptResponseData = { ...result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] PublicDecrypt error:\", message);\n sendError(id, type, message);\n }\n}\n\nfunction handleGenerateKeypair(request: GenerateKeypairRequest): void {\n const { id, type } = request;\n\n try {\n assertSdkInstance(sdkInstance);\n\n const keypair = sdkInstance.generateKeypair();\n\n const response: GenerateKeypairResponseData = {\n publicKey: prefixHex(keypair.publicKey),\n privateKey: prefixHex(keypair.privateKey),\n };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] GenerateKeypair error:\", message);\n sendError(id, type, message);\n }\n}\n\nfunction handleCreateEIP712(request: CreateEIP712Request): void {\n const { id, type, payload } = request;\n\n try {\n assertSdkInstance(sdkInstance);\n\n const eip712 = sdkInstance.createEIP712(\n unprefixHex(payload.publicKey),\n payload.contractAddresses,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n const response: CreateEIP712ResponseData = {\n domain: {\n name: eip712.domain.name,\n version: eip712.domain.version,\n chainId: Number(eip712.domain.chainId),\n verifyingContract: eip712.domain.verifyingContract,\n },\n types: {\n UserDecryptRequestVerification: eip712.types.UserDecryptRequestVerification.map(\n (field) => ({\n name: field.name,\n type: field.type,\n }),\n ),\n },\n message: {\n publicKey: prefixHex(eip712.message.publicKey),\n contractAddresses: [...eip712.message.contractAddresses],\n startTimestamp: BigInt(eip712.message.startTimestamp),\n durationDays: BigInt(eip712.message.durationDays),\n extraData: prefixHex(eip712.message.extraData),\n },\n };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] CreateEIP712 error:\", message);\n sendError(id, type, message);\n }\n}\n\nfunction handleCreateDelegatedEIP712(request: CreateDelegatedEIP712Request): void {\n const { id, type, payload } = request;\n\n try {\n assertSdkInstance(sdkInstance);\n\n const result = sdkInstance.createDelegatedUserDecryptEIP712(\n unprefixHex(payload.publicKey),\n payload.contractAddresses,\n payload.delegatorAddress,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n sendSuccess(id, type, result);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] CreateDelegatedEIP712 error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleDelegatedUserDecrypt(request: DelegatedUserDecryptRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n assertSdkInstance(sdkInstance);\n\n const handleContractPairs = payload.handles.map((handle) => ({\n handle,\n contractAddress: payload.contractAddress,\n }));\n\n const result = await sdkInstance.delegatedUserDecrypt(\n handleContractPairs,\n unprefixHex(payload.privateKey),\n unprefixHex(payload.publicKey),\n payload.signature,\n payload.signedContractAddresses,\n payload.delegatorAddress,\n payload.delegateAddress,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n const response: DelegatedUserDecryptResponseData = { clearValues: result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] DelegatedUserDecrypt error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleRequestZKProofVerification(\n request: RequestZKProofVerificationRequest,\n): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n assertSdkInstance(sdkInstance);\n\n const result = await sdkInstance.requestZKProofVerification(payload.zkProof);\n\n const transferList: Transferable[] = [\n result.inputProof.buffer as ArrayBuffer,\n ...result.handles.map((h) => h.buffer as ArrayBuffer),\n ];\n\n sendSuccess(id, type, result, transferList);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] RequestZKProofVerification error:\", message);\n sendError(id, type, message);\n }\n}\n\nfunction handleGetPublicKey(request: GetPublicKeyRequest): void {\n const { id, type } = request;\n\n try {\n assertSdkInstance(sdkInstance);\n\n const result = sdkInstance.getPublicKey();\n\n const response: GetPublicKeyResponseData = { result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] GetPublicKey error:\", message);\n sendError(id, type, message);\n }\n}\n\nfunction handleGetPublicParams(request: GetPublicParamsRequest): void {\n const { id, type, payload } = request;\n\n try {\n assertSdkInstance(sdkInstance);\n\n const result = sdkInstance.getPublicParams(\n // oxlint-disable-next-line typescript-eslint/consistent-type-imports -- SDK loaded dynamically\n payload.bits as keyof import(\"@zama-fhe/relayer-sdk/node\").PublicParams<Uint8Array>,\n );\n\n const response: GetPublicParamsResponseData = { result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] GetPublicParams error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleMessage(request: WorkerRequest): Promise<void> {\n try {\n switch (request.type) {\n case \"NODE_INIT\":\n await handleNodeInit(request);\n break;\n case \"ENCRYPT\":\n await handleEncrypt(request);\n break;\n case \"USER_DECRYPT\":\n await handleUserDecrypt(request);\n break;\n case \"PUBLIC_DECRYPT\":\n await handlePublicDecrypt(request);\n break;\n case \"GENERATE_KEYPAIR\":\n handleGenerateKeypair(request);\n break;\n case \"CREATE_EIP712\":\n handleCreateEIP712(request);\n break;\n case \"CREATE_DELEGATED_EIP712\":\n handleCreateDelegatedEIP712(request);\n break;\n case \"DELEGATED_USER_DECRYPT\":\n await handleDelegatedUserDecrypt(request);\n break;\n case \"REQUEST_ZK_PROOF_VERIFICATION\":\n await handleRequestZKProofVerification(request);\n break;\n case \"GET_PUBLIC_KEY\":\n handleGetPublicKey(request);\n break;\n case \"GET_PUBLIC_PARAMS\":\n handleGetPublicParams(request);\n break;\n default:\n console.error(\"[NodeWorker] Unknown request type:\", request.type);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendError(request.id, request.type, message);\n }\n}\n\nport.on(\"message\", (request: WorkerRequest) => {\n void handleMessage(request);\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"relayer-sdk.node-worker.js","names":[],"sources":["../../../src/worker/relayer-sdk.node-worker.ts"],"sourcesContent":["/**\n * Node.js worker thread for RelayerSDK FHE operations.\n * Handles CPU-intensive WASM operations off the main thread using node:worker_threads.\n */\n\nimport type { FhevmInstance, FhevmInstanceConfig } from \"@zama-fhe/relayer-sdk/node\";\nimport type { FheChain } from \"../chains/types\";\nimport { parentPort, type Transferable } from \"node:worker_threads\";\nimport type {\n CreateDelegatedEIP712Request,\n CreateEIP712Request,\n DelegatedUserDecryptRequest,\n DelegatedUserDecryptResponseData,\n EncryptRequest,\n EncryptResponseData,\n ErrorResponse,\n GenerateKeypairRequest,\n GenerateKeypairResponseData,\n GetPublicKeyRequest,\n GetPublicKeyResponseData,\n GetPublicParamsRequest,\n GetPublicParamsResponseData,\n InitRequest,\n PublicDecryptRequest,\n PublicDecryptResponseData,\n RequestZKProofVerificationRequest,\n SuccessResponse,\n UserDecryptRequest,\n UserDecryptResponseData,\n WorkerRequest,\n} from \"./worker.types\";\nimport { prefixHex, unprefixHex } from \"../utils\";\n\nif (!parentPort) {\n throw new Error(\"This script must be run as a worker thread\");\n}\n\nconst port = parentPort;\n\n// ── Multi-chain instance management ─────────────────────────────\nconst instances = new Map<number, FhevmInstance>();\nconst pending = new Map<number, Promise<FhevmInstance>>();\nconst configs = new Map<number, FheChain>();\n\n/** Convert an FheChain to the FhevmInstanceConfig shape expected by createInstance. */\nfunction toInstanceConfig(chain: FheChain): FhevmInstanceConfig {\n return { ...chain, chainId: chain.id };\n}\n\n/**\n * Get or lazily create an FhevmInstance for the given chain.\n */\nasync function getInstance(chainId: number): Promise<FhevmInstance> {\n const existing = instances.get(chainId);\n if (existing) {\n return existing;\n }\n\n const inflight = pending.get(chainId);\n if (inflight) {\n return inflight;\n }\n\n const config = configs.get(chainId);\n if (!config) {\n throw new Error(\n `No config for chain ${chainId}. Available: [${[...configs.keys()].join(\", \")}]`,\n );\n }\n\n const promise = (async () => {\n const nodeSdk = await import(\"@zama-fhe/relayer-sdk/node\");\n return nodeSdk.createInstance({ ...toInstanceConfig(config), batchRpcCalls: false });\n })()\n .then((instance) => {\n instances.set(chainId, instance);\n pending.delete(chainId);\n return instance;\n })\n .catch((err) => {\n pending.delete(chainId);\n throw err;\n });\n\n pending.set(chainId, promise);\n return promise;\n}\n\nfunction sendSuccess<T>(\n id: string,\n type: WorkerRequest[\"type\"],\n data: T,\n transfer?: readonly Transferable[],\n): void {\n const response: SuccessResponse<T> = { id, type, success: true, data };\n port.postMessage(response, transfer);\n}\n\nfunction sendError(id: string, type: WorkerRequest[\"type\"], error: string): void {\n const response: ErrorResponse = { id, type, success: false, error };\n port.postMessage(response);\n}\n\n/**\n * Handle INIT request - register chain configs (instances are lazy).\n */\nasync function handleInit(request: InitRequest): Promise<void> {\n const { id, type, payload } = request;\n try {\n for (const chain of payload.chains) {\n configs.set(chain.id, chain);\n }\n sendSuccess(id, type, { initialized: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] Init error:\", message);\n sendError(id, type, message);\n }\n}\n\n/** Coerce a boolean to bigint for numeric FHE types. */\nfunction toBigInt(value: bigint | boolean): bigint {\n return typeof value === \"boolean\" ? (value ? 1n : 0n) : value;\n}\n\nfunction unreachableFheType(_: never): never {\n throw new Error(\"Unsupported FHE type\");\n}\n\nasync function handleEncrypt(request: EncryptRequest): Promise<void> {\n const { id, type, payload } = request;\n const { values, contractAddress, userAddress } = payload;\n\n try {\n const instance = await getInstance(payload.chainId);\n\n const input = instance.createEncryptedInput(contractAddress, userAddress);\n\n for (const entry of values) {\n const { value, type: fheType } = entry;\n switch (fheType) {\n case \"ebool\":\n input.addBool(typeof value === \"boolean\" ? value : value !== 0n);\n break;\n case \"euint8\":\n input.add8(toBigInt(value));\n break;\n case \"euint16\":\n input.add16(toBigInt(value));\n break;\n case \"euint32\":\n input.add32(toBigInt(value));\n break;\n case \"euint64\":\n input.add64(toBigInt(value));\n break;\n case \"euint128\":\n input.add128(toBigInt(value));\n break;\n case \"euint256\":\n input.add256(toBigInt(value));\n break;\n case \"eaddress\":\n input.addAddress(value);\n break;\n default:\n unreachableFheType(fheType);\n }\n }\n\n const encrypted = await input.encrypt();\n\n const response: EncryptResponseData = {\n handles: encrypted.handles,\n inputProof: encrypted.inputProof,\n };\n\n const transferList: Transferable[] = [\n encrypted.inputProof.buffer as ArrayBuffer,\n ...encrypted.handles.map((h) => h.buffer as ArrayBuffer),\n ];\n\n sendSuccess(id, type, response, transferList);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] Encrypt error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleUserDecrypt(request: UserDecryptRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n const instance = await getInstance(payload.chainId);\n\n const handleContractPairs = payload.handles.map((handle) => ({\n handle,\n contractAddress: payload.contractAddress,\n }));\n\n const result = await instance.userDecrypt(\n handleContractPairs,\n unprefixHex(payload.privateKey),\n unprefixHex(payload.publicKey),\n payload.signature,\n payload.signedContractAddresses,\n payload.signerAddress,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n const response: UserDecryptResponseData = { clearValues: result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] UserDecrypt error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handlePublicDecrypt(request: PublicDecryptRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n const instance = await getInstance(payload.chainId);\n\n const result = await instance.publicDecrypt(payload.handles);\n\n const response: PublicDecryptResponseData = { ...result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] PublicDecrypt error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleGenerateKeypair(request: GenerateKeypairRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n const instance = await getInstance(payload.chainId);\n\n const keypair = instance.generateKeypair();\n\n const response: GenerateKeypairResponseData = {\n publicKey: prefixHex(keypair.publicKey),\n privateKey: prefixHex(keypair.privateKey),\n };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] GenerateKeypair error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleCreateEIP712(request: CreateEIP712Request): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n const instance = await getInstance(payload.chainId);\n\n const eip712 = instance.createEIP712(\n unprefixHex(payload.publicKey),\n payload.contractAddresses,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n sendSuccess(id, type, eip712);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] CreateEIP712 error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleCreateDelegatedEIP712(request: CreateDelegatedEIP712Request): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n const instance = await getInstance(payload.chainId);\n\n const result = instance.createDelegatedUserDecryptEIP712(\n unprefixHex(payload.publicKey),\n payload.contractAddresses,\n payload.delegatorAddress,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n sendSuccess(id, type, result);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] CreateDelegatedEIP712 error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleDelegatedUserDecrypt(request: DelegatedUserDecryptRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n const instance = await getInstance(payload.chainId);\n\n const handleContractPairs = payload.handles.map((handle) => ({\n handle,\n contractAddress: payload.contractAddress,\n }));\n\n const result = await instance.delegatedUserDecrypt(\n handleContractPairs,\n unprefixHex(payload.privateKey),\n unprefixHex(payload.publicKey),\n payload.signature,\n payload.signedContractAddresses,\n payload.delegatorAddress,\n payload.delegateAddress,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n const response: DelegatedUserDecryptResponseData = { clearValues: result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] DelegatedUserDecrypt error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleRequestZKProofVerification(\n request: RequestZKProofVerificationRequest,\n): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n const instance = await getInstance(payload.chainId);\n\n const result = await instance.requestZKProofVerification(payload.zkProof);\n\n const transferList: Transferable[] = [\n result.inputProof.buffer as ArrayBuffer,\n ...result.handles.map((h) => h.buffer as ArrayBuffer),\n ];\n\n sendSuccess(id, type, result, transferList);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] RequestZKProofVerification error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleGetPublicKey(request: GetPublicKeyRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n const instance = await getInstance(payload.chainId);\n\n const result = instance.getPublicKey();\n\n const response: GetPublicKeyResponseData = { result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] GetPublicKey error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleGetPublicParams(request: GetPublicParamsRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n const instance = await getInstance(payload.chainId);\n\n const result = instance.getPublicParams(\n // oxlint-disable-next-line typescript-eslint/consistent-type-imports -- SDK loaded dynamically\n payload.bits as keyof import(\"@zama-fhe/relayer-sdk/node\").PublicParams<Uint8Array>,\n );\n\n const response: GetPublicParamsResponseData = { result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[NodeWorker] GetPublicParams error:\", message);\n sendError(id, type, message);\n }\n}\n\nasync function handleMessage(request: WorkerRequest): Promise<void> {\n try {\n switch (request.type) {\n case \"INIT\":\n await handleInit(request);\n break;\n case \"ENCRYPT\":\n await handleEncrypt(request);\n break;\n case \"USER_DECRYPT\":\n await handleUserDecrypt(request);\n break;\n case \"PUBLIC_DECRYPT\":\n await handlePublicDecrypt(request);\n break;\n case \"GENERATE_KEYPAIR\":\n await handleGenerateKeypair(request);\n break;\n case \"CREATE_EIP712\":\n await handleCreateEIP712(request);\n break;\n case \"CREATE_DELEGATED_EIP712\":\n await handleCreateDelegatedEIP712(request);\n break;\n case \"DELEGATED_USER_DECRYPT\":\n await handleDelegatedUserDecrypt(request);\n break;\n case \"REQUEST_ZK_PROOF_VERIFICATION\":\n await handleRequestZKProofVerification(request);\n break;\n case \"GET_PUBLIC_KEY\":\n await handleGetPublicKey(request);\n break;\n case \"GET_PUBLIC_PARAMS\":\n await handleGetPublicParams(request);\n break;\n default:\n console.error(\"[NodeWorker] Unknown request type:\", request.type);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendError(request.id, request.type, message);\n }\n}\n\nport.on(\"message\", (request: WorkerRequest) => {\n void handleMessage(request);\n});\n"],"mappings":"0FAiCA,GAAI,CAAC,EACH,MAAU,MAAM,6CAA6C,CAG/D,MAAM,EAAO,EAGP,EAAY,IAAI,IAChB,EAAU,IAAI,IACd,EAAU,IAAI,IAGpB,SAAS,EAAiB,EAAsC,CAC9D,MAAO,CAAE,GAAG,EAAO,QAAS,EAAM,GAAI,CAMxC,eAAe,EAAY,EAAyC,CAClE,IAAM,EAAW,EAAU,IAAI,EAAQ,CACvC,GAAI,EACF,OAAO,EAGT,IAAM,EAAW,EAAQ,IAAI,EAAQ,CACrC,GAAI,EACF,OAAO,EAGT,IAAM,EAAS,EAAQ,IAAI,EAAQ,CACnC,GAAI,CAAC,EACH,MAAU,MACR,uBAAuB,EAAQ,gBAAgB,CAAC,GAAG,EAAQ,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAC/E,CAGH,IAAM,GAAW,UACC,MAAM,OAAO,+BACd,eAAe,CAAE,GAAG,EAAiB,EAAO,CAAE,cAAe,GAAO,CAAC,GAClF,CACD,KAAM,IACL,EAAU,IAAI,EAAS,EAAS,CAChC,EAAQ,OAAO,EAAQ,CAChB,GACP,CACD,MAAO,GAAQ,CAEd,MADA,EAAQ,OAAO,EAAQ,CACjB,GACN,CAGJ,OADA,EAAQ,IAAI,EAAS,EAAQ,CACtB,EAGT,SAAS,EACP,EACA,EACA,EACA,EACM,CACN,IAAM,EAA+B,CAAE,KAAI,OAAM,QAAS,GAAM,OAAM,CACtE,EAAK,YAAY,EAAU,EAAS,CAGtC,SAAS,EAAU,EAAY,EAA6B,EAAqB,CAC/E,IAAM,EAA0B,CAAE,KAAI,OAAM,QAAS,GAAO,QAAO,CACnE,EAAK,YAAY,EAAS,CAM5B,eAAe,EAAW,EAAqC,CAC7D,GAAM,CAAE,KAAI,OAAM,WAAY,EAC9B,GAAI,CACF,IAAK,IAAM,KAAS,EAAQ,OAC1B,EAAQ,IAAI,EAAM,GAAI,EAAM,CAE9B,EAAY,EAAI,EAAM,CAAE,YAAa,GAAM,CAAC,OACrC,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,MAAM,2BAA4B,EAAQ,CAClD,EAAU,EAAI,EAAM,EAAQ,EAKhC,SAAS,EAAS,EAAiC,CACjD,OAAO,OAAO,GAAU,UAAa,EAAQ,GAAK,GAAM,EAG1D,SAAS,EAAmB,EAAiB,CAC3C,MAAU,MAAM,uBAAuB,CAGzC,eAAe,EAAc,EAAwC,CACnE,GAAM,CAAE,KAAI,OAAM,WAAY,EACxB,CAAE,SAAQ,kBAAiB,eAAgB,EAEjD,GAAI,CAGF,IAAM,GAFW,MAAM,EAAY,EAAQ,QAAQ,EAE5B,qBAAqB,EAAiB,EAAY,CAEzE,IAAK,IAAM,KAAS,EAAQ,CAC1B,GAAM,CAAE,QAAO,KAAM,GAAY,EACjC,OAAQ,EAAR,CACE,IAAK,QACH,EAAM,QAAQ,OAAO,GAAU,UAAY,EAAQ,IAAU,GAAG,CAChE,MACF,IAAK,SACH,EAAM,KAAK,EAAS,EAAM,CAAC,CAC3B,MACF,IAAK,UACH,EAAM,MAAM,EAAS,EAAM,CAAC,CAC5B,MACF,IAAK,UACH,EAAM,MAAM,EAAS,EAAM,CAAC,CAC5B,MACF,IAAK,UACH,EAAM,MAAM,EAAS,EAAM,CAAC,CAC5B,MACF,IAAK,WACH,EAAM,OAAO,EAAS,EAAM,CAAC,CAC7B,MACF,IAAK,WACH,EAAM,OAAO,EAAS,EAAM,CAAC,CAC7B,MACF,IAAK,WACH,EAAM,WAAW,EAAM,CACvB,MACF,QACE,EAAmB,EAAQ,EAIjC,IAAM,EAAY,MAAM,EAAM,SAAS,CAYvC,EAAY,EAAI,EAVsB,CACpC,QAAS,EAAU,QACnB,WAAY,EAAU,WACvB,CAEoC,CACnC,EAAU,WAAW,OACrB,GAAG,EAAU,QAAQ,IAAK,GAAM,EAAE,OAAsB,CACzD,CAE4C,OACtC,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,MAAM,8BAA+B,EAAQ,CACrD,EAAU,EAAI,EAAM,EAAQ,EAIhC,eAAe,EAAkB,EAA4C,CAC3E,GAAM,CAAE,KAAI,OAAM,WAAY,EAE9B,GAAI,CACF,IAAM,EAAW,MAAM,EAAY,EAAQ,QAAQ,CAE7C,EAAsB,EAAQ,QAAQ,IAAK,IAAY,CAC3D,SACA,gBAAiB,EAAQ,gBAC1B,EAAE,CAeH,EAAY,EAAI,EAF0B,CAAE,YAX7B,MAAM,EAAS,YAC5B,EACA,EAAY,EAAQ,WAAW,CAC/B,EAAY,EAAQ,UAAU,CAC9B,EAAQ,UACR,EAAQ,wBACR,EAAQ,cACR,EAAQ,eACR,EAAQ,aACT,CAEgE,CAElC,OACxB,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,MAAM,kCAAmC,EAAQ,CACzD,EAAU,EAAI,EAAM,EAAQ,EAIhC,eAAe,EAAoB,EAA8C,CAC/E,GAAM,CAAE,KAAI,OAAM,WAAY,EAE9B,GAAI,CAOF,EAAY,EAAI,EAF4B,CAAE,GAF/B,MAFE,MAAM,EAAY,EAAQ,QAAQ,EAErB,cAAc,EAAQ,QAAQ,CAEH,CAE1B,OACxB,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,MAAM,oCAAqC,EAAQ,CAC3D,EAAU,EAAI,EAAM,EAAQ,EAIhC,eAAe,EAAsB,EAAgD,CACnF,GAAM,CAAE,KAAI,OAAM,WAAY,EAE9B,GAAI,CAGF,IAAM,GAFW,MAAM,EAAY,EAAQ,QAAQ,EAE1B,iBAAiB,CAO1C,EAAY,EAAI,EAL8B,CAC5C,UAAW,EAAU,EAAQ,UAAU,CACvC,WAAY,EAAU,EAAQ,WAAW,CAC1C,CAE8B,OACxB,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,MAAM,sCAAuC,EAAQ,CAC7D,EAAU,EAAI,EAAM,EAAQ,EAIhC,eAAe,EAAmB,EAA6C,CAC7E,GAAM,CAAE,KAAI,OAAM,WAAY,EAE9B,GAAI,CAUF,EAAY,EAAI,GATC,MAAM,EAAY,EAAQ,QAAQ,EAE3B,aACtB,EAAY,EAAQ,UAAU,CAC9B,EAAQ,kBACR,EAAQ,eACR,EAAQ,aACT,CAE4B,OACtB,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,MAAM,mCAAoC,EAAQ,CAC1D,EAAU,EAAI,EAAM,EAAQ,EAIhC,eAAe,EAA4B,EAAsD,CAC/F,GAAM,CAAE,KAAI,OAAM,WAAY,EAE9B,GAAI,CAWF,EAAY,EAAI,GAVC,MAAM,EAAY,EAAQ,QAAQ,EAE3B,iCACtB,EAAY,EAAQ,UAAU,CAC9B,EAAQ,kBACR,EAAQ,iBACR,EAAQ,eACR,EAAQ,aACT,CAE4B,OACtB,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,MAAM,4CAA6C,EAAQ,CACnE,EAAU,EAAI,EAAM,EAAQ,EAIhC,eAAe,EAA2B,EAAqD,CAC7F,GAAM,CAAE,KAAI,OAAM,WAAY,EAE9B,GAAI,CACF,IAAM,EAAW,MAAM,EAAY,EAAQ,QAAQ,CAE7C,EAAsB,EAAQ,QAAQ,IAAK,IAAY,CAC3D,SACA,gBAAiB,EAAQ,gBAC1B,EAAE,CAgBH,EAAY,EAAI,EAFmC,CAAE,YAZtC,MAAM,EAAS,qBAC5B,EACA,EAAY,EAAQ,WAAW,CAC/B,EAAY,EAAQ,UAAU,CAC9B,EAAQ,UACR,EAAQ,wBACR,EAAQ,iBACR,EAAQ,gBACR,EAAQ,eACR,EAAQ,aACT,CAEyE,CAE3C,OACxB,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,MAAM,2CAA4C,EAAQ,CAClE,EAAU,EAAI,EAAM,EAAQ,EAIhC,eAAe,EACb,EACe,CACf,GAAM,CAAE,KAAI,OAAM,WAAY,EAE9B,GAAI,CAGF,IAAM,EAAS,MAFE,MAAM,EAAY,EAAQ,QAAQ,EAErB,2BAA2B,EAAQ,QAAQ,CAOzE,EAAY,EAAI,EAAM,EALe,CACnC,EAAO,WAAW,OAClB,GAAG,EAAO,QAAQ,IAAK,GAAM,EAAE,OAAsB,CACtD,CAE0C,OACpC,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,MAAM,iDAAkD,EAAQ,CACxE,EAAU,EAAI,EAAM,EAAQ,EAIhC,eAAe,EAAmB,EAA6C,CAC7E,GAAM,CAAE,KAAI,OAAM,WAAY,EAE9B,GAAI,CAOF,EAAY,EAAI,EAF2B,CAAE,QAJ5B,MAAM,EAAY,EAAQ,QAAQ,EAE3B,cAAc,CAEe,CAEtB,OACxB,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,MAAM,mCAAoC,EAAQ,CAC1D,EAAU,EAAI,EAAM,EAAQ,EAIhC,eAAe,EAAsB,EAAgD,CACnF,GAAM,CAAE,KAAI,OAAM,WAAY,EAE9B,GAAI,CAUF,EAAY,EAAI,EAF8B,CAAE,QAP/B,MAAM,EAAY,EAAQ,QAAQ,EAE3B,gBAEtB,EAAQ,KACT,CAEuD,CAEzB,OACxB,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,QAAQ,MAAM,sCAAuC,EAAQ,CAC7D,EAAU,EAAI,EAAM,EAAQ,EAIhC,eAAe,EAAc,EAAuC,CAClE,GAAI,CACF,OAAQ,EAAQ,KAAhB,CACE,IAAK,OACH,MAAM,EAAW,EAAQ,CACzB,MACF,IAAK,UACH,MAAM,EAAc,EAAQ,CAC5B,MACF,IAAK,eACH,MAAM,EAAkB,EAAQ,CAChC,MACF,IAAK,iBACH,MAAM,EAAoB,EAAQ,CAClC,MACF,IAAK,mBACH,MAAM,EAAsB,EAAQ,CACpC,MACF,IAAK,gBACH,MAAM,EAAmB,EAAQ,CACjC,MACF,IAAK,0BACH,MAAM,EAA4B,EAAQ,CAC1C,MACF,IAAK,yBACH,MAAM,EAA2B,EAAQ,CACzC,MACF,IAAK,gCACH,MAAM,EAAiC,EAAQ,CAC/C,MACF,IAAK,iBACH,MAAM,EAAmB,EAAQ,CACjC,MACF,IAAK,oBACH,MAAM,EAAsB,EAAQ,CACpC,MACF,QACE,QAAQ,MAAM,qCAAsC,EAAQ,KAAK,QAE9D,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACtE,EAAU,EAAQ,GAAI,EAAQ,KAAM,EAAQ,EAIhD,EAAK,GAAG,UAAY,GAA2B,CACxC,EAAc,EAAQ,EAC3B"}
|