Skip to content

Commit 3a51a6e

Browse files
committed
implement FileReader.readAsArrayBuffer
1 parent 9b1f3b1 commit 3a51a6e

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

Libraries/Blob/FileReader.js

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
'use strict';
1212

1313
const Blob = require('./Blob');
14+
const {toByteArray} = require('base64-js');
1415
const EventTarget = require('event-target-shim');
1516

1617
import NativeFileReaderModule from './NativeFileReaderModule';
@@ -81,8 +82,35 @@ class FileReader extends (EventTarget(...READER_EVENTS): any) {
8182
}
8283
}
8384

84-
readAsArrayBuffer() {
85-
throw new Error('FileReader.readAsArrayBuffer is not implemented');
85+
readAsArrayBuffer(blob: ?Blob) {
86+
this._aborted = false;
87+
88+
if (blob == null) {
89+
throw new TypeError(
90+
"Failed to execute 'readAsArrayBuffer' on 'FileReader': parameter 1 is not of type 'Blob'",
91+
);
92+
}
93+
94+
NativeFileReaderModule.readAsDataURL(blob.data).then(
95+
(text: string) => {
96+
if (this._aborted) {
97+
return;
98+
}
99+
100+
const base64 = text.split(',')[1];
101+
const typedArray = toByteArray(base64);
102+
103+
this._result = typedArray.buffer;
104+
this._setReadyState(DONE);
105+
},
106+
error => {
107+
if (this._aborted) {
108+
return;
109+
}
110+
this._error = error;
111+
this._setReadyState(DONE);
112+
},
113+
);
86114
}
87115

88116
readAsDataURL(blob: ?Blob) {

Libraries/Blob/__tests__/FileReader-test.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,15 @@ describe('FileReader', function() {
3838
});
3939
expect(e.target.result).toBe('data:text/plain;base64,NDI=');
4040
});
41+
42+
it('should read blob as ArrayBuffer', async () => {
43+
const e = await new Promise((resolve, reject) => {
44+
const reader = new FileReader();
45+
reader.onload = resolve;
46+
reader.onerror = reject;
47+
reader.readAsArrayBuffer(new Blob());
48+
});
49+
/* eslint-disable-next-line no-undef */
50+
expect(new TextDecoder().decode(e.target.result)).toBe('42');
51+
});
4152
});

0 commit comments

Comments
 (0)