using Pole.Core.Serialization;
using Pole.Core.Utils;
using System;
using System.Collections.Generic;
using System.Text;
namespace Pole.EventBus.Event
{
public readonly struct EventBytesTransport
{
public EventBytesTransport(string eventCode, string eventId, byte[] eventBytes)
{
EventTypeCode = eventCode;
EventBytes = eventBytes;
EventId = eventId;
}
///
/// 每个类型的Event 全局唯一
///
public string EventId { get; }
///
/// 事件TypeCode
///
public string EventTypeCode { get; }
///
/// 事件本身的bytes
///
public byte[] EventBytes { get; }
public byte[] GetBytes()
{
var eventTypeBytes = Encoding.UTF8.GetBytes(EventTypeCode);
var eventIdBytes = Encoding.UTF8.GetBytes(EventId);
using var ms = new PooledMemoryStream();
ms.WriteByte((byte)TransportType.Event);
ms.Write(BitConverter.GetBytes((ushort)eventTypeBytes.Length));
ms.Write(BitConverter.GetBytes((ushort)eventIdBytes.Length));
ms.Write(BitConverter.GetBytes(EventBytes.Length));
ms.Write(eventTypeBytes);
ms.Write(eventIdBytes);
ms.Write(EventBytes);
return ms.ToArray();
}
public static (bool success, EventBytesTransport transport) FromBytes(byte[] bytes)
{
if (bytes[0] == (byte)TransportType.Event)
{
var bytesSpan = bytes.AsSpan();
var eventTypeCodeLength = BitConverter.ToUInt16(bytesSpan.Slice(1, sizeof(ushort)));
var eventIdLength = BitConverter.ToUInt16(bytesSpan.Slice(1 + sizeof(ushort), sizeof(ushort)));
var eventBytesLength = BitConverter.ToInt32(bytesSpan.Slice(1 + 2 * sizeof(ushort), sizeof(int)));
var skipLength = 2 * sizeof(ushort) + 1 + sizeof(int);
return (true, new EventBytesTransport(
Encoding.UTF8.GetString(bytesSpan.Slice(skipLength, eventTypeCodeLength)),
Encoding.UTF8.GetString(bytesSpan.Slice(skipLength + eventTypeCodeLength, eventIdLength)),
bytesSpan.Slice(skipLength + eventTypeCodeLength + eventIdLength, eventBytesLength).ToArray()
));
}
return (false, default);
}
}
}