using Serein.Library.Api; using Serein.Library.Utils; using Serein.Proto.WebSocket.Handle; using System; using System.Threading.Tasks; using static System.Runtime.InteropServices.JavaScript.JSType; 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; /// /// WebSocket 模块配置 /// public ModuleConfig Model { get; set; } /// /// 消息本体(IJsonToken) /// public IJsonToken? MsgRequest { get; set; } /// /// 此次消息的数据 /// public IJsonToken? MsgData { get; set; } /// /// 异常外部感知使能 /// public Action? OnExceptionTracking { get; set; } /// /// 处理回复消息的函数 /// public Func OnReplyMakeData { get; set; } public Action? OnReply { get; set; } /// /// 是否发生错误 /// public bool IsError { get; set; } /// /// 错误消息 /// public string ErrorMessage { get; set; } /// /// 发送消息 /// private Func _sendAsync; /// /// 发送消息 /// /// /// public async Task SendAsync(string msg) { await _sendAsync.Invoke(msg); } /// /// 触发异常追踪 /// public void TriggerExceptionTracking(string exMessage) { var ex = new SereinWebSocketHandleException(exMessage); TriggerExceptionTracking(ex); } /// /// 触发异常追踪 /// public void TriggerExceptionTracking(Exception ex) { IsError = true; var msgId = Model.MsgId; var theme = Model.Theme; ErrorMessage = $"请求[{msgId}]主题[{theme}]异常 :{ex.Message}"; OnExceptionTracking?.Invoke(ex); var error = OnReplyMakeData?.Invoke(this, ex.Message); // 触发回复消息 _ = SendAsync(JsonHelper.Serialize(error)).ContinueWith((t) => { if (t.IsFaulted) { Console.WriteLine($"发送错误消息失败: {t.Exception?.Message}"); } }); // 发送错误消息 } } }