Skip to content

Releases

v1.5.2 - HTTP Publisher Channel

Choose a tag to compare

@tsutomi tsutomi released this 21 Aug 21:00

v1.5.2 - HTTP Publisher Channel

🚀 Features

  • New Hermodr.Publisher.Http package — a lightweight, first-party publish channel (roadmap item 13) that delivers CloudEvents to statically-configured HTTP endpoints using the CloudEvents HTTP binding (structured or binary content mode) — with no subscriber registry, no signing, and no delivery-receipt overhead, complementing Hermodr.Publisher.Webhook:

    • AddHttpEventPublisherChannel() registration extensions, configured via an Action delegate or an IConfiguration section; the typed variants (AddHttpEventPublisherChannel<TEvent>()) route only events of a given data class and support per-event-type overrides merged over the general channel defaults.
    • HttpPublishOptions / HttpPublishOptions<TEvent> with a static Endpoints collection; each HttpEndpoint carries its own Format, HttpClientName, Authentication, Resilience, RequestTimeout, and AdditionalHeaders.
    • Every publish call fans the event out concurrently to all configured endpoints, each resolved through IHttpClientFactory with its own named client (and therefore its own authentication handlers and standard resilience pipeline).
    • Per-endpoint wire format: structured content modes (cloudevents+json, cloudevents+xml) embed the whole CloudEvent envelope in the body, while the binary content mode (cloudevents+binary) sends the raw event data as the body (with its native datacontenttype as Content-Type) and the context attributes as ce-* HTTP headers.
    • Built-in authentication via HttpEndpointAuthentication (None, Bearer, ApiKey with configurable header name) applied through DelegatingHandlers registered in DI; custom handlers, TLS, and timeouts attach to any endpoint's named client via ConfigureHttpClient.
    • Per-endpoint resilience on top of AddStandardResilienceHandler(): retry (attempts, exponential delay, jitter) and circuit-breaker (sampling duration, minimum throughput, failure ratio, break duration) configurable through the bindable HttpResilienceOptions; 429/500/502/503/504 are retryable by default.
    • Transport failures and non-success status codes surface as HttpPublishException subclasses (HttpTransportException, HttpStatusCodeException), so the existing error-handling pipeline (dead-letter, delivery log, tracing) engages automatically.
    • OpenTelemetry publish span per endpoint, consistent with the other transport channels.
    • New EventTransports.Http transport identifier and HttpPublishOptions channel metadata (url, url.N), exposed for the AsyncAPI / OpenAPI exporters.
  • CI fix: stage the dotnet test --coverage reports (named <guid>.cobertura.xml) into coverage-reports/ as coverage-*.cobertura.xml so the Codecov upload finds real coverage data on every OS.

⚠ Breaking Changes

  • None — the new HTTP channel is additive; all existing channel behaviour is unchanged.

📖 Documentation

  • New docs page: HTTP Channel, package listing in packages.md, and Docusaurus version snapshot v1.5.2.

Full Changelog: v1.5.1...v1.5.2

v1.5.1 - Dapr Publisher Channel

Choose a tag to compare

@tsutomi tsutomi released this 16 Aug 10:44

v1.5.1 - Dapr Publisher Channel

🚀 Features

  • New Hermodr.Publisher.Dapr package — a first-party publish channel that delivers CloudEvents through the Dapr pub/sub building block on top of DaprClient, keeping the underlying broker (Kafka, RabbitMQ, Azure Service Bus, NATS, ...) a Dapr component-configuration concern:

    • AddDapr() / AddDapr<TEvent>() registration extensions, configured via an Action delegate or an IConfiguration section; the typed variant supports per-event-type overrides merged over the general channel defaults.
    • DaprPublishOptions / DaprPublishOptions<TEvent> — PubSubName, Topic, TopicSelector, MapAttributesToMetadata, MetadataPrefix (default "ce-"), DaprClientName, and ScheduleDeliveryAt.
    • Topic resolution order: explicit Topic → TopicSelector delegate → CloudEvent subject attribute.
    • The CloudEvent is serialised in structured mode (canonical CloudEvents JSON envelope) and published verbatim, so consumers receive the canonical envelope regardless of the underlying broker; CloudEvent attributes are additionally projected onto Dapr metadata with a configurable prefix.
    • IDaprClientBuilder + default DaprClientBuilder resolve named (keyed) DaprClient instances, enabling mTLS / token-credential configuration of multiple sidecars via the standard Dapr SDK surface.
    • Transport failures are wrapped in DaprPublishException, so the existing error-handling pipeline (dead-letter, delivery log, tracing) engages automatically.
    • OpenTelemetry: publish span with messaging.dapr.pubsubname and destination tags, consistent with the other transport channels.
    • New EventTransports.Dapr transport identifier, exposed through channel metadata for the AsyncAPI / OpenAPI exporters.
  • CI fix: drop the files glob from the Codecov upload step (the v5 action expanded it into stray CLI arguments).

⚠ Breaking Changes

  • None — the new Dapr channel is additive; all existing channel behaviour is unchanged.

📖 Documentation

  • New docs page: Dapr Publisher Channel, package listing in packages.md, and Docusaurus version snapshot v1.5.1.

Full Changelog: v1.5.0...v1.5.1

v1.5.0 - CloudEvents HTTP Binding Compliance for the Webhook Publisher

Choose a tag to compare

@tsutomi tsutomi released this 13 Aug 17:53

🚀 Features

  • CloudEvents binary HTTP content mode for the Webhook publisher (roadmap item 12):

    • New EventMessageFormat.CloudEventsBinary ("cloudevents+binary") format
      constant in Hermodr.Publisher.
    • New CloudEventsBinarySerializer — emits the raw event data as the
      request body via JsonEventFormatter.EncodeBinaryModeEventData.
    • New CloudEventHttpHeadersMapper (internal) — projects every CloudEvent
      context attribute (including extensions) onto ce-* HTTP headers per the
      CloudEvents HTTP binding §3.1.
    • The channel sets the request Content-Type to the event's
      datacontenttype (falling back to application/json), so data may be
      any content type (e.g. application/protobuf).
    • Batch delivery in binary mode throws NotSupportedException (the HTTP
      binding defines no binary batch).
    • HMAC signing still covers the raw body bytes only; IWebhookSignatureProvider
      is unchanged.
  • WebHook abuse-protection discovery (CloudEvents HTTP WebHooks spec):

    • New WebhookDiscoveryOptions (RequestOrigin, RequestCallback,
      RequestRate, RequestTimeout, RequireSuccessfulHandshake) on
      WebhookPublishOptions.Discovery.
    • New WebhookHandshakeClient (internal) — lazily issues the OPTIONS
      pre-flight before the first delivery, caches the granted
      WebHook-Allowed-Origin / WebHook-Allowed-Rate per endpoint, and gates
      concurrent first deliveries to a single round-trip.
    • WebHook-Request-Origin attached to every delivery POST after a
      successful handshake (spec §2.1).
    • New WebhookDiscoveryPermission (cached handshake result, queryable by
      the host) and WebhookHandshakeException (strict-mode refusal/failure).
    • Best-effort (RequireSuccessfulHandshake = false, default) logs refusal
      and proceeds; strict (true) throws and suppresses the POST.
    • The granted WebHook-Allowed-Rate is tagged on the publish Activity
      but not auto-enforced — the host applies its own throttling policy.
    • The publisher does not host the WebHook-Request-Callback endpoint;
      it only advertises the URL for the receiver to call.
  • Retry-After on 429 now honored — when a delivery returns
    429 Too Many Requests with a Retry-After header (delta-seconds or
    HTTP-date), the channel uses it as the next retry delay, overriding the
    configured exponential backoff for that attempt (spec §2.2).

⚠ Breaking Changes

  • None — the legacy "json" default wire format is preserved
    (regression-guarded); Discovery defaults to null (no handshake, no
    WebHook-Request-Origin header). All signing, retry, and
    subscriber-management behaviour is unchanged.

Full Changelog: v1.4.0...v1.5.0

v1.4.0 - Schema Governance & AsyncAPI Export

Choose a tag to compare

@tsutomi tsutomi released this 08 Aug 21:33

v1.4.0 - Schema Governance & AsyncAPI Export

🚀 Features

  • AsyncAPI & Schema Export Improvements (roadmap item 11, v1.4.0):
    • Channel metadata abstraction in Hermodr.Publisher: new
      IEventPublishChannelMetadata interface, EventTransports well-known
      transport string constants, IChannelMetadataSource marker for options
      classes, and EventPublishChannelMetadata.For(...) resolver that unwraps
      NamedChannelDecorator and reads metadata from either the channel or its
      options. EventPublisher.GetChannelMetadata() exposes the live pipeline
      metadata for tooling.
    • Transport options implement IChannelMetadataSource: RabbitMqPublishOptions,
      ServiceBusPublishOptions, and WebhookPublishOptions now expose
      transport-aware metadata (exchange, routingKey, queue, url, ...).
      Storage / deferral / recovery channels (Audit Trail, Outbox, Dead-Letter)
      report EventTransports.Other and are excluded from exported contracts.
    • Auto-discovery (Hermodr.Schema.AsyncApi): new EventSchemaDiscovery
      service that scans assemblies for [Event]-annotated types with a
      DataVersion and returns a schema for each — the export-time counterpart of
      EventSchemaRegistry.ScanAssembly.
    • Enriched AsyncAPI 2.x document: new AsyncApiDocumentBuilder fluently
      builds a document from schemas + channel metadata, populates RabbitMQ (AMQP)
      and HTTP channel bindings, aggregates servers, and emits a publish operation
      per channel. New AddEvent overload on EventSchemaAsyncApiExtensions enriches
      a single channel with transport-specific bindings.
    • OpenAPI 3.1 webhook export (new package Hermodr.Schema.OpenApi):
      converts IEventSchema to OpenApiSchema, builds a webhooks document with
      one POST operation per event type whose request body references the schema
      under components/schemas, and preserves the transport identifier via the
      x-hermodr-transport operation extension. JSON and YAML writers
      (EventSchemaOpenApiWriter, EventSchemasOpenApiWriter) provided.
    • dotnet global tool (new package Hermodr.AsyncApi.Exporter.Tool):
      exports AsyncAPI 2.x or OpenAPI 3.1 documents from one or more assemblies
      without a running host, with --channels-file (JSON) and --entry <type>::<method> mechanisms to supply transport metadata. Installable via
      dotnet tool install --global Hermodr.AsyncApi.Exporter.Tool.

📖 Documentation

🛠 Refactoring

  • Exporter library extraction (PR #100): the hermodr-asyncapi CLI was
    refactored from a monolithic Program.cs into a packable internal library
    (Hermodr.AsyncApi.Exporter) and a slim Spectre.Console.Cli shell
    (Hermodr.AsyncApi.Exporter.Tool). The tool now single-targets net10.0
    with RollForward=LatestMajor (tools cannot multi-target), and the library
    is embedded in the nuspkg via PrivateAssets=all — the install is fully
    self-contained. The dual-purpose samples/asyncapi-export Web app was
    removed and replaced by a dedicated non-test fixture project
    (Hermodr.AsyncApi.Exporter.Fixtures).

Full Changelog: v1.2.9...v1.4.0

v1.2.9 - Schema Compatibility & Event Upcasting

Choose a tag to compare

@tsutomi tsutomi released this 19 Jun 15:34

v1.2.9 - Schema Compatibility & Event Upcasting

🚀 Features

  • Schema Compatibility Checking: New IEventSchemaCompatibilityChecker and EventSchemaCompatibilityChecker in Hermodr.Schema that validates whether an event can be safely upcasted to a target schema version by analyzing schema changes (additions, removals, modifications) against configurable SchemaCompatibilityLevel (Backward, Forward, Full, None)
  • Event Upcasting Pipeline: New EventUpcastingPipeline and EventUpcasterRegistry supporting ordered chains of IEventUpcaster implementations with JSON data adapter (JsonEventUpcastingDataAdapter) for transforming event data across schema versions
  • Publish-Time Upcasting Middleware: New EventUpcastingMiddleware in Hermodr.Publisher that automatically applies registered upcasters during the publish pipeline, with configurable MissingUpcasterBehavior (Throw/Skip)
  • Version-Aware Subscription Routing: New EventFilter, EventFilterBuilder, and EventFilterEvaluator in Hermodr.Subscriptions enabling subscription-side filtering based on event type version and data version

Change Log

Hermodr.Schema

  • IEventSchemaCompatibilityChecker — new interface for schema compatibility validation
  • EventSchemaCompatibilityChecker — implementation analyzing schema changes against compatibility levels
  • SchemaCompatibilityLevel — enum (Backward, Forward, Full, None)
  • SchemaCompatibilityResult — result type with pass/fail and change descriptions
  • SchemaChange — record type describing a single schema change
  • SchemaChangeType — enum (PropertyAdded, PropertyRemoved, PropertyTypeChanged, PropertyRequiredChanged)
  • IEventUpcaster — new interface for transforming event data across schema versions
  • IEventUpcasterRegistry — new interface for registering and resolving upcasters
  • EventUpcasterRegistry — default implementation with ordered upcaster chains
  • IEventUpcastingPipeline — new interface for executing upcaster chains
  • EventUpcastingPipeline — default pipeline implementation
  • IEventUpcastingDataAdapter — new interface for format-specific data access during upcasting
  • JsonEventUpcastingDataAdapter — JSON implementation using JsonDocument/JsonElement
  • UpcastContext — context object passed through the upcasting pipeline
  • EventUpcastingException — exception type for upcasting failures
  • ServiceCollectionExtensions — updated with upcaster registration methods

Hermodr.Publisher

  • EventUpcastingMiddleware — new middleware applying registered upcasters during publish
  • EventUpcastingOptions — configuration for upcasting behavior
  • MissingUpcasterBehavior — enum (Throw, Skip) for handling missing upcasters
  • EventPublisherBuilderExtensions — new UseEventUpcasting() fluent extension
  • EventFactory — updated with version-aware event creation helpers

Hermodr.Subscriptions

  • EventFilter — new type for subscription-side version filtering
  • EventFilterBuilder — fluent builder for constructing event filters
  • EventFilterEvaluator — evaluates filters against incoming events

Full Changelog: v1.2.8...v1.2.9

v1.2.8 - Schema Validation

Choose a tag to compare

@tsutomi tsutomi released this 15 Jun 12:44
6b30cb0

📦 Release v1.2.8 - Schema Validation

🎯 What's New

This release introduces automatic schema validation at publish time, a critical feature for ensuring event contracts are enforced before events leave your application.

🚀 Key Feature: Schema Validation at Publish Time

The new Hermodr.Publisher.EventSchema package integrates schema validation directly into the event publishing pipeline, preventing invalid events from ever reaching your transport channels.

How It Works

When you publish an event, the SchemaValidationMiddleware intercepts the CloudEvent and:

  1. Locates the registered schema for the event type (supporting versioned schemas via the dataversion attribute)
  2. Deserializes the payload using the appropriate format handler (JSON, XML, or future formats)
  3. Validates the payload against the schema definition
  4. Enforces your policy based on configuration:
    • If the schema is missing: Allow passage, Block publication, or Fallback to a default behavior
    • If validation fails: Throw an exception (stopping publication) or Log a warning and continue

Configuration Options

services.AddEventPublisher()
    .UseSchemaValidation(options =>
    {
        // What to do when no schema is registered for an event type
        options.MissingSchemaBehavior = MissingSchemaBehavior.Block;

        // What to do when schema validation fails
        options.ValidationFailureBehavior = ValidationFailureBehavior.Throw;
    });

Key Components

  • SchemaValidationMiddleware — Core middleware that validates events against registered schemas before they reach any channel
  • SchemaValidationOptions — Fluent configuration for MissingSchemaBehavior (Allow/Block/Fallback) and ValidationFailureBehavior (Throw/Log)
  • SchemaRegistrationsApplier — Automatically registers built-in deserializers (JSON, XML) at startup
  • UseSchemaValidation() — One-line fluent extension on EventPublisherBuilder that wires up all schema services

Version-Aware Validation

Events can specify a dataversion CloudEvent extension attribute. The validation system uses this to select the correct schema version, enabling safe schema evolution:

var cloudEvent = new CloudEvent
{
    Type = "com.example.order.created",
    Data = orderData,
    ["dataversion"] = "2.0"  // Validates against v2.0 schema
};

Format-Agnostic Support

The validation pipeline is not limited to JSON. It supports:

  • ✅ JSON schemas (JSON Schema Draft-07)
  • ✅ XML schemas (XSD)
  • 🔜 Future formats (Avro, Protobuf) via extensible deserializer registry

📝 Other Changes

  • AuditTrailPublishChannel refactored to use IServiceProvider for dependency resolution
  • Updated Kista dependency references
  • General code cleanup and PR review refinements

📋 Full Changelog

Commits since v1.2.7

ac12c1c refactor: address the issues provided by the PR review
12f6af7 Updating the references of the Kista dependency
04e645c feat: refactor AuditTrailPublishChannel to use IServiceProvider for dependency resolution
6b11a17 feat: add schema validation middleware for publish time events
459d884 Restructure documentation with versioning (#92)

Detailed Change Log

## [Unreleased]

### 🚀 Features

- **Schema Validation at Publish Time**: New `Hermodr.Publisher.EventSchema` package adds automatic schema validation middleware to the publish pipeline (#90)
  - `SchemaValidationMiddleware` — validates event payloads against registered schemas before channel dispatch
  - `SchemaValidationOptions` — configurable `MissingSchemaBehavior` (Allow/Block/Fallback) and `ValidationFailureBehavior` (Throw/Log)
  - `SchemaRegistrationsApplier` — registers built-in deserializers (JSON, XML) into the deserializer registry at startup
  - `UseSchemaValidation()` — fluent extension on `EventPublisherBuilder` with auto-registration of schema services
  - Version-aware validation via `dataversion` CloudEvent extension attribute
  - Format-agnostic deserialization enables validation for JSON, XML, and future formats

### 🧪 Tests

- 212 new tests across `Hermodr.Schema.XUnit` (200) and `Hermodr.Publisher.EventSchema.XUnit` (12) covering all middleware behaviors, version-aware lookup, and error handling

🔗 Links

v1.2.7 - Kista Provider Migration & Storage Refactoring

Choose a tag to compare

@tsutomi tsutomi released this 10 Jun 20:29

⚠ Breaking Changes

  • Delivery Log Interfaces Removed: The delivery log subsystem has been refactored to use the Kista provider model
    • IEventDeliveryLogRepository — removed (replaced by Kista provider pattern)
    • IEventDeliveryRecord — removed (replaced by IEventDeliveryRecordFactory)
    • IEventPublishDeliveryLog — removed (signature changed)
    • EventDeliveryRecord — simplified (properties removed to align with Kista model)
    • CloudEventJsonConverter — updated serialization logic
  • Outbox Simplification: Removed intermediate management layers
    • OutboxMessageManager — removed (logic integrated into channel)
    • OutboxMessageValidator — removed (validation inlined)
    • IOutboxMessageRepository — renamed to IOutboxMessageStore
  • Namespace Migration: All provider components migrated from Deveel to Kista provider model across DeadLetter, DeliveryLog, and Outbox packages

🚀 Features

  • Kista Provider Migration: Framework components migrated from Deveel to Kista provider model (#91)
    • DeadLetter: EntityDeadLetterMessageStore, DeadLetterMessageFactoryAdapter, updated builder extensions
    • DeliveryLog: EntityEventDeliveryLogRepository, EventDeliveryRecordFactory, updated builder extensions
    • Outbox: EntityOutboxMessageRepository, OutboxChannelBuilder, simplified relay processor
  • New In-Memory Delivery Log Package: Hermodr.Publisher.DeliveryLog.InMemory
    • InMemoryEventDeliveryLogRepository — thread-safe in-memory storage for testing and lightweight scenarios
    • DeliveryLogBuilderExtensions — fluent configuration via UseInMemory()
  • New NDJson Delivery Log Package: Hermodr.Publisher.DeliveryLog.NDJson
    • NdJsonEventDeliveryLogRepository — file-based delivery log with newline-delimited JSON
    • NdJsonDeliveryLogOptions — configurable file path, buffer size, and async writes
    • DeliveryLogBuilderExtensions — fluent configuration via UseNDJson()
  • Publisher Telemetry Enhancements: Core publisher package now includes built-in telemetry
    • PublisherTelemetry — publisher-level diagnostics wrapper
    • ChannelTelemetry — channel-level diagnostics wrapper
    • EventPublishChannel — instrumented with telemetry support

🧪 Tests

  • New test projects for storage backends:
    • Hermodr.Publisher.DeliveryLog.InMemory.XUnit — in-memory repository tests
    • Hermodr.Publisher.DeliveryLog.NDJson.XUnit — NDJson repository tests
  • Updated tests for Kista provider model:
    • EntityEventDeliveryLogRepositoryTests, InMemoryEventDeliveryLogRepositoryTests, NdJsonEventDeliveryLogRepositoryTests
    • DeliveryLogBuilderTests, DeliveryLogMiddlewareTests, DeliveryLogPublishErrorHandlerTests
    • OutboxPublishChannelTests, OutboxRegistrationTests, OutboxRelayTests
    • FakeOutboxMessageRepository — updated for IOutboxMessageStore interface
  • Removed obsolete tests:
    • OutboxMessageManagerTests — removed (component deleted)
    • OutboxMessageValidatorTests — removed (component deleted)
    • DbEventDeliveryRecordTests — simplified (record structure changed)

📖 Documentation

  • README updated with Kista dependencies and installation instructions
  • New frameworks comparison guide (docs/frameworks-comparison.md)
  • Updated package documentation (docs/packages.md)
  • Updated delivery log and outbox guides to reflect Kista provider model
  • ROADMAP updated with migration progress

Full Change Log

Hermodr.Publisher (Core)

  • PublisherTelemetry — new publisher-level telemetry wrapper
  • ChannelTelemetry — new channel-level telemetry wrapper
  • EventPublishChannel — refactored to use ChannelTelemetry for diagnostics

Hermodr.Publisher.DeadLetter

  • EntityDeadLetterMessageStore — refactored for Kista provider model; EF Core storage implementation
  • DeadLetterMessageFactoryAdapter — new adapter for message factory integration
  • IDeadLetterMessageFactory — extended with new methods
  • IDeadLetterMessageReplayer — extended with new methods
  • IDeadLetterMessageStore — new interface replacing repository pattern
  • IDeadLetterReplayProcessor — extended with new methods
  • DeadLetterBuilderExtensions — updated for Kista provider registration
  • InMemoryDeadLetterMessageStore — minor cleanup
  • Hermodr.Publisher.DeadLetter.csproj — dependencies updated
  • Hermodr.Publisher.DeadLetter.EntityFramework.csproj — dependencies updated, Kista provider references added

Hermodr.Publisher.DeliveryLog (Core)

  • IEventDeliveryRecordFactory — new factory interface for creating delivery records
  • DeliveryLogBuilder — simplified (removed repository abstraction, uses Kista provider directly)
  • EventDeliveryRecord — simplified (properties removed to align with Kista model)
  • IEventPublishDeliveryLog — signature updated
  • CloudEventJsonConverter — updated serialization logic
  • LoggerExtensions — minor cleanup
  • Hermodr.Publisher.DeliveryLog.csproj — dependencies updated
  • IEventDeliveryLogRepository — removed (replaced by Kista provider)
  • IEventDeliveryRecord — removed (replaced by factory)
  • InMemoryEventDeliveryLogRepository — removed (moved to separate package)
  • NdJsonDeliveryLogOptions — removed (moved to separate package)
  • NdJsonEventDeliveryLogRepository — removed (moved to separate package)
  • EventPublisherBuilderExtensions — removed (functionality moved to builder extensions)
  • ServiceCollectionExtensions — removed

Hermodr.Publisher.DeliveryLog.InMemory (New)

  • InMemoryEventDeliveryLogRepository — thread-safe in-memory delivery log storage
  • DeliveryLogBuilderExtensions — fluent configuration via UseInMemory()
  • Hermodr.Publisher.DeliveryLog.InMemory.csproj — new project file

Hermodr.Publisher.DeliveryLog.NDJson (New)

  • NdJsonEventDeliveryLogRepository — file-based delivery log with NDJson format
  • NdJsonDeliveryLogOptions — configurable options for NDJson storage
  • DeliveryLogBuilderExtensions — fluent configuration via UseNDJson()
  • LoggerExtensions — logging helpers for NDJson operations
  • Hermodr.Publisher.DeliveryLog.NDJson.csproj — new project file

Hermodr.Publisher.DeliveryLog.EntityFramework

  • EntityEventDeliveryLogRepository — refactored for Kista provider model; simplified EF Core implementation
  • EventDeliveryRecordFactory — new factory for creating EF delivery records
  • DeliveryLogBuilderExtensions — updated for Kista provider registration
  • DbEventDeliveryRecord — simplified (properties removed to align with Kista model)
  • Hermodr.Publisher.DeliveryLog.EntityFramework.csproj — dependencies updated, Kista provider references added

Hermodr.Publisher.Outbox

  • IOutboxMessageStore — renamed from IOutboxMessageRepository; interface simplified
  • EntityOutboxMessageRepository — refactored for Kista provider model
  • OutboxChannelBuilder — simplified (removed manager/validator layers)
  • OutboxPublishChannel — updated to use IOutboxMessageStore
  • OutboxRelayProcessor — simplified relay logic
  • OutboxRelayService — minor cleanup
  • OutboxRelayOptions — minor cleanup
  • IOutboxMessage — minor updates
  • EventPublisherBuilderExtensions — updated for Kista provider registration
  • OutboxChannelBuilderExtensions — simplified registration
  • Hermodr.Publisher.Outbox.csproj — dependencies updated
  • Hermodr.Publisher.Outbox.EntityFramework.csproj — dependencies updated, Kista provider references added
  • OutboxMessageManager — removed (logic integrated into channel)
  • OutboxMessageValidator — removed (validation inlined)

Tests

  • Hermodr.Publisher.DeliveryLog.EntityFramework.XUnit: EntityEventDeliveryLogRepositoryIntegrationTests, DbEventDeliveryRecordTests, EntityEventDeliveryLogRepositoryTests
  • Hermodr.Publisher.DeliveryLog.InMemory.XUnit (New): InMemoryEventDeliveryLogRepositoryTests
  • Hermodr.Publisher.DeliveryLog.NDJson.XUnit (New): NdJsonEventDeliveryLogRepositoryTests
  • Hermodr.Publisher.DeliveryLog.XUnit: DeliveryLogBuilderTests, DeliveryLogMiddlewareTests, DeliveryLogPublishErrorHandlerTests, InMemoryDeliveryStore (new), TestSystemTime
  • Hermodr.Publisher.Outbox.XUnit: OutboxPublishChannelTests, OutboxRegistrationTests, OutboxRelayTests, FakeOutboxMessageRepository, EntityOutboxMessageRepositoryTestsBase, MySqlOutboxMessageRepositoryTests
  • Removed: OutboxMessageManagerTests, OutboxMessageValidatorTests

Documentation

  • README.md — updated installation instructions, Kista dependencies, frameworks comparison
  • docs/packages.md — updated package reference with new InMemory and NDJson delivery log packages
  • docs/frameworks-comparison.md — new comparison guide for Hermodr vs other .NET messaging frameworks
  • docs/publishers/delivery-log.md — updated for Kista provider model
  • docs/publishers/outbox.md — updated for simplified outbox architecture
  • docs/publishers/dead-letter.md — minor cleanup
  • docs/roadmap.md — updated with migration progress
  • docs/getting-started/installation.md — updated for Kista dependencies
  • docs/SUMMARY.md — updated navigation

v1.2.6 - OpenTelemetry Enhancements

Choose a tag to compare

@tsutomi tsutomi released this 09 Jun 20:07
1799e76

🚀 Features

  • Unified Diagnostics Infrastructure: New centralized telemetry and diagnostics system spanning all publisher and subscription components (#89)
    • HermodrDiagnostics — central ActivitySource and Meter for the entire pipeline
    • PublisherTelemetry, ChannelTelemetry, SubscriptionTelemetry — per-component telemetry wrappers
    • PipelineDiagnosticsMiddleware / PipelineDiagnosticsTelemetry — pipeline-level diagnostics middleware
    • TelemetryConstants promoted from Hermodr.Publisher.OpenTelemetry to core Hermodr.Publisher for cross-project reuse
  • Per-Transport Instrumentation: Every transport channel now emits consistent OpenTelemetry traces and metrics
    • New telemetry classes: AuditTrailTelemetry, ServiceBusTransportTelemetry, DeadLetterTelemetry, MassTransitTransportTelemetry, OutboxTelemetry, RabbitMqTransportTelemetry, WebhookTransportTelemetry
    • All existing publish channels instrumented: AuditTrailPublishChannel, ServiceBusPublishChannel, DeadLetterMessageReplayer, DeadLetterReplayProcessor, DeadLetterStorageHandler, MassTransitPublishChannel, OutboxPublishChannel, OutboxRelayProcessor, RabbitMqPublishChannel, WebhookPublishChannel
  • New OpenTelemetryBuilderExtensions — fluent extensions for configuring diagnostics on the event pipeline

🧪 Tests

  • 15 new test files and significant extensions to existing tests covering the full telemetry surface:
    • ChannelMetricsTests, HermodrDiagnosticsTests, OpenTelemetryBuilderExtensionsTests
    • PipelineDiagnosticsMiddlewareTests, PipelineDiagnosticsTelemetryTests
    • PublisherMetricsTests, SubscriptionMetricsTests
    • TelemetryConstantsTests, TelemetryEdgeCasesTests, TelemetryMetricsTests, TelemetryTagsTests
    • Extended: HermodrTelemetryTests, EndToEndTracePropagationTests
    • Removed obsolete MetricsMiddlewareTests

Change Log

(Detailed breakdown of every file and type changed in this release)

Hermodr.Publisher (Core)

  • HermodrDiagnostics — new central ActivitySource and Meter for publisher diagnostics
  • PublisherTelemetry — new publisher-level telemetry wrapper
  • ChannelTelemetry — new channel-level telemetry wrapper
  • TelemetryConstants — moved from Hermodr.Publisher.OpenTelemetry to core; defines activity source names, meter names, and tag keys
  • EventPublisher — refactored to emit diagnostics through HermodrDiagnostics
  • EventPublishChannel — refactored to emit channel-level traces and metrics

Hermodr.Subscriptions

  • SubscriptionTelemetry — new subscription-level telemetry wrapper
  • EventDispatcher — refactored to emit dispatch traces and metrics through SubscriptionTelemetry

Hermodr.Publisher.OpenTelemetry

  • OpenTelemetryBuilderExtensions — new fluent extensions for wiring diagnostics
  • PipelineDiagnosticsMiddleware / PipelineDiagnosticsTelemetry — new middleware for pipeline-level diagnostics
  • HermodrTelemetry — refactored to delegate to core diagnostics
  • TelemetryMetrics — refactored to use core meter
  • MetricsOptions — modified to align with new diagnostics
  • OpenTelemetryPublishMiddleware, OpenTelemetrySubscriptionMiddleware — refactored for new diagnostics pipeline
  • TelemetryConstants — removed (moved to core Hermodr.Publisher)

Hermodr.Publisher.AuditTrail

  • AuditTrailTelemetry — new telemetry class
  • AuditTrailPublishChannel — instrumented with AuditTrailTelemetry

Hermodr.Publisher.AzureServiceBus

  • ServiceBusTransportTelemetry — new telemetry class
  • ServiceBusPublishChannel — instrumented with ServiceBusTransportTelemetry

Hermodr.Publisher.DeadLetter

  • DeadLetterTelemetry — new telemetry class
  • DeadLetterMessageReplayer — instrumented with DeadLetterTelemetry
  • DeadLetterReplayProcessor — instrumented with DeadLetterTelemetry
  • DeadLetterStorageHandler — refactored to use DeadLetterTelemetry

Hermodr.Publisher.MassTransit

  • MassTransitTransportTelemetry — new telemetry class
  • MassTransitPublishChannel — instrumented with MassTransitTransportTelemetry

Hermodr.Publisher.Outbox

  • OutboxTelemetry — new telemetry class
  • OutboxPublishChannel — refactored to use OutboxTelemetry
  • OutboxRelayProcessor — refactored to use OutboxTelemetry

Hermodr.Publisher.RabbitMq

  • RabbitMqTransportTelemetry — new telemetry class
  • RabbitMqPublishChannel — instrumented with RabbitMqTransportTelemetry

Hermodr.Publisher.Webhook

  • WebhookTransportTelemetry — new telemetry class
  • WebhookPublishChannel — instrumented with WebhookTransportTelemetry

Tests (Hermodr.Publisher.OpenTelemetry.XUnit)

  • ChannelMetricsTests — channel-level metrics validation
  • HermodrDiagnosticsTests — diagnostics source and meter tests
  • HermodrTelemetryTests — extended telemetry coverage
  • OpenTelemetryBuilderExtensionsTests — builder extension validation
  • PipelineDiagnosticsMiddlewareTests — middleware behavior tests
  • PipelineDiagnosticsTelemetryTests — pipeline telemetry validation
  • PublisherMetricsTests — publisher-level metrics tests
  • SubscriptionMetricsTests — subscription-level metrics tests
  • TelemetryConstantsTests — constant and tag key validation
  • TelemetryEdgeCasesTests — edge case coverage for telemetry
  • TelemetryMetricsTests — metrics recording validation
  • TelemetryTagsTests — tag propagation tests
  • EndToEndTracePropagationTests — extended to include new diagnostics paths
  • MetricsMiddlewareTests — removed (superseded by new diagnostics)
  • AssemblyInfo and project file updates

Full Changelog: v1.2.5...v1.2.6

v1.2.5 - Audit Trails

Choose a tag to compare

@tsutomi tsutomi released this 04 Jun 21:27

What's Changed

🚀 Features

  • Audit Trail Subsystem: Five new packages providing an append-only event audit trail with multiple storage backends and publisher integration (#82)
    • Hermodr.AuditTrail — core interfaces and types for writing, reading, and querying audit trail entries
    • Hermodr.AuditTrail.InMemory — in-memory audit trail backend for testing and lightweight scenarios
    • Hermodr.AuditTrail.EntityFramework — EF Core backend for persisting audit trail entries to relational databases
    • Hermodr.AuditTrail.NDJson — file-based backend using newline-delimited JSON with automatic file rolling, retention policies, and a pluggable filesystem abstraction
    • Hermodr.Publisher.AuditTrail — publisher integration channel that transparently records events to any configured audit trail backend

🧪 Tests

  • 202 unit and integration tests across all five packages
  • NDJson backend: 54 tests covering append/read, file rolling, retention, filtering, and concurrent I/O
  • EF Core backend: SQLite integration tests for the full entry lifecycle
  • Publisher channel: tests for recording, bypass, and typed/untyped routing

📖 Documentation

  • New NDJson audit trail sample with REST query endpoints
  • Comprehensive package reference in docs/packages.md
  • README and ROADMAP updated with compliance and audit trail features

Change Log

(Detailed breakdown of every file and type added in this release)

Hermodr.AuditTrail (Core)

  • IAuditTrailWriter, IAuditTrailReader<TEntry>, IAuditTrailEntry interfaces
  • AuditTrailEntry — default implementation with FromCloudEvent() factory
  • AuditTrailBuilder — fluent DI registration builder
  • AuditTrailStreamQuery — filter criteria (type, source, time range, attributes)
  • AuditTrailPageQueryExtensions — 7 LINQ-style filter methods for paged queries

Hermodr.AuditTrail.InMemory

  • InMemoryAuditTrail — concurrent in-memory storage (writer + reader)
  • InMemorySharedBag<TEntry> — thread-safe shared entry store
  • UseInMemory() / AddInMemoryAuditTrail() / AddAuditTrailQuerying() extensions

Hermodr.AuditTrail.EntityFramework

  • AuditTrailDbContext — EF Core DbContext with audit trail entity sets
  • DbAuditTrailEntry / DbAuditTrailAttribute — EF entities with converters
  • EntityAuditTrailRepository — filtered streaming via IQueryable
  • EntityAuditTrail — EF Core writer + reader implementation
  • UseEntityFramework() / AddEntityFrameworkAuditTrail() extensions

Hermodr.AuditTrail.NDJson

  • NdJsonAuditTrail — NDJSON file storage (writer + reader + IDisposable)
    • Auto file rolling by size (MaxFileSizeBytes, default 10MB) or time interval (RollInterval)
    • Retention cleanup (MaxFileCount, default 30 files)
    • Pluggable IFileSystem (backed by System.IO.Abstractions)
    • Async streaming reads with concurrent writer support
  • NdJsonAuditTrailOptions — configurable directory, file naming, buffer size
  • UseNDJson() / AddNDJsonAuditTrail() / AddNDJsonAuditTrailQuerying() extensions

Hermodr.Publisher.AuditTrail

  • AuditTrailPublishChannel / AuditTrailPublishChannel<TEvent> — records published events to audit trail
  • BypassAuditTrailOptions — prevents infinite loops during replay/relay
  • 4 overloads of AddAuditTrail() on EventPublisherBuilder

Tests

  • Hermodr.AuditTrail.XUnit: 44 tests (builder, entries, page queries, stream queries, edge cases)
  • Hermodr.AuditTrail.InMemory.XUnit: 43 tests (integration, shared bag, edge cases, DI registration)
  • Hermodr.AuditTrail.EntityFramework.XUnit: 32 tests (EF entities, repository, SQLite integration)
  • Hermodr.AuditTrail.NDJson.XUnit: 54 tests (append/read, rolling, retention, pluggable filesystem, cancellation, concurrent I/O)
  • Hermodr.Publisher.AuditTrail.XUnit: 29 tests (channels, typed routing, builder, bypass scenarios)

Samples

  • samples/audit-trail/ — EF Core with SQLite, order processing scenario, 6 REST endpoints
  • samples/audit-trail-ndjson/ — NDJson with file rolling, order processing scenario, 4 REST endpoints

Documentation

  • New: docs/samples/audit-trail-ndjson.md
  • Updated: docs/packages.md, docs/SUMMARY.md, README.md, ROADMAP.md

Full Changelog: v1.2.4...v1.2.5

v1.2.4 — OpenTelemetry Support & Project Rename

Choose a tag to compare

@tsutomi tsutomi released this 24 May 06:22

What's Changed

⚠ Breaking Changes

  • Project Rename: The project has been renamed from Deveel.Events to Hermodr, giving it a new identity disconnected from the Deveel brand (#80).
    • All package names changed from Deveel.Events.* to Hermodr.*
    • All namespaces reorganized to match the new naming
    • Solution file renamed from Deveel.Events.sln to Hermodr.sln
    • Migration path: update package references and using directives accordingly

🚀 Features

  • OpenTelemetry Support: New Hermodr.Publisher.OpenTelemetry package providing distributed tracing, metrics collection, and W3C trace context propagation via CloudEvents extensions (#81)
    • OpenTelemetryPublishMiddleware — injects trace context into outgoing CloudEvents
    • OpenTelemetrySubscriptionMiddleware — restores parent trace context on incoming events
    • MetricsMiddleware — collects publishing metrics (count, duration, errors) per event type
    • Full end-to-end trace correlation across service boundaries

🧪 Tests

  • Comprehensive unit and integration tests for OpenTelemetry instrumentation:
    • HermodrTelemetryTests, MetricsMiddlewareTests, OpenTelemetryPublishMiddlewareTests
    • OpenTelemetrySubscriptionMiddlewareTests, OpenTelemetryBuilderExtensionsTests
    • End-to-end trace propagation tests
  • All tests updated for namespace compliance after the rename

📖 Documentation

  • New OpenTelemetry instrumentation guide (docs/publishers/opentelemetry.md)
  • New sample project: OrderService.OpenTelemetry demonstrating distributed tracing setup
  • All docs updated to reflect the Hermodr rename and new package names

Full Changelog: v1.2.3...v1.2.4