From f862e1c5975f2440657f9b35254a763dc1c039e9 Mon Sep 17 00:00:00 2001 From: Feross Aboukhadijeh Date: Sun, 17 May 2015 00:05:00 -0700 Subject: fix regression: only return file data when it's done --- lib/storage.js | 56 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 21 deletions(-) (limited to 'lib') 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 () { -- cgit v1.2.3