This commit is contained in:
HueByte
2026-04-24 14:14:33 +00:00
parent e54913cdc2
commit 35bf05433e
16 changed files with 1768 additions and 33 deletions
@@ -157,8 +157,8 @@ public class ServerController : ControllerBase</code></pre>
<a id="EchoHub_Server_Controllers_ServerController__ctor_" data-uid="EchoHub.Server.Controllers.ServerController.#ctor*"></a>
<h3 id="EchoHub_Server_Controllers_ServerController__ctor_EchoHub_Server_Data_EchoHubDbContext_Microsoft_Extensions_Configuration_IConfiguration_" data-uid="EchoHub.Server.Controllers.ServerController.#ctor(EchoHub.Server.Data.EchoHubDbContext,Microsoft.Extensions.Configuration.IConfiguration)">
ServerController(EchoHubDbContext, IConfiguration)
<h3 id="EchoHub_Server_Controllers_ServerController__ctor_EchoHub_Server_Data_EchoHubDbContext_Microsoft_Extensions_Configuration_IConfiguration_EchoHub_Server_Services_DirectoryClaimStore_" data-uid="EchoHub.Server.Controllers.ServerController.#ctor(EchoHub.Server.Data.EchoHubDbContext,Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.DirectoryClaimStore)">
ServerController(EchoHubDbContext, IConfiguration, DirectoryClaimStore)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Controllers/ServerController.cs"><i class="bi bi-code-slash"></i></a>
</h3>
@@ -166,7 +166,7 @@ public class ServerController : ControllerBase</code></pre>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public ServerController(EchoHubDbContext db, IConfiguration config)</code></pre>
<pre><code class="lang-csharp hljs">public ServerController(EchoHubDbContext db, IConfiguration config, DirectoryClaimStore claimStore)</code></pre>
</div>
<h4 class="section">Parameters</h4>
@@ -175,6 +175,8 @@ public class ServerController : ControllerBase</code></pre>
<dd></dd>
<dt><code>config</code> <span class="xref">IConfiguration</span></dt>
<dd></dd>
<dt><code>claimStore</code> <a class="xref" href="EchoHub.Server.Services.DirectoryClaimStore.html">DirectoryClaimStore</a></dt>
<dd></dd>
</dl>
@@ -192,6 +194,42 @@ public class ServerController : ControllerBase</code></pre>
</h2>
<a id="EchoHub_Server_Controllers_ServerController_GetDirectoryStatus_" data-uid="EchoHub.Server.Controllers.ServerController.GetDirectoryStatus*"></a>
<h3 id="EchoHub_Server_Controllers_ServerController_GetDirectoryStatus" data-uid="EchoHub.Server.Controllers.ServerController.GetDirectoryStatus">
GetDirectoryStatus()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Controllers/ServerController.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Operator-facing view of the EchoHubSpace directory registration: ServerId for admin
support tickets, current registration state, and the last error/conflict if any.
Never exposes the claim token itself.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">[HttpGet(&quot;directory&quot;)]
[Authorize]
public Task&lt;IActionResult&gt; GetDirectoryStatus()</code></pre>
</div>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><span class="xref">Task</span>&lt;<span class="xref">IActionResult</span>&gt;</dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Controllers_ServerController_GetEncryptionKey_" data-uid="EchoHub.Server.Controllers.ServerController.GetEncryptionKey*"></a>
<h3 id="EchoHub_Server_Controllers_ServerController_GetEncryptionKey" data-uid="EchoHub.Server.Controllers.ServerController.GetEncryptionKey">
@@ -0,0 +1,492 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class DirectoryClaimStore | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class DirectoryClaimStore | EchoHub Documentation ">
<meta name="description" content="Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first registration and the row&#39;s stable ServerId. Also surfaces ephemeral registration status (success/failure code, conflicting hosts) for operator-facing endpoints. Persistence uses atomic write (tmp + rename). Treat the file contents as a secret.">
<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/new/master/apiSpec/new?filename=EchoHub_Server_Services_DirectoryClaimStore.md&amp;value=---%0Auid%3A%20EchoHub.Server.Services.DirectoryClaimStore%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">
<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="ManagedReference">
<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="EchoHub.Server.Services.DirectoryClaimStore">
<h1 id="EchoHub_Server_Services_DirectoryClaimStore" data-uid="EchoHub.Server.Services.DirectoryClaimStore" class="text-break">
Class DirectoryClaimStore <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="EchoHub.html">EchoHub</a>.<a class="xref" href="EchoHub.Server.html">Server</a>.<a class="xref" href="EchoHub.Server.Services.html">Services</a></dd></dl>
<dl><dt>Assembly</dt><dd>EchoHub.Server.dll</dd></dl>
</div>
<div class="markdown summary"><p>Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first
registration and the row's stable <code>ServerId</code>. Also surfaces ephemeral registration
status (success/failure code, conflicting hosts) for operator-facing endpoints.</p>
<p>Persistence uses atomic write (tmp + rename). Treat the file contents as a secret.</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public sealed class DirectoryClaimStore</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">DirectoryClaimStore</span></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
</dd></dl>
<h2 class="section" id="constructors">Constructors
</h2>
<a id="EchoHub_Server_Services_DirectoryClaimStore__ctor_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.#ctor*"></a>
<h3 id="EchoHub_Server_Services_DirectoryClaimStore__ctor_Microsoft_Extensions_Configuration_IConfiguration_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_DirectoryClaimStore__" data-uid="EchoHub.Server.Services.DirectoryClaimStore.#ctor(Microsoft.Extensions.Configuration.IConfiguration,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.DirectoryClaimStore})">
DirectoryClaimStore(IConfiguration, ILogger&lt;DirectoryClaimStore&gt;)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public DirectoryClaimStore(IConfiguration configuration, ILogger&lt;DirectoryClaimStore&gt; logger)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>configuration</code> <span class="xref">IConfiguration</span></dt>
<dd></dd>
<dt><code>logger</code> <span class="xref">ILogger</span>&lt;<a class="xref" href="EchoHub.Server.Services.DirectoryClaimStore.html">DirectoryClaimStore</a>&gt;</dt>
<dd></dd>
</dl>
<h2 class="section" id="properties">Properties
</h2>
<a id="EchoHub_Server_Services_DirectoryClaimStore_ClaimToken_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.ClaimToken*"></a>
<h3 id="EchoHub_Server_Services_DirectoryClaimStore_ClaimToken" data-uid="EchoHub.Server.Services.DirectoryClaimStore.ClaimToken">
ClaimToken
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public string? ClaimToken { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_DirectoryClaimStore_FilePath_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.FilePath*"></a>
<h3 id="EchoHub_Server_Services_DirectoryClaimStore_FilePath" data-uid="EchoHub.Server.Services.DirectoryClaimStore.FilePath">
FilePath
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public string FilePath { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_DirectoryClaimStore_ServerId_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.ServerId*"></a>
<h3 id="EchoHub_Server_Services_DirectoryClaimStore_ServerId" data-uid="EchoHub.Server.Services.DirectoryClaimStore.ServerId">
ServerId
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Guid? ServerId { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a>?</dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_DirectoryClaimStore_Status_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.Status*"></a>
<h3 id="EchoHub_Server_Services_DirectoryClaimStore_Status" data-uid="EchoHub.Server.Services.DirectoryClaimStore.Status">
Status
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public RegistrationStatus Status { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="EchoHub.Server.Services.RegistrationStatus.html">RegistrationStatus</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
<a id="EchoHub_Server_Services_DirectoryClaimStore_SaveClaimAsync_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync*"></a>
<h3 id="EchoHub_Server_Services_DirectoryClaimStore_SaveClaimAsync_System_String_System_Guid_System_Threading_CancellationToken_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync(System.String,System.Guid,System.Threading.CancellationToken)">
SaveClaimAsync(string, Guid, CancellationToken)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Persist a freshly-issued claim token alongside the server's stable ServerId.
Called exactly once per row's lifetime — on first claim. Atomic on-disk swap.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Task SaveClaimAsync(string claimToken, Guid serverId, CancellationToken ct = default)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>claimToken</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
<dt><code>serverId</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a></dt>
<dd></dd>
<dt><code>ct</code> <span class="xref">CancellationToken</span></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><span class="xref">Task</span></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_DirectoryClaimStore_SetFailure_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.SetFailure*"></a>
<h3 id="EchoHub_Server_Services_DirectoryClaimStore_SetFailure_System_String_System_String___" data-uid="EchoHub.Server.Services.DirectoryClaimStore.SetFailure(System.String,System.String[])">
SetFailure(string, string[]?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void SetFailure(string errorCode, string[]? conflictingHosts)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>errorCode</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
<dt><code>conflictingHosts</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>[]</dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_DirectoryClaimStore_SetSuccess_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.SetSuccess*"></a>
<h3 id="EchoHub_Server_Services_DirectoryClaimStore_SetSuccess_System_Guid_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.SetSuccess(System.Guid)">
SetSuccess(Guid)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void SetSuccess(Guid serverId)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>serverId</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_DirectoryClaimStore_UpdateServerIdAsync_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync*"></a>
<h3 id="EchoHub_Server_Services_DirectoryClaimStore_UpdateServerIdAsync_System_Guid_System_Threading_CancellationToken_" data-uid="EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync(System.Guid,System.Threading.CancellationToken)">
UpdateServerIdAsync(Guid, CancellationToken)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Update only the ServerId — used when re-registering with an existing token (Success path,
hub returns ServerId again but no fresh token). No-op if the value is unchanged.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Task UpdateServerIdAsync(Guid serverId, CancellationToken ct = default)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>serverId</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a></dt>
<dd></dd>
<dt><code>ct</code> <span class="xref">CancellationToken</span></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><span class="xref">Task</span></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs" class="edit-link">Edit this page</a>
</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></div></div>
</div>
</div>
</footer>
</body>
</html>
@@ -575,6 +575,41 @@ so the caller can broadcast departures and force-disconnect connections.</p>
<h2 class="section" id="events">Events
</h2>
<h3 id="EchoHub_Server_Services_PresenceTracker_UserCountChanged" data-uid="EchoHub.Server.Services.PresenceTracker.UserCountChanged">
UserCountChanged
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/PresenceTracker.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"><p>Raised when the distinct online user count changes (multi-connection users only fire once).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public event Action&lt;int&gt;? UserCountChanged</code></pre>
</div>
<h4 class="section">Event Type</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.action-1">Action</a>&lt;<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a>&gt;</dt>
<dd></dd>
</dl>
</article>
@@ -0,0 +1,629 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class RegistrationStatus | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class RegistrationStatus | 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/new/master/apiSpec/new?filename=EchoHub_Server_Services_RegistrationStatus.md&amp;value=---%0Auid%3A%20EchoHub.Server.Services.RegistrationStatus%0Asummary%3A%20&#39;*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax&#39;%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A">
<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="ManagedReference">
<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="EchoHub.Server.Services.RegistrationStatus">
<h1 id="EchoHub_Server_Services_RegistrationStatus" data-uid="EchoHub.Server.Services.RegistrationStatus" class="text-break">
Class RegistrationStatus <a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="EchoHub.html">EchoHub</a>.<a class="xref" href="EchoHub.Server.html">Server</a>.<a class="xref" href="EchoHub.Server.Services.html">Services</a></dd></dl>
<dl><dt>Assembly</dt><dd>EchoHub.Server.dll</dd></dl>
</div>
<div class="markdown summary"></div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public sealed record RegistrationStatus : IEquatable&lt;RegistrationStatus&gt;</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">RegistrationStatus</span></div>
</dd>
</dl>
<dl class="typelist implements">
<dt>Implements</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.iequatable-1">IEquatable</a>&lt;<a class="xref" href="EchoHub.Server.Services.RegistrationStatus.html">RegistrationStatus</a>&gt;</div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
</dd></dl>
<h2 class="section" id="constructors">Constructors
</h2>
<a id="EchoHub_Server_Services_RegistrationStatus__ctor_" data-uid="EchoHub.Server.Services.RegistrationStatus.#ctor*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus__ctor_System_Boolean_System_Nullable_System_Guid__System_Nullable_System_DateTimeOffset__System_String_System_String___" data-uid="EchoHub.Server.Services.RegistrationStatus.#ctor(System.Boolean,System.Nullable{System.Guid},System.Nullable{System.DateTimeOffset},System.String,System.String[])">
RegistrationStatus(bool, Guid?, DateTimeOffset?, string?, string[]?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public RegistrationStatus(bool IsRegistered, Guid? ServerId, DateTimeOffset? LastRegisteredAt, string? LastError, string[]? ConflictingHosts)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>IsRegistered</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
<dt><code>ServerId</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a>?</dt>
<dd></dd>
<dt><code>LastRegisteredAt</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.datetimeoffset">DateTimeOffset</a>?</dt>
<dd></dd>
<dt><code>LastError</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
<dt><code>ConflictingHosts</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>[]</dt>
<dd></dd>
</dl>
<h2 class="section" id="properties">Properties
</h2>
<a id="EchoHub_Server_Services_RegistrationStatus_ConflictingHosts_" data-uid="EchoHub.Server.Services.RegistrationStatus.ConflictingHosts*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_ConflictingHosts" data-uid="EchoHub.Server.Services.RegistrationStatus.ConflictingHosts">
ConflictingHosts
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public string[]? ConflictingHosts { get; init; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>[]</dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_RegistrationStatus_IsRegistered_" data-uid="EchoHub.Server.Services.RegistrationStatus.IsRegistered*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_IsRegistered" data-uid="EchoHub.Server.Services.RegistrationStatus.IsRegistered">
IsRegistered
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public bool IsRegistered { get; init; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_RegistrationStatus_LastError_" data-uid="EchoHub.Server.Services.RegistrationStatus.LastError*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_LastError" data-uid="EchoHub.Server.Services.RegistrationStatus.LastError">
LastError
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public string? LastError { get; init; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_RegistrationStatus_LastRegisteredAt_" data-uid="EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_LastRegisteredAt" data-uid="EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt">
LastRegisteredAt
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public DateTimeOffset? LastRegisteredAt { get; init; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.datetimeoffset">DateTimeOffset</a>?</dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_RegistrationStatus_ServerId_" data-uid="EchoHub.Server.Services.RegistrationStatus.ServerId*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_ServerId" data-uid="EchoHub.Server.Services.RegistrationStatus.ServerId">
ServerId
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public Guid? ServerId { get; init; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a>?</dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
<a id="EchoHub_Server_Services_RegistrationStatus_Deconstruct_" data-uid="EchoHub.Server.Services.RegistrationStatus.Deconstruct*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_Deconstruct_System_Boolean__System_Nullable_System_Guid___System_Nullable_System_DateTimeOffset___System_String__System_String____" data-uid="EchoHub.Server.Services.RegistrationStatus.Deconstruct(System.Boolean@,System.Nullable{System.Guid}@,System.Nullable{System.DateTimeOffset}@,System.String@,System.String[]@)">
Deconstruct(out bool, out Guid?, out DateTimeOffset?, out string?, out string[]?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void Deconstruct(out bool IsRegistered, out Guid? ServerId, out DateTimeOffset? LastRegisteredAt, out string? LastError, out string[]? ConflictingHosts)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>IsRegistered</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
<dt><code>ServerId</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.guid">Guid</a>?</dt>
<dd></dd>
<dt><code>LastRegisteredAt</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.datetimeoffset">DateTimeOffset</a>?</dt>
<dd></dd>
<dt><code>LastError</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
<dt><code>ConflictingHosts</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a>[]</dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_RegistrationStatus_Equals_" data-uid="EchoHub.Server.Services.RegistrationStatus.Equals*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_Equals_EchoHub_Server_Services_RegistrationStatus_" data-uid="EchoHub.Server.Services.RegistrationStatus.Equals(EchoHub.Server.Services.RegistrationStatus)">
Equals(RegistrationStatus?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public bool Equals(RegistrationStatus? other)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>other</code> <a class="xref" href="EchoHub.Server.Services.RegistrationStatus.html">RegistrationStatus</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_RegistrationStatus_Equals_" data-uid="EchoHub.Server.Services.RegistrationStatus.Equals*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_Equals_System_Object_" data-uid="EchoHub.Server.Services.RegistrationStatus.Equals(System.Object)">
Equals(object?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public override bool Equals(object? obj)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>obj</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_RegistrationStatus_GetHashCode_" data-uid="EchoHub.Server.Services.RegistrationStatus.GetHashCode*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_GetHashCode" data-uid="EchoHub.Server.Services.RegistrationStatus.GetHashCode">
GetHashCode()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public override int GetHashCode()</code></pre>
</div>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.int32">int</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_RegistrationStatus_ToString_" data-uid="EchoHub.Server.Services.RegistrationStatus.ToString*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_ToString" data-uid="EchoHub.Server.Services.RegistrationStatus.ToString">
ToString()
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public override string ToString()</code></pre>
</div>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="operators">Operators
</h2>
<a id="EchoHub_Server_Services_RegistrationStatus_op_Equality_" data-uid="EchoHub.Server.Services.RegistrationStatus.op_Equality*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_op_Equality_EchoHub_Server_Services_RegistrationStatus_EchoHub_Server_Services_RegistrationStatus_" data-uid="EchoHub.Server.Services.RegistrationStatus.op_Equality(EchoHub.Server.Services.RegistrationStatus,EchoHub.Server.Services.RegistrationStatus)">
operator ==(RegistrationStatus?, RegistrationStatus?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static bool operator ==(RegistrationStatus? left, RegistrationStatus? right)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>left</code> <a class="xref" href="EchoHub.Server.Services.RegistrationStatus.html">RegistrationStatus</a></dt>
<dd></dd>
<dt><code>right</code> <a class="xref" href="EchoHub.Server.Services.RegistrationStatus.html">RegistrationStatus</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
<a id="EchoHub_Server_Services_RegistrationStatus_op_Inequality_" data-uid="EchoHub.Server.Services.RegistrationStatus.op_Inequality*"></a>
<h3 id="EchoHub_Server_Services_RegistrationStatus_op_Inequality_EchoHub_Server_Services_RegistrationStatus_EchoHub_Server_Services_RegistrationStatus_" data-uid="EchoHub.Server.Services.RegistrationStatus.op_Inequality(EchoHub.Server.Services.RegistrationStatus,EchoHub.Server.Services.RegistrationStatus)">
operator !=(RegistrationStatus?, RegistrationStatus?)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs"><i class="bi bi-code-slash"></i></a>
</h3>
<div class="markdown level1 summary"></div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static bool operator !=(RegistrationStatus? left, RegistrationStatus? right)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>left</code> <a class="xref" href="EchoHub.Server.Services.RegistrationStatus.html">RegistrationStatus</a></dt>
<dd></dd>
<dt><code>right</code> <a class="xref" href="EchoHub.Server.Services.RegistrationStatus.html">RegistrationStatus</a></dt>
<dd></dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
<a href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/DirectoryClaimStore.cs" class="edit-link">Edit this page</a>
</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></div></div>
</div>
</div>
</footer>
</body>
</html>
@@ -158,8 +158,8 @@ Class ServerDirectoryService <a class="header-action link-secondary" title="Vie
<a id="EchoHub_Server_Services_ServerDirectoryService__ctor_" data-uid="EchoHub.Server.Services.ServerDirectoryService.#ctor*"></a>
<h3 id="EchoHub_Server_Services_ServerDirectoryService__ctor_Microsoft_Extensions_Configuration_IConfiguration_EchoHub_Server_Services_PresenceTracker_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_ServerDirectoryService__" data-uid="EchoHub.Server.Services.ServerDirectoryService.#ctor(Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.PresenceTracker,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ServerDirectoryService})">
ServerDirectoryService(IConfiguration, PresenceTracker, ILogger&lt;ServerDirectoryService&gt;)
<h3 id="EchoHub_Server_Services_ServerDirectoryService__ctor_Microsoft_Extensions_Configuration_IConfiguration_EchoHub_Server_Services_PresenceTracker_EchoHub_Server_Services_DirectoryClaimStore_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_ServerDirectoryService__" data-uid="EchoHub.Server.Services.ServerDirectoryService.#ctor(Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.PresenceTracker,EchoHub.Server.Services.DirectoryClaimStore,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ServerDirectoryService})">
ServerDirectoryService(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger&lt;ServerDirectoryService&gt;)
<a class="header-action link-secondary" title="View source" href="https://github.com/HueByte/EchoHub/blob/master/src/EchoHub.Server/Services/ServerDirectoryService.cs"><i class="bi bi-code-slash"></i></a>
</h3>
@@ -167,7 +167,7 @@ Class ServerDirectoryService <a class="header-action link-secondary" title="Vie
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public ServerDirectoryService(IConfiguration configuration, PresenceTracker presenceTracker, ILogger&lt;ServerDirectoryService&gt; logger)</code></pre>
<pre><code class="lang-csharp hljs">public ServerDirectoryService(IConfiguration configuration, PresenceTracker presenceTracker, DirectoryClaimStore claimStore, ILogger&lt;ServerDirectoryService&gt; logger)</code></pre>
</div>
<h4 class="section">Parameters</h4>
@@ -176,6 +176,8 @@ Class ServerDirectoryService <a class="header-action link-secondary" title="Vie
<dd></dd>
<dt><code>presenceTracker</code> <a class="xref" href="EchoHub.Server.Services.PresenceTracker.html">PresenceTracker</a></dt>
<dd></dd>
<dt><code>claimStore</code> <a class="xref" href="EchoHub.Server.Services.DirectoryClaimStore.html">DirectoryClaimStore</a></dt>
<dd></dd>
<dt><code>logger</code> <span class="xref">ILogger</span>&lt;<a class="xref" href="EchoHub.Server.Services.ServerDirectoryService.html">ServerDirectoryService</a>&gt;</dt>
<dd></dd>
</dl>
+12
View File
@@ -102,6 +102,14 @@ Classes
<dt><a class="xref" href="EchoHub.Server.Services.ChatService.html">ChatService</a></dt>
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Server.Services.DirectoryClaimStore.html">DirectoryClaimStore</a></dt>
<dd><p>Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first
registration and the row's stable <code>ServerId</code>. Also surfaces ephemeral registration
status (success/failure code, conflicting hosts) for operator-facing endpoints.</p>
<p>Persistence uses atomic write (tmp + rename). Treat the file contents as a secret.</p>
</dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Server.Services.FileCleanupService.html">FileCleanupService</a></dt>
<dd></dd>
@@ -135,6 +143,10 @@ Classes
<dt><a class="xref" href="EchoHub.Server.Services.PresenceTracker.html">PresenceTracker</a></dt>
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Server.Services.RegistrationStatus.html">RegistrationStatus</a></dt>
<dd></dd>
</dl>
<dl class="jumplist">
<dt><a class="xref" href="EchoHub.Server.Services.ServerDirectoryService.html">ServerDirectoryService</a></dt>
<dd></dd>
+6
View File
@@ -553,6 +553,9 @@
<li>
<a href="server/EchoHub.Server.Services.ChatService.html" name="" title="ChatService">ChatService</a>
</li>
<li>
<a href="server/EchoHub.Server.Services.DirectoryClaimStore.html" name="" title="DirectoryClaimStore">DirectoryClaimStore</a>
</li>
<li>
<a href="server/EchoHub.Server.Services.FileCleanupService.html" name="" title="FileCleanupService">FileCleanupService</a>
</li>
@@ -577,6 +580,9 @@
<li>
<a href="server/EchoHub.Server.Services.PresenceTracker.html" name="" title="PresenceTracker">PresenceTracker</a>
</li>
<li>
<a href="server/EchoHub.Server.Services.RegistrationStatus.html" name="" title="RegistrationStatus">RegistrationStatus</a>
</li>
<li>
<a href="server/EchoHub.Server.Services.ServerDirectoryService.html" name="" title="ServerDirectoryService">ServerDirectoryService</a>
</li>
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -95,7 +95,7 @@
<pre><code class="lang-bash">curl -sSfL https://raw.githubusercontent.com/HueByte/EchoHub/master/scripts/install.sh | sh
</code></pre>
<p>To install a specific version or to a custom directory:</p>
<pre><code class="lang-bash">curl -sSfL .../install.sh | sh -s -- --version 0.2.10
<pre><code class="lang-bash">curl -sSfL .../install.sh | sh -s -- --version 0.2.11
curl -sSfL .../install.sh | sh -s -- --install-dir /opt/echohub
</code></pre>
<h3 id="manual-download">Manual Download</h3>
+1
View File
@@ -90,6 +90,7 @@
<p>Release history for EchoHub.</p>
<h2 id="releases">Releases</h2>
<ul>
<li><a href="v0.2.11.html">v0.2.11</a> - EchoHubSpace Auth, Live Directory Updates &amp; Server Browser Metadata</li>
<li><a href="v0.2.10.html">v0.2.10</a> - Command Palette, Infinite History Scroll &amp; Auto-Updater Fixes</li>
<li><a href="v0.2.9.html">v0.2.9</a> - Install Script &amp; Chocolatey Fixes</li>
<li><a href="v0.2.8.html">v0.2.8</a> - Docker Support, IRC Account Creation &amp; BOM Fix</li>
+3
View File
@@ -15,6 +15,9 @@
<li>
<a href="index.html" name="" title="Overview">Overview</a>
</li>
<li>
<a href="v0.2.11.html" name="" title="v0.2.11">v0.2.11</a>
</li>
<li>
<a href="v0.2.10.html" name="" title="v0.2.10">v0.2.10</a>
</li>
+1 -1
View File
@@ -1,2 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"v0.2.10","href":"v0.2.10.html","topicHref":"v0.2.10.html"},{"name":"v0.2.9","href":"v0.2.9.html","topicHref":"v0.2.9.html"},{"name":"v0.2.8","href":"v0.2.8.html","topicHref":"v0.2.8.html"},{"name":"v0.2.7","href":"v0.2.7.html","topicHref":"v0.2.7.html"},{"name":"v0.2.6","href":"v0.2.6.html","topicHref":"v0.2.6.html"},{"name":"v0.2.5","href":"v0.2.5.html","topicHref":"v0.2.5.html"},{"name":"v0.2.4","href":"v0.2.4.html","topicHref":"v0.2.4.html"},{"name":"v0.2.3","href":"v0.2.3.html","topicHref":"v0.2.3.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"}]}
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"v0.2.11","href":"v0.2.11.html","topicHref":"v0.2.11.html"},{"name":"v0.2.10","href":"v0.2.10.html","topicHref":"v0.2.10.html"},{"name":"v0.2.9","href":"v0.2.9.html","topicHref":"v0.2.9.html"},{"name":"v0.2.8","href":"v0.2.8.html","topicHref":"v0.2.8.html"},{"name":"v0.2.7","href":"v0.2.7.html","topicHref":"v0.2.7.html"},{"name":"v0.2.6","href":"v0.2.6.html","topicHref":"v0.2.6.html"},{"name":"v0.2.5","href":"v0.2.5.html","topicHref":"v0.2.5.html"},{"name":"v0.2.4","href":"v0.2.4.html","topicHref":"v0.2.4.html"},{"name":"v0.2.3","href":"v0.2.3.html","topicHref":"v0.2.3.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"}]}
+137
View File
@@ -0,0 +1,137 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>v0.2.11 | EchoHub Documentation </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="v0.2.11 | 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="v0211">v0.2.11</h1>
<p>EchoHubSpace directory protocol overhaul: authenticated server registration with persistent claim tokens, near-real-time user-count updates, and richer server metadata (tags, multi-host, version). Coordinated cutover with the EchoHubSpace directory deploy.</p>
<h2 id="new-features">New Features</h2>
<ul>
<li>EchoHubSpace claim-token authentication — the directory issues a per-server claim token on first registration, persisted atomically alongside the SQLite database (chmod 0600 on Unix). Subsequent reconnects authenticate with the token instead of relying on raw hostname-squatting protection. Token survives both client and directory restarts; lost tokens require an admin-side <code>DELETE /api/servers/{id}</code> on the directory to recover</li>
<li>Server tags — public servers can advertise topic tags via the new <code>Server:Tags</code> config array, surfacing as filter facets in the EchoHubSpace browser</li>
<li>Multi-host advertisement — a single server can register multiple hostnames (e.g. apex domain, IPv6, alias domains) by listing them in <code>Server:PublicHosts</code>. All hosts route to the same directory row</li>
<li>Server version sent to directory — the EchoHubSpace browser shows what version each public server is running, pulled from the server's assembly informational version</li>
<li>Operator-facing <code>GET /api/server/directory</code> endpoint (Admin role required) — returns <code>ServerId</code>, <code>IsRegistered</code>, <code>LastRegisteredAt</code>, <code>LastError</code>, and any <code>ConflictingHosts</code> for support tickets. Never exposes the claim token itself, only a <code>HasClaimToken</code> boolean</li>
</ul>
<h2 id="refactoring">Refactoring</h2>
<ul>
<li>Replace 30s polling with event-driven directory updates — <code>PresenceTracker</code> now raises <code>UserCountChanged</code> only when the distinct user count actually changes (multi-tab/multi-connection users no longer trigger). <code>ServerDirectoryService</code> consumes via a single-slot <code>Channel&lt;int&gt;</code> (latest-wins coalesces bursts) with a 1-second min-interval throttle. Directory reflects user-count changes within ~1s instead of up to 30s stale</li>
<li>Wrap directory hub responses in a <code>Response&lt;T&gt;</code> envelope with <code>IsSuccess</code>/<code>Data</code>/<code>Errors</code>/<code>Version</code> shape — protocol version is pinned client-side (currently <code>1.0</code>); mismatches trigger a permanent-failure stop with operator-facing log</li>
<li>Stop attempting re-registration after permanent failures (<code>HostAlreadyClaimed</code>, <code>InvalidToken</code>, <code>HostConflict</code>, <code>InvalidInput</code>) — the directory no longer terminates the connection on these errors, so the client suppresses re-register on <code>Reconnected</code> to avoid tight retry loops. Operator must restart the server after fixing config</li>
</ul>
<h2 id="configuration">Configuration</h2>
<ul>
<li><strong>Breaking</strong>: <code>Server:PublicHost</code> (string) renamed to <code>Server:PublicHosts</code> (string array). Public servers must update <code>appsettings.json</code> — single-host deployments use a one-element array</li>
<li>New <code>Server:Tags</code> (string array) — defaults to empty</li>
<li>New optional <code>Server:DirectoryClaimPath</code> — overrides the path of the persisted claim file. Defaults to a <code>directory-claim.json</code> next to the SQLite database. Treat the file as a secret; back it up alongside the database</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></div></div>
</div>
</div>
</footer>
</body>
</html>
+21 -6
View File
@@ -657,7 +657,7 @@
"api/server/EchoHub.Server.Controllers.ServerController.html": {
"href": "api/server/EchoHub.Server.Controllers.ServerController.html",
"title": "Class ServerController | EchoHub Documentation",
"summary": "Class ServerController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/server\")] public class ServerController : ControllerBase Inheritance object ControllerBase ServerController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ServerController(EchoHubDbContext, IConfiguration) public ServerController(EchoHubDbContext db, IConfiguration config) Parameters db EchoHubDbContext config IConfiguration Methods GetEncryptionKey() [HttpGet(\"encryption-key\")] [Authorize] [EnableRateLimiting(\"auth\")] public IActionResult GetEncryptionKey() Returns IActionResult GetInfo() [HttpGet(\"info\")] public Task<IActionResult> GetInfo() Returns Task<IActionResult>"
"summary": "Class ServerController Namespace EchoHub.Server.Controllers Assembly EchoHub.Server.dll [ApiController] [Route(\"api/server\")] public class ServerController : ControllerBase Inheritance object ControllerBase ServerController Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ServerController(EchoHubDbContext, IConfiguration, DirectoryClaimStore) public ServerController(EchoHubDbContext db, IConfiguration config, DirectoryClaimStore claimStore) Parameters db EchoHubDbContext config IConfiguration claimStore DirectoryClaimStore Methods GetDirectoryStatus() Operator-facing view of the EchoHubSpace directory registration: ServerId for admin support tickets, current registration state, and the last error/conflict if any. Never exposes the claim token itself. [HttpGet(\"directory\")] [Authorize] public Task<IActionResult> GetDirectoryStatus() Returns Task<IActionResult> GetEncryptionKey() [HttpGet(\"encryption-key\")] [Authorize] [EnableRateLimiting(\"auth\")] public IActionResult GetEncryptionKey() Returns IActionResult GetInfo() [HttpGet(\"info\")] public Task<IActionResult> GetInfo() Returns Task<IActionResult>"
},
"api/server/EchoHub.Server.Controllers.UsersController.html": {
"href": "api/server/EchoHub.Server.Controllers.UsersController.html",
@@ -739,6 +739,11 @@
"title": "Class ChatService | EchoHub Documentation",
"summary": "Class ChatService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class ChatService : IChatService Inheritance object ChatService Implements IChatService Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ChatService(IServiceScopeFactory, PresenceTracker, IEnumerable<IChatBroadcaster>, LinkEmbedService, IMessageEncryptionService, IChannelService, ILogger<ChatService>) public ChatService(IServiceScopeFactory scopeFactory, PresenceTracker presenceTracker, IEnumerable<IChatBroadcaster> broadcasters, LinkEmbedService embedService, IMessageEncryptionService encryption, IChannelService channelService, ILogger<ChatService> logger) Parameters scopeFactory IServiceScopeFactory presenceTracker PresenceTracker broadcasters IEnumerable<IChatBroadcaster> embedService LinkEmbedService encryption IMessageEncryptionService channelService IChannelService logger ILogger<ChatService> Methods BroadcastChannelUpdatedAsync(ChannelDto, string?) public Task BroadcastChannelUpdatedAsync(ChannelDto channel, string? channelName = null) Parameters channel ChannelDto channelName string Returns Task BroadcastMessageAsync(string, MessageDto) public Task BroadcastMessageAsync(string channelName, MessageDto message) Parameters channelName string message MessageDto Returns Task GetChannelHistoryAsync(string, int, int) public Task<List<MessageDto>> GetChannelHistoryAsync(string channelName, int count, int offset = 0) Parameters channelName string count int offset int Returns Task<List<MessageDto>> GetChannelsForUserAsync(string) public Task<List<string>> GetChannelsForUserAsync(string username) Parameters username string Returns Task<List<string>> GetOnlineUsersAsync(string) public Task<List<UserPresenceDto>> GetOnlineUsersAsync(string channelName) Parameters channelName string Returns Task<List<UserPresenceDto>> JoinChannelAsync(string, Guid, string, string) public Task<(List<MessageDto> History, string? Error)> JoinChannelAsync(string connectionId, Guid userId, string username, string channelName) Parameters connectionId string userId Guid username string channelName string Returns Task<(List<MessageDto> History, string Error)> LeaveChannelAsync(string, string, string) public Task LeaveChannelAsync(string connectionId, string username, string channelName) Parameters connectionId string username string channelName string Returns Task SendMessageAsync(Guid, string, string, string) public Task<string?> SendMessageAsync(Guid userId, string username, string channelName, string content) Parameters userId Guid username string channelName string content string Returns Task<string> UpdateStatusAsync(Guid, string, UserStatus, string?) public Task<string?> UpdateStatusAsync(Guid userId, string username, UserStatus status, string? statusMessage) Parameters userId Guid username string status UserStatus statusMessage string Returns Task<string> UserConnectedAsync(string, Guid, string) public Task UserConnectedAsync(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string Returns Task UserDisconnectedAsync(string) public Task<string?> UserDisconnectedAsync(string connectionId) Parameters connectionId string Returns Task<string>"
},
"api/server/EchoHub.Server.Services.DirectoryClaimStore.html": {
"href": "api/server/EchoHub.Server.Services.DirectoryClaimStore.html",
"title": "Class DirectoryClaimStore | EchoHub Documentation",
"summary": "Class DirectoryClaimStore Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first registration and the row's stable ServerId. Also surfaces ephemeral registration status (success/failure code, conflicting hosts) for operator-facing endpoints. Persistence uses atomic write (tmp + rename). Treat the file contents as a secret. public sealed class DirectoryClaimStore Inheritance object DirectoryClaimStore Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors DirectoryClaimStore(IConfiguration, ILogger<DirectoryClaimStore>) public DirectoryClaimStore(IConfiguration configuration, ILogger<DirectoryClaimStore> logger) Parameters configuration IConfiguration logger ILogger<DirectoryClaimStore> Properties ClaimToken public string? ClaimToken { get; } Property Value string FilePath public string FilePath { get; } Property Value string ServerId public Guid? ServerId { get; } Property Value Guid? Status public RegistrationStatus Status { get; } Property Value RegistrationStatus Methods SaveClaimAsync(string, Guid, CancellationToken) Persist a freshly-issued claim token alongside the server's stable ServerId. Called exactly once per row's lifetime — on first claim. Atomic on-disk swap. public Task SaveClaimAsync(string claimToken, Guid serverId, CancellationToken ct = default) Parameters claimToken string serverId Guid ct CancellationToken Returns Task SetFailure(string, string[]?) public void SetFailure(string errorCode, string[]? conflictingHosts) Parameters errorCode string conflictingHosts string[] SetSuccess(Guid) public void SetSuccess(Guid serverId) Parameters serverId Guid UpdateServerIdAsync(Guid, CancellationToken) Update only the ServerId — used when re-registering with an existing token (Success path, hub returns ServerId again but no fresh token). No-op if the value is unchanged. public Task UpdateServerIdAsync(Guid serverId, CancellationToken ct = default) Parameters serverId Guid ct CancellationToken Returns Task"
},
"api/server/EchoHub.Server.Services.FileCleanupService.html": {
"href": "api/server/EchoHub.Server.Services.FileCleanupService.html",
"title": "Class FileCleanupService | EchoHub Documentation",
@@ -777,12 +782,17 @@
"api/server/EchoHub.Server.Services.PresenceTracker.html": {
"href": "api/server/EchoHub.Server.Services.PresenceTracker.html",
"title": "Class PresenceTracker | EchoHub Documentation",
"summary": "Class PresenceTracker Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class PresenceTracker Inheritance object PresenceTracker Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors PresenceTracker() public PresenceTracker() Methods ForceRemoveUser(string) Forcibly remove a user from all tracking. Returns their connection IDs and channels so the caller can broadcast departures and force-disconnect connections. public (List<string> ConnectionIds, List<string> Channels) ForceRemoveUser(string username) Parameters username string Returns (List<string> ConnectionIds, List<string> Channels) GetChannelsForUser(string) public List<string> GetChannelsForUser(string username) Parameters username string Returns List<string> GetConnectionsInChannels(List<string>) Get all unique connection IDs for users who share any of the given channels. public List<string> GetConnectionsInChannels(List<string> channels) Parameters channels List<string> Returns List<string> GetOnlineUserCount() public int GetOnlineUserCount() Returns int GetOnlineUsersInChannel(string) public List<string> GetOnlineUsersInChannel(string channelName) Parameters channelName string Returns List<string> GetUsernameForConnection(string) public string? GetUsernameForConnection(string connectionId) Parameters connectionId string Returns string IsOnline(string) public bool IsOnline(string username) Parameters username string Returns bool JoinChannel(string, string) Returns true if this is a new join, false if the user was already in the channel. public bool JoinChannel(string username, string channelName) Parameters username string channelName string Returns bool LeaveChannel(string, string) public void LeaveChannel(string username, string channelName) Parameters username string channelName string UserConnected(string, Guid, string) public void UserConnected(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string UserDisconnected(string) public string? UserDisconnected(string connectionId) Parameters connectionId string Returns string"
"summary": "Class PresenceTracker Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public class PresenceTracker Inheritance object PresenceTracker Inherited Members object.GetType() object.MemberwiseClone() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors PresenceTracker() public PresenceTracker() Methods ForceRemoveUser(string) Forcibly remove a user from all tracking. Returns their connection IDs and channels so the caller can broadcast departures and force-disconnect connections. public (List<string> ConnectionIds, List<string> Channels) ForceRemoveUser(string username) Parameters username string Returns (List<string> ConnectionIds, List<string> Channels) GetChannelsForUser(string) public List<string> GetChannelsForUser(string username) Parameters username string Returns List<string> GetConnectionsInChannels(List<string>) Get all unique connection IDs for users who share any of the given channels. public List<string> GetConnectionsInChannels(List<string> channels) Parameters channels List<string> Returns List<string> GetOnlineUserCount() public int GetOnlineUserCount() Returns int GetOnlineUsersInChannel(string) public List<string> GetOnlineUsersInChannel(string channelName) Parameters channelName string Returns List<string> GetUsernameForConnection(string) public string? GetUsernameForConnection(string connectionId) Parameters connectionId string Returns string IsOnline(string) public bool IsOnline(string username) Parameters username string Returns bool JoinChannel(string, string) Returns true if this is a new join, false if the user was already in the channel. public bool JoinChannel(string username, string channelName) Parameters username string channelName string Returns bool LeaveChannel(string, string) public void LeaveChannel(string username, string channelName) Parameters username string channelName string UserConnected(string, Guid, string) public void UserConnected(string connectionId, Guid userId, string username) Parameters connectionId string userId Guid username string UserDisconnected(string) public string? UserDisconnected(string connectionId) Parameters connectionId string Returns string Events UserCountChanged Raised when the distinct online user count changes (multi-connection users only fire once). public event Action<int>? UserCountChanged Event Type Action<int>"
},
"api/server/EchoHub.Server.Services.RegistrationStatus.html": {
"href": "api/server/EchoHub.Server.Services.RegistrationStatus.html",
"title": "Class RegistrationStatus | EchoHub Documentation",
"summary": "Class RegistrationStatus Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public sealed record RegistrationStatus : IEquatable<RegistrationStatus> Inheritance object RegistrationStatus Implements IEquatable<RegistrationStatus> Inherited Members object.GetType() object.Equals(object, object) object.ReferenceEquals(object, object) Constructors RegistrationStatus(bool, Guid?, DateTimeOffset?, string?, string[]?) public RegistrationStatus(bool IsRegistered, Guid? ServerId, DateTimeOffset? LastRegisteredAt, string? LastError, string[]? ConflictingHosts) Parameters IsRegistered bool ServerId Guid? LastRegisteredAt DateTimeOffset? LastError string ConflictingHosts string[] Properties ConflictingHosts public string[]? ConflictingHosts { get; init; } Property Value string[] IsRegistered public bool IsRegistered { get; init; } Property Value bool LastError public string? LastError { get; init; } Property Value string LastRegisteredAt public DateTimeOffset? LastRegisteredAt { get; init; } Property Value DateTimeOffset? ServerId public Guid? ServerId { get; init; } Property Value Guid? Methods Deconstruct(out bool, out Guid?, out DateTimeOffset?, out string?, out string[]?) public void Deconstruct(out bool IsRegistered, out Guid? ServerId, out DateTimeOffset? LastRegisteredAt, out string? LastError, out string[]? ConflictingHosts) Parameters IsRegistered bool ServerId Guid? LastRegisteredAt DateTimeOffset? LastError string ConflictingHosts string[] Equals(RegistrationStatus?) public bool Equals(RegistrationStatus? other) Parameters other RegistrationStatus Returns bool Equals(object?) public override bool Equals(object? obj) Parameters obj object Returns bool GetHashCode() public override int GetHashCode() Returns int ToString() public override string ToString() Returns string Operators operator ==(RegistrationStatus?, RegistrationStatus?) public static bool operator ==(RegistrationStatus? left, RegistrationStatus? right) Parameters left RegistrationStatus right RegistrationStatus Returns bool operator !=(RegistrationStatus?, RegistrationStatus?) public static bool operator !=(RegistrationStatus? left, RegistrationStatus? right) Parameters left RegistrationStatus right RegistrationStatus Returns bool"
},
"api/server/EchoHub.Server.Services.ServerDirectoryService.html": {
"href": "api/server/EchoHub.Server.Services.ServerDirectoryService.html",
"title": "Class ServerDirectoryService | EchoHub Documentation",
"summary": "Class ServerDirectoryService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public sealed class ServerDirectoryService : BackgroundService, IDisposable Inheritance object BackgroundService ServerDirectoryService Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ServerDirectoryService(IConfiguration, PresenceTracker, ILogger<ServerDirectoryService>) public ServerDirectoryService(IConfiguration configuration, PresenceTracker presenceTracker, ILogger<ServerDirectoryService> logger) Parameters configuration IConfiguration presenceTracker PresenceTracker logger ILogger<ServerDirectoryService> Methods ExecuteAsync(CancellationToken) protected override Task ExecuteAsync(CancellationToken stoppingToken) Parameters stoppingToken CancellationToken Returns Task StopAsync(CancellationToken) public override Task StopAsync(CancellationToken cancellationToken) Parameters cancellationToken CancellationToken Returns Task"
"summary": "Class ServerDirectoryService Namespace EchoHub.Server.Services Assembly EchoHub.Server.dll public sealed class ServerDirectoryService : BackgroundService, IDisposable Inheritance object BackgroundService ServerDirectoryService Implements IDisposable Inherited Members object.GetType() object.ToString() object.Equals(object) object.Equals(object, object) object.ReferenceEquals(object, object) object.GetHashCode() Constructors ServerDirectoryService(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger<ServerDirectoryService>) public ServerDirectoryService(IConfiguration configuration, PresenceTracker presenceTracker, DirectoryClaimStore claimStore, ILogger<ServerDirectoryService> logger) Parameters configuration IConfiguration presenceTracker PresenceTracker claimStore DirectoryClaimStore logger ILogger<ServerDirectoryService> Methods ExecuteAsync(CancellationToken) protected override Task ExecuteAsync(CancellationToken stoppingToken) Parameters stoppingToken CancellationToken Returns Task StopAsync(CancellationToken) public override Task StopAsync(CancellationToken cancellationToken) Parameters cancellationToken CancellationToken Returns Task"
},
"api/server/EchoHub.Server.Services.SignalRBroadcaster.html": {
"href": "api/server/EchoHub.Server.Services.SignalRBroadcaster.html",
@@ -797,7 +807,7 @@
"api/server/EchoHub.Server.Services.html": {
"href": "api/server/EchoHub.Server.Services.html",
"title": "Namespace EchoHub.Server.Services | EchoHub Documentation",
"summary": "Namespace EchoHub.Server.Services Classes ChannelService ChatService FileCleanupService FileStorageService FileValidationHelper ImageToAsciiService LinkEmbedService MessageEncryptionService MuteExpirationService Background service that periodically unmutes users whose timed mute has expired. PresenceTracker ServerDirectoryService SignalRBroadcaster UserService"
"summary": "Namespace EchoHub.Server.Services Classes ChannelService ChatService DirectoryClaimStore Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first registration and the row's stable ServerId. Also surfaces ephemeral registration status (success/failure code, conflicting hosts) for operator-facing endpoints. Persistence uses atomic write (tmp + rename). Treat the file contents as a secret. FileCleanupService FileStorageService FileValidationHelper ImageToAsciiService LinkEmbedService MessageEncryptionService MuteExpirationService Background service that periodically unmutes users whose timed mute has expired. PresenceTracker RegistrationStatus ServerDirectoryService SignalRBroadcaster UserService"
},
"api/server/EchoHub.Server.Setup.DataMigrationService.html": {
"href": "api/server/EchoHub.Server.Setup.DataMigrationService.html",
@@ -842,7 +852,7 @@
"articles/getting-started.html": {
"href": "articles/getting-started.html",
"title": "Getting Started | EchoHub Documentation",
"summary": "Getting Started Install the Client Windows (Chocolatey) choco install echohub Linux / macOS curl -sSfL https://raw.githubusercontent.com/HueByte/EchoHub/master/scripts/install.sh | sh To install a specific version or to a custom directory: curl -sSfL .../install.sh | sh -s -- --version 0.2.10 curl -sSfL .../install.sh | sh -s -- --install-dir /opt/echohub Manual Download Grab a self-contained binary from Releases -- no runtime needed. Host a Server Docker The quickest way to host a server: cp .env.example .env docker compose up -d See the Docker guide for configuration, pre-built images, and more. From Source dotnet run --project src/EchoHub.Server Requires .NET 10 SDK. On first run, the server automatically: Creates appsettings.json from the example config Generates a secure JWT secret Creates the SQLite database with a #general channel Usage After installing the client, run echohub (or dotnet run --project src/EchoHub.Client from source). Connect to a server, register an account, and start chatting. Connect via IRC Enable the IRC gateway in the server's appsettings.json: { \"Irc\": { \"Enabled\": true, \"Port\": 6667 } } Then connect with any standard IRC client: irssi -c localhost -p 6667 -w <password> -n <username> IRC users must have an existing EchoHub account. Authentication works via PASS/NICK/USER or SASL PLAIN. Messages flow bidirectionally between IRC and TUI clients. For TLS, set TlsEnabled: true, TlsPort: 6697, and provide a PKCS#12 certificate path. See the Architecture page for details on how the IRC gateway integrates with the chat service. Configuration Server configuration is in appsettings.json (auto-generated on first run). You can also use environment variables or command-line arguments to override settings. See the Configuration guide for the full reference and how it all works. Build from Source dotnet build src/EchoHub.slnx"
"summary": "Getting Started Install the Client Windows (Chocolatey) choco install echohub Linux / macOS curl -sSfL https://raw.githubusercontent.com/HueByte/EchoHub/master/scripts/install.sh | sh To install a specific version or to a custom directory: curl -sSfL .../install.sh | sh -s -- --version 0.2.11 curl -sSfL .../install.sh | sh -s -- --install-dir /opt/echohub Manual Download Grab a self-contained binary from Releases -- no runtime needed. Host a Server Docker The quickest way to host a server: cp .env.example .env docker compose up -d See the Docker guide for configuration, pre-built images, and more. From Source dotnet run --project src/EchoHub.Server Requires .NET 10 SDK. On first run, the server automatically: Creates appsettings.json from the example config Generates a secure JWT secret Creates the SQLite database with a #general channel Usage After installing the client, run echohub (or dotnet run --project src/EchoHub.Client from source). Connect to a server, register an account, and start chatting. Connect via IRC Enable the IRC gateway in the server's appsettings.json: { \"Irc\": { \"Enabled\": true, \"Port\": 6667 } } Then connect with any standard IRC client: irssi -c localhost -p 6667 -w <password> -n <username> IRC users must have an existing EchoHub account. Authentication works via PASS/NICK/USER or SASL PLAIN. Messages flow bidirectionally between IRC and TUI clients. For TLS, set TlsEnabled: true, TlsPort: 6697, and provide a PKCS#12 certificate path. See the Architecture page for details on how the IRC gateway integrates with the chat service. Configuration Server configuration is in appsettings.json (auto-generated on first run). You can also use environment variables or command-line arguments to override settings. See the Configuration guide for the full reference and how it all works. Build from Source dotnet build src/EchoHub.slnx"
},
"articles/notification-sounds.html": {
"href": "articles/notification-sounds.html",
@@ -852,7 +862,7 @@
"changelog/index.html": {
"href": "changelog/index.html",
"title": "Changelog | EchoHub Documentation",
"summary": "Changelog Release history for EchoHub. Releases v0.2.10 - Command Palette, Infinite History Scroll & Auto-Updater Fixes v0.2.9 - Install Script & Chocolatey Fixes v0.2.8 - Docker Support, IRC Account Creation & BOM Fix v0.2.7 - User List Fix & Terminal.Gui NuGet Migration v0.2.6 - Major Refactoring & Code Organization v0.2.5 - Session Persistence, Auto-Updates, Audio & Transparent Theme v0.2.4 - E2E Message Encryption v0.2.3 - Moderation, Embeds & UI Overhaul 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"
"summary": "Changelog Release history for EchoHub. Releases v0.2.11 - EchoHubSpace Auth, Live Directory Updates & Server Browser Metadata v0.2.10 - Command Palette, Infinite History Scroll & Auto-Updater Fixes v0.2.9 - Install Script & Chocolatey Fixes v0.2.8 - Docker Support, IRC Account Creation & BOM Fix v0.2.7 - User List Fix & Terminal.Gui NuGet Migration v0.2.6 - Major Refactoring & Code Organization v0.2.5 - Session Persistence, Auto-Updates, Audio & Transparent Theme v0.2.4 - E2E Message Encryption v0.2.3 - Moderation, Embeds & UI Overhaul 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": {
"href": "changelog/v0.1.0.html",
@@ -879,6 +889,11 @@
"title": "v0.2.10 | EchoHub Documentation",
"summary": "v0.2.10 Follow-up patch release for v0.2.9 addressing auto-updater regressions, adding a command palette, infinite-scroll message history, and input polish. New Features Command palette — press Ctrl+K from the message input (or anywhere in the main window) to open a searchable dialog for navigating channels and triggering app actions (connect, disconnect, logout, profile, status, create/delete channel, saved servers, toggle users panel, check for updates, quit). Fuzzy matches against both the label and the underlying key so typing ch surfaces channel actions alongside #channel entries Scroll-to-load message history — scrolling to the top of a channel now fetches the next batch of older messages in the background (previously only the most recent 100 messages were available). Duplicate messages are filtered by ID, a per-channel guard prevents concurrent fetches, and the scroll position is preserved after the prepend so your reading position doesn't jump Bug Fixes Fix update progress dialog freezing / not repainting — progress callbacks now run on the UI thread so the download and extraction percentage actually updates while an update is in progress Fix pre-update backup failing when a Serilog-held log file is locked — UpdateBackupService now enumerates files manually, skips the logs/ directory and .log files, and logs-and-continues on IOException/UnauthorizedAccessException instead of aborting the whole backup Simplify update progress dispatch — remove redundant Application.Invoke wrappers around progress updates that are already called from the UI thread (introduced while fixing the freeze above) Fix cursor position being reset to the start of the line when auto-completing commands in the CLI app — insertion point is now moved to the end of the completed text Fix notification sounds crashing or being silently dropped when several arrive in quick succession — playback is now serialized through a semaphore that's held for the duration of each sound (using PlaybackFinished with a 10s safety timeout) and always released in finally, so back-to-back notifications queue up and play in order instead of racing the underlying audio player (fixes #20) Fix client crashing on startup with No Serilog:Using configuration section is defined under single-file publish — pass ConfigurationReaderOptions with the Serilog.Sinks.File assembly explicitly so Serilog can resolve sinks without scanning the filesystem for .dlls (which don't exist in a bundled exe) Refactoring Move search-dialog dispatch out of MainWindow into AppOrchestrator — MainWindow now just raises OnSearchRequested, keeping the view dumb and letting the orchestrator own navigation/action routing ChatHub.GetChannelHistory and IChatService.GetChannelHistoryAsync gain an additional offset parameter for paginated history loading (defaults to 0 — existing callers are unaffected) ValidationConstants.MaxHistoryCount raised from 100 to 200 so power users and paginated fetches can request larger batches; DefaultHistoryCount stays at 100"
},
"changelog/v0.2.11.html": {
"href": "changelog/v0.2.11.html",
"title": "v0.2.11 | EchoHub Documentation",
"summary": "v0.2.11 EchoHubSpace directory protocol overhaul: authenticated server registration with persistent claim tokens, near-real-time user-count updates, and richer server metadata (tags, multi-host, version). Coordinated cutover with the EchoHubSpace directory deploy. New Features EchoHubSpace claim-token authentication — the directory issues a per-server claim token on first registration, persisted atomically alongside the SQLite database (chmod 0600 on Unix). Subsequent reconnects authenticate with the token instead of relying on raw hostname-squatting protection. Token survives both client and directory restarts; lost tokens require an admin-side DELETE /api/servers/{id} on the directory to recover Server tags — public servers can advertise topic tags via the new Server:Tags config array, surfacing as filter facets in the EchoHubSpace browser Multi-host advertisement — a single server can register multiple hostnames (e.g. apex domain, IPv6, alias domains) by listing them in Server:PublicHosts. All hosts route to the same directory row Server version sent to directory — the EchoHubSpace browser shows what version each public server is running, pulled from the server's assembly informational version Operator-facing GET /api/server/directory endpoint (Admin role required) — returns ServerId, IsRegistered, LastRegisteredAt, LastError, and any ConflictingHosts for support tickets. Never exposes the claim token itself, only a HasClaimToken boolean Refactoring Replace 30s polling with event-driven directory updates — PresenceTracker now raises UserCountChanged only when the distinct user count actually changes (multi-tab/multi-connection users no longer trigger). ServerDirectoryService consumes via a single-slot Channel<int> (latest-wins coalesces bursts) with a 1-second min-interval throttle. Directory reflects user-count changes within ~1s instead of up to 30s stale Wrap directory hub responses in a Response<T> envelope with IsSuccess/Data/Errors/Version shape — protocol version is pinned client-side (currently 1.0); mismatches trigger a permanent-failure stop with operator-facing log Stop attempting re-registration after permanent failures (HostAlreadyClaimed, InvalidToken, HostConflict, InvalidInput) — the directory no longer terminates the connection on these errors, so the client suppresses re-register on Reconnected to avoid tight retry loops. Operator must restart the server after fixing config Configuration Breaking: Server:PublicHost (string) renamed to Server:PublicHosts (string array). Public servers must update appsettings.json — single-host deployments use a one-element array New Server:Tags (string array) — defaults to empty New optional Server:DirectoryClaimPath — overrides the path of the persisted claim file. Defaults to a directory-claim.json next to the SQLite database. Treat the file as a secret; back it up alongside the database"
},
"changelog/v0.2.2.html": {
"href": "changelog/v0.2.2.html",
"title": "v0.2.2 - Startup & Shutdown Fixes | EchoHub Documentation",
+38
View File
@@ -2026,6 +2026,20 @@
"Title": "EchoHub.Server.Services.ChatService",
"Summary": null
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/server/EchoHub.Server.Services.DirectoryClaimStore.yml",
"output": {
".html": {
"relative_path": "api/server/EchoHub.Server.Services.DirectoryClaimStore.html"
}
},
"version": "",
"Uid": null,
"IsMRef": true,
"Title": "EchoHub.Server.Services.DirectoryClaimStore",
"Summary": "<p sourcefile=\"_api_meta/server/EchoHub.Server.Services.DirectoryClaimStore.yml\" sourcestartlinenumber=\"1\">Persists and exposes the EchoHubSpace directory claim — the opaque token issued on first\nregistration and the row's stable <code>ServerId</code>. Also surfaces ephemeral registration\nstatus (success/failure code, conflicting hosts) for operator-facing endpoints.</p>\n<p sourcefile=\"_api_meta/server/EchoHub.Server.Services.DirectoryClaimStore.yml\" sourcestartlinenumber=\"5\">Persistence uses atomic write (tmp + rename). Treat the file contents as a secret.</p>\n"
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/server/EchoHub.Server.Services.FileCleanupService.yml",
@@ -2138,6 +2152,20 @@
"Title": "EchoHub.Server.Services.PresenceTracker",
"Summary": null
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/server/EchoHub.Server.Services.RegistrationStatus.yml",
"output": {
".html": {
"relative_path": "api/server/EchoHub.Server.Services.RegistrationStatus.html"
}
},
"version": "",
"Uid": null,
"IsMRef": true,
"Title": "EchoHub.Server.Services.RegistrationStatus",
"Summary": null
},
{
"type": "ManagedReference",
"source_relative_path": "_api_meta/server/EchoHub.Server.Services.ServerDirectoryService.yml",
@@ -2488,6 +2516,16 @@
},
"version": ""
},
{
"type": "Conceptual",
"source_relative_path": "changelog/v0.2.11.md",
"output": {
".html": {
"relative_path": "changelog/v0.2.11.html"
}
},
"version": ""
},
{
"type": "Conceptual",
"source_relative_path": "changelog/v0.2.2.md",
+345 -18
View File
@@ -14290,15 +14290,15 @@ references:
commentId: T:EchoHub.Server.Controllers.ServerController
fullName: EchoHub.Server.Controllers.ServerController
nameWithType: ServerController
- uid: EchoHub.Server.Controllers.ServerController.#ctor(EchoHub.Server.Data.EchoHubDbContext,Microsoft.Extensions.Configuration.IConfiguration)
name: ServerController(EchoHubDbContext, IConfiguration)
href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController__ctor_EchoHub_Server_Data_EchoHubDbContext_Microsoft_Extensions_Configuration_IConfiguration_
commentId: M:EchoHub.Server.Controllers.ServerController.#ctor(EchoHub.Server.Data.EchoHubDbContext,Microsoft.Extensions.Configuration.IConfiguration)
name.vb: New(EchoHubDbContext, IConfiguration)
fullName: EchoHub.Server.Controllers.ServerController.ServerController(EchoHub.Server.Data.EchoHubDbContext, Microsoft.Extensions.Configuration.IConfiguration)
fullName.vb: EchoHub.Server.Controllers.ServerController.New(EchoHub.Server.Data.EchoHubDbContext, Microsoft.Extensions.Configuration.IConfiguration)
nameWithType: ServerController.ServerController(EchoHubDbContext, IConfiguration)
nameWithType.vb: ServerController.New(EchoHubDbContext, IConfiguration)
- uid: EchoHub.Server.Controllers.ServerController.#ctor(EchoHub.Server.Data.EchoHubDbContext,Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.DirectoryClaimStore)
name: ServerController(EchoHubDbContext, IConfiguration, DirectoryClaimStore)
href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController__ctor_EchoHub_Server_Data_EchoHubDbContext_Microsoft_Extensions_Configuration_IConfiguration_EchoHub_Server_Services_DirectoryClaimStore_
commentId: M:EchoHub.Server.Controllers.ServerController.#ctor(EchoHub.Server.Data.EchoHubDbContext,Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.DirectoryClaimStore)
name.vb: New(EchoHubDbContext, IConfiguration, DirectoryClaimStore)
fullName: EchoHub.Server.Controllers.ServerController.ServerController(EchoHub.Server.Data.EchoHubDbContext, Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.DirectoryClaimStore)
fullName.vb: EchoHub.Server.Controllers.ServerController.New(EchoHub.Server.Data.EchoHubDbContext, Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.DirectoryClaimStore)
nameWithType: ServerController.ServerController(EchoHubDbContext, IConfiguration, DirectoryClaimStore)
nameWithType.vb: ServerController.New(EchoHubDbContext, IConfiguration, DirectoryClaimStore)
- uid: EchoHub.Server.Controllers.ServerController.#ctor*
name: ServerController
href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController__ctor_
@@ -14308,6 +14308,18 @@ references:
fullName.vb: EchoHub.Server.Controllers.ServerController.New
nameWithType: ServerController.ServerController
nameWithType.vb: ServerController.New
- uid: EchoHub.Server.Controllers.ServerController.GetDirectoryStatus
name: GetDirectoryStatus()
href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController_GetDirectoryStatus
commentId: M:EchoHub.Server.Controllers.ServerController.GetDirectoryStatus
fullName: EchoHub.Server.Controllers.ServerController.GetDirectoryStatus()
nameWithType: ServerController.GetDirectoryStatus()
- uid: EchoHub.Server.Controllers.ServerController.GetDirectoryStatus*
name: GetDirectoryStatus
href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController_GetDirectoryStatus_
commentId: Overload:EchoHub.Server.Controllers.ServerController.GetDirectoryStatus
fullName: EchoHub.Server.Controllers.ServerController.GetDirectoryStatus
nameWithType: ServerController.GetDirectoryStatus
- uid: EchoHub.Server.Controllers.ServerController.GetEncryptionKey
name: GetEncryptionKey()
href: api/server/EchoHub.Server.Controllers.ServerController.html#EchoHub_Server_Controllers_ServerController_GetEncryptionKey
@@ -16579,6 +16591,132 @@ references:
commentId: Overload:EchoHub.Server.Services.ChatService.UserDisconnectedAsync
fullName: EchoHub.Server.Services.ChatService.UserDisconnectedAsync
nameWithType: ChatService.UserDisconnectedAsync
- uid: EchoHub.Server.Services.DirectoryClaimStore
name: DirectoryClaimStore
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html
commentId: T:EchoHub.Server.Services.DirectoryClaimStore
fullName: EchoHub.Server.Services.DirectoryClaimStore
nameWithType: DirectoryClaimStore
- uid: EchoHub.Server.Services.DirectoryClaimStore.#ctor(Microsoft.Extensions.Configuration.IConfiguration,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.DirectoryClaimStore})
name: DirectoryClaimStore(IConfiguration, ILogger<DirectoryClaimStore>)
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore__ctor_Microsoft_Extensions_Configuration_IConfiguration_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_DirectoryClaimStore__
commentId: M:EchoHub.Server.Services.DirectoryClaimStore.#ctor(Microsoft.Extensions.Configuration.IConfiguration,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.DirectoryClaimStore})
name.vb: New(IConfiguration, ILogger(Of DirectoryClaimStore))
fullName: EchoHub.Server.Services.DirectoryClaimStore.DirectoryClaimStore(Microsoft.Extensions.Configuration.IConfiguration, Microsoft.Extensions.Logging.ILogger<EchoHub.Server.Services.DirectoryClaimStore>)
fullName.vb: EchoHub.Server.Services.DirectoryClaimStore.New(Microsoft.Extensions.Configuration.IConfiguration, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Services.DirectoryClaimStore))
nameWithType: DirectoryClaimStore.DirectoryClaimStore(IConfiguration, ILogger<DirectoryClaimStore>)
nameWithType.vb: DirectoryClaimStore.New(IConfiguration, ILogger(Of DirectoryClaimStore))
- uid: EchoHub.Server.Services.DirectoryClaimStore.#ctor*
name: DirectoryClaimStore
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore__ctor_
commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.#ctor
name.vb: New
fullName: EchoHub.Server.Services.DirectoryClaimStore.DirectoryClaimStore
fullName.vb: EchoHub.Server.Services.DirectoryClaimStore.New
nameWithType: DirectoryClaimStore.DirectoryClaimStore
nameWithType.vb: DirectoryClaimStore.New
- uid: EchoHub.Server.Services.DirectoryClaimStore.ClaimToken
name: ClaimToken
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_ClaimToken
commentId: P:EchoHub.Server.Services.DirectoryClaimStore.ClaimToken
fullName: EchoHub.Server.Services.DirectoryClaimStore.ClaimToken
nameWithType: DirectoryClaimStore.ClaimToken
- uid: EchoHub.Server.Services.DirectoryClaimStore.ClaimToken*
name: ClaimToken
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_ClaimToken_
commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.ClaimToken
fullName: EchoHub.Server.Services.DirectoryClaimStore.ClaimToken
nameWithType: DirectoryClaimStore.ClaimToken
- uid: EchoHub.Server.Services.DirectoryClaimStore.FilePath
name: FilePath
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_FilePath
commentId: P:EchoHub.Server.Services.DirectoryClaimStore.FilePath
fullName: EchoHub.Server.Services.DirectoryClaimStore.FilePath
nameWithType: DirectoryClaimStore.FilePath
- uid: EchoHub.Server.Services.DirectoryClaimStore.FilePath*
name: FilePath
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_FilePath_
commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.FilePath
fullName: EchoHub.Server.Services.DirectoryClaimStore.FilePath
nameWithType: DirectoryClaimStore.FilePath
- uid: EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync(System.String,System.Guid,System.Threading.CancellationToken)
name: SaveClaimAsync(string, Guid, CancellationToken)
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SaveClaimAsync_System_String_System_Guid_System_Threading_CancellationToken_
commentId: M:EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync(System.String,System.Guid,System.Threading.CancellationToken)
name.vb: SaveClaimAsync(String, Guid, CancellationToken)
fullName: EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync(string, System.Guid, System.Threading.CancellationToken)
fullName.vb: EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync(String, System.Guid, System.Threading.CancellationToken)
nameWithType: DirectoryClaimStore.SaveClaimAsync(string, Guid, CancellationToken)
nameWithType.vb: DirectoryClaimStore.SaveClaimAsync(String, Guid, CancellationToken)
- uid: EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync*
name: SaveClaimAsync
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SaveClaimAsync_
commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync
fullName: EchoHub.Server.Services.DirectoryClaimStore.SaveClaimAsync
nameWithType: DirectoryClaimStore.SaveClaimAsync
- uid: EchoHub.Server.Services.DirectoryClaimStore.ServerId
name: ServerId
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_ServerId
commentId: P:EchoHub.Server.Services.DirectoryClaimStore.ServerId
fullName: EchoHub.Server.Services.DirectoryClaimStore.ServerId
nameWithType: DirectoryClaimStore.ServerId
- uid: EchoHub.Server.Services.DirectoryClaimStore.ServerId*
name: ServerId
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_ServerId_
commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.ServerId
fullName: EchoHub.Server.Services.DirectoryClaimStore.ServerId
nameWithType: DirectoryClaimStore.ServerId
- uid: EchoHub.Server.Services.DirectoryClaimStore.SetFailure(System.String,System.String[])
name: SetFailure(string, string[]?)
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SetFailure_System_String_System_String___
commentId: M:EchoHub.Server.Services.DirectoryClaimStore.SetFailure(System.String,System.String[])
name.vb: SetFailure(String, String())
fullName: EchoHub.Server.Services.DirectoryClaimStore.SetFailure(string, string[]?)
fullName.vb: EchoHub.Server.Services.DirectoryClaimStore.SetFailure(String, String())
nameWithType: DirectoryClaimStore.SetFailure(string, string[]?)
nameWithType.vb: DirectoryClaimStore.SetFailure(String, String())
- uid: EchoHub.Server.Services.DirectoryClaimStore.SetFailure*
name: SetFailure
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SetFailure_
commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.SetFailure
fullName: EchoHub.Server.Services.DirectoryClaimStore.SetFailure
nameWithType: DirectoryClaimStore.SetFailure
- uid: EchoHub.Server.Services.DirectoryClaimStore.SetSuccess(System.Guid)
name: SetSuccess(Guid)
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SetSuccess_System_Guid_
commentId: M:EchoHub.Server.Services.DirectoryClaimStore.SetSuccess(System.Guid)
fullName: EchoHub.Server.Services.DirectoryClaimStore.SetSuccess(System.Guid)
nameWithType: DirectoryClaimStore.SetSuccess(Guid)
- uid: EchoHub.Server.Services.DirectoryClaimStore.SetSuccess*
name: SetSuccess
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_SetSuccess_
commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.SetSuccess
fullName: EchoHub.Server.Services.DirectoryClaimStore.SetSuccess
nameWithType: DirectoryClaimStore.SetSuccess
- uid: EchoHub.Server.Services.DirectoryClaimStore.Status
name: Status
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_Status
commentId: P:EchoHub.Server.Services.DirectoryClaimStore.Status
fullName: EchoHub.Server.Services.DirectoryClaimStore.Status
nameWithType: DirectoryClaimStore.Status
- uid: EchoHub.Server.Services.DirectoryClaimStore.Status*
name: Status
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_Status_
commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.Status
fullName: EchoHub.Server.Services.DirectoryClaimStore.Status
nameWithType: DirectoryClaimStore.Status
- uid: EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync(System.Guid,System.Threading.CancellationToken)
name: UpdateServerIdAsync(Guid, CancellationToken)
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_UpdateServerIdAsync_System_Guid_System_Threading_CancellationToken_
commentId: M:EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync(System.Guid,System.Threading.CancellationToken)
fullName: EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync(System.Guid, System.Threading.CancellationToken)
nameWithType: DirectoryClaimStore.UpdateServerIdAsync(Guid, CancellationToken)
- uid: EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync*
name: UpdateServerIdAsync
href: api/server/EchoHub.Server.Services.DirectoryClaimStore.html#EchoHub_Server_Services_DirectoryClaimStore_UpdateServerIdAsync_
commentId: Overload:EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync
fullName: EchoHub.Server.Services.DirectoryClaimStore.UpdateServerIdAsync
nameWithType: DirectoryClaimStore.UpdateServerIdAsync
- uid: EchoHub.Server.Services.FileCleanupService
name: FileCleanupService
href: api/server/EchoHub.Server.Services.FileCleanupService.html
@@ -17113,6 +17251,12 @@ references:
commentId: Overload:EchoHub.Server.Services.PresenceTracker.UserConnected
fullName: EchoHub.Server.Services.PresenceTracker.UserConnected
nameWithType: PresenceTracker.UserConnected
- uid: EchoHub.Server.Services.PresenceTracker.UserCountChanged
name: UserCountChanged
href: api/server/EchoHub.Server.Services.PresenceTracker.html#EchoHub_Server_Services_PresenceTracker_UserCountChanged
commentId: E:EchoHub.Server.Services.PresenceTracker.UserCountChanged
fullName: EchoHub.Server.Services.PresenceTracker.UserCountChanged
nameWithType: PresenceTracker.UserCountChanged
- uid: EchoHub.Server.Services.PresenceTracker.UserDisconnected(System.String)
name: UserDisconnected(string)
href: api/server/EchoHub.Server.Services.PresenceTracker.html#EchoHub_Server_Services_PresenceTracker_UserDisconnected_System_String_
@@ -17128,21 +17272,204 @@ references:
commentId: Overload:EchoHub.Server.Services.PresenceTracker.UserDisconnected
fullName: EchoHub.Server.Services.PresenceTracker.UserDisconnected
nameWithType: PresenceTracker.UserDisconnected
- uid: EchoHub.Server.Services.RegistrationStatus
name: RegistrationStatus
href: api/server/EchoHub.Server.Services.RegistrationStatus.html
commentId: T:EchoHub.Server.Services.RegistrationStatus
fullName: EchoHub.Server.Services.RegistrationStatus
nameWithType: RegistrationStatus
- uid: EchoHub.Server.Services.RegistrationStatus.#ctor(System.Boolean,System.Nullable{System.Guid},System.Nullable{System.DateTimeOffset},System.String,System.String[])
name: RegistrationStatus(bool, Guid?, DateTimeOffset?, string?, string[]?)
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus__ctor_System_Boolean_System_Nullable_System_Guid__System_Nullable_System_DateTimeOffset__System_String_System_String___
commentId: M:EchoHub.Server.Services.RegistrationStatus.#ctor(System.Boolean,System.Nullable{System.Guid},System.Nullable{System.DateTimeOffset},System.String,System.String[])
name.vb: New(Boolean, Guid?, DateTimeOffset?, String, String())
fullName: EchoHub.Server.Services.RegistrationStatus.RegistrationStatus(bool, System.Guid?, System.DateTimeOffset?, string?, string[]?)
fullName.vb: EchoHub.Server.Services.RegistrationStatus.New(Boolean, System.Guid?, System.DateTimeOffset?, String, String())
nameWithType: RegistrationStatus.RegistrationStatus(bool, Guid?, DateTimeOffset?, string?, string[]?)
nameWithType.vb: RegistrationStatus.New(Boolean, Guid?, DateTimeOffset?, String, String())
- uid: EchoHub.Server.Services.RegistrationStatus.#ctor*
name: RegistrationStatus
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus__ctor_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.#ctor
name.vb: New
fullName: EchoHub.Server.Services.RegistrationStatus.RegistrationStatus
fullName.vb: EchoHub.Server.Services.RegistrationStatus.New
nameWithType: RegistrationStatus.RegistrationStatus
nameWithType.vb: RegistrationStatus.New
- uid: EchoHub.Server.Services.RegistrationStatus.ConflictingHosts
name: ConflictingHosts
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ConflictingHosts
commentId: P:EchoHub.Server.Services.RegistrationStatus.ConflictingHosts
fullName: EchoHub.Server.Services.RegistrationStatus.ConflictingHosts
nameWithType: RegistrationStatus.ConflictingHosts
- uid: EchoHub.Server.Services.RegistrationStatus.ConflictingHosts*
name: ConflictingHosts
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ConflictingHosts_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.ConflictingHosts
fullName: EchoHub.Server.Services.RegistrationStatus.ConflictingHosts
nameWithType: RegistrationStatus.ConflictingHosts
- uid: EchoHub.Server.Services.RegistrationStatus.Deconstruct(System.Boolean@,System.Nullable{System.Guid}@,System.Nullable{System.DateTimeOffset}@,System.String@,System.String[]@)
name: Deconstruct(out bool, out Guid?, out DateTimeOffset?, out string?, out string[]?)
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_Deconstruct_System_Boolean__System_Nullable_System_Guid___System_Nullable_System_DateTimeOffset___System_String__System_String____
commentId: M:EchoHub.Server.Services.RegistrationStatus.Deconstruct(System.Boolean@,System.Nullable{System.Guid}@,System.Nullable{System.DateTimeOffset}@,System.String@,System.String[]@)
name.vb: Deconstruct(Boolean, Guid?, DateTimeOffset?, String, String())
fullName: EchoHub.Server.Services.RegistrationStatus.Deconstruct(out bool, out System.Guid?, out System.DateTimeOffset?, out string?, out string[]?)
fullName.vb: EchoHub.Server.Services.RegistrationStatus.Deconstruct(Boolean, System.Guid?, System.DateTimeOffset?, String, String())
nameWithType: RegistrationStatus.Deconstruct(out bool, out Guid?, out DateTimeOffset?, out string?, out string[]?)
nameWithType.vb: RegistrationStatus.Deconstruct(Boolean, Guid?, DateTimeOffset?, String, String())
- uid: EchoHub.Server.Services.RegistrationStatus.Deconstruct*
name: Deconstruct
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_Deconstruct_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.Deconstruct
fullName: EchoHub.Server.Services.RegistrationStatus.Deconstruct
nameWithType: RegistrationStatus.Deconstruct
- uid: EchoHub.Server.Services.RegistrationStatus.Equals(EchoHub.Server.Services.RegistrationStatus)
name: Equals(RegistrationStatus?)
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_Equals_EchoHub_Server_Services_RegistrationStatus_
commentId: M:EchoHub.Server.Services.RegistrationStatus.Equals(EchoHub.Server.Services.RegistrationStatus)
name.vb: Equals(RegistrationStatus)
fullName: EchoHub.Server.Services.RegistrationStatus.Equals(EchoHub.Server.Services.RegistrationStatus?)
fullName.vb: EchoHub.Server.Services.RegistrationStatus.Equals(EchoHub.Server.Services.RegistrationStatus)
nameWithType: RegistrationStatus.Equals(RegistrationStatus?)
nameWithType.vb: RegistrationStatus.Equals(RegistrationStatus)
- uid: EchoHub.Server.Services.RegistrationStatus.Equals(System.Object)
name: Equals(object?)
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_Equals_System_Object_
commentId: M:EchoHub.Server.Services.RegistrationStatus.Equals(System.Object)
name.vb: Equals(Object)
fullName: EchoHub.Server.Services.RegistrationStatus.Equals(object?)
fullName.vb: EchoHub.Server.Services.RegistrationStatus.Equals(Object)
nameWithType: RegistrationStatus.Equals(object?)
nameWithType.vb: RegistrationStatus.Equals(Object)
- uid: EchoHub.Server.Services.RegistrationStatus.Equals*
name: Equals
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_Equals_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.Equals
fullName: EchoHub.Server.Services.RegistrationStatus.Equals
nameWithType: RegistrationStatus.Equals
- uid: EchoHub.Server.Services.RegistrationStatus.GetHashCode
name: GetHashCode()
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_GetHashCode
commentId: M:EchoHub.Server.Services.RegistrationStatus.GetHashCode
fullName: EchoHub.Server.Services.RegistrationStatus.GetHashCode()
nameWithType: RegistrationStatus.GetHashCode()
- uid: EchoHub.Server.Services.RegistrationStatus.GetHashCode*
name: GetHashCode
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_GetHashCode_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.GetHashCode
fullName: EchoHub.Server.Services.RegistrationStatus.GetHashCode
nameWithType: RegistrationStatus.GetHashCode
- uid: EchoHub.Server.Services.RegistrationStatus.IsRegistered
name: IsRegistered
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_IsRegistered
commentId: P:EchoHub.Server.Services.RegistrationStatus.IsRegistered
fullName: EchoHub.Server.Services.RegistrationStatus.IsRegistered
nameWithType: RegistrationStatus.IsRegistered
- uid: EchoHub.Server.Services.RegistrationStatus.IsRegistered*
name: IsRegistered
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_IsRegistered_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.IsRegistered
fullName: EchoHub.Server.Services.RegistrationStatus.IsRegistered
nameWithType: RegistrationStatus.IsRegistered
- uid: EchoHub.Server.Services.RegistrationStatus.LastError
name: LastError
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_LastError
commentId: P:EchoHub.Server.Services.RegistrationStatus.LastError
fullName: EchoHub.Server.Services.RegistrationStatus.LastError
nameWithType: RegistrationStatus.LastError
- uid: EchoHub.Server.Services.RegistrationStatus.LastError*
name: LastError
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_LastError_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.LastError
fullName: EchoHub.Server.Services.RegistrationStatus.LastError
nameWithType: RegistrationStatus.LastError
- uid: EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt
name: LastRegisteredAt
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_LastRegisteredAt
commentId: P:EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt
fullName: EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt
nameWithType: RegistrationStatus.LastRegisteredAt
- uid: EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt*
name: LastRegisteredAt
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_LastRegisteredAt_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt
fullName: EchoHub.Server.Services.RegistrationStatus.LastRegisteredAt
nameWithType: RegistrationStatus.LastRegisteredAt
- uid: EchoHub.Server.Services.RegistrationStatus.ServerId
name: ServerId
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ServerId
commentId: P:EchoHub.Server.Services.RegistrationStatus.ServerId
fullName: EchoHub.Server.Services.RegistrationStatus.ServerId
nameWithType: RegistrationStatus.ServerId
- uid: EchoHub.Server.Services.RegistrationStatus.ServerId*
name: ServerId
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ServerId_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.ServerId
fullName: EchoHub.Server.Services.RegistrationStatus.ServerId
nameWithType: RegistrationStatus.ServerId
- uid: EchoHub.Server.Services.RegistrationStatus.ToString
name: ToString()
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ToString
commentId: M:EchoHub.Server.Services.RegistrationStatus.ToString
fullName: EchoHub.Server.Services.RegistrationStatus.ToString()
nameWithType: RegistrationStatus.ToString()
- uid: EchoHub.Server.Services.RegistrationStatus.ToString*
name: ToString
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_ToString_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.ToString
fullName: EchoHub.Server.Services.RegistrationStatus.ToString
nameWithType: RegistrationStatus.ToString
- uid: EchoHub.Server.Services.RegistrationStatus.op_Equality(EchoHub.Server.Services.RegistrationStatus,EchoHub.Server.Services.RegistrationStatus)
name: operator ==(RegistrationStatus?, RegistrationStatus?)
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_op_Equality_EchoHub_Server_Services_RegistrationStatus_EchoHub_Server_Services_RegistrationStatus_
commentId: M:EchoHub.Server.Services.RegistrationStatus.op_Equality(EchoHub.Server.Services.RegistrationStatus,EchoHub.Server.Services.RegistrationStatus)
name.vb: =(RegistrationStatus, RegistrationStatus)
fullName: EchoHub.Server.Services.RegistrationStatus.operator ==(EchoHub.Server.Services.RegistrationStatus?, EchoHub.Server.Services.RegistrationStatus?)
fullName.vb: EchoHub.Server.Services.RegistrationStatus.=(EchoHub.Server.Services.RegistrationStatus, EchoHub.Server.Services.RegistrationStatus)
nameWithType: RegistrationStatus.operator ==(RegistrationStatus?, RegistrationStatus?)
nameWithType.vb: RegistrationStatus.=(RegistrationStatus, RegistrationStatus)
- uid: EchoHub.Server.Services.RegistrationStatus.op_Equality*
name: operator ==
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_op_Equality_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.op_Equality
name.vb: =
fullName: EchoHub.Server.Services.RegistrationStatus.operator ==
fullName.vb: EchoHub.Server.Services.RegistrationStatus.=
nameWithType: RegistrationStatus.operator ==
nameWithType.vb: RegistrationStatus.=
- uid: EchoHub.Server.Services.RegistrationStatus.op_Inequality(EchoHub.Server.Services.RegistrationStatus,EchoHub.Server.Services.RegistrationStatus)
name: operator !=(RegistrationStatus?, RegistrationStatus?)
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_op_Inequality_EchoHub_Server_Services_RegistrationStatus_EchoHub_Server_Services_RegistrationStatus_
commentId: M:EchoHub.Server.Services.RegistrationStatus.op_Inequality(EchoHub.Server.Services.RegistrationStatus,EchoHub.Server.Services.RegistrationStatus)
name.vb: <>(RegistrationStatus, RegistrationStatus)
fullName: EchoHub.Server.Services.RegistrationStatus.operator !=(EchoHub.Server.Services.RegistrationStatus?, EchoHub.Server.Services.RegistrationStatus?)
fullName.vb: EchoHub.Server.Services.RegistrationStatus.<>(EchoHub.Server.Services.RegistrationStatus, EchoHub.Server.Services.RegistrationStatus)
nameWithType: RegistrationStatus.operator !=(RegistrationStatus?, RegistrationStatus?)
nameWithType.vb: RegistrationStatus.<>(RegistrationStatus, RegistrationStatus)
- uid: EchoHub.Server.Services.RegistrationStatus.op_Inequality*
name: operator !=
href: api/server/EchoHub.Server.Services.RegistrationStatus.html#EchoHub_Server_Services_RegistrationStatus_op_Inequality_
commentId: Overload:EchoHub.Server.Services.RegistrationStatus.op_Inequality
name.vb: <>
fullName: EchoHub.Server.Services.RegistrationStatus.operator !=
fullName.vb: EchoHub.Server.Services.RegistrationStatus.<>
nameWithType: RegistrationStatus.operator !=
nameWithType.vb: RegistrationStatus.<>
- uid: EchoHub.Server.Services.ServerDirectoryService
name: ServerDirectoryService
href: api/server/EchoHub.Server.Services.ServerDirectoryService.html
commentId: T:EchoHub.Server.Services.ServerDirectoryService
fullName: EchoHub.Server.Services.ServerDirectoryService
nameWithType: ServerDirectoryService
- uid: EchoHub.Server.Services.ServerDirectoryService.#ctor(Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.PresenceTracker,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ServerDirectoryService})
name: ServerDirectoryService(IConfiguration, PresenceTracker, ILogger<ServerDirectoryService>)
href: api/server/EchoHub.Server.Services.ServerDirectoryService.html#EchoHub_Server_Services_ServerDirectoryService__ctor_Microsoft_Extensions_Configuration_IConfiguration_EchoHub_Server_Services_PresenceTracker_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_ServerDirectoryService__
commentId: M:EchoHub.Server.Services.ServerDirectoryService.#ctor(Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.PresenceTracker,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ServerDirectoryService})
name.vb: New(IConfiguration, PresenceTracker, ILogger(Of ServerDirectoryService))
fullName: EchoHub.Server.Services.ServerDirectoryService.ServerDirectoryService(Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.PresenceTracker, Microsoft.Extensions.Logging.ILogger<EchoHub.Server.Services.ServerDirectoryService>)
fullName.vb: EchoHub.Server.Services.ServerDirectoryService.New(Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.PresenceTracker, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Services.ServerDirectoryService))
nameWithType: ServerDirectoryService.ServerDirectoryService(IConfiguration, PresenceTracker, ILogger<ServerDirectoryService>)
nameWithType.vb: ServerDirectoryService.New(IConfiguration, PresenceTracker, ILogger(Of ServerDirectoryService))
- uid: EchoHub.Server.Services.ServerDirectoryService.#ctor(Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.PresenceTracker,EchoHub.Server.Services.DirectoryClaimStore,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ServerDirectoryService})
name: ServerDirectoryService(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger<ServerDirectoryService>)
href: api/server/EchoHub.Server.Services.ServerDirectoryService.html#EchoHub_Server_Services_ServerDirectoryService__ctor_Microsoft_Extensions_Configuration_IConfiguration_EchoHub_Server_Services_PresenceTracker_EchoHub_Server_Services_DirectoryClaimStore_Microsoft_Extensions_Logging_ILogger_EchoHub_Server_Services_ServerDirectoryService__
commentId: M:EchoHub.Server.Services.ServerDirectoryService.#ctor(Microsoft.Extensions.Configuration.IConfiguration,EchoHub.Server.Services.PresenceTracker,EchoHub.Server.Services.DirectoryClaimStore,Microsoft.Extensions.Logging.ILogger{EchoHub.Server.Services.ServerDirectoryService})
name.vb: New(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger(Of ServerDirectoryService))
fullName: EchoHub.Server.Services.ServerDirectoryService.ServerDirectoryService(Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.PresenceTracker, EchoHub.Server.Services.DirectoryClaimStore, Microsoft.Extensions.Logging.ILogger<EchoHub.Server.Services.ServerDirectoryService>)
fullName.vb: EchoHub.Server.Services.ServerDirectoryService.New(Microsoft.Extensions.Configuration.IConfiguration, EchoHub.Server.Services.PresenceTracker, EchoHub.Server.Services.DirectoryClaimStore, Microsoft.Extensions.Logging.ILogger(Of EchoHub.Server.Services.ServerDirectoryService))
nameWithType: ServerDirectoryService.ServerDirectoryService(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger<ServerDirectoryService>)
nameWithType.vb: ServerDirectoryService.New(IConfiguration, PresenceTracker, DirectoryClaimStore, ILogger(Of ServerDirectoryService))
- uid: EchoHub.Server.Services.ServerDirectoryService.#ctor*
name: ServerDirectoryService
href: api/server/EchoHub.Server.Services.ServerDirectoryService.html#EchoHub_Server_Services_ServerDirectoryService__ctor_