♻️ 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,
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;

View File

@@ -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<object?>(packet.Data),
ErrorMessage = packet.ErrorMessage
};
}

View File

@@ -42,20 +42,8 @@ public class CloudFileReferenceObject : ModelBase, ICloudFile
{
Id = proto.Id,
Name = proto.Name,
FileMeta = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(
proto.FileMeta.ToStringUtf8(),
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?>(),
FileMeta = GrpcTypeHelper.ConvertByteStringToObject<Dictionary<string, object?>>(proto.FileMeta) ?? [],
UserMeta = GrpcTypeHelper.ConvertByteStringToObject<Dictionary<string, object?>>(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;
}

View File

@@ -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<JsonElement>(
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<JsonElement>(JsonSerializer.Serialize(value, SerializerOptions), SerializerOptions)
};
}
public static T? ConvertValueToClass<T>(Value value)
{
return value.KindCase switch
@@ -118,7 +118,7 @@ public abstract class GrpcTypeHelper
_ => JsonSerializer.Deserialize<T>(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>(T obj)
{
if (obj is JsonElement element)
@@ -144,4 +144,16 @@ public abstract class GrpcTypeHelper
_ => 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.
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;
}
}

View File

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

View File

@@ -41,7 +41,7 @@ public class WebSocketHandlerGrpc(PusherService.PusherServiceClient pusher, Chat
return;
}
var requestData = GrpcTypeHelper.ConvertValueToClass<ChatController.MarkMessageReadRequest>(packet.Data);
var requestData = GrpcTypeHelper.ConvertByteStringToObject<ChatController.MarkMessageReadRequest>(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<ChatController.ChatRoomWsUniversalRequest>(packet.Data);
var requestData = GrpcTypeHelper.ConvertByteStringToObject<ChatController.ChatRoomWsUniversalRequest>(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,