Skip to content

Commit

Permalink
Revert "BlobManager: implement Blob from ArrayBuffer (facebook#39276)" (
Browse files Browse the repository at this point in the history
facebook#41170)

Summary:
As per facebook#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 facebook#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: facebook#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
  • Loading branch information
CodyJasonBennett authored and Othinn committed Jan 9, 2024
1 parent fc0d359 commit 5a81d42
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 23 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
14 changes: 6 additions & 8 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,19 @@ 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) {
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 5a81d42

Please sign in to comment.