From 630f013339a942eec54c341fffeba6d336c2da67 Mon Sep 17 00:00:00 2001 From: Ruben Bartelink Date: Sat, 7 Feb 2026 17:22:30 +0000 Subject: [PATCH 1/5] chore(Deps): Target DynamoStore 4.2, AWSSDK 4 --- src/Propulsion.DynamoStore.Indexer/Handler.fs | 13 +++++++------ .../Propulsion.DynamoStore.Indexer.fsproj | 8 ++++---- src/Propulsion.DynamoStore.Notifier/Handler.fs | 12 ++++++------ .../Propulsion.DynamoStore.Notifier.fsproj | 9 +++++---- .../Propulsion.DynamoStore.fsproj | 2 +- tools/Propulsion.Tool/Propulsion.Tool.fsproj | 6 +++--- 6 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/Propulsion.DynamoStore.Indexer/Handler.fs b/src/Propulsion.DynamoStore.Indexer/Handler.fs index 8b6acb05..36a0f5ce 100644 --- a/src/Propulsion.DynamoStore.Indexer/Handler.fs +++ b/src/Propulsion.DynamoStore.Indexer/Handler.fs @@ -1,22 +1,23 @@ module Propulsion.DynamoStore.Indexer.Handler open Amazon.DynamoDBv2 +open Amazon.Lambda.DynamoDBEvents open Propulsion.DynamoStore -let private parse (log: Serilog.ILogger) (dynamoEvent: Amazon.Lambda.DynamoDBEvents.DynamoDBEvent): AppendsEpoch.Events.StreamSpan[] = +let private parse (log: Serilog.ILogger) (dynamoEvent: DynamoDBEvent): AppendsEpoch.Events.StreamSpan[] = let spans, summary = ResizeArray(), System.Text.StringBuilder() let mutable indexStream, systemStreams, noEvents = 0, 0, 0 try for record in dynamoEvent.Records do match record.Dynamodb.StreamViewType with - | x when x = StreamViewType.NEW_IMAGE || x = StreamViewType.NEW_AND_OLD_IMAGES -> () + | x when x = string StreamViewType.NEW_IMAGE || x = string StreamViewType.NEW_AND_OLD_IMAGES -> () | x -> invalidOp $"Unexpected StreamViewType {x}" - summary.Append(record.EventName.Value[0]) |> ignore + summary.Append(record.EventName) |> ignore let updated = record.Dynamodb.NewImage match record.EventName with - | ot when ot = OperationType.REMOVE -> () - | ot when ot = OperationType.INSERT || ot = OperationType.MODIFY -> + | ot when ot = "REMOVE" -> () + | ot when ot = "INSERT" || ot = "MODIFY" -> let p = record.Dynamodb.Keys["p"].S let sn, n = IndexStreamId.ofP p, int64 updated["n"].N if p.StartsWith AppendsEpoch.Stream.Category || p.StartsWith AppendsIndex.Stream.Category then indexStream <- indexStream + 1 @@ -40,7 +41,7 @@ let private parse (log: Serilog.ILogger) (dynamoEvent: Amazon.Lambda.DynamoDBEve | [| et |] -> ":" + et | xs -> $":%s{xs[0]}+%d{xs.Length - 1}" summary.Append(p).Append(et).Append(if i = 0 then " " else $"@%d{i} ") |> ignore - | et -> invalidOp $"Unknown OperationType %s{et.Value}" + | et -> invalidOp $"Unknown OperationType %s{et}" let spans = spans.ToArray() log.Information("Index {indexCount} System {systemCount} NoEvents {noEventCount} Spans {spanCount} {summary}", indexStream, systemStreams, noEvents, spans.Length, summary) diff --git a/src/Propulsion.DynamoStore.Indexer/Propulsion.DynamoStore.Indexer.fsproj b/src/Propulsion.DynamoStore.Indexer/Propulsion.DynamoStore.Indexer.fsproj index f508d459..e4ac50f3 100644 --- a/src/Propulsion.DynamoStore.Indexer/Propulsion.DynamoStore.Indexer.fsproj +++ b/src/Propulsion.DynamoStore.Indexer/Propulsion.DynamoStore.Indexer.fsproj @@ -27,10 +27,10 @@ - - - - + + + + diff --git a/src/Propulsion.DynamoStore.Notifier/Handler.fs b/src/Propulsion.DynamoStore.Notifier/Handler.fs index 5fdb1aa2..8e78265c 100644 --- a/src/Propulsion.DynamoStore.Notifier/Handler.fs +++ b/src/Propulsion.DynamoStore.Notifier/Handler.fs @@ -1,6 +1,6 @@ module Propulsion.DynamoStore.Notifier.Handler -open Amazon.DynamoDBv2 +open Amazon.DynamoDBStreams open Amazon.Lambda.DynamoDBEvents open Amazon.SimpleNotificationService open Amazon.SimpleNotificationService.Model @@ -20,16 +20,16 @@ let private parse (log: Serilog.ILogger) (dynamoEvent: DynamoDBEvent): KeyValueP let mutable indexStream, otherStream, noEvents = 0, 0, 0 try for record in dynamoEvent.Records do match record.Dynamodb.StreamViewType with - | x when x = StreamViewType.NEW_IMAGE || x = StreamViewType.NEW_AND_OLD_IMAGES -> () + | x when x = string StreamViewType.NEW_IMAGE || x = string StreamViewType.NEW_AND_OLD_IMAGES -> () | x -> invalidOp $"Unexpected StreamViewType {x}" if summary.Length <> 0 then summary.Append ' ' |> ignore - summary.Append(record.EventName.Value[0]) |> ignore + summary.Append(record.EventName) |> ignore let updated = record.Dynamodb.NewImage match record.EventName with - | ot when ot = OperationType.REMOVE -> () - | ot when ot = OperationType.INSERT || ot = OperationType.MODIFY -> + | ot when ot = "REMOVE" -> () + | ot when ot = "INSERT" || ot = "MODIFY" -> let p = record.Dynamodb.Keys["p"].S match FsCodec.StreamName.parse p with | AppendsEpoch.Stream.For (partitionId, epochId) -> @@ -50,7 +50,7 @@ let private parse (log: Serilog.ILogger) (dynamoEvent: DynamoDBEvent): KeyValueP | _ -> if p.StartsWith AppendsIndex.Stream.Category then indexStream <- indexStream + 1 else otherStream <- otherStream + 1 - | et -> invalidOp $"Unknown OperationType %s{et.Value}" + | et -> invalidOp $"Unknown OperationType %s{et}" log.Information("Index {indexCount} Other {otherCount} NoEvents {noEventCount} Tails {tails} {summary:l}", indexStream, otherStream, noEvents, Seq.map ValueTuple.ofKvp tails, summary) Array.ofSeq tails diff --git a/src/Propulsion.DynamoStore.Notifier/Propulsion.DynamoStore.Notifier.fsproj b/src/Propulsion.DynamoStore.Notifier/Propulsion.DynamoStore.Notifier.fsproj index 70135bce..7edfe307 100644 --- a/src/Propulsion.DynamoStore.Notifier/Propulsion.DynamoStore.Notifier.fsproj +++ b/src/Propulsion.DynamoStore.Notifier/Propulsion.DynamoStore.Notifier.fsproj @@ -37,10 +37,11 @@ - - - - + + + + + diff --git a/src/Propulsion.DynamoStore/Propulsion.DynamoStore.fsproj b/src/Propulsion.DynamoStore/Propulsion.DynamoStore.fsproj index 78b4e0ff..80eb6f4e 100644 --- a/src/Propulsion.DynamoStore/Propulsion.DynamoStore.fsproj +++ b/src/Propulsion.DynamoStore/Propulsion.DynamoStore.fsproj @@ -26,7 +26,7 @@ - + diff --git a/tools/Propulsion.Tool/Propulsion.Tool.fsproj b/tools/Propulsion.Tool/Propulsion.Tool.fsproj index 75546a6c..f58ad266 100644 --- a/tools/Propulsion.Tool/Propulsion.Tool.fsproj +++ b/tools/Propulsion.Tool/Propulsion.Tool.fsproj @@ -37,10 +37,10 @@ - + - - + + From e3feb499f684e61e832d5723327d4e80087030b5 Mon Sep 17 00:00:00 2001 From: Ruben Bartelink Date: Sat, 7 Feb 2026 17:39:38 +0000 Subject: [PATCH 2/5] fix: Use constants --- src/Propulsion.DynamoStore.Indexer/Handler.fs | 5 +++-- .../Propulsion.DynamoStore.Indexer.fsproj | 1 + src/Propulsion.DynamoStore.Notifier/Handler.fs | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Propulsion.DynamoStore.Indexer/Handler.fs b/src/Propulsion.DynamoStore.Indexer/Handler.fs index 36a0f5ce..952de252 100644 --- a/src/Propulsion.DynamoStore.Indexer/Handler.fs +++ b/src/Propulsion.DynamoStore.Indexer/Handler.fs @@ -1,5 +1,6 @@ module Propulsion.DynamoStore.Indexer.Handler +open Amazon.DynamoDBStreams open Amazon.DynamoDBv2 open Amazon.Lambda.DynamoDBEvents open Propulsion.DynamoStore @@ -16,8 +17,8 @@ let private parse (log: Serilog.ILogger) (dynamoEvent: DynamoDBEvent): AppendsEp let updated = record.Dynamodb.NewImage match record.EventName with - | ot when ot = "REMOVE" -> () - | ot when ot = "INSERT" || ot = "MODIFY" -> + | ot when ot = string OperationType.REMOVE -> () + | ot when ot = string OperationType.INSERT || ot = string OperationType.MODIFY -> let p = record.Dynamodb.Keys["p"].S let sn, n = IndexStreamId.ofP p, int64 updated["n"].N if p.StartsWith AppendsEpoch.Stream.Category || p.StartsWith AppendsIndex.Stream.Category then indexStream <- indexStream + 1 diff --git a/src/Propulsion.DynamoStore.Indexer/Propulsion.DynamoStore.Indexer.fsproj b/src/Propulsion.DynamoStore.Indexer/Propulsion.DynamoStore.Indexer.fsproj index e4ac50f3..6ef36b50 100644 --- a/src/Propulsion.DynamoStore.Indexer/Propulsion.DynamoStore.Indexer.fsproj +++ b/src/Propulsion.DynamoStore.Indexer/Propulsion.DynamoStore.Indexer.fsproj @@ -31,6 +31,7 @@ + diff --git a/src/Propulsion.DynamoStore.Notifier/Handler.fs b/src/Propulsion.DynamoStore.Notifier/Handler.fs index 8e78265c..db31782c 100644 --- a/src/Propulsion.DynamoStore.Notifier/Handler.fs +++ b/src/Propulsion.DynamoStore.Notifier/Handler.fs @@ -28,8 +28,8 @@ let private parse (log: Serilog.ILogger) (dynamoEvent: DynamoDBEvent): KeyValueP let updated = record.Dynamodb.NewImage match record.EventName with - | ot when ot = "REMOVE" -> () - | ot when ot = "INSERT" || ot = "MODIFY" -> + | ot when ot = string OperationType.REMOVE -> () + | ot when ot = string OperationType.INSERT || ot = string OperationType.MODIFY -> let p = record.Dynamodb.Keys["p"].S match FsCodec.StreamName.parse p with | AppendsEpoch.Stream.For (partitionId, epochId) -> From b2eaa0b396936fa14010e6238285e59dcc054aba Mon Sep 17 00:00:00 2001 From: Ruben Bartelink Date: Sat, 7 Feb 2026 17:43:44 +0000 Subject: [PATCH 3/5] Fix ref --- .../Propulsion.DynamoStore.Notifier.fsproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Propulsion.DynamoStore.Notifier/Propulsion.DynamoStore.Notifier.fsproj b/src/Propulsion.DynamoStore.Notifier/Propulsion.DynamoStore.Notifier.fsproj index 7edfe307..e047f4db 100644 --- a/src/Propulsion.DynamoStore.Notifier/Propulsion.DynamoStore.Notifier.fsproj +++ b/src/Propulsion.DynamoStore.Notifier/Propulsion.DynamoStore.Notifier.fsproj @@ -37,7 +37,7 @@ - + From 0acbc1177c808ecb8fe94737a22f0fbf13ebe87c Mon Sep 17 00:00:00 2001 From: Ruben Bartelink Date: Mon, 9 Feb 2026 18:35:42 +0000 Subject: [PATCH 4/5] DR --- src/Propulsion.DynamoStore.Indexer/Handler.fs | 3 +-- src/Propulsion.DynamoStore.Notifier/Handler.fs | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Propulsion.DynamoStore.Indexer/Handler.fs b/src/Propulsion.DynamoStore.Indexer/Handler.fs index 952de252..75fb3278 100644 --- a/src/Propulsion.DynamoStore.Indexer/Handler.fs +++ b/src/Propulsion.DynamoStore.Indexer/Handler.fs @@ -2,10 +2,9 @@ module Propulsion.DynamoStore.Indexer.Handler open Amazon.DynamoDBStreams open Amazon.DynamoDBv2 -open Amazon.Lambda.DynamoDBEvents open Propulsion.DynamoStore -let private parse (log: Serilog.ILogger) (dynamoEvent: DynamoDBEvent): AppendsEpoch.Events.StreamSpan[] = +let private parse (log: Serilog.ILogger) (dynamoEvent: Amazon.Lambda.DynamoDBEvents.DynamoDBEvent): AppendsEpoch.Events.StreamSpan[] = let spans, summary = ResizeArray(), System.Text.StringBuilder() let mutable indexStream, systemStreams, noEvents = 0, 0, 0 try for record in dynamoEvent.Records do diff --git a/src/Propulsion.DynamoStore.Notifier/Handler.fs b/src/Propulsion.DynamoStore.Notifier/Handler.fs index db31782c..ef3689f0 100644 --- a/src/Propulsion.DynamoStore.Notifier/Handler.fs +++ b/src/Propulsion.DynamoStore.Notifier/Handler.fs @@ -1,7 +1,6 @@ module Propulsion.DynamoStore.Notifier.Handler open Amazon.DynamoDBStreams -open Amazon.Lambda.DynamoDBEvents open Amazon.SimpleNotificationService open Amazon.SimpleNotificationService.Model open Propulsion.DynamoStore @@ -10,7 +9,7 @@ open System.Collections.Generic open System.Net open System.Threading -let private parse (log: Serilog.ILogger) (dynamoEvent: DynamoDBEvent): KeyValuePair[] = +let private parse (log: Serilog.ILogger) (dynamoEvent: Amazon.Lambda.DynamoDBEvents.DynamoDBEvent): KeyValuePair[] = let tails = Dictionary() let updateTails partitionId checkpoint = match tails.TryGetValue partitionId with From 1750c290e3fb987c862b65649f65eab6e1348912 Mon Sep 17 00:00:00 2001 From: Ruben Bartelink Date: Mon, 9 Feb 2026 20:25:30 +0000 Subject: [PATCH 5/5] Unpin DynamoStore --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index a0f04dfc..0cf16409 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -19,7 +19,7 @@ $(NoWarn);FS2003;NU5105;NU5104 3.0.0 [$(PinnedBaseVersion), 4.0.0) - [$(PinnedBaseVersion), 4.0.0) +