namespace ZB.MOM.WW.OtOpcUa.Driver.OpcUaClient;
///
/// OPC UA Client (gateway) driver configuration. Bound from DriverConfig JSON at
/// driver-host registration time. Models the settings documented in
/// docs/v2/driver-specs.md §8.
///
///
/// This driver connects to a REMOTE OPC UA server and re-exposes its address space
/// through the local OtOpcUa server — the opposite direction from the usual "server
/// exposes PLC data" flow. Tier A (pure managed, OPC Foundation reference SDK); universal
/// protections cover it.
///
public sealed class OpcUaClientDriverOptions
{
/// Remote OPC UA endpoint URL, e.g. opc.tcp://plc.internal:4840.
public string EndpointUrl { get; init; } = "opc.tcp://localhost:4840";
/// Security policy. One of None, Basic256Sha256, Aes128_Sha256_RsaOaep.
public string SecurityPolicy { get; init; } = "None";
/// Security mode.
public OpcUaSecurityMode SecurityMode { get; init; } = OpcUaSecurityMode.None;
/// Authentication type.
public OpcUaAuthType AuthType { get; init; } = OpcUaAuthType.Anonymous;
/// User name (required only for ).
public string? Username { get; init; }
/// Password (required only for ).
public string? Password { get; init; }
/// Server-negotiated session timeout. Default 120s per driver-specs.md §8.
public TimeSpan SessionTimeout { get; init; } = TimeSpan.FromSeconds(120);
/// Client-side keep-alive interval.
public TimeSpan KeepAliveInterval { get; init; } = TimeSpan.FromSeconds(5);
/// Initial reconnect delay after a session drop.
public TimeSpan ReconnectPeriod { get; init; } = TimeSpan.FromSeconds(5);
///
/// When true, the driver accepts any self-signed / untrusted server certificate.
/// Dev-only — must be false in production so MITM attacks against the opc.tcp
/// channel fail closed.
///
public bool AutoAcceptCertificates { get; init; } = false;
///
/// Application URI the driver reports during session creation. Must match the
/// subject-alt-name on the client certificate if one is used, which is why it's a
/// config knob rather than hard-coded.
///
public string ApplicationUri { get; init; } = "urn:localhost:OtOpcUa:GatewayClient";
///
/// Friendly name sent to the remote server for diagnostics. Shows up in the remote
/// server's session-list so operators can identify which gateway instance is calling.
///
public string SessionName { get; init; } = "OtOpcUa-Gateway";
/// Connect + per-operation timeout.
public TimeSpan Timeout { get; init; } = TimeSpan.FromSeconds(10);
///
/// Root NodeId to mirror. Default null = ObjectsFolder (i=85). Set to
/// a scoped root to restrict the address space the driver exposes locally — useful
/// when the remote server has tens of thousands of nodes and only a subset is
/// needed downstream.
///
public string? BrowseRoot { get; init; }
///
/// Cap on total nodes discovered during DiscoverAsync. Default 10_000 —
/// bounds memory on runaway remote servers without being so low that normal
/// deployments hit it. When the cap is reached discovery stops and a warning is
/// written to the driver health surface; the partially-discovered tree is still
/// projected into the local address space.
///
public int MaxDiscoveredNodes { get; init; } = 10_000;
///
/// Max hierarchical depth of the browse. Default 10 — deep enough for realistic
/// OPC UA information models, shallow enough that cyclic graphs can't spin the
/// browse forever.
///
public int MaxBrowseDepth { get; init; } = 10;
}
/// OPC UA message security mode.
public enum OpcUaSecurityMode
{
None,
Sign,
SignAndEncrypt,
}
/// User authentication type sent to the remote server.
public enum OpcUaAuthType
{
Anonymous,
Username,
Certificate,
}