@@ -199,6 +199,7 @@ const {
199199 kPrivateConstructor,
200200 kReset,
201201 kSendHeaders,
202+ kSessionApplication,
202203 kSessionTicket,
203204 kTrailers,
204205 kVersionNegotiation,
@@ -247,6 +248,7 @@ const {
247248 onSessionReceiveDatagramStatusChannel,
248249 onSessionPathValidationChannel,
249250 onSessionNewTokenChannel,
251+ onSessionApplicationChannel,
250252 onSessionTicketChannel,
251253 onSessionVersionNegotiationChannel,
252254 onSessionOriginChannel,
@@ -436,6 +438,7 @@ const endpointRegistry = new SafeSet();
436438 * @property {OnGoawayCallback } [ongoaway] GOAWAY frame callback.
437439 * @property {OnKeylogCallback } [onkeylog] TLS key-log callback.
438440 * @property {OnQlogCallback } [onqlog] qlog data callback.
441+ * @property {OnApplicationCallback } [onapplication] application options callback.
439442 * @property {OnHeadersCallback } [onheaders] Default per-stream initial-headers callback.
440443 * @property {OnTrailersCallback } [ontrailers] Default per-stream trailing-headers callback.
441444 * @property {OnInfoCallback } [oninfo] Default per-stream informational-headers callback.
@@ -566,6 +569,13 @@ const endpointRegistry = new SafeSet();
566569 * @returns {void }
567570 */
568571
572+ /**
573+ * @callback OnApplicationCallback
574+ * @this {QuicSession}
575+ * @param {ApplicationOptions } applicationoptions
576+ * @returns {void }
577+ */
578+
569579/**
570580 * @callback OnSessionTicketCallback
571581 * @this {QuicSession}
@@ -643,6 +653,14 @@ const endpointRegistry = new SafeSet();
643653 * @returns {void }
644654 */
645655
656+ /**
657+ * Called when initial request or response headers are received.
658+ * @callback OnApplicationCallback
659+ * @this {QuicSession}
660+ * @param {ApplicationOptions } applicationoptions ApplicationOptions object
661+ * @returns {void }
662+ */
663+
646664/**
647665 * @callback OnBlockedCallback
648666 * @this {QuicStream}
@@ -798,6 +816,16 @@ setCallbacks({
798816 preferredAddress ) ;
799817 } ,
800818
819+ /**
820+ * Called when the session's application object is updated
821+ * E.g. http/3 session arrived.
822+ * @param {ApplicationOptions } applicationoptions An application object
823+ */
824+ onSessionApplication ( applicationoptions ) {
825+ debug ( 'session application callback' , this [ kOwner ] ) ;
826+ this [ kOwner ] [ kSessionApplication ] ( applicationoptions ) ;
827+ } ,
828+
801829 /**
802830 * Called when the session generates a new TLS session ticket
803831 * @param {object } ticket An opaque session ticket
@@ -1208,6 +1236,7 @@ function applyCallbacks(session, cbs) {
12081236 if ( cbs . ongoaway ) session . ongoaway = cbs . ongoaway ;
12091237 if ( cbs . onkeylog ) session . onkeylog = cbs . onkeylog ;
12101238 if ( cbs . onqlog ) session . onqlog = cbs . onqlog ;
1239+ if ( cbs . onapplication ) session . onapplication = cbs . application ;
12111240 if ( cbs . onheaders || cbs . ontrailers || cbs . oninfo || cbs . onwanttrailers ) {
12121241 session [ kStreamCallbacks ] = {
12131242 __proto__ : null ,
@@ -2896,6 +2925,25 @@ class QuicSession {
28962925 }
28972926 }
28982927
2928+ /** @type {Function|undefined } */
2929+ get onapplication ( ) {
2930+ assertIsQuicSession ( this ) ;
2931+ return this . #inner. onapplication ;
2932+ }
2933+
2934+ set onapplication ( fn ) {
2935+ assertIsQuicSession ( this ) ;
2936+ const inner = this . #inner;
2937+ if ( fn === undefined ) {
2938+ inner . onapplication = undefined ;
2939+ inner . state . hasApplicationListener = false ;
2940+ } else {
2941+ validateFunction ( fn , 'onsessionticket' ) ;
2942+ inner . onapplication = FunctionPrototypeBind ( fn , this ) ;
2943+ inner . state . hasApplicationListener = true ;
2944+ }
2945+ }
2946+
28992947 /** @type {Function|undefined } */
29002948 get onversionnegotiation ( ) {
29012949 assertIsQuicSession ( this ) ;
@@ -3483,6 +3531,7 @@ class QuicSession {
34833531 inner . ondatagramstatus = undefined ;
34843532 inner . onpathvalidation = undefined ;
34853533 inner . onsessionticket = undefined ;
3534+ inner . onapplication = undefined ;
34863535 inner . onkeylog = undefined ;
34873536 inner . onversionnegotiation = undefined ;
34883537 inner . onhandshake = undefined ;
@@ -3704,6 +3753,23 @@ class QuicSession {
37043753 safeCallbackInvoke ( inner . onsessionticket , this , ticket ) ;
37053754 }
37063755
3756+ /**
3757+ * @param {ApplicationOptions } applicationoptions
3758+ */
3759+ [ kSessionApplication ] ( applicationoptions ) {
3760+ if ( this . destroyed ) return ;
3761+ if ( onSessionApplicationChannel . hasSubscribers ) {
3762+ onSessionApplicationChannel . publish ( {
3763+ __proto__ : null ,
3764+ applicationoptions,
3765+ session : this ,
3766+ } ) ;
3767+ }
3768+ const inner = this . #inner;
3769+ if ( typeof inner . onapplication === 'function' )
3770+ safeCallbackInvoke ( inner . onapplication , this , applicationoptions ) ;
3771+ }
3772+
37073773 /**
37083774 * @param {Buffer } token
37093775 * @param {SocketAddress } address
@@ -4222,6 +4288,7 @@ class QuicEndpoint {
42224288 ongoaway,
42234289 onkeylog,
42244290 onqlog,
4291+ onapplication,
42254292 // Stream-level callbacks applied to each incoming stream.
42264293 onheaders,
42274294 ontrailers,
@@ -4247,6 +4314,7 @@ class QuicEndpoint {
42474314 ongoaway,
42484315 onkeylog,
42494316 onqlog,
4317+ onapplication,
42504318 onheaders,
42514319 ontrailers,
42524320 oninfo,
@@ -4955,6 +5023,8 @@ function processSessionOptions(options, config = kEmptyObject) {
49555023 ongoaway,
49565024 onkeylog,
49575025 onqlog,
5026+ onapplication,
5027+ // Application level options changed, e.g. HTTP/3 settings related
49585028 // Stream-level callbacks.
49595029 onheaders,
49605030 ontrailers,
@@ -5060,6 +5130,7 @@ function processSessionOptions(options, config = kEmptyObject) {
50605130 ongoaway,
50615131 onkeylog,
50625132 onqlog,
5133+ onapplication,
50635134 onheaders,
50645135 ontrailers,
50655136 oninfo,
0 commit comments