Spaces:
Sleeping
Sleeping
; | |
const call = require('./call'); | |
module.exports = stat; | |
/** | |
* Retrieves the {@link fs.Stats} for the given path. If the path is a symbolic link, | |
* then the Stats of the symlink's target are returned instead. If the symlink is broken, | |
* then the Stats of the symlink itself are returned. | |
* | |
* @param {object} fs - Synchronous or Asynchronouse facade for the "fs" module | |
* @param {string} path - The path to return stats for | |
* @param {function} callback | |
*/ | |
function stat (fs, path, callback) { | |
let isSymLink = false; | |
call.safe(fs.lstat, path, (err, lstats) => { | |
if (err) { | |
// fs.lstat threw an eror | |
return callback(err); | |
} | |
try { | |
isSymLink = lstats.isSymbolicLink(); | |
} | |
catch (err2) { | |
// lstats.isSymbolicLink() threw an error | |
// (probably because fs.lstat returned an invalid result) | |
return callback(err2); | |
} | |
if (isSymLink) { | |
// Try to resolve the symlink | |
symlinkStat(fs, path, lstats, callback); | |
} | |
else { | |
// It's not a symlink, so return the stats as-is | |
callback(null, lstats); | |
} | |
}); | |
} | |
/** | |
* Retrieves the {@link fs.Stats} for the target of the given symlink. | |
* If the symlink is broken, then the Stats of the symlink itself are returned. | |
* | |
* @param {object} fs - Synchronous or Asynchronouse facade for the "fs" module | |
* @param {string} path - The path of the symlink to return stats for | |
* @param {object} lstats - The stats of the symlink | |
* @param {function} callback | |
*/ | |
function symlinkStat (fs, path, lstats, callback) { | |
call.safe(fs.stat, path, (err, stats) => { | |
if (err) { | |
// The symlink is broken, so return the stats for the link itself | |
return callback(null, lstats); | |
} | |
try { | |
// Return the stats for the resolved symlink target, | |
// and override the `isSymbolicLink` method to indicate that it's a symlink | |
stats.isSymbolicLink = () => true; | |
} | |
catch (err2) { | |
// Setting stats.isSymbolicLink threw an error | |
// (probably because fs.stat returned an invalid result) | |
return callback(err2); | |
} | |
callback(null, stats); | |
}); | |
} | |