diff --git a/BeatSaberHTTPStatus/HTTPServer.cs b/BeatSaberHTTPStatus/HTTPServer.cs
index b47435f..3d21366 100644
--- a/BeatSaberHTTPStatus/HTTPServer.cs
+++ b/BeatSaberHTTPStatus/HTTPServer.cs
@@ -1,5 +1,8 @@
using System;
using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using IPA.Utilities.Async;
using SimpleJSON;
using WebSocketSharp;
using WebSocketSharp.Net;
@@ -44,7 +47,8 @@ public void OnHTTPGet(HttpRequestEventArgs e) {
res.ContentType = "application/json";
res.ContentEncoding = Encoding.UTF8;
- var stringifiedStatus = Encoding.UTF8.GetBytes(statusManager.statusJSON.ToString());
+ // read game info from on game thread
+ var stringifiedStatus = UnityMainThreadTaskScheduler.Factory.StartNew(() => Encoding.UTF8.GetBytes(statusManager.statusJSON.ToString())).Result;
res.ContentLength64 = stringifiedStatus.Length;
res.Close(stringifiedStatus, false);
@@ -59,24 +63,38 @@ public void OnHTTPGet(HttpRequestEventArgs e) {
public class StatusBroadcastBehavior : WebSocketBehavior {
private StatusManager statusManager;
+ private Task readyToWrite = Task.CompletedTask;
+ private readonly CancellationTokenSource connectionClosed = new CancellationTokenSource();
public void SetStatusManager(StatusManager statusManager) {
this.statusManager = statusManager;
-
statusManager.statusChange += OnStatusChange;
}
- protected override void OnOpen() {
- JSONObject eventJSON = new JSONObject();
+ /// Queue data to send on the websocket in-order. This method is thread-safe.
+ private void QueuedSend(string data) {
+ var promise = new TaskCompletionSource