Repository navigation
JasperFx 2.68.0
Two additions to the store-agnostic IEventStore surface, both driven by what a monitoring console that ships one assembly against Marten, Polecat and Fisher alike cannot reach today. Additive and non-breaking — every member is a default interface implementation.
IEventStore.RegisteredShardNames() (#815, #816)
AllShards() is declared only on IEventStore<TOperations, TQuerySession>, so reaching it means naming a closed generic per store. RegisteredShardNames() is the non-generic way in, and it supplies the expected half of the expected-versus-observed correlation that IEventDatabase.FetchProjectionLagAsync already performs against one database's progression rows — the half that lets ProjectionLag.HasProgressionRow tell "registered here, never started here" from "at zero".
The generic interface satisfies it from AllShards(), so no store needs to change. The non-generic default throws rather than returning an empty list: an empty registry is a meaningful answer, and handing one back is indistinguishable from "nothing is registered".
Database-scoped explorer reads (#810, #817)
The explorer reads were scoped by tenant only. On a store whose DatabaseCardinality is not Single, a store-global read answers from whichever database the default session resolved and looks exactly like a complete answer. New overloads take an IEventDatabase, in the shape FetchProjectionLagAsync and DeleteProjectionProgressAsync already use:
GetRecentStreamsAsync(IEventDatabase, int, string?, CancellationToken)ReadStreamAsync(IEventDatabase, string, string?, CancellationToken)GetStreamMetadataAsync(IEventDatabase, string, string?, CancellationToken)QueryByTagsAsync(IEventDatabase, IReadOnlyDictionary<string, string>, string?, CancellationToken)GetProjectionStatusesAsync(IEventDatabase, string?, CancellationToken)
A tool enumerates AllDatabases() and reads each one, attributing the answer to the database it came from. The default delegates on a single-database store (so those are correct with no implementation work), refuses on a multi-database one rather than answering from whichever database it happened to open, and rejects a null database rather than letting it read as "store-global".
Store-side follow-ups — deciding the tenant predicate by tenancy style rather than cardinality, and making a store-global read on a multi-database store fan out or throw — are tracked in JasperFx/marten#5383, JasperFx/polecat#584 and JasperFx/fisher#240.
Compliance
EventStoreExplorerCompliance gained single-database coverage of the new overloads (skipped unless a store reports exactly one database through AllDatabases()), and AsyncDaemonCompliance asserts RegisteredShardNames() off the non-generic interface.