@@ -279,6 +279,8 @@ function initSocketHandle(self) {
279279const kBytesRead = Symbol ( 'kBytesRead' ) ;
280280const kBytesWritten = Symbol ( 'kBytesWritten' ) ;
281281const kSetNoDelay = Symbol ( 'kSetNoDelay' ) ;
282+ const kSetKeepAlive = Symbol ( 'kSetKeepAlive' ) ;
283+ const kSetKeepAliveInitialDelay = Symbol ( 'kSetKeepAliveInitialDelay' ) ;
282284
283285function Socket ( options ) {
284286 if ( ! ( this instanceof Socket ) ) return new Socket ( options ) ;
@@ -297,6 +299,15 @@ function Socket(options) {
297299 'is not supported'
298300 ) ;
299301 }
302+ if ( typeof options ?. keepAliveInitialDelay !== 'undefined' ) {
303+ validateNumber (
304+ options ?. keepAliveInitialDelay , 'options.keepAliveInitialDelay'
305+ ) ;
306+
307+ if ( options . keepAliveInitialDelay < 0 ) {
308+ options . keepAliveInitialDelay = 0 ;
309+ }
310+ }
300311
301312 this . connecting = false ;
302313 // Problem with this is that users can supply their own handle, that may not
@@ -307,7 +318,6 @@ function Socket(options) {
307318 this [ kHandle ] = null ;
308319 this . _parent = null ;
309320 this . _host = null ;
310- this [ kSetNoDelay ] = false ;
311321 this [ kLastWriteQueueSize ] = 0 ;
312322 this [ kTimeout ] = null ;
313323 this [ kBuffer ] = null ;
@@ -381,6 +391,10 @@ function Socket(options) {
381391 this [ kBufferCb ] = onread . callback ;
382392 }
383393
394+ this [ kSetNoDelay ] = Boolean ( options . noDelay ) ;
395+ this [ kSetKeepAlive ] = Boolean ( options . keepAlive ) ;
396+ this [ kSetKeepAliveInitialDelay ] = ~ ~ ( options . keepAliveInitialDelay / 1000 ) ;
397+
384398 // Shut down the socket when we're finished with it.
385399 this . on ( 'end' , onReadableStreamEnd ) ;
386400
@@ -503,31 +517,38 @@ Socket.prototype._onTimeout = function() {
503517
504518
505519Socket . prototype . setNoDelay = function ( enable ) {
520+ // Backwards compatibility: assume true when `enable` is omitted
521+ enable = Boolean ( enable === undefined ? true : enable ) ;
522+
506523 if ( ! this . _handle ) {
507- this . once ( 'connect' ,
508- enable ? this . setNoDelay : ( ) => this . setNoDelay ( enable ) ) ;
524+ this [ kSetNoDelay ] = enable ;
509525 return this ;
510526 }
511527
512- // Backwards compatibility: assume true when `enable` is omitted
513- const newValue = enable === undefined ? true : ! ! enable ;
514- if ( this . _handle . setNoDelay && newValue !== this [ kSetNoDelay ] ) {
515- this [ kSetNoDelay ] = newValue ;
516- this . _handle . setNoDelay ( newValue ) ;
528+ if ( this . _handle . setNoDelay && enable !== this [ kSetNoDelay ] ) {
529+ this [ kSetNoDelay ] = enable ;
530+ this . _handle . setNoDelay ( enable ) ;
517531 }
518532
519533 return this ;
520534} ;
521535
522536
523- Socket . prototype . setKeepAlive = function ( setting , msecs ) {
537+ Socket . prototype . setKeepAlive = function ( enable , initialDelayMsecs ) {
538+ enable = Boolean ( enable ) ;
539+ const initialDelay = ~ ~ ( initialDelayMsecs / 1000 ) ;
540+
524541 if ( ! this . _handle ) {
525- this . once ( 'connect' , ( ) => this . setKeepAlive ( setting , msecs ) ) ;
542+ this [ kSetKeepAlive ] = enable ;
543+ this [ kSetKeepAliveInitialDelay ] = initialDelay ;
526544 return this ;
527545 }
528546
529- if ( this . _handle . setKeepAlive )
530- this . _handle . setKeepAlive ( setting , ~ ~ ( msecs / 1000 ) ) ;
547+ if ( this . _handle . setKeepAlive && enable !== this [ kSetKeepAlive ] ) {
548+ this [ kSetKeepAlive ] = enable ;
549+ this [ kSetKeepAliveInitialDelay ] = initialDelay ;
550+ this . _handle . setKeepAlive ( enable , initialDelay ) ;
551+ }
531552
532553 return this ;
533554} ;
@@ -1140,6 +1161,14 @@ function afterConnect(status, handle, req, readable, writable) {
11401161 }
11411162 self . _unrefTimer ( ) ;
11421163
1164+ if ( self [ kSetNoDelay ] && self . _handle . setNoDelay ) {
1165+ self . _handle . setNoDelay ( true ) ;
1166+ }
1167+
1168+ if ( self [ kSetKeepAlive ] && self . _handle . setKeepAlive ) {
1169+ self . _handle . setKeepAlive ( true , self [ kSetKeepAliveInitialDelay ] ) ;
1170+ }
1171+
11431172 self . emit ( 'connect' ) ;
11441173 self . emit ( 'ready' ) ;
11451174
@@ -1203,6 +1232,15 @@ function Server(options, connectionListener) {
12031232 } else {
12041233 throw new ERR_INVALID_ARG_TYPE ( 'options' , 'Object' , options ) ;
12051234 }
1235+ if ( typeof options . keepAliveInitialDelay !== 'undefined' ) {
1236+ validateNumber (
1237+ options . keepAliveInitialDelay , 'options.keepAliveInitialDelay'
1238+ ) ;
1239+
1240+ if ( options . keepAliveInitialDelay < 0 ) {
1241+ options . keepAliveInitialDelay = 0 ;
1242+ }
1243+ }
12061244
12071245 this . _connections = 0 ;
12081246
@@ -1214,6 +1252,9 @@ function Server(options, connectionListener) {
12141252
12151253 this . allowHalfOpen = options . allowHalfOpen || false ;
12161254 this . pauseOnConnect = ! ! options . pauseOnConnect ;
1255+ this . noDelay = Boolean ( options . noDelay ) ;
1256+ this . keepAlive = Boolean ( options . keepAlive ) ;
1257+ this . keepAliveInitialDelay = ~ ~ ( options . keepAliveInitialDelay / 1000 ) ;
12171258}
12181259ObjectSetPrototypeOf ( Server . prototype , EventEmitter . prototype ) ;
12191260ObjectSetPrototypeOf ( Server , EventEmitter ) ;
@@ -1565,6 +1606,14 @@ function onconnection(err, clientHandle) {
15651606 writable : true
15661607 } ) ;
15671608
1609+ if ( self . noDelay && handle . setNoDelay ) {
1610+ handle . setNoDelay ( true ) ;
1611+ }
1612+
1613+ if ( self . keepAlive && self . setKeepAlive ) {
1614+ handle . setKeepAlive ( true , handle . keepAliveInitialDelay ) ;
1615+ }
1616+
15681617 self . _connections ++ ;
15691618 socket . server = self ;
15701619 socket . _server = self ;
0 commit comments