From 220892bc6184fffc77706235dfa75e198dfcff89 Mon Sep 17 00:00:00 2001 From: RedHatter Date: Tue, 15 Aug 2017 00:52:10 -0700 Subject: [PATCH] Handle streams without backing files. --- lib/BrowserifyCache.js | 2 +- lib/invalidateCache.js | 38 +++++++++++++++++++++++++++++++-- lib/invalidateDependentFiles.js | 2 +- lib/invalidateModifiedFiles.js | 11 ++++++++-- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/lib/BrowserifyCache.js b/lib/BrowserifyCache.js index 3ce6fdc..27203b4 100644 --- a/lib/BrowserifyCache.js +++ b/lib/BrowserifyCache.js @@ -93,7 +93,7 @@ function attachCacheHooksToPipeline(b) { function invalidateCacheBeforeBundling(b, done) { var cache = BrowserifyCache.getCache(b); - invalidateCache(cache.mtimes, cache.modules, function(err, invalidated, deleted) { + invalidateCache(b, cache.mtimes, cache.modules, function(err, invalidated, deleted) { invalidateDependentFiles(cache, [].concat(invalidated, deleted), function(err) { b.emit('changedDeps', invalidated, deleted); done(err, invalidated); diff --git a/lib/invalidateCache.js b/lib/invalidateCache.js index ef657c6..8721ce1 100644 --- a/lib/invalidateCache.js +++ b/lib/invalidateCache.js @@ -1,12 +1,46 @@ var assertExists = require('./assertExists'); var invalidateModifiedFiles = require('./invalidateModifiedFiles'); -function invalidateCache(mtimes, cache, done) { +function invalidateCache(b, mtimes, cache, done) { assertExists(mtimes); invalidateModifiedFiles(mtimes, Object.keys(cache), function(file) { delete cache[file]; - }, done); + }, function (file) { + return invalidateModifiedStream(b, cache, file) + }, function(err, invalidated, deleted) { + if (deferedQueue.length > 0) { + b.on('_ready', function () { + invalidated = invalidated.concat(deferedQueue.filter(function (file) { + return invalidateModifiedStream(b, cache, file) + })) + done(err, invalidated, deleted) + }) + + return + } + + done(err, invalidated, deleted) + }); +} + +var deferedQueue = []; +function invalidateModifiedStream(b, cache, file) { + if (b._pending > 0) { + deferedQueue.push(file); + return false; + } + + var record = b._recorded.find(function (record) { + return record.file == file; + }) + + if (cache[file].source != record.source) { + delete cache[file]; + return true; + } + + return false; } module.exports = invalidateCache; diff --git a/lib/invalidateDependentFiles.js b/lib/invalidateDependentFiles.js index 73b9112..5867403 100644 --- a/lib/invalidateDependentFiles.js +++ b/lib/invalidateDependentFiles.js @@ -22,7 +22,7 @@ function invalidateDependentFiles(cache, invalidatedModules, done) { Object.keys(dependentFiles[dependentFile]).forEach(function(module) { delete cache.modules[module]; }); - }, function(err) { done(err); }); + }, null, function(err) { done(err); }); } module.exports = invalidateDependentFiles; diff --git a/lib/invalidateModifiedFiles.js b/lib/invalidateModifiedFiles.js index eb93819..3afb619 100644 --- a/lib/invalidateModifiedFiles.js +++ b/lib/invalidateModifiedFiles.js @@ -3,13 +3,20 @@ var async = require('async'); var CONCURRENCY_LIMIT = 40; -function invalidateModifiedFiles(mtimes, files, invalidate, done) { +function invalidateModifiedFiles(mtimes, files, invalidate, defer, done) { var invalidated = []; var deleted = []; async.eachLimit(files, CONCURRENCY_LIMIT, function(file, fileDone) { fs.stat(file, function(err, stat) { if (err) { - deleted.push(file); + // If the cache doesn't have any modification times it's a stream + if (!mtimes[file] && defer) { + if (defer(file)) { + invalidated.push(file) + } + } else { + deleted.push(file); + } return fileDone(); } var mtimeNew = stat.mtime.getTime();