Skip to content

Commit 8898f03

Browse files
committed
Restructured #5
1 parent 440a0c5 commit 8898f03

File tree

1 file changed

+42
-25
lines changed

1 file changed

+42
-25
lines changed

AngleSharp.Io/Dom/WebSocket.cs

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using AngleSharp.Dom.Events;
66
using AngleSharp.Io.Extensions;
77
using System;
8-
using System.IO;
98
using System.Linq;
109
using System.Net.WebSockets;
1110
using System.Text;
@@ -27,6 +26,7 @@ public class WebSocket : EventTarget, IDisposable
2726
readonly Url _url;
2827
readonly CancellationTokenSource _cts;
2928
readonly ClientWebSocket _ws;
29+
readonly IWindow _window;
3030

3131
WebSocketReadyState _state;
3232

@@ -78,14 +78,16 @@ public event DomEventHandler Closed
7878
/// <summary>
7979
/// Creates a new WebSocket instance.
8080
/// </summary>
81+
/// <param name="window">The parent context.</param>
8182
/// <param name="url">The URL to connect to.</param>
8283
/// <param name="protocols">The protocols to allow.</param>
8384
[DomConstructor]
84-
public WebSocket(String url, params String[] protocols)
85+
public WebSocket(IWindow window, String url, params String[] protocols)
8586
{
8687
_url = new Url(url);
8788
_state = WebSocketReadyState.Connecting;
8889
_cts = new CancellationTokenSource();
90+
_window = window;
8991

9092
if (_url.IsInvalid || _url.IsRelative)
9193
throw new DomException(DomError.Syntax);
@@ -103,8 +105,9 @@ public WebSocket(String url, params String[] protocols)
103105
async Task ConnectAsync(String url)
104106
{
105107
await _ws.ConnectAsync(new Uri(url), _cts.Token).ConfigureAwait(false);
108+
_state = WebSocketReadyState.Open;
106109
OnConnected();
107-
StartListen().Forget();
110+
ListenAsync().Forget();
108111
}
109112

110113
#endregion
@@ -178,15 +181,14 @@ public void Close()
178181
{
179182
if (_state != WebSocketReadyState.Closed && _state != WebSocketReadyState.Closing)
180183
{
181-
_state = WebSocketReadyState.Closing;
182-
StopListen();
183-
OnDisconnected();
184+
CloseAsync().Forget();
184185
}
185186
}
186187

187188
void IDisposable.Dispose()
188189
{
189-
StopListen();
190+
CancelListener();
191+
_ws.Dispose();
190192
}
191193

192194
#endregion
@@ -226,7 +228,15 @@ async Task SendAsync(String message)
226228
}
227229
}
228230

229-
async Task StartListen()
231+
async Task CloseAsync()
232+
{
233+
_state = WebSocketReadyState.Closing;
234+
await _ws.CloseAsync(WebSocketCloseStatus.NormalClosure, String.Empty, _cts.Token).ConfigureAwait(false);
235+
CancelListener();
236+
OnDisconnected();
237+
}
238+
239+
async Task ListenAsync()
230240
{
231241
var buffer = new Byte[ReceiveChunkSize];
232242
var stringResult = new StringBuilder();
@@ -239,11 +249,7 @@ async Task StartListen()
239249
var result = await _ws.ReceiveAsync(segment, _cts.Token).ConfigureAwait(false);
240250

241251
if (result.MessageType == WebSocketMessageType.Close)
242-
{
243-
await _ws.CloseAsync(WebSocketCloseStatus.NormalClosure, String.Empty, _cts.Token).ConfigureAwait(false);
244-
OnDisconnected();
245-
return;
246-
}
252+
break;
247253

248254
stringResult.Append(Encoding.UTF8.GetString(buffer, 0, result.Count));
249255

@@ -253,39 +259,50 @@ async Task StartListen()
253259
stringResult.Clear();
254260
}
255261
}
262+
263+
await CloseAsync().ConfigureAwait(false);
256264
}
257-
catch
265+
catch (Exception ex)
258266
{
267+
OnError(ex);
268+
CancelListener();
259269
OnDisconnected();
260270
}
261-
finally
262-
{
263-
StopListen();
264-
}
265271
}
266272

267-
void StopListen()
273+
void CancelListener()
268274
{
269275
_cts.Cancel();
270276
_ws.Abort();
271-
_ws.Dispose();
277+
_state = WebSocketReadyState.Closed;
272278
}
273279

274280
void OnMessage(String message)
275281
{
276-
this.Dispatch(new MessageEvent(MessageEvent, data: message, origin: _url.Href));
282+
var evt = new MessageEvent();
283+
evt.Init(MessageEvent, false, false, message, _url.Origin, String.Empty, _window);
284+
this.Dispatch(evt);
285+
}
286+
287+
void OnError(Exception ex)
288+
{
289+
var evt = new ErrorEvent();
290+
evt.Init(ErrorEvent, false, false);
291+
this.Dispatch(evt);
277292
}
278293

279294
void OnDisconnected()
280295
{
281-
_state = WebSocketReadyState.Closed;
282-
this.Dispatch(new Event(CloseEvent));
296+
var evt = new Event();
297+
evt.Init(CloseEvent, false, false);
298+
this.Dispatch(evt);
283299
}
284300

285301
void OnConnected()
286302
{
287-
_state = WebSocketReadyState.Open;
288-
this.Dispatch(new Event(OpenEvent));
303+
var evt = new Event();
304+
evt.Init(OpenEvent, false, false);
305+
this.Dispatch(evt);
289306
}
290307

291308
#endregion

0 commit comments

Comments
 (0)