Remove unused DevToolsClient.cs source file (#19364)
This commit is contained in:
parent
190e32370f
commit
f3633f3c38
|
|
@ -1,142 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
using System.Net.WebSockets;
|
|
||||||
using System.Threading;
|
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
|
|
||||||
namespace WebAssembly.Net.Debugging {
|
|
||||||
internal class DevToolsClient: IDisposable {
|
|
||||||
ClientWebSocket socket;
|
|
||||||
List<Task> pending_ops = new List<Task> ();
|
|
||||||
TaskCompletionSource<bool> side_exit = new TaskCompletionSource<bool> ();
|
|
||||||
List<byte []> pending_writes = new List<byte []> ();
|
|
||||||
Task current_write;
|
|
||||||
readonly ILogger logger;
|
|
||||||
|
|
||||||
public DevToolsClient (ILogger logger) {
|
|
||||||
this.logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
~DevToolsClient() {
|
|
||||||
Dispose(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose() {
|
|
||||||
Dispose(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task Close (CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
if (socket.State == WebSocketState.Open)
|
|
||||||
await socket.CloseOutputAsync (WebSocketCloseStatus.NormalClosure, "Closing", cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void Dispose (bool disposing) {
|
|
||||||
if (disposing)
|
|
||||||
socket.Dispose ();
|
|
||||||
}
|
|
||||||
|
|
||||||
Task Pump (Task task, CancellationToken token)
|
|
||||||
{
|
|
||||||
if (task != current_write)
|
|
||||||
return null;
|
|
||||||
current_write = null;
|
|
||||||
|
|
||||||
pending_writes.RemoveAt (0);
|
|
||||||
|
|
||||||
if (pending_writes.Count > 0) {
|
|
||||||
current_write = socket.SendAsync (new ArraySegment<byte> (pending_writes [0]), WebSocketMessageType.Text, true, token);
|
|
||||||
return current_write;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
async Task<string> ReadOne (CancellationToken token)
|
|
||||||
{
|
|
||||||
byte [] buff = new byte [4000];
|
|
||||||
var mem = new MemoryStream ();
|
|
||||||
while (true) {
|
|
||||||
var result = await this.socket.ReceiveAsync (new ArraySegment<byte> (buff), token);
|
|
||||||
if (result.MessageType == WebSocketMessageType.Close) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.EndOfMessage) {
|
|
||||||
mem.Write (buff, 0, result.Count);
|
|
||||||
return Encoding.UTF8.GetString (mem.GetBuffer (), 0, (int)mem.Length);
|
|
||||||
} else {
|
|
||||||
mem.Write (buff, 0, result.Count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void Send (byte [] bytes, CancellationToken token)
|
|
||||||
{
|
|
||||||
pending_writes.Add (bytes);
|
|
||||||
if (pending_writes.Count == 1) {
|
|
||||||
if (current_write != null)
|
|
||||||
throw new Exception ("Internal state is bad. current_write must be null if there are no pending writes");
|
|
||||||
|
|
||||||
current_write = socket.SendAsync (new ArraySegment<byte> (bytes), WebSocketMessageType.Text, true, token);
|
|
||||||
pending_ops.Add (current_write);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async Task MarkCompleteAfterward (Func<CancellationToken, Task> send, CancellationToken token)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
await send(token);
|
|
||||||
side_exit.SetResult (true);
|
|
||||||
} catch (Exception e) {
|
|
||||||
side_exit.SetException (e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected async Task<bool> ConnectWithMainLoops(
|
|
||||||
Uri uri,
|
|
||||||
Func<string, CancellationToken, Task> receive,
|
|
||||||
Func<CancellationToken, Task> send,
|
|
||||||
CancellationToken token) {
|
|
||||||
|
|
||||||
logger.LogDebug ("connecting to {0}", uri);
|
|
||||||
this.socket = new ClientWebSocket ();
|
|
||||||
this.socket.Options.KeepAliveInterval = Timeout.InfiniteTimeSpan;
|
|
||||||
|
|
||||||
await this.socket.ConnectAsync (uri, token);
|
|
||||||
pending_ops.Add (ReadOne (token));
|
|
||||||
pending_ops.Add (side_exit.Task);
|
|
||||||
pending_ops.Add (MarkCompleteAfterward (send, token));
|
|
||||||
|
|
||||||
while (!token.IsCancellationRequested) {
|
|
||||||
var task = await Task.WhenAny (pending_ops);
|
|
||||||
if (task == pending_ops [0]) { //pending_ops[0] is for message reading
|
|
||||||
var msg = ((Task<string>)task).Result;
|
|
||||||
pending_ops [0] = ReadOne (token);
|
|
||||||
Task tsk = receive (msg, token);
|
|
||||||
if (tsk != null)
|
|
||||||
pending_ops.Add (tsk);
|
|
||||||
} else if (task == pending_ops [1]) {
|
|
||||||
var res = ((Task<bool>)task).Result;
|
|
||||||
//it might not throw if exiting successfull
|
|
||||||
return res;
|
|
||||||
} else { //must be a background task
|
|
||||||
pending_ops.Remove (task);
|
|
||||||
var tsk = Pump (task, token);
|
|
||||||
if (tsk != null)
|
|
||||||
pending_ops.Add (tsk);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void Log (string priority, string msg)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue