@@ -147,6 +147,7 @@ const {
147147    IDX_QUIC_SESSION_STATS_STREAMS_OUT_COUNT , 
148148    IDX_QUIC_SESSION_STATS_KEYUPDATE_COUNT , 
149149    IDX_QUIC_SESSION_STATS_LOSS_RETRANSMIT_COUNT , 
150+     IDX_QUIC_SESSION_STATS_HANDSHAKE_COMPLETED_AT , 
150151    IDX_QUIC_SESSION_STATS_ACK_DELAY_RETRANSMIT_COUNT , 
151152    IDX_QUIC_SESSION_STATS_MAX_BYTES_IN_FLIGHT , 
152153    IDX_QUIC_SESSION_STATS_BLOCK_COUNT , 
@@ -625,6 +626,13 @@ function onRemoveListener(event) {
625626  toggleListeners ( this [ kHandle ] ,  event ,  false ) ; 
626627} 
627628
629+ function  getStats ( obj ,  idx )  { 
630+   const  stats  =  obj [ kHandle ] ?. stats  ||  obj [ kInternalState ] . stats ; 
631+   // If stats is undefined at this point, it's just a bug 
632+   assert ( stats ) ; 
633+   return  stats [ idx ] ; 
634+ } 
635+ 
628636// QuicEndpoint wraps a UDP socket and is owned 
629637// by a QuicSocket. It does not exist independently 
630638// of the QuicSocket. 
@@ -1524,77 +1532,65 @@ class QuicSocket extends EventEmitter {
15241532      this [ kHandle ] . setServerBusy ( on ) ; 
15251533  } 
15261534
1535+   get  serverBusy ( )  { 
1536+     return  this [ kInternalState ] . serverBusy ; 
1537+   } 
1538+ 
15271539  get  duration ( )  { 
15281540    // TODO(@jasnell): If the object is destroyed, it should 
15291541    // use a fixed duration rather than calculating from now 
1530-     const  now  =  process . hrtime . bigint ( ) ; 
1531-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1532-     return  now  -  stats [ IDX_QUIC_SOCKET_STATS_CREATED_AT ] ; 
1542+     return  process . hrtime . bigint ( )  - 
1543+       getStats ( this ,  IDX_QUIC_SOCKET_STATS_CREATED_AT ) ; 
15331544  } 
15341545
15351546  get  boundDuration ( )  { 
15361547    // TODO(@jasnell): If the object is destroyed, it should 
15371548    // use a fixed duration rather than calculating from now 
1538-     const  now  =  process . hrtime . bigint ( ) ; 
1539-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1540-     return  now  -  stats [ IDX_QUIC_SOCKET_STATS_BOUND_AT ] ; 
1549+     return  process . hrtime . bigint ( )  - 
1550+       getStats ( this ,  IDX_QUIC_SOCKET_STATS_BOUND_AT ) ; 
15411551  } 
15421552
15431553  get  listenDuration ( )  { 
15441554    // TODO(@jasnell): If the object is destroyed, it should 
15451555    // use a fixed duration rather than calculating from now 
1546-     const  now  =  process . hrtime . bigint ( ) ; 
1547-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1548-     return  now  -  stats [ IDX_QUIC_SOCKET_STATS_LISTEN_AT ] ; 
1556+     return  process . hrtime . bigint ( )  - 
1557+       getStats ( this ,  IDX_QUIC_SOCKET_STATS_LISTEN_AT ) ; 
15491558  } 
15501559
15511560  get  bytesReceived ( )  { 
1552-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1553-     return  stats [ IDX_QUIC_SOCKET_STATS_BYTES_RECEIVED ] ; 
1561+     return  getStats ( this ,  IDX_QUIC_SOCKET_STATS_BYTES_RECEIVED ) ; 
15541562  } 
15551563
15561564  get  bytesSent ( )  { 
1557-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1558-     return  stats [ IDX_QUIC_SOCKET_STATS_BYTES_SENT ] ; 
1565+     return  getStats ( this ,  IDX_QUIC_SOCKET_STATS_BYTES_SENT ) ; 
15591566  } 
15601567
15611568  get  packetsReceived ( )  { 
1562-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1563-     return  stats [ IDX_QUIC_SOCKET_STATS_PACKETS_RECEIVED ] ; 
1569+     return  getStats ( this ,  IDX_QUIC_SOCKET_STATS_PACKETS_RECEIVED ) ; 
15641570  } 
15651571
15661572  get  packetsSent ( )  { 
1567-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1568-     return  stats [ IDX_QUIC_SOCKET_STATS_PACKETS_SENT ] ; 
1573+     return  getStats ( this ,  IDX_QUIC_SOCKET_STATS_PACKETS_SENT ) ; 
15691574  } 
15701575
15711576  get  packetsIgnored ( )  { 
1572-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1573-     return  stats [ IDX_QUIC_SOCKET_STATS_PACKETS_IGNORED ] ; 
1574-   } 
1575- 
1576-   get  serverBusy ( )  { 
1577-     return  this [ kInternalState ] . serverBusy ; 
1577+     return  getStats ( this ,  IDX_QUIC_SOCKET_STATS_PACKETS_IGNORED ) ; 
15781578  } 
15791579
15801580  get  serverSessions ( )  { 
1581-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1582-     return  stats [ IDX_QUIC_SOCKET_STATS_SERVER_SESSIONS ] ; 
1581+     return  getStats ( this ,  IDX_QUIC_SOCKET_STATS_SERVER_SESSIONS ) ; 
15831582  } 
15841583
15851584  get  clientSessions ( )  { 
1586-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1587-     return  stats [ IDX_QUIC_SOCKET_STATS_CLIENT_SESSIONS ] ; 
1585+     return  getStats ( this ,  IDX_QUIC_SOCKET_STATS_CLIENT_SESSIONS ) ; 
15881586  } 
15891587
15901588  get  statelessResetCount ( )  { 
1591-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1592-     return  stats [ IDX_QUIC_SOCKET_STATS_STATELESS_RESET_COUNT ] ; 
1589+     return  getStats ( this ,  IDX_QUIC_SOCKET_STATS_STATELESS_RESET_COUNT ) ; 
15931590  } 
15941591
15951592  get  serverBusyCount ( )  { 
1596-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
1597-     return  stats [ IDX_QUIC_SOCKET_STATS_SERVER_BUSY_COUNT ] ; 
1593+     return  getStats ( this ,  IDX_QUIC_SOCKET_STATS_SERVER_BUSY_COUNT ) ; 
15981594  } 
15991595
16001596  // Diagnostic packet loss is a testing mechanism that allows simulating 
@@ -2183,82 +2179,68 @@ class QuicSession extends EventEmitter {
21832179  } 
21842180
21852181  get  duration ( )  { 
2186-     const  now  =  process . hrtime . bigint ( ) ; 
2187-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2188-     return  now  -  stats [ IDX_QUIC_SESSION_STATS_CREATED_AT ] ; 
2182+     return  process . hrtime . bigint ( )  - 
2183+       getStats ( this ,  IDX_QUIC_SESSION_STATS_CREATED_AT ) ; 
21892184  } 
21902185
21912186  get  handshakeDuration ( )  { 
2192-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
21932187    const  end  = 
21942188      this . handshakeComplete  ?
2195-         stats [ 4 ]  : process . hrtime . bigint ( ) ; 
2196-     return  end  -  stats [ IDX_QUIC_SESSION_STATS_HANDSHAKE_START_AT ] ; 
2189+         getStats ( this ,  IDX_QUIC_SESSION_STATS_HANDSHAKE_COMPLETED_AT )  :
2190+         process . hrtime . bigint ( ) ; 
2191+     return  end  -  getStats ( this ,  IDX_QUIC_SESSION_STATS_HANDSHAKE_START_AT ) ; 
21972192  } 
21982193
21992194  get  bytesReceived ( )  { 
2200-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2201-     return  stats [ IDX_QUIC_SESSION_STATS_BYTES_RECEIVED ] ; 
2195+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_BYTES_RECEIVED ) ; 
22022196  } 
22032197
22042198  get  bytesSent ( )  { 
2205-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2206-     return  stats [ IDX_QUIC_SESSION_STATS_BYTES_SENT ] ; 
2199+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_BYTES_SENT ) ; 
22072200  } 
22082201
22092202  get  bidiStreamCount ( )  { 
2210-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2211-     return  stats [ IDX_QUIC_SESSION_STATS_BIDI_STREAM_COUNT ] ; 
2203+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_BIDI_STREAM_COUNT ) ; 
22122204  } 
22132205
22142206  get  uniStreamCount ( )  { 
2215-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2216-     return  stats [ IDX_QUIC_SESSION_STATS_UNI_STREAM_COUNT ] ; 
2207+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_UNI_STREAM_COUNT ) ; 
22172208  } 
22182209
22192210  get  maxInFlightBytes ( )  { 
2220-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2221-     return  stats [ IDX_QUIC_SESSION_STATS_MAX_BYTES_IN_FLIGHT ] ; 
2211+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_MAX_BYTES_IN_FLIGHT ) ; 
22222212  } 
22232213
22242214  get  lossRetransmitCount ( )  { 
2225-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2226-     return  stats [ IDX_QUIC_SESSION_STATS_LOSS_RETRANSMIT_COUNT ] ; 
2215+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_LOSS_RETRANSMIT_COUNT ) ; 
22272216  } 
22282217
22292218  get  ackDelayRetransmitCount ( )  { 
2230-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2231-     return  stats [ IDX_QUIC_SESSION_STATS_ACK_DELAY_RETRANSMIT_COUNT ] ; 
2219+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_ACK_DELAY_RETRANSMIT_COUNT ) ; 
22322220  } 
22332221
22342222  get  peerInitiatedStreamCount ( )  { 
2235-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2236-     return  stats [ IDX_QUIC_SESSION_STATS_STREAMS_IN_COUNT ] ; 
2223+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_STREAMS_IN_COUNT ) ; 
22372224  } 
22382225
22392226  get  selfInitiatedStreamCount ( )  { 
2240-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2241-     return  stats [ IDX_QUIC_SESSION_STATS_STREAMS_OUT_COUNT ] ; 
2227+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_STREAMS_OUT_COUNT ) ; 
22422228  } 
22432229
22442230  get  keyUpdateCount ( )  { 
2245-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2246-     return  stats [ IDX_QUIC_SESSION_STATS_KEYUPDATE_COUNT ] ; 
2231+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_KEYUPDATE_COUNT ) ; 
22472232  } 
22482233
22492234  get  minRTT ( )  { 
2250-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2251-     return  stats [ IDX_QUIC_SESSION_STATS_MIN_RTT ] ; 
2235+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_MIN_RTT ) ; 
22522236  } 
22532237
22542238  get  latestRTT ( )  { 
2255-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2256-     return  stats [ IDX_QUIC_SESSION_STATS_LATEST_RTT ] ; 
2239+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_LATEST_RTT ) ; 
22572240  } 
22582241
22592242  get  smoothedRTT ( )  { 
2260-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
2261-     return  stats [ IDX_QUIC_SESSION_STATS_SMOOTHED_RTT ] ; 
2243+     return  getStats ( this ,  IDX_QUIC_SESSION_STATS_SMOOTHED_RTT ) ; 
22622244  } 
22632245
22642246  updateKey ( )  { 
@@ -3176,39 +3158,32 @@ class QuicStream extends Duplex {
31763158  } 
31773159
31783160  get  duration ( )  { 
3179-     const  now  =  process . hrtime . bigint ( ) ; 
3180-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
3181-     return  now  -  stats [ IDX_QUIC_STREAM_STATS_CREATED_AT ] ; 
3161+     return  process . hrtime . bigint ( )  - 
3162+       getStats ( this ,  IDX_QUIC_STREAM_STATS_CREATED_AT ) ; 
31823163  } 
31833164
31843165  get  bytesReceived ( )  { 
3185-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
3186-     return  stats [ IDX_QUIC_STREAM_STATS_BYTES_RECEIVED ] ; 
3166+     return  getStats ( this ,  IDX_QUIC_STREAM_STATS_BYTES_RECEIVED ) ; 
31873167  } 
31883168
31893169  get  bytesSent ( )  { 
3190-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
3191-     return  stats [ IDX_QUIC_STREAM_STATS_BYTES_SENT ] ; 
3170+     return  getStats ( this ,  IDX_QUIC_STREAM_STATS_BYTES_SENT ) ; 
31923171  } 
31933172
31943173  get  maxExtendedOffset ( )  { 
3195-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
3196-     return  stats [ IDX_QUIC_STREAM_STATS_MAX_OFFSET ] ; 
3174+     return  getStats ( this ,  IDX_QUIC_STREAM_STATS_MAX_OFFSET ) ; 
31973175  } 
31983176
31993177  get  finalSize ( )  { 
3200-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
3201-     return  stats [ IDX_QUIC_STREAM_STATS_FINAL_SIZE ] ; 
3178+     return  getStats ( this ,  IDX_QUIC_STREAM_STATS_FINAL_SIZE ) ; 
32023179  } 
32033180
32043181  get  maxAcknowledgedOffset ( )  { 
3205-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
3206-     return  stats [ IDX_QUIC_STREAM_STATS_MAX_OFFSET_ACK ] ; 
3182+     return  getStats ( this ,  IDX_QUIC_STREAM_STATS_MAX_OFFSET_ACK ) ; 
32073183  } 
32083184
32093185  get  maxReceivedOffset ( )  { 
3210-     const  stats  =  this [ kInternalState ] . stats  ||  this [ kHandle ] . stats ; 
3211-     return  stats [ IDX_QUIC_STREAM_STATS_MAX_OFFSET_RECV ] ; 
3186+     return  getStats ( this ,  IDX_QUIC_STREAM_STATS_MAX_OFFSET_RECV ) ; 
32123187  } 
32133188} 
32143189
0 commit comments