@@ -81,42 +81,31 @@ class Channel<T = unknown> {
81
81
#onmessage: ( response : T ) => void = ( ) => {
82
82
// no-op
83
83
}
84
+ // the id is used as a mechanism to preserve message order
84
85
#nextMessageId = 0
85
- #pendingMessages: Record < string , T > = { }
86
+ #pendingMessages: T [ ] = [ ]
86
87
87
88
constructor ( ) {
88
89
this . id = transformCallback (
89
90
( { 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) {
93
93
this . #onmessage( message )
94
+ this . #nextMessageId += 1
94
95
95
96
// 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
117
103
}
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
120
109
}
121
110
}
122
111
)
0 commit comments