Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!(CosmosStore): Azure.Cosmos 'V4' support / enable mocking Cosmos APIs #197

Draft
wants to merge 86 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
0cd50f9
Target FSharp.Control.AsyncSeq 2.0.23
bartelink Feb 19, 2020
48fea8d
Change Cosmos to netstandard2.1, tools to netcoreapp3.1
bartelink Feb 19, 2020
59fda04
Make tests pass
bartelink Aug 16, 2019
723c7d8
Reduce leniency on stored proc call
bartelink Aug 20, 2019
3baeb3e
V4
bartelink Feb 11, 2020
fa23d16
Up to L365
bartelink Feb 11, 2020
bbd90c6
Correctly retrieve request charge from Azure.Core response types; Swi…
ylibrach Feb 11, 2020
8485484
Migrate to new etag match predicate
ylibrach Feb 12, 2020
65c27d6
Migrate from FeedIterator to IAsyncEnumerable
ylibrach Feb 12, 2020
4aa3319
Only set gateway options when in Gateway mode
ylibrach Feb 18, 2020
26fd82e
Add and use NewtonsoftJsonSerializer
ylibrach Feb 18, 2020
f2a0633
Rearrange files
ylibrach Feb 18, 2020
482b797
Fix test RU limits
ylibrach Feb 18, 2020
a36e742
Remove Microsoft.Azure.Cosmos.Direct ref
bartelink Feb 19, 2020
f09a731
Change from byte[] payloads to STJ.JsonElement; Rewrite converters us…
ylibrach Feb 25, 2020
aec8068
Replace FSCodec.NewtonsoftJson with core FSCodec
ylibrach Feb 25, 2020
2035d49
Remove NewtonsoftJsonSerializer
ylibrach Feb 25, 2020
b61e367
Update FsCodec to 2.0.1
ylibrach Feb 26, 2020
c37789d
Fully switch over to STJ
ylibrach Feb 27, 2020
561e17c
Update tests
ylibrach Feb 27, 2020
c121ca2
Create Tutorial STJ codecs
ylibrach Feb 27, 2020
48a874e
Create Store integration STJ codecs
ylibrach Feb 28, 2020
b231595
Move STJ code to Equinox
ylibrach Feb 28, 2020
dd97e50
Add FsCodec.STJ to Equinox
ylibrach Feb 28, 2020
7973a73
Move FsCodec.STJ to Equinox.Core; Fix net461
ylibrach Feb 28, 2020
e2d3d6b
Pair codecs together with Event types
ylibrach Feb 28, 2020
125e3b0
Pair codecs together with Event types
ylibrach Mar 2, 2020
a68f80a
Split resolvers into UTF8 and JsonElement
ylibrach Mar 2, 2020
301fdc5
Remove unnecessary async block
ylibrach Mar 2, 2020
1c92b08
Fix typo
ylibrach Mar 2, 2020
d95e121
Change to camelCase field names
ylibrach Mar 2, 2020
4398d30
Move FsCodec dep to end
ylibrach Mar 2, 2020
3fabd8f
Rearrange open statements
ylibrach Mar 2, 2020
b0a3a9b
Merge pull request #200 from jet/stj
ylibrach Mar 3, 2020
d599f6c
Fix ValueTask versioning
ylibrach Mar 3, 2020
a670bcd
Merge branch 'master' into cosmossdk4
bartelink Mar 5, 2020
b1f4f03
Abstract Cosmos clients and allow them to be provided by consumers
ylibrach Mar 6, 2020
88ec2bf
Clean up CancellationToken usages
ylibrach Mar 9, 2020
c509a1b
Streamline clients
ylibrach Mar 9, 2020
0a5a176
Move all initialization functions to separate module
ylibrach Mar 10, 2020
4b92f85
Make abstractions more generic
ylibrach Mar 10, 2020
618c535
Rename to EquinoxCosmosClientFactory
ylibrach Mar 10, 2020
474575a
Fix spacing
ylibrach Mar 10, 2020
a423299
Add argument docs
ylibrach Mar 10, 2020
138a01e
Inline map/bind 'help'ers
bartelink Mar 11, 2020
d7d92bb
Merge remote-tracking branch 'origin/master' into cosmossdk4
bartelink Mar 11, 2020
4b84edd
Rebase on Codec logic extracted into FsCodec.System.Text.Json (#202)
bartelink Mar 12, 2020
cd998c8
Merge remote-tracking branch 'origin/master' into cosmossdk4
bartelink Mar 12, 2020
5e42546
Merge branch 'master' of https://github.com/jet/equinox into cosmossdk4
ylibrach Mar 13, 2020
28499e6
Remove net461 target from tests
ylibrach Mar 13, 2020
a2d742f
Fix various test issues
ylibrach Mar 17, 2020
2f3cfaa
Provide options
ylibrach Mar 17, 2020
d044dfd
Merge with latest changes from cosmossdk4
ylibrach Mar 17, 2020
6207c09
Merge branch 'client-abstractions' of https://github.com/jet/equinox …
ylibrach Mar 17, 2020
a188f69
Tip compression toggle through optional argument (#206)
ylibrach Mar 19, 2020
0a7fa6d
Change container initialization to be explicitly called on demand
ylibrach Mar 19, 2020
d6637ee
Switch from Force() to Value
ylibrach Mar 19, 2020
3374a6d
Rename Client to Operations
ylibrach Mar 19, 2020
a17704b
Remove Sdk from naming
ylibrach Mar 19, 2020
e4270f9
Rename to compressUnfolds for clarity
ylibrach Mar 19, 2020
5f7469f
Merge pull request #203 from jet/client-abstractions
ylibrach Mar 19, 2020
820db24
Target FsCodec 2.0.2-alpha.0.8
bartelink Mar 19, 2020
634ae3d
Misc cleanup
bartelink Mar 19, 2020
a5374fb
Store.Operations ?
bartelink Mar 19, 2020
a94843a
Store* naming
bartelink Mar 19, 2020
0b1a400
Move Converter out of type definitions
bartelink Mar 19, 2020
e40d9d9
Fix naming stragglers
bartelink Mar 19, 2020
6a36d46
Add dump -b to enable overriding Cosmos MaxItems
bartelink Apr 1, 2020
ad1dae4
Merge branch 'master' into cosmossdk4
bartelink Apr 1, 2020
18eb774
Merge remote-tracking branch 'origin/master' into cosmossdk4
bartelink Apr 6, 2020
07c8492
Cosmos V4: Reduce initialization confusion (#208)
bartelink Apr 7, 2020
1e24121
simplify GetContainer
bartelink Apr 6, 2020
73fa4be
Merge remote-tracking branch 'origin/master' into cosmossdk4
bartelink Apr 7, 2020
84c3b73
Cosmos -> CosmosStore and related renames (#216)
bartelink Apr 15, 2020
358bbe2
Merge with FsCodec 2.1.0 release updates
bartelink May 10, 2020
730079f
Remove CancellationToken.useOrCreate
bartelink May 10, 2020
3b5cb66
Merge branch 'master' into cosmossdk4
bartelink Jun 3, 2020
d2e96f2
Implement pretty-printing for JsonElement
bartelink Jun 25, 2020
511e122
Merge branch 'master' into cosmossdk4
bartelink Jun 26, 2020
31c94ce
Tidy comments
bartelink Sep 2, 2020
4eae601
Tidy
bartelink Sep 3, 2020
6622026
Polish comments
bartelink Sep 3, 2020
175eefc
Merge remote-tracking branch 'origin/master' into cosmossdk4
bartelink Sep 15, 2020
e7009b7
Upgrade to STJ 5.0 rc1
bartelink Sep 15, 2020
75d4551
Fix json
bartelink Sep 17, 2020
792e420
Really Fix json
bartelink Sep 17, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 12 additions & 14 deletions DOCUMENTATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,17 +164,17 @@ slightly differently:

![Equinox.EventStore/SqlStreamStore c4model.com Code - another process; using snapshotting](http://www.plantuml.com/plantuml/proxy?cache=no&src=https://raw.github.com/jet/equinox/master/diagrams/EventStoreCode.puml&idx=3&fmt=svg)

# Equinox.Cosmos
# Equinox.CosmosStore

## Container Diagram for `Equinox.Cosmos`
## Container Diagram for `Equinox.CosmosStore`

![Equinox.Cosmos c4model.com Container Diagram](http://www.plantuml.com/plantuml/proxy?cache=no&src=https://raw.github.com/jet/equinox/master/diagrams/CosmosContainer.puml?fmt=svg)

## Component Diagram for `Equinox.Cosmos`
## Component Diagram for `Equinox.CosmosStore`

![Equinox.Cosmos c4model.com Component Diagram](http://www.plantuml.com/plantuml/proxy?cache=no&src=https://raw.github.com/jet/equinox/master/diagrams/CosmosComponent.puml?fmt=svg)

## Code Diagrams for `Equinox.Cosmos`
## Code Diagrams for `Equinox.CosmosStore`

This diagram walks through the basic sequence of operations, where:
- this node has not yet read this stream (i.e. there's nothing in the Cache)
Expand Down Expand Up @@ -1563,7 +1563,7 @@ having separate roundtrips obviously has implications).
This article provides a walkthrough of how `Equinox.Cosmos` encodes, writes and
reads records from a stream under its control.

The code (see [source](src/Equinox.Cosmos/Cosmos.fs#L6)) contains lots of
The code (see [source](src/Equinox.CosmosStore/CosmosStore.fs#L6)) contains lots of
comments and is intended to be read - this just provides some background.

## Batches
Expand Down Expand Up @@ -1830,21 +1830,19 @@ let gatewayLog =
outputLog.ForContext(Serilog.Core.Constants.SourceContextPropertyName, "Equinox")

// When starting the app, we connect (once)
let connector : Equinox.Cosmos.Connector =
Connector(
let factory : Equinox.CosmosStore.CosmosStoreClientFactory =
CosmosStoreClientFactory(
requestTimeout = TimeSpan.FromSeconds 5.,
maxRetryAttemptsOnThrottledRequests = 1,
maxRetryWaitTimeInSeconds = 3,
log = gatewayLog)
let cnx =
connector.Connect("Application.CommandProcessor", Discovery.FromConnectionString connectionString)
|> Async.RunSynchronously
let client = factory.Create(Discovery.ConnectionString connectionString)

// If storing in a single collection, one specifies the db and collection
// alternately use the overload that defers the mapping until the stream one is
// writing to becomes clear
let containerMap = Containers("databaseName", "containerName")
let ctx = Context(cnx, containerMap, gatewayLog)
// alternately use the overload that defers the mapping until the stream one is writing to becomes clear
let connection = CosmosStoreConnection(client, "databaseName", "containerName")
let storeContext = CosmosStoreContext(connection, "databaseName", "containerName")
let ctx = EventsContext(storeContext, gatewayLog)

//
// Write an event
Expand Down
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<Copyright>Copyright © 2016-20</Copyright>

<!-- Confluent don't support Mono OOTB https://github.com/confluentinc/confluent-kafka-dotnet/issues/400 -->
<TestTargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">netcoreapp3.1;net461</TestTargetFrameworks>
<TestTargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">netcoreapp3.1</TestTargetFrameworks>
<TestTargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netcoreapp3.1</TestTargetFrameworks>

<ThisDirAbsolute>$([System.IO.Path]::GetFullPath("$(MSBuildThisFileDirectory)"))</ThisDirAbsolute>
Expand Down
4 changes: 2 additions & 2 deletions Equinox.sln
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Equinox.MemoryStore.Integra
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Equinox.Tool", "tools\Equinox.Tool\Equinox.Tool.fsproj", "{C8992C1C-6DC5-42CD-A3D7-1C5663433FED}"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Equinox.Cosmos", "src\Equinox.Cosmos\Equinox.Cosmos.fsproj", "{54EA6187-9F9F-4D67-B602-163D011E43E6}"
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Equinox.CosmosStore", "src\Equinox.CosmosStore\Equinox.CosmosStore.fsproj", "{54EA6187-9F9F-4D67-B602-163D011E43E6}"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Equinox.Cosmos.Integration", "tests\Equinox.Cosmos.Integration\Equinox.Cosmos.Integration.fsproj", "{DE0FEBF0-72DC-4D4A-BBA7-788D875D6B4B}"
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Equinox.CosmosStore.Integration", "tests\Equinox.CosmosStore.Integration\Equinox.CosmosStore.Integration.fsproj", "{DE0FEBF0-72DC-4D4A-BBA7-788D875D6B4B}"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "TodoBackend", "samples\TodoBackend\TodoBackend.fsproj", "{EC2EC658-3D85-44F3-AD2F-52AFCAFF8871}"
EndProject
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Some aspects of the implementation are distilled from [`Jet.com` systems dating
- support, (via the [`FsCodec.IEventCodec`](https://github.com/jet/FsCodec#IEventCodec)) for the maintenance of multiple co-existing compaction schemas for a given stream (A 'compaction' event/snapshot isa Event)
- compaction events typically do not get deleted (consistent with how EventStore works), although it is safe to do so in concept
- NB while this works well, and can deliver excellent performance (especially when allied with the Cache), [it's not a panacea, as noted in this excellent EventStore.org article on the topic](https://eventstore.org/docs/event-sourcing-basics/rolling-snapshots/index.html)
- **`Equinox.Cosmos` 'Tip with Unfolds' schema**: (In contrast to `Equinox.EventStore`'s `AccessStrategy.RollingSnapshots`,) when using `Equinox.Cosmos`, optimized command processing is managed via the `Tip`; a document per stream with a well-known identity enabling Syncing the r/w Position via a single point-read by virtue of the fact that the document maintains:
- **`Equinox.CosmosStore` 'Tip with Unfolds' schema**: (In contrast to `Equinox.EventStore`'s `AccessStrategy.RollingSnapshots`,) when using `Equinox.CosmosStore`, optimized command processing is managed via the `Tip`; a document per stream with a well-known identity enabling Syncing the r/w Position via a single point-read by virtue of the fact that the document maintains:
a) the present Position of the stream - i.e. the index at which the next events will be appended for a given stream (events and the Tip share a common logical partition key)
b) ephemeral (`deflate+base64` compressed) [_unfolds_](DOCUMENTATION.md#Cosmos-Storage-Model)
c) (optionally) a holding buffer for events since those unfolded events ([presently removed](https://github.com/jet/equinox/pull/58), but [should return](DOCUMENTATION.md#Roadmap), see [#109](https://github.com/jet/equinox/pull/109))
Expand All @@ -49,7 +49,7 @@ Some aspects of the implementation are distilled from [`Jet.com` systems dating
- no additional roundtrips to the store needed at either the Load or Sync points in the flow

It should be noted that from a querying perspective, the `Tip` shares the same structure as `Batch` documents (a potential future extension would be to carry some events in the `Tip` as [some interim versions of the implementation once did](https://github.com/jet/equinox/pull/58), see also [#109](https://github.com/jet/equinox/pull/109).
- **`Equinox.Cosmos` `RollingState` and `Custom` 'non-event-sourced' modes**: Uses 'Tip with Unfolds' encoding to avoid having to write event documents at all - this enables one to build, reason about and test your aggregates in the normal manner, but inhibit event documents from being generated. This enables one to benefit from the caching and consistency management mechanisms without having to bear the cost of writing and storing the events themselves (and/or dealing with an ever-growing store size). Search for `transmute` or `RollingState` in the `samples` and/or see [the `Checkpoint` Aggregate in Propulsion](https://github.com/jet/propulsion/blob/master/src/Propulsion.EventStore/Checkpoint.fs). One chief use of this mechanism is for tracking Summary Event feeds in [the `dotnet-templates` `summaryConsumer` template](https://github.com/jet/dotnet-templates/tree/master/propulsion-summary-consumer).
- **`Equinox.CosmosStore` `RollingState` and `Custom` 'non-event-sourced' modes**: Uses 'Tip with Unfolds' encoding to avoid having to write event documents at all - this enables one to build, reason about and test your aggregates in the normal manner, but inhibit event documents from being generated. This enables one to benefit from the caching and consistency management mechanisms without having to bear the cost of writing and storing the events themselves (and/or dealing with an ever-growing store size). Search for `transmute` or `RollingState` in the `samples` and/or see [the `Checkpoint` Aggregate in Propulsion](https://github.com/jet/propulsion/blob/master/src/Propulsion.EventStore/Checkpoint.fs). One chief use of this mechanism is for tracking Summary Event feeds in [the `dotnet-templates` `summaryConsumer` template](https://github.com/jet/dotnet-templates/tree/master/propulsion-summary-consumer).

## Components

Expand Down Expand Up @@ -77,7 +77,7 @@ The components within this repository are delivered as multi-targeted Nuget pack
- `Equinox.Core` [![NuGet](https://img.shields.io/nuget/v/Equinox.Core.svg)](https://www.nuget.org/packages/Equinox.Core/): Interfaces and helpers used in realizing the concrete Store implementations, together with the default [`System.Runtime.Caching.Cache`-based] `Cache` implementation . ([depends](https://www.fuget.org/packages/Equinox.Core) on `Equinox`, `System.Runtime.Caching`)
- `Equinox.MemoryStore` [![MemoryStore NuGet](https://img.shields.io/nuget/v/Equinox.MemoryStore.svg)](https://www.nuget.org/packages/Equinox.MemoryStore/): In-memory store for integration testing/performance baselining/providing out-of-the-box zero dependency storage for examples. ([depends](https://www.fuget.org/packages/Equinox.MemoryStore) on `Equinox.Core`, `FsCodec`)
- `Equinox.EventStore` [![EventStore NuGet](https://img.shields.io/nuget/v/Equinox.EventStore.svg)](https://www.nuget.org/packages/Equinox.EventStore/): Production-strength [EventStoreDB](https://eventstore.org/) Adapter instrumented to the degree necessitated by Jet's production monitoring requirements. ([depends](https://www.fuget.org/packages/Equinox.EventStore) on `Equinox.Core`, `EventStore.Client >= 20.6`, `FSharp.Control.AsyncSeq >= 2.0.23`)
- `Equinox.Cosmos` [![Cosmos NuGet](https://img.shields.io/nuget/v/Equinox.Cosmos.svg)](https://www.nuget.org/packages/Equinox.Cosmos/): Production-strength Azure CosmosDB Adapter with integrated 'unfolds' feature, facilitating optimal read performance in terms of latency and RU costs, instrumented to the degree necessitated by Jet's production monitoring requirements. ([depends](https://www.fuget.org/packages/Equinox.Cosmos) on `Equinox.Core`, `Microsoft.Azure.Cosmos >= 3.9`, `FsCodec.NewtonsoftJson`, `FSharp.Control.AsyncSeq >= 2.0.23`)
- `Equinox.CosmosStore` [![CosmosStore NuGet](https://img.shields.io/nuget/v/Equinox.CosmosStore.svg)](https://www.nuget.org/packages/Equinox.CosmosStore/): Production-strength Azure CosmosDB Adapter with integrated 'unfolds' feature, facilitating optimal read performance in terms of latency and RU costs, instrumented to the degree necessitated by Jet's production monitoring requirements. ([depends](https://www.fuget.org/packages/Equinox.CosmosStore) on `Equinox.Core`, `Microsoft.Azure.Cosmos >= 3.9`, `FsCodec.NewtonsoftJson`, `FSharp.Control.AsyncSeq >= 2.0.23`)
- `Equinox.SqlStreamStore` [![SqlStreamStore NuGet](https://img.shields.io/nuget/v/Equinox.SqlStreamStore.svg)](https://www.nuget.org/packages/Equinox.SqlStreamStore/): Production-strength [SqlStreamStore](https://github.com/SQLStreamStore/SQLStreamStore) Adapter derived from `Equinox.EventStore` - provides core facilities (but does not connect to a specific database; see sibling `SqlStreamStore`.* packages). ([depends](https://www.fuget.org/packages/Equinox.SqlStreamStore) on `Equinox.Core`, `FsCodec`, `SqlStreamStore >= 1.2.0-beta.8`, `FSharp.Control.AsyncSeq`)
- `Equinox.SqlStreamStore.MsSql` [![MsSql NuGet](https://img.shields.io/nuget/v/Equinox.SqlStreamStore.MsSql.svg)](https://www.nuget.org/packages/Equinox.SqlStreamStore.MsSql/): [SqlStreamStore.MsSql](https://sqlstreamstore.readthedocs.io/en/latest/sqlserver) Sql Server `Connector` implementation for `Equinox.SqlStreamStore` package). ([depends](https://www.fuget.org/packages/Equinox.SqlStreamStore.MsSql) on `Equinox.SqlStreamStore`, `SqlStreamStore.MsSql >= 1.2.0-beta.8`)
- `Equinox.SqlStreamStore.MySql` [![MySql NuGet](https://img.shields.io/nuget/v/Equinox.SqlStreamStore.MySql.svg)](https://www.nuget.org/packages/Equinox.SqlStreamStore.MySql/): `SqlStreamStore.MySql` MySQL Í`Connector` implementation for `Equinox.SqlStreamStore` package). ([depends](https://www.fuget.org/packages/Equinox.SqlStreamStore.MySql) on `Equinox.SqlStreamStore`, `SqlStreamStore.MySql >= 1.2.0-beta.8`)
Expand All @@ -89,7 +89,7 @@ Equinox does not focus on projection logic or wrapping thereof - each store brin

- `FsKafka` [![FsKafka NuGet](https://img.shields.io/nuget/v/FsKafka.svg)](https://www.nuget.org/packages/FsKafka/): Wraps `Confluent.Kafka` to provide efficient batched Kafka Producer and Consumer configurations, with basic logging instrumentation. Used in the [`propulsion project kafka`](https://github.com/jet/propulsion#dotnet-tool-provisioning--projections-test-tool) tool command; see [`dotnet new proProjector -k; dotnet new proConsumer` to generate a sample app](https://github.com/jet/dotnet-templates#propulsion-related) using it (see the `BatchedAsync` and `BatchedSync` modules in `Examples.fs`).
- `Propulsion` [![Propulsion NuGet](https://img.shields.io/nuget/v/Propulsion.svg)](https://www.nuget.org/packages/Propulsion/): defines a canonical `Propulsion.Streams.StreamEvent` used to interop with `Propulsion.*` in processing pipelines for the `proProjector` and `proSync` templates in the [templates repo](https://github.com/jet/dotnet-templates), together with the `Ingestion`, `Streams`, `Progress` and `Parallel` modules that get composed into those processing pipelines. ([depends](https://www.fuget.org/packages/Propulsion) on `Serilog`)
- `Propulsion.Cosmos` [![Propulsion.Cosmos NuGet](https://img.shields.io/nuget/v/Propulsion.Cosmos.svg)](https://www.nuget.org/packages/Propulsion.Cosmos/): Wraps the [Microsoft .NET `ChangeFeedProcessor` library](https://github.com/Azure/azure-documentdb-changefeedprocessor-dotnet) providing a [processor loop](DOCUMENTATION.md#change-feed-processors) that maintains a continuous query loop per CosmosDb Physical Partition (Range) yielding new or updated documents (optionally unrolling events written by `Equinox.Cosmos` for processing or forwarding). Used in the [`propulsion project stats cosmos`](dotnet-tool-provisioning--benchmarking-tool) tool command; see [`dotnet new proProjector` to generate a sample app](#quickstart) using it. ([depends](https://www.fuget.org/packages/Propulsion.Cosmos) on `Equinox.Cosmos`, `Microsoft.Azure.DocumentDb.ChangeFeedProcessor >= 2.2.5`)
- `Propulsion.Cosmos` [![Propulsion.Cosmos NuGet](https://img.shields.io/nuget/v/Propulsion.Cosmos.svg)](https://www.nuget.org/packages/Propulsion.Cosmos/): Wraps the [Microsoft .NET `ChangeFeedProcessor` library](https://github.com/Azure/azure-documentdb-changefeedprocessor-dotnet) providing a [processor loop](DOCUMENTATION.md#change-feed-processors) that maintains a continuous query loop per CosmosDb Physical Partition (Range) yielding new or updated documents (optionally unrolling events written by `Equinox.CosmosStore` for processing or forwarding). Used in the [`propulsion project stats cosmos`](dotnet-tool-provisioning--benchmarking-tool) tool command; see [`dotnet new proProjector` to generate a sample app](#quickstart) using it. ([depends](https://www.fuget.org/packages/Propulsion.Cosmos) on `Equinox.Cosmos`, `Microsoft.Azure.DocumentDb.ChangeFeedProcessor >= 2.2.5`)
- `Propulsion.EventStore` [![Propulsion.EventStore NuGet](https://img.shields.io/nuget/v/Propulsion.EventStore.svg)](https://www.nuget.org/packages/Propulsion.EventStore/) Used in the [`propulsion project es`](dotnet-tool-provisioning--benchmarking-tool) tool command; see [`dotnet new proSync` to generate a sample app](#quickstart) using it. ([depends](https://www.fuget.org/packages/Propulsion.EventStore) on `Equinox.EventStore`)
- `Propulsion.Kafka` [![Propulsion.Kafka NuGet](https://img.shields.io/nuget/v/Propulsion.Kafka.svg)](https://www.nuget.org/packages/Propulsion.Kafka/): Provides a canonical `RenderedSpan` that can be used as a default format when projecting events via e.g. the Producer/Consumer pair in `dotnet new proProjector -k; dotnet new proConsumer`. ([depends](https://www.fuget.org/packages/Propulsion.Kafka) on `Newtonsoft.Json >= 11.0.2`, `Propulsion`, `FsKafka`)

Expand Down
2 changes: 1 addition & 1 deletion build.proj
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<Target Name="Pack">
<Exec Command="dotnet pack src/Equinox $(Cfg) $(PackOptions)" />
<Exec Command="dotnet pack src/Equinox.Core $(Cfg) $(PackOptions)" />
<Exec Command="dotnet pack src/Equinox.Cosmos $(Cfg) $(PackOptions)" />
<Exec Command="dotnet pack src/Equinox.CosmosStore $(Cfg) $(PackOptions)" />
<Exec Command="dotnet pack src/Equinox.EventStore $(Cfg) $(PackOptions)" />
<Exec Command="dotnet pack src/Equinox.MemoryStore $(Cfg) $(PackOptions)" />
<Exec Command="dotnet pack src/Equinox.SqlStreamStore $(Cfg) $(PackOptions)" />
Expand Down
2 changes: 1 addition & 1 deletion diagrams/context.puml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
@startuml
@startuml
!includeurl https://raw.githubusercontent.com/skleanthous/C4-PlantumlSkin/master/build/output/c4.puml

title System Context Diagram for Equinox (+Propulsion)
Expand Down
4 changes: 2 additions & 2 deletions samples/Infrastructure/Infrastructure.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<ProjectReference Include="..\..\src\Equinox.SqlStreamStore.Postgres\Equinox.SqlStreamStore.Postgres.fsproj" />
<ProjectReference Include="..\..\src\Equinox.SqlStreamStore\Equinox.SqlStreamStore.fsproj" />
<ProjectReference Include="..\..\src\Equinox\Equinox.fsproj" />
<ProjectReference Include="..\..\src\Equinox.Cosmos\Equinox.Cosmos.fsproj" />
<ProjectReference Include="..\..\src\Equinox.CosmosStore\Equinox.CosmosStore.fsproj" />
<ProjectReference Include="..\..\src\Equinox.EventStore\Equinox.EventStore.fsproj" />
<ProjectReference Include="..\..\src\Equinox.MemoryStore\Equinox.MemoryStore.fsproj" />
<ProjectReference Include="..\Store\Backend\Backend.fsproj" />
Expand All @@ -35,7 +35,7 @@
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="Serilog.Sinks.Seq" Version="4.0.0" />
<PackageReference Include="Microsoft.Azure.Cosmos.Direct" Version="3.9.0" />
<PackageReference Include="Microsoft.Azure.Cosmos.Direct" Version="3.1.4" />
</ItemGroup>

</Project>
Loading