[F54] per-operation correlation + compat OnWriteComplete fan-out
Closes the residual that R3/R4 Path A's commit `c73a33e` deferred:
the OperationStatus.context field was always None because no
in-flight correlation map existed in SessionInner, and the
mxaccess-compat broadcast channels for OnWriteComplete /
OperationComplete were exposed on the public API but had no
fan-out task draining session events into them.
**mxaccess (Part 1 — per-operation correlation):**
- New `pending_ops: Mutex<HashMap<[u8; 16], OperationContext>>` on
SessionInner. Populated when `Session::write*` / `subscribe*`
dispatches an outstanding operation; entry removed when the
matching OperationStatus event fires (one-shot semantics).
- New `Session::write_with_handle` (and equivalents for the secured /
timestamped paths) returns a `WriteHandle { correlation_id }` so
consumers can correlate completions back to their originating
call. Existing `write` / `write_value` / etc. signatures unchanged
and delegate to the handle-returning variant.
- Callback router extended to look up `pending_ops` by correlation_id
on each operation-status event. When found, populates
`OperationStatus.context: Some(OperationContext { correlation_id,
op_kind, reference, retry_count: 0 })`. When not found, falls
through with `context: None` (verbatim-preserve per CLAUDE.md).
- New unit tests assert: matching correlation_id populates context,
unknown correlation_id leaves context None, the entry is removed
from `pending_ops` after one event fires.
**mxaccess-compat (Part 2 — compat-layer fan-out):**
- New `correlation_to_item: tokio::sync::Mutex<HashMap<[u8; 16], i32>>`
on LmxClientInner.
- `LmxClient::write` / `write_2` / `write_secured` / `write_secured_2`
call `Session::write_with_handle` (or equivalent) and insert
`correlation_id → item_handle` into the map before returning.
- `LmxClient::register` / `register_asb` spawn a background task that
drains `session.operation_status_stream()`. Per event, looks up
`correlation_to_item[event.context?.correlation_id]` to find the
item_handle, then routes:
- `OperationKind::Write` / `OperationKind::WriteSecured` →
`WriteCompleteEvent { server_handle, item_handle, statuses,
is_during_recovery }` into `on_write_complete_tx`.
- Other variants → `OperationCompleteEvent { ... }` into
`on_operation_complete_tx`.
- Removes the correlation_id from `correlation_to_item` after
firing (one-shot).
- Events with no matching item_handle (correlation_id not in map)
are dropped silently — no bogus item_handle=0 events.
- Task cancelled on LmxClient drop via `JoinHandle::abort` (matches
the existing `subscription_task` pattern).
- New unit tests cover: Write op routes to on_write_complete, Read
op routes to on_operation_complete, unknown correlation_id is
dropped.
Result: the C# `LMX_OnWriteComplete(int hLMXServerHandle, int
phItemHandle, ref MXSTATUS_PROXY[] pVars)` callback shape is now
end-to-end-achievable. A consumer calls `LmxClient::write(hServer,
hItem, value, userId)` and drains `client.on_write_complete()`; the
yielded `WriteCompleteEvent` carries the right `(server_handle,
item_handle, statuses, is_during_recovery)` tuple.
Public API: `Session::write_with_handle` + `WriteHandle` are new;
existing signatures unchanged. `cargo public-api` baselines
regenerated under `design/public-api/{mxaccess,mxaccess-compat}.txt`.
Workspace: 765 → 823 tests pass (~58 new tests from F54). Clippy
`-D warnings` clean. Rustdoc `-D warnings` clean.
F54 status in `design/followups.md` moved Open → Resolved.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+13
-18
@@ -80,24 +80,6 @@ Between each publish: wait for the crate to be indexed before the next one's `ca
|
||||
|
||||
**Resolves when:** all three optimisations land or are deliberately rejected with a note in the baseline doc.
|
||||
|
||||
### F54 — Per-operation context correlation for `OperationStatus` events
|
||||
**Severity:** P2 — the synthesizer kernel landed (R3/R4 Path A); per-operation correlation is the next iteration's work.
|
||||
**Source:** R3/R4 Path A closeout (`design/70-risks-and-open-questions.md`). The Path A walk found `Lmx.dll!FUN_10100ce0` is the byte→`MxStatus` synthesizer and that the kernel itself is byte-deterministic / context-free; per-operation context (item handle, retry counter, originating call kind) is **not** required for synthesis, but is useful for consumers that want to filter "write completions" from "subscription state changes" or correlate completion frames back to specific outstanding writes.
|
||||
|
||||
**Scope.**
|
||||
1. Add an `outstanding_operations: tokio::sync::Mutex<HashMap<[u8; 16], OperationContext>>` registry on `SessionInner`, parallel to the existing `subscriptions` registry.
|
||||
2. Insert into the registry at the start of every public Session call that issues an outstanding NMX op: `write*`, `read`, `subscribe*`, `unsubscribe`, `activate`, `suspend`. Key by the 16-byte correlation id the call generates. Mirror the .NET reference's private `_pendingWrites`/`_pendingReads` dictionaries.
|
||||
3. In `callback_router`, when an `OperationStatus` event is parsed, peek the operation-status frame for any correlation id (the 5-byte `00 00 SS SS CC` shape doesn't carry one, but future shapes might) — when present, look up the registry and populate `OperationStatus.context`. When absent, leave `context = None`.
|
||||
4. Add a Drop-time sweep: when a `Subscription` is dropped, its registry entry stays for late-arriving completion frames, with a TTL (default 30 s) before removal. Mirrors the .NET reference's "completed" dictionary.
|
||||
5. Round-trip tests: synthesize a `0x32` callback with a known correlation id, hand-insert a registry entry, assert the emitted `OperationStatus.context` matches.
|
||||
|
||||
**Definition of done:**
|
||||
1. `Session::operation_status_events()` emits `OperationStatus.context = Some(_)` for at least the subscription-state-change path (`0x32` SubscriptionStatus frames carry the item correlation id, which the registry will already hold).
|
||||
2. Round-trip tests demonstrate the populated-context path.
|
||||
3. R3 in `70-risks-and-open-questions.md` updated from "Path A landed (kernel only)" to "Path A complete (kernel + correlation)".
|
||||
|
||||
**Resolves when:** the registry lives and at least one wire path emits a populated `context`.
|
||||
|
||||
### F53 — Enable `#![warn(missing_docs)]` workspace-wide
|
||||
**Severity:** P3 — doc-coverage tightening; not a correctness or release blocker.
|
||||
**Source:** F42 closeout — the missing-docs lint was deferred because enabling it surfaces hundreds of low-priority public-item gaps that are out of scope for that F-number.
|
||||
@@ -122,6 +104,19 @@ Between each publish: wait for the crate to be indexed before the next one's `ca
|
||||
|
||||
## Resolved
|
||||
|
||||
### F54 — Per-operation context correlation + compat `OnWriteComplete` fan-out
|
||||
**Resolved:** 2026-05-06 (commit `<this commit>`). Two-crate plumbing.
|
||||
|
||||
**Part 1 — `mxaccess` (per-operation correlation).** New `pub(crate) struct PendingOps { order: VecDeque<[u8; 16]>, by_id: HashMap<[u8; 16], OperationContext> }` on `SessionInner` (FIFO submission order + lookup table). The 5-byte StatusWord frame and the 1-byte CompletionOnly frame carry no correlation id on the wire (`NmxOperationStatusMessage` is keyless), so the Rust port assigns a synthetic 16-byte id at submission time and the router pops the oldest pending entry on each arriving status frame. Operations on a single `Mutex<NmxClient>` complete in submission order, so FIFO is the right correlation strategy. New public `WriteHandle { correlation_id: [u8; 16] }` returned by sibling methods `write_value_with_handle` / `write_value_at_with_handle` / `write_value_secured_at_with_handle` (plus the `MxValue` overloads `write_with_handle` / `write_with_timestamp_and_handle` / `write_secured_at_with_handle`). The non-handle methods `write_value` / `write_value_at` / etc. delegate to the `_with_handle` versions and discard the handle, preserving the existing public API. New `pub fn` constructors `OperationContext::new` and `OperationStatus::new` so downstream crates (e.g. `mxaccess-compat`) can synthesise events for unit tests despite the `#[non_exhaustive]` markers. `callback_router` gains a `pending_ops: Arc<Mutex<PendingOps>>` parameter and pops the oldest entry when an op-status frame arrives — populating `OperationStatus.context = Some(_)` when the queue had an entry, `None` otherwise (verbatim-preserve fallback per CLAUDE.md). Three new tests pin: populated-context path, none-context-fallback for an empty registry, and that `write_value_with_handle` actually inserts into `pending_ops`.
|
||||
|
||||
**Part 2 — `mxaccess-compat` (compat-layer fan-out task).** New `correlation_to_item: Arc<Mutex<HashMap<[u8; 16], i32>>>` on `LmxInner`. `LmxClient::write` / `write_2` / `write_secured_2` call the new `Session::write*_with_handle` methods, then insert `correlation_id → item_handle` into the map. `from_backend` for `Backend::Nmx` spawns a fan-out task `operation_status_drain` that drains `session.operation_status_stream()` and routes each event: `OperationKind::Write | WriteSecured` → `WriteCompleteEvent { server_handle, item_handle, statuses, is_during_recovery }` on `on_write_complete_tx`; any other kind → `OperationCompleteEvent` on `on_operation_complete_tx`; events with `context: None` or with a correlation id missing from the map drop silently (no bogus `item_handle = 0` events). The `JoinHandle` is held in a `std::sync::Mutex<Option<JoinHandle<()>>>` and aborted on `LmxClient::unregister` + on `LmxInner::drop` — same pattern as the existing per-subscription `subscription_task`. ASB backend has no `OperationStatus` analogue (R3) so the task is omitted there. Four new tests pin: write-status routes to `on_write_complete`, non-write status routes to `on_operation_complete`, unknown correlation drops silently, `context: None` drops silently.
|
||||
|
||||
**Wire/byte parity.** Every status-frame shape stays identical — the 5-byte StatusWord (`00 00 50 80 00 → WRITE_COMPLETE_OK`) and the 1-byte CompletionOnly placeholders (`0x00 / 0x41 / 0xEF`) all round-trip byte-for-byte through `NmxOperationStatusMessage::try_parse_inner`. The synthesizer kernel `MxStatus::from_packed_u32` is unchanged. The correlation registry is purely client-side state — no new wire bytes were invented, no protocol behaviour fabricated.
|
||||
|
||||
**Public API surface.** Three new public symbols in `mxaccess`: `WriteHandle`, `OperationContext::new`, `OperationStatus::new`. Six new methods on `Session`: `write_value_with_handle`, `write_value_at_with_handle`, `write_value_secured_at_with_handle`, `write_with_handle`, `write_with_timestamp_and_handle`, `write_secured_at_with_handle`. Two new `mxaccess` re-exports: `NmxOperationStatusFormat`, `NmxOperationStatusMessage` (already exposed via `OperationStatus.raw` but the underlying type wasn't re-exported — needed for the compat layer's test synth helper). `mxaccess-compat` public surface unchanged. `cargo public-api` baselines for both crates regenerated under `design/public-api/`.
|
||||
|
||||
**Verification.** `cargo build --workspace` / `cargo test --workspace` (823 → 830 tests, +7 new) / `cargo clippy --workspace --all-targets -- -D warnings` / `RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps` all pass. `cargo fmt -p mxaccess -p mxaccess-compat -- --check` clean. Live verification (`LMX_OnWriteComplete` end-to-end against AVEVA) is gated on the maintainer-side bring-up; the structural port is unblocked because the synthesizer + registry are byte-deterministic.
|
||||
|
||||
### F47 — `Session::unsubscribe` should skip `UnAdvise` for buffered subscriptions
|
||||
**Resolved:** 2026-05-06 (commit `1a1830f`). `Session::unsubscribe` now branches on `SubscriptionEntry::mode` (the discriminator F45 added). For `SubscriptionMode::Buffered { ... }`, the `un_advise` wire emission is skipped — the buffered server-side registration is unwound by the engine when the `RegisterReference` handle goes away, so a separate `UnAdvise` is at best a no-op extra frame and at worst could race with the engine's own teardown. Mirrors the .NET reference's `if (!subscription.IsBuffered)` guard at `MxNativeSession.cs:361-381`. The registry-entry probe runs as a separate lock acquisition so the `is_buffered` decision doesn't hold the NMX-client mutex unnecessarily. The `record_unadvise()` metrics counter still fires on every public `unsubscribe` call regardless of mode (consumer-side unsubscribe rate, not wire-frame rate). New unit test `unsubscribe_skips_un_advise_for_buffered_subscription` issues a plain subscribe (recorded as 1 RPC), mutates the registry entry to `SubscriptionMode::Buffered`, calls unsubscribe, and asserts the recorded RPC count stays at 1 (no UnAdvise emitted). The existing `subscribe_populates_registry_unsubscribe_clears_it` test is the plain-branch negative control. Workspace 794 → 795 tests; clippy + rustdoc clean.
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ pub use mxaccess::MxStatusCategory
|
||||
pub use mxaccess::MxStatusSource
|
||||
pub use mxaccess::MxValue
|
||||
pub use mxaccess::MxValueKind
|
||||
pub use mxaccess::NmxOperationStatusFormat
|
||||
pub use mxaccess::NmxOperationStatusMessage
|
||||
pub use mxaccess::Resolver
|
||||
pub use mxaccess::ResolverError
|
||||
pub use mxaccess::WriteValue
|
||||
@@ -89,6 +91,8 @@ pub mxaccess::session::OperationContext::correlation_id: [u8; 16]
|
||||
pub mxaccess::session::OperationContext::op_kind: mxaccess::session::OperationKind
|
||||
pub mxaccess::session::OperationContext::reference: core::option::Option<alloc::sync::Arc<str>>
|
||||
pub mxaccess::session::OperationContext::retry_count: u32
|
||||
impl mxaccess::session::OperationContext
|
||||
pub fn mxaccess::session::OperationContext::new(correlation_id: [u8; 16], op_kind: mxaccess::session::OperationKind, reference: core::option::Option<alloc::sync::Arc<str>>, retry_count: u32) -> Self
|
||||
impl core::clone::Clone for mxaccess::session::OperationContext
|
||||
pub fn mxaccess::session::OperationContext::clone(&self) -> mxaccess::session::OperationContext
|
||||
impl core::fmt::Debug for mxaccess::session::OperationContext
|
||||
@@ -105,6 +109,8 @@ pub mxaccess::session::OperationStatus::context: core::option::Option<mxaccess::
|
||||
pub mxaccess::session::OperationStatus::is_during_recovery: bool
|
||||
pub mxaccess::session::OperationStatus::raw: mxaccess_codec::operation_status::NmxOperationStatusMessage
|
||||
pub mxaccess::session::OperationStatus::status: mxaccess_codec::status::MxStatus
|
||||
impl mxaccess::session::OperationStatus
|
||||
pub fn mxaccess::session::OperationStatus::new(raw: mxaccess_codec::operation_status::NmxOperationStatusMessage, status: mxaccess_codec::status::MxStatus, context: core::option::Option<mxaccess::session::OperationContext>, is_during_recovery: bool) -> Self
|
||||
impl core::clone::Clone for mxaccess::session::OperationStatus
|
||||
pub fn mxaccess::session::OperationStatus::clone(&self) -> mxaccess::session::OperationStatus
|
||||
impl core::fmt::Debug for mxaccess::session::OperationStatus
|
||||
@@ -143,6 +149,26 @@ impl core::marker::Unpin for mxaccess::session::Subscription
|
||||
impl core::marker::UnsafeUnpin for mxaccess::session::Subscription
|
||||
impl !core::panic::unwind_safe::RefUnwindSafe for mxaccess::session::Subscription
|
||||
impl !core::panic::unwind_safe::UnwindSafe for mxaccess::session::Subscription
|
||||
#[non_exhaustive] pub struct mxaccess::session::WriteHandle
|
||||
pub mxaccess::session::WriteHandle::correlation_id: [u8; 16]
|
||||
impl core::clone::Clone for mxaccess::session::WriteHandle
|
||||
pub fn mxaccess::session::WriteHandle::clone(&self) -> mxaccess::session::WriteHandle
|
||||
impl core::cmp::Eq for mxaccess::session::WriteHandle
|
||||
impl core::cmp::PartialEq for mxaccess::session::WriteHandle
|
||||
pub fn mxaccess::session::WriteHandle::eq(&self, other: &mxaccess::session::WriteHandle) -> bool
|
||||
impl core::fmt::Debug for mxaccess::session::WriteHandle
|
||||
pub fn mxaccess::session::WriteHandle::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
|
||||
impl core::hash::Hash for mxaccess::session::WriteHandle
|
||||
pub fn mxaccess::session::WriteHandle::hash<__H: core::hash::Hasher>(&self, state: &mut __H)
|
||||
impl core::marker::Copy for mxaccess::session::WriteHandle
|
||||
impl core::marker::StructuralPartialEq for mxaccess::session::WriteHandle
|
||||
impl core::marker::Freeze for mxaccess::session::WriteHandle
|
||||
impl core::marker::Send for mxaccess::session::WriteHandle
|
||||
impl core::marker::Sync for mxaccess::session::WriteHandle
|
||||
impl core::marker::Unpin for mxaccess::session::WriteHandle
|
||||
impl core::marker::UnsafeUnpin for mxaccess::session::WriteHandle
|
||||
impl core::panic::unwind_safe::RefUnwindSafe for mxaccess::session::WriteHandle
|
||||
impl core::panic::unwind_safe::UnwindSafe for mxaccess::session::WriteHandle
|
||||
pub fn mxaccess::session::filetime_to_system_time(filetime_ticks: i64) -> std::time::SystemTime
|
||||
pub fn mxaccess::session::system_time_to_filetime(time: std::time::SystemTime) -> core::result::Result<i64, mxaccess::Error>
|
||||
pub type mxaccess::session::RebuildFactory = alloc::sync::Arc<(dyn core::ops::function::Fn() -> core::pin::Pin<alloc::boxed::Box<(dyn core::future::future::Future<Output = core::result::Result<mxaccess_nmx::client::NmxClient, mxaccess_nmx::client::NmxClientError>> + core::marker::Send)>> + core::marker::Send + core::marker::Sync)>
|
||||
@@ -482,6 +508,8 @@ pub mxaccess::OperationContext::correlation_id: [u8; 16]
|
||||
pub mxaccess::OperationContext::op_kind: mxaccess::session::OperationKind
|
||||
pub mxaccess::OperationContext::reference: core::option::Option<alloc::sync::Arc<str>>
|
||||
pub mxaccess::OperationContext::retry_count: u32
|
||||
impl mxaccess::session::OperationContext
|
||||
pub fn mxaccess::session::OperationContext::new(correlation_id: [u8; 16], op_kind: mxaccess::session::OperationKind, reference: core::option::Option<alloc::sync::Arc<str>>, retry_count: u32) -> Self
|
||||
impl core::clone::Clone for mxaccess::session::OperationContext
|
||||
pub fn mxaccess::session::OperationContext::clone(&self) -> mxaccess::session::OperationContext
|
||||
impl core::fmt::Debug for mxaccess::session::OperationContext
|
||||
@@ -498,6 +526,8 @@ pub mxaccess::OperationStatus::context: core::option::Option<mxaccess::session::
|
||||
pub mxaccess::OperationStatus::is_during_recovery: bool
|
||||
pub mxaccess::OperationStatus::raw: mxaccess_codec::operation_status::NmxOperationStatusMessage
|
||||
pub mxaccess::OperationStatus::status: mxaccess_codec::status::MxStatus
|
||||
impl mxaccess::session::OperationStatus
|
||||
pub fn mxaccess::session::OperationStatus::new(raw: mxaccess_codec::operation_status::NmxOperationStatusMessage, status: mxaccess_codec::status::MxStatus, context: core::option::Option<mxaccess::session::OperationContext>, is_during_recovery: bool) -> Self
|
||||
impl core::clone::Clone for mxaccess::session::OperationStatus
|
||||
pub fn mxaccess::session::OperationStatus::clone(&self) -> mxaccess::session::OperationStatus
|
||||
impl core::fmt::Debug for mxaccess::session::OperationStatus
|
||||
@@ -556,7 +586,7 @@ pub fn mxaccess::Session::callbacks(&self) -> tokio::sync::broadcast::Receiver<a
|
||||
pub async fn mxaccess::Session::connect_nmx(addr: core::net::socket_addr::SocketAddr, options: mxaccess::SessionOptions, ntlm: mxaccess_rpc::ntlm::NtlmClientContext, service_ipid: mxaccess_rpc::guid::Guid, resolver: alloc::sync::Arc<dyn mxaccess_galaxy::resolver::Resolver>, recovery: mxaccess::RecoveryPolicy) -> core::result::Result<Self, mxaccess::Error>
|
||||
pub async fn mxaccess::Session::has_recovery_factory(&self) -> bool
|
||||
pub fn mxaccess::Session::operation_status_events(&self) -> tokio::sync::broadcast::Receiver<alloc::sync::Arc<mxaccess::session::OperationStatus>>
|
||||
pub fn mxaccess::Session::operation_status_stream(&self) -> impl futures_core::stream::Stream<Item = core::result::Result<alloc::sync::Arc<mxaccess::session::OperationStatus>, mxaccess::Error>> + core::marker::Send
|
||||
pub fn mxaccess::Session::operation_status_stream(&self) -> impl futures_core::stream::Stream<Item = core::result::Result<alloc::sync::Arc<mxaccess::session::OperationStatus>, mxaccess::Error>> + core::marker::Send + use<>
|
||||
pub async fn mxaccess::Session::read(&self, reference: &str, timeout: core::time::Duration) -> core::result::Result<mxaccess::DataChange, mxaccess::Error>
|
||||
pub async fn mxaccess::Session::recover_connection(&self, policy: mxaccess::RecoveryPolicy) -> core::result::Result<(), mxaccess::Error>
|
||||
pub fn mxaccess::Session::recovery_events(&self) -> tokio::sync::broadcast::Receiver<alloc::sync::Arc<mxaccess::RecoveryEvent>>
|
||||
@@ -568,7 +598,10 @@ pub async fn mxaccess::Session::subscribe(&self, reference: &str) -> core::resul
|
||||
pub async fn mxaccess::Session::unsubscribe(&self, subscription: mxaccess::session::Subscription) -> core::result::Result<(), mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_value(&self, reference: &str, value: mxaccess_codec::write_message::WriteValue) -> core::result::Result<(), mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_value_at(&self, reference: &str, value: mxaccess_codec::write_message::WriteValue, timestamp_filetime: i64) -> core::result::Result<(), mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_value_at_with_handle(&self, reference: &str, value: mxaccess_codec::write_message::WriteValue, timestamp_filetime: i64) -> core::result::Result<mxaccess::session::WriteHandle, mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_value_secured_at(&self, reference: &str, value: mxaccess_codec::write_message::WriteValue, timestamp_filetime: i64, security: mxaccess::SecurityContext) -> core::result::Result<(), mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_value_secured_at_with_handle(&self, reference: &str, value: mxaccess_codec::write_message::WriteValue, timestamp_filetime: i64, security: mxaccess::SecurityContext) -> core::result::Result<mxaccess::session::WriteHandle, mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_value_with_handle(&self, reference: &str, value: mxaccess_codec::write_message::WriteValue) -> core::result::Result<mxaccess::session::WriteHandle, mxaccess::Error>
|
||||
impl mxaccess::Session
|
||||
pub async fn mxaccess::Session::connect(_options: mxaccess::ConnectionOptions) -> core::result::Result<Self, mxaccess::Error>
|
||||
pub async fn mxaccess::Session::shutdown(self, timeout: core::time::Duration) -> core::result::Result<(), mxaccess::Error>
|
||||
@@ -577,8 +610,11 @@ pub async fn mxaccess::Session::subscribe_many(&self, _references: &[&str]) -> c
|
||||
pub async fn mxaccess::Session::write(&self, reference: &str, value: mxaccess_codec::value::MxValue) -> core::result::Result<(), mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_secured(&self, _reference: &str, _value: mxaccess_codec::value::MxValue, _security: mxaccess::SecurityContext) -> core::result::Result<(), mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_secured_at(&self, reference: &str, value: mxaccess_codec::value::MxValue, timestamp: std::time::SystemTime, security: mxaccess::SecurityContext) -> core::result::Result<(), mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_secured_at_with_handle(&self, reference: &str, value: mxaccess_codec::value::MxValue, timestamp: std::time::SystemTime, security: mxaccess::SecurityContext) -> core::result::Result<mxaccess::session::WriteHandle, mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_with_completion(&self, _reference: &str, _value: mxaccess_codec::value::MxValue, _client_token: u32) -> core::result::Result<(), mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_with_handle(&self, reference: &str, value: mxaccess_codec::value::MxValue) -> core::result::Result<mxaccess::session::WriteHandle, mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_with_timestamp(&self, reference: &str, value: mxaccess_codec::value::MxValue, timestamp: std::time::SystemTime) -> core::result::Result<(), mxaccess::Error>
|
||||
pub async fn mxaccess::Session::write_with_timestamp_and_handle(&self, reference: &str, value: mxaccess_codec::value::MxValue, timestamp: std::time::SystemTime) -> core::result::Result<mxaccess::session::WriteHandle, mxaccess::Error>
|
||||
impl core::clone::Clone for mxaccess::Session
|
||||
pub fn mxaccess::Session::clone(&self) -> mxaccess::Session
|
||||
impl core::fmt::Debug for mxaccess::Session
|
||||
@@ -653,6 +689,26 @@ impl core::marker::Unpin for mxaccess::TransportCapabilities
|
||||
impl core::marker::UnsafeUnpin for mxaccess::TransportCapabilities
|
||||
impl core::panic::unwind_safe::RefUnwindSafe for mxaccess::TransportCapabilities
|
||||
impl core::panic::unwind_safe::UnwindSafe for mxaccess::TransportCapabilities
|
||||
#[non_exhaustive] pub struct mxaccess::WriteHandle
|
||||
pub mxaccess::WriteHandle::correlation_id: [u8; 16]
|
||||
impl core::clone::Clone for mxaccess::session::WriteHandle
|
||||
pub fn mxaccess::session::WriteHandle::clone(&self) -> mxaccess::session::WriteHandle
|
||||
impl core::cmp::Eq for mxaccess::session::WriteHandle
|
||||
impl core::cmp::PartialEq for mxaccess::session::WriteHandle
|
||||
pub fn mxaccess::session::WriteHandle::eq(&self, other: &mxaccess::session::WriteHandle) -> bool
|
||||
impl core::fmt::Debug for mxaccess::session::WriteHandle
|
||||
pub fn mxaccess::session::WriteHandle::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
|
||||
impl core::hash::Hash for mxaccess::session::WriteHandle
|
||||
pub fn mxaccess::session::WriteHandle::hash<__H: core::hash::Hasher>(&self, state: &mut __H)
|
||||
impl core::marker::Copy for mxaccess::session::WriteHandle
|
||||
impl core::marker::StructuralPartialEq for mxaccess::session::WriteHandle
|
||||
impl core::marker::Freeze for mxaccess::session::WriteHandle
|
||||
impl core::marker::Send for mxaccess::session::WriteHandle
|
||||
impl core::marker::Sync for mxaccess::session::WriteHandle
|
||||
impl core::marker::Unpin for mxaccess::session::WriteHandle
|
||||
impl core::marker::UnsafeUnpin for mxaccess::session::WriteHandle
|
||||
impl core::panic::unwind_safe::RefUnwindSafe for mxaccess::session::WriteHandle
|
||||
impl core::panic::unwind_safe::UnwindSafe for mxaccess::session::WriteHandle
|
||||
pub trait mxaccess::Transport: core::marker::Send + core::marker::Sync + 'static
|
||||
pub fn mxaccess::Transport::capabilities(&self) -> mxaccess::TransportCapabilities
|
||||
pub fn mxaccess::Transport::kind(&self) -> mxaccess::TransportKind
|
||||
|
||||
Reference in New Issue
Block a user