This commit is contained in:
xuef
2023-12-09 06:29:56 +00:00
parent e547bc37f0
commit 026d168756
5 changed files with 14 additions and 33 deletions
@@ -10,9 +10,9 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Aiursoft.AiurObserver" Version="7.0.3" />
<PackageReference Include="Aiursoft.Scanner" Version="7.0.1" />
<PackageReference Include="Aiursoft.WebTools" Version="7.0.11" />
<PackageReference Include="Aiursoft.AiurObserver" Version="7.0.4" />
<PackageReference Include="Gera.Chess" Version="1.0.5" />
</ItemGroup>
</Project>
@@ -1,6 +1,5 @@
using AiurObserver;
using Aiursoft.ChessServer.Data;
using Aiursoft.ChessServer.Models;
using Aiursoft.ChessServer.Services;
using Microsoft.AspNetCore.Mvc;
@@ -41,25 +40,25 @@ public class GamesController : Controller
public async Task GetWebSocket([FromRoute] int id)
{
var game = _database.GetOrAddGame(id);
IDisposable? subscription = null;
ISubscription? subscription = null;
await _pusher.Accept(HttpContext);
try
{
subscription = game.Channel.Subscribe(async t =>
{
await _pusher.SendMessage(t.Content);
_logger.LogInformation("Message was sent to client!");
await _pusher.SendMessage(t);
_logger.LogInformation("Message was sent to client with ID: {PusherId}", _pusher.Id);
});
_logger.LogInformation("Game {Id} registering events done. Waiting for close. Now it has {Count} subscribers", id, game.Channel.GetListenerCount());
_logger.LogInformation("Game {Id} registering listener {PusherId} done. Waiting for close. Now it has {Count} subscribers", id, _pusher.Id, game.Channel.GetListenerCount());
await _pusher.PendingClose();
}
finally
{
await _pusher.Close();
subscription?.Dispose();
_logger.LogInformation("Getting game {Id} websocket connection was interrupted. Now it has {Count} subscribers", id, game.Channel.GetListenerCount());
subscription!.UnRegister();
_logger.LogInformation("Game {Id}'s pusher {PusherId} connection was interrupted. Now it has {Count} subscribers", id, _pusher.Id, game.Channel.GetListenerCount());
}
}
@@ -104,7 +103,7 @@ public class GamesController : Controller
game.Board.Move(move);
var fen = game.Board.ToFen();
await game.Channel.Push(new Message(fen));
await Task.WhenAll(game.Channel.Broadcast(fen));
return Ok(fen);
}
catch
@@ -1,20 +0,0 @@
using AiurObserver;
namespace Aiursoft.ChessServer.Models;
public class Channel : AsyncObservable<Message>
{
public Channel()
{
Messages.AddLast(new Message("placeholder"));
}
private LinkedList<Message> Messages { get; } = new();
public async Task Push(Message message)
{
Messages.AddLast(message);
await Task.WhenAll(Broadcast(message));
}
}
+4 -3
View File
@@ -1,10 +1,11 @@
using Chess;
using AiurObserver;
using Chess;
namespace Aiursoft.ChessServer.Models;
public class Game
{
public ChessBoard Board { get; set; } = new ChessBoard();
public ChessBoard Board { get; set; } = new();
public Channel Channel { get; set; } = new Channel();
public AsyncObservable<string> Channel { get; set; } = new ();
}
@@ -8,6 +8,8 @@ public class WebSocketPusher : IScopedDependency
{
private bool _dropped;
private WebSocket? _ws;
public readonly Guid Id = Guid.NewGuid();
public bool Connected => !_dropped && _ws?.State == WebSocketState.Open;
@@ -22,7 +24,6 @@ public class WebSocketPusher : IScopedDependency
{
return;
}
try
{
await (_ws?.SendMessage(message) ?? throw new InvalidOperationException("WebSocket is not connected!"));