♻️ Refactor the websocket system

This commit is contained in:
2025-07-29 20:43:17 +08:00
parent 1f7b19938b
commit f1b594bdf2
7 changed files with 33 additions and 41 deletions

View File

@@ -114,13 +114,9 @@ public class CloudFile : ModelBase, ICloudFile, IIdentifiedResource
ContentType = MimeType ?? string.Empty, ContentType = MimeType ?? string.Empty,
UploadedAt = UploadedAt?.ToTimestamp(), UploadedAt = UploadedAt?.ToTimestamp(),
// Convert file metadata // Convert file metadata
FileMeta = ByteString.CopyFromUtf8( FileMeta = GrpcTypeHelper.ConvertObjectToByteString(FileMeta),
System.Text.Json.JsonSerializer.Serialize(FileMeta, GrpcTypeHelper.SerializerOptions)
),
// Convert user metadata // Convert user metadata
UserMeta = ByteString.CopyFromUtf8( UserMeta = GrpcTypeHelper.ConvertObjectToByteString(UserMeta),
System.Text.Json.JsonSerializer.Serialize(UserMeta, GrpcTypeHelper.SerializerOptions)
)
}; };
return proto; return proto;

View File

@@ -77,7 +77,7 @@ public class WebSocketPacket
return new Shared.Proto.WebSocketPacket return new Shared.Proto.WebSocketPacket
{ {
Type = Type, Type = Type,
Data = GrpcTypeHelper.ConvertClassToValue(Data), Data = GrpcTypeHelper.ConvertObjectToByteString(Data),
ErrorMessage = ErrorMessage ErrorMessage = ErrorMessage
}; };
} }
@@ -87,7 +87,7 @@ public class WebSocketPacket
return new WebSocketPacket return new WebSocketPacket
{ {
Type = packet.Type, Type = packet.Type,
Data = GrpcTypeHelper.ConvertValueToObject(packet.Data), Data = GrpcTypeHelper.ConvertByteStringToObject<object?>(packet.Data),
ErrorMessage = packet.ErrorMessage ErrorMessage = packet.ErrorMessage
}; };
} }

View File

@@ -42,20 +42,8 @@ public class CloudFileReferenceObject : ModelBase, ICloudFile
{ {
Id = proto.Id, Id = proto.Id,
Name = proto.Name, Name = proto.Name,
FileMeta = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>( FileMeta = GrpcTypeHelper.ConvertByteStringToObject<Dictionary<string, object?>>(proto.FileMeta) ?? [],
proto.FileMeta.ToStringUtf8(), UserMeta = GrpcTypeHelper.ConvertByteStringToObject<Dictionary<string, object?>>(proto.UserMeta) ?? [],
GrpcTypeHelper.SerializerOptions
)?.ToDictionary(
kvp => kvp.Key,
kvp => kvp.Value.ValueKind == JsonValueKind.Undefined ? null : kvp.Value.Deserialize<object?>(GrpcTypeHelper.SerializerOptions)
) ?? new Dictionary<string, object?>(),
UserMeta = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(
proto.UserMeta.ToStringUtf8(),
GrpcTypeHelper.SerializerOptions
)?.ToDictionary(
kvp => kvp.Key,
kvp => kvp.Value.ValueKind == JsonValueKind.Undefined ? null : kvp.Value.Deserialize<object?>(GrpcTypeHelper.SerializerOptions)
) ?? new Dictionary<string, object?>(),
MimeType = proto.MimeType, MimeType = proto.MimeType,
Hash = proto.Hash, Hash = proto.Hash,
Size = proto.Size, Size = proto.Size,
@@ -81,14 +69,10 @@ public class CloudFileReferenceObject : ModelBase, ICloudFile
}; };
// Convert file metadata // Convert file metadata
proto.FileMeta = ByteString.CopyFromUtf8( proto.FileMeta = GrpcTypeHelper.ConvertObjectToByteString(FileMeta);
JsonSerializer.Serialize(FileMeta, GrpcTypeHelper.SerializerOptions)
);
// Convert user metadata // Convert user metadata
proto.UserMeta = ByteString.CopyFromUtf8( proto.UserMeta = GrpcTypeHelper.ConvertObjectToByteString(UserMeta);
JsonSerializer.Serialize(UserMeta, GrpcTypeHelper.SerializerOptions)
);
return proto; return proto;
} }

View File

@@ -5,14 +5,14 @@ using System.Text.Json.Serialization.Metadata;
using Google.Protobuf.Collections; using Google.Protobuf.Collections;
using Google.Protobuf.WellKnownTypes; using Google.Protobuf.WellKnownTypes;
using DysonNetwork.Shared.Data; using DysonNetwork.Shared.Data;
using Newtonsoft.Json; using Google.Protobuf;
using JsonSerializer = System.Text.Json.JsonSerializer; using JsonSerializer = System.Text.Json.JsonSerializer;
namespace DysonNetwork.Shared.Proto; namespace DysonNetwork.Shared.Proto;
public abstract class GrpcTypeHelper public abstract class GrpcTypeHelper
{ {
public static readonly JsonSerializerOptions SerializerOptions = new() public static readonly JsonSerializerOptions? SerializerOptions = new()
{ {
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
DefaultIgnoreCondition = JsonIgnoreCondition.Never, DefaultIgnoreCondition = JsonIgnoreCondition.Never,
@@ -144,4 +144,16 @@ public abstract class GrpcTypeHelper
_ => Value.ForString(JsonSerializer.Serialize(obj, SerializerOptions)) _ => Value.ForString(JsonSerializer.Serialize(obj, SerializerOptions))
}; };
} }
public static ByteString ConvertObjectToByteString(object? obj)
{
return ByteString.CopyFromUtf8(
JsonSerializer.Serialize(obj, SerializerOptions)
);
}
public static T? ConvertByteStringToObject<T>(ByteString bytes)
{
return JsonSerializer.Deserialize<T>(bytes.ToStringUtf8(), SerializerOptions);
}
} }

View File

@@ -55,7 +55,7 @@ message SendEmailRequest {
// Represents a WebSocket packet. // Represents a WebSocket packet.
message WebSocketPacket { message WebSocketPacket {
string type = 1; string type = 1;
google.protobuf.Value data = 2; bytes data = 2;
google.protobuf.StringValue error_message = 3; google.protobuf.StringValue error_message = 3;
} }

View File

@@ -254,7 +254,7 @@ public partial class ChatService(
Packet = new WebSocketPacket Packet = new WebSocketPacket
{ {
Type = type, Type = type,
Data = GrpcTypeHelper.ConvertObjectToValue(metaDict), Data = GrpcTypeHelper.ConvertObjectToByteString(metaDict),
}, },
}); });

View File

@@ -41,7 +41,7 @@ public class WebSocketHandlerGrpc(PusherService.PusherServiceClient pusher, Chat
return; return;
} }
var requestData = GrpcTypeHelper.ConvertValueToClass<ChatController.MarkMessageReadRequest>(packet.Data); var requestData = GrpcTypeHelper.ConvertByteStringToObject<ChatController.MarkMessageReadRequest>(packet.Data);
if (requestData == null) if (requestData == null)
{ {
await SendErrorResponse(request, "Invalid request data"); await SendErrorResponse(request, "Invalid request data");
@@ -73,7 +73,7 @@ public class WebSocketHandlerGrpc(PusherService.PusherServiceClient pusher, Chat
return; return;
} }
var requestData = GrpcTypeHelper.ConvertValueToClass<ChatController.ChatRoomWsUniversalRequest>(packet.Data); var requestData = GrpcTypeHelper.ConvertByteStringToObject<ChatController.ChatRoomWsUniversalRequest>(packet.Data);
if (requestData == null) if (requestData == null)
{ {
await SendErrorResponse(request, "Invalid request data"); await SendErrorResponse(request, "Invalid request data");
@@ -93,7 +93,7 @@ public class WebSocketHandlerGrpc(PusherService.PusherServiceClient pusher, Chat
var responsePacket = new WebSocketPacket var responsePacket = new WebSocketPacket
{ {
Type = "messages.typing", Type = "messages.typing",
Data = GrpcTypeHelper.ConvertObjectToValue(new Data = GrpcTypeHelper.ConvertObjectToByteString(new
{ {
room_id = sender.ChatRoomId, room_id = sender.ChatRoomId,
sender_id = sender.Id, sender_id = sender.Id,