Skip to content

Commit

Permalink
Revert "BlobManager: implement Blob from ArrayBuffer (facebook#39276)"
Browse files Browse the repository at this point in the history
  • Loading branch information
CodyJasonBennett committed Oct 24, 2023
1 parent 98e7ecd commit e0ab681
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 24 deletions.
5 changes: 1 addition & 4 deletions packages/react-native/Libraries/Blob/Blob.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
19 changes: 10 additions & 9 deletions packages/react-native/Libraries/Blob/BlobManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down Expand Up @@ -60,20 +59,22 @@ 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.');

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',
Expand Down
2 changes: 1 addition & 1 deletion packages/react-native/Libraries/Blob/File.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
) {
Expand Down
13 changes: 3 additions & 10 deletions packages/react-native/Libraries/Blob/__tests__/Blob-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {
Expand All @@ -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';
Expand All @@ -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('');
});
Expand Down

0 comments on commit e0ab681

Please sign in to comment.