@@ -142,6 +142,19 @@ function maybeCallback(cb) {
142142 throw new ERR_INVALID_CALLBACK ( cb ) ;
143143}
144144
145+ function isBuffersArray ( value ) {
146+ if ( ! Array . isArray ( value ) )
147+ return false ;
148+
149+ for ( var i = 0 ; i < value . length ; i += 1 ) {
150+ if ( ! isArrayBufferView ( value [ i ] ) ) {
151+ return false ;
152+ }
153+ }
154+
155+ return true ;
156+ }
157+
145158// Ensure that callbacks run in the global context. Only use this function
146159// for callbacks that are passed to the binding layer, callbacks that are
147160// invoked from JS already run in the proper scope.
@@ -559,7 +572,7 @@ function write(fd, buffer, offset, length, position, callback) {
559572Object . defineProperty ( write , internalUtil . customPromisifyArgs ,
560573 { value : [ 'bytesWritten' , 'buffer' ] , enumerable : false } ) ;
561574
562- // usage :
575+ // Usage :
563576// fs.writeSync(fd, buffer[, offset[, length[, position]]]);
564577// OR
565578// fs.writeSync(fd, string[, position[, encoding]]);
@@ -589,6 +602,54 @@ function writeSync(fd, buffer, offset, length, position) {
589602 return result ;
590603}
591604
605+ // usage:
606+ // fs.writev(fd, buffers[, position], callback);
607+ function writev ( fd , buffers , position , callback ) {
608+ function wrapper ( err , written ) {
609+ callback ( err , written || 0 , buffers ) ;
610+ }
611+
612+ validateUint32 ( fd , 'fd' ) ;
613+
614+ if ( ! isBuffersArray ( buffers ) ) {
615+ throw new ERR_INVALID_ARG_TYPE ( 'buffers' , 'ArrayBufferView[]' , buffers ) ;
616+ }
617+
618+ const req = new FSReqCallback ( ) ;
619+ req . oncomplete = wrapper ;
620+
621+ callback = maybeCallback ( callback || position ) ;
622+
623+ if ( typeof position !== 'number' )
624+ position = null ;
625+
626+ return binding . writeBuffers ( fd , buffers , position , req ) ;
627+ }
628+
629+ Object . defineProperty ( writev , internalUtil . customPromisifyArgs , {
630+ value : [ 'bytesWritten' , 'buffer' ] ,
631+ enumerable : false
632+ } ) ;
633+
634+ // fs.writevSync(fd, buffers[, position]);
635+ function writevSync ( fd , buffers , position ) {
636+
637+ validateUint32 ( fd , 'fd' ) ;
638+ const ctx = { } ;
639+
640+ if ( ! isBuffersArray ( buffers ) ) {
641+ throw new ERR_INVALID_ARG_TYPE ( 'buffers' , 'ArrayBufferView[]' , buffers ) ;
642+ }
643+
644+ if ( typeof position !== 'number' )
645+ position = null ;
646+
647+ const result = binding . writeBuffers ( fd , buffers , position , undefined , ctx ) ;
648+
649+ handleErrorFromBinding ( ctx ) ;
650+ return result ;
651+ }
652+
592653function rename ( oldPath , newPath , callback ) {
593654 callback = makeCallback ( callback ) ;
594655 oldPath = getValidatedPath ( oldPath , 'oldPath' ) ;
@@ -1825,6 +1886,8 @@ module.exports = fs = {
18251886 writeFileSync,
18261887 write,
18271888 writeSync,
1889+ writev,
1890+ writevSync,
18281891 Dirent,
18291892 Stats,
18301893
0 commit comments