From 48e640261855b42f37befdf4141375a42c53c1ef Mon Sep 17 00:00:00 2001 From: Julien Eluard Date: Thu, 4 Jan 2024 14:47:36 +0100 Subject: [PATCH 1/2] fix: ensure transfered ArrayBuffer are Transferable --- .../keymanager/decryptKeystores/worker.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts b/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts index 711ec4f88b00..b913c00b883c 100644 --- a/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts +++ b/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts @@ -1,9 +1,26 @@ 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) { + const unknown_worker = worker as any; + const isMarkedAsUntransferable = unknown_worker["isMarkedAsUntransferable"]; + // Can be updated to direct access once minimal version of node is 21 + 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 +35,7 @@ export async function decryptKeystore(args: DecryptKeystoreArgs): Promise Date: Thu, 4 Jan 2024 16:41:30 +0100 Subject: [PATCH 2/2] fix: lints --- .../validator/keymanager/decryptKeystores/worker.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts b/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts index b913c00b883c..17b286a6554f 100644 --- a/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts +++ b/packages/cli/src/cmds/validator/keymanager/decryptKeystores/worker.ts @@ -1,18 +1,21 @@ import fs from "node:fs"; -import worker from 'node:worker_threads'; +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 + * @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) { - const unknown_worker = worker as any; - const isMarkedAsUntransferable = unknown_worker["isMarkedAsUntransferable"]; +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);