Revert "BlobManager: implement Blob from ArrayBuffer (#39276)" (#41170)

Summary:
As per https://github.com/facebook/react-native/issues/41079, we're outputting ASCII encoded data URIs to `FileReader.readAsDataURL` due to lack of native `ArrayBuffer` support and unclear use of encoding to align with web. I'll revisit this at a later point with a better testing strategy once we have a good idea of how this should behave internally.

Aside from purely reverting https://github.com/facebook/react-native/issues/39276, I've kept the use of `ArrayBuffer.isView(part)` to the previous `part instanceof global.ArrayBufferView` since it is more correct.

## Changelog:

[INTERNAL] [REMOVED] - Revert Blob from ArrayBuffer

Pull Request resolved: https://github.com/facebook/react-native/pull/41170

Test Plan:
Run the following at the project root to selectively test changes:

`jest packages/react-native/Libraries/Blob`

Reviewed By: cipolleschi

Differential Revision: D50601036

Pulled By: dmytrorykun

fbshipit-source-id: 0ef5c960c253db255c2f8532ea1f44111093706c
This commit is contained in:
Cody Bennett
2023-10-31 11:58:27 -07:00
committed by Facebook GitHub Bot
parent 37e509f2b6
commit 572dd76ba0
4 changed files with 11 additions and 23 deletions
+1 -4
View File
@@ -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<Blob | string> = [], options?: BlobOptions) {
const BlobManager = require('./BlobManager');
this.data = BlobManager.createFromParts(parts, options).data;
}
+6 -8
View File
@@ -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,7 +59,7 @@ class BlobManager {
* Create blob from existing array of blobs.
*/
static createFromParts(
parts: Array<$ArrayBufferView | ArrayBuffer | Blob | string>,
parts: Array<Blob | string>,
options?: BlobOptions,
): Blob {
invariant(NativeBlobModule, 'NativeBlobModule is available.');
@@ -68,12 +67,11 @@ class BlobManager {
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) {
throw new Error(
"Creating blobs from 'ArrayBuffer' and 'ArrayBufferView' are not supported",
);
}
if (part instanceof Blob) {
return {
data: part.data,
type: 'blob',
+1 -1
View File
@@ -23,7 +23,7 @@ class File extends Blob {
* Constructor for JS consumers.
*/
constructor(
parts: Array<$ArrayBufferView | ArrayBuffer | Blob | string>,
parts: Array<Blob | string>,
name: string,
options?: BlobOptions,
) {
+3 -10
View File
@@ -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('');
});