-
Notifications
You must be signed in to change notification settings - Fork 128
/
Copy pathBlobFileReader.js
64 lines (53 loc) · 1.75 KB
/
BlobFileReader.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**
* @flow
*/
'use strict';
const ChunkedFileData = require('./ChunkedFileData');
const MediaFileReader = require('./MediaFileReader');
import type {
LoadCallbackType
} from './FlowTypes';
class BlobFileReader extends MediaFileReader {
_blob: Blob;
_fileData: ChunkedFileData;
constructor(blob: Blob) {
super();
this._blob = blob;
this._fileData = new ChunkedFileData();
}
static canReadFile(file: any): boolean {
return (
(typeof Blob !== "undefined" && file instanceof Blob) ||
// File extends Blob but it seems that File instanceof Blob doesn't
// quite work as expected in Cordova/PhoneGap.
(typeof File !== "undefined" && file instanceof File)
);
}
_init(callbacks: LoadCallbackType): void {
this._size = this._blob.size;
setTimeout(callbacks.onSuccess, 1);
}
loadRange(range: [number, number], callbacks: LoadCallbackType): void {
var self = this;
// $FlowIssue - flow isn't aware of mozSlice or webkitSlice
var blobSlice = this._blob.slice || this._blob.mozSlice || this._blob.webkitSlice;
var blob = blobSlice.call(this._blob, range[0], range[1] + 1);
var browserFileReader = new FileReader();
browserFileReader.onloadend = function(event) {
var intArray = new Uint8Array(browserFileReader.result);
self._fileData.addData(range[0], intArray);
callbacks.onSuccess();
};
browserFileReader.onerror =
browserFileReader.onabort = function(event) {
if (callbacks.onError) {
callbacks.onError({"type": "blob", "info": browserFileReader.error});
}
};
browserFileReader.readAsArrayBuffer(blob);
}
getByteAt(offset: number): number {
return this._fileData.getByteAt(offset);
}
}
module.exports = BlobFileReader;