1
+ /* global Event CloseEvent MessageEvent */
2
+
1
3
import * as eio from 'engine.io-client' ;
2
4
import * as urllib from 'url' ;
3
5
@@ -28,24 +30,41 @@ const readyStateStringToValue = new Map([
28
30
[ 'closed' , 3 ] ,
29
31
] ) ;
30
32
33
+ Object . keys ( readyStateStringToValue ) ;
34
+
31
35
export class EIOCompat {
32
- public onclose : ( ( ev : CloseEvent ) => any ) | null ;
33
- public onerror : ( ( ev : Event ) => any ) | null ;
34
- public onmessage : ( ( ev : MessageEvent ) => any ) | null ;
35
- public onopen : ( ( ev : Event ) => any ) | null ;
36
+ public onclose : ( ( ev : CloseEvent ) => unknown ) | null ;
37
+
38
+ public onerror : ( ( ev : Event ) => unknown ) | null ;
39
+
40
+ public onmessage : ( ( ev : MessageEvent ) => unknown ) | null ;
41
+
42
+ public onopen : ( ( ev : Event ) => unknown ) | null ;
43
+
36
44
public url : string ;
45
+
37
46
public extensions : string ;
47
+
38
48
public protocol : string ;
49
+
39
50
public bufferedAmount : number ;
51
+
40
52
public binaryType : BinaryType ;
53
+
41
54
public readyState : number ;
55
+
42
56
public incomingSequence : number ;
57
+
43
58
public outOfOrderQueue : { [ sequence : number ] : ArrayBuffer } ;
59
+
44
60
public outgoingSequence : number ;
45
61
46
62
readonly CLOSED = 3 ;
63
+
47
64
readonly CLOSING = 2 ;
65
+
48
66
readonly OPEN = 1 ;
67
+
49
68
readonly CONNECTING = 0 ;
50
69
51
70
private eioSocket : eio . Socket ;
@@ -78,7 +97,7 @@ export class EIOCompat {
78
97
}
79
98
} ) ;
80
99
81
- this . eioSocket . on ( 'close' , reason => {
100
+ this . eioSocket . on ( 'close' , ( reason ) => {
82
101
this . setReadyState ( ) ;
83
102
if ( this . onclose != null ) {
84
103
const event = new CloseEvent ( 'close' , {
@@ -91,49 +110,52 @@ export class EIOCompat {
91
110
}
92
111
} ) ;
93
112
94
- this . eioSocket . on ( 'message' , data => {
113
+ this . eioSocket . on ( 'message' , ( data ) => {
95
114
this . setReadyState ( ) ;
96
- if ( this . onmessage != null ) {
97
- if ( typeof data === 'string' ) {
98
- throw new Error ( 'expected data to be ArrayBuffer not string' ) ;
99
- }
115
+ if ( this . onmessage == null ) {
116
+ return ;
117
+ }
118
+
119
+ if ( typeof data === 'string' ) {
120
+ throw new Error ( 'expected data to be ArrayBuffer not string' ) ;
121
+ }
122
+
123
+ const view = new DataView ( data ) ;
124
+ const sequence = view . getUint32 ( 0 ) ;
125
+
126
+ if ( this . incomingSequence !== sequence ) {
127
+ // We didn't get the message we expected
128
+ // put it in the queue until we get the expected message
129
+ this . outOfOrderQueue [ sequence ] = data . slice ( sequenceBytesCount ) ;
130
+
131
+ return ;
132
+ }
133
+
134
+ this . incomingSequence = sequence + 1 ;
100
135
101
- const view = new DataView ( data ) ;
102
- const sequence = view . getUint32 ( 0 ) ;
136
+ const message = new MessageEvent ( 'message' , {
137
+ data : data . slice ( sequenceBytesCount ) ,
138
+ } ) ;
103
139
104
- if ( this . incomingSequence !== sequence ) {
105
- // We didn't get the message we expected
106
- // put it in the queue until we get the expected message
107
- this . outOfOrderQueue [ sequence ] = data . slice ( sequenceBytesCount ) ;
140
+ const onmessage = this . onmessage . bind ( this ) ;
108
141
109
- return ;
110
- }
142
+ onmessage ( message ) ;
111
143
112
- this . incomingSequence = sequence + 1 ;
144
+ const queuedSequences = Object . keys ( this . outOfOrderQueue ) ;
145
+ if ( queuedSequences . length > 0 ) {
146
+ // We got the message we expected but we have other messages
147
+ // that were out of order and queued up
148
+ queuedSequences . sort ( ) . forEach ( ( seq ) => {
149
+ onmessage (
150
+ new MessageEvent ( 'message' , {
151
+ data : this . outOfOrderQueue [ + seq ] ,
152
+ } ) ,
153
+ ) ;
113
154
114
- const message = new MessageEvent ( 'message' , {
115
- data : data . slice ( sequenceBytesCount ) ,
155
+ this . incomingSequence = + seq + 1 ;
116
156
} ) ;
117
157
118
- this . onmessage . call ( this , message ) ;
119
-
120
- const queuedSequences = Object . keys ( this . outOfOrderQueue ) ;
121
- if ( queuedSequences . length > 0 ) {
122
- // We got the message we expected but we have other messages
123
- // that were out of order and queued up
124
- for ( let seq of queuedSequences . sort ( ) ) {
125
- this . onmessage . call (
126
- this ,
127
- new MessageEvent ( 'message' , {
128
- data : this . outOfOrderQueue [ + seq ] ,
129
- } ) ,
130
- ) ;
131
-
132
- this . incomingSequence = + seq + 1 ;
133
- }
134
-
135
- this . outOfOrderQueue = { } ;
136
- }
158
+ this . outOfOrderQueue = { } ;
137
159
}
138
160
} ) ;
139
161
@@ -147,21 +169,18 @@ export class EIOCompat {
147
169
}
148
170
149
171
setReadyState ( ) {
150
- // @ts -ignore
172
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore
173
+ // @ts -ignore engine.io-client doesn't have typing for readyState :/
151
174
this . readyState = readyStateStringToValue . get ( this . eioSocket . readyState ) ;
152
175
}
153
176
154
177
send ( buffer : ArrayBuffer ) {
155
- const sequencedBuffer = new ArrayBuffer (
156
- sequenceBytesCount + buffer . byteLength ,
157
- ) ;
158
- new Uint8Array ( sequencedBuffer ) . set (
159
- new Uint8Array ( buffer ) ,
160
- sequenceBytesCount ,
161
- ) ;
178
+ const sequencedBuffer = new ArrayBuffer ( sequenceBytesCount + buffer . byteLength ) ;
179
+ new Uint8Array ( sequencedBuffer ) . set ( new Uint8Array ( buffer ) , sequenceBytesCount ) ;
162
180
163
181
const view = new DataView ( sequencedBuffer ) ;
164
- view . setUint32 ( 0 , this . outgoingSequence ++ ) ;
182
+ view . setUint32 ( 0 , this . outgoingSequence ) ;
183
+ this . outgoingSequence += 1 ;
165
184
166
185
this . eioSocket . send ( sequencedBuffer ) ;
167
186
this . setReadyState ( ) ;
0 commit comments