diff --git a/SVSim.BattleNode/Bridge/BattleNodeOptions.cs b/SVSim.BattleNode/Bridge/BattleNodeOptions.cs index 7210e9f..0e28827 100644 --- a/SVSim.BattleNode/Bridge/BattleNodeOptions.cs +++ b/SVSim.BattleNode/Bridge/BattleNodeOptions.cs @@ -1,10 +1,11 @@ namespace SVSim.BattleNode.Bridge; /// -/// DI-injected options for the battle node. The web host populates these — typically -/// nodeServerUrl is "ws://localhost:5148" matching ASPNETCORE_URLS. +/// DI-injected options for the battle node. NodeServerUrl matches the prod +/// do_matching wire format: host:port/socket.io/, no scheme prefix. +/// BestHTTP's SocketManager parses it as the Socket.IO v2 endpoint URL. /// public sealed class BattleNodeOptions { - public string NodeServerUrl { get; set; } = "ws://localhost:5148"; + public string NodeServerUrl { get; set; } = "localhost:5148/socket.io/"; } diff --git a/SVSim.EmulatedEntrypoint/Program.cs b/SVSim.EmulatedEntrypoint/Program.cs index 0ef2d65..8c9596b 100644 --- a/SVSim.EmulatedEntrypoint/Program.cs +++ b/SVSim.EmulatedEntrypoint/Program.cs @@ -119,8 +119,9 @@ public class Program builder.Services.AddBattleNode(opt => { - // ASPNETCORE_URLS defaults to http://localhost:5148; we map ws:// onto the same host:port. - opt.NodeServerUrl = "ws://localhost:5148"; + // Matches the prod do_matching wire format: host:port/socket.io/, no scheme prefix. + // BestHTTP's SocketManager parses this as the Socket.IO v2 endpoint URL. + opt.NodeServerUrl = "localhost:5148/socket.io/"; }); builder.Services.AddTransient(); diff --git a/SVSim.UnitTests/BattleNode/Bridge/MatchingBridgeTests.cs b/SVSim.UnitTests/BattleNode/Bridge/MatchingBridgeTests.cs index c526ad1..b4c7473 100644 --- a/SVSim.UnitTests/BattleNode/Bridge/MatchingBridgeTests.cs +++ b/SVSim.UnitTests/BattleNode/Bridge/MatchingBridgeTests.cs @@ -11,11 +11,11 @@ public class MatchingBridgeTests public void RegisterPendingBattle_RegistersInStoreAndReturnsNodeUrl() { var store = new InMemoryBattleSessionStore(); - var bridge = new MatchingBridge(store, new BattleNodeOptions { NodeServerUrl = "ws://localhost:5148" }); + var bridge = new MatchingBridge(store, new BattleNodeOptions { NodeServerUrl = "localhost:5148/socket.io/" }); var match = bridge.RegisterPendingBattle(viewerId: 906243102); - Assert.That(match.NodeServerUrl, Is.EqualTo("ws://localhost:5148")); + Assert.That(match.NodeServerUrl, Is.EqualTo("localhost:5148/socket.io/")); Assert.That(match.BattleId, Is.Not.Empty); var pending = store.TryGetPending(match.BattleId); Assert.That(pending, Is.Not.Null); diff --git a/SVSim.UnitTests/Controllers/ArenaTwoPickBattleControllerTests.cs b/SVSim.UnitTests/Controllers/ArenaTwoPickBattleControllerTests.cs index a75d1f9..9aa6b4a 100644 --- a/SVSim.UnitTests/Controllers/ArenaTwoPickBattleControllerTests.cs +++ b/SVSim.UnitTests/Controllers/ArenaTwoPickBattleControllerTests.cs @@ -28,7 +28,10 @@ public class ArenaTwoPickBattleControllerTests var battleId = root.GetProperty("battle_id").GetString(); Assert.That(battleId, Is.Not.Null.And.Not.Empty); var nodeUrl = root.GetProperty("node_server_url").GetString(); - Assert.That(nodeUrl, Does.StartWith("ws://")); + // Matches prod wire format: host:port/socket.io/, no scheme prefix. + Assert.That(nodeUrl, Does.Contain("/socket.io/")); + Assert.That(nodeUrl, Does.Not.StartWith("ws://")); + Assert.That(nodeUrl, Does.Not.StartWith("http://")); // Required when matching_state ∈ {3004,3007,3011} per // DoMatchingBase.SettingCardMasterId; client throws KeyNotFoundException without it. Assert.That(root.GetProperty("card_master_id").GetInt32(), Is.EqualTo(1));