feat(commons): add IDriverBrowser/IBrowseSession/BrowseNode abstractions
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
namespace ZB.MOM.WW.OtOpcUa.Commons.Browsing;
|
||||
|
||||
/// <summary>One node in a driver-agnostic browse tree.</summary>
|
||||
/// <param name="NodeId">Stable identifier passed back to the picker on commit. For OPC UA
|
||||
/// this is the <c>nsu=...;...</c> form; for Galaxy this is the <c>tag_name</c>.</param>
|
||||
/// <param name="DisplayName">Label shown in the tree.</param>
|
||||
/// <param name="Kind">Whether this node terminates the address (Leaf) or has children
|
||||
/// (Folder). Galaxy never returns Leaves; only the attribute side-panel terminates.</param>
|
||||
/// <param name="HasChildrenHint">When true, the UI renders an expand affordance before
|
||||
/// the children have been fetched.</param>
|
||||
public sealed record BrowseNode(
|
||||
string NodeId,
|
||||
string DisplayName,
|
||||
BrowseNodeKind Kind,
|
||||
bool HasChildrenHint);
|
||||
|
||||
/// <summary>Discriminates terminal vs. expandable nodes for UI rendering.</summary>
|
||||
public enum BrowseNodeKind
|
||||
{
|
||||
/// <summary>Expandable — has (or may have) children. UI shows expand affordance.</summary>
|
||||
Folder,
|
||||
/// <summary>Terminal — commit on select.</summary>
|
||||
Leaf,
|
||||
}
|
||||
|
||||
/// <summary>Metadata for an attribute of a Galaxy object (or the equivalent
|
||||
/// per-driver concept). Surfaced in the picker's attribute side-panel.</summary>
|
||||
public sealed record AttributeInfo(
|
||||
string Name,
|
||||
string DriverDataType,
|
||||
bool IsArray,
|
||||
string SecurityClass);
|
||||
@@ -0,0 +1,29 @@
|
||||
namespace ZB.MOM.WW.OtOpcUa.Commons.Browsing;
|
||||
|
||||
/// <summary>
|
||||
/// A live, one-level-at-a-time browse over a remote address space. Owned by the
|
||||
/// AdminUI <c>BrowseSessionRegistry</c>; disposed by the registry's TTL reaper or
|
||||
/// the picker body on close.
|
||||
/// </summary>
|
||||
public interface IBrowseSession : IAsyncDisposable
|
||||
{
|
||||
/// <summary>Opaque token identifying this session in the registry.</summary>
|
||||
Guid Token { get; }
|
||||
|
||||
/// <summary>Wall-clock time of the most recent successful call. Refreshed on
|
||||
/// <see cref="RootAsync"/>, <see cref="ExpandAsync"/>, and
|
||||
/// <see cref="AttributesAsync"/>; used by the reaper for idle eviction.</summary>
|
||||
DateTime LastUsedUtc { get; }
|
||||
|
||||
/// <summary>Returns the top-level browse nodes.</summary>
|
||||
Task<IReadOnlyList<BrowseNode>> RootAsync(CancellationToken cancellationToken);
|
||||
|
||||
/// <summary>Returns the direct children of the node identified by
|
||||
/// <paramref name="nodeId"/>.</summary>
|
||||
Task<IReadOnlyList<BrowseNode>> ExpandAsync(string nodeId, CancellationToken cancellationToken);
|
||||
|
||||
/// <summary>Returns the attributes of the node identified by <paramref name="nodeId"/>.
|
||||
/// Empty for drivers whose tree is uniform (OPC UA Client). Galaxy uses this to populate
|
||||
/// the attribute side-panel after the user selects an object.</summary>
|
||||
Task<IReadOnlyList<AttributeInfo>> AttributesAsync(string nodeId, CancellationToken cancellationToken);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
namespace ZB.MOM.WW.OtOpcUa.Commons.Browsing;
|
||||
|
||||
/// <summary>
|
||||
/// Per-driver factory that opens an ad-hoc browse session against the configuration
|
||||
/// supplied as JSON. Parallels <c>IDriverProbe</c> in the runtime — one implementation
|
||||
/// per driver type, registered in AdminUI DI and indexed by <see cref="DriverType"/>.
|
||||
/// </summary>
|
||||
public interface IDriverBrowser
|
||||
{
|
||||
/// <summary>Driver type key, matching the AdminUI's persisted DriverType string
|
||||
/// (e.g. "OpcUaClient", "Galaxy").</summary>
|
||||
string DriverType { get; }
|
||||
|
||||
/// <summary>Opens a browse session against the supplied configuration.</summary>
|
||||
/// <param name="configJson">Driver options serialized as JSON; same shape the runtime
|
||||
/// driver would consume.</param>
|
||||
/// <param name="cancellationToken">Cancellation for the connect phase only.</param>
|
||||
Task<IBrowseSession> OpenAsync(string configJson, CancellationToken cancellationToken);
|
||||
}
|
||||
Reference in New Issue
Block a user