Repository navigation
Releases
v1.5.2 - HTTP Publisher Channel
v1.5.2 - HTTP Publisher Channel
🚀 Features
-
New
Hermodr.Publisher.Httppackage — 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, complementingHermodr.Publisher.Webhook:AddHttpEventPublisherChannel()registration extensions, configured via anActiondelegate or anIConfigurationsection; 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 staticEndpointscollection; eachHttpEndpointcarries its ownFormat,HttpClientName,Authentication,Resilience,RequestTimeout, andAdditionalHeaders.- Every publish call fans the event out concurrently to all configured endpoints, each resolved through
IHttpClientFactorywith 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 eventdataas the body (with its nativedatacontenttypeasContent-Type) and the context attributes asce-*HTTP headers. - Built-in authentication via
HttpEndpointAuthentication(None,Bearer,ApiKeywith configurable header name) applied throughDelegatingHandlers registered in DI; custom handlers, TLS, and timeouts attach to any endpoint's named client viaConfigureHttpClient. - 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 bindableHttpResilienceOptions;429/500/502/503/504are retryable by default. - Transport failures and non-success status codes surface as
HttpPublishExceptionsubclasses (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.Httptransport identifier andHttpPublishOptionschannel metadata (url,url.N), exposed for the AsyncAPI / OpenAPI exporters.
-
CI fix: stage the
dotnet test --coveragereports (named<guid>.cobertura.xml) intocoverage-reports/ascoverage-*.cobertura.xmlso 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 snapshotv1.5.2.
Full Changelog: v1.5.1...v1.5.2
v1.5.1 - Dapr Publisher Channel
v1.5.1 - Dapr Publisher Channel
🚀 Features
-
New
Hermodr.Publisher.Daprpackage — a first-party publish channel that delivers CloudEvents through the Dapr pub/sub building block on top ofDaprClient, keeping the underlying broker (Kafka, RabbitMQ, Azure Service Bus, NATS, ...) a Dapr component-configuration concern:AddDapr()/AddDapr<TEvent>()registration extensions, configured via anActiondelegate or anIConfigurationsection; 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, andScheduleDeliveryAt.- Topic resolution order: explicit
Topic→TopicSelectordelegate → CloudEventsubjectattribute. - 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+ defaultDaprClientBuilderresolve named (keyed)DaprClientinstances, 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.pubsubnameand destination tags, consistent with the other transport channels. - New
EventTransports.Daprtransport identifier, exposed through channel metadata for the AsyncAPI / OpenAPI exporters.
-
CI fix: drop the
filesglob 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 snapshotv1.5.1.
Full Changelog: v1.5.0...v1.5.1
v1.5.0 - CloudEvents HTTP Binding Compliance for the Webhook Publisher
🚀 Features
-
CloudEvents binary HTTP content mode for the Webhook publisher (roadmap item 12):
- New
EventMessageFormat.CloudEventsBinary("cloudevents+binary") format
constant inHermodr.Publisher. - New
CloudEventsBinarySerializer— emits the raw eventdataas the
request body viaJsonEventFormatter.EncodeBinaryModeEventData. - New
CloudEventHttpHeadersMapper(internal) — projects every CloudEvent
context attribute (including extensions) ontoce-*HTTP headers per the
CloudEvents HTTP binding §3.1. - The channel sets the request
Content-Typeto the event's
datacontenttype(falling back toapplication/json), sodatamay 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.
- New
-
WebHook abuse-protection discovery (CloudEvents HTTP WebHooks spec):
- New
WebhookDiscoveryOptions(RequestOrigin,RequestCallback,
RequestRate,RequestTimeout,RequireSuccessfulHandshake) on
WebhookPublishOptions.Discovery. - New
WebhookHandshakeClient(internal) — lazily issues theOPTIONS
pre-flight before the first delivery, caches the granted
WebHook-Allowed-Origin/WebHook-Allowed-Rateper endpoint, and gates
concurrent first deliveries to a single round-trip. WebHook-Request-Originattached to every delivery POST after a
successful handshake (spec §2.1).- New
WebhookDiscoveryPermission(cached handshake result, queryable by
the host) andWebhookHandshakeException(strict-mode refusal/failure). - Best-effort (
RequireSuccessfulHandshake = false, default) logs refusal
and proceeds; strict (true) throws and suppresses the POST. - The granted
WebHook-Allowed-Rateis tagged on the publishActivity
but not auto-enforced — the host applies its own throttling policy. - The publisher does not host the
WebHook-Request-Callbackendpoint;
it only advertises the URL for the receiver to call.
- New
-
Retry-Afteron 429 now honored — when a delivery returns
429 Too Many Requestswith aRetry-Afterheader (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);Discoverydefaults tonull(no handshake, no
WebHook-Request-Originheader). All signing, retry, and
subscriber-management behaviour is unchanged.
Full Changelog: v1.4.0...v1.5.0
v1.4.0 - Schema Governance & AsyncAPI Export
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
IEventPublishChannelMetadatainterface,EventTransportswell-known
transport string constants,IChannelMetadataSourcemarker for options
classes, andEventPublishChannelMetadata.For(...)resolver that unwraps
NamedChannelDecoratorand reads metadata from either the channel or its
options.EventPublisher.GetChannelMetadata()exposes the live pipeline
metadata for tooling. - Transport options implement
IChannelMetadataSource:RabbitMqPublishOptions,
ServiceBusPublishOptions, andWebhookPublishOptionsnow expose
transport-aware metadata (exchange,routingKey,queue,url, ...).
Storage / deferral / recovery channels (Audit Trail, Outbox, Dead-Letter)
reportEventTransports.Otherand are excluded from exported contracts. - Auto-discovery (
Hermodr.Schema.AsyncApi): newEventSchemaDiscovery
service that scans assemblies for[Event]-annotated types with a
DataVersionand returns a schema for each — the export-time counterpart of
EventSchemaRegistry.ScanAssembly. - Enriched AsyncAPI 2.x document: new
AsyncApiDocumentBuilderfluently
builds a document from schemas + channel metadata, populates RabbitMQ (AMQP)
and HTTP channel bindings, aggregates servers, and emits a publish operation
per channel. NewAddEventoverload onEventSchemaAsyncApiExtensionsenriches
a single channel with transport-specific bindings. - OpenAPI 3.1 webhook export (new package
Hermodr.Schema.OpenApi):
convertsIEventSchematoOpenApiSchema, builds awebhooksdocument with
onePOSToperation per event type whose request body references the schema
undercomponents/schemas, and preserves the transport identifier via the
x-hermodr-transportoperation extension. JSON and YAML writers
(EventSchemaOpenApiWriter,EventSchemasOpenApiWriter) provided. dotnetglobal tool (new packageHermodr.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.
- Channel metadata abstraction in
📖 Documentation
- New docs pages: Export as OpenAPI 3.1,
CLI Export Tool, and updated
Export Formats Overview. - New Docusaurus version snapshot
v1.4.0(latest); removed the unreleased
v1.3.0snapshot.
🛠 Refactoring
- Exporter library extraction (PR #100): the
hermodr-asyncapiCLI was
refactored from a monolithicProgram.csinto a packable internal library
(Hermodr.AsyncApi.Exporter) and a slim Spectre.Console.Cli shell
(Hermodr.AsyncApi.Exporter.Tool). The tool now single-targetsnet10.0
withRollForward=LatestMajor(tools cannot multi-target), and the library
is embedded in the nuspkg viaPrivateAssets=all— the install is fully
self-contained. The dual-purposesamples/asyncapi-exportWeb 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
v1.2.9 - Schema Compatibility & Event Upcasting
🚀 Features
- Schema Compatibility Checking: New
IEventSchemaCompatibilityCheckerandEventSchemaCompatibilityCheckerinHermodr.Schemathat validates whether an event can be safely upcasted to a target schema version by analyzing schema changes (additions, removals, modifications) against configurableSchemaCompatibilityLevel(Backward, Forward, Full, None) - Event Upcasting Pipeline: New
EventUpcastingPipelineandEventUpcasterRegistrysupporting ordered chains ofIEventUpcasterimplementations with JSON data adapter (JsonEventUpcastingDataAdapter) for transforming event data across schema versions - Publish-Time Upcasting Middleware: New
EventUpcastingMiddlewareinHermodr.Publisherthat automatically applies registered upcasters during the publish pipeline, with configurableMissingUpcasterBehavior(Throw/Skip) - Version-Aware Subscription Routing: New
EventFilter,EventFilterBuilder, andEventFilterEvaluatorinHermodr.Subscriptionsenabling subscription-side filtering based on event type version and data version
Change Log
Hermodr.Schema
IEventSchemaCompatibilityChecker— new interface for schema compatibility validationEventSchemaCompatibilityChecker— implementation analyzing schema changes against compatibility levelsSchemaCompatibilityLevel— enum (Backward, Forward, Full, None)SchemaCompatibilityResult— result type with pass/fail and change descriptionsSchemaChange— record type describing a single schema changeSchemaChangeType— enum (PropertyAdded, PropertyRemoved, PropertyTypeChanged, PropertyRequiredChanged)IEventUpcaster— new interface for transforming event data across schema versionsIEventUpcasterRegistry— new interface for registering and resolving upcastersEventUpcasterRegistry— default implementation with ordered upcaster chainsIEventUpcastingPipeline— new interface for executing upcaster chainsEventUpcastingPipeline— default pipeline implementationIEventUpcastingDataAdapter— new interface for format-specific data access during upcastingJsonEventUpcastingDataAdapter— JSON implementation usingJsonDocument/JsonElementUpcastContext— context object passed through the upcasting pipelineEventUpcastingException— exception type for upcasting failuresServiceCollectionExtensions— updated with upcaster registration methods
Hermodr.Publisher
EventUpcastingMiddleware— new middleware applying registered upcasters during publishEventUpcastingOptions— configuration for upcasting behaviorMissingUpcasterBehavior— enum (Throw, Skip) for handling missing upcastersEventPublisherBuilderExtensions— newUseEventUpcasting()fluent extensionEventFactory— updated with version-aware event creation helpers
Hermodr.Subscriptions
EventFilter— new type for subscription-side version filteringEventFilterBuilder— fluent builder for constructing event filtersEventFilterEvaluator— evaluates filters against incoming events
Full Changelog: v1.2.8...v1.2.9
v1.2.8 - Schema Validation
📦 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:
- Locates the registered schema for the event type (supporting versioned schemas via the
dataversionattribute) - Deserializes the payload using the appropriate format handler (JSON, XML, or future formats)
- Validates the payload against the schema definition
- 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 channelSchemaValidationOptions— Fluent configuration forMissingSchemaBehavior(Allow/Block/Fallback) andValidationFailureBehavior(Throw/Log)SchemaRegistrationsApplier— Automatically registers built-in deserializers (JSON, XML) at startupUseSchemaValidation()— One-line fluent extension onEventPublisherBuilderthat 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
IServiceProviderfor 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
- Full Diff: v1.2.7...v1.2.8
- Documentation: https://hermodr.deveel.org/docs/schema/validation-at-publish
v1.2.7 - Kista Provider Migration & Storage Refactoring
⚠ 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 byIEventDeliveryRecordFactory)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 toIOutboxMessageStore
- 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
- DeadLetter:
- New In-Memory Delivery Log Package:
Hermodr.Publisher.DeliveryLog.InMemoryInMemoryEventDeliveryLogRepository— thread-safe in-memory storage for testing and lightweight scenariosDeliveryLogBuilderExtensions— fluent configuration viaUseInMemory()
- New NDJson Delivery Log Package:
Hermodr.Publisher.DeliveryLog.NDJsonNdJsonEventDeliveryLogRepository— file-based delivery log with newline-delimited JSONNdJsonDeliveryLogOptions— configurable file path, buffer size, and async writesDeliveryLogBuilderExtensions— fluent configuration viaUseNDJson()
- Publisher Telemetry Enhancements: Core publisher package now includes built-in telemetry
PublisherTelemetry— publisher-level diagnostics wrapperChannelTelemetry— channel-level diagnostics wrapperEventPublishChannel— instrumented with telemetry support
🧪 Tests
- New test projects for storage backends:
Hermodr.Publisher.DeliveryLog.InMemory.XUnit— in-memory repository testsHermodr.Publisher.DeliveryLog.NDJson.XUnit— NDJson repository tests
- Updated tests for Kista provider model:
EntityEventDeliveryLogRepositoryTests,InMemoryEventDeliveryLogRepositoryTests,NdJsonEventDeliveryLogRepositoryTestsDeliveryLogBuilderTests,DeliveryLogMiddlewareTests,DeliveryLogPublishErrorHandlerTestsOutboxPublishChannelTests,OutboxRegistrationTests,OutboxRelayTestsFakeOutboxMessageRepository— updated forIOutboxMessageStoreinterface
- 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 wrapperChannelTelemetry— new channel-level telemetry wrapperEventPublishChannel— refactored to useChannelTelemetryfor diagnostics
Hermodr.Publisher.DeadLetter
EntityDeadLetterMessageStore— refactored for Kista provider model; EF Core storage implementationDeadLetterMessageFactoryAdapter— new adapter for message factory integrationIDeadLetterMessageFactory— extended with new methodsIDeadLetterMessageReplayer— extended with new methodsIDeadLetterMessageStore— new interface replacing repository patternIDeadLetterReplayProcessor— extended with new methodsDeadLetterBuilderExtensions— updated for Kista provider registrationInMemoryDeadLetterMessageStore— minor cleanupHermodr.Publisher.DeadLetter.csproj— dependencies updatedHermodr.Publisher.DeadLetter.EntityFramework.csproj— dependencies updated, Kista provider references added
Hermodr.Publisher.DeliveryLog (Core)
IEventDeliveryRecordFactory— new factory interface for creating delivery recordsDeliveryLogBuilder— simplified (removed repository abstraction, uses Kista provider directly)EventDeliveryRecord— simplified (properties removed to align with Kista model)IEventPublishDeliveryLog— signature updatedCloudEventJsonConverter— updated serialization logicLoggerExtensions— minor cleanupHermodr.Publisher.DeliveryLog.csproj— dependencies updatedIEventDeliveryLogRepository— 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 storageDeliveryLogBuilderExtensions— fluent configuration viaUseInMemory()Hermodr.Publisher.DeliveryLog.InMemory.csproj— new project file
Hermodr.Publisher.DeliveryLog.NDJson (New)
NdJsonEventDeliveryLogRepository— file-based delivery log with NDJson formatNdJsonDeliveryLogOptions— configurable options for NDJson storageDeliveryLogBuilderExtensions— fluent configuration viaUseNDJson()LoggerExtensions— logging helpers for NDJson operationsHermodr.Publisher.DeliveryLog.NDJson.csproj— new project file
Hermodr.Publisher.DeliveryLog.EntityFramework
EntityEventDeliveryLogRepository— refactored for Kista provider model; simplified EF Core implementationEventDeliveryRecordFactory— new factory for creating EF delivery recordsDeliveryLogBuilderExtensions— updated for Kista provider registrationDbEventDeliveryRecord— simplified (properties removed to align with Kista model)Hermodr.Publisher.DeliveryLog.EntityFramework.csproj— dependencies updated, Kista provider references added
Hermodr.Publisher.Outbox
IOutboxMessageStore— renamed fromIOutboxMessageRepository; interface simplifiedEntityOutboxMessageRepository— refactored for Kista provider modelOutboxChannelBuilder— simplified (removed manager/validator layers)OutboxPublishChannel— updated to useIOutboxMessageStoreOutboxRelayProcessor— simplified relay logicOutboxRelayService— minor cleanupOutboxRelayOptions— minor cleanupIOutboxMessage— minor updatesEventPublisherBuilderExtensions— updated for Kista provider registrationOutboxChannelBuilderExtensions— simplified registrationHermodr.Publisher.Outbox.csproj— dependencies updatedHermodr.Publisher.Outbox.EntityFramework.csproj— dependencies updated, Kista provider references addedOutboxMessageManager— 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 comparisondocs/packages.md— updated package reference with new InMemory and NDJson delivery log packagesdocs/frameworks-comparison.md— new comparison guide for Hermodr vs other .NET messaging frameworksdocs/publishers/delivery-log.md— updated for Kista provider modeldocs/publishers/outbox.md— updated for simplified outbox architecturedocs/publishers/dead-letter.md— minor cleanupdocs/roadmap.md— updated with migration progressdocs/getting-started/installation.md— updated for Kista dependenciesdocs/SUMMARY.md— updated navigation
v1.2.6 - OpenTelemetry Enhancements
🚀 Features
- Unified Diagnostics Infrastructure: New centralized telemetry and diagnostics system spanning all publisher and subscription components (#89)
HermodrDiagnostics— centralActivitySourceandMeterfor the entire pipelinePublisherTelemetry,ChannelTelemetry,SubscriptionTelemetry— per-component telemetry wrappersPipelineDiagnosticsMiddleware/PipelineDiagnosticsTelemetry— pipeline-level diagnostics middlewareTelemetryConstantspromoted fromHermodr.Publisher.OpenTelemetryto coreHermodr.Publisherfor 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 telemetry classes:
- 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,OpenTelemetryBuilderExtensionsTestsPipelineDiagnosticsMiddlewareTests,PipelineDiagnosticsTelemetryTestsPublisherMetricsTests,SubscriptionMetricsTestsTelemetryConstantsTests,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 centralActivitySourceandMeterfor publisher diagnosticsPublisherTelemetry— new publisher-level telemetry wrapperChannelTelemetry— new channel-level telemetry wrapperTelemetryConstants— moved fromHermodr.Publisher.OpenTelemetryto core; defines activity source names, meter names, and tag keysEventPublisher— refactored to emit diagnostics throughHermodrDiagnosticsEventPublishChannel— refactored to emit channel-level traces and metrics
Hermodr.Subscriptions
SubscriptionTelemetry— new subscription-level telemetry wrapperEventDispatcher— refactored to emit dispatch traces and metrics throughSubscriptionTelemetry
Hermodr.Publisher.OpenTelemetry
OpenTelemetryBuilderExtensions— new fluent extensions for wiring diagnosticsPipelineDiagnosticsMiddleware/PipelineDiagnosticsTelemetry— new middleware for pipeline-level diagnosticsHermodrTelemetry— refactored to delegate to core diagnosticsTelemetryMetrics— refactored to use core meterMetricsOptions— modified to align with new diagnosticsOpenTelemetryPublishMiddleware,OpenTelemetrySubscriptionMiddleware— refactored for new diagnostics pipelineTelemetryConstants— removed (moved to coreHermodr.Publisher)
Hermodr.Publisher.AuditTrail
AuditTrailTelemetry— new telemetry classAuditTrailPublishChannel— instrumented withAuditTrailTelemetry
Hermodr.Publisher.AzureServiceBus
ServiceBusTransportTelemetry— new telemetry classServiceBusPublishChannel— instrumented withServiceBusTransportTelemetry
Hermodr.Publisher.DeadLetter
DeadLetterTelemetry— new telemetry classDeadLetterMessageReplayer— instrumented withDeadLetterTelemetryDeadLetterReplayProcessor— instrumented withDeadLetterTelemetryDeadLetterStorageHandler— refactored to useDeadLetterTelemetry
Hermodr.Publisher.MassTransit
MassTransitTransportTelemetry— new telemetry classMassTransitPublishChannel— instrumented withMassTransitTransportTelemetry
Hermodr.Publisher.Outbox
OutboxTelemetry— new telemetry classOutboxPublishChannel— refactored to useOutboxTelemetryOutboxRelayProcessor— refactored to useOutboxTelemetry
Hermodr.Publisher.RabbitMq
RabbitMqTransportTelemetry— new telemetry classRabbitMqPublishChannel— instrumented withRabbitMqTransportTelemetry
Hermodr.Publisher.Webhook
WebhookTransportTelemetry— new telemetry classWebhookPublishChannel— instrumented withWebhookTransportTelemetry
Tests (Hermodr.Publisher.OpenTelemetry.XUnit)
ChannelMetricsTests— channel-level metrics validationHermodrDiagnosticsTests— diagnostics source and meter testsHermodrTelemetryTests— extended telemetry coverageOpenTelemetryBuilderExtensionsTests— builder extension validationPipelineDiagnosticsMiddlewareTests— middleware behavior testsPipelineDiagnosticsTelemetryTests— pipeline telemetry validationPublisherMetricsTests— publisher-level metrics testsSubscriptionMetricsTests— subscription-level metrics testsTelemetryConstantsTests— constant and tag key validationTelemetryEdgeCasesTests— edge case coverage for telemetryTelemetryMetricsTests— metrics recording validationTelemetryTagsTests— tag propagation testsEndToEndTracePropagationTests— extended to include new diagnostics pathsMetricsMiddlewareTests— removed (superseded by new diagnostics)- AssemblyInfo and project file updates
Full Changelog: v1.2.5...v1.2.6
v1.2.5 - Audit Trails
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 entriesHermodr.AuditTrail.InMemory— in-memory audit trail backend for testing and lightweight scenariosHermodr.AuditTrail.EntityFramework— EF Core backend for persisting audit trail entries to relational databasesHermodr.AuditTrail.NDJson— file-based backend using newline-delimited JSON with automatic file rolling, retention policies, and a pluggable filesystem abstractionHermodr.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>,IAuditTrailEntryinterfacesAuditTrailEntry— default implementation withFromCloudEvent()factoryAuditTrailBuilder— fluent DI registration builderAuditTrailStreamQuery— 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 storeUseInMemory()/AddInMemoryAuditTrail()/AddAuditTrailQuerying()extensions
Hermodr.AuditTrail.EntityFramework
AuditTrailDbContext— EF Core DbContext with audit trail entity setsDbAuditTrailEntry/DbAuditTrailAttribute— EF entities with convertersEntityAuditTrailRepository— filtered streaming viaIQueryableEntityAuditTrail— EF Core writer + reader implementationUseEntityFramework()/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 bySystem.IO.Abstractions) - Async streaming reads with concurrent writer support
- Auto file rolling by size (
NdJsonAuditTrailOptions— configurable directory, file naming, buffer sizeUseNDJson()/AddNDJsonAuditTrail()/AddNDJsonAuditTrailQuerying()extensions
Hermodr.Publisher.AuditTrail
AuditTrailPublishChannel/AuditTrailPublishChannel<TEvent>— records published events to audit trailBypassAuditTrailOptions— prevents infinite loops during replay/relay- 4 overloads of
AddAuditTrail()onEventPublisherBuilder
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 endpointssamples/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
What's Changed
⚠ Breaking Changes
- Project Rename: The project has been renamed from
Deveel.Eventsto Hermodr, giving it a new identity disconnected from the Deveel brand (#80).- All package names changed from
Deveel.Events.*toHermodr.* - All namespaces reorganized to match the new naming
- Solution file renamed from
Deveel.Events.slntoHermodr.sln - Migration path: update package references and
usingdirectives accordingly
- All package names changed from
🚀 Features
- OpenTelemetry Support: New
Hermodr.Publisher.OpenTelemetrypackage providing distributed tracing, metrics collection, and W3C trace context propagation via CloudEvents extensions (#81)OpenTelemetryPublishMiddleware— injects trace context into outgoing CloudEventsOpenTelemetrySubscriptionMiddleware— restores parent trace context on incoming eventsMetricsMiddleware— 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,OpenTelemetryPublishMiddlewareTestsOpenTelemetrySubscriptionMiddlewareTests,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.OpenTelemetrydemonstrating distributed tracing setup - All docs updated to reflect the Hermodr rename and new package names
Full Changelog: v1.2.3...v1.2.4