@ -16,9 +16,11 @@ const EventEmitter = require('events');
const FSReqWrap = binding . FSReqWrap ;
const FSEvent = process . binding ( 'fs_event_wrap' ) . FSEvent ;
const internalFS = require ( 'internal/fs' ) ;
const internalURL = require ( 'internal/url' ) ;
const assertEncoding = internalFS . assertEncoding ;
const stringToFlags = internalFS . stringToFlags ;
const SyncWriteStream = internalFS . SyncWriteStream ;
const getPathFromURL = internalURL . getPathFromURL ;
Object . defineProperty ( exports , 'constants' , {
configurable : false ,
@ -202,6 +204,16 @@ fs.Stats.prototype.isSocket = function() {
} ) ;
} ) ;
function handleError ( val , callback ) {
if ( val instanceof Error ) {
if ( typeof callback === 'function' ) {
process . nextTick ( callback , val ) ;
return true ;
} else throw val ;
}
return false ;
}
fs . access = function ( path , mode , callback ) {
if ( typeof mode === 'function' ) {
callback = mode ;
@ -210,6 +222,9 @@ fs.access = function(path, mode, callback) {
throw new TypeError ( '"callback" argument must be a function' ) ;
}
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) )
return ;
@ -220,6 +235,7 @@ fs.access = function(path, mode, callback) {
} ;
fs . accessSync = function ( path , mode ) {
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
if ( mode === undefined )
@ -231,6 +247,8 @@ fs.accessSync = function(path, mode) {
} ;
fs . exists = function ( path , callback ) {
if ( handleError ( ( path = getPathFromURL ( path ) ) , cb ) )
return ;
if ( ! nullCheck ( path , cb ) ) return ;
var req = new FSReqWrap ( ) ;
req . oncomplete = cb ;
@ -242,6 +260,7 @@ fs.exists = function(path, callback) {
fs . existsSync = function ( path ) {
try {
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
binding . stat ( pathModule . _ makeLong ( path ) ) ;
return true ;
@ -254,6 +273,8 @@ fs.readFile = function(path, options, callback) {
callback = maybeCallback ( arguments [ arguments . length - 1 ] ) ;
options = getOptions ( options , { flag : 'r' } ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) )
return ;
@ -537,6 +558,8 @@ fs.open = function(path, flags, mode, callback_) {
var callback = makeCallback ( arguments [ arguments . length - 1 ] ) ;
mode = modeNum ( mode , 0o666 ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) ) return ;
var req = new FSReqWrap ( ) ;
@ -550,6 +573,7 @@ fs.open = function(path, flags, mode, callback_) {
fs . openSync = function ( path , flags , mode ) {
mode = modeNum ( mode , 0o666 ) ;
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
return binding . open ( pathModule . _ makeLong ( path ) , stringToFlags ( flags ) , mode ) ;
} ;
@ -645,6 +669,12 @@ fs.writeSync = function(fd, buffer, offset, length, position) {
fs . rename = function ( oldPath , newPath , callback ) {
callback = makeCallback ( callback ) ;
if ( handleError ( ( oldPath = getPathFromURL ( oldPath ) ) , callback ) )
return ;
if ( handleError ( ( newPath = getPathFromURL ( newPath ) ) , callback ) )
return ;
if ( ! nullCheck ( oldPath , callback ) ) return ;
if ( ! nullCheck ( newPath , callback ) ) return ;
var req = new FSReqWrap ( ) ;
@ -655,6 +685,8 @@ fs.rename = function(oldPath, newPath, callback) {
} ;
fs . renameSync = function ( oldPath , newPath ) {
handleError ( ( oldPath = getPathFromURL ( oldPath ) ) ) ;
handleError ( ( newPath = getPathFromURL ( newPath ) ) ) ;
nullCheck ( oldPath ) ;
nullCheck ( newPath ) ;
return binding . rename ( pathModule . _ makeLong ( oldPath ) ,
@ -726,6 +758,8 @@ fs.ftruncateSync = function(fd, len) {
fs . rmdir = function ( path , callback ) {
callback = maybeCallback ( callback ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) ) return ;
var req = new FSReqWrap ( ) ;
req . oncomplete = callback ;
@ -733,6 +767,7 @@ fs.rmdir = function(path, callback) {
} ;
fs . rmdirSync = function ( path ) {
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
return binding . rmdir ( pathModule . _ makeLong ( path ) ) ;
} ;
@ -760,6 +795,8 @@ fs.fsyncSync = function(fd) {
fs . mkdir = function ( path , mode , callback ) {
if ( typeof mode === 'function' ) callback = mode ;
callback = makeCallback ( callback ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) ) return ;
var req = new FSReqWrap ( ) ;
req . oncomplete = callback ;
@ -769,6 +806,7 @@ fs.mkdir = function(path, mode, callback) {
} ;
fs . mkdirSync = function ( path , mode ) {
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
return binding . mkdir ( pathModule . _ makeLong ( path ) ,
modeNum ( mode , 0o777 ) ) ;
@ -777,6 +815,8 @@ fs.mkdirSync = function(path, mode) {
fs . readdir = function ( path , options , callback ) {
callback = makeCallback ( typeof options === 'function' ? options : callback ) ;
options = getOptions ( options , { } ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) ) return ;
var req = new FSReqWrap ( ) ;
req . oncomplete = callback ;
@ -785,6 +825,7 @@ fs.readdir = function(path, options, callback) {
fs . readdirSync = function ( path , options ) {
options = getOptions ( options , { } ) ;
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
return binding . readdir ( pathModule . _ makeLong ( path ) , options . encoding ) ;
} ;
@ -797,6 +838,8 @@ fs.fstat = function(fd, callback) {
fs . lstat = function ( path , callback ) {
callback = makeCallback ( callback ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) ) return ;
var req = new FSReqWrap ( ) ;
req . oncomplete = callback ;
@ -805,6 +848,8 @@ fs.lstat = function(path, callback) {
fs . stat = function ( path , callback ) {
callback = makeCallback ( callback ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) ) return ;
var req = new FSReqWrap ( ) ;
req . oncomplete = callback ;
@ -816,11 +861,13 @@ fs.fstatSync = function(fd) {
} ;
fs . lstatSync = function ( path ) {
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
return binding . lstat ( pathModule . _ makeLong ( path ) ) ;
} ;
fs . statSync = function ( path ) {
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
return binding . stat ( pathModule . _ makeLong ( path ) ) ;
} ;
@ -828,6 +875,8 @@ fs.statSync = function(path) {
fs . readlink = function ( path , options , callback ) {
callback = makeCallback ( typeof options === 'function' ? options : callback ) ;
options = getOptions ( options , { } ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) ) return ;
var req = new FSReqWrap ( ) ;
req . oncomplete = callback ;
@ -836,6 +885,7 @@ fs.readlink = function(path, options, callback) {
fs . readlinkSync = function ( path , options ) {
options = getOptions ( options , { } ) ;
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
return binding . readlink ( pathModule . _ makeLong ( path ) , options . encoding ) ;
} ;
@ -859,6 +909,12 @@ fs.symlink = function(target, path, type_, callback_) {
var type = ( typeof type_ === 'string' ? type_ : null ) ;
var callback = makeCallback ( arguments [ arguments . length - 1 ] ) ;
if ( handleError ( ( target = getPathFromURL ( target ) ) , callback ) )
return ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( target , callback ) ) return ;
if ( ! nullCheck ( path , callback ) ) return ;
@ -873,7 +929,8 @@ fs.symlink = function(target, path, type_, callback_) {
fs . symlinkSync = function ( target , path , type ) {
type = ( typeof type === 'string' ? type : null ) ;
handleError ( ( target = getPathFromURL ( target ) ) ) ;
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( target ) ;
nullCheck ( path ) ;
@ -884,6 +941,13 @@ fs.symlinkSync = function(target, path, type) {
fs . link = function ( existingPath , newPath , callback ) {
callback = makeCallback ( callback ) ;
if ( handleError ( ( existingPath = getPathFromURL ( existingPath ) ) , callback ) )
return ;
if ( handleError ( ( newPath = getPathFromURL ( newPath ) ) , callback ) )
return ;
if ( ! nullCheck ( existingPath , callback ) ) return ;
if ( ! nullCheck ( newPath , callback ) ) return ;
@ -896,6 +960,8 @@ fs.link = function(existingPath, newPath, callback) {
} ;
fs . linkSync = function ( existingPath , newPath ) {
handleError ( ( existingPath = getPathFromURL ( existingPath ) ) ) ;
handleError ( ( newPath = getPathFromURL ( newPath ) ) ) ;
nullCheck ( existingPath ) ;
nullCheck ( newPath ) ;
return binding . link ( pathModule . _ makeLong ( existingPath ) ,
@ -904,6 +970,8 @@ fs.linkSync = function(existingPath, newPath) {
fs . unlink = function ( path , callback ) {
callback = makeCallback ( callback ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) ) return ;
var req = new FSReqWrap ( ) ;
req . oncomplete = callback ;
@ -911,6 +979,7 @@ fs.unlink = function(path, callback) {
} ;
fs . unlinkSync = function ( path ) {
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
return binding . unlink ( pathModule . _ makeLong ( path ) ) ;
} ;
@ -967,6 +1036,8 @@ if (constants.hasOwnProperty('O_SYMLINK')) {
fs . chmod = function ( path , mode , callback ) {
callback = makeCallback ( callback ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) ) return ;
var req = new FSReqWrap ( ) ;
req . oncomplete = callback ;
@ -976,6 +1047,7 @@ fs.chmod = function(path, mode, callback) {
} ;
fs . chmodSync = function ( path , mode ) {
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
return binding . chmod ( pathModule . _ makeLong ( path ) , modeNum ( mode ) ) ;
} ;
@ -1010,6 +1082,8 @@ fs.fchownSync = function(fd, uid, gid) {
fs . chown = function ( path , uid , gid , callback ) {
callback = makeCallback ( callback ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) ) return ;
var req = new FSReqWrap ( ) ;
req . oncomplete = callback ;
@ -1017,6 +1091,7 @@ fs.chown = function(path, uid, gid, callback) {
} ;
fs . chownSync = function ( path , uid , gid ) {
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
return binding . chown ( pathModule . _ makeLong ( path ) , uid , gid ) ;
} ;
@ -1044,6 +1119,8 @@ fs._toUnixTimestamp = toUnixTimestamp;
fs . utimes = function ( path , atime , mtime , callback ) {
callback = makeCallback ( callback ) ;
if ( handleError ( ( path = getPathFromURL ( path ) ) , callback ) )
return ;
if ( ! nullCheck ( path , callback ) ) return ;
var req = new FSReqWrap ( ) ;
req . oncomplete = callback ;
@ -1054,6 +1131,7 @@ fs.utimes = function(path, atime, mtime, callback) {
} ;
fs . utimesSync = function ( path , atime , mtime ) {
handleError ( ( path = getPathFromURL ( path ) ) ) ;
nullCheck ( path ) ;
atime = toUnixTimestamp ( atime ) ;
mtime = toUnixTimestamp ( mtime ) ;
@ -1214,6 +1292,7 @@ FSWatcher.prototype.start = function(filename,
persistent ,
recursive ,
encoding ) {
handleError ( ( filename = getPathFromURL ( filename ) ) ) ;
nullCheck ( filename ) ;
var err = this . _ handle . start ( pathModule . _ makeLong ( filename ) ,
persistent ,
@ -1232,6 +1311,7 @@ FSWatcher.prototype.close = function() {
} ;
fs . watch = function ( filename , options , listener ) {
handleError ( ( filename = getPathFromURL ( filename ) ) ) ;
nullCheck ( filename ) ;
if ( typeof options === 'function' ) {
@ -1292,6 +1372,7 @@ util.inherits(StatWatcher, EventEmitter);
StatWatcher . prototype . start = function ( filename , persistent , interval ) {
handleError ( ( filename = getPathFromURL ( filename ) ) ) ;
nullCheck ( filename ) ;
this . _ handle . start ( pathModule . _ makeLong ( filename ) , persistent , interval ) ;
} ;
@ -1305,6 +1386,7 @@ StatWatcher.prototype.stop = function() {
const statWatchers = new Map ( ) ;
fs . watchFile = function ( filename , options , listener ) {
handleError ( ( filename = getPathFromURL ( filename ) ) ) ;
nullCheck ( filename ) ;
filename = pathModule . resolve ( filename ) ;
var stat ;
@ -1341,6 +1423,7 @@ fs.watchFile = function(filename, options, listener) {
} ;
fs . unwatchFile = function ( filename , listener ) {
handleError ( ( filename = getPathFromURL ( filename ) ) ) ;
nullCheck ( filename ) ;
filename = pathModule . resolve ( filename ) ;
var stat = statWatchers . get ( filename ) ;
@ -1384,6 +1467,7 @@ function encodeRealpathResult(result, options) {
fs . realpathSync = function realpathSync ( p , options ) {
options = getOptions ( options , { } ) ;
handleError ( ( p = getPathFromURL ( p ) ) ) ;
nullCheck ( p ) ;
p = p . toString ( 'utf8' ) ;
@ -1487,6 +1571,8 @@ fs.realpathSync = function realpathSync(p, options) {
fs . realpath = function realpath ( p , options , callback ) {
callback = maybeCallback ( typeof options === 'function' ? options : callback ) ;
options = getOptions ( options , { } ) ;
if ( handleError ( ( p = getPathFromURL ( p ) ) , callback ) )
return ;
if ( ! nullCheck ( p , callback ) )
return ;
@ -1645,7 +1731,7 @@ function ReadStream(path, options) {
Readable . call ( this , options ) ;
this . path = path ;
handleError ( ( this . path = getPathFromURL ( path ) ) ) ;
this . fd = options . fd === undefined ? null : options . fd ;
this . flags = options . flags === undefined ? 'r' : options . flags ;
this . mode = options . mode === undefined ? 0o666 : options . mode ;
@ -1808,7 +1894,7 @@ function WriteStream(path, options) {
Writable . call ( this , options ) ;
this . path = path ;
handleError ( ( this . path = getPathFromURL ( path ) ) ) ;
this . fd = options . fd === undefined ? null : options . fd ;
this . flags = options . flags === undefined ? 'w' : options . flags ;
this . mode = options . mode === undefined ? 0o666 : options . mode ;