using System.Threading; using System.Threading.Tasks; using game.PlayerDataStorage; internal static class KVMgr { internal static PlayerKVKeyReadResult ReadKV(PlayerKVGameSessionHandle handle, string key) { if (PlayerKVGameLoadGuard.Reject(PlayerKVGuardPoint.ReadLocal)) return new PlayerKVKeyReadResult(PlayerKVKeyReadError.LoadGuardActive, handle); if (handle == null || !KVSnapshot.ValidKey(key)) return new PlayerKVKeyReadResult(PlayerKVKeyReadError.InvalidInput, handle); var read = handle.ReadLocalSnapshot(); if (!read.Success) return new PlayerKVKeyReadResult(read.Error == PlayerKVLocalReadError.StaleOrClosing ? PlayerKVKeyReadError.StaleOrClosing : PlayerKVKeyReadError.NotReady, handle); var found = read.Data.TryGetValue(key, out var value); return new PlayerKVKeyReadResult(PlayerKVKeyReadError.None, handle, found, value); } internal static PlayerKVEditResult WriteKV(PlayerKVGameSessionHandle handle, string key, string value, bool remoteStore = true) { if (PlayerKVGameLoadGuard.Reject(PlayerKVGuardPoint.Update)) return new PlayerKVEditResult(new PlayerKVStateResult(PlayerKVChangeError.Blocked)); if (handle == null) return new PlayerKVEditResult(new PlayerKVStateResult(PlayerKVChangeError.Validation)); return handle.Update(key, value, remoteStore); } internal static Task FlushKVAsync(PlayerKVGameSessionHandle handle, CancellationToken waitToken = default) { if (PlayerKVGameLoadGuard.Reject(PlayerKVGuardPoint.Sync)) return Task.FromResult(new PlayerKVFlushResult(0, 0, 1, 0, PlayerKVError.Cancelled, handle == null ? PlayerKVSyncStatus.NotLoaded : handle.Status)); if (handle == null) return Task.FromResult(new PlayerKVFlushResult(0, 0, 1, 0, PlayerKVError.Validation, PlayerKVSyncStatus.NotLoaded)); return handle.FlushAsync(waitToken); } internal static Task WaitForKVTicketAsync(PlayerKVGameSessionHandle handle, PlayerKVSyncTicket ticket, CancellationToken waitToken = default) { if (PlayerKVGameLoadGuard.Reject(PlayerKVGuardPoint.Sync)) return Task.FromResult(new PlayerKVTicketResult(PlayerKVTicketStatus.Blocked, PlayerKVError.Cancelled, handle == null ? PlayerKVSyncStatus.NotLoaded : handle.Status)); if (handle == null) return Task.FromResult(new PlayerKVTicketResult(PlayerKVTicketStatus.Blocked, PlayerKVError.Validation, PlayerKVSyncStatus.NotLoaded)); return handle.WaitForTicketAsync(ticket, waitToken); } }