app.hypergames.hypersdk 1.8.8 → 1.8.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [1.8.10](https://github.com/mvmhyper/hyper-sdk/compare/v1.8.9...v1.8.10) (2026-04-22)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * hold score batches until startGame ack ([bf49863](https://github.com/mvmhyper/hyper-sdk/commit/bf498637b2c7a14e9d8eba5f62345fc97b59d6aa))
7
+
8
+ ## [1.8.9](https://github.com/mvmhyper/hyper-sdk/compare/v1.8.8...v1.8.9) (2026-04-17)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * preserve tournamentID and pass oldTournamentID separately ([d2cc3a9](https://github.com/mvmhyper/hyper-sdk/commit/d2cc3a928a8e0b096e6d0d45bc92db8e11f5f491))
14
+
1
15
  ## [1.8.8](https://github.com/mvmhyper/hyper-sdk/compare/v1.8.7...v1.8.8) (2026-04-15)
2
16
 
3
17
 
package/HyperLoader.unity CHANGED
@@ -840,7 +840,7 @@ GameObject:
840
840
  m_Component:
841
841
  - component: {fileID: 1064166296}
842
842
  m_Layer: 0
843
- m_Name: __HyperSDK_BuildMarker_639114648052637778
843
+ m_Name: __HyperSDK_BuildMarker_639122897878079609
844
844
  m_TagString: Untagged
845
845
  m_Icon: {fileID: 0}
846
846
  m_NavMeshLayer: 0
@@ -63,10 +63,7 @@ namespace Hyper.Internal
63
63
 
64
64
  public string TournamentId
65
65
  {
66
- get
67
- {
68
- return string.IsNullOrEmpty(OldTournamentId) ? _tournamentId : OldTournamentId;
69
- }
66
+ get => _tournamentId;
70
67
  set => _tournamentId = string.Copy(value);
71
68
  }
72
69
 
@@ -294,6 +294,9 @@ namespace Hyper.Internal.Managers
294
294
  private Coroutine _sendGameResumedCoroutine;
295
295
  private bool _gameStarted;
296
296
  private bool _gameResumed;
297
+ private bool _canFlushScoresAfterGameStartAck;
298
+ private bool _hasLoggedWaitingForGameStartAck;
299
+ private bool _hasLoggedFirstFlushAfterGameStartAck;
297
300
  private bool _isManuallyClosed;
298
301
  private bool _isSocketErrorCalled;
299
302
 
@@ -361,6 +364,10 @@ namespace Hyper.Internal.Managers
361
364
 
362
365
  public void SendGameStarted()
363
366
  {
367
+ _canFlushScoresAfterGameStartAck = false;
368
+ _hasLoggedWaitingForGameStartAck = false;
369
+ _hasLoggedFirstFlushAfterGameStartAck = false;
370
+
364
371
  if (_sendGameStartedCoroutine == null)
365
372
  {
366
373
  _sendGameStartedCoroutine = StartCoroutine(SendGameStartedCoroutine());
@@ -583,7 +590,14 @@ namespace Hyper.Internal.Managers
583
590
  {
584
591
  _gameManager?.ShowConnectionRestored();
585
592
 
586
- if (!_gameManager.IsPaused)
593
+ // If gameplay started locally but backend never acknowledged startGame,
594
+ // reconnect must bootstrap the backend session with startGame first.
595
+ if (!_gameStarted)
596
+ {
597
+ HyperDebug.Log("[Reconnect] Game has started locally but startGame ack not received yet. Sending startGame on reconnect.");
598
+ SendGameStarted();
599
+ }
600
+ else if (!_gameManager.IsPaused)
587
601
  {
588
602
  SendGameResumed();
589
603
  }
@@ -633,6 +647,8 @@ namespace Hyper.Internal.Managers
633
647
  public void OnSocketGameStarted(string message)
634
648
  {
635
649
  _gameStarted = true;
650
+ _canFlushScoresAfterGameStartAck = true;
651
+ _hasLoggedWaitingForGameStartAck = false;
636
652
 
637
653
  if (_sendGameStartedCoroutine != null)
638
654
  {
@@ -642,6 +658,8 @@ namespace Hyper.Internal.Managers
642
658
 
643
659
  HyperDebug.Log("[WebSocket] Received gameStarted event from server.");
644
660
  TryUpdateCSRFToken(message, "gameStarted");
661
+ int pendingCount = _dataManager?.PendingScores?.Count ?? 0;
662
+ HyperDebug.Log($"[Score] gameStarted acknowledged by backend. Score flush gate opened. PendingCount={pendingCount}");
645
663
  }
646
664
 
647
665
  public void OnSocketGameResumed(string message)
@@ -649,6 +667,14 @@ namespace Hyper.Internal.Managers
649
667
  _gameResumed = true;
650
668
  HyperDebug.Log("[WebSocket] Received gameResumed event from server.");
651
669
 
670
+ if (!_canFlushScoresAfterGameStartAck)
671
+ {
672
+ _canFlushScoresAfterGameStartAck = true;
673
+ _hasLoggedWaitingForGameStartAck = false;
674
+ int pendingCount = _dataManager?.PendingScores?.Count ?? 0;
675
+ HyperDebug.Log($"[Score] gameResumed acknowledged before gameStarted ack. Opening score flush gate. PendingCount={pendingCount}");
676
+ }
677
+
652
678
  TryUpdateCSRFToken(message, "gameResumed");
653
679
  ResumeScoreSending();
654
680
  }
@@ -1175,6 +1201,21 @@ namespace Hyper.Internal.Managers
1175
1201
  {
1176
1202
  int pendingCount = _dataManager?.PendingScores?.Count ?? 0;
1177
1203
  HyperDebug.Log($"[Score] Socket disconnected - accumulating scores for offline batch. PendingCount={pendingCount}");
1204
+ _isWaitingForTokenLogEmitted = false;
1205
+ _hasLoggedWaitingForGameStartAck = false;
1206
+ yield return _scoreSendInterval;
1207
+ continue;
1208
+ }
1209
+
1210
+ if (!_canFlushScoresAfterGameStartAck)
1211
+ {
1212
+ int pendingCount = _dataManager?.PendingScores?.Count ?? 0;
1213
+ if (!_hasLoggedWaitingForGameStartAck)
1214
+ {
1215
+ HyperDebug.LogWarning($"[Score] Waiting for gameStarted acknowledgement before flushing score batches. PendingCount={pendingCount}");
1216
+ _hasLoggedWaitingForGameStartAck = true;
1217
+ }
1218
+
1178
1219
  _isWaitingForTokenLogEmitted = false;
1179
1220
  yield return _scoreSendInterval;
1180
1221
  continue;
@@ -1211,6 +1252,11 @@ namespace Hyper.Internal.Managers
1211
1252
  scoresToSend.AddRange(_dataManager?.PendingScores);
1212
1253
  _dataManager?.PendingScores.Clear();
1213
1254
  int count = scoresToSend.Count;
1255
+ if (!_hasLoggedFirstFlushAfterGameStartAck)
1256
+ {
1257
+ HyperDebug.Log($"[Score] First score flush after gameStarted acknowledgement. BatchSize={count}");
1258
+ _hasLoggedFirstFlushAfterGameStartAck = true;
1259
+ }
1214
1260
  HyperDebug.Log($"[Score] Preparing to send {count} score sample(s) over WebSocket. LastPendingCumulativeScore={scoresToSend[count - 1].cumulativeScore}");
1215
1261
 
1216
1262
  // Send the entire batch as an array payload.
@@ -283,12 +283,13 @@ namespace Hyper.Internal
283
283
  _dataManager.UpdateScore(0);
284
284
  HyperRuntime.Timer.StartActiveGameTimer();
285
285
 
286
- // Only proceed if connected
286
+ _dataManager.StartCapturingScores(); // Start capture/sender immediately so offline starts still buffer score samples.
287
+ _backendManager.StartSendingScores(); // Sender loop already pauses actual submissions while disconnected or token-gated.
288
+
289
+ // startGame handshake can only be emitted when socket is connected.
287
290
  if (_backendManager.isSocketConnected)
288
291
  {
289
292
  _backendManager.SendGameStarted();
290
- _dataManager.StartCapturingScores();
291
- _backendManager.StartSendingScores();
292
293
  }
293
294
 
294
295
  #if UNITY_WEBGL && !UNITY_EDITOR
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "app.hypergames.hypersdk",
3
- "version": "1.8.8",
3
+ "version": "1.8.10",
4
4
  "displayName": "HyperSDK",
5
5
  "description": "Official Unity SDK for Hyper: multiplayer battles, leaderboards, deterministic RNG, session management, tutorials, and WebGL optimizations for production-ready games.",
6
6
  "unity": "6000.0",