2023-05-22 21:44:05 -05:00
|
|
|
using NetMQ;
|
|
|
|
|
using NetMQ.Sockets;
|
|
|
|
|
using System;
|
2023-05-24 10:14:07 -05:00
|
|
|
using System.IO;
|
|
|
|
|
using System.Runtime.Serialization.Formatters.Binary;
|
2023-05-22 21:44:05 -05:00
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
namespace Microsoft.Iris.Debug;
|
|
|
|
|
|
|
|
|
|
internal class ZmqDebuggerServer : IDebuggerServer, IDisposable
|
|
|
|
|
{
|
|
|
|
|
public static IDebuggerServer Current { get; private set; }
|
|
|
|
|
|
|
|
|
|
private readonly PublisherSocket _pubSocket;
|
|
|
|
|
private readonly byte[][] _messageFrame = new byte[2][];
|
|
|
|
|
|
|
|
|
|
public ZmqDebuggerServer(string connectionUri)
|
|
|
|
|
{
|
|
|
|
|
_pubSocket = new();
|
|
|
|
|
_pubSocket.Bind(connectionUri);
|
|
|
|
|
|
|
|
|
|
Current = this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void LogInterpreterOpCode(object context, Data.InterpreterEntry entry)
|
|
|
|
|
{
|
2023-05-24 10:14:07 -05:00
|
|
|
using MemoryStream entryStream = new();
|
|
|
|
|
new BinaryFormatter().Serialize(entryStream, entry);
|
|
|
|
|
|
|
|
|
|
SendDebuggerMessage(DebuggerMessageType.InterpreterOpCode, entryStream.ToArray());
|
2023-05-22 21:44:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void LogDispatcher(string message)
|
|
|
|
|
{
|
|
|
|
|
SendDebuggerMessage(DebuggerMessageType.DispatcherStep, message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Dispose() => _pubSocket.Dispose();
|
|
|
|
|
|
|
|
|
|
private void SendDebuggerMessage(DebuggerMessageType type, string message, Encoding encoding = null)
|
|
|
|
|
{
|
|
|
|
|
var messageBytes = (encoding ?? Encoding.Unicode).GetBytes(message);
|
|
|
|
|
SendDebuggerMessage(type, messageBytes);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SendDebuggerMessage(DebuggerMessageType type, byte[] bytes)
|
|
|
|
|
{
|
|
|
|
|
_messageFrame[0] = BitConverter.GetBytes((int)type);
|
|
|
|
|
_messageFrame[1] = bytes;
|
|
|
|
|
|
|
|
|
|
_pubSocket.SendMultipartBytes(_messageFrame);
|
|
|
|
|
}
|
|
|
|
|
}
|