Skip to content

Releases: jet/equinox

CosmosStore tool extensions + pluggable compression

04 Feb 12:20

Choose a tag to compare

Released 2025-06-12

Added

  • Equinox.CosmosStore: Roundtrip D and M encoding values as per DynamoStore, enabling more extensive control of compression #472
  • Equinox.CosmosStore: Use Microsoft.Azure.Cosmos integrated System.Text.Json support; added ability to specify serializerOptions #467
  • Equinox.CosmosStore: Group metrics by Container Name #449
  • Equinox.CosmosStore: Group metrics by Category; split out Tip activity #453
  • Equinox.CosmosStore: Support Ingesting unfolds #460
  • Equinox.CosmosStore.EventsContext.Sync: Support syncing of unfolds #460
  • eqx: -Q flag omits timestamps from console output logging #473
  • eqx destroy: Support for deleting the items (documents) underlying a category/stream/arbitrary WHERE clause #473
  • eqx top: Support for analyzing space usage for event and view containers by category and/or stream #473
  • eqx dump, eqx query: -sl Support for specifying streams to dump via a CosmosDB LIKE expression #473
  • eqx dump: -Q strips intervals, regularizes snapshots, logs stream names #473
  • eqx stats: -O, -N flags extract oldest and newest _ts within a store #459
  • eqx stats: -U flag to count streams with unfolds and total number thereof #473
  • eqx stats: -I flag; relabel Documents as Items, retaining existing -D flag #473

Changed

  • Equinox.*Store,Equinox.*Store.Prometheus: Pin Equinox dependencies to [4.0.3, 5.0.0)] #448
  • Equinox.CosmosStore: Update System.Text.Json dep to 6.0.10 per CVE-2024-43485 #470
  • Equinox.CosmosStore: Minimum Microsoft.Azure.Cosmos requirement updated to 3.43.1 to avail of integrated System.Text.Json support #467
  • Equinox.CosmosStore.CosmosStoreConnector: Removed mandatory requestTimeout argument #467
  • Equinox.DynamoStore: Up min FSharp.AWS.DynamoDB to v 0.12.3-beta to handle breaking change #474
  • Equinox.MessageDb: Up min Npgsql to v 7.0.7 as 7.0.0 is on CVE blacklist
  • Equinox.MemoryStore: Remove unused TrySync args #466

Removed

  • eqx stats: -A (all stats) is now the default unless you specify >=1 of the individual stats via ESDNO flags #459
  • Equinox.CosmosStore.CosmosStoreCategory: Removed shouldCompress mechanism as compression is now external #472

Equinox: Fix stale values/TaskCanceledException with LoadOption.(AllowStale|AnyCachedValue)

11 Apr 01:28

Choose a tag to compare

Released components: Equinox

Fix

  • Equinox: LoadOption.AnyCachedValue, LoadOption.AllowStale prevent yielding of superseded value where overlapping call in flight #452
  • Equinox: LoadOption.AnyCachedValue, LoadOption.AllowStale prevent incorrect TaskCanceledException outcome where overlapping call cancelled #452
  • Equinox: LoadOption.AnyCachedValue, LoadOption.AllowStale correct 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)

11 Apr 01:17

Choose a tag to compare

Released components: Equinox

Fix

  • Equinox: LoadOption.AnyCachedValue, LoadOption.AllowStale caches and continually yields TaskCanceledException where 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

20 Mar 02:29

Choose a tag to compare

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 the Propulsion.DynamoStore.* packages), using FSharp.AWS.DynamoDB 🙏 @ameier38 @epNickColeman @samritchie
  • EventStoreDb: Replacement for the EventStore package (which uses the deprecated EventStore DB TCP/IP protocol) that uses their modern gRPC stack 🙏 @oskardudycz @thefringeninja @keppelerj
  • MessageDb: 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) 🙏 @nordfjord
  • LoadMode.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 🙏 @brihadish
  • DeciderCore: C#-optimized API (arrays, Func, Task<T>, ValueTuple etc)
  • Internal rewrite for performance, replacing usage of F# async with task, and AsyncSeq with [TaskSeq](https://github.com/fsprojects/fsharp.control.taskseq] 🙏 @abelbraaksma
  • CosmosStore supports 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 @raghuAtRA
  • CosmosStore internal implementation is now entirely based on System.Text.Json, with no internal Newtonsoft.Json usage) @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 any netstandard2.0 support)
  • 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 to System.ReadOnlyMemory<byte>
  • Category base class enables significantly simpler wiring (see Factory/Store.Config structure in /samples and dotnet-templates
  • Clearer Category APIs (e.g. name is passed to the constructor)
  • Removal usage of F#-specific and/or otherwise deprecated types from the public interfaces:
  • FSharpFunc->Func
  • System.Tuple->System.ValueTuple
  • list/seqs of events as returned from Decision functions are now arrays

Added

  • Equinox: Decider.Transact, TransactEx overloads #325
  • Equinox.LoadOption.RequireLeader: support for requesting a consistent read of a stream #341
  • Equinox.LoadOption.AllowStale: Read mode that limits reads to a maximum of one retrieval per the defined time window #386
  • Equinox.Category base class, with Decider and Stream helper modules #337
  • Equinox.DeciderCore: C# friendly equivalent of Decider (i.e. Func and Task) #338
  • Equinox.ISyncContext.StreamEventBytes: Exposes stored size of events in the stream (initial impl provides it for DynamoStore only) #326
  • Equinox.Core.Batching: BatcherDictionary, BatcherCache to host concurrent Batchers #390
  • Equinox.Core.Batching: Add limiter: SemaphoreSlim argument to extend linger phase #427
  • CosmosStore.CosmosStoreConnector: Connect, ConnectAsync #421
  • CosmosStore.Exceptions: Active patterns to simplify classification in the context of Propulsion handlers #416
  • CosmosStore.Prometheus: Add rut tag to enable filtering/grouping by Read vs Write activity as per DynamoStore #321
  • DynamoStore/DynamoStore.Prometheus: Implements the majority of the CosmosStore functionality via FSharp.AWS.DynamoDB #321
  • EventStore: Revise test rig to target a Docker-hosted cluster #317
  • EventStoreDb: As per EventStore module, but using the modern EventStore.Client.Grpc.Streams client #196
  • MessageDb: Implements a message-db storage backend #339 with OpenTelemetry tracing and snapshotting support #348 🙏 @nordfjord
  • eqx init --indexUnfolds cosmos: enables querying uncompressed unfolds (see shouldCompress) #434
  • eqx query cosmos: Queries based on uncompressed unfolds (see eqx init -U) #434
  • eqx query -o FILEPATH cosmos: Allows capture of raw JSON to a file #444
  • eqx dump: -s flag is now optional
  • eqx stats: -A flag to request all stats (equivalent to requesting -ESD) #424

Changed

  • Change surface APIs that use Tuples and Options to struct equivalents. Some due to struct changes in FsCodec #82, and use task in hot paths #337
  • Change surface APIs that use'event list or 'event seq to 'event[] #411
  • Raise FSharp.Core req to 6.0.7, framework req to net6.0 #310 #337 #33 #411
  • Replace AsyncSeq usage with FSharp.Control.TaskSeq v 0.4.0 #361 #391
  • Equinox: Move Serilog dependency from Decider constructor to Category/Decider.forStream #337 #419
  • Equinox: FsCodec.StreamId replaces usage of FsCodec.StreamName #353 #378 #419
  • Equinox.ResolveOption: rename to LoadOption #308 #413
  • Equinox.LoadOption: Rename AllowStale to AnyCachedValue #386
  • Equinox.Decider: Replace 'event list with 'event[] #411
  • Equinox.Decider: Replace maxAttempts with a default policy and an optional argument on Transact* APIs #337
  • Equinox.Decider: rename Decider.TransactAsync, Decider.TransactExAsync to Transact #314
  • Equinox.Core.AsyncBatchingGate: renamed to Batching.Batcher #390
  • Equinox.Core.AsyncCacheCell: renamed to TaskCell #433
  • Equinox.Core: Now a free-standing library that a) does not depend on Equinox b) is not depended on by the Stores (though CosmosStore inlines TaskCell) #420
  • Stores: Change Event Body types, requiring FsCodec v 3.0.0, with EventBody types switching from byte[] to ReadOnlyMemory<byte> and/or JsonElement see FsCodec#75 #323
  • Stores: *Category.Resolve: Replace Resolve(sn, ?ResolveOption, ?requestContext) with ?load = LoadOption parameter on all Transact and Query methods, and Decider.forStream/Decider.forRequest to convey request context #308
  • Stores: *Category ctor: Add mandatory name argument, and Name property #410
  • Stores: *Category ctor: Change fold to be a Func (no changes to F# code required) #421
  • Stores: *Category ctor: Change caching to be last argument, to reflect that it is applied over the top #410
  • Stores: *Category ctor: Change caching and access to be mandatory, adding NoCaching and Unoptimized modes to represent the former defaults #417
  • CosmosStore: Require Microsoft.Azure.Cosmos v 3.35.4 #310
  • CosmosStore: Switch to natively using JsonElement event bodies #305 🙏 @ylibrach
  • CosmosStore: Switch to natively using System.Text.Json for serialization of all Microsoft.Azure.Cosmos round-trips #305 🙏 @ylibrach
  • CosmosStore: Only log bytes when log level is Debug #305
  • CosmosStore.AccessStrategy.MultiSnapshot,Custom: Change list and...
Read more

Eqx Tool polishing / backports from V4

25 Jul 15:31

Choose a tag to compare

See CHANGELOG

Changed

  • eqx dump/Equinox.Tool: Flip -P option to opt in to pretty printing for events #313

Removed

  • eqx dump/Equinox.Tool: Add -F option to opt out of pretty printing unfolds #319
  • eqx dump/Equinox.Tool: Show payload statistics #323
  • eqx dump/Equinox.Tool: Add -B option to prevent assuming UTF-8 bodies #323

Fixed

  • CosmosStore: Fixed mis-Indexing of Unfolds when >1 Unfold present #322 #324
  • eqx dump/Equinox.Tool: Use System.Text.Json for pretty printing to handle null values correctly #319

Fix pruned events fallback handling

18 Jan 23:06

Choose a tag to compare

See CHANGELOG

Changed

  • CosmosStore: Cleanup Microsoft.Azure.Cosmos calls #303

Removed

  • Removed Grafana spec now that canonical is in dotnet-templates #304

Fixed

  • CosmosStore: Fix fallback detection when all events pruned from Tip #306

Add Cosmos AutoScale mode to Tool, Fix MemoryStore TransactEx

18 Nov 10:49

Choose a tag to compare

See CHANGELOG

Added

Fixed

  • MemoryStore: Fixed incorrect Version computation for TransactEx post-State #296

Fix dropping of events when when using caching without snapshots with multiple writers

15 Oct 15:26

Choose a tag to compare

See CHANGELOG

Fix

  • CosmosStore: Fix dropping of events under reload with multiple writers, caching but not using snapshots #295 🙏 @ragiano215

EventStore: Add customize hook to Connector

16 Sep 09:37

Choose a tag to compare

See CHANGELOG

Added

  • EventStore: Add customize hook to Connector #286

Fix CI AssemblyVersion stamping

13 Sep 09:16

Choose a tag to compare

See CHANGELOG

Fixed/Changed

  • Updated to MinVer 2.5.0, .NET SDK 5.0.200 in order to fix internal AssemblyVersion stamping 🙏 @Mousaka