AyCode.Core/AyCode.Services/SignalRs/IAcSignalRHubClient.cs

198 lines
5.1 KiB
C#

using AyCode.Core.Extensions;
using MessagePack;
using Newtonsoft.Json.Linq;
using System.Text.RegularExpressions;
using AyCode.Core.Interfaces;
using System.Collections.Generic;
using System.Linq.Expressions;
namespace AyCode.Services.SignalRs;
public class IdMessage
{
public List<string> Ids { get; private set; } = [];
public IdMessage()
{
}
public IdMessage(IEnumerable<object> ids) : this()
{
//Ids.AddRange(ids);
Ids.AddRange(ids.Select(x =>
{
string item;
//if (x is Expression expr)
//{
// string aa = string.Empty;
// var serializer = new ExpressionSerializer(new JsonSerializer());
// try
// {
// aa = serializer.SerializeText(expr);
// }
// catch(Exception ex)
// {
// Console.WriteLine(ex);
// }
// item = (new[] { aa }).ToJson();
//}
//else
item = (new[] { x }).ToJson();
return item;
}));
}
public IdMessage(object id) : this(new object[] { id })
{
}
public IdMessage(IEnumerable<Guid> ids) : this(ids.Cast<object>().ToArray())
{
}
public override string ToString()
{
return string.Join("; ", Ids);
}
}
public class SignalPostJsonMessage
{
[Key(0)]
public string PostDataJson { get; set; }
public SignalPostJsonMessage()
{}
protected SignalPostJsonMessage(string postDataJson) => PostDataJson = postDataJson;
}
[MessagePackObject]
public class SignalPostJsonDataMessage<TPostDataType> : SignalPostJsonMessage, ISignalPostMessage<TPostDataType> where TPostDataType : class
{
[IgnoreMember]
private TPostDataType? _postData;
[IgnoreMember]
public TPostDataType PostData
{
get
{
return _postData ??= PostDataJson.JsonTo<TPostDataType>()!;
}
private init
{
_postData = value;
PostDataJson = _postData.ToJson();
}
}
public SignalPostJsonDataMessage() : base()
{}
public SignalPostJsonDataMessage(TPostDataType postData) => PostData = postData;
public SignalPostJsonDataMessage(string postDataJson) : base(postDataJson)
{}
}
[MessagePackObject]
public class SignalPostMessage<TPostData>(TPostData postData) : ISignalPostMessage<TPostData>
{
[Key(0)]
public TPostData? PostData { get; set; } = postData;
}
public interface ISignalPostMessage<TPostData> : ISignalRMessage
{
TPostData? PostData { get; }
}
[MessagePackObject]
public class SignalRequestByIdMessage(Guid id) : ISignalRequestMessage<Guid>, IId<Guid>
{
[Key(0)]
public Guid Id { get; set; } = id;
}
public interface ISignalRequestMessage<TRequestId> : ISignalRMessage
{
TRequestId Id { get; set; }
}
public interface ISignalRMessage
{ }
[MessagePackObject]
public sealed class SignalResponseJsonMessage : ISignalResponseMessage<string>
{
[Key(0)] public int MessageTag { get; set; }
[Key(1)] public SignalResponseStatus Status { get; set; }
[Key(2)] public string? ResponseData { get; set; } = null;
public SignalResponseJsonMessage(){}
public SignalResponseJsonMessage(int messageTag, SignalResponseStatus status)
{
Status = status;
MessageTag = messageTag;
}
public SignalResponseJsonMessage(int messageTag, SignalResponseStatus status, object? responseData) : this(messageTag, status)
{
if (responseData is string stringdata)
ResponseData = stringdata;
else ResponseData = responseData.ToJson();
}
public SignalResponseJsonMessage(int messageTag, SignalResponseStatus status, string? responseDataJson) : this(messageTag, status)
{
ResponseData = responseDataJson;
}
}
[MessagePackObject]
public sealed class SignalResponseMessage<TResponseData>(int messageTag, SignalResponseStatus status, TResponseData? responseData) : ISignalResponseMessage<TResponseData>
{
[Key(0)] public int MessageTag { get; set; }
[Key(1)] public SignalResponseStatus Status { get; set; } = status;
[Key(2)] public TResponseData? ResponseData { get; set; } = responseData;
}
public sealed class SignalResponseStatusMessage(SignalResponseStatus status) : ISignalRMessage
{
public SignalResponseStatus Status { get; set; } = status;
}
//[MessagePackObject]
//public sealed class SignalResponseMessage(SignalResponseStatus status) : ISignalResponseMessage
//{
// [Key(0)]
// public SignalResponseStatus Status { get; set; } = status;
//}
public interface ISignalResponseMessage<TResponseData> : ISignalResponseMessage
{
TResponseData? ResponseData { get; set; }
}
public interface ISignalResponseMessage : ISignalRMessage
{
int MessageTag { get; set; }
SignalResponseStatus Status { get; set; }
}
public enum SignalResponseStatus : byte
{
Error = 0,
Success = 5
}
public interface IAcSignalRHubClient : IAcSignalRHubBase
{
Task SendMessageToServerAsync(int messageTag, ISignalRMessage? message, int? requestId );
//Task SendRequestToServerAsync(int messageTag, int requestId);
}