@@ -81,42 +81,31 @@ class Channel<T = unknown> {
8181 #onmessage: ( response : T ) => void = ( ) => {
8282 // no-op
8383 }
84+ // the id is used as a mechanism to preserve message order
8485 #nextMessageId = 0
85- #pendingMessages: Record < string , T > = { }
86+ #pendingMessages: T [ ] = [ ]
8687
8788 constructor ( ) {
8889 this . id = transformCallback (
8990 ( { message, id } : { message : T ; id : number } ) => {
90- // the id is used as a mechanism to preserve message order
91- if ( id === this . #nextMessageId) {
92- this . #nextMessageId = id + 1
91+ // Process the message if we're at the right order
92+ if ( id == this . #nextMessageId) {
9393 this . #onmessage( message )
94+ this . #nextMessageId += 1
9495
9596 // process pending messages
96- const pendingMessageIds = Object . keys ( this . #pendingMessages)
97- if ( pendingMessageIds . length > 0 ) {
98- let nextId = id + 1
99- for ( const pendingId of pendingMessageIds . sort ( ) ) {
100- // if we have the next message, process it
101- if ( parseInt ( pendingId ) === nextId ) {
102- // eslint-disable-next-line security/detect-object-injection
103- const message = this . #pendingMessages[ pendingId ]
104- // eslint-disable-next-line security/detect-object-injection
105- delete this . #pendingMessages[ pendingId ]
106-
107- this . #onmessage( message )
108-
109- // move the id counter to the next message to check
110- nextId += 1
111- } else {
112- // we do not have the next message, let's wait
113- break
114- }
115- }
116- this . #nextMessageId = nextId
97+ while ( this . #nextMessageId in this . #pendingMessages) {
98+ const message = this . #pendingMessages[ this . #nextMessageId]
99+ this . #onmessage( message )
100+ // eslint-disable-next-line @typescript-eslint/no-array-delete
101+ delete this . #pendingMessages[ this . #nextMessageId]
102+ this . #nextMessageId += 1
117103 }
118- } else {
119- this . #pendingMessages[ id . toString ( ) ] = message
104+ }
105+ // Queue the message if we're not
106+ else {
107+ // eslint-disable-next-line security/detect-object-injection
108+ this . #pendingMessages[ id ] = message
120109 }
121110 }
122111 )
0 commit comments