From 7aeb70a4446f3a2c1bf46f9da940eba4b54c969b Mon Sep 17 00:00:00 2001 From: snltty <1069410172@qq.com> Date: Mon, 23 Jun 2025 11:57:38 +0800 Subject: [PATCH] 185 --- src/linker.libs/extends/SerialzeExtends.cs | 2 +- .../json/KeyValuePairJsonConverter.cs | 31 ++++++++++++++ src/linker.libs/web/WebServer.cs | 41 +++++++++++-------- .../client/RelayApiController.cs | 13 ++++-- version.txt | 2 +- 5 files changed, 66 insertions(+), 23 deletions(-) create mode 100644 src/linker.libs/json/KeyValuePairJsonConverter.cs diff --git a/src/linker.libs/extends/SerialzeExtends.cs b/src/linker.libs/extends/SerialzeExtends.cs index ec7ba6c4..8963497d 100644 --- a/src/linker.libs/extends/SerialzeExtends.cs +++ b/src/linker.libs/extends/SerialzeExtends.cs @@ -22,7 +22,7 @@ namespace linker.libs.extends ReadCommentHandling = JsonCommentHandling.Skip, PropertyNameCaseInsensitive = true, WriteIndented = true, - Converters = { new IPAddressJsonConverter(), new IPEndpointJsonConverter(), new DateTimeJsonConverter(), new BitArrayJsonConverter() }, + Converters = { new IPAddressJsonConverter(), new IPEndpointJsonConverter(), new DateTimeJsonConverter(), new BitArrayJsonConverter()}, }; public static void AddAOT(JsonSerializerContext[] contexts) { diff --git a/src/linker.libs/json/KeyValuePairJsonConverter.cs b/src/linker.libs/json/KeyValuePairJsonConverter.cs new file mode 100644 index 00000000..f1ddbffa --- /dev/null +++ b/src/linker.libs/json/KeyValuePairJsonConverter.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using System.Text.Json; + +namespace linker.libs.json +{ + public class KeyValuePairJsonConverter : JsonConverter> + { + public override KeyValuePair Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + using (JsonDocument doc = JsonDocument.ParseValue(ref reader)) + { + var root = doc.RootElement; + TKey key = JsonSerializer.Deserialize(root.GetProperty("Key").GetRawText()); + TValue value = JsonSerializer.Deserialize(root.GetProperty("Value").GetRawText()); + return new KeyValuePair(key, value); + } + } + + public override void Write(Utf8JsonWriter writer, KeyValuePair value, JsonSerializerOptions options) + { + writer.WriteStartObject(); + writer.WritePropertyName("Key"); + JsonSerializer.Serialize(writer, value.Key, options); + writer.WritePropertyName("Value"); + JsonSerializer.Serialize(writer, value.Value, options); + writer.WriteEndObject(); + } + } +} diff --git a/src/linker.libs/web/WebServer.cs b/src/linker.libs/web/WebServer.cs index 3e5872ef..75ec013a 100644 --- a/src/linker.libs/web/WebServer.cs +++ b/src/linker.libs/web/WebServer.cs @@ -179,24 +179,31 @@ namespace linker.libs.web while (websocket.State == WebSocketState.Open) { - result = await websocket.ReceiveAsync(buffer, CancellationToken.None); - switch (result.MessageType) + try { - case WebSocketMessageType.Text: - { - req = Encoding.UTF8.GetString(buffer.AsMemory(0, result.Count).Span).DeJson(); - req.Connection = websocket; - ApiControllerResponseInfo resp = await OnMessage(req); - await websocket.SendAsync(resp.ToJson().ToBytes(), WebSocketMessageType.Text, true, CancellationToken.None); - } - break; - case WebSocketMessageType.Binary: - break; - case WebSocketMessageType.Close: - await websocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed by client", CancellationToken.None); - break; - default: - break; + result = await websocket.ReceiveAsync(buffer, CancellationToken.None); + switch (result.MessageType) + { + case WebSocketMessageType.Text: + { + req = Encoding.UTF8.GetString(buffer.AsMemory(0, result.Count).Span).DeJson(); + req.Connection = websocket; + ApiControllerResponseInfo resp = await OnMessage(req); + await websocket.SendAsync(resp.ToJson().ToBytes(), WebSocketMessageType.Text, true, CancellationToken.None); + } + break; + case WebSocketMessageType.Binary: + break; + case WebSocketMessageType.Close: + await websocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed by client", CancellationToken.None); + break; + default: + break; + } + } + catch (Exception ex) + { + LoggerHelper.Instance.Error($"{req.Path}->{ex}"); } } } diff --git a/src/linker.messenger.relay/client/RelayApiController.cs b/src/linker.messenger.relay/client/RelayApiController.cs index e4268815..742bb9b8 100644 --- a/src/linker.messenger.relay/client/RelayApiController.cs +++ b/src/linker.messenger.relay/client/RelayApiController.cs @@ -53,15 +53,15 @@ namespace linker.messenger.relay return relayTestTransfer.Nodes; } - public KeyValuePair GetDefault(ApiControllerParamsInfo param) + public KeyValuePairInfo GetDefault(ApiControllerParamsInfo param) { - return new KeyValuePair(relayClientStore.DefaultNodeId, relayClientStore.DefaultProtocol); + return new KeyValuePairInfo { Key = relayClientStore.DefaultNodeId, Value = relayClientStore.DefaultProtocol }; } public async Task SyncDefault(ApiControllerParamsInfo param) { SyncInfo info = param.Content.DeJson(); await syncTreansfer.Sync("RelayDefault", info.Ids, serializer.Serialize(info.Data)).ConfigureAwait(false); - if(info.Ids.Length == 0 || info.Ids.Contains(signInClientStore.Id)) + if (info.Ids.Length == 0 || info.Ids.Contains(signInClientStore.Id)) { relayClientStore.SetDefaultNodeId(info.Data.Key); relayClientStore.SetDefaultProtocol(info.Data.Value); @@ -126,9 +126,14 @@ namespace linker.messenger.relay public sealed class SyncInfo { public string[] Ids { get; set; } = []; - public KeyValuePair Data { get; set; } = new KeyValuePair(); + public KeyValuePairInfo Data { get; set; } = new KeyValuePairInfo(); } + public sealed class KeyValuePairInfo + { + public string Key { get; set; } = string.Empty; + public TunnelProtocolType Value { get; set; } = TunnelProtocolType.Tcp; + } public sealed class RelayConnectInfo { diff --git a/version.txt b/version.txt index c661e0f2..d2d9f3ce 100644 --- a/version.txt +++ b/version.txt @@ -1,5 +1,5 @@ v1.8.5 -2025-06-23 10:05:27 +2025-06-23 11:57:38 1. 一些累计更新 2. 备用信标服务器 3. 设置默认中继节点