From 2d948b5b1cceb9fc0552db16f1a9202f55e9d21f Mon Sep 17 00:00:00 2001 From: wh201906 Date: Fri, 8 May 2026 22:58:09 +0800 Subject: [PATCH 1/2] Avoid .slice() if not necessary --- .../react-native-quick-crypto/src/utils/conversion.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/react-native-quick-crypto/src/utils/conversion.ts b/packages/react-native-quick-crypto/src/utils/conversion.ts index 3a9f7566..d2ce739f 100644 --- a/packages/react-native-quick-crypto/src/utils/conversion.ts +++ b/packages/react-native-quick-crypto/src/utils/conversion.ts @@ -93,7 +93,7 @@ export function rejectSharedArrayBuffer(buf: unknown): void { * Only use this when the caller separately tracks `byteOffset`/`byteLength` * and the native receiver needs to write back into the original memory * (e.g. `randomFill`). For data that will be read by native crypto, use - * `binaryLikeToArrayBuffer`/`toArrayBuffer` instead — those slice to the + * `binaryLikeToArrayBuffer`/`toArrayBuffer` instead — those return only the * view's region and won't leak unrelated bytes from the backing buffer. */ export const abvToArrayBuffer = (buf: ABV) => { @@ -109,7 +109,7 @@ export const abvToArrayBuffer = (buf: ABV) => { /** * Converts supplied argument to an ArrayBuffer. Note this copies data if the - * supplied buffer has the .slice() method, so can be a bit slow. + * supplied buffer represents a subrange of the internal buffer * @param buf * @returns ArrayBuffer */ @@ -117,13 +117,13 @@ export function toArrayBuffer( buf: CraftzdogBuffer | SafeBuffer | ArrayBufferView, ): ArrayBuffer { if (CraftzdogBuffer.isBuffer(buf) || ArrayBuffer.isView(buf)) { - if (buf?.buffer?.slice) { + if (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) { + return buf.buffer as ArrayBuffer; + } else { return buf.buffer.slice( buf.byteOffset, buf.byteOffset + buf.byteLength, ) as ArrayBuffer; - } else { - return buf.buffer as ArrayBuffer; } } const ab = new ArrayBuffer(buf.length); From 1dd1d1ab29e0cd767b545cec81caf4da80538443 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Tue, 12 May 2026 09:43:54 +0800 Subject: [PATCH 2/2] Update docstring --- packages/react-native-quick-crypto/src/utils/conversion.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/react-native-quick-crypto/src/utils/conversion.ts b/packages/react-native-quick-crypto/src/utils/conversion.ts index d2ce739f..c8a7fde2 100644 --- a/packages/react-native-quick-crypto/src/utils/conversion.ts +++ b/packages/react-native-quick-crypto/src/utils/conversion.ts @@ -108,8 +108,10 @@ export const abvToArrayBuffer = (buf: ABV) => { }; /** - * Converts supplied argument to an ArrayBuffer. Note this copies data if the - * supplied buffer represents a subrange of the internal buffer + * Converts supplied argument to an ArrayBuffer. Note this copies data + * only when the supplied view represents a subrange of the underlying + * ArrayBuffer; otherwise the backing buffer is returned directly + * (aliased — do not mutate after passing). * @param buf * @returns ArrayBuffer */