1
1
import fs from "node:fs" ;
2
+ import worker from "node:worker_threads" ;
2
3
import { expose } from "@chainsafe/threads/worker" ;
3
4
import { Transfer , TransferDescriptor } from "@chainsafe/threads" ;
4
5
import { Keystore } from "@chainsafe/bls-keystore" ;
5
6
import { DecryptKeystoreArgs , DecryptKeystoreWorkerAPI , isLocalKeystoreDefinition } from "./types.js" ;
6
7
8
+ /**
9
+ * @param buffer The ArrayBuffer to be returned as transferable
10
+ * @returns a buffer that can be transferred. If the provided buffer is marked as untransferable, a copy is returned
11
+ */
12
+ function transferableArrayBuffer ( buffer : ArrayBuffer ) : ArrayBuffer {
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment
14
+ const unknownWorker = worker as any ;
15
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment
16
+ const isMarkedAsUntransferable = unknownWorker [ "isMarkedAsUntransferable" ] ;
17
+ // Can be updated to direct access once minimal version of node is 21
18
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
19
+ if ( isMarkedAsUntransferable && isMarkedAsUntransferable ( buffer ) ) {
20
+ // Return a copy of the buffer so that it can be transferred
21
+ return buffer . slice ( 0 ) ;
22
+ } else {
23
+ return buffer ;
24
+ }
25
+ }
26
+
7
27
/**
8
28
* Decrypt a single keystore, returning the secret key as a Uint8Array
9
29
*
@@ -18,7 +38,7 @@ export async function decryptKeystore(args: DecryptKeystoreArgs): Promise<Transf
18
38
const secret = await keystore . decrypt ( args . password ) ;
19
39
// Transfer the underlying ArrayBuffer back to the main thread: https://threads.js.org/usage-advanced#transferable-objects
20
40
// This small performance gain may help in cases where this is run for many keystores
21
- return Transfer ( secret , [ secret . buffer ] ) ;
41
+ return Transfer ( secret , [ transferableArrayBuffer ( secret . buffer ) ] ) ;
22
42
}
23
43
24
44
expose ( { decryptKeystore} as unknown as DecryptKeystoreWorkerAPI ) ;
0 commit comments