@@ -126,6 +126,7 @@ const {
126
126
AF_INET6 ,
127
127
NGTCP2_DEFAULT_MAX_PKTLEN ,
128
128
IDX_QUIC_SESSION_STATS_CREATED_AT ,
129
+ IDX_QUIC_SESSION_STATS_DESTROYED_AT ,
129
130
IDX_QUIC_SESSION_STATS_HANDSHAKE_START_AT ,
130
131
IDX_QUIC_SESSION_STATS_BYTES_RECEIVED ,
131
132
IDX_QUIC_SESSION_STATS_BYTES_SENT ,
@@ -143,13 +144,15 @@ const {
143
144
IDX_QUIC_SESSION_STATS_SMOOTHED_RTT ,
144
145
IDX_QUIC_SESSION_STATS_LATEST_RTT ,
145
146
IDX_QUIC_STREAM_STATS_CREATED_AT ,
147
+ IDX_QUIC_STREAM_STATS_DESTROYED_AT ,
146
148
IDX_QUIC_STREAM_STATS_BYTES_RECEIVED ,
147
149
IDX_QUIC_STREAM_STATS_BYTES_SENT ,
148
150
IDX_QUIC_STREAM_STATS_MAX_OFFSET ,
149
151
IDX_QUIC_STREAM_STATS_FINAL_SIZE ,
150
152
IDX_QUIC_STREAM_STATS_MAX_OFFSET_ACK ,
151
153
IDX_QUIC_STREAM_STATS_MAX_OFFSET_RECV ,
152
154
IDX_QUIC_SOCKET_STATS_CREATED_AT ,
155
+ IDX_QUIC_SOCKET_STATS_DESTROYED_AT ,
153
156
IDX_QUIC_SOCKET_STATS_BOUND_AT ,
154
157
IDX_QUIC_SOCKET_STATS_LISTEN_AT ,
155
158
IDX_QUIC_SOCKET_STATS_BYTES_RECEIVED ,
@@ -1433,6 +1436,9 @@ class QuicSocket extends EventEmitter {
1433
1436
1434
1437
// Mark the QuicSocket as being destroyed.
1435
1438
state . state = kSocketDestroyed ;
1439
+ this [ kHandle ] . stats [ IDX_QUIC_SOCKET_STATS_DESTROYED_AT ] =
1440
+ process . hrtime . bigint ( ) ;
1441
+ state . stats = new BigInt64Array ( this [ kHandle ] . stats ) ;
1436
1442
1437
1443
// Immediately close any sessions that may be remaining.
1438
1444
// If the udp socket is in a state where it is able to do so,
@@ -1531,24 +1537,21 @@ class QuicSocket extends EventEmitter {
1531
1537
}
1532
1538
1533
1539
get duration ( ) {
1534
- // TODO(@jasnell): If the object is destroyed, it should
1535
- // use a fixed duration rather than calculating from now
1536
- return Number ( process . hrtime . bigint ( ) -
1537
- getStats ( this , IDX_QUIC_SOCKET_STATS_CREATED_AT ) ) ;
1540
+ const end = getStats ( this , IDX_QUIC_SOCKET_STATS_DESTROYED_AT ) ||
1541
+ process . hrtime . bigint ( ) ;
1542
+ return Number ( end - getStats ( this , IDX_QUIC_SOCKET_STATS_CREATED_AT ) ) ;
1538
1543
}
1539
1544
1540
1545
get boundDuration ( ) {
1541
- // TODO(@jasnell): If the object is destroyed, it should
1542
- // use a fixed duration rather than calculating from now
1543
- return Number ( process . hrtime . bigint ( ) -
1544
- getStats ( this , IDX_QUIC_SOCKET_STATS_BOUND_AT ) ) ;
1546
+ const end = getStats ( this , IDX_QUIC_SOCKET_STATS_DESTROYED_AT ) ||
1547
+ process . hrtime . bigint ( ) ;
1548
+ return Number ( end - getStats ( this , IDX_QUIC_SOCKET_STATS_BOUND_AT ) ) ;
1545
1549
}
1546
1550
1547
1551
get listenDuration ( ) {
1548
- // TODO(@jasnell): If the object is destroyed, it should
1549
- // use a fixed duration rather than calculating from now
1550
- return Number ( process . hrtime . bigint ( ) -
1551
- getStats ( this , IDX_QUIC_SOCKET_STATS_LISTEN_AT ) ) ;
1552
+ const end = getStats ( this , IDX_QUIC_SOCKET_STATS_DESTROYED_AT ) ||
1553
+ process . hrtime . bigint ( ) ;
1554
+ return Number ( end - getStats ( this , IDX_QUIC_SOCKET_STATS_LISTEN_AT ) ) ;
1552
1555
}
1553
1556
1554
1557
get bytesReceived ( ) {
@@ -1920,6 +1923,8 @@ class QuicSession extends EventEmitter {
1920
1923
this [ kHandle ] = undefined ;
1921
1924
if ( handle !== undefined ) {
1922
1925
// Copy the stats for use after destruction
1926
+ handle . stats [ IDX_QUIC_SESSION_STATS_DESTROYED_AT ] =
1927
+ process . hrtime . bigint ( ) ;
1923
1928
state . stats = new BigInt64Array ( handle . stats ) ;
1924
1929
state . idleTimeout = this [ kInternalState ] . state . idleTimeout ;
1925
1930
@@ -2148,8 +2153,9 @@ class QuicSession extends EventEmitter {
2148
2153
}
2149
2154
2150
2155
get duration ( ) {
2151
- return Number ( process . hrtime . bigint ( ) -
2152
- getStats ( this , IDX_QUIC_SESSION_STATS_CREATED_AT ) ) ;
2156
+ const end = getStats ( this , IDX_QUIC_SESSION_STATS_DESTROYED_AT ) ||
2157
+ process . hrtime . bigint ( ) ;
2158
+ return Number ( end - getStats ( this , IDX_QUIC_SESSION_STATS_CREATED_AT ) ) ;
2153
2159
}
2154
2160
2155
2161
get handshakeDuration ( ) {
@@ -2972,6 +2978,8 @@ class QuicStream extends Duplex {
2972
2978
// object has been destroyed. Any attempt to use the object
2973
2979
// will segfault and crash the process.
2974
2980
if ( handle !== undefined ) {
2981
+ handle . stats [ IDX_QUIC_STREAM_STATS_DESTROYED_AT ] =
2982
+ process . hrtime . bigint ( ) ;
2975
2983
state . stats = new BigInt64Array ( handle . stats ) ;
2976
2984
handle . destroy ( ) ;
2977
2985
}
@@ -3139,8 +3147,9 @@ class QuicStream extends Duplex {
3139
3147
}
3140
3148
3141
3149
get duration ( ) {
3142
- return Number ( process . hrtime . bigint ( ) -
3143
- getStats ( this , IDX_QUIC_STREAM_STATS_CREATED_AT ) ) ;
3150
+ const end = getStats ( this , IDX_QUIC_STREAM_STATS_DESTROYED_AT ) ||
3151
+ process . hrtime . bigint ( ) ;
3152
+ return Number ( end - getStats ( this , IDX_QUIC_STREAM_STATS_CREATED_AT ) ) ;
3144
3153
}
3145
3154
3146
3155
get bytesReceived ( ) {
0 commit comments