Skip to content

Release v0.1.1 - #2

Merged
jhogendorn merged 14 commits into
mainfrom
release/v0.1.1
Jun 3, 2026
Merged

Release v0.1.1#2
jhogendorn merged 14 commits into
mainfrom
release/v0.1.1

Conversation

@jhogendorn

Copy link
Copy Markdown
Contributor

Release onvif-server 0.1.1 — a documentation + release-tooling release; no runtime behavior changes. (soap-server 0.1.1 is already live on crates.io.)

Merging this PR fires release.yml: tag v0.1.1, GitHub release, and publish to crates.io via Trusted Publishing.

Highlights (see CHANGELOG [0.1.1])

Documentation

  • New Operation Coverage matrix — every routed op classified framework/trait/static/absent + default behaviour (the authoritative "will my client work?").
  • New Capabilities & Limitations, Conformance, and Client Setup (Frigate, Home Assistant, ODM, python-onvif-zeep, VLC) pages.
  • Quick Start replaced the empty-trait MyCamera with a minimal usable device (examples/minimal_device.rs) + no-credentials curl smoke test.
  • Services rewritten as an implementable per-service guide; WS-Security gained the clock-sync handshake + UsernameToken/fault examples; WS-Discovery gained deployment hazards.
  • Corrected discovery UUID + Hello/ProbeMatch claims to match the code; stale docs/DESIGN.mddocs/historical-design.md + banner.

Metadata

  • License now (MIT OR Apache-2.0) AND LicenseRef-ONVIF — the bundled wsdl/** are official ONVIF spec docs under the ONVIF license (LICENSE-ONVIF shipped).
  • Crate description de-"spec-compliant"-ed to "Profile S streaming-core".

Gates (local, green)

fmt · clippy --all-targets --all-features -D warnings · RUSTDOCFLAGS=-D warnings cargo doc --workspace · cargo test --workspace --all-features · mdbook build · examples build.

jhogendorn and others added 14 commits June 3, 2026 17:52
Repos + Pages are live, so point the README "User guide" link directly at
the rendered mdBook (navistau.github.io/<crate>/) instead of the
"...once the repo is public" placeholder. Add git-repository-url to book.toml
so the published book links back to the repo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Documentation-only release: README user-guide links now point at the live
GitHub Pages mdBook; book gains a repository link. First release via crates.io
Trusted Publishing (validates the automated release pipeline).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- rustdoc: qualify intra-doc links in RotatingNonceCache (crate::SoapService,
  crate::validate_username_token) so `cargo doc` passes under -D warnings.
- docs: remove ALL hardcoded version/MSRV literals from install docs — install
  uses `cargo add`; crate version + MSRV shown via auto-updating crates.io
  badges. Nothing to grep/bump per release. (MSRV docs had wrongly said 1.88.0;
  actual rust-version is 1.85.1.) User-guide links point at the live mdBook.
- ci: deny rustdoc warnings in docs.yml; clippy --all-features in ci.yml; align
  CONTRIBUTING to the actual gates.
- crossref README: distinguish harness/Docker Rust 1.88 from crate MSRV 1.85.1.
- onvif Cargo.toml: clarify the soap-server caret dep + version-agnostic order.
- changelog: restore the [0.1.1] header.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The field and accessor rustdoc claimed the discovery UUID, when unset,
is a stable UUID-v5 derived from the advertised host. The code uses
Uuid::new_v4() (random, generated once at builder creation). Rewrite the
docs to state the actual behaviour: random v4, fixed for the process
lifetime (stable across discovery cycles, NOT across restarts) unless a
fixed UUID is supplied via discovery_uuid(). README already correct.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DESIGN.md was a pre-implementation planning note (onvif-rs/yaserde deps,
typed per-operation trait signatures, a .device_info(...) builder) that
never matched the shipped crate's handler-trait-over-soap-server API.
Rename to docs/historical-design.md and prepend a warning banner pointing
readers at README, the mdBook, and docs.rs. Not in the published crate; was
misleading in the public repo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The README/intro "Supported" table marked all five services Supported with
no nuance — an API teaser. Add a per-operation coverage matrix classifying
every routed operation as framework / trait (default-ok or override) /
static / absent, with its default behaviour, derived by auditing the
service handlers. Add a crate-level Capabilities & Limitations page. Point
the README and introduction tables at both, clarifying "Supported" = the
Profile S streaming core, not every operation.

Key honesty fixes surfaced by the audit: no real event delivery
(PullMessages returns empty), Media1 only, static video/encoder/PTZ-node
responses, discovery scopes hardcoded and independent of get_scopes, only
Set* op is PTZ SetPreset.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The quickstart used `impl DeviceService for MyCamera {}`, which builds but
faults on the first real request (GetDeviceInformation/GetStreamUri have no
working default). Add examples/minimal_device.rs — the smallest device a
client can actually enumerate and stream from — and use it as the quickstart
in the README, book, and crate rustdoc. Add a no-credentials curl smoke test
(GetSystemDateAndTime is auth-exempt). Verified: `cargo run --example
minimal_device` builds; lib.rs doctest compiles.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… #7)

services.md was ~40 lines of service names. Rewrite it as a how-to-implement
guide: per service, which trait methods to override, their defaults, return
types, and the real gotchas surfaced by the source audit (scopes vs discovery
scopes, advertised_host vs stream URI, PTZ -1..1 coord space + malformed-coord
safety, white-balance MANUAL emission, events being subscribable-but-silent).

ws-security.md: add the ONVIF clock-sync handshake (unauthenticated
GetSystemDateAndTime -> digest-authed calls), a concrete UsernameToken header
example, the real auth-failure fault, and a cross-link to soap-server for the
digest/replay mechanics.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
discovery.md: correct the EndpointReference UUID section (it claimed stability
across restarts while also saying random-per-build) to match code — random v4,
stable within a run, not across restarts unless set. Add a deployment-hazards
section: advertised_host must be client-routable, UDP 3702 firewalls, multicast
not crossing VLANs/subnets, multi-NIC ambiguity, discovery being optional.

clients.md (new): per-client setup for Frigate, Home Assistant, ONVIF Device
Manager, python-onvif-zeep, and VLC/RTSP — URL, auth, which ops each calls, and
crate-specific caveats (notably: HA event entities won't fire because there is
no event delivery; PTZ needs a PTZService impl).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Surface the crossref differential-conformance harness publicly: 29 scenarios,
Layer-1 in-process replay + Layer-2 Docker schema oracle (Xerces) and onvif-srvd
reference, wired as a release-green gate (29/29 verified). State plainly what a
pass means (schema-valid + reference-agreeing for covered ops) and does not
(not full Profile S certification). Link the harness README. Resolves the
forward-link from capabilities.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0.1.1 now carries the full docs maturation (operation coverage matrix,
capabilities, conformance, client guides, usable quickstart, implementable
service pages, WS-Security clock-sync) plus the discovery UUID doc fix. Expand
the [0.1.1] entry accordingly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…, headline)

- minimal_device example: banner/comment said admin/admin while auth is
  admin/password — fixed to admin/password (matches README/book/rustdoc). (R2-1)
- WS-Discovery: coverage.md + capabilities.md claimed the server sends Hello on
  start; discovery.rs only answers Probe with ProbeMatches. Corrected both. (R2-2)
- capabilities.md: advertised_host described as setting stream URIs; it sets
  XAddrs only — stream/snapshot URIs come from MediaService. Reworded. (R2-3)
- Softened "spec-compliant / fully functional / any standard ONVIF client" in
  README, introduction, and lib.rs to "Profile S streaming-core", letting the
  coverage matrix carry the exact claims. (R2-4)

Verified: fmt, workspace rustdoc -D warnings, examples build, lib doctest, mdbook.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Cargo.toml description dropped "spec-compliant" and reframed to "Profile S
  streaming-core", matching the README/book/coverage positioning (this is the
  crates.io search/card text). (R3-3)
- server.rs discovery_uuid rustdoc said "Hello/ProbeMatch"; the server does not
  send unsolicited Hello — reworded to ProbeMatch only so docs.rs matches the
  book. (R3-4)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The published crate bundles wsdl/** — verbatim official ONVIF spec docs under
the ONVIF license, not MIT/Apache. The SPDX license field describes the whole
package, so "MIT OR Apache-2.0" alone was misleading. Change to the composite
SPDX expression "(MIT OR Apache-2.0) AND LicenseRef-ONVIF": crate code stays
MIT-or-Apache, the bundled WSDLs add ONVIF terms (LICENSE-ONVIF, already
shipped + documented in the README). Verified cargo parses the expression with
no warning.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jhogendorn
jhogendorn merged commit fd6ac31 into main Jun 3, 2026
10 checks passed
@jhogendorn
jhogendorn deleted the release/v0.1.1 branch June 3, 2026 12:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant