ad1cf2351c
Three M6 sub-followups landed in this wave (sub-agent worktrees +
manual reconciliation in main):
**F36 — Session::subscribe_buffered (NMX) per R2 single-sample**
- `BufferedOptions::rounded_update_interval_ms()` — 100ms rounding
helper mirroring MxNativeCompatibilityServer.cs:638
((updateInterval + 99) / 100) * 100, saturating on overflow.
- `Session::subscribe_buffered` (public, lib.rs:604) delegates to
the new private `subscribe_buffered_nmx` which uses the buffered
RegisterReference path: item_definition suffixed with
`.property(buffer)`, subscribe=true (no separate
AdviseSupervisory follow-up — verified against capture 082).
- Per R2 verified at wwtools/mxaccesscli/docs/api-notes.md the wire
semantic is single-sample-per-event with a server-side cadence
knob; rounded_ms is held client-side only (native MXAccess does
not emit a separate SetBufferedUpdateInterval RPC, verified by
absence in 079/082 captures).
- New crates/mxaccess/examples/subscribe-buffered.rs.
- New crates/mxaccess-codec/tests/buffered_register_reference_parity.rs:
4 tests (capture 079/082 round-trip, suffix helper, constructive
forward-build vs capture 082).
**F40 — Optional metrics feature**
- New crates/mxaccess/src/metrics.rs (275 lines): `pub(crate)`
thin wrappers (`record_write_latency`, `record_read_latency`,
`inc_writes`, `inc_reads`, `inc_advises`, `inc_recovery_*`,
`set_active_subscriptions`, etc.) that compile to no-ops under
`#[cfg(not(feature = "metrics"))]`. Call sites in session.rs +
asb_session.rs invoke them unconditionally; the gate is inside
the wrapper.
- `metrics = { version = "0.24", optional = true }` added to
workspace + mxaccess crate Cargo.toml.
- Default build: zero metrics dep, zero runtime cost.
**F44 — Buffered batch + suspend capture decode evidence**
- New docs/M6-buffered-evidence.md: per-capture summary for
077, 079, 080, 081, 082, 094 — call sequence, key wire bytes,
R2/R5 verdict.
- R2 confirmed silently as "not a real risk" — single-sample
observed across 079/080/082/094.
- R5 trigger conditions documented from capture 077: AdviseSupervisory
+ Suspend pair, 1-second intervals, succeeds on enum attributes.
- design/70-risks-and-open-questions.md R2/R5 status updated.
Workspace: 759 → 792 tests, clippy clean, rustdoc -D warnings clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
52 lines
1.9 KiB
TOML
52 lines
1.9 KiB
TOML
[package]
|
|
name = "mxaccess"
|
|
description = "Async Tokio façade for AVEVA / Wonderware MXAccess. Exposes Session, Subscription, Transport trait, and the public Error model."
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
repository.workspace = true
|
|
rust-version.workspace = true
|
|
authors.workspace = true
|
|
|
|
[dependencies]
|
|
mxaccess-codec = { path = "../mxaccess-codec" }
|
|
mxaccess-callback = { path = "../mxaccess-callback" }
|
|
mxaccess-galaxy = { path = "../mxaccess-galaxy" }
|
|
mxaccess-nmx = { path = "../mxaccess-nmx" }
|
|
mxaccess-rpc = { path = "../mxaccess-rpc" }
|
|
mxaccess-asb = { path = "../mxaccess-asb" }
|
|
mxaccess-asb-nettcp = { path = "../mxaccess-asb-nettcp" }
|
|
thiserror = { workspace = true }
|
|
tokio = { workspace = true }
|
|
tracing = { workspace = true }
|
|
futures-util = { workspace = true }
|
|
tokio-stream = { version = "0.1", features = ["sync"] }
|
|
rand = "0.8"
|
|
# F40 — optional `metrics` feature. Default build does NOT depend on
|
|
# this crate; enable via `--features metrics` to wire counters and
|
|
# histograms into a downstream `metrics::Recorder`.
|
|
metrics = { workspace = true, optional = true }
|
|
|
|
[dev-dependencies]
|
|
async-trait = { workspace = true }
|
|
|
|
[features]
|
|
default = []
|
|
# Transport feature gates land in M2-M5.
|
|
nmx = []
|
|
asb = []
|
|
# F40 — wire counters / histograms / gauges via the `metrics` crate.
|
|
# Default build is allocation-neutral: no `metrics` dep, no runtime cost.
|
|
# See `src/metrics.rs` for the emitted metric inventory.
|
|
metrics = ["dep:metrics"]
|
|
serde = ["mxaccess-codec/serde"]
|
|
# `live` gates integration tests that hit a running AVEVA install. Driven by
|
|
# the `MX_LIVE` env var via `tools/Setup-LiveProbeEnv.ps1`.
|
|
live = []
|
|
# Pulls F12's `Session::connect_nmx_auto` constructor — the auto-resolving
|
|
# COM-activation path. Propagates to `mxaccess-nmx/windows-com`.
|
|
windows-com = ["mxaccess-nmx/windows-com"]
|
|
|
|
[lints]
|
|
workspace = true
|