Releases: jet/equinox
Releases · jet/equinox
CosmosStore tool extensions + pluggable compression
Released 2025-06-12
Added
Equinox.CosmosStore: RoundtripDandMencoding values as perDynamoStore, enabling more extensive control of compression #472Equinox.CosmosStore: UseMicrosoft.Azure.CosmosintegratedSystem.Text.Jsonsupport; added ability to specifyserializerOptions#467Equinox.CosmosStore: Group metrics by Container Name #449Equinox.CosmosStore: Group metrics by Category; split outTipactivity #453Equinox.CosmosStore: Support Ingesting unfolds #460Equinox.CosmosStore.EventsContext.Sync: Support syncing of unfolds #460eqx:-Qflag omits timestamps from console output logging #473eqx destroy: Support for deleting the items (documents) underlying a category/stream/arbitraryWHEREclause #473eqx top: Support for analyzing space usage for event and view containers by category and/or stream #473eqx dump,eqx query:-slSupport for specifying streams to dump via a CosmosDBLIKEexpression #473eqx dump:-Qstrips intervals, regularizes snapshots, logs stream names #473eqx stats:-O,-Nflags extract oldest and newest_tswithin a store #459eqx stats:-Uflag to count streams with unfolds and total number thereof #473eqx stats:-Iflag; relabel Documents as Items, retaining existing-Dflag #473
Changed
Equinox.*Store,Equinox.*Store.Prometheus: PinEquinoxdependencies to[4.0.3, 5.0.0)] #448Equinox.CosmosStore: UpdateSystem.Text.Jsondep to6.0.10per CVE-2024-43485 #470Equinox.CosmosStore: MinimumMicrosoft.Azure.Cosmosrequirement updated to3.43.1to avail of integratedSystem.Text.Jsonsupport #467Equinox.CosmosStore.CosmosStoreConnector: Removed mandatoryrequestTimeoutargument #467Equinox.DynamoStore: Up minFSharp.AWS.DynamoDBto v0.12.3-betato handle breaking change #474Equinox.MessageDb: Up minNpgsqlto v7.0.7as7.0.0is on CVE blacklistEquinox.MemoryStore: Remove unused TrySync args #466
Removed
Equinox: Fix stale values/TaskCanceledException with LoadOption.(AllowStale|AnyCachedValue)
Released components: Equinox
Fix
Equinox:LoadOption.AnyCachedValue,LoadOption.AllowStaleprevent yielding of superseded value where overlapping call in flight #452Equinox:LoadOption.AnyCachedValue,LoadOption.AllowStaleprevent incorrectTaskCanceledExceptionoutcome where overlapping call cancelled #452Equinox:LoadOption.AnyCachedValue,LoadOption.AllowStalecorrect to ensure optimal loading where first flight was in progress #452
Full Changelog: 4.0.2...4.0.3
NOTE the version pinning changes under tag 4.0.1 remain unreleased (there will be explicit releases of the Equinox.*Store packages over time)
Equinox: remove potential TaskCancelledException with LoadOption.(AllowStale|AnyCachedValue)
Released components: Equinox
Fix
Equinox:LoadOption.AnyCachedValue,LoadOption.AllowStalecaches and continually yieldsTaskCanceledExceptionwhere request cancelled #451
Full Changelog: 4.0.0...4.0.2
NOTE the version pinning changes under tag 4.0.1 remain unreleased (there will be explicit releases of the Equinox.*Store packages
Add DynamoStore, EventStoreDb, MessageDb, eqx query, LoadOption.AllowStale, DeciderCore; Update to FsCodec 3.0 JsonElement/ReadOnlyMemory event bodies
This release is about 3 major versions in one (as evidenced by 1 alpha, 12 beta, 17 rc and multiple interim nuget releases!)
Major new features:
DynamoStore: Full ground-up store implementation (including indexing/changefeed in thePropulsion.DynamoStore.*packages), usingFSharp.AWS.DynamoDB🙏 @ameier38 @epNickColeman @samritchieEventStoreDb: Replacement for theEventStorepackage (which uses the deprecatedEventStore DBTCP/IPprotocol) that uses their modern gRPC stack 🙏 @oskardudycz @thefringeninja @keppelerjMessageDb: Full ground-up store implementation for PostgreSQL based on Message DB with strong Open Telemetry support (that will eventually be implemented similarly across the board) 🙏 @nordfjordLoadMode.AllowStale: Support for bounded staleness (and limiting concurrent reads), enabling use for non-trivial read activity without having to adhere to strict CQRS separation and/or eventual consistency 🙏 @brihadishDeciderCore: C#-optimized API (arrays,Func,Task<T>,ValueTupleetc)- Internal rewrite for performance, replacing usage of F#
asyncwithtask, andAsyncSeqwith [TaskSeq](https://github.com/fsprojects/fsharp.control.taskseq] 🙏 @abelbraaksma CosmosStoresupports hydrating streams based on queries for Tip documents from across streams (i.e. you can now efficiently render a paged list of items based on search criteria against the snaphot's state in the Tip, in addition to the existing individual stream APIs) @brihadish @raghuAtRACosmosStoreinternal implementation is now entirely based onSystem.Text.Json, with no internalNewtonsoft.Jsonusage) @ylibrach- significant naming and structural influences based on the EquinoxJS project instigated by by
Einar Norðfjörð 🙏 @nordfjord
API changes summary:
- All packages require
net6.0(i.e. it works seamlessly with NET 6.0 and and later, but there is no longer anynetstandard2.0support) - Relies on
FsCodec v3's FsCodec.StreamId(replacing the lower-level StreamName abstraction), streamlining how identity types get mapped to stream names- Migrates from
byte[]Event Bodies toSystem.ReadOnlyMemory<byte> Categorybase class enables significantly simpler wiring (seeFactory/Store.Configstructure in/samplesanddotnet-templates- Clearer Category APIs (e.g.
nameis passed to the constructor) - Removal usage of F#-specific and/or otherwise deprecated types from the public interfaces:
FSharpFunc->FuncSystem.Tuple->System.ValueTuplelist/seqs of events as returned from Decision functions are now arrays
Added
Equinox:Decider.Transact,TransactExoverloads #325Equinox.LoadOption.RequireLeader: support for requesting a consistent read of a stream #341Equinox.LoadOption.AllowStale: Read mode that limits reads to a maximum of one retrieval per the defined time window #386Equinox.Categorybase class, withDeciderandStreamhelpermodules #337Equinox.DeciderCore: C# friendly equivalent ofDecider(i.e.FuncandTask) #338Equinox.ISyncContext.StreamEventBytes: Exposes stored size of events in the stream (initial impl provides it forDynamoStoreonly) #326Equinox.Core.Batching:BatcherDictionary,BatcherCacheto host concurrentBatchers#390Equinox.Core.Batching: Addlimiter: SemaphoreSlimargument to extend linger phase #427CosmosStore.CosmosStoreConnector:Connect,ConnectAsync#421CosmosStore.Exceptions: Active patterns to simplify classification in the context of Propulsion handlers #416CosmosStore.Prometheus: Addruttag to enable filtering/grouping by Read vs Write activity as perDynamoStore#321DynamoStore/DynamoStore.Prometheus: Implements the majority of theCosmosStorefunctionality viaFSharp.AWS.DynamoDB#321EventStore: Revise test rig to target a Docker-hosted cluster #317EventStoreDb: As perEventStoremodule, but using the modernEventStore.Client.Grpc.Streamsclient #196MessageDb: Implements a message-db storage backend #339 with OpenTelemetry tracing and snapshotting support #348 🙏 @nordfjordeqx init --indexUnfolds cosmos: enables querying uncompressed unfolds (seeshouldCompress) #434eqx query cosmos: Queries based on uncompressed unfolds (seeeqx init -U) #434eqx query -o FILEPATH cosmos: Allows capture of raw JSON to a file #444eqx dump:-sflag is now optionaleqx stats:-Aflag to request all stats (equivalent to requesting-ESD) #424
Changed
- Change surface APIs that use Tuples and Options to
structequivalents. Some due tostructchanges inFsCodec#82, and usetaskin hot paths #337 - Change surface APIs that use
'event listor'event seqto'event[]#411 - Raise
FSharp.Corereq to6.0.7, framework req tonet6.0#310 #337 #33 #411 - Replace
AsyncSequsage withFSharp.Control.TaskSeqv0.4.0#361 #391 Equinox: MoveSerilogdependency fromDeciderconstructor toCategory/Decider.forStream#337 #419Equinox:FsCodec.StreamIdreplaces usage ofFsCodec.StreamName#353 #378 #419Equinox.ResolveOption: rename toLoadOption#308 #413Equinox.LoadOption: RenameAllowStaletoAnyCachedValue#386Equinox.Decider: Replace'event listwith'event[]#411Equinox.Decider: ReplacemaxAttemptswith a default policy and an optional argument onTransact*APIs #337Equinox.Decider: renameDecider.TransactAsync,Decider.TransactExAsynctoTransact#314Equinox.Core.AsyncBatchingGate: renamed toBatching.Batcher#390Equinox.Core.AsyncCacheCell: renamed toTaskCell#433Equinox.Core: Now a free-standing library that a) does not depend onEquinoxb) is not depended on by the Stores (thoughCosmosStoreinlinesTaskCell) #420- Stores: Change Event Body types, requiring
FsCodecv3.0.0, withEventBodytypes switching frombyte[]toReadOnlyMemory<byte>and/orJsonElementsee FsCodec#75 #323 - Stores:
*Category.Resolve: ReplaceResolve(sn, ?ResolveOption, ?requestContext)with?load = LoadOptionparameter on allTransactandQuerymethods, andDecider.forStream/Decider.forRequestto convey request context #308 - Stores:
*Categoryctor: Add mandatorynameargument, andNameproperty #410 - Stores:
*Categoryctor: Changefoldto be aFunc(no changes to F# code required) #421 - Stores:
*Categoryctor: Changecachingto be last argument, to reflect that it is applied over the top #410 - Stores:
*Categoryctor: Changecachingandaccessto be mandatory, addingNoCachingandUnoptimizedmodes to represent the former defaults #417 CosmosStore: RequireMicrosoft.Azure.Cosmosv3.35.4#310CosmosStore: Switch to natively usingJsonElementevent bodies #305 🙏 @ylibrachCosmosStore: Switch to natively usingSystem.Text.Jsonfor serialization of allMicrosoft.Azure.Cosmosround-trips #305 🙏 @ylibrachCosmosStore: Only logbyteswhen log level isDebug#305CosmosStore.AccessStrategy.MultiSnapshot,Custom: Changelistand...
Eqx Tool polishing / backports from V4
See CHANGELOG
Changed
eqx dump/Equinox.Tool: Flip-Poption to opt in to pretty printing for events #313
Removed
eqx dump/Equinox.Tool: Add-Foption to opt out of pretty printing unfolds #319eqx dump/Equinox.Tool: Show payload statistics #323eqx dump/Equinox.Tool: Add-Boption to prevent assuming UTF-8 bodies #323
Fixed
Fix pruned events fallback handling
Add Cosmos AutoScale mode to Tool, Fix MemoryStore TransactEx
See CHANGELOG
Added
- Expose
.Log.PropertyTagLiterals to enable log filtering #298 Equinox.Tool: Add support for autoscaling throughput of Cosmos containers and databases #302 @belcher-rok
Fixed
MemoryStore: Fixed incorrectVersioncomputation forTransactExpost-State #296
Fix dropping of events when when using caching without snapshots with multiple writers
See CHANGELOG
Fix
- CosmosStore: Fix dropping of events under reload with multiple writers, caching but not using snapshots #295 🙏 @ragiano215