using Serein.Library.Api; using Serein.Library.Utils; using Serein.Proto.WebSocket.Handle; using System; using System.Threading.Tasks; namespace Serein.Proto.WebSocket { /// /// 消息处理上下文 /// public class WebSocketHandleContext : IDisposable { /// /// 构造函数,传入发送消息的异步方法 /// /// public WebSocketHandleContext(Func sendAsync) { _sendAsync = sendAsync; } /// /// 释放资源,清理消息上下文 /// public void Dispose() { MsgRequest = null; MsgTheme = string.Empty; MsgId = string.Empty; MsgData = null; MsgData = null; } /// /// 标记是否已经处理,如果是,则提前退出 /// public bool Handle { get => _handle; set{ if(value) { Dispose(); _handle = value; } } } private bool _handle = false; /// /// 消息本体(IJsonToken) /// public IJsonToken? MsgRequest { get; set; } /// /// 此次消息请求的主题 /// public string MsgTheme { get; set; } = string.Empty; /// /// 此次消息附带的ID /// public string MsgId { get; set; } = string.Empty; /// /// 此次消息的数据 /// public IJsonToken? MsgData { get; set; } /// /// 异常外部感知使能 /// public Func, Task> OnExceptionTrackingAsync { get; set; } /// /// 发送消息 /// private Func _sendAsync; /// /// 发送消息 /// /// /// public async Task SendAsync(string msg) { await _sendAsync.Invoke(msg); } /// /// 触发异常追踪 /// public void TriggerExceptionTracking(string exMessage) { var ex = new Exception(exMessage); Func func = async (data) => { var msg = JsonHelper.Serialize(data); await _sendAsync.Invoke(msg); }; OnExceptionTrackingAsync.Invoke(ex, func); } /// /// 触发异常追踪 /// public void TriggerExceptionTracking(Exception ex) { Func func = async (data) => { var msg = JsonHelper.Serialize(data); await _sendAsync.Invoke(msg); }; OnExceptionTrackingAsync.Invoke(ex, func); } } }