using System; using System.IO; using System.Text; using System.Text.RegularExpressions; using UnityEngine.Networking; public class ServerSentEventHandler : DownloadHandlerScript { private readonly MemoryStream dataStream = new MemoryStream(1024); private readonly Regex eventRegex = new Regex(@"event:?(.*)"); private readonly Regex dataRegex = new Regex(@"data:?(.*)"); protected override bool ReceiveData(byte[] newData, int dataLength) { foreach (var character in newData) { dataStream.WriteByte(character); if (character != '\n') continue; var stringData = new byte[dataStream.Length]; Array.Copy(dataStream.GetBuffer(), stringData, dataStream.Length); HandleLine(Encoding.UTF8.GetString(stringData)); dataStream.SetLength(0); } return true; } private ServerSentEventType? currentType; private string currentData; protected void HandleLine(string newLine) { var eventMatch = eventRegex.Match(newLine); if (eventMatch.Success) { currentType = ServerSentEventTypeExt.FromName(eventMatch.Groups[1].Value); } var dataMatch = dataRegex.Match(newLine); if (dataMatch.Success) { currentData = dataMatch.Groups[1].Value; } if (currentData == null || currentType == null) return; OnServerSentEventReceived?.Invoke(new ServerSentEvent { Data = currentData, Type = currentType.Value }); currentData = null; currentType = null; } public event Action OnServerSentEventReceived; }