3
3
using AngleSharp . Attributes ;
4
4
using AngleSharp . Dom ;
5
5
using AngleSharp . Dom . Events ;
6
+ using AngleSharp . Html ;
6
7
using AngleSharp . Io . Extensions ;
7
8
using System ;
8
9
using System . Linq ;
@@ -20,24 +21,29 @@ public class WebSocket : EventTarget, IDisposable
20
21
{
21
22
#region Fields
22
23
23
- const Int32 ReceiveChunkSize = 2048 ;
24
- const Int32 SendChunkSize = 1024 ;
24
+ private const Int32 ReceiveChunkSize = 2048 ;
25
+ private const Int32 SendChunkSize = 1024 ;
25
26
26
- readonly Url _url ;
27
- readonly CancellationTokenSource _cts ;
28
- readonly ClientWebSocket _ws ;
29
- readonly IWindow _window ;
27
+ private readonly Url _url ;
28
+ private readonly CancellationTokenSource _cts ;
29
+ private readonly ClientWebSocket _ws ;
30
+ private readonly IWindow _window ;
30
31
31
32
WebSocketReadyState _state ;
32
33
33
34
#endregion
34
35
35
36
#region Event Names
36
37
37
- static readonly String OpenEvent = "open" ;
38
- static readonly String CloseEvent = "close" ;
39
- static readonly String MessageEvent = "message" ;
40
- static readonly String ErrorEvent = "error" ;
38
+ /// <summary>
39
+ /// The open event name.
40
+ /// </summary>
41
+ public static readonly String OpenEvent = "open" ;
42
+
43
+ /// <summary>
44
+ /// The close event name.
45
+ /// </summary>
46
+ public static readonly String CloseEvent = "close" ;
41
47
42
48
#endregion
43
49
@@ -59,8 +65,8 @@ public event DomEventHandler Opened
59
65
[ DomName ( "onmessage" ) ]
60
66
public event DomEventHandler Message
61
67
{
62
- add { AddEventListener ( MessageEvent , value , false ) ; }
63
- remove { RemoveEventListener ( MessageEvent , value , false ) ; }
68
+ add { AddEventListener ( EventNames . Message , value , false ) ; }
69
+ remove { RemoveEventListener ( EventNames . Message , value , false ) ; }
64
70
}
65
71
66
72
/// <summary>
@@ -69,8 +75,8 @@ public event DomEventHandler Message
69
75
[ DomName ( "onerror" ) ]
70
76
public event DomEventHandler Error
71
77
{
72
- add { AddEventListener ( ErrorEvent , value , false ) ; }
73
- remove { RemoveEventListener ( ErrorEvent , value , false ) ; }
78
+ add { AddEventListener ( EventNames . Error , value , false ) ; }
79
+ remove { RemoveEventListener ( EventNames . Error , value , false ) ; }
74
80
}
75
81
76
82
/// <summary>
@@ -122,22 +128,7 @@ public WebSocket(IWindow window, String url, params String[] protocols)
122
128
123
129
_ws . Options . KeepAliveInterval = TimeSpan . FromSeconds ( 20 ) ;
124
130
ConnectAsync ( url ) . Forget ( ) ;
125
- }
126
-
127
- async Task ConnectAsync ( String url )
128
- {
129
- try
130
- {
131
- await _ws . ConnectAsync ( new Uri ( url ) , _cts . Token ) . ConfigureAwait ( false ) ;
132
- _state = WebSocketReadyState . Open ;
133
- OnConnected ( ) ;
134
- ListenAsync ( ) . Forget ( ) ;
135
- }
136
- catch ( Exception ex )
137
- {
138
- _state = WebSocketReadyState . Closed ;
139
- OnError ( ex ) ;
140
- }
131
+ _window . Unloaded += OnUnload ;
141
132
}
142
133
143
134
#endregion
@@ -225,7 +216,34 @@ void IDisposable.Dispose()
225
216
226
217
#region Helpers
227
218
228
- static Boolean IsValid ( String protocol )
219
+ private async Task ConnectAsync ( String url )
220
+ {
221
+ try
222
+ {
223
+ await _ws . ConnectAsync ( new Uri ( url ) , _cts . Token ) . ConfigureAwait ( false ) ;
224
+ _state = WebSocketReadyState . Open ;
225
+ OnConnected ( ) ;
226
+ ListenAsync ( ) . Forget ( ) ;
227
+ }
228
+ catch ( Exception ex )
229
+ {
230
+ _state = WebSocketReadyState . Closed ;
231
+ OnError ( ex ) ;
232
+ }
233
+ }
234
+
235
+ private void OnUnload ( Object sender , Event ev )
236
+ {
237
+ RemoveEventListeners ( ) ;
238
+
239
+ if ( _state != WebSocketReadyState . Closed && _state != WebSocketReadyState . Closing )
240
+ {
241
+ CloseAsync ( ) . Wait ( ) ;
242
+ _ws . Dispose ( ) ;
243
+ }
244
+ }
245
+
246
+ private static Boolean IsValid ( String protocol )
229
247
{
230
248
for ( var i = 0 ; i < protocol . Length ; i ++ )
231
249
{
@@ -238,7 +256,7 @@ static Boolean IsValid(String protocol)
238
256
return true ;
239
257
}
240
258
241
- async Task SendAsync ( String message )
259
+ private async Task SendAsync ( String message )
242
260
{
243
261
var messageBuffer = Encoding . UTF8 . GetBytes ( message ) ;
244
262
var remainder = 0 ;
@@ -262,15 +280,15 @@ async Task SendAsync(String message)
262
280
}
263
281
}
264
282
265
- async Task CloseAsync ( )
283
+ private async Task CloseAsync ( )
266
284
{
267
285
_state = WebSocketReadyState . Closing ;
268
286
await _ws . CloseAsync ( WebSocketCloseStatus . NormalClosure , String . Empty , _cts . Token ) . ConfigureAwait ( false ) ;
269
287
CancelListener ( ) ;
270
288
OnDisconnected ( ) ;
271
289
}
272
290
273
- async Task ListenAsync ( )
291
+ private async Task ListenAsync ( )
274
292
{
275
293
var buffer = new Byte [ ReceiveChunkSize ] ;
276
294
var stringResult = new StringBuilder ( ) ;
@@ -305,35 +323,35 @@ async Task ListenAsync()
305
323
}
306
324
}
307
325
308
- void CancelListener ( )
326
+ private void CancelListener ( )
309
327
{
310
328
_cts . Cancel ( ) ;
311
329
_ws . Abort ( ) ;
312
330
_state = WebSocketReadyState . Closed ;
313
331
}
314
332
315
- void OnMessage ( String message )
333
+ private void OnMessage ( String message )
316
334
{
317
335
var evt = new MessageEvent ( ) ;
318
- evt . Init ( MessageEvent , false , false , message , _url . Origin , String . Empty , _window ) ;
336
+ evt . Init ( EventNames . Message , false , false , message , _url . Origin , String . Empty , _window ) ;
319
337
this . Dispatch ( evt ) ;
320
338
}
321
339
322
- void OnError ( Exception ex )
340
+ private void OnError ( Exception ex )
323
341
{
324
342
var evt = new ErrorEvent ( ) ;
325
- evt . Init ( ErrorEvent , false , false ) ;
343
+ evt . Init ( EventNames . Error , false , false ) ;
326
344
this . Dispatch ( evt ) ;
327
345
}
328
346
329
- void OnDisconnected ( )
347
+ private void OnDisconnected ( )
330
348
{
331
349
var evt = new Event ( ) ;
332
350
evt . Init ( CloseEvent , false , false ) ;
333
351
this . Dispatch ( evt ) ;
334
352
}
335
353
336
- void OnConnected ( )
354
+ private void OnConnected ( )
337
355
{
338
356
var evt = new Event ( ) ;
339
357
evt . Init ( OpenEvent , false , false ) ;
0 commit comments