@@ -142,6 +142,19 @@ function maybeCallback(cb) {
142
142
throw new ERR_INVALID_CALLBACK ( cb ) ;
143
143
}
144
144
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
+
145
158
// Ensure that callbacks run in the global context. Only use this function
146
159
// for callbacks that are passed to the binding layer, callbacks that are
147
160
// invoked from JS already run in the proper scope.
@@ -559,7 +572,7 @@ function write(fd, buffer, offset, length, position, callback) {
559
572
Object . defineProperty ( write , internalUtil . customPromisifyArgs ,
560
573
{ value : [ 'bytesWritten' , 'buffer' ] , enumerable : false } ) ;
561
574
562
- // usage :
575
+ // Usage :
563
576
// fs.writeSync(fd, buffer[, offset[, length[, position]]]);
564
577
// OR
565
578
// fs.writeSync(fd, string[, position[, encoding]]);
@@ -589,6 +602,54 @@ function writeSync(fd, buffer, offset, length, position) {
589
602
return result ;
590
603
}
591
604
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
+
592
653
function rename ( oldPath , newPath , callback ) {
593
654
callback = makeCallback ( callback ) ;
594
655
oldPath = getValidatedPath ( oldPath , 'oldPath' ) ;
@@ -1825,6 +1886,8 @@ module.exports = fs = {
1825
1886
writeFileSync,
1826
1887
write,
1827
1888
writeSync,
1889
+ writev,
1890
+ writevSync,
1828
1891
Dirent,
1829
1892
Stats,
1830
1893
0 commit comments