72 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Text.Json;
 | |
| using NodaTime;
 | |
| using NodaTime.Serialization.SystemTextJson;
 | |
| 
 | |
| public class WebSocketPacketType
 | |
| {
 | |
|     public const string Error = "error";
 | |
|     public const string MessageNew = "messages.new";
 | |
|     public const string MessageUpdate = "messages.update";
 | |
|     public const string MessageDelete = "messages.delete";
 | |
|     public const string CallParticipantsUpdate = "call.participants.update";
 | |
| }
 | |
| 
 | |
| public class WebSocketPacket
 | |
| {
 | |
|     public string Type { get; set; } = null!;
 | |
|     public object Data { get; set; } = null!;
 | |
|     public string? ErrorMessage { get; set; }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Creates a WebSocketPacket from raw WebSocket message bytes
 | |
|     /// </summary>
 | |
|     /// <param name="bytes">Raw WebSocket message bytes</param>
 | |
|     /// <returns>Deserialized WebSocketPacket</returns>
 | |
|     public static WebSocketPacket FromBytes(byte[] bytes)
 | |
|     {
 | |
|         var json = System.Text.Encoding.UTF8.GetString(bytes);
 | |
|         var jsonOpts = new JsonSerializerOptions
 | |
|         {
 | |
|             PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
 | |
|             DictionaryKeyPolicy = JsonNamingPolicy.SnakeCaseLower,
 | |
|         };
 | |
|         return JsonSerializer.Deserialize<WebSocketPacket>(json, jsonOpts) ??
 | |
|             throw new JsonException("Failed to deserialize WebSocketPacket");
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Deserializes the Data property to the specified type T
 | |
|     /// </summary>
 | |
|     /// <typeparam name="T">Target type to deserialize to</typeparam>
 | |
|     /// <returns>Deserialized data of type T</returns>
 | |
|     public T? GetData<T>()
 | |
|     {
 | |
|         if (Data is T typedData)
 | |
|             return typedData;
 | |
| 
 | |
|         var jsonOpts = new JsonSerializerOptions
 | |
|         {
 | |
|             PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
 | |
|             DictionaryKeyPolicy = JsonNamingPolicy.SnakeCaseLower,
 | |
|         };
 | |
|         return JsonSerializer.Deserialize<T>(
 | |
|             JsonSerializer.Serialize(Data, jsonOpts),
 | |
|             jsonOpts
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Serializes this WebSocketPacket to a byte array for sending over WebSocket
 | |
|     /// </summary>
 | |
|     /// <returns>Byte array representation of the packet</returns>
 | |
|     public byte[] ToBytes()
 | |
|     {
 | |
|         var jsonOpts = new JsonSerializerOptions
 | |
|         {
 | |
|             PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
 | |
|             DictionaryKeyPolicy = JsonNamingPolicy.SnakeCaseLower,
 | |
|         }.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
 | |
|         var json = JsonSerializer.Serialize(this, jsonOpts);
 | |
|         return System.Text.Encoding.UTF8.GetBytes(json);
 | |
|     }
 | |
| } |