Skip to content

Commit e24bd6c

Browse files
authored
Merge 0b2efd1 into b92ff14
2 parents b92ff14 + 0b2efd1 commit e24bd6c

File tree

1 file changed

+21
-1
lines changed
  • packages/cli/src/cmds/validator/keymanager/decryptKeystores

1 file changed

+21
-1
lines changed

packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,29 @@
11
import fs from "node:fs";
2+
import worker from "node:worker_threads";
23
import {expose} from "@chainsafe/threads/worker";
34
import {Transfer, TransferDescriptor} from "@chainsafe/threads";
45
import {Keystore} from "@chainsafe/bls-keystore";
56
import {DecryptKeystoreArgs, DecryptKeystoreWorkerAPI, isLocalKeystoreDefinition} from "./types.js";
67

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+
727
/**
828
* Decrypt a single keystore, returning the secret key as a Uint8Array
929
*
@@ -18,7 +38,7 @@ export async function decryptKeystore(args: DecryptKeystoreArgs): Promise<Transf
1838
const secret = await keystore.decrypt(args.password);
1939
// Transfer the underlying ArrayBuffer back to the main thread: https://threads.js.org/usage-advanced#transferable-objects
2040
// 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)]);
2242
}
2343

2444
expose({decryptKeystore} as unknown as DecryptKeystoreWorkerAPI);

0 commit comments

Comments
 (0)