mirror of
https://github.com/OPCFoundation/UA-.NETStandard.git
synced 2026-10-25 11:50:03 +08:00
Review feedback on UaSCBinaryClientChannel.cs:893 - "Everywhere we make it look like a generic extension, but we only handle stream." That is correct, and checking it against the only other transport settles it: Opc.Ua.Bindings.Quic references none of ISecureChannelMessageHost, ISecureChannelMessageExtension, SequenceNumberBudget or the send gate, because a QUIC data channel rides its own stream and never becomes a UASC chunk. The seam had exactly one implementer and no prospect of a second; it existed only because the engine sat in another assembly. So the engine comes home rather than the seam being dressed up as general. The destinations are the ones commitcfaa34fa8recorded as renames: * Opc.Ua.Core.Channels/DataChannels/** (engine, framing, flow control, sequencing, scheduling, model and Services/) to Opc.Ua.Core/Stack/DataChannels * IServerDataChannelTransport and InlineServerDataChannelTransport back to Opc.Ua.Server/Server, where the latter came from * ChannelsEventIds folded into CoreEventIds, keeping 600/620 so existing log filters are unaffected Deleted outright: * ISecureChannelMessageExtension.cs, both interfaces. This also answers the request to rename that file after its interface: it no longer exists. * UaSCBinaryChannel.MessageExtensions.cs, replaced by UaSCBinaryChannel.DataChannels.cs, which owns the DataChannelManager directly and dispatches STR after the existing decrypt, signature and sequence checks. * DataChannelExtension, the adapter that existed only to bridge assemblies. Its IDataChannelTransport half is now a small private InlineDataChannelTransport that hands the channel to the engine. * The Opc.Ua.Core.Channels project, its UA.slnx entry, its expected-packages line and its reference from the reference server Dockerfile. The package is new in this branch and never shipped, so nothing is owed compatibility. EnableDataChannels and the channel accessors become ordinary members instead of extension methods over a published seam, and the framing fault surfaces as UaSCUaBinaryChannel.DataChannelProtocolFault, so a test no longer has to reach through a registry to observe which rule was broken. This supersedes the InternalsVisibleTo narrowing in18a30770d: the types it made internal are deleted here, and the entry it added to Opc.Ua.Core is removed. SequenceNumberBudget stays internal, which the move now justifies on its own. UaSCSecureChannelRegistry stays public because a server writing its own IServerDataChannelTransport needs it, as the sample does. Separately, per the review of the QUIC csproj, opc.quic now targets net8.0 as well and opts into preview features there, so a net8.0 consumer can do the same rather than being excluded. The three file wide NET9_0_OR_GREATER guards are gone; only QuicServerConnectionOptions.HandshakeTimeout, which is genuinely .NET 9+, stays guarded, and the listener's own admission expiry still bounds a stalled handshake on net8.0. UA.slnx builds pinned to net10.0 and 316 data channel tests pass. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5d026b47-265d-4c97-8715-26e207dfa03c