diff options
author | Feross Aboukhadijeh <feross@feross.org> | 2015-05-17 10:05:00 +0300 |
---|---|---|
committer | Feross Aboukhadijeh <feross@feross.org> | 2015-05-17 10:05:00 +0300 |
commit | f862e1c5975f2440657f9b35254a763dc1c039e9 (patch) | |
tree | 24c946e9bd389e99e001d36b9ae645c079a440d0 /lib | |
parent | 659ea7d3303f0259d963e954246aaf0d8aeb68a7 (diff) |
fix regression: only return file data when it's done
Diffstat (limited to 'lib')
-rw-r--r-- | lib/storage.js | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/lib/storage.js b/lib/storage.js index 30fe9a9..f4832f0 100644 --- a/lib/storage.js +++ b/lib/storage.js @@ -283,10 +283,22 @@ File.prototype.getBlobURL = function (cb) { return cb(new Error('file.blobURL requires window.URL and window.Blob support')) } - // Use the existing in-memory buffer for better memory utilization and one less copy. - var buffer = self.storage.buffer.slice(self.offset, self.offset + self.length) - var url = window.URL.createObjectURL(new window.Blob([ buffer ])) - cb(null, url) + function onBuffer (err, buffer) { + if (err) return cb(err) + var url = window.URL.createObjectURL(new window.Blob([ buffer ])) + cb(null, url) + } + + if (self.storage.buffer) { + // Use the in-memory buffer (when possible) for better memory utilization + var onDone = function () { + onBuffer(null, self.storage.buffer.slice(self.offset, self.offset + self.length)) + } + if (self.done) onDone() + else self.once('done', onDone) + } else { + self.getBuffer(onBuffer) + } } /** @@ -296,26 +308,28 @@ File.prototype.getBuffer = function (cb) { var self = this cb = dezalgo(once(cb)) - // Use the in-memory buffer (when possible) for better memory utilization and one less - // copy. var buffer if (self.storage.buffer) { - buffer = self.storage.buffer.slice(self.offset, self.offset + self.length) - cb(null, buffer) - return - } - - buffer = new Buffer(self.length) - var start = 0 - self.createReadStream() - .on('data', function (chunk) { - chunk.copy(buffer, start) - start += chunk.length - }) - .on('end', function () { + // Use the in-memory buffer (when possible) for better memory utilization + var onDone = function () { + buffer = self.storage.buffer.slice(self.offset, self.offset + self.length) cb(null, buffer) - }) - .on('error', cb) + } + if (self.done) onDone() + else self.once('done', onDone) + } else { + buffer = new Buffer(self.length) + var start = 0 + self.createReadStream() + .on('data', function (chunk) { + chunk.copy(buffer, start) + start += chunk.length + }) + .on('end', function () { + cb(null, buffer) + }) + .on('error', cb) + } } File.prototype._checkDone = function () { |