From 50d6e48b7da4a7fe7224b78010d2fd4f1567bf18 Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Thu, 7 Aug 2025 13:06:20 +0200 Subject: [PATCH 1/5] fix: Disable base64 optimization in ReactNative --- packages/snaps-utils/src/base64.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snaps-utils/src/base64.ts b/packages/snaps-utils/src/base64.ts index fd0ba07d54..9407e6f134 100644 --- a/packages/snaps-utils/src/base64.ts +++ b/packages/snaps-utils/src/base64.ts @@ -12,7 +12,7 @@ import type { VirtualFile } from './virtual-file'; export async function encodeBase64(input: Uint8Array | VirtualFile | string) { const bytes = getBytes(input); // In the browser, FileReader is much faster than bytesToBase64. - if ('FileReader' in globalThis) { + if ('FileReader' in globalThis && navigator.product !== 'ReactNative') { return await new Promise((resolve, reject) => { const reader = Object.assign(new FileReader(), { onload: () => From 94b049b01e517968636a469d3c84d7f5f328f92b Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Thu, 7 Aug 2025 13:10:53 +0200 Subject: [PATCH 2/5] Optional chain navigator --- packages/snaps-utils/src/base64.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snaps-utils/src/base64.ts b/packages/snaps-utils/src/base64.ts index 9407e6f134..437bae795d 100644 --- a/packages/snaps-utils/src/base64.ts +++ b/packages/snaps-utils/src/base64.ts @@ -12,7 +12,7 @@ import type { VirtualFile } from './virtual-file'; export async function encodeBase64(input: Uint8Array | VirtualFile | string) { const bytes = getBytes(input); // In the browser, FileReader is much faster than bytesToBase64. - if ('FileReader' in globalThis && navigator.product !== 'ReactNative') { + if ('FileReader' in globalThis && navigator?.product !== 'ReactNative') { return await new Promise((resolve, reject) => { const reader = Object.assign(new FileReader(), { onload: () => From 6374f0e8dee2a13aa8d79c6ded1fc663e7d5ddc5 Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Thu, 7 Aug 2025 13:12:32 +0200 Subject: [PATCH 3/5] Update comment Co-authored-by: Maarten Zuidhoorn --- packages/snaps-utils/src/base64.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/snaps-utils/src/base64.ts b/packages/snaps-utils/src/base64.ts index 437bae795d..afda76c8e4 100644 --- a/packages/snaps-utils/src/base64.ts +++ b/packages/snaps-utils/src/base64.ts @@ -11,7 +11,7 @@ import type { VirtualFile } from './virtual-file'; */ export async function encodeBase64(input: Uint8Array | VirtualFile | string) { const bytes = getBytes(input); - // In the browser, FileReader is much faster than bytesToBase64. + // In the browser, FileReader is much faster than bytesToBase64. This is not supported in React Native however. if ('FileReader' in globalThis && navigator?.product !== 'ReactNative') { return await new Promise((resolve, reject) => { const reader = Object.assign(new FileReader(), { From 3f11a9ece80a5e83ccbe2e6d04286687f8532e79 Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Thu, 7 Aug 2025 13:24:46 +0200 Subject: [PATCH 4/5] Tweak RN check --- packages/snaps-utils/src/base64.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/snaps-utils/src/base64.ts b/packages/snaps-utils/src/base64.ts index afda76c8e4..137d10ff45 100644 --- a/packages/snaps-utils/src/base64.ts +++ b/packages/snaps-utils/src/base64.ts @@ -11,8 +11,10 @@ import type { VirtualFile } from './virtual-file'; */ export async function encodeBase64(input: Uint8Array | VirtualFile | string) { const bytes = getBytes(input); + const isReactNative = + typeof navigator !== 'undefined' && navigator.product === 'ReactNative'; // In the browser, FileReader is much faster than bytesToBase64. This is not supported in React Native however. - if ('FileReader' in globalThis && navigator?.product !== 'ReactNative') { + if ('FileReader' in globalThis && !isReactNative) { return await new Promise((resolve, reject) => { const reader = Object.assign(new FileReader(), { onload: () => From a4b236357a01afcb6215bea265cd48da367c9dc5 Mon Sep 17 00:00:00 2001 From: Frederik Bolding Date: Thu, 7 Aug 2025 13:41:20 +0200 Subject: [PATCH 5/5] Fix coverage --- packages/snaps-utils/src/base64.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/snaps-utils/src/base64.test.ts b/packages/snaps-utils/src/base64.test.ts index b6134e8dde..46e4024dce 100644 --- a/packages/snaps-utils/src/base64.test.ts +++ b/packages/snaps-utils/src/base64.test.ts @@ -51,6 +51,21 @@ describe('encodeBase64', () => { ); expect(await encodeBase64(vfile)).toBe('eyJmb28iOiJiYXIifQ=='); }); + + it('does not use optimization when running in React Native', async () => { + Object.defineProperty(globalThis, 'FileReader', { + value: MockFileReader, + }); + + Object.defineProperty(globalThis, 'navigator', { + value: { product: 'ReactNative' }, + }); + + const vfile = new VirtualFile( + stringToBytes(JSON.stringify({ foo: 'bar' })), + ); + expect(await encodeBase64(vfile)).toBe('eyJmb28iOiJiYXIifQ=='); + }); }); describe('decodeBase64', () => {