diff --git a/DysonNetwork.Drive/Storage/CloudFile.cs b/DysonNetwork.Drive/Storage/CloudFile.cs index 7211044..3fcbe6b 100644 --- a/DysonNetwork.Drive/Storage/CloudFile.cs +++ b/DysonNetwork.Drive/Storage/CloudFile.cs @@ -114,13 +114,9 @@ public class CloudFile : ModelBase, ICloudFile, IIdentifiedResource ContentType = MimeType ?? string.Empty, UploadedAt = UploadedAt?.ToTimestamp(), // Convert file metadata - FileMeta = ByteString.CopyFromUtf8( - System.Text.Json.JsonSerializer.Serialize(FileMeta, GrpcTypeHelper.SerializerOptions) - ), + FileMeta = GrpcTypeHelper.ConvertObjectToByteString(FileMeta), // Convert user metadata - UserMeta = ByteString.CopyFromUtf8( - System.Text.Json.JsonSerializer.Serialize(UserMeta, GrpcTypeHelper.SerializerOptions) - ) + UserMeta = GrpcTypeHelper.ConvertObjectToByteString(UserMeta), }; return proto; diff --git a/DysonNetwork.Pusher/Connection/WebSocketPacket.cs b/DysonNetwork.Pusher/Connection/WebSocketPacket.cs index 6760fdc..e61c956 100644 --- a/DysonNetwork.Pusher/Connection/WebSocketPacket.cs +++ b/DysonNetwork.Pusher/Connection/WebSocketPacket.cs @@ -77,7 +77,7 @@ public class WebSocketPacket return new Shared.Proto.WebSocketPacket { Type = Type, - Data = GrpcTypeHelper.ConvertClassToValue(Data), + Data = GrpcTypeHelper.ConvertObjectToByteString(Data), ErrorMessage = ErrorMessage }; } @@ -87,7 +87,7 @@ public class WebSocketPacket return new WebSocketPacket { Type = packet.Type, - Data = GrpcTypeHelper.ConvertValueToObject(packet.Data), + Data = GrpcTypeHelper.ConvertByteStringToObject(packet.Data), ErrorMessage = packet.ErrorMessage }; } diff --git a/DysonNetwork.Shared/Data/CloudFileReferenceObject.cs b/DysonNetwork.Shared/Data/CloudFileReferenceObject.cs index 498f517..ab8df8a 100644 --- a/DysonNetwork.Shared/Data/CloudFileReferenceObject.cs +++ b/DysonNetwork.Shared/Data/CloudFileReferenceObject.cs @@ -42,20 +42,8 @@ public class CloudFileReferenceObject : ModelBase, ICloudFile { Id = proto.Id, Name = proto.Name, - FileMeta = JsonSerializer.Deserialize>( - proto.FileMeta.ToStringUtf8(), - GrpcTypeHelper.SerializerOptions - )?.ToDictionary( - kvp => kvp.Key, - kvp => kvp.Value.ValueKind == JsonValueKind.Undefined ? null : kvp.Value.Deserialize(GrpcTypeHelper.SerializerOptions) - ) ?? new Dictionary(), - UserMeta = JsonSerializer.Deserialize>( - proto.UserMeta.ToStringUtf8(), - GrpcTypeHelper.SerializerOptions - )?.ToDictionary( - kvp => kvp.Key, - kvp => kvp.Value.ValueKind == JsonValueKind.Undefined ? null : kvp.Value.Deserialize(GrpcTypeHelper.SerializerOptions) - ) ?? new Dictionary(), + FileMeta = GrpcTypeHelper.ConvertByteStringToObject>(proto.FileMeta) ?? [], + UserMeta = GrpcTypeHelper.ConvertByteStringToObject>(proto.UserMeta) ?? [], MimeType = proto.MimeType, Hash = proto.Hash, Size = proto.Size, @@ -81,14 +69,10 @@ public class CloudFileReferenceObject : ModelBase, ICloudFile }; // Convert file metadata - proto.FileMeta = ByteString.CopyFromUtf8( - JsonSerializer.Serialize(FileMeta, GrpcTypeHelper.SerializerOptions) - ); + proto.FileMeta = GrpcTypeHelper.ConvertObjectToByteString(FileMeta); // Convert user metadata - proto.UserMeta = ByteString.CopyFromUtf8( - JsonSerializer.Serialize(UserMeta, GrpcTypeHelper.SerializerOptions) - ); + proto.UserMeta = GrpcTypeHelper.ConvertObjectToByteString(UserMeta); return proto; } diff --git a/DysonNetwork.Shared/Proto/GrpcTypeHelper.cs b/DysonNetwork.Shared/Proto/GrpcTypeHelper.cs index 30e70d1..9733525 100644 --- a/DysonNetwork.Shared/Proto/GrpcTypeHelper.cs +++ b/DysonNetwork.Shared/Proto/GrpcTypeHelper.cs @@ -5,14 +5,14 @@ using System.Text.Json.Serialization.Metadata; using Google.Protobuf.Collections; using Google.Protobuf.WellKnownTypes; using DysonNetwork.Shared.Data; -using Newtonsoft.Json; +using Google.Protobuf; using JsonSerializer = System.Text.Json.JsonSerializer; namespace DysonNetwork.Shared.Proto; public abstract class GrpcTypeHelper { - public static readonly JsonSerializerOptions SerializerOptions = new() + public static readonly JsonSerializerOptions? SerializerOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, DefaultIgnoreCondition = JsonIgnoreCondition.Never, @@ -75,7 +75,7 @@ public abstract class GrpcTypeHelper case Value.KindOneofCase.StructValue: result[kvp.Key] = JsonSerializer.Deserialize( JsonSerializer.Serialize( - value.StructValue.Fields.ToDictionary(f => f.Key, f => ConvertValueToObject(f.Value)), + value.StructValue.Fields.ToDictionary(f => f.Key, f => ConvertValueToObject(f.Value)), SerializerOptions ), SerializerOptions @@ -109,7 +109,7 @@ public abstract class GrpcTypeHelper _ => JsonSerializer.Deserialize(JsonSerializer.Serialize(value, SerializerOptions), SerializerOptions) }; } - + public static T? ConvertValueToClass(Value value) { return value.KindCase switch @@ -118,7 +118,7 @@ public abstract class GrpcTypeHelper _ => JsonSerializer.Deserialize(JsonSerializer.Serialize(value, SerializerOptions), SerializerOptions) }; } - + public static Value ConvertObjectToValue(object? obj) { return obj switch @@ -133,7 +133,7 @@ public abstract class GrpcTypeHelper _ => Value.ForString(JsonSerializer.Serialize(obj, SerializerOptions)) // fallback to JSON string }; } - + public static Value ConvertClassToValue(T obj) { if (obj is JsonElement element) @@ -144,4 +144,16 @@ public abstract class GrpcTypeHelper _ => Value.ForString(JsonSerializer.Serialize(obj, SerializerOptions)) }; } -} \ No newline at end of file + + public static ByteString ConvertObjectToByteString(object? obj) + { + return ByteString.CopyFromUtf8( + JsonSerializer.Serialize(obj, SerializerOptions) + ); + } + + public static T? ConvertByteStringToObject(ByteString bytes) + { + return JsonSerializer.Deserialize(bytes.ToStringUtf8(), SerializerOptions); + } +} diff --git a/DysonNetwork.Shared/Proto/pusher.proto b/DysonNetwork.Shared/Proto/pusher.proto index 52111cc..5c69b87 100644 --- a/DysonNetwork.Shared/Proto/pusher.proto +++ b/DysonNetwork.Shared/Proto/pusher.proto @@ -55,7 +55,7 @@ message SendEmailRequest { // Represents a WebSocket packet. message WebSocketPacket { string type = 1; - google.protobuf.Value data = 2; + bytes data = 2; google.protobuf.StringValue error_message = 3; } @@ -125,4 +125,4 @@ message ReceiveWebSocketPacketRequest { WebSocketPacket packet = 1; Account account = 2; string device_id = 3; -} \ No newline at end of file +} diff --git a/DysonNetwork.Sphere/Chat/ChatService.cs b/DysonNetwork.Sphere/Chat/ChatService.cs index d88d758..534b358 100644 --- a/DysonNetwork.Sphere/Chat/ChatService.cs +++ b/DysonNetwork.Sphere/Chat/ChatService.cs @@ -254,7 +254,7 @@ public partial class ChatService( Packet = new WebSocketPacket { Type = type, - Data = GrpcTypeHelper.ConvertObjectToValue(metaDict), + Data = GrpcTypeHelper.ConvertObjectToByteString(metaDict), }, }); diff --git a/DysonNetwork.Sphere/Connection/WebsocketHandler.cs b/DysonNetwork.Sphere/Connection/WebsocketHandler.cs index 8c85f46..a982804 100644 --- a/DysonNetwork.Sphere/Connection/WebsocketHandler.cs +++ b/DysonNetwork.Sphere/Connection/WebsocketHandler.cs @@ -41,7 +41,7 @@ public class WebSocketHandlerGrpc(PusherService.PusherServiceClient pusher, Chat return; } - var requestData = GrpcTypeHelper.ConvertValueToClass(packet.Data); + var requestData = GrpcTypeHelper.ConvertByteStringToObject(packet.Data); if (requestData == null) { await SendErrorResponse(request, "Invalid request data"); @@ -73,7 +73,7 @@ public class WebSocketHandlerGrpc(PusherService.PusherServiceClient pusher, Chat return; } - var requestData = GrpcTypeHelper.ConvertValueToClass(packet.Data); + var requestData = GrpcTypeHelper.ConvertByteStringToObject(packet.Data); if (requestData == null) { await SendErrorResponse(request, "Invalid request data"); @@ -93,7 +93,7 @@ public class WebSocketHandlerGrpc(PusherService.PusherServiceClient pusher, Chat var responsePacket = new WebSocketPacket { Type = "messages.typing", - Data = GrpcTypeHelper.ConvertObjectToValue(new + Data = GrpcTypeHelper.ConvertObjectToByteString(new { room_id = sender.ChatRoomId, sender_id = sender.Id,