Skip to content

Releases: jet/equinox

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

11 Apr 01:28
Compare
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
Compare
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
Compare
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
Compare
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
Compare
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
Compare
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
Compare
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
Compare
Choose a tag to compare

See CHANGELOG

Added

  • EventStore: Add customize hook to Connector #286

Fix CI AssemblyVersion stamping

13 Sep 09:16
Compare
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

Fix ConnectionMode default, Add CosmosStoreConnector

23 Jun 12:11
Compare
Choose a tag to compare

See CHANGELOG

Added

  • CosmosStore.CosmosStoreConnector: Wrapper for CosmosClientFactory enabling cleaner consumer code #292

Fixed

CosmosStore: Reinstate default connection mode as Direct per #281 #287