Files
mxaccessgw/docs/ImplementationPlanClients.md
T
Joseph Doherty dc9c0c950c rename: prefix gateway projects/namespaces with ZB.MOM.WW + sln→slnx
Apply the ZB.MOM.WW. prefix to all gateway-side projects, folders,
.csproj/.sln contents, C# namespaces, using directives, generated proto
C# (csharp_namespace + checked-in generated files), InternalsVisibleTo
attributes, project-name string literals (LoadProject, .sln lookups,
worker exe paths, staticwebassets manifest), and the install/script/doc
references that point at any of the above. Migrate the solution from
.sln to .slnx via `dotnet sln migrate` and delete the old file.

External-runtime identifiers are intentionally NOT prefixed so external
configuration keeps working:
- GatewayMetrics.cs MeterName ("MxGateway.Server")
- DashboardAuthenticationDefaults Scheme/Policy ("MxGateway.Dashboard")
- GatewayRequestLoggingMiddleware logger category ("MxGateway.Request")
- StaRuntime thread name ("MxGateway.Worker.STA")
- appsettings.json root section "MxGateway" + env-var prefix
  MxGateway__... and secret-name MxGateway:ApiKeyPepper
- C:\ProgramData\MxGateway\ data dir paths

Also fixes two tests that were not rename-related but became visible
while validating the rename:

- WorkerLiveMxAccessSmokeTests.ShutDownAsync: cancellation that the
  gateway service correctly maps to RpcException(Cancelled) per gRPC
  convention was being misclassified as a stream fault. Added a sibling
  catch on RpcException with StatusCode.Cancelled.

- IntegrationTestEnvironment.ResolveRepositoryRoot: extracted IsRepositoryRoot
  and made it accept either a .git marker OR a .sln/.slnx next to src/
  so the worker-exe walker works in non-git working copies.

clients/proto/proto-inputs.json's protoRoot updated to point at
src/ZB.MOM.WW.MxGateway.Contracts/Protos.

Verified by `dotnet build` and a full `dotnet test` of the .slnx with
MXGATEWAY_RUN_LIVE_{MXACCESS,LDAP,GALAXY}_TESTS=1:
  Tests: 472/472 pass
  Worker.Tests: 280/280 pass (4 dev-rig [Fact(Skip=...)] skipped)
  IntegrationTests: 18/18 pass

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 16:22:23 -04:00

9.0 KiB

Client Libraries Implementation Plan

This plan implements the official gRPC clients after the gateway and worker first slice is stable enough to generate contracts and run smoke tests.

Primary designs:

  • docs/ClientLibrariesDesign.md
  • clients/dotnet/DotnetClientDesign.md
  • clients/go/GoClientDesign.md
  • clients/rust/RustClientDesign.md
  • clients/python/PythonClientDesign.md
  • clients/java/JavaClientDesign.md
  • docs/ToolchainLinks.md

Shared Milestone: client-contracts-and-fixtures

Goal: make client implementations consistent across languages.

Issue: Publish Stable Client Proto Generation Inputs

Labels: area:contracts, type:feature, priority:p0

Deliverables:

  • finalized v1 .proto files,
  • Buf config if used,
  • generation documentation for all languages,
  • generated-code output directories,
  • golden protobuf payload fixtures.

Acceptance criteria:

  • C#, Go, Rust, Python, and Java generated code can be regenerated,
  • generated code is not hand-edited,
  • protocol version is visible to clients.

Issue: Create Cross-Language Client Behavior Fixtures

Labels: area:tests, type:test, priority:p0

Deliverables:

  • JSON fixtures for command replies,
  • JSON fixtures for event stream samples,
  • value conversion fixtures,
  • status conversion fixtures,
  • auth error fixtures,
  • timeout/cancel expected behavior notes.

Acceptance criteria:

  • every language can use the same fixture set,
  • fixtures include raw fallback values,
  • fixtures include MXAccess status arrays and HRESULT.

Milestone: clients-dotnet

Goal: implement the .NET 10 C# client library, test CLI, and tests.

Issue: Scaffold .NET Client Projects

Labels: area:client-dotnet, type:infra, priority:p0

Deliverables:

  • clients/dotnet/ZB.MOM.WW.MxGateway.Client,
  • clients/dotnet/ZB.MOM.WW.MxGateway.Client.Cli,
  • clients/dotnet/ZB.MOM.WW.MxGateway.Client.Tests,
  • optional integration test project,
  • generated protobuf setup.

Acceptance criteria:

  • dotnet build succeeds,
  • generated gRPC client code compiles,
  • empty tests run.

Issue: Implement .NET GatewayClient And Session

Labels: area:client-dotnet, type:feature, priority:p0

Deliverables:

  • MxGatewayClientOptions,
  • MxGatewayClient,
  • MxGatewaySession,
  • raw OpenSession, CloseSession, Invoke, StreamEvents,
  • helpers for Register, AddItem, AddItem2, Advise, Write.

Acceptance criteria:

  • API key metadata is attached,
  • cancellation token flows to every call,
  • raw replies remain accessible,
  • session close is explicit and idempotent.

Tests:

  • fake gRPC service,
  • helper request construction,
  • cancellation.

Issue: Implement .NET Values, Status, Errors, And CLI

Labels: area:client-dotnet, type:feature, priority:p1

Deliverables:

  • MxValue helper conversions,
  • status proxy helpers,
  • typed exceptions,
  • EnsureProtocolSuccess,
  • EnsureMxAccessSuccess,
  • CLI commands: version, ping, open-session, close-session, register, add-item, advise, stream-events, write, write2, smoke,
  • JSON CLI output.

Acceptance criteria:

  • scalar and array conversions pass fixtures,
  • status arrays are preserved,
  • API keys are redacted,
  • smoke command closes session in finally.

Milestone: clients-go

Goal: implement the Go module, test CLI, and tests.

Issue: Scaffold Go Module

Labels: area:client-go, type:infra, priority:p0

Deliverables:

  • clients/go/go.mod,
  • generated protobuf package,
  • mxgateway package,
  • cmd/mxgw-go,
  • unit test structure.

Acceptance criteria:

  • go test ./... runs,
  • generated code compiles,
  • module path is stable.

Issue: Implement Go Client, Session, Values, Errors, And CLI

Labels: area:client-go, type:feature, priority:p0

Deliverables:

  • Dial(ctx, Options),
  • auth interceptors,
  • TLS/plaintext setup,
  • Client.OpenSession,
  • Session helpers,
  • event channel receive loop,
  • value conversion helpers,
  • typed errors with errors.As,
  • CLI commands and JSON output.

Acceptance criteria:

  • auth metadata on unary and streams,
  • context cancellation stops calls,
  • event channel closes exactly once,
  • raw protobuf access remains available,
  • fixture conversions pass,
  • CLI redacts API key.

Tests:

  • bufconn fake service,
  • auth metadata,
  • stream cancellation,
  • conversion fixtures,
  • CLI parser/output.

Milestone: clients-rust

Goal: implement the Rust tonic client crate, test CLI, and tests.

Issue: Scaffold Rust Workspace

Labels: area:client-rust, type:infra, priority:p0

Deliverables:

  • clients/rust/Cargo.toml,
  • client crate,
  • CLI crate,
  • build.rs protobuf generation,
  • generated module organization.

Acceptance criteria:

  • cargo test runs,
  • generated code compiles,
  • MSVC linker works.

Issue: Implement Rust Client, Session, Values, Errors, And CLI

Labels: area:client-rust, type:feature, priority:p0

Deliverables:

  • ClientOptions,
  • GatewayClient::connect,
  • auth interceptor,
  • TLS/plaintext channel,
  • session helpers,
  • event stream as Stream<Item = Result<MxEvent, Error>>,
  • thiserror error model,
  • conversion helpers,
  • clap CLI,
  • JSON output with serde_json.

Acceptance criteria:

  • metadata includes bearer key,
  • dropped stream cancels underlying stream,
  • raw generated client remains reachable where needed,
  • fixture tests pass,
  • command errors keep raw reply,
  • API key is redacted from debug output.

Tests:

  • fake tonic server,
  • auth tests,
  • stream order/cancel,
  • conversion fixtures,
  • CLI parser/output.

Milestone: clients-python

Goal: implement the async Python client package, test CLI, and tests.

Issue: Scaffold Python Package

Labels: area:client-python, type:infra, priority:p0

Deliverables:

  • clients/python/pyproject.toml,
  • src/mxgateway,
  • generated protobuf modules,
  • src/mxgateway_cli,
  • tests.

Acceptance criteria:

  • package installs editable,
  • generated stubs import,
  • pytest runs.

Issue: Implement Python Async Client, Values, Errors, And CLI

Labels: area:client-python, type:feature, priority:p0

Deliverables:

  • async GatewayClient,
  • async Session,
  • auth metadata helper,
  • TLS/plaintext setup,
  • async event iterator,
  • method helpers,
  • value conversion helpers,
  • typed exceptions,
  • click or typer CLI,
  • JSON output.

Acceptance criteria:

  • API key metadata included,
  • async cancellation cancels stream/call,
  • raw protobuf replies available,
  • fixture conversions pass,
  • secrets redacted.

Tests:

  • fake async stub tests,
  • metadata tests,
  • cancellation tests,
  • conversion fixtures,
  • CLI parser/output.

Milestone: clients-java

Goal: implement Java client library, CLI, and tests.

Issue: Scaffold Java Gradle Build

Labels: area:client-java, type:infra, priority:p0

Deliverables:

  • clients/java/settings.gradle,
  • mxgateway-client project,
  • mxgateway-cli project,
  • protobuf/gRPC Gradle generation,
  • JUnit test setup.

Acceptance criteria:

  • gradle test runs,
  • generated code compiles,
  • Java 21 toolchain used.

Issue: Implement Java Client, Session, Values, Errors, And CLI

Labels: area:client-java, type:feature, priority:p0

Deliverables:

  • MxGatewayClientOptions,
  • MxGatewayClient,
  • MxGatewaySession,
  • auth interceptor,
  • plaintext/TLS channels,
  • blocking and async event stream options,
  • method helpers,
  • value conversion helpers,
  • typed exceptions,
  • picocli CLI,
  • JSON output.

Acceptance criteria:

  • unary and streaming calls carry auth metadata,
  • deadlines are applied,
  • stream cancellation works,
  • raw generated messages are accessible,
  • fixture tests pass,
  • CLI redacts secrets.

Tests:

  • in-process gRPC tests,
  • auth interceptor,
  • stream cancellation,
  • conversion fixtures,
  • CLI parser/output.

Milestone: integration-and-parity

Goal: prove clients can talk to the gateway consistently.

Issue: Cross-Language Smoke Test Matrix

Labels: area:tests, type:test, priority:p1

Deliverables:

  • common smoke script or documented commands,
  • each client runs open/register/add/advise/stream/close,
  • JSON output comparison,
  • optional write test.

Acceptance criteria:

  • each client has equivalent smoke behavior,
  • each client skips integration unless MXGATEWAY_INTEGRATION=1,
  • failed smoke output includes endpoint, language, and redacted auth context.

Issue: Client Packaging Documentation

Labels: area:docs, type:docs, priority:p2

Deliverables:

  • install instructions per client,
  • generation instructions,
  • CLI usage examples,
  • TLS/API key examples,
  • integration test instructions.

Acceptance criteria:

  • new developer can build each client from a clean checkout using docs/ToolchainLinks.md,
  • generated code command is documented for every language.