This commit is contained in:
HueByte
2026-02-19 13:53:05 +00:00
parent a10d431303
commit 3b79c0eb6d
9 changed files with 178 additions and 30 deletions
@@ -158,8 +158,8 @@ Class IrcGatewayService <a class="header-action link-secondary" title="View sou
<a id="EchoHub_Server_Irc_IrcGatewayService__ctor_" data-uid="EchoHub.Server.Irc.IrcGatewayService.#ctor*"></a> <a id="EchoHub_Server_Irc_IrcGatewayService__ctor_" data-uid="EchoHub.Server.Irc.IrcGatewayService.#ctor*"></a>
<h3 id="EchoHub_Server_Irc_IrcGatewayService__ctor_Microsoft_Extensions_Options_IOptions_EchoHub_Server_Irc_IrcOptions__EchoHub_Core_Contracts_IChatService_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Irc_IrcGatewayService__" data-uid="EchoHub.Server.Irc.IrcGatewayService.#ctor(Microsoft.Extensions.Options.IOptions{EchoHub.Server.Irc.IrcOptions},EchoHub.Core.Contracts.IChatService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Irc.IrcGatewayService})"> <h3 id="EchoHub_Server_Irc_IrcGatewayService__ctor_Microsoft_Extensions_Options_IOptions_EchoHub_Server_Irc_IrcOptions__System_IServiceProvider_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Irc_IrcGatewayService__" data-uid="EchoHub.Server.Irc.IrcGatewayService.#ctor(Microsoft.Extensions.Options.IOptions{EchoHub.Server.Irc.IrcOptions},System.IServiceProvider,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Irc.IrcGatewayService})">
IrcGatewayService(IOptions&lt;IrcOptions&gt;, IChatService, ILogger&lt;IrcGatewayService&gt;) IrcGatewayService(IOptions&lt;IrcOptions&gt;, IServiceProvider, ILogger&lt;IrcGatewayService&gt;)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server.Irc/IrcGatewayService.cs"><i class="bi bi-code-slash"></i></a> <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server.Irc/IrcGatewayService.cs"><i class="bi bi-code-slash"></i></a>
</h3> </h3>
@@ -167,14 +167,14 @@ Class IrcGatewayService <a class="header-action link-secondary" title="View sou
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
<div class="codewrapper"> <div class="codewrapper">
<pre><code class="lang-csharp hljs">public IrcGatewayService(IOptions&lt;IrcOptions&gt; options, IChatService chatService, ILogger&lt;IrcGatewayService&gt; logger)</code></pre> <pre><code class="lang-csharp hljs">public IrcGatewayService(IOptions&lt;IrcOptions&gt; options, IServiceProvider services, ILogger&lt;IrcGatewayService&gt; logger)</code></pre>
</div> </div>
<h4 class="section">Parameters</h4> <h4 class="section">Parameters</h4>
<dl class="parameters"> <dl class="parameters">
<dt><code>options</code> <span class="xref">IOptions</span>&lt;<a class="xref" href="EchoHub.Server.Irc.IrcOptions.html">IrcOptions</a>&gt;</dt> <dt><code>options</code> <span class="xref">IOptions</span>&lt;<a class="xref" href="EchoHub.Server.Irc.IrcOptions.html">IrcOptions</a>&gt;</dt>
<dd></dd> <dd></dd>
<dt><code>chatService</code> <a class="xref" href="../core/EchoHub.Core.Contracts.IChatService.html">IChatService</a></dt> <dt><code>services</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iserviceprovider">IServiceProvider</a></dt>
<dd></dd> <dd></dd>
<dt><code>logger</code> <span class="xref">ILogger</span>&lt;<a class="xref" href="EchoHub.Server.Irc.IrcGatewayService.html">IrcGatewayService</a>&gt;</dt> <dt><code>logger</code> <span class="xref">ILogger</span>&lt;<a class="xref" href="EchoHub.Server.Irc.IrcGatewayService.html">IrcGatewayService</a>&gt;</dt>
<dd></dd> <dd></dd>
@@ -160,8 +160,8 @@ Class SignalRBroadcaster <a class="header-action link-secondary" title="View so
<a id="EchoHub_Server_Services_SignalRBroadcaster__ctor_" data-uid="EchoHub.Server.Services.SignalRBroadcaster.#ctor*"></a> <a id="EchoHub_Server_Services_SignalRBroadcaster__ctor_" data-uid="EchoHub.Server.Services.SignalRBroadcaster.#ctor*"></a>
<h3 id="EchoHub_Server_Services_SignalRBroadcaster__ctor_Microsoft_AspNetCore_SignalR_IHubContext_EchoHub_Server_Hubs_ChatHub_EchoHub_Core_Contracts_IEchoHubClient__EchoHub_Server_Services_PresenceTracker_" data-uid="EchoHub.Server.Services.SignalRBroadcaster.#ctor(Microsoft.AspNetCore.SignalR.IHubContext{EchoHub.Server.Hubs.ChatHub,EchoHub.Core.Contracts.IEchoHubClient},EchoHub.Server.Services.PresenceTracker)"> <h3 id="EchoHub_Server_Services_SignalRBroadcaster__ctor_System_IServiceProvider_EchoHub_Server_Services_PresenceTracker_" data-uid="EchoHub.Server.Services.SignalRBroadcaster.#ctor(System.IServiceProvider,EchoHub.Server.Services.PresenceTracker)">
SignalRBroadcaster(IHubContext&lt;ChatHub, IEchoHubClient&gt;, PresenceTracker) SignalRBroadcaster(IServiceProvider, PresenceTracker)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/SignalRBroadcaster.cs"><i class="bi bi-code-slash"></i></a> <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/SignalRBroadcaster.cs"><i class="bi bi-code-slash"></i></a>
</h3> </h3>
@@ -169,12 +169,12 @@ Class SignalRBroadcaster <a class="header-action link-secondary" title="View so
<div class="markdown level1 conceptual"></div> <div class="markdown level1 conceptual"></div>
<div class="codewrapper"> <div class="codewrapper">
<pre><code class="lang-csharp hljs">public SignalRBroadcaster(IHubContext&lt;ChatHub, IEchoHubClient&gt; hubContext, PresenceTracker presenceTracker)</code></pre> <pre><code class="lang-csharp hljs">public SignalRBroadcaster(IServiceProvider serviceProvider, PresenceTracker presenceTracker)</code></pre>
</div> </div>
<h4 class="section">Parameters</h4> <h4 class="section">Parameters</h4>
<dl class="parameters"> <dl class="parameters">
<dt><code>hubContext</code> <span class="xref">IHubContext</span>&lt;<a class="xref" href="EchoHub.Server.Hubs.ChatHub.html">ChatHub</a>, <a class="xref" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Core/Contracts/IEchoHubClient.cs">IEchoHubClient</a>&gt;</dt> <dt><code>serviceProvider</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iserviceprovider">IServiceProvider</a></dt>
<dd></dd> <dd></dd>
<dt><code>presenceTracker</code> <a class="xref" href="EchoHub.Server.Services.PresenceTracker.html">PresenceTracker</a></dt> <dt><code>presenceTracker</code> <a class="xref" href="EchoHub.Server.Services.PresenceTracker.html">PresenceTracker</a></dt>
<dd></dd> <dd></dd>
+1
View File
@@ -90,6 +90,7 @@
<p>Release history for EchoHub.</p> <p>Release history for EchoHub.</p>
<h2 id="releases">Releases</h2> <h2 id="releases">Releases</h2>
<ul> <ul>
<li><a href="v0.2.2.html">v0.2.2</a> - Startup &amp; Shutdown Fixes</li>
<li><a href="v0.2.1.html">v0.2.1</a> - Shutdown &amp; CI Fixes</li> <li><a href="v0.2.1.html">v0.2.1</a> - Shutdown &amp; CI Fixes</li>
<li><a href="v0.2.0.html">v0.2.0</a> - IRC Gateway</li> <li><a href="v0.2.0.html">v0.2.0</a> - IRC Gateway</li>
<li><a href="v0.1.1.html">v0.1.1</a> - Directory Connection Self-Healing</li> <li><a href="v0.1.1.html">v0.1.1</a> - Directory Connection Self-Healing</li>
+3
View File
@@ -15,6 +15,9 @@
<li> <li>
<a href="index.html" name="" title="Overview">Overview</a> <a href="index.html" name="" title="Overview">Overview</a>
</li> </li>
<li>
<a href="v0.2.2.html" name="" title="v0.2.2">v0.2.2</a>
</li>
<li> <li>
<a href="v0.2.1.html" name="" title="v0.2.1">v0.2.1</a> <a href="v0.2.1.html" name="" title="v0.2.1">v0.2.1</a>
</li> </li>
+1 -1
View File
@@ -1,2 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"v0.2.1","href":"v0.2.1.html","topicHref":"v0.2.1.html"},{"name":"v0.2.0","href":"v0.2.0.html","topicHref":"v0.2.0.html"},{"name":"v0.1.1","href":"v0.1.1.html","topicHref":"v0.1.1.html"},{"name":"v0.1.0","href":"v0.1.0.html","topicHref":"v0.1.0.html"}]} {"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"v0.2.2","href":"v0.2.2.html","topicHref":"v0.2.2.html"},{"name":"v0.2.1","href":"v0.2.1.html","topicHref":"v0.2.1.html"},{"name":"v0.2.0","href":"v0.2.0.html","topicHref":"v0.2.0.html"},{"name":"v0.1.1","href":"v0.1.1.html","topicHref":"v0.1.1.html"},{"name":"v0.1.0","href":"v0.1.0.html","topicHref":"v0.1.0.html"}]}
+129
View File
@@ -0,0 +1,129 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>v0.2.2 - Startup &amp; Shutdown Fixes | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="v0.2.2 - Startup &amp; Shutdown Fixes | EchoHub Documentation ">
<link rel="icon" href="../images/hue_icon.svg">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
<meta name="docfx:navrel" content="../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../">
<meta name="docfx:docurl" content="https://github.com/HueByte/EchoHub/blob/master/docs/#L1">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../index.html">
<img id="logo" class="svg" src="../images/hue_icon.svg" alt="EchoHub">
EchoHub
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="">
<h1 id="v022---startup--shutdown-fixes">v0.2.2 - Startup &amp; Shutdown Fixes</h1>
<h2 id="fixes">Fixes</h2>
<ul>
<li>Fixed server hanging on startup when IRC gateway is enabled — circular DI dependency between <code>IrcGatewayService</code><code>IChatService</code><code>IChatBroadcaster</code><code>IrcBroadcaster</code> caused the DI container to deadlock</li>
<li>Fixed <code>SignalRBroadcaster</code> eagerly resolving <code>IHubContext&lt;ChatHub&gt;</code> during DI construction, which could deadlock on some platforms — now lazy-resolves via <code>IServiceProvider</code> on first use</li>
<li>Simplified IRC service registration to use standard <code>AddSingleton&lt;IChatBroadcaster, IrcBroadcaster&gt;</code> instead of manual factory, breaking the circular resolution chain</li>
<li>Fixed server hanging on Ctrl+C — replaced <code>await using</code> with explicit dispose bounded to 3 seconds, so a stuck <code>HubConnection</code> can no longer block shutdown</li>
<li>Reduced host shutdown timeout from 30s (default) to 5s</li>
<li>Caught <code>OperationCanceledException</code> in the directory service reconnect loop so cancellation exits immediately instead of propagating through dispose</li>
</ul>
<h2 id="refactoring">Refactoring</h2>
<ul>
<li>Replaced primary constructors with standard constructor injection across all server classes for consistency</li>
</ul>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/docs/#L1" class="edit-link">Edit this page</a>
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<div class='footer-custom'><div class='footer-inner'><span class='footer-brand'>EchoHub</span><span class='footer-sep'>&middot;</span><a href='https://github.com/HueByte/EchoHub'>GitHub</a><span class='footer-sep'>&middot;</span><a href='https://echohub.voidcube.cloud'>Website</a><span class='footer-sep'>&middot;</span><span class='footer-credit'>Built with <a href='https://dotnet.github.io/docfx'>DocFX</a></span></div></div>
</div>
</div>
</footer>
</body>
</html>
+8 -3
View File
@@ -387,7 +387,7 @@
"api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html": { "api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html": {
"href": "api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html", "href": "api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html",
"title": "Class IrcGatewayService | EchoHub Documentation", "title": "Class IrcGatewayService | EchoHub Documentation",
"summary": "Class IrcGatewayService Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public sealed class IrcGatewayService : BackgroundService, IDisposable Inheritance object BackgroundService IrcGatewayService Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors IrcGatewayService(IOptions<IrcOptions>, IChatService, ILogger<IrcGatewayService>) public IrcGatewayService(IOptions<IrcOptions> options, IChatService chatService, ILogger<IrcGatewayService> logger) Parameters options IOptions<IrcOptions> chatService IChatService logger ILogger<IrcGatewayService> Properties Connections public IReadOnlyDictionary<string, IrcClientConnection> Connections { get; } Property Value IReadOnlyDictionary<string, IrcClientConnection> Options public IrcOptions Options { get; } Property Value IrcOptions Methods ExecuteAsync(CancellationToken) protected override Task ExecuteAsync(CancellationToken stoppingToken) Parameters stoppingToken CancellationToken Returns Task GetConnectionsInChannel(string) public IEnumerable<IrcClientConnection> GetConnectionsInChannel(string channelName) Parameters channelName string Returns IEnumerable<IrcClientConnection> StopAsync(CancellationToken) public override Task StopAsync(CancellationToken cancellationToken) Parameters cancellationToken CancellationToken Returns Task" "summary": "Class IrcGatewayService Namespace EchoHub.Server.Irc Assembly EchoHub.Server.Irc.dll public sealed class IrcGatewayService : BackgroundService, IDisposable Inheritance object BackgroundService IrcGatewayService Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors IrcGatewayService(IOptions<IrcOptions>, IServiceProvider, ILogger<IrcGatewayService>) public IrcGatewayService(IOptions<IrcOptions> options, IServiceProvider services, ILogger<IrcGatewayService> logger) Parameters options IOptions<IrcOptions> services IServiceProvider logger ILogger<IrcGatewayService> Properties Connections public IReadOnlyDictionary<string, IrcClientConnection> Connections { get; } Property Value IReadOnlyDictionary<string, IrcClientConnection> Options public IrcOptions Options { get; } Property Value IrcOptions Methods ExecuteAsync(CancellationToken) protected override Task ExecuteAsync(CancellationToken stoppingToken) Parameters stoppingToken CancellationToken Returns Task GetConnectionsInChannel(string) public IEnumerable<IrcClientConnection> GetConnectionsInChannel(string channelName) Parameters channelName string Returns IEnumerable<IrcClientConnection> StopAsync(CancellationToken) public override Task StopAsync(CancellationToken cancellationToken) Parameters cancellationToken CancellationToken Returns Task"
}, },
"api/server-irc/EchoHub.Server.Irc.IrcMessage.html": { "api/server-irc/EchoHub.Server.Irc.IrcMessage.html": {
"href": "api/server-irc/EchoHub.Server.Irc.IrcMessage.html", "href": "api/server-irc/EchoHub.Server.Irc.IrcMessage.html",
@@ -522,7 +522,7 @@
"api/server/EchoHub.Server.Services.SignalRBroadcaster.html": { "api/server/EchoHub.Server.Services.SignalRBroadcaster.html": {
"href": "api/server/EchoHub.Server.Services.SignalRBroadcaster.html", "href": "api/server/EchoHub.Server.Services.SignalRBroadcaster.html",
"title": "Class SignalRBroadcaster | EchoHub Documentation", "title": "Class SignalRBroadcaster | EchoHub Documentation",
"summary": "Class SignalRBroadcaster Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class SignalRBroadcaster : IChatBroadcaster Inheritance object SignalRBroadcaster Implements IChatBroadcaster Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors SignalRBroadcaster(IHubContext<ChatHub, IEchoHubClient>, PresenceTracker) public SignalRBroadcaster(IHubContext<ChatHub, IEchoHubClient> hubContext, PresenceTracker presenceTracker) Parameters hubContext IHubContext<ChatHub, IEchoHubClient> presenceTracker PresenceTracker Methods SendChannelUpdatedAsync(ChannelDto, string?) public Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) public Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageToChannelAsync(string, MessageDto) public Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserJoinedAsync(string, string, string?) public Task SendUserJoinedAsync(string channelName, string username, string? excludeConnectionId = null) Parameters channelName string username string excludeConnectionId string Returns Task SendUserLeftAsync(string, string) public Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List<string>, UserPresenceDto) public Task SendUserStatusChangedAsync(List<string> channelNames, UserPresenceDto presence) Parameters channelNames List<string> presence UserPresenceDto Returns Task" "summary": "Class SignalRBroadcaster Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class SignalRBroadcaster : IChatBroadcaster Inheritance object SignalRBroadcaster Implements IChatBroadcaster Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors SignalRBroadcaster(IServiceProvider, PresenceTracker) public SignalRBroadcaster(IServiceProvider serviceProvider, PresenceTracker presenceTracker) Parameters serviceProvider IServiceProvider presenceTracker PresenceTracker Methods SendChannelUpdatedAsync(ChannelDto, string?) public Task SendChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task SendErrorAsync(string, string) public Task SendErrorAsync(string connectionId, string message) Parameters connectionId string message string Returns Task SendMessageToChannelAsync(string, MessageDto) public Task SendMessageToChannelAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task SendUserJoinedAsync(string, string, string?) public Task SendUserJoinedAsync(string channelName, string username, string? excludeConnectionId = null) Parameters channelName string username string excludeConnectionId string Returns Task SendUserLeftAsync(string, string) public Task SendUserLeftAsync(string channelName, string username) Parameters channelName string username string Returns Task SendUserStatusChangedAsync(List<string>, UserPresenceDto) public Task SendUserStatusChangedAsync(List<string> channelNames, UserPresenceDto presence) Parameters channelNames List<string> presence UserPresenceDto Returns Task"
}, },
"api/server/EchoHub.Server.Services.html": { "api/server/EchoHub.Server.Services.html": {
"href": "api/server/EchoHub.Server.Services.html", "href": "api/server/EchoHub.Server.Services.html",
@@ -557,7 +557,7 @@
"changelog/index.html": { "changelog/index.html": {
"href": "changelog/index.html", "href": "changelog/index.html",
"title": "Changelog | EchoHub Documentation", "title": "Changelog | EchoHub Documentation",
"summary": "Changelog Release history for EchoHub. Releases v0.2.1 - Shutdown & CI Fixes v0.2.0 - IRC Gateway v0.1.1 - Directory Connection Self-Healing v0.1.0 - Initial Release" "summary": "Changelog Release history for EchoHub. Releases v0.2.2 - Startup & Shutdown Fixes v0.2.1 - Shutdown & CI Fixes v0.2.0 - IRC Gateway v0.1.1 - Directory Connection Self-Healing v0.1.0 - Initial Release"
}, },
"changelog/v0.1.0.html": { "changelog/v0.1.0.html": {
"href": "changelog/v0.1.0.html", "href": "changelog/v0.1.0.html",
@@ -579,6 +579,11 @@
"title": "v0.2.1 - Shutdown & CI Fixes | EchoHub Documentation", "title": "v0.2.1 - Shutdown & CI Fixes | EchoHub Documentation",
"summary": "v0.2.1 - Shutdown & CI Fixes Fixes Fixed server hanging on Ctrl+C when the directory server is unreachable — StopAsync now cancels background services before disposing connections Fixed IRC gateway shutdown blocking indefinitely on unresponsive clients — send operations are now bounded to 2 seconds Fixed CI release workflow not having full git history for building release notes (fetch-depth: 0) Fixed workflow_dispatch trigger breaking change detection when github.event.before is empty Improvements GitHub releases now include a commit list and version diff link instead of generic auto-generated notes GitHub releases link to the full changelog on the docs site" "summary": "v0.2.1 - Shutdown & CI Fixes Fixes Fixed server hanging on Ctrl+C when the directory server is unreachable — StopAsync now cancels background services before disposing connections Fixed IRC gateway shutdown blocking indefinitely on unresponsive clients — send operations are now bounded to 2 seconds Fixed CI release workflow not having full git history for building release notes (fetch-depth: 0) Fixed workflow_dispatch trigger breaking change detection when github.event.before is empty Improvements GitHub releases now include a commit list and version diff link instead of generic auto-generated notes GitHub releases link to the full changelog on the docs site"
}, },
"changelog/v0.2.2.html": {
"href": "changelog/v0.2.2.html",
"title": "v0.2.2 - Startup & Shutdown Fixes | EchoHub Documentation",
"summary": "v0.2.2 - Startup & Shutdown Fixes Fixes Fixed server hanging on startup when IRC gateway is enabled — circular DI dependency between IrcGatewayService → IChatService → IChatBroadcaster → IrcBroadcaster caused the DI container to deadlock Fixed SignalRBroadcaster eagerly resolving IHubContext<ChatHub> during DI construction, which could deadlock on some platforms — now lazy-resolves via IServiceProvider on first use Simplified IRC service registration to use standard AddSingleton<IChatBroadcaster, IrcBroadcaster> instead of manual factory, breaking the circular resolution chain Fixed server hanging on Ctrl+C — replaced await using with explicit dispose bounded to 3 seconds, so a stuck HubConnection can no longer block shutdown Reduced host shutdown timeout from 30s (default) to 5s Caught OperationCanceledException in the directory service reconnect loop so cancellation exits immediately instead of propagating through dispose Refactoring Replaced primary constructors with standard constructor injection across all server classes for consistency"
},
"index.html": { "index.html": {
"href": "index.html", "href": "index.html",
"title": "EchoHub Documentation | EchoHub Documentation", "title": "EchoHub Documentation | EchoHub Documentation",
+10
View File
@@ -1668,6 +1668,16 @@
}, },
"version": "" "version": ""
}, },
{
"type": "Conceptual",
"source_relative_path": "changelog/v0.2.2.md",
"output": {
".html": {
"relative_path": "changelog/v0.2.2.html"
}
},
"version": ""
},
{ {
"type": "Resource", "type": "Resource",
"source_relative_path": "images/hue_icon.svg", "source_relative_path": "images/hue_icon.svg",
+18 -18
View File
@@ -9514,15 +9514,15 @@ references:
commentId: T:EchoHub.Server.Irc.IrcGatewayService commentId: T:EchoHub.Server.Irc.IrcGatewayService
fullName: EchoHub.Server.Irc.IrcGatewayService fullName: EchoHub.Server.Irc.IrcGatewayService
nameWithType: IrcGatewayService nameWithType: IrcGatewayService
- uid: EchoHub.Server.Irc.IrcGatewayService.#ctor(Microsoft.Extensions.Options.IOptions{EchoHub.Server.Irc.IrcOptions},EchoHub.Core.Contracts.IChatService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Irc.IrcGatewayService}) - uid: EchoHub.Server.Irc.IrcGatewayService.#ctor(Microsoft.Extensions.Options.IOptions{EchoHub.Server.Irc.IrcOptions},System.IServiceProvider,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Irc.IrcGatewayService})
name: IrcGatewayService(IOptions<IrcOptions>, IChatService, ILogger<IrcGatewayService>) name: IrcGatewayService(IOptions<IrcOptions>, IServiceProvider, ILogger<IrcGatewayService>)
href: api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html#EchoHub_Server_Irc_IrcGatewayService__ctor_Microsoft_Extensions_Options_IOptions_EchoHub_Server_Irc_IrcOptions__EchoHub_Core_Contracts_IChatService_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Irc_IrcGatewayService__ href: api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html#EchoHub_Server_Irc_IrcGatewayService__ctor_Microsoft_Extensions_Options_IOptions_EchoHub_Server_Irc_IrcOptions__System_IServiceProvider_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Irc_IrcGatewayService__
commentId: M:EchoHub.Server.Irc.IrcGatewayService.#ctor(Microsoft.Extensions.Options.IOptions{EchoHub.Server.Irc.IrcOptions},EchoHub.Core.Contracts.IChatService,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Irc.IrcGatewayService}) commentId: M:EchoHub.Server.Irc.IrcGatewayService.#ctor(Microsoft.Extensions.Options.IOptions{EchoHub.Server.Irc.IrcOptions},System.IServiceProvider,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Irc.IrcGatewayService})
name.vb: New(IOptions(Of IrcOptions), IChatService, ILogger(Of IrcGatewayService)) name.vb: New(IOptions(Of IrcOptions), IServiceProvider, ILogger(Of IrcGatewayService))
fullName: EchoHub.Server.Irc.IrcGatewayService.IrcGatewayService(Microsoft.Extensions.Options.IOptions<EchoHub.Server.Irc.IrcOptions>, EchoHub.Core.Contracts.IChatService, Microsoft.Extensions.Logging.ILogger<EchoHub.Server.Irc.IrcGatewayService>) fullName: EchoHub.Server.Irc.IrcGatewayService.IrcGatewayService(Microsoft.Extensions.Options.IOptions<EchoHub.Server.Irc.IrcOptions>, System.IServiceProvider, Microsoft.Extensions.Logging.ILogger<EchoHub.Server.Irc.IrcGatewayService>)
fullName.vb: EchoHub.Server.Irc.IrcGatewayService.New(Microsoft.Extensions.Options.IOptions(Of EchoHub.Server.Irc.IrcOptions), EchoHub.Core.Contracts.IChatService, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Irc.IrcGatewayService)) fullName.vb: EchoHub.Server.Irc.IrcGatewayService.New(Microsoft.Extensions.Options.IOptions(Of EchoHub.Server.Irc.IrcOptions), System.IServiceProvider, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Irc.IrcGatewayService))
nameWithType: IrcGatewayService.IrcGatewayService(IOptions<IrcOptions>, IChatService, ILogger<IrcGatewayService>) nameWithType: IrcGatewayService.IrcGatewayService(IOptions<IrcOptions>, IServiceProvider, ILogger<IrcGatewayService>)
nameWithType.vb: IrcGatewayService.New(IOptions(Of IrcOptions), IChatService, ILogger(Of IrcGatewayService)) nameWithType.vb: IrcGatewayService.New(IOptions(Of IrcOptions), IServiceProvider, ILogger(Of IrcGatewayService))
- uid: EchoHub.Server.Irc.IrcGatewayService.#ctor* - uid: EchoHub.Server.Irc.IrcGatewayService.#ctor*
name: IrcGatewayService name: IrcGatewayService
href: api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html#EchoHub_Server_Irc_IrcGatewayService__ctor_ href: api/server-irc/EchoHub.Server.Irc.IrcGatewayService.html#EchoHub_Server_Irc_IrcGatewayService__ctor_
@@ -10726,15 +10726,15 @@ references:
commentId: T:EchoHub.Server.Services.SignalRBroadcaster commentId: T:EchoHub.Server.Services.SignalRBroadcaster
fullName: EchoHub.Server.Services.SignalRBroadcaster fullName: EchoHub.Server.Services.SignalRBroadcaster
nameWithType: SignalRBroadcaster nameWithType: SignalRBroadcaster
- uid: EchoHub.Server.Services.SignalRBroadcaster.#ctor(Microsoft.AspNetCore.SignalR.IHubContext{EchoHub.Server.Hubs.ChatHub,EchoHub.Core.Contracts.IEchoHubClient},EchoHub.Server.Services.PresenceTracker) - uid: EchoHub.Server.Services.SignalRBroadcaster.#ctor(System.IServiceProvider,EchoHub.Server.Services.PresenceTracker)
name: SignalRBroadcaster(IHubContext<ChatHub, IEchoHubClient>, PresenceTracker) name: SignalRBroadcaster(IServiceProvider, PresenceTracker)
href: api/server/EchoHub.Server.Services.SignalRBroadcaster.html#EchoHub_Server_Services_SignalRBroadcaster__ctor_Microsoft_AspNetCore_SignalR_IHubContext_EchoHub_Server_Hubs_ChatHub_EchoHub_Core_Contracts_IEchoHubClient__EchoHub_Server_Services_PresenceTracker_ href: api/server/EchoHub.Server.Services.SignalRBroadcaster.html#EchoHub_Server_Services_SignalRBroadcaster__ctor_System_IServiceProvider_EchoHub_Server_Services_PresenceTracker_
commentId: M:EchoHub.Server.Services.SignalRBroadcaster.#ctor(Microsoft.AspNetCore.SignalR.IHubContext{EchoHub.Server.Hubs.ChatHub,EchoHub.Core.Contracts.IEchoHubClient},EchoHub.Server.Services.PresenceTracker) commentId: M:EchoHub.Server.Services.SignalRBroadcaster.#ctor(System.IServiceProvider,EchoHub.Server.Services.PresenceTracker)
name.vb: New(IHubContext(Of ChatHub, IEchoHubClient), PresenceTracker) name.vb: New(IServiceProvider, PresenceTracker)
fullName: EchoHub.Server.Services.SignalRBroadcaster.SignalRBroadcaster(Microsoft.AspNetCore.SignalR.IHubContext<EchoHub.Server.Hubs.ChatHub, EchoHub.Core.Contracts.IEchoHubClient>, EchoHub.Server.Services.PresenceTracker) fullName: EchoHub.Server.Services.SignalRBroadcaster.SignalRBroadcaster(System.IServiceProvider, EchoHub.Server.Services.PresenceTracker)
fullName.vb: EchoHub.Server.Services.SignalRBroadcaster.New(Microsoft.AspNetCore.SignalR.IHubContext(Of EchoHub.Server.Hubs.ChatHub, EchoHub.Core.Contracts.IEchoHubClient), EchoHub.Server.Services.PresenceTracker) fullName.vb: EchoHub.Server.Services.SignalRBroadcaster.New(System.IServiceProvider, EchoHub.Server.Services.PresenceTracker)
nameWithType: SignalRBroadcaster.SignalRBroadcaster(IHubContext<ChatHub, IEchoHubClient>, PresenceTracker) nameWithType: SignalRBroadcaster.SignalRBroadcaster(IServiceProvider, PresenceTracker)
nameWithType.vb: SignalRBroadcaster.New(IHubContext(Of ChatHub, IEchoHubClient), PresenceTracker) nameWithType.vb: SignalRBroadcaster.New(IServiceProvider, PresenceTracker)
- uid: EchoHub.Server.Services.SignalRBroadcaster.#ctor* - uid: EchoHub.Server.Services.SignalRBroadcaster.#ctor*
name: SignalRBroadcaster name: SignalRBroadcaster
href: api/server/EchoHub.Server.Services.SignalRBroadcaster.html#EchoHub_Server_Services_SignalRBroadcaster__ctor_ href: api/server/EchoHub.Server.Services.SignalRBroadcaster.html#EchoHub_Server_Services_SignalRBroadcaster__ctor_