1
+ import Gleap , { GleapFrameManager , GleapMetaDataManager , GleapSession } from "./Gleap" ;
1
2
import { gleapDataParser } from "./GleapHelper" ;
2
- import Gleap , { GleapSession , GleapNotificationManager , GleapMetaDataManager , GleapFrameManager } from "./Gleap" ;
3
+
4
+ const serverUrl = 'ws://localhost:8080' ;
3
5
4
6
export default class GleapStreamedEvent {
5
7
eventArray = [ ] ;
@@ -8,8 +10,99 @@ export default class GleapStreamedEvent {
8
10
errorCount = 0 ;
9
11
streamingEvents = false ;
10
12
lastUrl = undefined ;
11
- stopped = false ;
12
13
mainLoopTimeout = null ;
14
+ socket = null ;
15
+ connectedWebSocketGleapId = null ;
16
+ connectionTimeout = null ;
17
+
18
+ cleanupWebSocket ( ) {
19
+ if ( this . connectionTimeout ) {
20
+ clearTimeout ( this . connectionTimeout ) ;
21
+ this . connectionTimeout = null ;
22
+ }
23
+
24
+ if ( this . socket ) {
25
+ this . socket . onclose = null ;
26
+ this . socket . onerror = null ;
27
+ this . socket . onmessage = null ;
28
+ this . socket . onopen = null ;
29
+ this . socket . close ( ) ;
30
+ this . socket = null ;
31
+ }
32
+ }
33
+
34
+ initWebSocket ( ) {
35
+ const self = this ;
36
+ this . connectedWebSocketGleapId = GleapSession . getInstance ( ) . session . gleapId ;
37
+
38
+ console . log ( "Init websocket" ) ;
39
+
40
+ if ( ! GleapSession . getInstance ( ) . session || ! GleapSession . getInstance ( ) . sdkKey ) {
41
+ return ;
42
+ }
43
+
44
+ this . socket = new WebSocket ( `${ serverUrl } ?gleapId=${ GleapSession . getInstance ( ) . session . gleapId } &gleapHash=${ GleapSession . getInstance ( ) . session . gleapHash } &apiKey=${ GleapSession . getInstance ( ) . sdkKey } &sdkVersion=${ SDK_VERSION } ` ) ;
45
+
46
+ // Set a timeout for the connection to open
47
+ this . connectionTimeout = setTimeout ( ( ) => {
48
+ if ( self . socket . readyState !== self . socket . OPEN ) {
49
+ self . socket . close ( ) ;
50
+ console . error ( 'Connection timeout' ) ;
51
+
52
+ GleapStreamedEvent . getInstance ( ) . initWebSocket ( ) ;
53
+ }
54
+ } , 5000 ) ; // Set timeout to 5 seconds
55
+
56
+ // Event handler for the open event
57
+ this . socket . onopen = ( event ) => {
58
+ console . log ( 'Connected to the WebSocket server:' , event ) ;
59
+
60
+ // Clear the connection timeout as the connection is open
61
+ if ( self . connectionTimeout ) {
62
+ clearTimeout ( self . connectionTimeout ) ;
63
+ self . connectionTimeout = null ;
64
+ }
65
+ } ;
66
+
67
+ // Event handler for the message event to handle incoming messages
68
+ this . socket . onmessage = ( event ) => {
69
+ this . processMessage ( JSON . parse ( event . data ) ) ;
70
+ } ;
71
+
72
+ // Event handler for the error event
73
+ this . socket . onerror = ( error ) => {
74
+ console . error ( 'WebSocket Error:' , error ) ;
75
+ } ;
76
+
77
+ // Event handler for the close event
78
+ this . socket . onclose = ( event ) => {
79
+ // Check event.wasClean to see if the socket was closed cleanly
80
+ if ( event . wasClean ) {
81
+ console . log ( `Closed. Reason: ${ event . reason } Code: ${ event . code } ` ) ;
82
+ } else {
83
+ console . error ( `Connection died. Reason: ${ event . reason } Code: ${ event . code } ` ) ;
84
+ }
85
+
86
+ // Attempt to reconnect after a delay
87
+ setTimeout ( ( ) => {
88
+ GleapStreamedEvent . getInstance ( ) . initWebSocket ( ) ;
89
+ } , 5000 ) ;
90
+ } ;
91
+ }
92
+
93
+ processMessage ( message ) {
94
+ try {
95
+ const { a, u } = message ;
96
+ if ( ! GleapFrameManager . getInstance ( ) . isOpened ( ) ) {
97
+ if ( a ) {
98
+ Gleap . getInstance ( ) . performActions ( a ) ;
99
+ }
100
+ if ( u != null ) {
101
+ GleapNotificationManager . getInstance ( ) . setNotificationCount ( u ) ;
102
+ }
103
+ }
104
+ } catch ( exp ) { }
105
+ }
13
106
14
107
// GleapStreamedEvent singleton
15
108
static instance ;
@@ -29,7 +122,7 @@ export default class GleapStreamedEvent {
29
122
}
30
123
31
124
stop ( ) {
32
- this . stopped = true ;
125
+ this . cleanupMainLoop ( ) ;
33
126
}
34
127
35
128
resetErrorCountLoop ( ) {
@@ -38,18 +131,26 @@ export default class GleapStreamedEvent {
38
131
} , 60000 ) ;
39
132
}
40
133
41
- restart ( ) {
134
+ cleanupMainLoop ( ) {
42
135
if ( this . mainLoopTimeout ) {
43
136
clearInterval ( this . mainLoopTimeout ) ;
44
137
this . mainLoopTimeout = null ;
45
138
}
139
+ }
46
140
141
+ restart ( ) {
142
+ // Only reconnect websockets when needed.
143
+ if ( this . connectedWebSocketGleapId !== GleapSession . getInstance ( ) . session . gleapId ) {
144
+ this . cleanupWebSocket ( ) ;
145
+ this . initWebSocket ( ) ;
146
+ }
147
+
148
+ this . cleanupMainLoop ( ) ;
47
149
this . trackInitialEvents ( ) ;
48
150
this . runEventStreamLoop ( ) ;
49
151
}
50
152
51
153
start ( ) {
52
- this . stopped = false ;
53
154
this . startPageListener ( ) ;
54
155
this . resetErrorCountLoop ( ) ;
55
156
}
@@ -76,9 +177,6 @@ export default class GleapStreamedEvent {
76
177
startPageListener ( ) {
77
178
const self = this ;
78
179
setInterval ( function ( ) {
79
- if ( self . stopped ) {
80
- return ;
81
- }
82
180
self . logCurrentPage ( ) ;
83
181
} , 1000 ) ;
84
182
}
@@ -106,27 +204,36 @@ export default class GleapStreamedEvent {
106
204
}
107
205
108
206
runEventStreamLoop = ( ) => {
109
- if ( this . stopped ) {
110
- return ;
111
- }
112
-
113
207
const self = this ;
114
208
this . streamEvents ( ) ;
115
209
116
210
this . mainLoopTimeout = setTimeout ( function ( ) {
117
211
self . runEventStreamLoop ( ) ;
118
- } , 10000 ) ;
212
+ } , 2000 ) ;
119
213
} ;
120
214
121
215
streamEvents = ( ) => {
122
216
if ( ! GleapSession . getInstance ( ) . ready || this . streamingEvents || this . errorCount > 2 ) {
217
+ console . log ( "Not ready to stream events" ) ;
218
+ return ;
219
+ }
220
+
221
+ // Nothing to stream.
222
+ if ( this . streamedEventArray . length === 0 ) {
223
+ console . log ( "Nothing to stream" ) ;
224
+ return ;
225
+ }
226
+
227
+ // Sockets not connected.
228
+ if ( ! this . socket || this . socket . readyState !== this . socket . OPEN ) {
229
+ console . log ( "Socket not connected" ) ;
123
230
return ;
124
231
}
125
232
126
233
const self = this ;
127
234
this . streamingEvents = true ;
128
235
129
- const preGleapId = GleapSession . getInstance ( ) . getGleapId ( ) ;
236
+ console . log ( this . streamedEventArray ) ;
130
237
131
238
const http = new XMLHttpRequest ( ) ;
132
239
http . open ( "POST" , GleapSession . getInstance ( ) . apiUrl + "/sessions/ping" ) ;
@@ -140,22 +247,6 @@ export default class GleapStreamedEvent {
140
247
if ( http . readyState === 4 ) {
141
248
if ( http . status === 200 || http . status === 201 ) {
142
249
self . errorCount = 0 ;
143
-
144
- // Only perform actions if gleapId was not changed.
145
- if ( GleapSession . getInstance ( ) . getGleapId ( ) === preGleapId ) {
146
- try {
147
- const response = JSON . parse ( http . responseText ) ;
148
- const { a, u } = response ;
149
- if ( ! GleapFrameManager . getInstance ( ) . isOpened ( ) ) {
150
- if ( a ) {
151
- Gleap . getInstance ( ) . performActions ( a ) ;
152
- }
153
- if ( u != null ) {
154
- GleapNotificationManager . getInstance ( ) . setNotificationCount ( u ) ;
155
- }
156
- }
157
- } catch ( exp ) { }
158
- }
159
250
} else {
160
251
self . errorCount ++ ;
161
252
}
@@ -171,6 +262,7 @@ export default class GleapStreamedEvent {
171
262
events : this . streamedEventArray ,
172
263
opened : GleapFrameManager . getInstance ( ) . isOpened ( ) ,
173
264
sdkVersion : SDK_VERSION ,
265
+ ws : true ,
174
266
} )
175
267
) ;
176
268
0 commit comments