Skip to content

Commit

Permalink
Events from api (#463)
Browse files Browse the repository at this point in the history
* Receive SSE stream from API

* Parse data received from SSE

* Move ApiManager to Network folder / GameObject in scene; Rename CliParser to CommandParser

* Dedicated httpClient for SSE + parsing & appendLogLine in main thread

* Fix timeout issue after receiving a message from SSE

* Better closing stream with API; Handling missing Tag/Layer when trying to modify/delete them

* Better enqueue in ApiManager
  • Loading branch information
Cedrok authored Feb 9, 2024
1 parent 866fd0d commit 2e0b086
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 27 deletions.
44 changes: 22 additions & 22 deletions Assets/Scenes/Main.unity
Original file line number Diff line number Diff line change
Expand Up @@ -9117,9 +9117,9 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: 'Build date: 2024-01-24
m_text: 'Build date: 2024-02-06

Commit #a9956ca5'
Commit #5718429a'
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2100000, guid: 79459efec17a4d00a321bdcc27bbc385, type: 2}
Expand Down Expand Up @@ -9423,7 +9423,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: -58.700134, y: -206.89996}
m_AnchoredPosition: {x: -58.700195, y: -206.89996}
m_SizeDelta: {x: -116, y: 257}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &821904126
Expand Down Expand Up @@ -14098,7 +14098,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 217.09996}
m_AnchoredPosition: {x: 0, y: 217.10002}
m_SizeDelta: {x: 0, y: 500}
m_Pivot: {x: 0, y: 1}
--- !u!1 &1278892172
Expand Down Expand Up @@ -16179,6 +16179,7 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 1407285864}
- component: {fileID: 1407285866}
- component: {fileID: 1407285865}
m_Layer: 0
m_Name: Network
Expand Down Expand Up @@ -16219,6 +16220,21 @@ MonoBehaviour:
timer: 0
triggerSend: 0
debugMsg: Hello
--- !u!114 &1407285866
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1407285862}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 320277df7b0f90345b701b56c180b883, type: 3}
m_Name:
m_EditorClassIdentifier:
isInit: 0
isReady: 0
server:
--- !u!1 &1407650633
GameObject:
m_ObjectHideFlags: 0
Expand Down Expand Up @@ -18258,7 +18274,6 @@ GameObject:
- component: {fileID: 1595579791}
- component: {fileID: 1595579784}
- component: {fileID: 1595579792}
- component: {fileID: 1595579788}
- component: {fileID: 1595579783}
- component: {fileID: 1595579787}
- component: {fileID: 1595579785}
Expand Down Expand Up @@ -18443,21 +18458,6 @@ MonoBehaviour:
- cursorType: 1
texture: {fileID: 2800000, guid: 8ba17cb453cc5da4b8959e3038fc57c8, type: 3}
offset: {x: 21, y: 12}
--- !u!114 &1595579788
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1595579780}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 320277df7b0f90345b701b56c180b883, type: 3}
m_Name:
m_EditorClassIdentifier:
isInit: 0
isReady: 0
server:
--- !u!114 &1595579791
MonoBehaviour:
m_ObjectHideFlags: 0
Expand Down Expand Up @@ -26277,8 +26277,8 @@ MonoBehaviour:
m_TargetGraphic: {fileID: 1513977461}
m_HandleRect: {fileID: 1513977460}
m_Direction: 2
m_Value: 0.00000014056921
m_Size: 0.5657684
m_Value: -0.00000014056921
m_Size: 0.5658
m_NumberOfSteps: 0
m_OnValueChanged:
m_PersistentCalls:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;

Expand Down Expand Up @@ -81,6 +83,8 @@ private struct SLayerContentResp
public static ApiManager instance;

private readonly HttpClient httpClient = new();
private readonly HttpClient sseHttpClient = new();
private Thread sseThread;

public bool isInit = false;

Expand All @@ -90,6 +94,8 @@ private struct SLayerContentResp
[SerializeField] private Queue<SRequest> requestsToSend = new();

private readonly ReadFromJson rfJson = new();
private readonly CommandParser parser = new();
public readonly Queue<Action> mainThreadQueue = new();

private string url;
private string token;
Expand Down Expand Up @@ -117,11 +123,14 @@ private void Update()
else if (requestsToSend.Peek().type == "delete")
DeleteHttpData();
}
while (mainThreadQueue.Count > 0)
mainThreadQueue.Dequeue().Invoke();
}

private void OnDestroy()
{
EventManager.instance.CancelGenerate.Remove(OnCancelGenenerate);
ResetApi();
}

///<summary>
Expand Down Expand Up @@ -153,6 +162,8 @@ public void ResetApi()
url = null;
token = null;
server = null;
if (sseThread.IsAlive)
sseThread.Abort();
EventManager.instance.Raise(new ConnectApiEvent());
}

Expand Down Expand Up @@ -187,6 +198,11 @@ public async Task Initialize()
isReady = true;
isInit = true;
GameManager.instance.AppendLogLine("Connected to API", ELogTarget.both, ELogtype.successApi);
sseThread = new(GetStream)
{
IsBackground = true
};
sseThread.Start();
}
catch (HttpRequestException e)
{
Expand Down Expand Up @@ -274,6 +290,53 @@ private async void DeleteHttpData()
isReady = true;
}

/// <summary>
/// Subscribe to stream from the API. For each received message, call <see cref="CommandParser.DeserializeInput(string)"/>
/// </summary>
public async void GetStream()
{
while (isInit)
{
try
{
sseHttpClient.DefaultRequestHeaders.Authorization = new("bearer", token);
sseHttpClient.Timeout = Timeout.InfiniteTimeSpan;
Debug.Log($"Getting Stream at {server}/events...");
using Stream stream = await sseHttpClient.GetStreamAsync($"{server}/events");
stream.ReadTimeout = Timeout.Infinite;
using StreamReader reader = new(stream);
while (isInit && !reader.EndOfStream)
{
string message = await reader.ReadLineAsync();
if (!string.IsNullOrEmpty(message))
{
// Remove "data: " from SSE msg
message = message[6..];
mainThreadQueue.Enqueue(async () =>
{
GameManager.instance.AppendLogLine($"(SSE) {message}", ELogTarget.none, ELogtype.infoApi);
await parser.DeserializeInput(message);
});
}
}
}
catch (HttpRequestException e)
{
Debug.LogError(e);
mainThreadQueue.Enqueue(() =>
{
GameManager.instance.AppendLogLine($"(SSE) {e.Message}", ELogTarget.logger, ELogtype.errorApi);
GameManager.instance.AppendLogLine($"(SSE) Reconnecting...", ELogTarget.logger, ELogtype.infoApi);
});
}
catch (Exception e)
{
Debug.LogError(e);
await Task.Delay(TimeSpan.FromSeconds(10));
}
}
}

///<summary>
/// Avoid requestsToSend
/// Get an Object from the api. Call a Task callback with the response.
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using System.Threading.Tasks;
using UnityEngine;

public class CliParser
public class CommandParser
{
#region Structures
struct SLogin
Expand Down Expand Up @@ -38,12 +38,12 @@ struct SCameraManip
readonly ReadFromJson rfJson = new();
private bool canDraw = true;

public CliParser()
public CommandParser()
{
EventManager.instance.CancelGenerate.Add(OnCancelGenenerate);
}

~CliParser()
~CommandParser()
{
EventManager.instance.CancelGenerate.Remove(OnCancelGenenerate);
}
Expand All @@ -58,7 +58,7 @@ private void OnCancelGenenerate(CancelGenerateEvent _e)
}

///<summary>
/// Deserialize CLI input and parse it.
/// Deserialize input and parse it.
///</summary>
///<param name="_input">The json to deserialize</param>
public async Task DeserializeInput(string _input)
Expand Down Expand Up @@ -201,6 +201,8 @@ private async Task Login(string _input)
private void DeleteTag(string _input)
{
Tag tagToDel = GameManager.instance.GetTag(_input);
if (tagToDel == null)
return;
foreach (string id in tagToDel.linkedObjects)
GameManager.instance.RemoveFromTag(tagToDel.slug, id);
}
Expand Down Expand Up @@ -360,6 +362,8 @@ private void ModifyTag(string _input)
{
Hashtable data = JsonConvert.DeserializeObject<Hashtable>(_input);
Tag tagToUpdate = GameManager.instance.GetTag(data["old-slug"].ToString());
if (tagToUpdate == null)
return;
SApiTag newData = JsonConvert.DeserializeObject<SApiTag>(data["tag"].ToString());
tagToUpdate.UpdateFromSApiTag(newData);
}
Expand Down Expand Up @@ -576,6 +580,8 @@ private void ModifyLayer(string _input)
{
Hashtable data = JsonConvert.DeserializeObject<Hashtable>(_input);
Layer layerToUpdate = LayerManager.instance.GetLayer(data["old-slug"].ToString());
if (layerToUpdate == null)
return;
SApiLayer newData = JsonConvert.DeserializeObject<SApiLayer>(data["layer"].ToString());
layerToUpdate.UpdateFromSApiLayer(newData);
UiManager.instance.layersList.RebuildMenu(UiManager.instance.BuildLayersList);
Expand All @@ -588,6 +594,8 @@ private void ModifyLayer(string _input)
private void DeleteLayer(string _input)
{
Layer layerToDel = LayerManager.instance.GetLayer(_input);
if (layerToDel == null)
return;
layerToDel.ClearObjects();
LayerManager.instance.layers.Remove(layerToDel);
UiManager.instance.layersList.RebuildMenu(UiManager.instance.BuildLayersList);
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion Assets/Scripts/Network/Server.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ private enum EConnectionType
tcp
}

readonly CliParser parser = new();
private readonly CommandParser parser = new();

[Header("Client config")]
[SerializeField] private EConnectionType protocol;
Expand Down

0 comments on commit 2e0b086

Please sign in to comment.