@effect-app/infra 4.0.0-beta.262 → 4.0.0-beta.264

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @effect-app/infra
2
2
 
3
+ ## 4.0.0-beta.264
4
+
5
+ ### Patch Changes
6
+
7
+ - 1587bfc: Batch more Cosmos cluster storage updates.
8
+ - effect-app@4.0.0-beta.264
9
+
10
+ ## 4.0.0-beta.263
11
+
12
+ ### Patch Changes
13
+
14
+ - abb9c99: Batch Cosmos ack message processing updates.
15
+ - effect-app@4.0.0-beta.263
16
+
3
17
  ## 4.0.0-beta.262
4
18
 
5
19
  ### Patch Changes
@@ -18,25 +18,25 @@ export interface ClusterCosmosConfig {
18
18
  export declare const makeMessageStorage: (options?: {
19
19
  readonly prefix?: string | undefined;
20
20
  } | undefined) => Effect.Effect<{
21
- readonly saveRequest: <R extends import("effect/unstable/rpc/Rpc").Any>(envelope: import("effect/unstable/cluster/Message").OutgoingRequest<R>) => Effect.Effect<MessageStorage.SaveResult<R>, import("effect/unstable/cluster/ClusterError").MalformedMessage | PersistenceError, never>;
22
- readonly saveEnvelope: (envelope: import("effect/unstable/cluster/Message").OutgoingEnvelope) => Effect.Effect<void, import("effect/unstable/cluster/ClusterError").MalformedMessage | PersistenceError, never>;
23
- readonly saveReply: <R extends import("effect/unstable/rpc/Rpc").Any>(reply: Reply.ReplyWithContext<R>) => Effect.Effect<void, import("effect/unstable/cluster/ClusterError").MalformedMessage | PersistenceError, never>;
24
- readonly clearReplies: (requestId: Snowflake.Snowflake) => Effect.Effect<void, PersistenceError, never>;
25
- readonly repliesFor: <R extends import("effect/unstable/rpc/Rpc").Any>(requests: Iterable<import("effect/unstable/cluster/Message").OutgoingRequest<R>>) => Effect.Effect<Reply.Reply<R>[], import("effect/unstable/cluster/ClusterError").MalformedMessage | PersistenceError, never>;
26
- readonly repliesForUnfiltered: (requestIds: Iterable<Snowflake.Snowflake>) => Effect.Effect<Reply.Encoded[], import("effect/unstable/cluster/ClusterError").MalformedMessage | PersistenceError, never>;
21
+ readonly saveRequest: <R extends import("effect/unstable/rpc/Rpc").Any>(envelope: import("effect/unstable/cluster/Message").OutgoingRequest<R>) => Effect.Effect<MessageStorage.SaveResult<R>, PersistenceError | import("effect/unstable/cluster/ClusterError").MalformedMessage>;
22
+ readonly saveEnvelope: (envelope: import("effect/unstable/cluster/Message").OutgoingEnvelope) => Effect.Effect<void, PersistenceError | import("effect/unstable/cluster/ClusterError").MalformedMessage>;
23
+ readonly saveReply: <R extends import("effect/unstable/rpc/Rpc").Any>(reply: Reply.ReplyWithContext<R>) => Effect.Effect<void, PersistenceError | import("effect/unstable/cluster/ClusterError").MalformedMessage>;
24
+ readonly clearReplies: (requestId: Snowflake.Snowflake) => Effect.Effect<void, PersistenceError>;
25
+ readonly repliesFor: <R extends import("effect/unstable/rpc/Rpc").Any>(requests: Iterable<import("effect/unstable/cluster/Message").OutgoingRequest<R>>) => Effect.Effect<Array<Reply.Reply<R>>, PersistenceError | import("effect/unstable/cluster/ClusterError").MalformedMessage>;
26
+ readonly repliesForUnfiltered: (requestIds: Iterable<Snowflake.Snowflake>) => Effect.Effect<Array<Reply.Encoded>, PersistenceError | import("effect/unstable/cluster/ClusterError").MalformedMessage>;
27
27
  readonly requestIdForPrimaryKey: (options: {
28
28
  readonly address: import("effect/unstable/cluster/EntityAddress").EntityAddress;
29
29
  readonly tag: string;
30
30
  readonly id: string;
31
- }) => Effect.Effect<Option.Option<Snowflake.Snowflake>, PersistenceError, never>;
32
- readonly registerReplyHandler: <R extends import("effect/unstable/rpc/Rpc").Any>(message: import("effect/unstable/cluster/Message").OutgoingRequest<R> | import("effect/unstable/cluster/Message").IncomingRequest<R>) => Effect.Effect<void, import("effect/unstable/cluster/ClusterError").EntityNotAssignedToRunner, never>;
33
- readonly unregisterReplyHandler: (requestId: Snowflake.Snowflake) => Effect.Effect<void, never, never>;
34
- readonly unregisterShardReplyHandlers: (shardId: ShardId.ShardId) => Effect.Effect<void, never, never>;
35
- readonly unprocessedMessages: (shardIds: Iterable<ShardId.ShardId>) => Effect.Effect<import("effect/unstable/cluster/Message").Incoming<any>[], PersistenceError, never>;
36
- readonly unprocessedMessagesById: <R extends import("effect/unstable/rpc/Rpc").Any>(messageIds: Iterable<Snowflake.Snowflake>) => Effect.Effect<import("effect/unstable/cluster/Message").Incoming<R>[], PersistenceError, never>;
37
- readonly resetShards: (shardIds: Iterable<ShardId.ShardId>) => Effect.Effect<void, PersistenceError, never>;
38
- readonly resetAddress: (address: import("effect/unstable/cluster/EntityAddress").EntityAddress) => Effect.Effect<void, PersistenceError, never>;
39
- readonly clearAddress: (address: import("effect/unstable/cluster/EntityAddress").EntityAddress) => Effect.Effect<void, PersistenceError, never>;
31
+ }) => Effect.Effect<Option.Option<Snowflake.Snowflake>, PersistenceError>;
32
+ readonly registerReplyHandler: <R extends import("effect/unstable/rpc/Rpc").Any>(message: import("effect/unstable/cluster/Message").OutgoingRequest<R> | import("effect/unstable/cluster/Message").IncomingRequest<R>) => Effect.Effect<void, import("effect/unstable/cluster/ClusterError").EntityNotAssignedToRunner>;
33
+ readonly unregisterReplyHandler: (requestId: Snowflake.Snowflake) => Effect.Effect<void>;
34
+ readonly unregisterShardReplyHandlers: (shardId: ShardId.ShardId) => Effect.Effect<void>;
35
+ readonly unprocessedMessages: (shardIds: Iterable<ShardId.ShardId>) => Effect.Effect<Array<import("effect/unstable/cluster/Message").Incoming<any>>, PersistenceError>;
36
+ readonly unprocessedMessagesById: <R extends import("effect/unstable/rpc/Rpc").Any>(messageIds: Iterable<Snowflake.Snowflake>) => Effect.Effect<Array<import("effect/unstable/cluster/Message").Incoming<R>>, PersistenceError>;
37
+ readonly resetShards: (shardIds: Iterable<ShardId.ShardId>) => Effect.Effect<void, PersistenceError>;
38
+ readonly resetAddress: (address: import("effect/unstable/cluster/EntityAddress").EntityAddress) => Effect.Effect<void, PersistenceError>;
39
+ readonly clearAddress: (address: import("effect/unstable/cluster/EntityAddress").EntityAddress) => Effect.Effect<void, PersistenceError>;
40
40
  readonly withTransaction: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
41
41
  }, never, CosmosClient | Snowflake.Generator>;
42
42
  export declare const makeRunnerStorage: (options?: {
@@ -61,4 +61,4 @@ export declare const layerStorage: (options?: {
61
61
  readonly prefix?: string | undefined;
62
62
  }) => Layer.Layer<MessageStorage.MessageStorage | RunnerStorage.RunnerStorage, never, CosmosClient | ShardingConfig.ShardingConfig>;
63
63
  export declare const layerCosmos: (config: ClusterCosmosConfig) => Layer.Layer<MessageStorage.MessageStorage | RunnerStorage.RunnerStorage, never, ShardingConfig.ShardingConfig>;
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlckNvc21vcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0NsdXN0ZXJDb3Ntb3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFHM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUV2RSxPQUFPLEtBQUssY0FBYyxNQUFNLHdDQUF3QyxDQUFBO0FBRXhFLE9BQU8sS0FBSyxLQUFLLEtBQUssTUFBTSwrQkFBK0IsQ0FBQTtBQUMzRCxPQUFPLEtBQUssYUFBYSxNQUFNLHVDQUF1QyxDQUFBO0FBQ3RFLE9BQU8sS0FBSyxPQUFPLE1BQU0saUNBQWlDLENBQUE7QUFDMUQsT0FBTyxLQUFLLGNBQWMsTUFBTSx3Q0FBd0MsQ0FBQTtBQUN4RSxPQUFPLEtBQUssU0FBUyxNQUFNLG1DQUFtQyxDQUFBO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQXFCLE1BQU0sb0JBQW9CLENBQUE7QUFHcEUsTUFBTSxXQUFXLG1CQUFtQjtJQUNsQyxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdkMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUE7SUFDdkIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQTtDQUN6QjtBQXlVRCxlQUFPLE1BQU0sa0JBQWtCO3NCQUNYLE1BQU0sR0FBRyxTQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZDQXlWcEMsQ0FBQTtBQWlDRixlQUFPLE1BQU0saUJBQWlCO3NCQUNWLE1BQU0sR0FBRyxTQUFTOzs7Ozs7Ozs7O3VEQThOcEMsQ0FBQTtBQUVGLGVBQU8sTUFBTSxtQkFBbUIsYUFBYztJQUM1QyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQTtDQUNyQyxLQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsWUFBWSxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBRy9GLENBQUE7QUFFSCxlQUFPLE1BQU0sa0JBQWtCLGFBQWM7SUFDM0MsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUE7Q0FDckMsS0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksR0FBRyxjQUFjLENBQUMsY0FBYyxDQUN6QixDQUFBO0FBRXZFLGVBQU8sTUFBTSxZQUFZLGFBQWM7SUFDckMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUE7Q0FDckMsS0FBRyxLQUFLLENBQUMsS0FBSyxDQUNiLGNBQWMsQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDLGFBQWEsRUFDM0QsS0FBSyxFQUNMLFlBQVksR0FBRyxjQUFjLENBQUMsY0FBYyxDQUM2QixDQUFBO0FBRTNFLGVBQU8sTUFBTSxXQUFXLFdBQVksbUJBQW1CLEtBQUcsS0FBSyxDQUFDLEtBQUssQ0FDbkUsY0FBYyxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUMsYUFBYSxFQUMzRCxLQUFLLEVBQ0wsY0FBYyxDQUFDLGNBQWMsQ0FJNUIsQ0FBQSJ9
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlckNvc21vcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0NsdXN0ZXJDb3Ntb3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFHM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUV2RSxPQUFPLEtBQUssY0FBYyxNQUFNLHdDQUF3QyxDQUFBO0FBRXhFLE9BQU8sS0FBSyxLQUFLLEtBQUssTUFBTSwrQkFBK0IsQ0FBQTtBQUMzRCxPQUFPLEtBQUssYUFBYSxNQUFNLHVDQUF1QyxDQUFBO0FBQ3RFLE9BQU8sS0FBSyxPQUFPLE1BQU0saUNBQWlDLENBQUE7QUFDMUQsT0FBTyxLQUFLLGNBQWMsTUFBTSx3Q0FBd0MsQ0FBQTtBQUN4RSxPQUFPLEtBQUssU0FBUyxNQUFNLG1DQUFtQyxDQUFBO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQXFCLE1BQU0sb0JBQW9CLENBQUE7QUFHcEUsTUFBTSxXQUFXLG1CQUFtQjtJQUNsQyxRQUFRLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdkMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUE7SUFDdkIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQTtDQUN6QjtBQTRVRCxlQUFPLE1BQU0sa0JBQWtCO3NCQUNYLE1BQU0sR0FBRyxTQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZDQW1YcEMsQ0FBQTtBQWlDRixlQUFPLE1BQU0saUJBQWlCO3NCQUNWLE1BQU0sR0FBRyxTQUFTOzs7Ozs7Ozs7O3VEQThOcEMsQ0FBQTtBQUVGLGVBQU8sTUFBTSxtQkFBbUIsYUFBYztJQUM1QyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQTtDQUNyQyxLQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsWUFBWSxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBRy9GLENBQUE7QUFFSCxlQUFPLE1BQU0sa0JBQWtCLGFBQWM7SUFDM0MsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUE7Q0FDckMsS0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksR0FBRyxjQUFjLENBQUMsY0FBYyxDQUN6QixDQUFBO0FBRXZFLGVBQU8sTUFBTSxZQUFZLGFBQWM7SUFDckMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUE7Q0FDckMsS0FBRyxLQUFLLENBQUMsS0FBSyxDQUNiLGNBQWMsQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDLGFBQWEsRUFDM0QsS0FBSyxFQUNMLFlBQVksR0FBRyxjQUFjLENBQUMsY0FBYyxDQUM2QixDQUFBO0FBRTNFLGVBQU8sTUFBTSxXQUFXLFdBQVksbUJBQW1CLEtBQUcsS0FBSyxDQUFDLEtBQUssQ0FDbkUsY0FBYyxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUMsYUFBYSxFQUMzRCxLQUFLLEVBQ0wsY0FBYyxDQUFDLGNBQWMsQ0FJNUIsQ0FBQSJ9
@@ -1 +1 @@
1
- {"version":3,"file":"ClusterCosmos.d.ts","sourceRoot":"","sources":["../src/ClusterCosmos.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAG3C,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AAEvE,OAAO,KAAK,cAAc,MAAM,wCAAwC,CAAA;AAExE,OAAO,KAAK,KAAK,KAAK,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,aAAa,MAAM,uCAAuC,CAAA;AACtE,OAAO,KAAK,OAAO,MAAM,iCAAiC,CAAA;AAC1D,OAAO,KAAK,cAAc,MAAM,wCAAwC,CAAA;AACxE,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAGpE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAyUD,eAAO,MAAM,kBAAkB;sBACX,MAAM,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;6CAyVpC,CAAA;AAiCF,eAAO,MAAM,iBAAiB;sBACV,MAAM,GAAG,SAAS;;;;;;;;;;uDA8NpC,CAAA;AAEF,eAAO,MAAM,mBAAmB,aAAc;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,EAAE,YAAY,GAAG,cAAc,CAAC,cAAc,CAG/F,CAAA;AAEH,eAAO,MAAM,kBAAkB,aAAc;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,YAAY,GAAG,cAAc,CAAC,cAAc,CACzB,CAAA;AAEvE,eAAO,MAAM,YAAY,aAAc;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CACb,cAAc,CAAC,cAAc,GAAG,aAAa,CAAC,aAAa,EAC3D,KAAK,EACL,YAAY,GAAG,cAAc,CAAC,cAAc,CAC6B,CAAA;AAE3E,eAAO,MAAM,WAAW,WAAY,mBAAmB,KAAG,KAAK,CAAC,KAAK,CACnE,cAAc,CAAC,cAAc,GAAG,aAAa,CAAC,aAAa,EAC3D,KAAK,EACL,cAAc,CAAC,cAAc,CAI5B,CAAA"}
1
+ {"version":3,"file":"ClusterCosmos.d.ts","sourceRoot":"","sources":["../src/ClusterCosmos.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAG3C,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AAEvE,OAAO,KAAK,cAAc,MAAM,wCAAwC,CAAA;AAExE,OAAO,KAAK,KAAK,KAAK,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,aAAa,MAAM,uCAAuC,CAAA;AACtE,OAAO,KAAK,OAAO,MAAM,iCAAiC,CAAA;AAC1D,OAAO,KAAK,cAAc,MAAM,wCAAwC,CAAA;AACxE,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAGpE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AA6UD,eAAO,MAAM,kBAAkB;sBACX,MAAM,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;6CA+VpC,CAAA;AAuFF,eAAO,MAAM,iBAAiB;sBACV,MAAM,GAAG,SAAS;;;;;;;;;;uDAyPpC,CAAA;AAEF,eAAO,MAAM,mBAAmB,aAAc;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,EAAE,YAAY,GAAG,cAAc,CAAC,cAAc,CAG/F,CAAA;AAEH,eAAO,MAAM,kBAAkB,aAAc;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,YAAY,GAAG,cAAc,CAAC,cAAc,CACzB,CAAA;AAEvE,eAAO,MAAM,YAAY,aAAc;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CACb,cAAc,CAAC,cAAc,GAAG,aAAa,CAAC,aAAa,EAC3D,KAAK,EACL,YAAY,GAAG,cAAc,CAAC,cAAc,CAC6B,CAAA;AAE3E,eAAO,MAAM,WAAW,WAAY,mBAAmB,KAAG,KAAK,CAAC,KAAK,CACnE,cAAc,CAAC,cAAc,GAAG,aAAa,CAAC,aAAa,EAC3D,KAAK,EACL,cAAc,CAAC,cAAc,CAI5B,CAAA"}
@@ -23,6 +23,8 @@ const replyPartition = (requestId) => `reply::${requestId}`;
23
23
  const runnerDocId = (address) => cosmosId(`runner::${address}`);
24
24
  const lockDocId = (shardId) => cosmosId(`lock::${shardId}`);
25
25
  const tenMinutes = Duration.toMillis(Duration.minutes(10));
26
+ const maxCosmosBatchOperations = 100;
27
+ const isSuccessfulStatus = (statusCode) => statusCode !== undefined && statusCode >= 200 && statusCode < 300;
26
28
  const isCosmosStatus = (u, code) => Cause.isUnknownError(u)
27
29
  ? isCosmosStatus(u.cause, code)
28
30
  : typeof u === "object" && u !== null && "code" in u && u.code === code;
@@ -237,32 +239,34 @@ export const makeMessageStorage = Effect.fnUntraced(function* (options) {
237
239
  ? Effect.succeed(Option.none())
238
240
  : queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.rowid = @id", [{ name: "@id", value: replyId }])
239
241
  .pipe(Effect.map((docs) => Option.map(Option.fromNullishOr(docs[0]), replyFromDoc)));
240
- const markReplyAcked = (requestId, replyId) => Effect.tryPromise(() => container.item(cosmosId(replyId), replyPartition(requestId)).read()).pipe(Effect.flatMap((resp) => {
241
- const doc = resp.resource;
242
- if (!doc)
243
- return Effect.void;
244
- doc.acked = true;
245
- return Effect
246
- .tryPromise(() => container.item(cosmosId(replyId), replyPartition(requestId)).replace(doc, {
247
- accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
248
- }))
249
- .pipe(Effect.tap(annotateItem), Effect.asVoid);
250
- }), Effect.catchIf(isNotFound, () => Effect.void), Effect.catchIf(isPreconditionFailed, () => Effect.void));
251
- const replaceMessage = (doc) => Effect
252
- .tryPromise(() => container.item(doc.id, doc._partitionKey).replace(doc, {
253
- accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
254
- }))
242
+ const markReplyAcked = (requestId, replyId) => Effect
243
+ .tryPromise(() => container.item(cosmosId(replyId), replyPartition(requestId)).patch([
244
+ { op: "set", path: "/acked", value: true }
245
+ ]))
246
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), Effect.catchIf(isPreconditionFailed, () => Effect.void));
247
+ const claimMessageRead = (doc, now) => Effect
248
+ .tryPromise(() => container.item(doc.id, doc._partitionKey).patch([{ op: "set", path: "/lastRead", value: now }], { accessCondition: { type: "IfMatch", condition: doc._etag ?? "" } }))
255
249
  .pipe(Effect.tap(annotateItem), Effect.as(true), Effect.catchIf(isPreconditionFailed, () => Effect.succeed(false)));
256
- const updateMessage = (doc, update) => Effect.suspend(function loop(current = doc) {
257
- if (!update(current))
258
- return Effect.void;
259
- return replaceMessage(current).pipe(Effect.flatMap((replaced) => replaced
260
- ? Effect.void
261
- : readMessage(current.id, current._partitionKey).pipe(Effect.flatMap((found) => Option.match(found, {
262
- onNone: () => Effect.void,
263
- onSome: loop
264
- })))));
265
- });
250
+ const batchDocs = (docs, operation, fallback) => Effect.forEach(Arr.groupByT(docs, (doc) => doc._partitionKey), ([partitionKey, partitionDocs]) => Effect.forEach(Arr.chunksOf(partitionDocs, maxCosmosBatchOperations), (chunk) => {
251
+ const operations = chunk.map(operation);
252
+ return Effect
253
+ .tryPromise(() => container.items.batch(operations, partitionKey))
254
+ .pipe(Effect.tap(annotateItem), Effect.flatMap((resp) => {
255
+ const failed = resp.result?.find((result) => !isSuccessfulStatus(result.statusCode));
256
+ return failed === undefined ? Effect.void : Effect.fail(failed.statusCode);
257
+ }), Effect.catchIf(() => true, () => Effect.forEach(chunk, fallback, { discard: true })));
258
+ }, { discard: true }), { discard: true });
259
+ const patchDoc = (doc, resourceBody) => Effect.tryPromise(() => container.item(doc.id, doc._partitionKey).patch(resourceBody)).pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void));
260
+ const patchDocs = (docs, resourceBody) => batchDocs(docs, (doc) => ({
261
+ operationType: "Patch",
262
+ id: doc.id,
263
+ resourceBody: resourceBody(doc)
264
+ }), (doc) => patchDoc(doc, resourceBody(doc)));
265
+ const deleteDoc = (doc) => Effect.tryPromise(() => container.item(doc.id, doc._partitionKey).delete()).pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void));
266
+ const deleteDocs = (docs) => batchDocs(docs, (doc) => ({
267
+ operationType: "Delete",
268
+ id: doc.id
269
+ }), deleteDoc);
266
270
  return yield* MessageStorage.makeEncoded({
267
271
  saveEnvelope: ({ deliverAt, envelope, primaryKey }) => Effect
268
272
  .gen(function* () {
@@ -270,10 +274,7 @@ export const makeMessageStorage = Effect.fnUntraced(function* (options) {
270
274
  if (envelope._tag === "AckChunk") {
271
275
  yield* markReplyAcked(envelope.requestId, envelope.replyId);
272
276
  const pendingAcks = yield* queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.kind = 'AckChunk' AND c.processed = false AND c.requestId = @requestId", [{ name: "@requestId", value: envelope.requestId }]);
273
- yield* Effect.forEach(pendingAcks, (ack) => {
274
- ack.processed = true;
275
- return replaceMessage(ack);
276
- }, { discard: true });
277
+ yield* patchDocs(pendingAcks, () => [{ op: "set", path: "/processed", value: true }]);
277
278
  }
278
279
  return yield* Effect.tryPromise(() => container.items.create(doc)).pipe(Effect.tap(annotateItem), Effect.as(SaveResultEncoded.Success()), Effect.catchIf(isConflict, () => readMessage(doc.id, doc._partitionKey).pipe(Effect.flatMap((found) => Option.match(found, {
279
280
  onNone: () => Effect.succeed(SaveResultEncoded.Success()),
@@ -289,18 +290,15 @@ export const makeMessageStorage = Effect.fnUntraced(function* (options) {
289
290
  const doc = replyToDoc(reply);
290
291
  yield* Effect.tryPromise(() => container.items.create(doc)).pipe(Effect.tap(annotateItem), Effect.catchIf(isConflict, () => Effect.void));
291
292
  const messages = yield* queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.requestId = @requestId", [{ name: "@requestId", value: reply.requestId }]);
292
- yield* Effect.forEach(messages, (message) => {
293
- return updateMessage(message, (doc) => {
294
- if (reply._tag === "WithExit") {
295
- doc.processed = true;
296
- }
297
- else if (doc.id !== reply.requestId && doc.kind !== "Request") {
298
- return false;
299
- }
300
- doc.lastReplyId = reply.id;
301
- return true;
302
- });
303
- }, { discard: true });
293
+ const updatedMessages = reply._tag === "WithExit"
294
+ ? messages
295
+ : messages.filter((message) => message.id === reply.requestId || message.kind === "Request");
296
+ yield* patchDocs(updatedMessages, () => reply._tag === "WithExit"
297
+ ? [
298
+ { op: "set", path: "/processed", value: true },
299
+ { op: "set", path: "/lastReplyId", value: reply.id }
300
+ ]
301
+ : [{ op: "set", path: "/lastReplyId", value: reply.id }]);
304
302
  })
305
303
  .pipe(annotate("saveReply"), refailPersistence, withTracerDisabled),
306
304
  clearReplies: (requestId) => Effect
@@ -309,19 +307,14 @@ export const makeMessageStorage = Effect.fnUntraced(function* (options) {
309
307
  const replies = yield* queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.requestId = @requestId AND c.kind = 'WithExit'", [
310
308
  { name: "@requestId", value: id }
311
309
  ]);
312
- yield* Effect.forEach(replies, (reply) => Effect
313
- .tryPromise(() => container.item(reply.id, reply._partitionKey).delete())
314
- .pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void)), { discard: true });
310
+ yield* deleteDocs(replies);
315
311
  const messages = yield* queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.requestId = @requestId", [{ name: "@requestId", value: id }]);
316
- yield* Effect.forEach(messages, (message) => {
317
- if (message.kind === "Interrupt") {
318
- return Effect.tryPromise(() => container.item(message.id, message._partitionKey).delete()).pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void));
319
- }
320
- message.processed = false;
321
- message.lastReplyId = null;
322
- message.lastRead = null;
323
- return replaceMessage(message).pipe(Effect.asVoid);
324
- }, { discard: true });
312
+ yield* deleteDocs(messages.filter((message) => message.kind === "Interrupt"));
313
+ yield* patchDocs(messages.filter((message) => message.kind !== "Interrupt"), () => [
314
+ { op: "set", path: "/processed", value: false },
315
+ { op: "set", path: "/lastReplyId", value: null },
316
+ { op: "set", path: "/lastRead", value: null }
317
+ ]);
325
318
  })
326
319
  .pipe(annotate("clearReplies"), refailPersistence, withTracerDisabled),
327
320
  requestIdForPrimaryKey: (primaryKey) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.messageId = @primaryKey", [
@@ -337,60 +330,76 @@ export const makeMessageStorage = Effect.fnUntraced(function* (options) {
337
330
  { name: "@lastReadBefore", value: now - tenMinutes },
338
331
  { name: "@now", value: now }
339
332
  ])
340
- .pipe(Effect.flatMap((docs) => collectUnprocessed(docs, now, lastReply, replaceMessage, queryReplies)), annotate("unprocessedMessages"), refailPersistence, withTracerDisabled),
333
+ .pipe(Effect.flatMap((docs) => collectUnprocessed(docs, now, claimMessageRead, queryReplies)), annotate("unprocessedMessages"), refailPersistence, withTracerDisabled),
341
334
  unprocessedMessagesById: (messageIds, now) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND (ARRAY_CONTAINS(@messageIds, c.id) OR ARRAY_CONTAINS(@messageIds, c.requestId)) AND c.processed = false AND (NOT IS_DEFINED(c.deliverAt) OR IS_NULL(c.deliverAt) OR c.deliverAt <= @now) ORDER BY c.rowid", [
342
335
  { name: "@messageIds", value: Array.from(messageIds, String) },
343
336
  { name: "@now", value: now }
344
337
  ])
345
- .pipe(Effect.flatMap((docs) => collectUnprocessed(docs, now, lastReply, replaceMessage, queryReplies)), annotate("unprocessedMessagesById"), refailPersistence, withTracerDisabled),
338
+ .pipe(Effect.flatMap((docs) => collectUnprocessedById(docs, queryReplies)), annotate("unprocessedMessagesById"), refailPersistence, withTracerDisabled),
346
339
  resetAddress: (address) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.processed = false AND c.shardId = @shardId AND c.entityType = @entityType AND c.entityId = @entityId", [
347
340
  { name: "@shardId", value: ShardId.toString(address.shardId) },
348
341
  { name: "@entityType", value: address.entityType },
349
342
  { name: "@entityId", value: address.entityId }
350
343
  ])
351
- .pipe(Effect.flatMap((docs) => Effect.forEach(docs, (doc) => {
352
- doc.lastRead = null;
353
- return replaceMessage(doc).pipe(Effect.asVoid);
354
- }, { discard: true })), annotate("resetAddress"), refailPersistence, withTracerDisabled),
344
+ .pipe(Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])), annotate("resetAddress"), refailPersistence, withTracerDisabled),
355
345
  clearAddress: (address) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.entityType = @entityType AND c.entityId = @entityId", [
356
346
  { name: "@entityType", value: address.entityType },
357
347
  { name: "@entityId", value: address.entityId }
358
348
  ])
359
- .pipe(Effect.flatMap((messages) => Effect.forEach(messages, (message) => queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.requestId = @requestId", [
360
- {
361
- name: "@requestId",
362
- value: message
363
- .requestId
364
- }
365
- ])
366
- .pipe(Effect
367
- .flatMap((replies) => Effect
368
- .forEach(replies, (reply) => Effect
369
- .tryPromise(() => container.item(reply.id, reply._partitionKey).delete())
370
- .pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void)), { discard: true })), Effect.andThen(Effect.tryPromise(() => container.item(message.id, message._partitionKey).delete()).pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void)))), { discard: true })), annotate("clearAddress"), refailPersistence, withTracerDisabled),
349
+ .pipe(Effect.flatMap((messages) => {
350
+ if (!Arr.isArrayNonEmpty(messages))
351
+ return Effect.void;
352
+ const requestIds = Array.from(new Set(messages.map((message) => message.requestId)));
353
+ return queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId)", [{ name: "@requestIds", value: requestIds }])
354
+ .pipe(Effect.flatMap((replies) => deleteDocs(replies)), Effect.andThen(deleteDocs(messages)));
355
+ }), annotate("clearAddress"), refailPersistence, withTracerDisabled),
371
356
  resetShards: (shardIds) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.processed = false AND ARRAY_CONTAINS(@shardIds, c.shardId)", [{ name: "@shardIds", value: Array.from(shardIds) }])
372
- .pipe(Effect.flatMap((docs) => Effect.forEach(docs, (doc) => {
373
- doc.lastRead = null;
374
- return replaceMessage(doc).pipe(Effect.asVoid);
375
- }, { discard: true })), annotate("resetShards"), refailPersistence, withTracerDisabled),
357
+ .pipe(Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])), annotate("resetShards"), refailPersistence, withTracerDisabled),
376
358
  withTransaction: (effect) => effect
377
359
  });
378
360
  });
379
- const collectUnprocessed = (docs, now, lastReply, replaceMessage, queryReplies) => Effect.gen(function* () {
361
+ const collectUnprocessed = (docs, now, claimMessageRead, queryReplies) => Effect.gen(function* () {
380
362
  const messages = [];
363
+ const activeRequestIds = yield* activeReplyRequestIds(docs, queryReplies);
364
+ const lastReplies = yield* lastRepliesById(docs, activeRequestIds, queryReplies);
381
365
  for (const doc of docs) {
382
- const replies = yield* queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.requestId = @requestId AND (c.kind = 'WithExit' OR (c.kind = 'Chunk' AND c.acked = false))", [{ name: "@requestId", value: doc.requestId }]);
383
- if (Arr.isArrayNonEmpty(replies))
366
+ if (activeRequestIds.has(doc.requestId))
384
367
  continue;
385
- const sentReply = yield* lastReply(doc.lastReplyId);
386
- doc.lastRead = now;
387
- const replaced = yield* replaceMessage(doc);
388
- if (replaced) {
389
- messages.push(envelopeFromDoc(doc, sentReply));
368
+ const sentReply = Option.fromNullishOr(doc.lastReplyId === null ? undefined : lastReplies.get(doc.lastReplyId));
369
+ const claimed = yield* claimMessageRead(doc, now);
370
+ if (claimed) {
371
+ messages.push(envelopeFromDoc({ ...doc, lastRead: now }, sentReply));
390
372
  }
391
373
  }
392
374
  return messages;
393
375
  });
376
+ const collectUnprocessedById = (docs, queryReplies) => Effect.gen(function* () {
377
+ const messages = [];
378
+ const activeRequestIds = yield* activeReplyRequestIds(docs, queryReplies);
379
+ const lastReplies = yield* lastRepliesById(docs, activeRequestIds, queryReplies);
380
+ for (const doc of docs) {
381
+ if (activeRequestIds.has(doc.requestId))
382
+ continue;
383
+ const sentReply = Option.fromNullishOr(doc.lastReplyId === null ? undefined : lastReplies.get(doc.lastReplyId));
384
+ messages.push(envelopeFromDoc(doc, sentReply));
385
+ }
386
+ return messages;
387
+ });
388
+ const activeReplyRequestIds = (docs, queryReplies) => {
389
+ const requestIds = Array.from(new Set(docs.map((doc) => doc.requestId)));
390
+ if (!Arr.isArrayNonEmpty(requestIds))
391
+ return Effect.succeed(new Set());
392
+ return queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId) AND (c.kind = 'WithExit' OR (c.kind = 'Chunk' AND c.acked = false))", [{ name: "@requestIds", value: requestIds }])
393
+ .pipe(Effect.map((replies) => new Set(replies.map((reply) => reply.requestId))));
394
+ };
395
+ const lastRepliesById = (docs, activeRequestIds, queryReplies) => {
396
+ const replyIds = Array.from(new Set(docs
397
+ .flatMap((doc) => activeRequestIds.has(doc.requestId) || doc.lastReplyId === null ? [] : [doc.lastReplyId])));
398
+ if (!Arr.isArrayNonEmpty(replyIds))
399
+ return Effect.succeed(new Map());
400
+ return queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@replyIds, c.rowid)", [{ name: "@replyIds", value: replyIds }])
401
+ .pipe(Effect.map((replies) => new Map(replies.map((reply) => [reply.rowid, replyFromDoc(reply)]))));
402
+ };
394
403
  export const makeRunnerStorage = Effect.fnUntraced(function* (options) {
395
404
  const prefix = options?.prefix ?? "cluster-";
396
405
  const container = yield* createContainer(prefix)().pipe(Effect.orDie);
@@ -404,12 +413,22 @@ export const makeRunnerStorage = Effect.fnUntraced(function* (options) {
404
413
  .query({ query, parameters: Array.from(parameters) }, { partitionKey: "runner" })
405
414
  .fetchAll())
406
415
  .pipe(Effect.tap(annotateFeed), Effect.map((resp) => resp.resources));
416
+ const deleteRunner = (doc) => Effect
417
+ .tryPromise(() => container.item(doc.id, "runner").delete({
418
+ accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
419
+ }))
420
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), Effect.catchIf(isPreconditionFailed, () => Effect.void));
407
421
  const readLock = (shardId) => Effect.tryPromise(() => container.item(lockDocId(shardId), "lock").read()).pipe(Effect.tap(annotateItem), Effect.map((resp) => Option.fromNullishOr(resp.resource)), Effect.catchIf(isNotFound, () => Effect.succeed(Option.none())));
408
422
  const writeLock = (doc) => Effect
409
423
  .tryPromise(() => container.item(doc.id, "lock").replace(doc, {
410
424
  accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
411
425
  }))
412
426
  .pipe(Effect.tap(annotateItem), Effect.as(true), Effect.catchIf(isPreconditionFailed, () => Effect.succeed(false)));
427
+ const deleteLock = (doc) => Effect
428
+ .tryPromise(() => container.item(doc.id, "lock").delete({
429
+ accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
430
+ }))
431
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), Effect.catchIf(isPreconditionFailed, () => Effect.void));
413
432
  const createLock = (address, shardId, now) => Effect
414
433
  .tryPromise(() => container.items.create({
415
434
  id: lockDocId(shardId),
@@ -446,25 +465,24 @@ export const makeRunnerStorage = Effect.fnUntraced(function* (options) {
446
465
  lastHeartbeat: now
447
466
  }))
448
467
  .pipe(Effect.tap(annotateItem))), Effect.as(makeMachineId(address)), annotate("register"), refailPersistence, withTracerDisabled),
449
- unregister: (address) => Effect.tryPromise(() => container.item(runnerDocId(address), "runner").delete()).pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void), annotate("unregister"), refailPersistence, withTracerDisabled),
450
- setRunnerHealth: (address, healthy) => Effect.tryPromise(() => container.item(runnerDocId(address), "runner").read()).pipe(Effect.flatMap((resp) => {
451
- const doc = resp.resource;
452
- if (!doc)
453
- return Effect.void;
454
- doc.healthy = healthy;
455
- return Effect.tryPromise(() => container.item(doc.id, "runner").replace(doc)).pipe(Effect.tap(annotateItem));
456
- }), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), annotate("setRunnerHealth"), refailPersistence, withTracerDisabled),
468
+ unregister: (address) => Effect.sync(() => Date.now()).pipe(Effect.flatMap((now) => queryRunners("SELECT * FROM c WHERE c.type = 'runner' AND (c.address = @address OR c.lastHeartbeat < @expiresAt)", [
469
+ { name: "@address", value: address },
470
+ { name: "@expiresAt", value: now - expires }
471
+ ])), Effect.flatMap((docs) => Effect.forEach(docs, deleteRunner, { discard: true })), annotate("unregister"), refailPersistence, withTracerDisabled),
472
+ setRunnerHealth: (address, healthy) => Effect
473
+ .tryPromise(() => container.item(runnerDocId(address), "runner").patch([
474
+ { op: "set", path: "/healthy", value: healthy }
475
+ ]))
476
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), annotate("setRunnerHealth"), refailPersistence, withTracerDisabled),
457
477
  acquire: (address, shardIds) => Effect.sync(() => Date.now()).pipe(Effect.flatMap((now) => Effect.forEach(shardIds, (shardId) => tryAcquire(address, shardId, now))), Effect.map(Arr.getSomes), annotate("acquire"), refailPersistence, withTracerDisabled),
458
478
  refresh: (address, shardIds) => Effect
459
479
  .gen(function* () {
460
480
  const now = Date.now();
461
- yield* Effect.tryPromise(() => container.item(runnerDocId(address), "runner").read()).pipe(Effect.flatMap((resp) => {
462
- const doc = resp.resource;
463
- if (!doc)
464
- return Effect.void;
465
- doc.lastHeartbeat = now;
466
- return Effect.tryPromise(() => container.item(doc.id, "runner").replace(doc)).pipe(Effect.tap(annotateItem));
467
- }), Effect.catchIf(isNotFound, () => Effect.void));
481
+ yield* Effect
482
+ .tryPromise(() => container.item(runnerDocId(address), "runner").patch([
483
+ { op: "set", path: "/lastHeartbeat", value: now }
484
+ ]))
485
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void));
468
486
  const refreshed = yield* Effect.forEach(shardIds, (shardId) => readLock(shardId).pipe(Effect.flatMap((lock) => Option.match(lock, {
469
487
  onNone: () => Effect.succeed(Option.none()),
470
488
  onSome: (doc) => {
@@ -480,7 +498,7 @@ export const makeRunnerStorage = Effect.fnUntraced(function* (options) {
480
498
  release: (address, shardId) => readLock(shardId).pipe(Effect.flatMap((lock) => Option.match(lock, {
481
499
  onNone: () => Effect.void,
482
500
  onSome: (doc) => doc.address === address
483
- ? Effect.tryPromise(() => container.item(doc.id, "lock").delete()).pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void), Effect.asVoid)
501
+ ? deleteLock(doc)
484
502
  : Effect.void
485
503
  })), annotate("release"), refailPersistence, withTracerDisabled),
486
504
  releaseAll: (address) => Effect
@@ -491,11 +509,11 @@ export const makeRunnerStorage = Effect.fnUntraced(function* (options) {
491
509
  parameters: [{ name: "@address", value: address }]
492
510
  }, { partitionKey: "lock" })
493
511
  .fetchAll())
494
- .pipe(Effect.tap(annotateFeed), Effect.flatMap((resp) => Effect.forEach(resp.resources, (doc) => Effect.tryPromise(() => container.item(doc.id, "lock").delete()).pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void)), { discard: true })), annotate("releaseAll"), refailPersistence, withTracerDisabled)
512
+ .pipe(Effect.tap(annotateFeed), Effect.flatMap((resp) => Effect.forEach(resp.resources, deleteLock, { discard: true })), annotate("releaseAll"), refailPersistence, withTracerDisabled)
495
513
  });
496
514
  });
497
515
  export const layerMessageStorage = (options) => Layer.effect(MessageStorage.MessageStorage, makeMessageStorage(options)).pipe(Layer.provide(Snowflake.layerGenerator));
498
516
  export const layerRunnerStorage = (options) => Layer.effect(RunnerStorage.RunnerStorage, makeRunnerStorage(options));
499
517
  export const layerStorage = (options) => Layer.merge(layerMessageStorage(options), layerRunnerStorage(options));
500
518
  export const layerCosmos = (config) => layerStorage({ prefix: config.prefix }).pipe(Layer.provide(CosmosClientLayer(Redacted.value(config.url), config.dbName)));
501
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlckNvc21vcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DbHVzdGVyQ29zbW9zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxHQUFHLE1BQU0sa0JBQWtCLENBQUE7QUFDdkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxLQUFLLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssUUFBUSxNQUFNLGlCQUFpQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBRXZFLE9BQU8sS0FBSyxjQUFjLE1BQU0sd0NBQXdDLENBQUE7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFFMUUsT0FBTyxLQUFLLGFBQWEsTUFBTSx1Q0FBdUMsQ0FBQTtBQUN0RSxPQUFPLEtBQUssT0FBTyxNQUFNLGlDQUFpQyxDQUFBO0FBQzFELE9BQU8sS0FBSyxjQUFjLE1BQU0sd0NBQXdDLENBQUE7QUFDeEUsT0FBTyxLQUFLLFNBQVMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQWdGOUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDMUQsTUFBTSxpQkFBaUIsR0FBRyxDQUFVLE1BQThCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxN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
519
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlckNvc21vcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DbHVzdGVyQ29zbW9zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxHQUFHLE1BQU0sa0JBQWtCLENBQUE7QUFDdkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxLQUFLLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssUUFBUSxNQUFNLGlCQUFpQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBRXZFLE9BQU8sS0FBSyxjQUFjLE1BQU0sd0NBQXdDLENBQUE7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFFMUUsT0FBTyxLQUFLLGFBQWEsTUFBTSx1Q0FBdUMsQ0FBQTtBQUN0RSxPQUFPLEtBQUssT0FBTyxNQUFNLGlDQUFpQyxDQUFBO0FBQzFELE9BQU8sS0FBSyxjQUFjLE1BQU0sd0NBQXdDLENBQUE7QUFDeEUsT0FBTyxLQUFLLFNBQVMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQWlGOUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDMUQsTUFBTSxpQkFBaUIsR0FBRyxDQUFVLE1BQThCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxN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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/infra",
3
- "version": "4.0.0-beta.262",
3
+ "version": "4.0.0-beta.264",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -13,7 +13,7 @@
13
13
  "proper-lockfile": "^4.1.2",
14
14
  "pure-rand": "8.4.0",
15
15
  "query-string": "^9.4.0",
16
- "effect-app": "4.0.0-beta.262"
16
+ "effect-app": "4.0.0-beta.264"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@azure/cosmos": "^4.9.3",
package/run.sh CHANGED
@@ -1 +1,7 @@
1
- COSMOS_TEST_URL="AccountEndpoint=https://macs-empasa-dev.documents.azure.com:443/;AccountKey=bu1BPiecISwsSG7cNGrF0RWAX8QhAOPZKIvK9WVNQXelsdt3FJ6jo6YPqnKChvMLvtwO1USsiTKBACDb6Zp1bA==;" pnpm test test/cluster-cosmos.test.ts
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ cd "$(dirname "$0")/../.."
5
+
6
+ COSMOS_TEST_URL="AccountEndpoint=https://macs-empasa-dev.documents.azure.com:443/;AccountKey=bu1BPiecISwsSG7cNGrF0RWAX8QhAOPZKIvK9WVNQXelsdt3FJ6jo6YPqnKChvMLvtwO1USsiTKBACDb6Zp1bA==;" \
7
+ pnpm --filter @effect-app/infra test:run test/cluster-cosmos.test.ts
@@ -1,3 +1,4 @@
1
+ import type { OperationInput, PatchRequestBody } from "@azure/cosmos"
1
2
  import * as Arr from "effect-app/Array"
2
3
  import * as Effect from "effect-app/Effect"
3
4
  import * as Layer from "effect-app/Layer"
@@ -83,6 +84,7 @@ interface RunnerDoc {
83
84
  runner: string
84
85
  healthy: boolean
85
86
  lastHeartbeat: number
87
+ readonly _etag?: string
86
88
  }
87
89
 
88
90
  interface LockDoc {
@@ -105,6 +107,9 @@ const replyPartition = (requestId: string) => `reply::${requestId}`
105
107
  const runnerDocId = (address: string) => cosmosId(`runner::${address}`)
106
108
  const lockDocId = (shardId: string) => cosmosId(`lock::${shardId}`)
107
109
  const tenMinutes = Duration.toMillis(Duration.minutes(10))
110
+ const maxCosmosBatchOperations = 100
111
+ const isSuccessfulStatus = (statusCode: number | undefined): boolean =>
112
+ statusCode !== undefined && statusCode >= 200 && statusCode < 300
108
113
 
109
114
  const isCosmosStatus = (u: unknown, code: number): boolean =>
110
115
  Cause.isUnknownError(u)
@@ -391,29 +396,26 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
391
396
  )
392
397
 
393
398
  const markReplyAcked = (requestId: string, replyId: string) =>
394
- Effect.tryPromise(() => container.item(cosmosId(replyId), replyPartition(requestId)).read<ReplyDoc>()).pipe(
395
- Effect.flatMap((resp) => {
396
- const doc = resp.resource
397
- if (!doc) return Effect.void
398
- doc.acked = true
399
- return Effect
400
- .tryPromise(() =>
401
- container.item(cosmosId(replyId), replyPartition(requestId)).replace(doc, {
402
- accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
403
- })
404
- )
405
- .pipe(Effect.tap(annotateItem), Effect.asVoid)
406
- }),
407
- Effect.catchIf(isNotFound, () => Effect.void),
408
- Effect.catchIf(isPreconditionFailed, () => Effect.void)
409
- )
399
+ Effect
400
+ .tryPromise(() =>
401
+ container.item(cosmosId(replyId), replyPartition(requestId)).patch<ReplyDoc>([
402
+ { op: "set", path: "/acked", value: true }
403
+ ])
404
+ )
405
+ .pipe(
406
+ Effect.tap(annotateItem),
407
+ Effect.asVoid,
408
+ Effect.catchIf(isNotFound, () => Effect.void),
409
+ Effect.catchIf(isPreconditionFailed, () => Effect.void)
410
+ )
410
411
 
411
- const replaceMessage = (doc: MessageDoc) =>
412
+ const claimMessageRead = (doc: MessageDoc, now: number) =>
412
413
  Effect
413
414
  .tryPromise(() =>
414
- container.item(doc.id, doc._partitionKey).replace(doc, {
415
- accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
416
- })
415
+ container.item(doc.id, doc._partitionKey).patch<MessageDoc>(
416
+ [{ op: "set", path: "/lastRead", value: now }],
417
+ { accessCondition: { type: "IfMatch", condition: doc._etag ?? "" } }
418
+ )
417
419
  )
418
420
  .pipe(
419
421
  Effect.tap(annotateItem),
@@ -421,27 +423,78 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
421
423
  Effect.catchIf(isPreconditionFailed, () => Effect.succeed(false))
422
424
  )
423
425
 
424
- const updateMessage = (
425
- doc: MessageDoc,
426
- update: (doc: MessageDoc) => boolean
427
- ): Effect.Effect<void, unknown> =>
428
- Effect.suspend(function loop(current = doc): Effect.Effect<void, unknown> {
429
- if (!update(current)) return Effect.void
430
- return replaceMessage(current).pipe(
431
- Effect.flatMap((replaced) =>
432
- replaced
433
- ? Effect.void
434
- : readMessage(current.id, current._partitionKey).pipe(
435
- Effect.flatMap((found) =>
436
- Option.match(found, {
437
- onNone: () => Effect.void,
438
- onSome: loop
439
- })
426
+ const batchDocs = <A extends { readonly id: string; readonly _partitionKey: string }>(
427
+ docs: ReadonlyArray<A>,
428
+ operation: (doc: A) => OperationInput,
429
+ fallback: (doc: A) => Effect.Effect<void, unknown, never>
430
+ ): Effect.Effect<void, unknown, never> =>
431
+ Effect.forEach(
432
+ Arr.groupByT(docs, (doc) => doc._partitionKey),
433
+ ([partitionKey, partitionDocs]) =>
434
+ Effect.forEach(
435
+ Arr.chunksOf(partitionDocs, maxCosmosBatchOperations),
436
+ (chunk) => {
437
+ const operations: Array<OperationInput> = chunk.map(operation)
438
+ return Effect
439
+ .tryPromise(() => container.items.batch(operations, partitionKey))
440
+ .pipe(
441
+ Effect.tap(annotateItem),
442
+ Effect.flatMap((resp) => {
443
+ const failed = resp.result?.find((result) => !isSuccessfulStatus(result.statusCode))
444
+ return failed === undefined ? Effect.void : Effect.fail(failed.statusCode)
445
+ }),
446
+ Effect.catchIf(() => true, () => Effect.forEach(chunk, fallback, { discard: true }))
440
447
  )
441
- )
442
- )
443
- )
444
- })
448
+ },
449
+ { discard: true }
450
+ ),
451
+ { discard: true }
452
+ )
453
+
454
+ const patchDoc = <A extends { readonly id: string; readonly _partitionKey: string }>(
455
+ doc: A,
456
+ resourceBody: PatchRequestBody
457
+ ): Effect.Effect<void, unknown, never> =>
458
+ Effect.tryPromise(() => container.item(doc.id, doc._partitionKey).patch(resourceBody)).pipe(
459
+ Effect.tap(annotateItem),
460
+ Effect.asVoid,
461
+ Effect.catchIf(isNotFound, () => Effect.void)
462
+ )
463
+
464
+ const patchDocs = <A extends { readonly id: string; readonly _partitionKey: string }>(
465
+ docs: ReadonlyArray<A>,
466
+ resourceBody: (doc: A) => PatchRequestBody
467
+ ): Effect.Effect<void, unknown, never> =>
468
+ batchDocs(
469
+ docs,
470
+ (doc) => ({
471
+ operationType: "Patch" as const,
472
+ id: doc.id,
473
+ resourceBody: resourceBody(doc)
474
+ }),
475
+ (doc) => patchDoc(doc, resourceBody(doc))
476
+ )
477
+
478
+ const deleteDoc = <A extends { readonly id: string; readonly _partitionKey: string }>(
479
+ doc: A
480
+ ): Effect.Effect<void, unknown, never> =>
481
+ Effect.tryPromise(() => container.item(doc.id, doc._partitionKey).delete()).pipe(
482
+ Effect.tap(annotateItem),
483
+ Effect.asVoid,
484
+ Effect.catchIf(isNotFound, () => Effect.void)
485
+ )
486
+
487
+ const deleteDocs = <A extends { readonly id: string; readonly _partitionKey: string }>(
488
+ docs: ReadonlyArray<A>
489
+ ): Effect.Effect<void, unknown, never> =>
490
+ batchDocs(
491
+ docs,
492
+ (doc) => ({
493
+ operationType: "Delete" as const,
494
+ id: doc.id
495
+ }),
496
+ deleteDoc
497
+ )
445
498
 
446
499
  return yield* MessageStorage.makeEncoded({
447
500
  saveEnvelope: ({ deliverAt, envelope, primaryKey }) =>
@@ -454,10 +507,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
454
507
  "SELECT * FROM c WHERE c.type = 'message' AND c.kind = 'AckChunk' AND c.processed = false AND c.requestId = @requestId",
455
508
  [{ name: "@requestId", value: envelope.requestId }]
456
509
  )
457
- yield* Effect.forEach(pendingAcks, (ack) => {
458
- ack.processed = true
459
- return replaceMessage(ack)
460
- }, { discard: true })
510
+ yield* patchDocs(pendingAcks, () => [{ op: "set", path: "/processed", value: true }])
461
511
  }
462
512
  return yield* Effect.tryPromise(() => container.items.create(doc)).pipe(
463
513
  Effect.tap(annotateItem),
@@ -495,17 +545,16 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
495
545
  "SELECT * FROM c WHERE c.type = 'message' AND c.requestId = @requestId",
496
546
  [{ name: "@requestId", value: reply.requestId }]
497
547
  )
498
- yield* Effect.forEach(messages, (message) => {
499
- return updateMessage(message, (doc) => {
500
- if (reply._tag === "WithExit") {
501
- doc.processed = true
502
- } else if (doc.id !== reply.requestId && doc.kind !== "Request") {
503
- return false
504
- }
505
- doc.lastReplyId = reply.id
506
- return true
507
- })
508
- }, { discard: true })
548
+ const updatedMessages = reply._tag === "WithExit"
549
+ ? messages
550
+ : messages.filter((message) => message.id === reply.requestId || message.kind === "Request")
551
+ yield* patchDocs(updatedMessages, () =>
552
+ reply._tag === "WithExit"
553
+ ? [
554
+ { op: "set", path: "/processed", value: true },
555
+ { op: "set", path: "/lastReplyId", value: reply.id }
556
+ ]
557
+ : [{ op: "set", path: "/lastReplyId", value: reply.id }])
509
558
  })
510
559
  .pipe(annotate("saveReply"), refailPersistence, withTracerDisabled),
511
560
 
@@ -519,29 +568,20 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
519
568
  { name: "@requestId", value: id }
520
569
  ]
521
570
  )
522
- yield* Effect.forEach(replies, (reply) =>
523
- Effect
524
- .tryPromise(() => container.item(reply.id, reply._partitionKey).delete())
525
- .pipe(
526
- Effect.tap(annotateItem),
527
- Effect.catchIf(isNotFound, () => Effect.void)
528
- ), { discard: true })
571
+ yield* deleteDocs(replies)
529
572
  const messages = yield* queryMessages(
530
573
  "SELECT * FROM c WHERE c.type = 'message' AND c.requestId = @requestId",
531
574
  [{ name: "@requestId", value: id }]
532
575
  )
533
- yield* Effect.forEach(messages, (message) => {
534
- if (message.kind === "Interrupt") {
535
- return Effect.tryPromise(() => container.item(message.id, message._partitionKey).delete()).pipe(
536
- Effect.tap(annotateItem),
537
- Effect.catchIf(isNotFound, () => Effect.void)
538
- )
539
- }
540
- message.processed = false
541
- message.lastReplyId = null
542
- message.lastRead = null
543
- return replaceMessage(message).pipe(Effect.asVoid)
544
- }, { discard: true })
576
+ yield* deleteDocs(messages.filter((message) => message.kind === "Interrupt"))
577
+ yield* patchDocs(
578
+ messages.filter((message) => message.kind !== "Interrupt"),
579
+ () => [
580
+ { op: "set", path: "/processed", value: false },
581
+ { op: "set", path: "/lastReplyId", value: null },
582
+ { op: "set", path: "/lastRead", value: null }
583
+ ]
584
+ )
545
585
  })
546
586
  .pipe(annotate("clearReplies"), refailPersistence, withTracerDisabled),
547
587
 
@@ -590,7 +630,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
590
630
  ]
591
631
  )
592
632
  .pipe(
593
- Effect.flatMap((docs) => collectUnprocessed(docs, now, lastReply, replaceMessage, queryReplies)),
633
+ Effect.flatMap((docs) => collectUnprocessed(docs, now, claimMessageRead, queryReplies)),
594
634
  annotate("unprocessedMessages"),
595
635
  refailPersistence,
596
636
  withTracerDisabled
@@ -605,7 +645,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
605
645
  ]
606
646
  )
607
647
  .pipe(
608
- Effect.flatMap((docs) => collectUnprocessed(docs, now, lastReply, replaceMessage, queryReplies)),
648
+ Effect.flatMap((docs) => collectUnprocessedById(docs, queryReplies)),
609
649
  annotate("unprocessedMessagesById"),
610
650
  refailPersistence,
611
651
  withTracerDisabled
@@ -621,12 +661,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
621
661
  ]
622
662
  )
623
663
  .pipe(
624
- Effect.flatMap((docs) =>
625
- Effect.forEach(docs, (doc) => {
626
- doc.lastRead = null
627
- return replaceMessage(doc).pipe(Effect.asVoid)
628
- }, { discard: true })
629
- ),
664
+ Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])),
630
665
  annotate("resetAddress"),
631
666
  refailPersistence,
632
667
  withTracerDisabled
@@ -641,37 +676,18 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
641
676
  ]
642
677
  )
643
678
  .pipe(
644
- Effect.flatMap((messages) =>
645
- Effect.forEach(messages, (message) =>
646
- queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.requestId = @requestId", [
647
- {
648
- name: "@requestId",
649
- value: message
650
- .requestId
651
- }
652
- ])
653
- .pipe(
654
- Effect
655
- .flatMap((replies) =>
656
- Effect
657
- .forEach(replies, (reply) =>
658
- Effect
659
- .tryPromise(() =>
660
- container.item(reply.id, reply._partitionKey).delete()
661
- )
662
- .pipe(
663
- Effect.tap(annotateItem),
664
- Effect.catchIf(isNotFound, () => Effect.void)
665
- ), { discard: true })
666
- ),
667
- Effect.andThen(
668
- Effect.tryPromise(() => container.item(message.id, message._partitionKey).delete()).pipe(
669
- Effect.tap(annotateItem),
670
- Effect.catchIf(isNotFound, () => Effect.void)
671
- )
672
- )
673
- ), { discard: true })
674
- ),
679
+ Effect.flatMap((messages) => {
680
+ if (!Arr.isArrayNonEmpty(messages)) return Effect.void
681
+ const requestIds = Array.from(new Set(messages.map((message) => message.requestId)))
682
+ return queryReplies(
683
+ "SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId)",
684
+ [{ name: "@requestIds", value: requestIds }]
685
+ )
686
+ .pipe(
687
+ Effect.flatMap((replies) => deleteDocs(replies)),
688
+ Effect.andThen(deleteDocs(messages))
689
+ )
690
+ }),
675
691
  annotate("clearAddress"),
676
692
  refailPersistence,
677
693
  withTracerDisabled
@@ -683,12 +699,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
683
699
  [{ name: "@shardIds", value: Array.from(shardIds) }]
684
700
  )
685
701
  .pipe(
686
- Effect.flatMap((docs) =>
687
- Effect.forEach(docs, (doc) => {
688
- doc.lastRead = null
689
- return replaceMessage(doc).pipe(Effect.asVoid)
690
- }, { discard: true })
691
- ),
702
+ Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])),
692
703
  annotate("resetShards"),
693
704
  refailPersistence,
694
705
  withTracerDisabled
@@ -701,8 +712,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
701
712
  const collectUnprocessed = <E>(
702
713
  docs: ReadonlyArray<MessageDoc>,
703
714
  now: number,
704
- lastReply: (replyId: string | null) => Effect.Effect<Option.Option<Reply.Encoded>, E>,
705
- replaceMessage: (doc: MessageDoc) => Effect.Effect<boolean, E>,
715
+ claimMessageRead: (doc: MessageDoc, now: number) => Effect.Effect<boolean, E>,
706
716
  queryReplies: (
707
717
  query: string,
708
718
  parameters: ReadonlyArray<CosmosParameter>
@@ -713,22 +723,77 @@ const collectUnprocessed = <E>(
713
723
  readonly envelope: Envelope.Encoded
714
724
  readonly lastSentReply: Option.Option<Reply.Encoded>
715
725
  }> = []
726
+ const activeRequestIds = yield* activeReplyRequestIds(docs, queryReplies)
727
+ const lastReplies = yield* lastRepliesById(docs, activeRequestIds, queryReplies)
716
728
  for (const doc of docs) {
717
- const replies = yield* queryReplies(
718
- "SELECT * FROM c WHERE c.type = 'reply' AND c.requestId = @requestId AND (c.kind = 'WithExit' OR (c.kind = 'Chunk' AND c.acked = false))",
719
- [{ name: "@requestId", value: doc.requestId }]
720
- )
721
- if (Arr.isArrayNonEmpty(replies)) continue
722
- const sentReply = yield* lastReply(doc.lastReplyId)
723
- doc.lastRead = now
724
- const replaced = yield* replaceMessage(doc)
725
- if (replaced) {
726
- messages.push(envelopeFromDoc(doc, sentReply))
729
+ if (activeRequestIds.has(doc.requestId)) continue
730
+ const sentReply = Option.fromNullishOr(doc.lastReplyId === null ? undefined : lastReplies.get(doc.lastReplyId))
731
+ const claimed = yield* claimMessageRead(doc, now)
732
+ if (claimed) {
733
+ messages.push(envelopeFromDoc({ ...doc, lastRead: now }, sentReply))
727
734
  }
728
735
  }
729
736
  return messages
730
737
  })
731
738
 
739
+ const collectUnprocessedById = <E>(
740
+ docs: ReadonlyArray<MessageDoc>,
741
+ queryReplies: (
742
+ query: string,
743
+ parameters: ReadonlyArray<CosmosParameter>
744
+ ) => Effect.Effect<Array<ReplyDoc>, E>
745
+ ) =>
746
+ Effect.gen(function*() {
747
+ const messages: Array<{
748
+ readonly envelope: Envelope.Encoded
749
+ readonly lastSentReply: Option.Option<Reply.Encoded>
750
+ }> = []
751
+ const activeRequestIds = yield* activeReplyRequestIds(docs, queryReplies)
752
+ const lastReplies = yield* lastRepliesById(docs, activeRequestIds, queryReplies)
753
+ for (const doc of docs) {
754
+ if (activeRequestIds.has(doc.requestId)) continue
755
+ const sentReply = Option.fromNullishOr(doc.lastReplyId === null ? undefined : lastReplies.get(doc.lastReplyId))
756
+ messages.push(envelopeFromDoc(doc, sentReply))
757
+ }
758
+ return messages
759
+ })
760
+
761
+ const activeReplyRequestIds = <E>(
762
+ docs: ReadonlyArray<MessageDoc>,
763
+ queryReplies: (
764
+ query: string,
765
+ parameters: ReadonlyArray<CosmosParameter>
766
+ ) => Effect.Effect<Array<ReplyDoc>, E>
767
+ ) => {
768
+ const requestIds = Array.from(new Set(docs.map((doc) => doc.requestId)))
769
+ if (!Arr.isArrayNonEmpty(requestIds)) return Effect.succeed(new Set<string>())
770
+ return queryReplies(
771
+ "SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId) AND (c.kind = 'WithExit' OR (c.kind = 'Chunk' AND c.acked = false))",
772
+ [{ name: "@requestIds", value: requestIds }]
773
+ )
774
+ .pipe(Effect.map((replies) => new Set(replies.map((reply) => reply.requestId))))
775
+ }
776
+
777
+ const lastRepliesById = <E>(
778
+ docs: ReadonlyArray<MessageDoc>,
779
+ activeRequestIds: ReadonlySet<string>,
780
+ queryReplies: (
781
+ query: string,
782
+ parameters: ReadonlyArray<CosmosParameter>
783
+ ) => Effect.Effect<Array<ReplyDoc>, E>
784
+ ) => {
785
+ const replyIds = Array.from(
786
+ new Set(docs
787
+ .flatMap((doc) => activeRequestIds.has(doc.requestId) || doc.lastReplyId === null ? [] : [doc.lastReplyId]))
788
+ )
789
+ if (!Arr.isArrayNonEmpty(replyIds)) return Effect.succeed(new Map<string, Reply.Encoded>())
790
+ return queryReplies(
791
+ "SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@replyIds, c.rowid)",
792
+ [{ name: "@replyIds", value: replyIds }]
793
+ )
794
+ .pipe(Effect.map((replies) => new Map(replies.map((reply) => [reply.rowid, replyFromDoc(reply)]))))
795
+ }
796
+
732
797
  export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
733
798
  readonly prefix?: string | undefined
734
799
  }) {
@@ -750,6 +815,20 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
750
815
  )
751
816
  .pipe(Effect.tap(annotateFeed), Effect.map((resp) => resp.resources))
752
817
 
818
+ const deleteRunner = (doc: RunnerDoc) =>
819
+ Effect
820
+ .tryPromise(() =>
821
+ container.item(doc.id, "runner").delete({
822
+ accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
823
+ })
824
+ )
825
+ .pipe(
826
+ Effect.tap(annotateItem),
827
+ Effect.asVoid,
828
+ Effect.catchIf(isNotFound, () => Effect.void),
829
+ Effect.catchIf(isPreconditionFailed, () => Effect.void)
830
+ )
831
+
753
832
  const readLock = (shardId: string) =>
754
833
  Effect.tryPromise(() => container.item(lockDocId(shardId), "lock").read<LockDoc>()).pipe(
755
834
  Effect.tap(annotateItem),
@@ -770,6 +849,20 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
770
849
  Effect.catchIf(isPreconditionFailed, () => Effect.succeed(false))
771
850
  )
772
851
 
852
+ const deleteLock = (doc: LockDoc) =>
853
+ Effect
854
+ .tryPromise(() =>
855
+ container.item(doc.id, "lock").delete({
856
+ accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
857
+ })
858
+ )
859
+ .pipe(
860
+ Effect.tap(annotateItem),
861
+ Effect.asVoid,
862
+ Effect.catchIf(isNotFound, () => Effect.void),
863
+ Effect.catchIf(isPreconditionFailed, () => Effect.void)
864
+ )
865
+
773
866
  const createLock = (address: string, shardId: string, now: number) =>
774
867
  Effect
775
868
  .tryPromise(() =>
@@ -843,28 +936,37 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
843
936
  ),
844
937
 
845
938
  unregister: (address) =>
846
- Effect.tryPromise(() => container.item(runnerDocId(address), "runner").delete()).pipe(
847
- Effect.tap(annotateItem),
848
- Effect.catchIf(isNotFound, () => Effect.void),
939
+ Effect.sync(() => Date.now()).pipe(
940
+ Effect.flatMap((now) =>
941
+ queryRunners(
942
+ "SELECT * FROM c WHERE c.type = 'runner' AND (c.address = @address OR c.lastHeartbeat < @expiresAt)",
943
+ [
944
+ { name: "@address", value: address },
945
+ { name: "@expiresAt", value: now - expires }
946
+ ]
947
+ )
948
+ ),
949
+ Effect.flatMap((docs) => Effect.forEach(docs, deleteRunner, { discard: true })),
849
950
  annotate("unregister"),
850
951
  refailPersistence,
851
952
  withTracerDisabled
852
953
  ),
853
954
 
854
955
  setRunnerHealth: (address, healthy) =>
855
- Effect.tryPromise(() => container.item(runnerDocId(address), "runner").read<RunnerDoc>()).pipe(
856
- Effect.flatMap((resp) => {
857
- const doc = resp.resource
858
- if (!doc) return Effect.void
859
- doc.healthy = healthy
860
- return Effect.tryPromise(() => container.item(doc.id, "runner").replace(doc)).pipe(Effect.tap(annotateItem))
861
- }),
862
- Effect.asVoid,
863
- Effect.catchIf(isNotFound, () => Effect.void),
864
- annotate("setRunnerHealth"),
865
- refailPersistence,
866
- withTracerDisabled
867
- ),
956
+ Effect
957
+ .tryPromise(() =>
958
+ container.item(runnerDocId(address), "runner").patch<RunnerDoc>([
959
+ { op: "set", path: "/healthy", value: healthy }
960
+ ])
961
+ )
962
+ .pipe(
963
+ Effect.tap(annotateItem),
964
+ Effect.asVoid,
965
+ Effect.catchIf(isNotFound, () => Effect.void),
966
+ annotate("setRunnerHealth"),
967
+ refailPersistence,
968
+ withTracerDisabled
969
+ ),
868
970
 
869
971
  acquire: (address, shardIds) =>
870
972
  Effect.sync(() => Date.now()).pipe(
@@ -879,17 +981,17 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
879
981
  Effect
880
982
  .gen(function*() {
881
983
  const now = Date.now()
882
- yield* Effect.tryPromise(() => container.item(runnerDocId(address), "runner").read<RunnerDoc>()).pipe(
883
- Effect.flatMap((resp) => {
884
- const doc = resp.resource
885
- if (!doc) return Effect.void
886
- doc.lastHeartbeat = now
887
- return Effect.tryPromise(() => container.item(doc.id, "runner").replace(doc)).pipe(
888
- Effect.tap(annotateItem)
889
- )
890
- }),
891
- Effect.catchIf(isNotFound, () => Effect.void)
892
- )
984
+ yield* Effect
985
+ .tryPromise(() =>
986
+ container.item(runnerDocId(address), "runner").patch<RunnerDoc>([
987
+ { op: "set", path: "/lastHeartbeat", value: now }
988
+ ])
989
+ )
990
+ .pipe(
991
+ Effect.tap(annotateItem),
992
+ Effect.asVoid,
993
+ Effect.catchIf(isNotFound, () => Effect.void)
994
+ )
893
995
  const refreshed = yield* Effect.forEach(shardIds, (shardId) =>
894
996
  readLock(shardId).pipe(
895
997
  Effect.flatMap((lock) =>
@@ -914,11 +1016,7 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
914
1016
  onNone: () => Effect.void,
915
1017
  onSome: (doc) =>
916
1018
  doc.address === address
917
- ? Effect.tryPromise(() => container.item(doc.id, "lock").delete()).pipe(
918
- Effect.tap(annotateItem),
919
- Effect.catchIf(isNotFound, () => Effect.void),
920
- Effect.asVoid
921
- )
1019
+ ? deleteLock(doc)
922
1020
  : Effect.void
923
1021
  })
924
1022
  ),
@@ -940,13 +1038,7 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
940
1038
  )
941
1039
  .pipe(
942
1040
  Effect.tap(annotateFeed),
943
- Effect.flatMap((resp) =>
944
- Effect.forEach(resp.resources, (doc) =>
945
- Effect.tryPromise(() => container.item(doc.id, "lock").delete()).pipe(
946
- Effect.tap(annotateItem),
947
- Effect.catchIf(isNotFound, () => Effect.void)
948
- ), { discard: true })
949
- ),
1041
+ Effect.flatMap((resp) => Effect.forEach(resp.resources, deleteLock, { discard: true })),
950
1042
  annotate("releaseAll"),
951
1043
  refailPersistence,
952
1044
  withTracerDisabled
@@ -11,6 +11,7 @@ const cosmosUrl = process.env["COSMOS_TEST_URL"]
11
11
  const cosmosDb = process.env["COSMOS_TEST_DB"] ?? "cluster-test"
12
12
  const testRunId = `${Date.now()}-${process.pid}-${Math.random().toString(16).slice(2)}`
13
13
  const runnerPortBase = 10000 + Date.now() % 40000
14
+ const liveSnowflake = Layer.effect(Snowflake.Generator, TestClock.withLive(Snowflake.makeGenerator))
14
15
 
15
16
  const layerFor = () =>
16
17
  layerCosmos({
@@ -19,7 +20,7 @@ const layerFor = () =>
19
20
  prefix: "test-cluster-"
20
21
  })
21
22
  .pipe(
22
- Layer.provideMerge(Snowflake.layerGenerator),
23
+ Layer.provideMerge(liveSnowflake),
23
24
  Layer.provide(ShardingConfig.layerDefaults)
24
25
  )
25
26