Fix #1
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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!"));
|
||||
|
||||
Reference in New Issue
Block a user