From c617f6aaaafaf43254bc6d7f1958dd4bb41b55f3 Mon Sep 17 00:00:00 2001
From: Ruben Bartelink <ruben@bartelink.com>
Date: Thu, 2 Jan 2025 01:13:43 +0000
Subject: [PATCH] Target alpha9

---
 CHANGELOG.md                                                | 2 ++
 samples/Infrastructure/Services.fs                          | 2 +-
 samples/Store/Domain/Domain.fsproj                          | 2 +-
 samples/Store/Domain/Infrastructure.fs                      | 2 +-
 samples/Tutorial/Infrastructure.fs                          | 2 +-
 samples/Tutorial/Tutorial.fsproj                            | 2 +-
 tests/Equinox.CosmosStore.Integration/AccessStrategies.fs   | 2 +-
 .../CosmosCoreIntegration.fs                                | 4 ++--
 .../FsCodecCompressionTests.fs                              | 6 +++---
 9 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 35c060b76..b0cbe982f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ The `Unreleased` section name is replaced by the expected version of next releas
 
 ### Added
 
+- `Equinox.CosmosStore`: Roundtrip `D` and `M` encoding values as per `DynamoStore`, enabling more extensive control of compression [#472](https://github.com/jet/equinox/pull/472)
 - `Equinox.CosmosStore`: Use `Microsoft.Azure.Cosmos` integrated `System.Text.Json` support; added ability to specify `serializerOptions` [#467](https://github.com/jet/equinox/pull/467)
 - `Equinox.CosmosStore`: Group metrics by Container Name [#449](https://github.com/jet/equinox/pull/449)
 - `Equinox.CosmosStore`: Group metrics by Category; split out `Tip` activity [#453](https://github.com/jet/equinox/pull/453)
@@ -29,6 +30,7 @@ The `Unreleased` section name is replaced by the expected version of next releas
 ### Removed
 
 - `eqx stats`: `-A` (all stats) is now the default unless you specify >=1 of the individual stats via `ESDNO` flags [#459](https://github.com/jet/equinox/pull/459)
+- `Equinox.CosmosStore.CosmosStoreCategory`: Removed `shouldCompress` mechanism as compression is now external [#472](https://github.com/jet/equinox/pull/472)
 
 <a name="4.0.4"></a>
 ## [4.0.4] - 2024-05-08
diff --git a/samples/Infrastructure/Services.fs b/samples/Infrastructure/Services.fs
index 69ec58174..901af7463 100644
--- a/samples/Infrastructure/Services.fs
+++ b/samples/Infrastructure/Services.fs
@@ -17,7 +17,7 @@ type Store(store) =
             MemoryStore.MemoryStoreCategory(store, name, codec, fold, initial)
         | Store.Config.Cosmos (store, caching, unfolds) ->
             let accessStrategy = if unfolds then CosmosStore.AccessStrategy.Snapshot snapshot else CosmosStore.AccessStrategy.Unoptimized
-            CosmosStore.CosmosStoreCategory<'event,'state,_>(store, name, FsCodec.SystemTextJson.EncodedBody.EncodeTryCompress codec, fold, initial, accessStrategy, caching)
+            CosmosStore.CosmosStoreCategory<'event,'state,_>(store, name, FsCodec.SystemTextJson.Encoding.EncodeTryCompress codec, fold, initial, accessStrategy, caching)
         | Store.Config.Dynamo (store, caching, unfolds) ->
             let accessStrategy = if unfolds then DynamoStore.AccessStrategy.Snapshot snapshot else DynamoStore.AccessStrategy.Unoptimized
             DynamoStore.DynamoStoreCategory<'event,'state,_>(store, name, FsCodec.Compression.EncodeTryCompress codec, fold, initial, accessStrategy, caching)
diff --git a/samples/Store/Domain/Domain.fsproj b/samples/Store/Domain/Domain.fsproj
index 979837f82..873a9f768 100644
--- a/samples/Store/Domain/Domain.fsproj
+++ b/samples/Store/Domain/Domain.fsproj
@@ -19,7 +19,7 @@
     <PackageReference Include="FSharp.Core" Version="6.0.7" ExcludeAssets="contentfiles" />
 
     <PackageReference Include="FsCodec.NewtonsoftJson" Version="3.0.0" />
-    <PackageReference Include="FsCodec.SystemTextJson" Version="3.0.4-alpha.0.5" />
+    <PackageReference Include="FsCodec.SystemTextJson" Version="3.0.4-alpha.0.9" />
 
     <ProjectReference Include="..\..\..\src\Equinox\Equinox.fsproj" />
   </ItemGroup>
diff --git a/samples/Store/Domain/Infrastructure.fs b/samples/Store/Domain/Infrastructure.fs
index cb490a7ef..02eb0296e 100644
--- a/samples/Store/Domain/Infrastructure.fs
+++ b/samples/Store/Domain/Infrastructure.fs
@@ -92,7 +92,7 @@ module EventCodec =
 
     /// For CosmosStore - we encode to JsonElement as that's what the store talks
     let genJsonElement<'t when 't :> TypeShape.UnionContract.IUnionContract> =
-        FsCodec.SystemTextJson.CodecJsonElement.Create<'t>() |> FsCodec.SystemTextJson.EncodedBody.EncodeUncompressed
+        FsCodec.SystemTextJson.CodecJsonElement.Create<'t>() |> FsCodec.SystemTextJson.Encoding.EncodeUncompressed
 
     /// For stores other than CosmosStore, we encode to UTF-8 and have the store do the right thing
     let gen<'t when 't :> TypeShape.UnionContract.IUnionContract> =
diff --git a/samples/Tutorial/Infrastructure.fs b/samples/Tutorial/Infrastructure.fs
index 816003ac9..ee99c8a9d 100644
--- a/samples/Tutorial/Infrastructure.fs
+++ b/samples/Tutorial/Infrastructure.fs
@@ -23,7 +23,7 @@ module EventCodec =
 
     /// For CosmosStore - we encode to JsonElement as that's what the store talks
     let genJsonElement<'t when 't :> TypeShape.UnionContract.IUnionContract> =
-        FsCodec.SystemTextJson.CodecJsonElement.Create<'t>() |> FsCodec.SystemTextJson.EncodedBody.EncodeUncompressed
+        FsCodec.SystemTextJson.CodecJsonElement.Create<'t>() |> FsCodec.SystemTextJson.Encoding.EncodeUncompressed
 
     /// For stores other than CosmosStore, we encode to UTF-8 and have the store do the right thing
     let gen<'t when 't :> TypeShape.UnionContract.IUnionContract> =
diff --git a/samples/Tutorial/Tutorial.fsproj b/samples/Tutorial/Tutorial.fsproj
index c7e797d9f..fc8d93fe5 100644
--- a/samples/Tutorial/Tutorial.fsproj
+++ b/samples/Tutorial/Tutorial.fsproj
@@ -28,7 +28,7 @@
 
   <ItemGroup>
     <PackageReference Include="MinVer" Version="5.0.0" PrivateAssets="All" />
-    <PackageReference Include="FsCodec.SystemTextJson" Version="3.0.4-alpha.0.5" />
+    <PackageReference Include="FsCodec.SystemTextJson" Version="3.0.4-alpha.0.9" />
     <PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" />
     <PackageReference Include="Serilog.Sinks.Seq" Version="7.0.0" />
   </ItemGroup>
diff --git a/tests/Equinox.CosmosStore.Integration/AccessStrategies.fs b/tests/Equinox.CosmosStore.Integration/AccessStrategies.fs
index 8a5e9c0ab..1fcfea895 100644
--- a/tests/Equinox.CosmosStore.Integration/AccessStrategies.fs
+++ b/tests/Equinox.CosmosStore.Integration/AccessStrategies.fs
@@ -44,7 +44,7 @@ module SequenceCheck =
 #if STORE_DYNAMO
         let codec = FsCodec.SystemTextJson.Codec.Create<Event>() |> FsCodec.Compression.EncodeTryCompress
 #else
-        let codec = FsCodec.SystemTextJson.CodecJsonElement.Create<Event>() |> FsCodec.SystemTextJson.EncodedBody.EncodeTryCompress
+        let codec = FsCodec.SystemTextJson.CodecJsonElement.Create<Event>() |> FsCodec.SystemTextJson.Encoding.EncodeTryCompress
 #endif
 
     module Fold =
diff --git a/tests/Equinox.CosmosStore.Integration/CosmosCoreIntegration.fs b/tests/Equinox.CosmosStore.Integration/CosmosCoreIntegration.fs
index 8b5e52525..e7c6eb8e3 100644
--- a/tests/Equinox.CosmosStore.Integration/CosmosCoreIntegration.fs
+++ b/tests/Equinox.CosmosStore.Integration/CosmosCoreIntegration.fs
@@ -10,7 +10,7 @@ open System
 
 type TestEvents() =
     static member private Create(i, ?eventType, ?json) =
-        let enc = System.Text.Json.JsonSerializer.SerializeToElement >> FsCodec.SystemTextJson.EncodedBody.Uncompressed
+        let enc = System.Text.Json.JsonSerializer.SerializeToElement >> FsCodec.SystemTextJson.Encoding.Uncompressed
         FsCodec.Core.EventData.Create
             (   sprintf "%s:%d" (defaultArg eventType "test_event") i,
                 enc (defaultArg json "{\"d\":\"d\"}"),
@@ -65,7 +65,7 @@ type Tests(testOutputHelper) =
         test <@ match res with Choice2Of2 (:? InvalidOperationException as ex) -> ex.Message.StartsWith "Must write either events or unfolds." | x -> failwith $"%A{x}" @>
     }
 
-    let stringOfEncodedBody (x: Equinox.CosmosStore.Core.EncodedBody) = FsCodec.SystemTextJson.EncodedBody.ToJsonElement(x).GetRawText()
+    let stringOfEncodedBody (x: Equinox.CosmosStore.Core.EncodedBody) = FsCodec.SystemTextJson.Encoding.ToJsonElement(x).GetRawText()
     let jsonDiff (x: string) (y: string) =
         match JsonDiffPatchDotNet.JsonDiffPatch().Diff(JToken.Parse x, JToken.Parse y) with
         | null -> ""
diff --git a/tests/Equinox.CosmosStore.Integration/FsCodecCompressionTests.fs b/tests/Equinox.CosmosStore.Integration/FsCodecCompressionTests.fs
index a5b90109a..6c50476a0 100644
--- a/tests/Equinox.CosmosStore.Integration/FsCodecCompressionTests.fs
+++ b/tests/Equinox.CosmosStore.Integration/FsCodecCompressionTests.fs
@@ -38,14 +38,14 @@ type CoreBehaviors() =
 
     [<Fact>]
     let ``serializes, achieving expected compression`` () =
-        let encoded = eventCodec |> FsCodec.SystemTextJson.EncodedBody.EncodeTryCompress |> _.Encode((), A { embed = String('x',5000) })
+        let encoded = eventCodec |> FsCodec.SystemTextJson.Encoding.EncodeTryCompress |> _.Encode((), A { embed = String('x',5000) })
         let res = ser encoded
         test <@ res.Contains "\"d\":\"" && res.Length < 138 && res.Contains "\"D\":2" @>
 
     let codec compress =
         let forceCompression: FsCodec.SystemTextJson.CompressionOptions = { minSize = 0; minGain = -1000 }
-        if compress then FsCodec.SystemTextJson.EncodedBody.EncodeTryCompress(eventCodec, forceCompression)
-        else FsCodec.SystemTextJson.EncodedBody.EncodeUncompressed eventCodec
+        if compress then FsCodec.SystemTextJson.Encoding.EncodeTryCompress(eventCodec, options = forceCompression)
+        else FsCodec.SystemTextJson.Encoding.EncodeUncompressed eventCodec
 
     [<Property>]
     let roundtrips compress value =