@@ -7,17 +7,31 @@ type Props = {
7
7
protocols ?: string [ ] ;
8
8
} ;
9
9
10
+ type Mutable = {
11
+ connect : ( ) => Promise < void > ;
12
+ emit : (
13
+ event : string ,
14
+ message ?: unknown ,
15
+ response ?: ( message ?: unknown ) => void ,
16
+ ) => void ;
17
+ on : (
18
+ event : "connected" | "disconnected" | "error" ,
19
+ callback : ( data ?: unknown ) => void ,
20
+ ) => ( ) => void ;
21
+ close : ( ) => void ;
22
+ } ;
23
+
10
24
enum ReadyState {
11
25
CONNECTING ,
12
26
OPEN ,
13
27
CLOSING ,
14
- CLOSED
28
+ CLOSED ,
15
29
}
16
30
17
31
const getRandomString = ( length : number ) => {
18
- let result = '' ;
32
+ let result = "" ;
19
33
const characters =
20
- ' ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' ;
34
+ " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ;
21
35
const charactersLength = characters . length ;
22
36
let counter = 0 ;
23
37
while ( counter < length ) {
@@ -34,101 +48,115 @@ export const getClientSocket = ({
34
48
reconnectInterval = 1_000 ,
35
49
silent = false ,
36
50
protocols = [ ] ,
37
- } : Props ) => {
38
- const events : Record < string , any [ ] > = { } ;
51
+ } : Props ) : Mutable => {
52
+ const events : Record < string , ( ( data ?: unknown ) => unknown | null ) [ ] > = { } ;
39
53
40
- let socket ;
54
+ let socket : WebSocket ;
41
55
let reconnects = 0 ;
42
56
let isConnected = false ;
43
- let isClosed = false
44
-
45
- const emitEventCallback = ( event : string , data ?: any ) => {
46
- if ( ! events [ event ] ) return ;
47
-
48
- for ( const callback of events [ event ] ) callback ?.( data )
49
- }
50
-
51
- const connect = async ( ) =>
52
- new Promise ( ( resolve , reject ) => {
57
+ let isClosed = false ;
58
+
59
+ const emitEventCallback = ( event : string , data ?: unknown ) => {
60
+ if ( ! events [ event ] ) return ;
61
+
62
+ for ( const callback of events [ event ] ) callback ?.( data ) ;
63
+ } ;
64
+
65
+ const connect = ( ) : Promise < void > =>
66
+ new Promise < void > ( ( resolve , reject ) => {
53
67
try {
54
- if ( isConnected ) return resolve ( null ) ;
55
-
68
+ if ( isConnected ) return resolve ( ) ;
69
+
56
70
! silent && reconnects === 0 && console . log ( `Connecting to ${ url } !` ) ;
57
71
socket = new WebSocket ( url , protocols ) ;
58
-
72
+
59
73
// Connection opened
60
74
socket . addEventListener ( "open" , ( ) => {
61
75
isConnected = true ;
62
76
! silent && console . log ( `Connected to ${ url } !` ) ;
63
- emitEventCallback ( ' connected' )
64
- resolve ( null ) ;
77
+ emitEventCallback ( " connected" ) ;
78
+ resolve ( ) ;
65
79
reconnects = 0 ;
66
80
} ) ;
67
-
81
+
68
82
// Listen for messages
69
- socket . addEventListener ( "message" , async ( { data } ) => {
83
+ socket . addEventListener ( "message" , ( { data } ) => {
70
84
const { event, message } = JSON . parse ( data ) ;
71
- if ( ! events [ event ] ) return
72
-
73
- emitEventCallback ( event , message )
85
+ if ( ! events [ event ] ) return ;
86
+
87
+ emitEventCallback ( event , message ) ;
74
88
} ) ;
75
-
76
- socket . addEventListener ( "error" , ( message ) => emitEventCallback ( 'error' , message ) ) ;
77
-
89
+
90
+ socket . addEventListener ( "error" , ( message ) =>
91
+ emitEventCallback ( "error" , message ) ,
92
+ ) ;
93
+
78
94
socket . addEventListener ( "close" , ( message ) => {
79
95
! silent && isConnected && console . log ( `Disconnected from ${ url } !` ) ;
80
-
96
+
81
97
// resovle if it's already closed
82
- if ( isClosed ) return resolve ( null ) ;
83
-
98
+ if ( isClosed ) return resolve ( ) ;
99
+
84
100
isConnected = false ;
85
101
if ( reconnect && reconnectIntents > reconnects ) {
86
102
reconnects ++ ;
87
103
! silent &&
88
- console . log (
89
- `(${ reconnects } /${ reconnectIntents } ) Reconnecting to ${ url } in ${ reconnectInterval } ms...` ,
90
- ) ;
104
+ console . log (
105
+ `(${ reconnects } /${ reconnectIntents } ) Reconnecting to ${ url } in ${ reconnectInterval } ms...` ,
106
+ ) ;
91
107
setTimeout ( async ( ) => {
92
108
await connect ( ) ;
93
- resolve ( null ) ;
109
+ resolve ( ) ;
94
110
} , reconnectInterval ) ;
95
111
return ;
96
112
}
97
- emitEventCallback ( ' disconnected' , message )
98
- resolve ( null ) ;
113
+ emitEventCallback ( " disconnected" , message ) ;
114
+ resolve ( ) ;
99
115
} ) ;
100
116
} catch ( e ) {
101
- reject ( e )
117
+ reject ( e ) ;
102
118
}
103
119
} ) ;
104
120
105
- const emit = ( event : string , message ?: any , response ?: ( message ?: any ) => void ) => {
106
- if ( socket . readyState !== ReadyState . OPEN )
107
- throw new Error ( `Socket is not open (${ ReadyState [ socket . readyState ] } }) {${ event } :${ message } }!` )
108
-
109
- let responseEventId = null
110
- if ( response ) {
111
- responseEventId = getRandomString ( 32 )
112
-
113
- on ( `${ event } #${ responseEventId } ` , ( data ) => response ( data ) )
121
+ const emit = (
122
+ event : string ,
123
+ message ?: unknown ,
124
+ response ?: ( message ?: unknown ) => void ,
125
+ ) : void => {
126
+ if ( socket . readyState !== ReadyState . OPEN )
127
+ throw new Error (
128
+ `Socket is not open (${ ReadyState [ socket . readyState ] } }) {${ event } :${ message } }!` ,
129
+ ) ;
130
+
131
+ let responseEventId = null ;
132
+ if ( response ) {
133
+ responseEventId = getRandomString ( 32 ) ;
134
+
135
+ on ( `${ event } #${ responseEventId } ` , ( data ) => response ( data ) ) ;
114
136
}
115
- socket . send ( JSON . stringify ( { event, message : message || { } , responseEventId } ) ) ;
116
- }
137
+ socket . send (
138
+ JSON . stringify ( { event, message : message || { } , responseEventId } ) ,
139
+ ) ;
140
+ } ;
117
141
118
142
const on = (
119
143
event : "connected" | "disconnected" | "error" | string ,
120
- callback : ( data ?: any ) => void ,
121
- ) => {
122
- if ( ! events [ event ] ) events [ event ] = [ ]
123
-
124
- const index = events [ event ] . push ( callback ) - 1
125
- return ( ) => events [ event ] = events [ event ] . map ( ( callback , $index ) => index === $index ? null : callback )
126
- }
144
+ callback : ( data ?: unknown ) => void ,
145
+ ) : ( ( ) => void ) => {
146
+ if ( ! events [ event ] ) events [ event ] = [ ] ;
147
+
148
+ const index = events [ event ] . push ( callback ) - 1 ;
149
+ return ( ) =>
150
+ ( events [ event ] = events [ event ] . map < ( data ?: unknown ) => unknown > (
151
+ ( callback , $index ) =>
152
+ ( index === $index ? null : callback ) as ( data ?: unknown ) => unknown ,
153
+ ) ) ;
154
+ } ;
127
155
128
156
const close = ( ) => {
129
- isClosed = true
157
+ isClosed = true ;
130
158
socket . close ( ) ;
131
- }
159
+ } ;
132
160
133
161
return {
134
162
connect,
0 commit comments