Tags: jilio/ebu
Tags
chore(release): record ebu v0.17.0 sums in sub-modules
chore(release): record ebu v0.17.0 sums in sub-modules
fix: address library review — silent replay truncation, store contrac… …ts, state hardening Core: - Replay treats an empty batch with an advancing offset as a gap to skip, not the tail; only a non-advancing offset ends the stream - SubscribeWithReplay's replay passes take the Sequential() handler mutex, so live delivery can no longer overlap a replayed delivery - Duplicate upcaster registration for the same source type is rejected instead of silently never running - OffsetNewest resolves to the concrete current tail in MemoryStore (previously "$" sorted before all offsets and replayed from the start) sqlite: - streamBatch checks rows.Err(), so mid-iteration failures (incl. context cancellation) surface instead of ending a replay cleanly and early - OffsetNewest resolves to MAX(position); per-row cancellation checks; prepared statement reused across batches durablestream: - Default HTTP client carries the configured timeout (WithTimeout was dead code in the pinned client; a hung remote wedged all publishers) - Read advances past chunks with no decodable events, bounded by the server's UpToDate signal - Cached stream writer detached from its creator's context; backoff capped; at-least-once append semantics documented (Seq-based dedup is unsafe with stream-global sequence tokens) state (breaking): - Store methods return errors; the materializer never advances LastOffset past a failed store write - Apply routes by StoredEvent.Type; foreign events with a "headers" field no longer wedge replay or misfire as control messages - Collections sharing one Store are scoped to their entityType/ prefix - WithApplyErrorPolicy(ApplySkip) + ErrUndecodable for poison messages; strict mode reports unknown control values - Pointer entity types with a TypeNamer no longer panic - SaveSnapshotTo runs snapshot I/O outside the apply lock; concurrent savers serialized otel: - Explicit sub-millisecond duration buckets; spans carried via private context keys; error attribute on duration records; no SetStatus(Ok) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fix: reject dead interface registrations, harden SubscribeWithReplay,… … add ReplayErrorPolicy Reviewed the bus end to end; this release closes the sharp edges found: - Subscribe/SubscribeContext/SubscribeWithReplay/RegisterUpcast reject interface types that could never fire (publish routes by concrete type). - SubscribeWithReplay runs ALL validation (nil bus/handler/options, filter shape) before the replay pass; a failing call delivers nothing and saves no offsets. Options are applied exactly once via a shared buildHandler/addHandler chokepoint. - WithFilter now applies to replayed events exactly like live delivery. - New WithReplayErrorPolicy(ReplaySkip): durable, reported skip of poison events so one undecodable event cannot wedge a subscription or spam the error handler on every restart. - Documented the WithAsyncHandlerLimit re-entrant publish deadlock. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chore(release): release fixes as v0.12.0 The Gitea remote already carries a v0.11.0 tag (cut locally before these fixes, never pushed to GitHub), so the fix release becomes v0.12.0 to keep published tags immutable. Sub-module requires bumped accordingly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chore(release): record ebu v0.16.0 sums in sub-modules Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PreviousNext