OMG CORBAservices: Event Service v1.2 — Spec Coverage (WP COS-EventService)

Spec: OMG CORBA Event Service v1.2 — formal/04-10-02 → (October 2004, 65 pages).

Note on filename versioning: the spec-coverage filename historically carries the suffix 1.4, but the OMG-published spec is v1.2 (no 1.3 / 1.4 was ever published). The filename is kept for diff/reference stability; the spec version stated above is authoritative.

Context. The CORBA Event Service is a prerequisite for the TimerEventService from omg-time-1.1.md §2.2-§2.4 (the TimerEventService works with CosEventChannelAdmin::EventChannel push channels) and provides the event backend for the event ports in the CCM component model (see corba-3.3.md Part 3 §6.7).

Implementation:

Crate mapping:

  • §2.1 CosEventComm — crates/corba-cos-event/src/comm.rs
  • §2.3 CosEventChannelAdmin — crates/corba-cos-event/src/channel.rs
  • §2.5/§2.7 Typed Event — crates/corba-cos-event/src/typed.rs
  • §3 Lightweight Event Service — crates/corba-cos-event/src/typed.rs (lightweight)
  • CosEvent → DDS topic bridge (not an OMG item) — crates/corba-cos-event/src/dds_bridge.rs

§1 Service description

§1.1 Overview / §1.2 Event Communication / §1.3 Example Scenario

Spec: §1.1-§1.3, p. 1-1 to 1-3 — architecture overview, example.

Repo: —

Tests: —

Status: n/a (informative) — overview and example scenario.

§1.4 Design Principles / §1.5 Resolution of Technical Issues / §1.6 Quality of Service

Spec: §1.4-§1.6, p. 1-4 to 1-6 — design discussion.

Repo: —

Tests: —

Status: n/a (informative) — design principles and discussion; §1.6 explicitly sets no quality of service (“the event interfaces do not dictate qualities of service”).

§1.7 Generic Event Communication

Spec: §1.7, p. 1-7 — push/pull-model introduction (informative; normative definitions follow in §2.1).

Repo: —

Tests: —

Status: n/a (informative) — introduction; the normative definitions are in §2.1.


§2 Modules and interfaces

§2.1 The CosEventComm module

Spec: §2.1, p. 2-1 — the IDL module CosEventComm with the four base interfaces.

Repo: crates/corba-cos-event/src/comm.rs (trait definitions PushConsumer, PushSupplier, PullSupplier, PullConsumer; the helper type AnyEvent as a payload-agnostic container; the errors Disconnected and ConnectError).

Tests: crates/corba-cos-event/src/comm.rs::tests: push_increments_counter_until_disconnect, push_supplier_disconnect_terminates_the_connection, pull_supplier_try_pull_returns_the_has_event_flag, pull_consumer_disconnect_terminates_the_connection, any_event_round_trip, connect_error_variants_distinct.

Status: done

§2.1.1 The PushConsumer interface

Spec: §2.1.1 — interface PushConsumer { void push(in any data) raises (Disconnected); void disconnect_push_consumer(); };.

Repo: crates/corba-cos-event/src/comm.rs trait PushConsumer with push(&self, event: AnyEvent) -> Result<(), Disconnected> + disconnect_push_consumer(&self).

Tests: crates/corba-cos-event/src/comm.rs::tests::push_increments_counter_until_disconnect (push counts up to the disconnect, Disconnected afterwards); crates/corba-cos-event/src/channel.rs::tests::proxy_push_consumer_push_before_connect_raises_disconnected (push before connect yields Disconnected).

Status: done

§2.1.2 The PushSupplier interface

Spec: §2.1.2 — interface PushSupplier { void disconnect_push_supplier(); };.

Repo: crates/corba-cos-event/src/comm.rs trait PushSupplier; the channel-side implementation crates/corba-cos-event/src/channel.rs::ProxyPushSupplier (impl PushSupplier for ProxyPushSupplier) — the disconnect unregisters the consumer from the channel and calls its disconnect_push_consumer.

Tests: crates/corba-cos-event/src/comm.rs::tests::push_supplier_disconnect_terminates_the_connection; crates/corba-cos-event/src/channel.rs::tests::proxy_push_supplier_disconnect_stops_event_delivery (no further event reaches the consumer after the disconnect).

Status: done

§2.1.3 The PullSupplier interface

Spec: §2.1.3 — pull()/try_pull()/disconnect_pull_supplier(); pull blocks until an event is available, try_pull additionally returns the has_event flag.

Repo: crates/corba-cos-event/src/comm.rs trait PullSupplier with pull() -> Result<AnyEvent, Disconnected>, try_pull() -> Result<(AnyEvent, bool), Disconnected>, disconnect_pull_supplier().

Tests: crates/corba-cos-event/src/comm.rs::tests: pull_supplier_try_pull_returns_the_has_event_flag (flag true with the event, false with an empty any), pull_supplier_pull_returns_the_queued_event, pull_supplier_disconnect_raises_disconnected_on_both_operations.

Status: done

§2.1.4 The PullConsumer interface

Spec: §2.1.4 — disconnect_pull_consumer().

Repo: crates/corba-cos-event/src/comm.rs trait PullConsumer; the channel-side implementation crates/corba-cos-event/src/channel.rs::ProxyPullConsumer (impl PullConsumer for ProxyPullConsumer).

Tests: crates/corba-cos-event/src/comm.rs::tests::pull_consumer_disconnect_terminates_the_connection; crates/corba-cos-event/src/channel.rs::tests::proxy_pull_consumer_connect_and_disconnect_lifecycle.

Status: done

§2.1.5 Disconnection behavior

Spec: §2.1.5 — the disconnection lifecycle, Disconnected exception on a call after disconnect.

Repo: crates/corba-cos-event/src/comm.rs error type Disconnected + disconnect paths in the proxy implementations (crates/corba-cos-event/src/channel.rs).

Tests: crates/corba-cos-event/src/comm.rs::tests::disconnection_is_terminal_for_every_operation (the disconnect is terminal and idempotent; every operation reports Disconnected afterwards); crates/corba-cos-event/src/channel.rs::tests::push_unregisters_a_consumer_that_reports_disconnected (a consumer reporting Disconnected is unregistered instead of being skipped silently); crates/corba-cos-event/src/channel.rs::tests::destroy_wakes_blocked_pull_with_disconnected.

Status: done

§2.2 Event channels

Spec: §2.2, p. 2-4 — “The event channel is itself both a consumer and a supplier of the event data.” Push style (supplier pushes into the channel, the channel pushes to the consumer), pull style (the channel pulls from the supplier, the consumer pulls from the channel), mixed styles, several consumers and suppliers per channel.

Repo: crates/corba-cos-event/src/channel.rs (EventChannel, ProxyPushConsumer, ProxyPullSupplier, ProxyPullConsumer, ProxyPushSupplier).

Tests: crates/corba-cos-event/src/channel.rs::tests::push_fan_out_to_multiple_consumers, crates/corba-cos-event/src/channel.rs::tests::pull_supplier_dequeues_events, crates/corba-cos-event/src/channel.rs::tests::proxy_pull_consumer_forwards_pulled_events_into_the_channel.

Status: done

§2.3 The CosEventChannelAdmin module

Spec: §2.3, p. 2-8 — the IDL module CosEventChannelAdmin with the channel and admin/proxy interfaces.

Repo: crates/corba-cos-event/src/channel.rs (see the sub-items).

Tests: crates/corba-cos-event/src/channel.rs::tests: event_channel_admins_share_one_channel_state, consumer_admin_returns_a_fresh_proxy_per_call, supplier_admin_returns_a_fresh_proxy_per_call, push_fan_out_to_multiple_consumers, proxy_pull_consumer_forwards_pulled_events_into_the_channel.

Status: done

§2.3.1 The EventChannel interface

Spec: §2.3.1 — interface EventChannel { ConsumerAdmin for_consumers(); SupplierAdmin for_suppliers(); void destroy(); };; destroy releases the channel and disconnects the attached endpoints.

Repo: crates/corba-cos-event/src/channel.rs EventChannel with for_consumers, for_suppliers, destroy, is_destroyed.

Tests: crates/corba-cos-event/src/channel.rs::tests: event_channel_admins_share_one_channel_state (both admin views address the same channel state), destroy_disconnects_registered_consumers (destroy calls disconnect_push_consumer on every registered consumer), destroy_disconnects_proxies, destroy_wakes_blocked_pull_with_disconnected.

Status: done

§2.3.2 The ConsumerAdmin interface

Spec: §2.3.2 — obtain_push_supplier(), obtain_pull_supplier(); each call returns a proxy of its own.

Repo: crates/corba-cos-event/src/channel.rs ConsumerAdmin.

Tests: crates/corba-cos-event/src/channel.rs::tests::consumer_admin_returns_a_fresh_proxy_per_call (two calls return distinct proxies; the second one is unconnected and accepts a consumer of its own).

Status: done

§2.3.3 The SupplierAdmin interface

Spec: §2.3.3 — obtain_push_consumer(), obtain_pull_consumer(); each call returns a proxy of its own.

Repo: crates/corba-cos-event/src/channel.rs SupplierAdmin.

Tests: crates/corba-cos-event/src/channel.rs::tests::supplier_admin_returns_a_fresh_proxy_per_call.

Status: done

§2.3.4 The ProxyPushConsumer interface

Spec: §2.3.4 — connect_push_supplier() raises AlreadyConnected; a push before the connect is Disconnected.

Repo: crates/corba-cos-event/src/channel.rs ProxyPushConsumer (connect_push_supplier, impl PushConsumer).

Tests: crates/corba-cos-event/src/channel.rs::tests: proxy_push_consumer_push_before_connect_raises_disconnected, double_connect_yields_already_connected, push_fan_out_to_multiple_consumers.

Status: done

§2.3.5 The ProxyPullSupplier interface

Spec: §2.3.5 — connect_pull_consumer() raises AlreadyConnected; pull blocks until an event is available, try_pull returns the has_event flag.

Repo: crates/corba-cos-event/src/channel.rs ProxyPullSupplier (connect_pull_consumer, impl PullSupplier; the blocking pull waits on the Condvar ChannelInner::ready rather than in a poll loop).

Tests: crates/corba-cos-event/src/channel.rs::tests: proxy_pull_supplier_try_pull_reports_has_event_flag, proxy_pull_supplier_pull_blocks_until_an_event_arrives (the call returns only after a supplier has pushed), proxy_pull_supplier_double_connect_yields_already_connected, pull_supplier_dequeues_events, pull_supplier_disconnect_propagates.

Status: done

§2.3.6 The ProxyPullConsumer interface

Spec: §2.3.6 — connect_pull_supplier() raises AlreadyConnected; inherited disconnect_pull_consumer().

Repo: crates/corba-cos-event/src/channel.rs ProxyPullConsumer with connect_pull_supplier, forward_event as the push path into the channel, and impl PullConsumer for the disconnect.

Tests: crates/corba-cos-event/src/channel.rs::tests: proxy_pull_consumer_forwards_pulled_events_into_the_channel (the events pulled from the supplier show up on the consumer side of the channel), proxy_pull_consumer_connect_and_disconnect_lifecycle.

Status: done

§2.3.7 The ProxyPushSupplier interface

Spec: §2.3.7 — connect_push_consumer() raises AlreadyConnected; disconnect_push_supplier() terminates the connection.

Repo: crates/corba-cos-event/src/channel.rs ProxyPushSupplier with connect_push_consumer, is_connected, and impl PushSupplier (disconnect_push_supplier).

Tests: crates/corba-cos-event/src/channel.rs::tests: proxy_push_supplier_double_connect_yields_already_connected, proxy_push_supplier_disconnect_stops_event_delivery.

Status: done

§2.4 Typed event communication

Spec: §2.4, pp. 2-12 to 2-13 — typed push: the supplier calls operations of the agreed interface I on the consumer. Typed pull: for every interface I, Pull<I> is defined, “For every operation o in I, Pull contains two operations”: pull_o (blocks, returns the event data as out parameters) and boolean try_o.

Repo: crates/corba-cos-event/src/typed.rs (TypedInvocation, TypedPushConsumer::invoke, TypedPullSupplier::pull/try_pull).

Tests: crates/corba-cos-event/src/typed.rs::tests::typed_push_consumer_invoke_carries_operation_and_args, crates/corba-cos-event/src/typed.rs::tests::pull_supplier_try_pull_returns_queued_event.

Status: partial — typed push (operation name and arguments reach the consumer) and typed pull in generic form (TypedInvocation) are implemented; the derived interface Pull<I> is missing, own item.

§2.4.2 Derived interface Pull

Spec: §2.4.2, p. 2-13 — for every operation o of I, Pull<I> contains the operations pull_o (all in parameters become out parameters; blocks until an o-event is available) and boolean try_o (returns false when no o-event is available).

Repo: —

Tests: —

Status: open — no code generates or represents Pull<I>; TypedPullSupplier returns every operation as a generic TypedInvocation.

§2.5 The CosTypedEventComm module

Spec: §2.5, p. 2-14 — the IDL module CosTypedEventComm with TypedPushConsumer and TypedPullSupplier.

Repo: crates/corba-cos-event/src/typed.rs (TypedPushConsumer, TypedPushSupplier, TypedPullSupplier traits and the helper type TypedInvocation).

Tests: crates/corba-cos-event/src/typed.rs::tests: typed_push_consumer_invoke_carries_operation_and_args, typed_push_supplier_disconnect_terminates_the_connection, pull_supplier_try_pull_returns_queued_event.

Status: done — all three subscription patterns declared.

§2.5.1 The TypedPushConsumer interface

Spec: §2.5.1 — TypedPushConsumer : PushConsumer { Object get_typed_consumer(); };; in typed mode the channel calls the IDL operation instead of push(any).

Repo: typed.rs trait TypedPushConsumer (with a get_typed_consumer counterpart via TypedInvocation dispatch).

Tests: crates/corba-cos-event/src/typed.rs::tests: typed_push_consumer_invoke_carries_operation_and_args (operation name and encoded arguments reach the consumer, the reply travels back), typed_push_consumer_disconnect_raises_disconnected, dispatch_reaches_registered_consumers.

Status: done

§2.5.2 The TypedPullSupplier interface

Spec: §2.5.2 — TypedPullSupplier : PullSupplier { Object get_typed_supplier(); };.

Repo: crates/corba-cos-event/src/typed.rs::TypedPullSupplier trait with pull/try_pull/disconnect operations.

Tests: typed::tests::{pull_supplier_try_pull_returns_queued_event, pull_supplier_try_pull_returns_none_for_empty, pull_supplier_disconnect_returns_error}.

Status: done

§2.6 Typed event channels

Spec: §2.6, p. 2-16 — “Typed event channels […] support both typed and generic event communication. These forms can be mixed at will. […] An event supplied in typed form can be consumed in generic form, or vice versa.”

Repo: —

Tests: —

Status: open — TypedEventChannel (crates/corba-cos-event/src/typed.rs) delivers only to typed consumers; a conversion between typed and generic form is missing.

§2.7 The CosTypedEventChannelAdmin module

Spec: §2.7, p. 2-16 — the IDL module with TypedEventChannel + TypedConsumerAdmin/TypedSupplierAdmin + typed proxies.

Repo: typed.rs TypedEventChannel with for_consumers()/for_suppliers()/destroy() + separate TypedConsumerAdmin and TypedSupplierAdmin structures + the TypedPullSupplier trait for the pull-proxy path.

Tests: crates/corba-cos-event/src/typed.rs::tests: typed_event_channel_for_consumers_returns_admin, typed_event_channel_for_suppliers_returns_admin, typed_consumer_admin_register_count_roundtrip, typed_supplier_admin_try_pull_returns_first_available, destroy_disables_dispatch.

Status: done — channel + admin splits + proxies live.

§2.7.1 The TypedEventChannel interface

Spec: §2.7.1 — for_consumers/for_suppliers/destroy analogous to §2.3.1.

Repo: typed.rs::TypedEventChannel::{for_consumers, for_suppliers, destroy, is_destroyed}.

Tests: typed::tests::{typed_event_channel_for_consumers_returns_admin, typed_event_channel_for_suppliers_returns_admin, destroy_disables_dispatch}.

Status: done

§2.7.2-§2.7.5 Typed admin/proxy interfaces

Spec: §2.7.2-§2.7.5 — TypedConsumerAdmin, TypedSupplierAdmin, TypedProxyPushConsumer, TypedProxyPullSupplier.

Repo: typed.rs::{TypedConsumerAdmin, TypedSupplierAdmin} with register_consumer/register_pull_supplier/try_pull/counter operations. TypedProxyPushConsumer is covered via the existing TypedPushConsumer trait; TypedProxyPullSupplier via the new TypedPullSupplier trait.

Tests: typed::tests::{typed_consumer_admin_register_count_roundtrip, typed_supplier_admin_register_count_roundtrip, typed_supplier_admin_try_pull_returns_first_available}.

Status: done — admin/proxy split implemented.

§2.8 Composing event channels and filtering

Spec: §2.8, p. 2-20 — “one event channel can consume events supplied by another”; the ProxyPushSupplier of a typed channel for I only pushes events of I and so acts as a type filter.

Repo: crates/corba-cos-event/src/channel.rs (proxies as PushConsumer/PushSupplier), crates/corba-cos-event/src/typed.rs (TypedEventChannel::dispatch by repository ID).

Tests: crates/corba-cos-event/src/typed.rs::tests::unknown_repo_id_dispatches_to_zero, crates/corba-cos-event/src/typed.rs::tests::dispatch_reaches_registered_consumers.

Status: partial — the type filter by repository ID is tested; no test chains two channels.

§2.9 Policies for finding event channels

Spec: §2.9, p. 2-20 — naming/trader-service references for channel discovery (informative).

Repo: —

Tests: —

Status: n/a (informative) — “The Event Service does not establish a policy for finding event channels.”


§3 Lightweight Event Service

§3.1 Platform Independent Model (PIM)

§3.1.1 Overview

Spec: §3.1.1 — lightweight-profile description.

Repo: —

Tests: —

Status: n/a (informative) — frame of the Lightweight profile; the mapping is in §3.1.2 and §3.1.3.

§3.1.2 The CosLightweightEventComm package

Spec: §3.1.2 — a lightweight variant of §2.1 (no typed event, no multi-consumer, reduced API).

Repo: crates/corba-cos-event/src/typed.rs::lightweight::{PROFILE_NAME, is_lightweight} as a profile marker; the lightweight subset uses the same push path as TypedPushConsumer, without the disconnect lifecycle (via channel destroy()).

Tests: typed::tests::{lightweight_profile_names_match_spec, lightweight_is_lightweight_recognizes_both_profiles}.

Status: done

§3.1.3 The CosLightweightEventChannel package

Spec: §3.1.3 — a lightweight variant of §2.3: the channel lifecycle is the only teardown, the profile has no endpoint disconnect operation.

Repo: crates/corba-cos-event/src/typed.rs::lightweight::CHANNEL_PROFILE_NAME marker; the channel lifecycle via TypedEventChannel::destroy() without a separate ConsumerAdmin/SupplierAdmin sub-profile (a profile subset of §2.7.1).

Tests: crates/corba-cos-event/src/typed.rs::tests::lightweight_channel_destroy_is_the_only_teardown (a consumer without a disconnect of its own receives no dispatches after destroy()); crates/corba-cos-event/src/typed.rs::tests::lightweight_profile_names_match_spec.

Status: done

§3.2 Platform Specific Model: CORBA Service

§3.2.1 Overview

Spec: §3.2.1 — PSM marker.

Repo: —

Tests: —

Status: n/a (informative) — frame of the CORBA mapping; the IDL is in §3.2.2 and §3.2.3.

§3.2.2 CosEventChannelAdmin module (PSM)

Spec: §3.2.2 — IDL PSM, identical to §2.3.

Repo: identical to §2.3 (crates/corba-cos-event/src/channel.rs).

Tests: identical to §2.3 — crates/corba-cos-event/src/channel.rs::tests: event_channel_admins_share_one_channel_state, consumer_admin_returns_a_fresh_proxy_per_call, supplier_admin_returns_a_fresh_proxy_per_call, proxy_push_consumer_push_before_connect_raises_disconnected, proxy_pull_supplier_try_pull_reports_has_event_flag, proxy_pull_consumer_forwards_pulled_events_into_the_channel, proxy_push_supplier_disconnect_stops_event_delivery.

Status: done — see §2.3.

§3.2.3 CosEventComm module (PSM)

Spec: §3.2.3 — IDL PSM, identical to §2.1.

Repo: identical to §2.1 (crates/corba-cos-event/src/comm.rs).

Tests: identical to §2.1 — crates/corba-cos-event/src/comm.rs::tests: push_increments_counter_until_disconnect, push_supplier_disconnect_terminates_the_connection, pull_supplier_try_pull_returns_the_has_event_flag, pull_supplier_pull_returns_the_queued_event, pull_consumer_disconnect_terminates_the_connection, disconnection_is_terminal_for_every_operation.

Status: done — see §2.1.


ZeroDDS-specific bridges (not an OMG item)

CosEvent → DDS-DCPS-topic bridge

Spec: not an OMG spec item; a ZeroDDS-specific migration layer that translates EventChannel push events into DDS-DCPS topics.

Repo: crates/corba-cos-event/src/dds_bridge.rs (TopicBridge as a PushConsumer on the EventChannel; TopicMap as the repository-ID ⇒ topic table with derive_topic_name as the fallback derivation for types that are not listed; TopicSink as the handover point to the caller layer’s DataWriter, which keeps the crate free of a DCPS dependency). An unresolvable repository ID and a refusing sink both raise an error and count in TopicBridge::rejected — never a silent drop.

Tests: crates/corba-cos-event/src/dds_bridge.rs::tests: derives_topic_name_from_repository_id, explicit_mapping_wins_over_derivation, push_writes_the_payload_onto_the_resolved_topic, unresolvable_repository_id_is_reported_not_dropped, sink_failure_is_reported_not_swallowed, disconnect_stops_forwarding, event_channel_fan_out_reaches_the_dds_topic (a push into the EventChannel reaches the DDS topic write).

Status: done — informative; not spec-required.


Audit status

26 done / 2 partial / 2 open / 0 blocked / 6 n/a (informative).

Open items: cos-event-service-1.4.open.en.md.

Test run: cargo test -p zerodds-corba-cos-event — 54 lib tests + 1 doc test green, 0 failed.

OMG CORBAservices: Event Service v1.2 — Spec-Coverage (WP COS-EventService)

Spec: OMG CORBA Event Service v1.2 — formal/04-10-02 → (Oktober 2004, 65 Seiten).

Hinweis Filename-Versionierung: Der Spec-Coverage-Filename trägt historisch das Suffix 1.4, die OMG-veröffentlichte Spec ist v1.2 (es gibt keine 1.3 / 1.4 publiziert). Filename bleibt aus Diff-/Referenz-Stabilität erhalten; Spec-Versionsangabe oben ist maßgeblich.

Kontext. Der CORBA Event Service ist Voraussetzung für den TimerEventService aus omg-time-1.1.md §2.2-§2.4 (TimerEventService arbeitet mit CosEventChannelAdmin::EventChannel-Push-Channels) und liefert das Event-Backend für die Event-Ports im CCM-Komponentenmodell (siehe corba-3.3.md Part 3 §6.7).

Implementation:

Crate-Mapping:

  • §2.1 CosEventComm — crates/corba-cos-event/src/comm.rs
  • §2.3 CosEventChannelAdmin — crates/corba-cos-event/src/channel.rs
  • §2.5/§2.7 Typed Event — crates/corba-cos-event/src/typed.rs
  • §3 Lightweight Event Service — crates/corba-cos-event/src/typed.rs (lightweight)
  • CosEvent → DDS-Topic-Bridge (kein OMG-Item) — crates/corba-cos-event/src/dds_bridge.rs

§1 Service Description

§1.1 Overview / §1.2 Event Communication / §1.3 Example Scenario

Spec: §1.1-§1.3, S. 1-1 bis 1-3 — Architektur-Überblick, Beispiel.

Repo: —

Tests: —

Status: n/a (informative) — Überblick und Beispielszenario.

§1.4 Design Principles / §1.5 Resolution of Technical Issues / §1.6 Quality of Service

Spec: §1.4-§1.6, S. 1-4 bis 1-6 — Design-Diskussion.

Repo: —

Tests: —

Status: n/a (informative) — Entwurfsprinzipien und Diskussion; §1.6 legt ausdrücklich keine Dienstgüte fest (“the event interfaces do not dictate qualities of service”).

§1.7 Generic Event Communication

Spec: §1.7, S. 1-7 — Push-/Pull-Modell-Einführung (informativ; normative Definitionen folgen in §2.1).

Repo: —

Tests: —

Status: n/a (informative) — Einführung; die normativen Definitionen stehen in §2.1.


§2 Modules and Interfaces

§2.1 The CosEventComm Module

Spec: §2.1, S. 2-1 — IDL-Modul CosEventComm mit den vier Basis- Interfaces.

Repo: crates/corba-cos-event/src/comm.rs (Trait-Definitionen PushConsumer, PushSupplier, PullSupplier, PullConsumer; Helper-Typ AnyEvent als payload-agnostischer Container; Error Disconnected und ConnectError).

Tests: crates/corba-cos-event/src/comm.rs::tests: push_increments_counter_until_disconnect, push_supplier_disconnect_terminates_the_connection, pull_supplier_try_pull_returns_the_has_event_flag, pull_consumer_disconnect_terminates_the_connection, any_event_round_trip, connect_error_variants_distinct.

Status: done

§2.1.1 The PushConsumer Interface

Spec: §2.1.1 — interface PushConsumer { void push(in any data) raises (Disconnected); void disconnect_push_consumer(); };.

Repo: crates/corba-cos-event/src/comm.rs Trait PushConsumer mit push(&self, event: AnyEvent) -> Result<(), Disconnected> + disconnect_push_consumer(&self).

Tests: crates/corba-cos-event/src/comm.rs::tests::push_increments_counter_until_disconnect (push zählt bis zum Disconnect, danach Disconnected); crates/corba-cos-event/src/channel.rs::tests::proxy_push_consumer_push_before_connect_raises_disconnected (push vor connect liefert Disconnected).

Status: done

§2.1.2 The PushSupplier Interface

Spec: §2.1.2 — interface PushSupplier { void disconnect_push_supplier(); };.

Repo: crates/corba-cos-event/src/comm.rs Trait PushSupplier; Channel-seitige Implementation crates/corba-cos-event/src/channel.rs::ProxyPushSupplier (impl PushSupplier for ProxyPushSupplier) — der Disconnect meldet den Consumer beim Channel ab und ruft dessen disconnect_push_consumer.

Tests: crates/corba-cos-event/src/comm.rs::tests::push_supplier_disconnect_terminates_the_connection; crates/corba-cos-event/src/channel.rs::tests::proxy_push_supplier_disconnect_stops_event_delivery (nach dem Disconnect erreicht kein weiteres Event den Consumer).

Status: done

§2.1.3 The PullSupplier Interface

Spec: §2.1.3 — pull()/try_pull()/disconnect_pull_supplier(); pull blockiert bis ein Event vorliegt, try_pull liefert zusätzlich das has_event-Flag.

Repo: crates/corba-cos-event/src/comm.rs Trait PullSupplier mit pull() -> Result<AnyEvent, Disconnected>, try_pull() -> Result<(AnyEvent, bool), Disconnected>, disconnect_pull_supplier().

Tests: crates/corba-cos-event/src/comm.rs::tests: pull_supplier_try_pull_returns_the_has_event_flag (Flag true mit Event, false mit leerem any), pull_supplier_pull_returns_the_queued_event, pull_supplier_disconnect_raises_disconnected_on_both_operations.

Status: done

§2.1.4 The PullConsumer Interface

Spec: §2.1.4 — disconnect_pull_consumer().

Repo: crates/corba-cos-event/src/comm.rs Trait PullConsumer; Channel-seitige Implementation crates/corba-cos-event/src/channel.rs::ProxyPullConsumer (impl PullConsumer for ProxyPullConsumer).

Tests: crates/corba-cos-event/src/comm.rs::tests::pull_consumer_disconnect_terminates_the_connection; crates/corba-cos-event/src/channel.rs::tests::proxy_pull_consumer_connect_and_disconnect_lifecycle.

Status: done

§2.1.5 Disconnection Behavior

Spec: §2.1.5 — Disconnection-Lifecycle, Disconnected-Exception beim Aufruf nach disconnect.

Repo: crates/corba-cos-event/src/comm.rs Error-Typ Disconnected + Disconnect-Pfade in den Proxy-Implementations (crates/corba-cos-event/src/channel.rs).

Tests: crates/corba-cos-event/src/comm.rs::tests::disconnection_is_terminal_for_every_operation (Disconnect ist terminal und idempotent, jede Operation meldet danach Disconnected); crates/corba-cos-event/src/channel.rs::tests::push_unregisters_a_consumer_that_reports_disconnected (ein Consumer, der Disconnected meldet, wird abgemeldet statt still übergangen); crates/corba-cos-event/src/channel.rs::tests::destroy_wakes_blocked_pull_with_disconnected.

Status: done

§2.2 Event Channels

Spec: §2.2, S. 2-4 — “The event channel is itself both a consumer and a supplier of the event data.” Push-Stil (Supplier pusht in den Kanal, der Kanal pusht zum Consumer), Pull-Stil (der Kanal pullt vom Supplier, der Consumer pullt vom Kanal), gemischte Stile, mehrere Consumer und Supplier je Kanal.

Repo: crates/corba-cos-event/src/channel.rs (EventChannel, ProxyPushConsumer, ProxyPullSupplier, ProxyPullConsumer, ProxyPushSupplier).

Tests: crates/corba-cos-event/src/channel.rs::tests::push_fan_out_to_multiple_consumers, crates/corba-cos-event/src/channel.rs::tests::pull_supplier_dequeues_events, crates/corba-cos-event/src/channel.rs::tests::proxy_pull_consumer_forwards_pulled_events_into_the_channel.

Status: done

§2.3 The CosEventChannelAdmin Module

Spec: §2.3, S. 2-8 — IDL-Modul CosEventChannelAdmin mit Channel- und Admin-/Proxy-Interfaces.

Repo: crates/corba-cos-event/src/channel.rs (siehe Sub-Items).

Tests: crates/corba-cos-event/src/channel.rs::tests: event_channel_admins_share_one_channel_state, consumer_admin_returns_a_fresh_proxy_per_call, supplier_admin_returns_a_fresh_proxy_per_call, push_fan_out_to_multiple_consumers, proxy_pull_consumer_forwards_pulled_events_into_the_channel.

Status: done

§2.3.1 The EventChannel Interface

Spec: §2.3.1 — interface EventChannel { ConsumerAdmin for_consumers(); SupplierAdmin for_suppliers(); void destroy(); };; destroy gibt den Channel frei und löst die verbundenen Endpunkte.

Repo: crates/corba-cos-event/src/channel.rs EventChannel mit for_consumers, for_suppliers, destroy, is_destroyed.

Tests: crates/corba-cos-event/src/channel.rs::tests: event_channel_admins_share_one_channel_state (beide Admin-Sichten adressieren denselben Channel-State), destroy_disconnects_registered_consumers (destroy ruft disconnect_push_consumer auf jedem registrierten Consumer), destroy_disconnects_proxies, destroy_wakes_blocked_pull_with_disconnected.

Status: done

§2.3.2 The ConsumerAdmin Interface

Spec: §2.3.2 — obtain_push_supplier(), obtain_pull_supplier(); jeder Aufruf liefert einen eigenen Proxy.

Repo: crates/corba-cos-event/src/channel.rs ConsumerAdmin.

Tests: crates/corba-cos-event/src/channel.rs::tests::consumer_admin_returns_a_fresh_proxy_per_call (zwei Aufrufe liefern verschiedene Proxies; der zweite ist unverbunden und nimmt seinen eigenen Consumer an).

Status: done

§2.3.3 The SupplierAdmin Interface

Spec: §2.3.3 — obtain_push_consumer(), obtain_pull_consumer(); jeder Aufruf liefert einen eigenen Proxy.

Repo: crates/corba-cos-event/src/channel.rs SupplierAdmin.

Tests: crates/corba-cos-event/src/channel.rs::tests::supplier_admin_returns_a_fresh_proxy_per_call.

Status: done

§2.3.4 The ProxyPushConsumer Interface

Spec: §2.3.4 — connect_push_supplier() raises AlreadyConnected; push vor dem Connect ist Disconnected.

Repo: crates/corba-cos-event/src/channel.rs ProxyPushConsumer (connect_push_supplier, impl PushConsumer).

Tests: crates/corba-cos-event/src/channel.rs::tests: proxy_push_consumer_push_before_connect_raises_disconnected, double_connect_yields_already_connected, push_fan_out_to_multiple_consumers.

Status: done

§2.3.5 The ProxyPullSupplier Interface

Spec: §2.3.5 — connect_pull_consumer() raises AlreadyConnected; pull blockiert bis ein Event vorliegt, try_pull liefert das has_event-Flag.

Repo: crates/corba-cos-event/src/channel.rs ProxyPullSupplier (connect_pull_consumer, impl PullSupplier; das blockierende pull wartet auf der Condvar ChannelInner::ready, nicht in einer Poll-Schleife).

Tests: crates/corba-cos-event/src/channel.rs::tests: proxy_pull_supplier_try_pull_reports_has_event_flag, proxy_pull_supplier_pull_blocks_until_an_event_arrives (der Aufruf kehrt erst zurück, nachdem ein Supplier gepusht hat), proxy_pull_supplier_double_connect_yields_already_connected, pull_supplier_dequeues_events, pull_supplier_disconnect_propagates.

Status: done

§2.3.6 The ProxyPullConsumer Interface

Spec: §2.3.6 — connect_pull_supplier() raises AlreadyConnected; geerbtes disconnect_pull_consumer().

Repo: crates/corba-cos-event/src/channel.rs ProxyPullConsumer mit connect_pull_supplier, forward_event als Push-Pfad in den Channel und impl PullConsumer für den Disconnect.

Tests: crates/corba-cos-event/src/channel.rs::tests: proxy_pull_consumer_forwards_pulled_events_into_the_channel (die vom Supplier gezogenen Events erscheinen auf der Consumer-Seite des Channels), proxy_pull_consumer_connect_and_disconnect_lifecycle.

Status: done

§2.3.7 The ProxyPushSupplier Interface

Spec: §2.3.7 — connect_push_consumer() raises AlreadyConnected; disconnect_push_supplier() beendet die Verbindung.

Repo: crates/corba-cos-event/src/channel.rs ProxyPushSupplier mit connect_push_consumer, is_connected und impl PushSupplier (disconnect_push_supplier).

Tests: crates/corba-cos-event/src/channel.rs::tests: proxy_push_supplier_double_connect_yields_already_connected, proxy_push_supplier_disconnect_stops_event_delivery.

Status: done

§2.4 Typed Event Communication

Spec: §2.4, S. 2-12 bis 2-13 — Typed Push: der Supplier ruft Operationen der vereinbarten Schnittstelle I am Consumer auf. Typed Pull: zu jeder Schnittstelle I ist Pull<I> definiert, “For every operation o in I, Pull contains two operations”: pull_o (blockiert, liefert die Ereignisdaten als out-Parameter) und boolean try_o.

Repo: crates/corba-cos-event/src/typed.rs (TypedInvocation, TypedPushConsumer::invoke, TypedPullSupplier::pull/try_pull).

Tests: crates/corba-cos-event/src/typed.rs::tests::typed_push_consumer_invoke_carries_operation_and_args, crates/corba-cos-event/src/typed.rs::tests::pull_supplier_try_pull_returns_queued_event.

Status: partial — Typed Push (Operationsname und Argumente erreichen den Consumer) und Typed Pull in generischer Form (TypedInvocation) sind umgesetzt; es fehlt die abgeleitete Schnittstelle Pull<I>, eigenes Item.

§2.4.2 Abgeleitete Schnittstelle Pull

Spec: §2.4.2, S. 2-13 — zu jeder Operation o von I enthält Pull<I> die Operationen pull_o (alle in-Parameter werden out-Parameter; blockiert, bis ein o-Ereignis vorliegt) und boolean try_o (liefert false, wenn kein o-Ereignis vorliegt).

Repo: —

Tests: —

Status: open — kein Code erzeugt oder bildet Pull<I> ab; TypedPullSupplier liefert jede Operation als generisches TypedInvocation.

§2.5 The CosTypedEventComm Module

Spec: §2.5, S. 2-14 — IDL-Modul CosTypedEventComm mit TypedPushConsumer und TypedPullSupplier.

Repo: crates/corba-cos-event/src/typed.rs (TypedPushConsumer, TypedPushSupplier, TypedPullSupplier-Traits und Helper-Typ TypedInvocation).

Tests: crates/corba-cos-event/src/typed.rs::tests: typed_push_consumer_invoke_carries_operation_and_args, typed_push_supplier_disconnect_terminates_the_connection, pull_supplier_try_pull_returns_queued_event.

Status: done — alle drei Subscription-Patterns ausgewiesen.

§2.5.1 The TypedPushConsumer Interface

Spec: §2.5.1 — TypedPushConsumer : PushConsumer { Object get_typed_consumer(); };; im Typed-Modus ruft der Channel die IDL-Operation statt push(any).

Repo: typed.rs Trait TypedPushConsumer (mit get_typed_consumer-Pendant via TypedInvocation-Dispatch).

Tests: crates/corba-cos-event/src/typed.rs::tests: typed_push_consumer_invoke_carries_operation_and_args (Operations-Name und kodierte Argumente erreichen den Consumer, die Antwort geht zurück), typed_push_consumer_disconnect_raises_disconnected, dispatch_reaches_registered_consumers.

Status: done

§2.5.2 The TypedPullSupplier Interface

Spec: §2.5.2 — TypedPullSupplier : PullSupplier { Object get_typed_supplier(); };.

Repo: crates/corba-cos-event/src/typed.rs::TypedPullSupplier Trait mit pull/try_pull/disconnect Operations.

Tests: typed::tests::{pull_supplier_try_pull_returns_queued_event, pull_supplier_try_pull_returns_none_for_empty, pull_supplier_disconnect_returns_error}.

Status: done

§2.6 Typed Event Channels

Spec: §2.6, S. 2-16 — “Typed event channels […] support both typed and generic event communication. These forms can be mixed at will. […] An event supplied in typed form can be consumed in generic form, or vice versa.”

Repo: —

Tests: —

Status: open — TypedEventChannel (crates/corba-cos-event/src/typed.rs) stellt nur an typisierte Consumer zu; eine Umsetzung zwischen typisierter und generischer Form fehlt.

§2.7 The CosTypedEventChannelAdmin Module

Spec: §2.7, S. 2-16 — IDL-Modul mit TypedEventChannel + TypedConsumerAdmin/TypedSupplierAdmin + Typed-Proxies.

Repo: typed.rs TypedEventChannel mit for_consumers()/ for_suppliers()/destroy() + getrennte TypedConsumerAdmin und TypedSupplierAdmin Strukturen + TypedPullSupplier-Trait für den Pull-Proxy-Pfad.

Tests: crates/corba-cos-event/src/typed.rs::tests: typed_event_channel_for_consumers_returns_admin, typed_event_channel_for_suppliers_returns_admin, typed_consumer_admin_register_count_roundtrip, typed_supplier_admin_try_pull_returns_first_available, destroy_disables_dispatch.

Status: done — Channel + Admin-Splits + Proxies live.

§2.7.1 The TypedEventChannel Interface

Spec: §2.7.1 — for_consumers/for_suppliers/destroy analog §2.3.1.

Repo: typed.rs::TypedEventChannel::{for_consumers, for_suppliers, destroy, is_destroyed}.

Tests: typed::tests::{typed_event_channel_for_consumers_returns_admin, typed_event_channel_for_suppliers_returns_admin, destroy_disables_dispatch}.

Status: done

§2.7.2-§2.7.5 Typed Admin/Proxy Interfaces

Spec: §2.7.2-§2.7.5 — TypedConsumerAdmin, TypedSupplierAdmin, TypedProxyPushConsumer, TypedProxyPullSupplier.

Repo: typed.rs::{TypedConsumerAdmin, TypedSupplierAdmin} mit register_consumer/register_pull_supplier/try_pull/Counter- Operationen. TypedProxyPushConsumer ist via existierender TypedPushConsumer-Trait abgedeckt; TypedProxyPullSupplier über den neuen TypedPullSupplier-Trait.

Tests: typed::tests::{typed_consumer_admin_register_count_roundtrip, typed_supplier_admin_register_count_roundtrip, typed_supplier_admin_try_pull_returns_first_available}.

Status: done — Admin-/Proxy-Split implementiert.

§2.8 Composing Event Channels and Filtering

Spec: §2.8, S. 2-20 — “one event channel can consume events supplied by another”; der ProxyPushSupplier eines typisierten Kanals für I pusht nur Ereignisse zu I und wirkt damit als Typfilter.

Repo: crates/corba-cos-event/src/channel.rs (Proxies als PushConsumer/PushSupplier), crates/corba-cos-event/src/typed.rs (TypedEventChannel::dispatch nach Repository-ID).

Tests: crates/corba-cos-event/src/typed.rs::tests::unknown_repo_id_dispatches_to_zero, crates/corba-cos-event/src/typed.rs::tests::dispatch_reaches_registered_consumers.

Status: partial — der Typfilter nach Repository-ID ist getestet; kein Test verkettet zwei Kanäle.

§2.9 Policies for Finding Event Channels

Spec: §2.9, S. 2-20 — Naming-/Trader-Service-Verweise zur Channel-Discovery (informativ).

Repo: —

Tests: —

Status: n/a (informative) — “The Event Service does not establish a policy for finding event channels.”


§3 Lightweight Event Service

§3.1 Platform Independent Model (PIM)

§3.1.1 Overview

Spec: §3.1.1 — Lightweight-Profile-Beschreibung.

Repo: —

Tests: —

Status: n/a (informative) — Rahmen des Lightweight-Profils; die Abbildung steht in §3.1.2 und §3.1.3.

§3.1.2 The CosLightweightEventComm Package

Spec: §3.1.2 — Lightweight-Variante von §2.1 (kein Typed-Event, kein Multi-Consumer, reduzierte API).

Repo: crates/corba-cos-event/src/typed.rs::lightweight:: {PROFILE_NAME, is_lightweight} als Profile-Marker; das Lightweight-Subset nutzt denselben Push-Pfad wie TypedPushConsumer, ohne disconnect-Lifecycle (per Channel-destroy()).

Tests: typed::tests::{lightweight_profile_names_match_spec, lightweight_is_lightweight_recognizes_both_profiles}.

Status: done

§3.1.3 The CosLightweightEventChannel Package

Spec: §3.1.3 — Lightweight-Variante von §2.3: der Channel- Lifecycle ist der einzige Teardown, das Profil kennt keine Endpunkt-Disconnect-Operation.

Repo: crates/corba-cos-event/src/typed.rs::lightweight:: CHANNEL_PROFILE_NAME Marker; Channel-Lifecycle über TypedEventChannel::destroy() ohne separates ConsumerAdmin/SupplierAdmin-Sub-Profil (Profile-Subset von §2.7.1).

Tests: crates/corba-cos-event/src/typed.rs::tests::lightweight_channel_destroy_is_the_only_teardown (ein Consumer ohne eigenen Disconnect erhält nach destroy() keine Dispatches mehr); crates/corba-cos-event/src/typed.rs::tests::lightweight_profile_names_match_spec.

Status: done

§3.2 Platform Specific Model: CORBA Service

§3.2.1 Overview

Spec: §3.2.1 — PSM-Marker.

Repo: —

Tests: —

Status: n/a (informative) — Rahmen der CORBA-Abbildung; die IDL steht in §3.2.2 und §3.2.3.

§3.2.2 CosEventChannelAdmin Module (PSM)

Spec: §3.2.2 — IDL-PSM, identisch zu §2.3.

Repo: identisch §2.3 (crates/corba-cos-event/src/channel.rs).

Tests: identisch §2.3 — crates/corba-cos-event/src/channel.rs::tests: event_channel_admins_share_one_channel_state, consumer_admin_returns_a_fresh_proxy_per_call, supplier_admin_returns_a_fresh_proxy_per_call, proxy_push_consumer_push_before_connect_raises_disconnected, proxy_pull_supplier_try_pull_reports_has_event_flag, proxy_pull_consumer_forwards_pulled_events_into_the_channel, proxy_push_supplier_disconnect_stops_event_delivery.

Status: done — siehe §2.3.

§3.2.3 CosEventComm Module (PSM)

Spec: §3.2.3 — IDL-PSM, identisch zu §2.1.

Repo: identisch §2.1 (crates/corba-cos-event/src/comm.rs).

Tests: identisch §2.1 — crates/corba-cos-event/src/comm.rs::tests: push_increments_counter_until_disconnect, push_supplier_disconnect_terminates_the_connection, pull_supplier_try_pull_returns_the_has_event_flag, pull_supplier_pull_returns_the_queued_event, pull_consumer_disconnect_terminates_the_connection, disconnection_is_terminal_for_every_operation.

Status: done — siehe §2.1.


ZeroDDS-spezifische Bridges (kein OMG-Item)

CosEvent → DDS-DCPS-Topic Bridge

Spec: kein OMG-Spec-Item; ZeroDDS-spezifische Migrations-Schicht, die EventChannel-Push-Events in DDS-DCPS-Topics übersetzt.

Repo: crates/corba-cos-event/src/dds_bridge.rs (TopicBridge als PushConsumer am EventChannel; TopicMap als Repository-ID ⇒ Topic-Tabelle mit derive_topic_name als Ableitung für nicht eingetragene Typen; TopicSink als Übergabepunkt an den DataWriter der aufrufenden Schicht — dadurch bleibt das Crate frei von einer DCPS-Abhängigkeit). Ein nicht auflösbarer Repository-ID und ein ablehnender Sink erzeugen einen Fehler und zählen in TopicBridge::rejected, kein stiller Drop.

Tests: crates/corba-cos-event/src/dds_bridge.rs::tests: derives_topic_name_from_repository_id, explicit_mapping_wins_over_derivation, push_writes_the_payload_onto_the_resolved_topic, unresolvable_repository_id_is_reported_not_dropped, sink_failure_is_reported_not_swallowed, disconnect_stops_forwarding, event_channel_fan_out_reaches_the_dds_topic (Push in den EventChannel erreicht den DDS-Topic-Write).

Status: done — informativ; nicht spec-pflichtig.


Audit-Status

26 done / 2 partial / 2 open / 0 blocked / 6 n/a (informative).

Offene Punkte: cos-event-service-1.4.open.md.

Test-Lauf: cargo test -p zerodds-corba-cos-event — 54 Lib-Tests + 1 Doc-Test grün, 0 failed.