@@ -204,6 +204,7 @@ const {
204204 kPrivateConstructor,
205205 kReset,
206206 kSendHeaders,
207+ kSessionApplication,
207208 kSessionTicket,
208209 kTrailers,
209210 kVersionNegotiation,
@@ -252,6 +253,7 @@ const {
252253 onSessionReceiveDatagramStatusChannel,
253254 onSessionPathValidationChannel,
254255 onSessionNewTokenChannel,
256+ onSessionApplicationChannel,
255257 onSessionTicketChannel,
256258 onSessionVersionNegotiationChannel,
257259 onSessionOriginChannel,
@@ -453,6 +455,7 @@ const endpointRegistry = new SafeSet();
453455 * @property {OnGoawayCallback } [ongoaway] GOAWAY frame callback.
454456 * @property {OnKeylogCallback } [onkeylog] TLS key-log callback.
455457 * @property {OnQlogCallback } [onqlog] qlog data callback.
458+ * @property {OnApplicationCallback } [onapplication] application options callback.
456459 * @property {OnHeadersCallback } [onheaders] Default per-stream initial-headers callback.
457460 * @property {OnTrailersCallback } [ontrailers] Default per-stream trailing-headers callback.
458461 * @property {OnInfoCallback } [oninfo] Default per-stream informational-headers callback.
@@ -583,6 +586,13 @@ const endpointRegistry = new SafeSet();
583586 * @returns {void }
584587 */
585588
589+ /**
590+ * @callback OnApplicationCallback
591+ * @this {QuicSession}
592+ * @param {ApplicationOptions } applicationoptions
593+ * @returns {void }
594+ */
595+
586596/**
587597 * @callback OnSessionTicketCallback
588598 * @this {QuicSession}
@@ -660,6 +670,14 @@ const endpointRegistry = new SafeSet();
660670 * @returns {void }
661671 */
662672
673+ /**
674+ * Called when `ApplicationOptions` are changed, e.g. HTTP/3 settings.
675+ * @callback OnApplicationCallback
676+ * @this {QuicSession}
677+ * @param {ApplicationOptions } applicationoptions ApplicationOptions object
678+ * @returns {void }
679+ */
680+
663681/**
664682 * @callback OnBlockedCallback
665683 * @this {QuicStream}
@@ -817,6 +835,16 @@ setCallbacks({
817835 preferredAddress ) ;
818836 } ,
819837
838+ /**
839+ * Called when the session's application object is updated
840+ * E.g. http/3 session arrived.
841+ * @param {ApplicationOptions } applicationoptions An application object
842+ */
843+ onSessionApplication ( applicationoptions ) {
844+ debug ( 'session application callback' , this [ kOwner ] ) ;
845+ this [ kOwner ] [ kSessionApplication ] ( applicationoptions ) ;
846+ } ,
847+
820848 /**
821849 * Called when the session generates a new TLS session ticket
822850 * @param {object } ticket An opaque session ticket
@@ -1271,6 +1299,7 @@ function applyCallbacks(session, cbs) {
12711299 if ( cbs . ongoaway ) session . ongoaway = cbs . ongoaway ;
12721300 if ( cbs . onkeylog ) session . onkeylog = cbs . onkeylog ;
12731301 if ( cbs . onqlog ) session . onqlog = cbs . onqlog ;
1302+ if ( cbs . onapplication ) session . onapplication = cbs . onapplication ;
12741303 if ( cbs . onheaders || cbs . ontrailers || cbs . oninfo || cbs . onwanttrailers ) {
12751304 session [ kStreamCallbacks ] = {
12761305 __proto__ : null ,
@@ -2964,6 +2993,25 @@ class QuicSession {
29642993 }
29652994 }
29662995
2996+ /** @type {Function|undefined } */
2997+ get onapplication ( ) {
2998+ assertIsQuicSession ( this ) ;
2999+ return this . #inner. onapplication ;
3000+ }
3001+
3002+ set onapplication ( fn ) {
3003+ assertIsQuicSession ( this ) ;
3004+ const inner = this . #inner;
3005+ if ( fn === undefined ) {
3006+ inner . onapplication = undefined ;
3007+ inner . state . hasApplicationListener = false ;
3008+ } else {
3009+ validateFunction ( fn , 'onapplication' ) ;
3010+ inner . onapplication = FunctionPrototypeBind ( fn , this ) ;
3011+ inner . state . hasApplicationListener = true ;
3012+ }
3013+ }
3014+
29673015 /** @type {Function|undefined } */
29683016 get onversionnegotiation ( ) {
29693017 assertIsQuicSession ( this ) ;
@@ -3551,6 +3599,7 @@ class QuicSession {
35513599 inner . ondatagramstatus = undefined ;
35523600 inner . onpathvalidation = undefined ;
35533601 inner . onsessionticket = undefined ;
3602+ inner . onapplication = undefined ;
35543603 inner . onkeylog = undefined ;
35553604 inner . onversionnegotiation = undefined ;
35563605 inner . onhandshake = undefined ;
@@ -3779,6 +3828,23 @@ class QuicSession {
37793828 safeCallbackInvoke ( inner . onsessionticket , this , ticket ) ;
37803829 }
37813830
3831+ /**
3832+ * @param {ApplicationOptions } applicationoptions
3833+ */
3834+ [ kSessionApplication ] ( applicationoptions ) {
3835+ if ( this . destroyed ) return ;
3836+ if ( onSessionApplicationChannel . hasSubscribers ) {
3837+ onSessionApplicationChannel . publish ( {
3838+ __proto__ : null ,
3839+ applicationoptions,
3840+ session : this ,
3841+ } ) ;
3842+ }
3843+ const inner = this . #inner;
3844+ if ( typeof inner . onapplication === 'function' )
3845+ safeCallbackInvoke ( inner . onapplication , this , applicationoptions ) ;
3846+ }
3847+
37823848 /**
37833849 * @param {Buffer } token
37843850 * @param {SocketAddress } address
@@ -4356,6 +4422,7 @@ class QuicEndpoint {
43564422 ongoaway,
43574423 onkeylog,
43584424 onqlog,
4425+ onapplication,
43594426 // Stream-level callbacks applied to each incoming stream.
43604427 onheaders,
43614428 ontrailers,
@@ -4381,6 +4448,7 @@ class QuicEndpoint {
43814448 ongoaway,
43824449 onkeylog,
43834450 onqlog,
4451+ onapplication,
43844452 onheaders,
43854453 ontrailers,
43864454 oninfo,
@@ -5113,6 +5181,8 @@ function processSessionOptions(options, config = kEmptyObject) {
51135181 ongoaway,
51145182 onkeylog,
51155183 onqlog,
5184+ onapplication,
5185+ // Application level options changed, e.g. HTTP/3 settings related
51165186 // Stream-level callbacks.
51175187 onheaders,
51185188 ontrailers,
@@ -5234,6 +5304,7 @@ function processSessionOptions(options, config = kEmptyObject) {
52345304 ongoaway,
52355305 onkeylog,
52365306 onqlog,
5307+ onapplication,
52375308 onheaders,
52385309 ontrailers,
52395310 oninfo,
0 commit comments