|
@@ -17,9 +17,9 @@ namespace Discord.Net.WebSockets |
|
|
private const int HR_TIMEOUT = -2147012894; |
|
|
private const int HR_TIMEOUT = -2147012894; |
|
|
|
|
|
|
|
|
private readonly ConcurrentQueue<byte[]> _sendQueue; |
|
|
private readonly ConcurrentQueue<byte[]> _sendQueue; |
|
|
private readonly ClientWebSocket _webSocket; |
|
|
|
|
|
private readonly int _sendInterval; |
|
|
private readonly int _sendInterval; |
|
|
|
|
|
|
|
|
|
|
|
private ClientWebSocket _webSocket; |
|
|
|
|
|
|
|
|
public event EventHandler<WebSocketMessageEventArgs> ProcessMessage; |
|
|
public event EventHandler<WebSocketMessageEventArgs> ProcessMessage; |
|
|
private void RaiseProcessMessage(string msg) |
|
|
private void RaiseProcessMessage(string msg) |
|
|
{ |
|
|
{ |
|
@@ -31,12 +31,12 @@ namespace Discord.Net.WebSockets |
|
|
{ |
|
|
{ |
|
|
_sendInterval = sendInterval; |
|
|
_sendInterval = sendInterval; |
|
|
_sendQueue = new ConcurrentQueue<byte[]>(); |
|
|
_sendQueue = new ConcurrentQueue<byte[]>(); |
|
|
_webSocket = new ClientWebSocket(); |
|
|
|
|
|
_webSocket.Options.KeepAliveInterval = TimeSpan.Zero; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public Task Connect(string host, CancellationToken cancelToken) |
|
|
public Task Connect(string host, CancellationToken cancelToken) |
|
|
{ |
|
|
{ |
|
|
|
|
|
_webSocket = new ClientWebSocket(); |
|
|
|
|
|
_webSocket.Options.KeepAliveInterval = TimeSpan.Zero; |
|
|
return _webSocket.ConnectAsync(new Uri(host), cancelToken); |
|
|
return _webSocket.ConnectAsync(new Uri(host), cancelToken); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@@ -44,7 +44,9 @@ namespace Discord.Net.WebSockets |
|
|
{ |
|
|
{ |
|
|
byte[] ignored; |
|
|
byte[] ignored; |
|
|
while (_sendQueue.TryDequeue(out ignored)) { } |
|
|
while (_sendQueue.TryDequeue(out ignored)) { } |
|
|
return TaskHelper.CompletedTask; |
|
|
|
|
|
|
|
|
_webSocket.Dispose(); |
|
|
|
|
|
_webSocket = new ClientWebSocket(); |
|
|
|
|
|
return TaskHelper.CompletedTask; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public Task[] RunTasks(CancellationToken cancelToken) |
|
|
public Task[] RunTasks(CancellationToken cancelToken) |
|
@@ -60,7 +62,7 @@ namespace Discord.Net.WebSockets |
|
|
{ |
|
|
{ |
|
|
return Task.Run(async () => |
|
|
return Task.Run(async () => |
|
|
{ |
|
|
{ |
|
|
var buffer = new ArraySegment<byte>(new byte[ReceiveChunkSize]); |
|
|
|
|
|
|
|
|
var buffer = new byte[ReceiveChunkSize]; //new ArraySegment<byte>(new byte[ReceiveChunkSize]); |
|
|
var builder = new StringBuilder(); |
|
|
var builder = new StringBuilder(); |
|
|
|
|
|
|
|
|
try |
|
|
try |
|
@@ -75,7 +77,7 @@ namespace Discord.Net.WebSockets |
|
|
|
|
|
|
|
|
try |
|
|
try |
|
|
{ |
|
|
{ |
|
|
result = await _webSocket.ReceiveAsync(buffer, cancelToken).ConfigureAwait(false); |
|
|
|
|
|
|
|
|
result = await _webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cancelToken).ConfigureAwait(false); |
|
|
} |
|
|
} |
|
|
catch (Win32Exception ex) when (ex.HResult == HR_TIMEOUT) |
|
|
catch (Win32Exception ex) when (ex.HResult == HR_TIMEOUT) |
|
|
{ |
|
|
{ |
|
@@ -85,11 +87,11 @@ namespace Discord.Net.WebSockets |
|
|
if (result.MessageType == WebSocketMessageType.Close) |
|
|
if (result.MessageType == WebSocketMessageType.Close) |
|
|
throw new Exception($"Got Close Message ({result.CloseStatus?.ToString() ?? "Unexpected"}, {result.CloseStatusDescription ?? "No Reason"})"); |
|
|
throw new Exception($"Got Close Message ({result.CloseStatus?.ToString() ?? "Unexpected"}, {result.CloseStatusDescription ?? "No Reason"})"); |
|
|
else |
|
|
else |
|
|
builder.Append(Encoding.UTF8.GetString(buffer.Array, buffer.Offset, result.Count)); |
|
|
|
|
|
|
|
|
builder.Append(Encoding.UTF8.GetString(buffer, 0, result.Count)); |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
while (result == null || !result.EndOfMessage); |
|
|
while (result == null || !result.EndOfMessage); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RaiseProcessMessage(builder.ToString()); |
|
|
RaiseProcessMessage(builder.ToString()); |
|
|
|
|
|
|
|
|
builder.Clear(); |
|
|
builder.Clear(); |
|
|