From e0ab6816ffba2adc59b384b521ebcf233084cebf Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 24 Oct 2023 08:32:14 -0500 Subject: [PATCH 1/2] Revert "BlobManager: implement Blob from ArrayBuffer (#39276)" --- packages/react-native/Libraries/Blob/Blob.js | 5 +---- .../Libraries/Blob/BlobManager.js | 19 ++++++++++--------- packages/react-native/Libraries/Blob/File.js | 2 +- .../Libraries/Blob/__tests__/Blob-test.js | 13 +++---------- 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/packages/react-native/Libraries/Blob/Blob.js b/packages/react-native/Libraries/Blob/Blob.js index 98ae81ba84042a..886e257336411f 100644 --- a/packages/react-native/Libraries/Blob/Blob.js +++ b/packages/react-native/Libraries/Blob/Blob.js @@ -57,10 +57,7 @@ class Blob { * Currently we only support creating Blobs from other Blobs. * Reference: https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob */ - constructor( - parts: Array<$ArrayBufferView | ArrayBuffer | Blob | string> = [], - options?: BlobOptions, - ) { + constructor(parts: Array = [], options?: BlobOptions) { const BlobManager = require('./BlobManager'); this.data = BlobManager.createFromParts(parts, options).data; } diff --git a/packages/react-native/Libraries/Blob/BlobManager.js b/packages/react-native/Libraries/Blob/BlobManager.js index 73deaf6f9ff561..98e69112957d7b 100644 --- a/packages/react-native/Libraries/Blob/BlobManager.js +++ b/packages/react-native/Libraries/Blob/BlobManager.js @@ -11,7 +11,6 @@ import type {BlobCollector, BlobData, BlobOptions} from './BlobTypes'; import NativeBlobModule from './NativeBlobModule'; -import {fromByteArray} from 'base64-js'; import invariant from 'invariant'; const Blob = require('./Blob'); @@ -60,20 +59,22 @@ class BlobManager { * Create blob from existing array of blobs. */ static createFromParts( - parts: Array<$ArrayBufferView | ArrayBuffer | Blob | string>, + parts: Array, options?: BlobOptions, ): Blob { invariant(NativeBlobModule, 'NativeBlobModule is available.'); const blobId = uuidv4(); const items = parts.map(part => { - if (part instanceof ArrayBuffer || ArrayBuffer.isView(part)) { - return { - // $FlowFixMe[incompatible-cast] - data: fromByteArray(new Uint8Array((part: ArrayBuffer))), - type: 'string', - }; - } else if (part instanceof Blob) { + if ( + part instanceof ArrayBuffer || + (global.ArrayBufferView && part instanceof global.ArrayBufferView) + ) { + throw new Error( + "Creating blobs from 'ArrayBuffer' and 'ArrayBufferView' are not supported", + ); + } + if (part instanceof Blob) { return { data: part.data, type: 'blob', diff --git a/packages/react-native/Libraries/Blob/File.js b/packages/react-native/Libraries/Blob/File.js index c89744190ad965..6f643307c5d021 100644 --- a/packages/react-native/Libraries/Blob/File.js +++ b/packages/react-native/Libraries/Blob/File.js @@ -23,7 +23,7 @@ class File extends Blob { * Constructor for JS consumers. */ constructor( - parts: Array<$ArrayBufferView | ArrayBuffer | Blob | string>, + parts: Array, name: string, options?: BlobOptions, ) { diff --git a/packages/react-native/Libraries/Blob/__tests__/Blob-test.js b/packages/react-native/Libraries/Blob/__tests__/Blob-test.js index f33667c9ed6470..303fe1d9fb66bc 100644 --- a/packages/react-native/Libraries/Blob/__tests__/Blob-test.js +++ b/packages/react-native/Libraries/Blob/__tests__/Blob-test.js @@ -15,7 +15,6 @@ jest.setMock('../../BatchedBridge/NativeModules', { }); const Blob = require('../Blob'); -const {fromByteArray} = require('base64-js'); describe('Blob', function () { it('should create empty blob', () => { @@ -27,7 +26,7 @@ describe('Blob', function () { expect(blob.type).toBe(''); }); - it('should create blob from ArrayBuffer, other blobs, strings', () => { + it('should create blob from other blobs and strings', () => { const blobA = new Blob(); const blobB = new Blob(); const textA = 'i \u2665 dogs'; @@ -44,20 +43,14 @@ describe('Blob', function () { blobA.data.size = 34540; blobB.data.size = 65452; - const buffer = new ArrayBuffer(4); - - const blob = new Blob([blobA, blobB, textA, textB, textC, buffer]); + const blob = new Blob([blobA, blobB, textA, textB, textC]); expect(blob.size).toBe( blobA.size + blobB.size + global.Buffer.byteLength(textA, 'UTF-8') + global.Buffer.byteLength(textB, 'UTF-8') + - global.Buffer.byteLength(textC, 'UTF-8') + - global.Buffer.byteLength( - fromByteArray(new Uint8Array(buffer)), - 'UTF-8', - ), + global.Buffer.byteLength(textC, 'UTF-8'), ); expect(blob.type).toBe(''); }); From cb602de8ea1c244c4b660258b49824c508420281 Mon Sep 17 00:00:00 2001 From: Cody Bennett Date: Tue, 24 Oct 2023 08:37:36 -0500 Subject: [PATCH 2/2] BlobManager: prefer isView --- packages/react-native/Libraries/Blob/BlobManager.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/react-native/Libraries/Blob/BlobManager.js b/packages/react-native/Libraries/Blob/BlobManager.js index 98e69112957d7b..f4c5ed374995a4 100644 --- a/packages/react-native/Libraries/Blob/BlobManager.js +++ b/packages/react-native/Libraries/Blob/BlobManager.js @@ -66,10 +66,7 @@ class BlobManager { const blobId = uuidv4(); const items = parts.map(part => { - if ( - part instanceof ArrayBuffer || - (global.ArrayBufferView && part instanceof global.ArrayBufferView) - ) { + if (part instanceof ArrayBuffer || ArrayBuffer.isView(part)) { throw new Error( "Creating blobs from 'ArrayBuffer' and 'ArrayBufferView' are not supported", );