diff --git a/Libraries/Blob/FileReader.js b/Libraries/Blob/FileReader.js index c58dfba687df62..6cb2e33b6b02c2 100644 --- a/Libraries/Blob/FileReader.js +++ b/Libraries/Blob/FileReader.js @@ -9,6 +9,7 @@ */ const Blob = require('./Blob'); +const {toByteArray} = require('base64-js'); const EventTarget = require('event-target-shim'); import NativeFileReaderModule from './NativeFileReaderModule'; @@ -79,8 +80,35 @@ class FileReader extends (EventTarget(...READER_EVENTS): any) { } } - readAsArrayBuffer() { - throw new Error('FileReader.readAsArrayBuffer is not implemented'); + readAsArrayBuffer(blob: ?Blob) { + this._aborted = false; + + if (blob == null) { + throw new TypeError( + "Failed to execute 'readAsArrayBuffer' on 'FileReader': parameter 1 is not of type 'Blob'", + ); + } + + NativeFileReaderModule.readAsDataURL(blob.data).then( + (text: string) => { + if (this._aborted) { + return; + } + + const base64 = text.split(',')[1]; + const typedArray = toByteArray(base64); + + this._result = typedArray.buffer; + this._setReadyState(DONE); + }, + error => { + if (this._aborted) { + return; + } + this._error = error; + this._setReadyState(DONE); + }, + ); } readAsDataURL(blob: ?Blob) { diff --git a/Libraries/Blob/__tests__/FileReader-test.js b/Libraries/Blob/__tests__/FileReader-test.js index 8ae1c81a31f8a8..3857178ac97fb9 100644 --- a/Libraries/Blob/__tests__/FileReader-test.js +++ b/Libraries/Blob/__tests__/FileReader-test.js @@ -38,4 +38,15 @@ describe('FileReader', function () { }); expect(e.target.result).toBe('data:text/plain;base64,NDI='); }); + + it('should read blob as ArrayBuffer', async () => { + const e = await new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = resolve; + reader.onerror = reject; + reader.readAsArrayBuffer(new Blob()); + }); + /* eslint-disable-next-line no-undef */ + expect(new TextDecoder().decode(e.target.result)).toBe('42'); + }); });