-
Notifications
You must be signed in to change notification settings - Fork 127
/
NodeFileReader.js
104 lines (83 loc) · 2.26 KB
/
NodeFileReader.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/**
* @flow
*/
'use strict';
const fs = require('fs');
const ChunkedFileData = require('./ChunkedFileData');
const MediaFileReader = require('./MediaFileReader');
import type {
LoadCallbackType
} from './FlowTypes';
class NodeFileReader extends MediaFileReader {
_path: string;
_fileData: ChunkedFileData;
constructor(path: string) {
super();
this._path = path;
this._fileData = new ChunkedFileData();
}
static canReadFile(file: any): boolean {
return (
typeof file === 'string' &&
!/^[a-z]+:\/\//i.test(file)
);
}
getByteAt(offset: number): number {
return this._fileData.getByteAt(offset);
}
_init(callbacks: LoadCallbackType) {
var self = this;
fs.stat(self._path, function(err, stats) {
if (err) {
if (callbacks.onError) {
callbacks.onError({"type": "fs", "info": err});
}
} else {
self._size = stats.size;
callbacks.onSuccess();
}
});
}
loadRange(range: [number, number], callbacks: LoadCallbackType) {
var fd = -1;
var self = this;
var fileData = this._fileData;
var length = range[1] - range[0] + 1;
var onSuccess = callbacks.onSuccess;
var onError = callbacks.onError || function(object){};
if (fileData.hasDataRange(range[0], range[1])) {
process.nextTick(onSuccess);
return;
}
var readData = function(err, _fd) {
if (err) {
onError({"type": "fs", "info": err});
return;
}
fd = _fd;
// TODO: Should create a pool of Buffer objects across all instances of
// NodeFileReader. This is fine for now.
var buffer = new Buffer(length);
fs.read(_fd, buffer, 0, length, range[0], processData);
};
var processData = function(err, bytesRead, buffer) {
fs.close(fd, function(err) {
if (err) {
console.error(err);
}
});
if (err) {
onError({"type": "fs", "info": err});
return;
}
storeBuffer(buffer);
onSuccess();
};
var storeBuffer = function(buffer) {
var data = Array.prototype.slice.call(buffer, 0, length);
fileData.addData(range[0], data);
}
fs.open(this._path, "r", undefined, readData);
}
}
module.exports = NodeFileReader;