@@ -44,6 +44,62 @@ const xOriginRedirectTest = suite === 'happy-dom' ? test.fails : test
4444 */
4545const onHandlerTest = suite === 'workerd' ? test . fails : test
4646
47+ const bufferedEventTypes = [
48+ { name : 'nameless' , eventType : '' } ,
49+ { name : 'message' , eventType : 'message' } ,
50+ { name : 'notice' , eventType : 'notice' } ,
51+ ]
52+
53+ test . each ( bufferedEventTypes ) (
54+ 'stops dispatching buffered $name events when a listener closes the connection' ,
55+ async ( { eventType} ) => {
56+ const seen : string [ ] = [ ]
57+ const onMessage = getCallCounter ( { name : 'first message' } )
58+ const es = new OurEventSource ( `${ serverUrl } /message-burst?event=${ eventType } ` , {
59+ async fetch ( url , init ) {
60+ const response = await request ( url , init )
61+ // Keep the real HTTP exchange, but make the chunk boundary deterministic.
62+ const body = await response . arrayBuffer ( )
63+ return new Response ( body , { status : response . status , headers : response . headers } )
64+ } ,
65+ } )
66+
67+ es . addEventListener ( eventType || 'message' , ( event ) => {
68+ seen . push ( event . data )
69+ es . close ( )
70+ onMessage . listener ( event )
71+ } )
72+
73+ try {
74+ await onMessage . waitForCallCount ( 1 )
75+ expect ( seen ) . toEqual ( [ 'first' ] )
76+ expect ( es . readyState ) . toBe ( OurEventSource . CLOSED )
77+ } finally {
78+ es . close ( )
79+ }
80+ } ,
81+ )
82+
83+ test . each ( bufferedEventTypes ) (
84+ 'dispatches every buffered $name event while open' ,
85+ async ( { eventType} ) => {
86+ const seen : string [ ] = [ ]
87+ const onMessage = getCallCounter ( { name : 'messages' } )
88+ const es = new OurEventSource ( `${ serverUrl } /message-burst?event=${ eventType } ` , esInit )
89+ es . addEventListener ( eventType || 'message' , ( event ) => {
90+ seen . push ( event . data )
91+ onMessage . listener ( event )
92+ } )
93+
94+ try {
95+ await onMessage . waitForCallCount ( 3 )
96+ expect ( seen ) . toEqual ( [ 'first' , 'second' , 'third' ] )
97+ } finally {
98+ es . close ( )
99+ }
100+ } ,
101+ )
102+
47103test ( 'can connect, receive message, manually disconnect' , async ( ) => {
48104 const onMessage = getCallCounter ( { name : 'onMessage' } )
49105 const es = new OurEventSource ( new URL ( `${ serverUrl } /` ) )
0 commit comments