diff --git a/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts b/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts index 711ec4f88b00..17b286a6554f 100644 --- a/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts +++ b/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts @@ -1,9 +1,29 @@ import fs from "node:fs"; +import worker from "node:worker_threads"; import {expose} from "@chainsafe/threads/worker"; import {Transfer, TransferDescriptor} from "@chainsafe/threads"; import {Keystore} from "@chainsafe/bls-keystore"; import {DecryptKeystoreArgs, DecryptKeystoreWorkerAPI, isLocalKeystoreDefinition} from "./types.js"; +/** + * @param buffer The ArrayBuffer to be returned as transferable + * @returns a buffer that can be transferred. If the provided buffer is marked as untransferable, a copy is returned + */ +function transferableArrayBuffer(buffer: ArrayBuffer): ArrayBuffer { + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment + const unknownWorker = worker as any; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment + const isMarkedAsUntransferable = unknownWorker["isMarkedAsUntransferable"]; + // Can be updated to direct access once minimal version of node is 21 + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + if (isMarkedAsUntransferable && isMarkedAsUntransferable(buffer)) { + // Return a copy of the buffer so that it can be transferred + return buffer.slice(0); + } else { + return buffer; + } +} + /** * Decrypt a single keystore, returning the secret key as a Uint8Array * @@ -18,7 +38,7 @@ export async function decryptKeystore(args: DecryptKeystoreArgs): Promise