docs(xmldoc): fill missing XML docs + strip tracking-ID comments across src
v2-ci / build (push) Failing after 41s
v2-ci / unit-tests (tests/Core/ZB.MOM.WW.OtOpcUa.Cluster.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.ControlPlane.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests) (push) Has been skipped
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Security.Tests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.Host.IntegrationTests) (push) Has been skipped
v2-ci / integration (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests) (push) Has been skipped

Adds <summary>/<param>/<returns>/<inheritdoc> where missing and removes
project bookkeeping IDs (task/tracking refs) from shipped code comments,
so the docs read cleanly and CommentChecker is quiet except for known
false positives (PLC/protocol terms, event/IEqualityComparer inheritdoc).
Doc/comment-only; no logic changed; solution builds clean.
This commit is contained in:
Joseph Doherty
2026-07-07 12:38:39 -04:00
parent 384dbd7d36
commit 9cad9ed0fc
375 changed files with 1899 additions and 2493 deletions
@@ -32,25 +32,19 @@ internal sealed class OpcUaClientBrowseSession : IBrowseSession
_rootNodeId = rootNodeId;
}
/// <summary>Opaque token identifying this session in the AdminUI registry.</summary>
/// <inheritdoc />
public Guid Token { get; } = Guid.NewGuid();
/// <summary>Wall-clock time of the most recent successful browse call; the reaper uses
/// this for idle eviction.</summary>
/// <inheritdoc />
public DateTime LastUsedUtc { get; private set; } = DateTime.UtcNow;
/// <summary>Browse one level under the configured root node.</summary>
/// <param name="cancellationToken">Cancellation token.</param>
/// <inheritdoc />
public Task<IReadOnlyList<BrowseNode>> RootAsync(CancellationToken cancellationToken)
=> BrowseOneLevelAsync(_rootNodeId, cancellationToken);
/// <summary>Browse one level under the node identified by <paramref name="nodeId"/>,
/// which must be a stable reference produced by <see cref="NamespaceMap.ToStableReference"/>
/// (or a plain <c>ns=N;…</c> form).</summary>
/// <param name="nodeId">Stable reference string for the parent node.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <exception cref="ArgumentException">Thrown when <paramref name="nodeId"/> cannot be
/// resolved against the live session's namespace table.</exception>
/// <inheritdoc />
// Throws ArgumentException when nodeId cannot be resolved against the live session's
// namespace table.
public Task<IReadOnlyList<BrowseNode>> ExpandAsync(string nodeId, CancellationToken cancellationToken)
{
if (!NamespaceMap.TryResolve(_session, nodeId, out var resolved))
@@ -59,12 +53,7 @@ internal sealed class OpcUaClientBrowseSession : IBrowseSession
return BrowseOneLevelAsync(resolved, cancellationToken);
}
/// <summary>The OPC UA picker treats variables as terminal leaves and does not surface
/// a per-attribute side-panel, so this always returns empty. <see cref="LastUsedUtc"/>
/// is still refreshed to honour the <see cref="IBrowseSession"/> contract and prevent
/// the reaper from evicting an active session that only receives attribute calls.</summary>
/// <param name="nodeId">Ignored.</param>
/// <param name="cancellationToken">Ignored.</param>
/// <inheritdoc />
public Task<IReadOnlyList<AttributeInfo>> AttributesAsync(string nodeId, CancellationToken cancellationToken)
{
LastUsedUtc = DateTime.UtcNow;
@@ -111,8 +100,7 @@ internal sealed class OpcUaClientBrowseSession : IBrowseSession
var refs = result.References;
// Follow browse continuation points so folders larger than the server's per-call
// cap aren't silently truncated (same pattern as runtime
// Driver.OpcUaClient-003).
// cap aren't silently truncated.
var cp = result.ContinuationPoint;
while (cp is { Length: > 0 })
{
@@ -163,6 +151,7 @@ internal sealed class OpcUaClientBrowseSession : IBrowseSession
/// <summary>Idempotent best-effort dispose: closes the underlying session if it's a
/// concrete <see cref="Session"/>, disposes it, and disposes the gate. Close errors are
/// swallowed because the registry reaper may be racing a remote disconnect.</summary>
/// <returns>A task that represents the asynchronous operation.</returns>
public async ValueTask DisposeAsync()
{
if (_disposed) return;