graceful-fs
Advanced tools
Comparing version 4.2.1 to 4.2.2
@@ -6,6 +6,18 @@ var fs = require('fs') | ||
var queue = [] | ||
var util = require('util') | ||
/* istanbul ignore next - node 0.x polyfill */ | ||
var gracefulQueue | ||
var previousSymbol | ||
/* istanbul ignore else - node 0.x polyfill */ | ||
if (typeof Symbol === 'function' && typeof Symbol.for === 'function') { | ||
gracefulQueue = Symbol.for('graceful-fs.queue') | ||
// This is used in testing by future versions | ||
previousSymbol = Symbol.for('graceful-fs.previous') | ||
} else { | ||
gracefulQueue = '___graceful-fs.queue' | ||
previousSymbol = '___graceful-fs.previous' | ||
} | ||
function noop () {} | ||
@@ -23,7 +35,54 @@ | ||
if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { | ||
process.on('exit', function() { | ||
debug(queue) | ||
require('assert').equal(queue.length, 0) | ||
// Once time initialization | ||
if (!global[gracefulQueue]) { | ||
// This queue can be shared by multiple loaded instances | ||
var queue = [] | ||
Object.defineProperty(global, gracefulQueue, { | ||
get: function() { | ||
return queue | ||
} | ||
}) | ||
// Patch fs.close/closeSync to shared queue version, because we need | ||
// to retry() whenever a close happens *anywhere* in the program. | ||
// This is essential when multiple graceful-fs instances are | ||
// in play at the same time. | ||
fs.close = (function (fs$close) { | ||
function close (fd, cb) { | ||
return fs$close.call(fs, fd, function (err) { | ||
// This function uses the graceful-fs shared queue | ||
if (!err) { | ||
retry() | ||
} | ||
if (typeof cb === 'function') | ||
cb.apply(this, arguments) | ||
}) | ||
} | ||
Object.defineProperty(close, previousSymbol, { | ||
value: fs$close | ||
}) | ||
return close | ||
})(fs.close) | ||
fs.closeSync = (function (fs$closeSync) { | ||
function closeSync (fd) { | ||
// This function uses the graceful-fs shared queue | ||
fs$closeSync.apply(fs, arguments) | ||
retry() | ||
} | ||
Object.defineProperty(closeSync, previousSymbol, { | ||
value: fs$closeSync | ||
}) | ||
return closeSync | ||
})(fs.closeSync) | ||
if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { | ||
process.on('exit', function() { | ||
debug(global[gracefulQueue]) | ||
require('assert').equal(global[gracefulQueue].length, 0) | ||
}) | ||
} | ||
} | ||
@@ -37,35 +96,2 @@ | ||
// Always patch fs.close/closeSync, because we want to | ||
// retry() whenever a close happens *anywhere* in the program. | ||
// This is essential when multiple graceful-fs instances are | ||
// in play at the same time. | ||
module.exports.close = (function (fs$close) { return function (fd, cb) { | ||
return fs$close.call(fs, fd, function (err) { | ||
if (!err) | ||
retry() | ||
if (typeof cb === 'function') | ||
cb.apply(this, arguments) | ||
}) | ||
}})(fs.close) | ||
module.exports.closeSync = (function (fs$closeSync) { return function (fd) { | ||
// Note that graceful-fs also retries when fs.closeSync() fails. | ||
// Looks like a bug to me, although it's probably a harmless one. | ||
var rval = fs$closeSync.apply(fs, arguments) | ||
retry() | ||
return rval | ||
}})(fs.closeSync) | ||
// Only patch fs once, otherwise we'll run into a memory leak if | ||
// graceful-fs is loaded multiple times, such as in test environments that | ||
// reset the loaded modules between tests. | ||
// We look for the string `graceful-fs` from the comment above. This | ||
// way we are not adding any extra properties and it will detect if older | ||
// versions of graceful-fs are installed. | ||
if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { | ||
fs.closeSync = module.exports.closeSync; | ||
fs.close = module.exports.close; | ||
} | ||
function patch (fs) { | ||
@@ -75,4 +101,3 @@ // Everything that references the open() function needs to be in here | ||
fs.gracefulify = patch | ||
fs.FileReadStream = ReadStream; // Legacy name. | ||
fs.FileWriteStream = WriteStream; // Legacy name. | ||
fs.createReadStream = createReadStream | ||
@@ -194,5 +219,45 @@ fs.createWriteStream = createWriteStream | ||
fs.ReadStream = ReadStream | ||
fs.WriteStream = WriteStream | ||
Object.defineProperty(fs, 'ReadStream', { | ||
get: function () { | ||
return ReadStream | ||
}, | ||
set: function (val) { | ||
ReadStream = val | ||
}, | ||
enumerable: true, | ||
configurable: true | ||
}) | ||
Object.defineProperty(fs, 'WriteStream', { | ||
get: function () { | ||
return WriteStream | ||
}, | ||
set: function (val) { | ||
WriteStream = val | ||
}, | ||
enumerable: true, | ||
configurable: true | ||
}) | ||
// legacy names | ||
Object.defineProperty(fs, 'FileReadStream', { | ||
get: function () { | ||
return ReadStream | ||
}, | ||
set: function (val) { | ||
ReadStream = val | ||
}, | ||
enumerable: true, | ||
configurable: true | ||
}) | ||
Object.defineProperty(fs, 'FileWriteStream', { | ||
get: function () { | ||
return WriteStream | ||
}, | ||
set: function (val) { | ||
WriteStream = val | ||
}, | ||
enumerable: true, | ||
configurable: true | ||
}) | ||
function ReadStream (path, options) { | ||
@@ -242,7 +307,7 @@ if (this instanceof ReadStream) | ||
function createReadStream (path, options) { | ||
return new ReadStream(path, options) | ||
return new fs.ReadStream(path, options) | ||
} | ||
function createWriteStream (path, options) { | ||
return new WriteStream(path, options) | ||
return new fs.WriteStream(path, options) | ||
} | ||
@@ -276,7 +341,7 @@ | ||
debug('ENQUEUE', elem[0].name, elem[1]) | ||
queue.push(elem) | ||
global[gracefulQueue].push(elem) | ||
} | ||
function retry () { | ||
var elem = queue.shift() | ||
var elem = global[gracefulQueue].shift() | ||
if (elem) { | ||
@@ -283,0 +348,0 @@ debug('RETRY', elem[0].name, elem[1]) |
{ | ||
"name": "graceful-fs", | ||
"description": "A drop-in replacement for fs, making various improvements.", | ||
"version": "4.2.1", | ||
"version": "4.2.2", | ||
"repository": { | ||
@@ -6,0 +6,0 @@ "type": "git", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
27502
707