@effect/cluster 0.50.6 → 0.52.0

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.
Files changed (232) hide show
  1. package/RunnerStorage/package.json +6 -0
  2. package/SqlRunnerStorage/package.json +6 -0
  3. package/dist/cjs/ClusterError.js +2 -24
  4. package/dist/cjs/ClusterError.js.map +1 -1
  5. package/dist/cjs/ClusterMetrics.js +13 -15
  6. package/dist/cjs/ClusterMetrics.js.map +1 -1
  7. package/dist/cjs/ClusterSchema.js +17 -2
  8. package/dist/cjs/ClusterSchema.js.map +1 -1
  9. package/dist/cjs/ClusterWorkflowEngine.js +50 -83
  10. package/dist/cjs/ClusterWorkflowEngine.js.map +1 -1
  11. package/dist/cjs/Entity.js +1 -13
  12. package/dist/cjs/Entity.js.map +1 -1
  13. package/dist/cjs/EntityAddress.js +9 -1
  14. package/dist/cjs/EntityAddress.js.map +1 -1
  15. package/dist/cjs/EntityId.js +7 -1
  16. package/dist/cjs/EntityId.js.map +1 -1
  17. package/dist/cjs/EntityProxy.js +1 -1
  18. package/dist/cjs/EntityProxy.js.map +1 -1
  19. package/dist/cjs/HttpRunner.js +69 -43
  20. package/dist/cjs/HttpRunner.js.map +1 -1
  21. package/dist/cjs/MessageStorage.js +64 -16
  22. package/dist/cjs/MessageStorage.js.map +1 -1
  23. package/dist/cjs/Runner.js +3 -3
  24. package/dist/cjs/Runner.js.map +1 -1
  25. package/dist/cjs/RunnerAddress.js +7 -0
  26. package/dist/cjs/RunnerAddress.js.map +1 -1
  27. package/dist/cjs/RunnerHealth.js +91 -32
  28. package/dist/cjs/RunnerHealth.js.map +1 -1
  29. package/dist/cjs/RunnerServer.js +38 -24
  30. package/dist/cjs/RunnerServer.js.map +1 -1
  31. package/dist/cjs/RunnerStorage.js +100 -0
  32. package/dist/cjs/RunnerStorage.js.map +1 -0
  33. package/dist/cjs/Runners.js +18 -22
  34. package/dist/cjs/Runners.js.map +1 -1
  35. package/dist/cjs/ShardId.js +17 -7
  36. package/dist/cjs/ShardId.js.map +1 -1
  37. package/dist/cjs/Sharding.js +444 -320
  38. package/dist/cjs/Sharding.js.map +1 -1
  39. package/dist/cjs/ShardingConfig.js +10 -14
  40. package/dist/cjs/ShardingConfig.js.map +1 -1
  41. package/dist/cjs/Snowflake.js +1 -1
  42. package/dist/cjs/SocketRunner.js +1 -1
  43. package/dist/cjs/SocketRunner.js.map +1 -1
  44. package/dist/cjs/SqlMessageStorage.js +22 -28
  45. package/dist/cjs/SqlMessageStorage.js.map +1 -1
  46. package/dist/cjs/SqlRunnerStorage.js +375 -0
  47. package/dist/cjs/SqlRunnerStorage.js.map +1 -0
  48. package/dist/cjs/index.js +5 -15
  49. package/dist/cjs/internal/entityManager.js +42 -23
  50. package/dist/cjs/internal/entityManager.js.map +1 -1
  51. package/dist/dts/ClusterError.d.ts +0 -22
  52. package/dist/dts/ClusterError.d.ts.map +1 -1
  53. package/dist/dts/ClusterMetrics.d.ts +4 -14
  54. package/dist/dts/ClusterMetrics.d.ts.map +1 -1
  55. package/dist/dts/ClusterSchema.d.ts +9 -1
  56. package/dist/dts/ClusterSchema.d.ts.map +1 -1
  57. package/dist/dts/ClusterWorkflowEngine.d.ts.map +1 -1
  58. package/dist/dts/Entity.d.ts +3 -14
  59. package/dist/dts/Entity.d.ts.map +1 -1
  60. package/dist/dts/EntityAddress.d.ts +11 -0
  61. package/dist/dts/EntityAddress.d.ts.map +1 -1
  62. package/dist/dts/EntityId.d.ts +5 -0
  63. package/dist/dts/EntityId.d.ts.map +1 -1
  64. package/dist/dts/EntityProxy.d.ts +5 -6
  65. package/dist/dts/EntityProxy.d.ts.map +1 -1
  66. package/dist/dts/HttpRunner.d.ts +48 -25
  67. package/dist/dts/HttpRunner.d.ts.map +1 -1
  68. package/dist/dts/MessageStorage.d.ts +13 -5
  69. package/dist/dts/MessageStorage.d.ts.map +1 -1
  70. package/dist/dts/Runner.d.ts +4 -4
  71. package/dist/dts/Runner.d.ts.map +1 -1
  72. package/dist/dts/RunnerAddress.d.ts +5 -0
  73. package/dist/dts/RunnerAddress.d.ts.map +1 -1
  74. package/dist/dts/RunnerHealth.d.ts +24 -16
  75. package/dist/dts/RunnerHealth.d.ts.map +1 -1
  76. package/dist/dts/RunnerServer.d.ts +5 -4
  77. package/dist/dts/RunnerServer.d.ts.map +1 -1
  78. package/dist/dts/{ShardStorage.d.ts → RunnerStorage.d.ts} +41 -54
  79. package/dist/dts/RunnerStorage.d.ts.map +1 -0
  80. package/dist/dts/Runners.d.ts +15 -11
  81. package/dist/dts/Runners.d.ts.map +1 -1
  82. package/dist/dts/ShardId.d.ts +1 -1
  83. package/dist/dts/ShardId.d.ts.map +1 -1
  84. package/dist/dts/Sharding.d.ts +20 -10
  85. package/dist/dts/Sharding.d.ts.map +1 -1
  86. package/dist/dts/ShardingConfig.d.ts +40 -14
  87. package/dist/dts/ShardingConfig.d.ts.map +1 -1
  88. package/dist/dts/SocketRunner.d.ts +4 -3
  89. package/dist/dts/SocketRunner.d.ts.map +1 -1
  90. package/dist/dts/SqlMessageStorage.d.ts +2 -3
  91. package/dist/dts/SqlMessageStorage.d.ts.map +1 -1
  92. package/dist/dts/SqlRunnerStorage.d.ts +40 -0
  93. package/dist/dts/SqlRunnerStorage.d.ts.map +1 -0
  94. package/dist/dts/index.d.ts +4 -24
  95. package/dist/dts/index.d.ts.map +1 -1
  96. package/dist/esm/ClusterError.js +0 -21
  97. package/dist/esm/ClusterError.js.map +1 -1
  98. package/dist/esm/ClusterMetrics.js +12 -14
  99. package/dist/esm/ClusterMetrics.js.map +1 -1
  100. package/dist/esm/ClusterSchema.js +17 -2
  101. package/dist/esm/ClusterSchema.js.map +1 -1
  102. package/dist/esm/ClusterWorkflowEngine.js +50 -83
  103. package/dist/esm/ClusterWorkflowEngine.js.map +1 -1
  104. package/dist/esm/Entity.js +0 -12
  105. package/dist/esm/Entity.js.map +1 -1
  106. package/dist/esm/EntityAddress.js +7 -0
  107. package/dist/esm/EntityAddress.js.map +1 -1
  108. package/dist/esm/EntityId.js +5 -0
  109. package/dist/esm/EntityId.js.map +1 -1
  110. package/dist/esm/EntityProxy.js +2 -2
  111. package/dist/esm/EntityProxy.js.map +1 -1
  112. package/dist/esm/HttpRunner.js +62 -39
  113. package/dist/esm/HttpRunner.js.map +1 -1
  114. package/dist/esm/MessageStorage.js +65 -17
  115. package/dist/esm/MessageStorage.js.map +1 -1
  116. package/dist/esm/Runner.js +3 -3
  117. package/dist/esm/Runner.js.map +1 -1
  118. package/dist/esm/RunnerAddress.js +7 -0
  119. package/dist/esm/RunnerAddress.js.map +1 -1
  120. package/dist/esm/RunnerHealth.js +88 -30
  121. package/dist/esm/RunnerHealth.js.map +1 -1
  122. package/dist/esm/RunnerServer.js +38 -24
  123. package/dist/esm/RunnerServer.js.map +1 -1
  124. package/dist/esm/RunnerStorage.js +90 -0
  125. package/dist/esm/RunnerStorage.js.map +1 -0
  126. package/dist/esm/Runners.js +19 -23
  127. package/dist/esm/Runners.js.map +1 -1
  128. package/dist/esm/ShardId.js +16 -6
  129. package/dist/esm/ShardId.js.map +1 -1
  130. package/dist/esm/Sharding.js +447 -323
  131. package/dist/esm/Sharding.js.map +1 -1
  132. package/dist/esm/ShardingConfig.js +10 -14
  133. package/dist/esm/ShardingConfig.js.map +1 -1
  134. package/dist/esm/Snowflake.js +1 -1
  135. package/dist/esm/SocketRunner.js +1 -1
  136. package/dist/esm/SocketRunner.js.map +1 -1
  137. package/dist/esm/SqlMessageStorage.js +22 -28
  138. package/dist/esm/SqlMessageStorage.js.map +1 -1
  139. package/dist/esm/SqlRunnerStorage.js +366 -0
  140. package/dist/esm/SqlRunnerStorage.js.map +1 -0
  141. package/dist/esm/index.js +4 -24
  142. package/dist/esm/index.js.map +1 -1
  143. package/dist/esm/internal/entityManager.js +41 -22
  144. package/dist/esm/internal/entityManager.js.map +1 -1
  145. package/package.json +20 -60
  146. package/src/ClusterError.ts +0 -24
  147. package/src/ClusterMetrics.ts +12 -16
  148. package/src/ClusterSchema.ts +17 -2
  149. package/src/ClusterWorkflowEngine.ts +48 -80
  150. package/src/Entity.ts +3 -21
  151. package/src/EntityAddress.ts +10 -0
  152. package/src/EntityId.ts +6 -0
  153. package/src/EntityProxy.ts +10 -10
  154. package/src/HttpRunner.ts +132 -67
  155. package/src/MessageStorage.ts +89 -24
  156. package/src/Runner.ts +4 -4
  157. package/src/RunnerAddress.ts +8 -0
  158. package/src/RunnerHealth.ts +119 -56
  159. package/src/RunnerServer.ts +64 -47
  160. package/src/RunnerStorage.ts +218 -0
  161. package/src/Runners.ts +32 -45
  162. package/src/ShardId.ts +14 -3
  163. package/src/Sharding.ts +561 -417
  164. package/src/ShardingConfig.ts +39 -31
  165. package/src/Snowflake.ts +1 -1
  166. package/src/SocketRunner.ts +6 -4
  167. package/src/SqlMessageStorage.ts +28 -30
  168. package/src/SqlRunnerStorage.ts +537 -0
  169. package/src/index.ts +4 -29
  170. package/src/internal/entityManager.ts +45 -29
  171. package/HttpCommon/package.json +0 -6
  172. package/HttpShardManager/package.json +0 -6
  173. package/ShardManager/package.json +0 -6
  174. package/ShardStorage/package.json +0 -6
  175. package/SocketShardManager/package.json +0 -6
  176. package/SqlShardStorage/package.json +0 -6
  177. package/SynchronizedClock/package.json +0 -6
  178. package/dist/cjs/HttpCommon.js +0 -48
  179. package/dist/cjs/HttpCommon.js.map +0 -1
  180. package/dist/cjs/HttpShardManager.js +0 -139
  181. package/dist/cjs/HttpShardManager.js.map +0 -1
  182. package/dist/cjs/ShardManager.js +0 -549
  183. package/dist/cjs/ShardManager.js.map +0 -1
  184. package/dist/cjs/ShardStorage.js +0 -151
  185. package/dist/cjs/ShardStorage.js.map +0 -1
  186. package/dist/cjs/SocketShardManager.js +0 -32
  187. package/dist/cjs/SocketShardManager.js.map +0 -1
  188. package/dist/cjs/SqlShardStorage.js +0 -253
  189. package/dist/cjs/SqlShardStorage.js.map +0 -1
  190. package/dist/cjs/SynchronizedClock.js +0 -65
  191. package/dist/cjs/SynchronizedClock.js.map +0 -1
  192. package/dist/cjs/internal/shardManager.js +0 -353
  193. package/dist/cjs/internal/shardManager.js.map +0 -1
  194. package/dist/dts/HttpCommon.d.ts +0 -25
  195. package/dist/dts/HttpCommon.d.ts.map +0 -1
  196. package/dist/dts/HttpShardManager.d.ts +0 -119
  197. package/dist/dts/HttpShardManager.d.ts.map +0 -1
  198. package/dist/dts/ShardManager.d.ts +0 -459
  199. package/dist/dts/ShardManager.d.ts.map +0 -1
  200. package/dist/dts/ShardStorage.d.ts.map +0 -1
  201. package/dist/dts/SocketShardManager.d.ts +0 -17
  202. package/dist/dts/SocketShardManager.d.ts.map +0 -1
  203. package/dist/dts/SqlShardStorage.d.ts +0 -38
  204. package/dist/dts/SqlShardStorage.d.ts.map +0 -1
  205. package/dist/dts/SynchronizedClock.d.ts +0 -19
  206. package/dist/dts/SynchronizedClock.d.ts.map +0 -1
  207. package/dist/dts/internal/shardManager.d.ts +0 -2
  208. package/dist/dts/internal/shardManager.d.ts.map +0 -1
  209. package/dist/esm/HttpCommon.js +0 -38
  210. package/dist/esm/HttpCommon.js.map +0 -1
  211. package/dist/esm/HttpShardManager.js +0 -128
  212. package/dist/esm/HttpShardManager.js.map +0 -1
  213. package/dist/esm/ShardManager.js +0 -535
  214. package/dist/esm/ShardManager.js.map +0 -1
  215. package/dist/esm/ShardStorage.js +0 -141
  216. package/dist/esm/ShardStorage.js.map +0 -1
  217. package/dist/esm/SocketShardManager.js +0 -24
  218. package/dist/esm/SocketShardManager.js.map +0 -1
  219. package/dist/esm/SqlShardStorage.js +0 -244
  220. package/dist/esm/SqlShardStorage.js.map +0 -1
  221. package/dist/esm/SynchronizedClock.js +0 -57
  222. package/dist/esm/SynchronizedClock.js.map +0 -1
  223. package/dist/esm/internal/shardManager.js +0 -342
  224. package/dist/esm/internal/shardManager.js.map +0 -1
  225. package/src/HttpCommon.ts +0 -73
  226. package/src/HttpShardManager.ts +0 -273
  227. package/src/ShardManager.ts +0 -823
  228. package/src/ShardStorage.ts +0 -297
  229. package/src/SocketShardManager.ts +0 -48
  230. package/src/SqlShardStorage.ts +0 -329
  231. package/src/SynchronizedClock.ts +0 -82
  232. package/src/internal/shardManager.ts +0 -412
@@ -34,9 +34,15 @@ export class ShardingConfig extends Context.Tag("@effect/cluster/ShardingConfig"
34
34
  */
35
35
  readonly runnerListenAddress: Option.Option<RunnerAddress>
36
36
  /**
37
- * The version of the current runner.
37
+ * A number that determines how many shards this runner will be assigned
38
+ * relative to other runners.
39
+ *
40
+ * Defaults to `1`.
41
+ *
42
+ * A value of `2` means that this runner should be assigned twice as many
43
+ * shards as a runner with a weight of `1`.
38
44
  */
39
- readonly serverVersion: number
45
+ readonly runnerShardWeight: number
40
46
  /**
41
47
  * The shard groups that are assigned to this runner.
42
48
  *
@@ -50,14 +56,13 @@ export class ShardingConfig extends Context.Tag("@effect/cluster/ShardingConfig"
50
56
  */
51
57
  readonly shardsPerGroup: number
52
58
  /**
53
- * The address of the shard manager.
59
+ * Shard lock refresh interval.
54
60
  */
55
- readonly shardManagerAddress: RunnerAddress
61
+ readonly shardLockRefreshInterval: DurationInput
56
62
  /**
57
- * If the shard manager is unavailable for this duration, all the shard
58
- * assignments will be reset.
63
+ * Shard lock expiration duration.
59
64
  */
60
- readonly shardManagerUnavailableTimeout: DurationInput
65
+ readonly shardLockExpiration: DurationInput
61
66
  /**
62
67
  * The default capacity of the mailbox for entities.
63
68
  */
@@ -81,12 +86,19 @@ export class ShardingConfig extends Context.Tag("@effect/cluster/ShardingConfig"
81
86
  * The interval at which to poll for client replies from storage.
82
87
  */
83
88
  readonly entityReplyPollInterval: DurationInput
89
+ /**
90
+ * The interval at which to poll for new runners and refresh shard
91
+ * assignments.
92
+ */
84
93
  readonly refreshAssignmentsInterval: DurationInput
85
94
  /**
86
95
  * The interval to retry a send if EntityNotAssignedToRunner is returned.
87
96
  */
88
97
  readonly sendRetryInterval: DurationInput
89
- // readonly unhealthyRunnerReportInterval: Duration.Duration
98
+ /**
99
+ * The interval at which to check for unhealthy runners and report them
100
+ */
101
+ readonly runnerHealthCheckInterval: DurationInput
90
102
  /**
91
103
  * Simulate serialization and deserialization to remote runners for local
92
104
  * entities.
@@ -103,18 +115,19 @@ const defaultRunnerAddress = RunnerAddress.make({ host: "localhost", port: 34431
103
115
  export const defaults: ShardingConfig["Type"] = {
104
116
  runnerAddress: Option.some(defaultRunnerAddress),
105
117
  runnerListenAddress: Option.none(),
106
- serverVersion: 1,
118
+ runnerShardWeight: 1,
107
119
  shardsPerGroup: 300,
108
- shardManagerAddress: RunnerAddress.make({ host: "localhost", port: 8080 }),
109
- shardManagerUnavailableTimeout: Duration.minutes(10),
110
120
  shardGroups: ["default"],
121
+ shardLockRefreshInterval: Duration.seconds(10),
122
+ shardLockExpiration: Duration.seconds(35),
111
123
  entityMailboxCapacity: 4096,
112
124
  entityMaxIdleTime: Duration.minutes(1),
113
125
  entityTerminationTimeout: Duration.seconds(15),
114
126
  entityMessagePollInterval: Duration.seconds(10),
115
127
  entityReplyPollInterval: Duration.millis(200),
116
128
  sendRetryInterval: Duration.millis(100),
117
- refreshAssignmentsInterval: Duration.minutes(5),
129
+ refreshAssignmentsInterval: Duration.seconds(3),
130
+ runnerHealthCheckInterval: Duration.minutes(1),
118
131
  simulateRemoteSerialization: true
119
132
  }
120
133
 
@@ -155,9 +168,8 @@ export const config: Config.Config<ShardingConfig["Type"]> = Config.all({
155
168
  Config.withDescription("The port to listen on.")
156
169
  )
157
170
  }).pipe(Config.map((options) => RunnerAddress.make(options)), Config.option),
158
- serverVersion: Config.integer("serverVersion").pipe(
159
- Config.withDefault(defaults.serverVersion),
160
- Config.withDescription("The version of the current runner.")
171
+ runnerShardWeight: Config.integer("runnerShardWeight").pipe(
172
+ Config.withDefault(defaults.runnerShardWeight)
161
173
  ),
162
174
  shardGroups: Config.array(Config.string("shardGroups")).pipe(
163
175
  Config.withDefault(["default"]),
@@ -167,21 +179,13 @@ export const config: Config.Config<ShardingConfig["Type"]> = Config.all({
167
179
  Config.withDefault(defaults.shardsPerGroup),
168
180
  Config.withDescription("The number of shards to allocate per shard group.")
169
181
  ),
170
- shardManagerAddress: Config.all({
171
- host: Config.string("shardManagerHost").pipe(
172
- Config.withDefault(defaults.shardManagerAddress.host),
173
- Config.withDescription("The host of the shard manager.")
174
- ),
175
- port: Config.integer("shardManagerPort").pipe(
176
- Config.withDefault(defaults.shardManagerAddress.port),
177
- Config.withDescription("The port of the shard manager.")
178
- )
179
- }).pipe(Config.map((options) => RunnerAddress.make(options))),
180
- shardManagerUnavailableTimeout: Config.duration("shardManagerUnavailableTimeout").pipe(
181
- Config.withDefault(defaults.shardManagerUnavailableTimeout),
182
- Config.withDescription(
183
- "If the shard is unavilable for this duration, all the shard assignments will be reset."
184
- )
182
+ shardLockRefreshInterval: Config.duration("shardLockRefreshInterval").pipe(
183
+ Config.withDefault(defaults.shardLockRefreshInterval),
184
+ Config.withDescription("Shard lock refresh interval.")
185
+ ),
186
+ shardLockExpiration: Config.duration("shardLockExpiration").pipe(
187
+ Config.withDefault(defaults.shardLockExpiration),
188
+ Config.withDescription("Shard lock expiration duration.")
185
189
  ),
186
190
  entityMailboxCapacity: Config.integer("entityMailboxCapacity").pipe(
187
191
  Config.withDefault(defaults.entityMailboxCapacity),
@@ -207,12 +211,16 @@ export const config: Config.Config<ShardingConfig["Type"]> = Config.all({
207
211
  ),
208
212
  sendRetryInterval: Config.duration("sendRetryInterval").pipe(
209
213
  Config.withDefault(defaults.sendRetryInterval),
210
- Config.withDescription("The interval to retry a send if EntityNotManagedByRunner is returned.")
214
+ Config.withDescription("The interval to retry a send if EntityNotAssignedToRunner is returned.")
211
215
  ),
212
216
  refreshAssignmentsInterval: Config.duration("refreshAssignmentsInterval").pipe(
213
217
  Config.withDefault(defaults.refreshAssignmentsInterval),
214
218
  Config.withDescription("The interval at which to refresh shard assignments.")
215
219
  ),
220
+ runnerHealthCheckInterval: Config.duration("runnerHealthCheckInterval").pipe(
221
+ Config.withDefault(defaults.runnerHealthCheckInterval),
222
+ Config.withDescription("The interval at which to check for unhealthy runners and report them.")
223
+ ),
216
224
  simulateRemoteSerialization: Config.boolean("simulateRemoteSerialization").pipe(
217
225
  Config.withDefault(defaults.simulateRemoteSerialization),
218
226
  Config.withDescription("Simulate serialization and deserialization to remote runners for local entities.")
package/src/Snowflake.ts CHANGED
@@ -162,7 +162,7 @@ export const makeGenerator: Effect.Effect<Snowflake.Generator> = Effect.gen(func
162
162
  // reset sequence if we're in a new millisecond
163
163
  sequence = 0
164
164
  sequenceAt = now
165
- } else if (sequence >= 1024) {
165
+ } else if (sequence >= 4096) {
166
166
  // if we've hit the max sequence for this millisecond, go to the next
167
167
  // millisecond
168
168
  sequenceAt++
@@ -7,11 +7,12 @@ import * as RpcServer from "@effect/rpc/RpcServer"
7
7
  import * as Effect from "effect/Effect"
8
8
  import * as Layer from "effect/Layer"
9
9
  import type { MessageStorage } from "./MessageStorage.js"
10
+ import type { RunnerHealth } from "./RunnerHealth.js"
10
11
  import type * as Runners from "./Runners.js"
11
12
  import * as RunnerServer from "./RunnerServer.js"
13
+ import type * as RunnerStorage from "./RunnerStorage.js"
12
14
  import type * as Sharding from "./Sharding.js"
13
15
  import type { ShardingConfig } from "./ShardingConfig.js"
14
- import type * as ShardStorage from "./ShardStorage.js"
15
16
 
16
17
  const withLogAddress = <A, E, R>(layer: Layer.Layer<A, E, R>): Layer.Layer<A, E, R | SocketServer> =>
17
18
  Layer.effectDiscard(Effect.gen(function*() {
@@ -37,10 +38,11 @@ export const layer: Layer.Layer<
37
38
  | RpcSerialization.RpcSerialization
38
39
  | SocketServer
39
40
  | MessageStorage
40
- | ShardStorage.ShardStorage
41
+ | RunnerStorage.RunnerStorage
42
+ | RunnerHealth
41
43
  > = RunnerServer.layerWithClients.pipe(
42
44
  withLogAddress,
43
- Layer.provide(Layer.fresh(RpcServer.layerProtocolSocketServer))
45
+ Layer.provide(RpcServer.layerProtocolSocketServer)
44
46
  )
45
47
 
46
48
  /**
@@ -50,5 +52,5 @@ export const layer: Layer.Layer<
50
52
  export const layerClientOnly: Layer.Layer<
51
53
  Sharding.Sharding | Runners.Runners,
52
54
  never,
53
- Runners.RpcClientProtocol | ShardingConfig | MessageStorage
55
+ Runners.RpcClientProtocol | ShardingConfig | MessageStorage | RunnerStorage.RunnerStorage
54
56
  > = RunnerServer.layerClientOnly
@@ -6,7 +6,6 @@ import * as SqlClient from "@effect/sql/SqlClient"
6
6
  import type { Row } from "@effect/sql/SqlConnection"
7
7
  import type { SqlError } from "@effect/sql/SqlError"
8
8
  import * as Arr from "effect/Array"
9
- import type { DurationInput } from "effect/Duration"
10
9
  import * as Effect from "effect/Effect"
11
10
  import * as Layer from "effect/Layer"
12
11
  import * as Option from "effect/Option"
@@ -41,6 +40,7 @@ export const make = Effect.fnUntraced(function*(options?: {
41
40
  )
42
41
 
43
42
  const messageKindAckChunk = sql.literal(String(messageKind.AckChunk))
43
+ const messageKindInterrupt = sql.literal(String(messageKind.Interrupt))
44
44
  const replyKindWithExit = sql.literal(String(replyKind.WithExit))
45
45
 
46
46
  const messagesTable = table("messages")
@@ -284,11 +284,11 @@ export const make = Effect.fnUntraced(function*(options?: {
284
284
  )
285
285
  })
286
286
 
287
- const fiveMinutesAgo = sql.onDialectOrElse({
288
- mssql: () => sql.literal(`DATEADD(MINUTE, -5, GETDATE())`),
289
- mysql: () => sql.literal(`NOW() - INTERVAL 5 MINUTE`),
290
- pg: () => sql.literal(`NOW() - INTERVAL '5 minutes'`),
291
- orElse: () => sql.literal(`DATETIME('now', '-5 minute')`)
287
+ const tenMinutesAgo = sql.onDialectOrElse({
288
+ mssql: () => sql.literal(`DATEADD(MINUTE, -10, GETDATE())`),
289
+ mysql: () => sql.literal(`NOW() - INTERVAL 10 MINUTE`),
290
+ pg: () => sql.literal(`NOW() - INTERVAL '10 minutes'`),
291
+ orElse: () => sql.literal(`DATETIME('now', '-10 minute')`)
292
292
  })
293
293
  const sqlNowString = sql.onDialectOrElse({
294
294
  pg: () => "NOW()",
@@ -318,7 +318,7 @@ export const make = Effect.fnUntraced(function*(options?: {
318
318
  AND (kind = ${replyKindWithExit} OR acked = ${sqlFalse})
319
319
  )
320
320
  AND m.processed = ${sqlFalse}
321
- AND (m.last_read IS NULL OR m.last_read < ${fiveMinutesAgo})
321
+ AND (m.last_read IS NULL OR m.last_read < ${tenMinutesAgo})
322
322
  AND (m.deliver_at IS NULL OR m.deliver_at <= ${sql.literal(String(now))})
323
323
  ORDER BY m.rowid ASC
324
324
  FOR UPDATE
@@ -339,7 +339,7 @@ export const make = Effect.fnUntraced(function*(options?: {
339
339
  AND (kind = ${replyKindWithExit} OR acked = ${sqlFalse})
340
340
  )
341
341
  AND processed = ${sqlFalse}
342
- AND (m.last_read IS NULL OR m.last_read < ${fiveMinutesAgo})
342
+ AND (m.last_read IS NULL OR m.last_read < ${tenMinutesAgo})
343
343
  AND (m.deliver_at IS NULL OR m.deliver_at <= ${sql.literal(String(now))})
344
344
  ORDER BY m.rowid ASC
345
345
  `.unprepared.pipe(
@@ -400,7 +400,8 @@ export const make = Effect.fnUntraced(function*(options?: {
400
400
  )
401
401
  }).pipe(
402
402
  Effect.provideService(SqlClient.SafeIntegers, true),
403
- PersistenceError.refail
403
+ PersistenceError.refail,
404
+ withTracerDisabled
404
405
  ),
405
406
 
406
407
  saveReply: (reply) =>
@@ -415,18 +416,23 @@ export const make = Effect.fnUntraced(function*(options?: {
415
416
  )
416
417
  }).pipe(
417
418
  Effect.asVoid,
418
- PersistenceError.refail
419
+ PersistenceError.refail,
420
+ withTracerDisabled
419
421
  ),
420
422
 
421
423
  clearReplies: Effect.fnUntraced(
422
424
  function*(requestId) {
423
- yield* sql`DELETE FROM ${repliesTableSql} WHERE request_id = ${String(requestId)}`
425
+ yield* sql`DELETE FROM ${repliesTableSql} WHERE request_id = ${String(requestId)} AND kind = 0`
426
+ yield* sql`DELETE FROM ${messagesTableSql} WHERE request_id = ${
427
+ String(requestId)
428
+ } AND kind = ${messageKindInterrupt}`
424
429
  yield* sql`UPDATE ${messagesTableSql} SET processed = ${sqlFalse}, last_reply_id = NULL, last_read = NULL WHERE request_id = ${
425
430
  String(requestId)
426
431
  }`
427
432
  },
428
433
  sql.withTransaction,
429
- PersistenceError.refail
434
+ PersistenceError.refail,
435
+ withTracerDisabled
430
436
  ),
431
437
 
432
438
  requestIdForPrimaryKey: (primaryKey) =>
@@ -437,7 +443,8 @@ export const make = Effect.fnUntraced(function*(options?: {
437
443
  )
438
444
  ),
439
445
  Effect.provideService(SqlClient.SafeIntegers, true),
440
- PersistenceError.refail
446
+ PersistenceError.refail,
447
+ withTracerDisabled
441
448
  ),
442
449
 
443
450
  repliesFor: (requestIds) =>
@@ -590,7 +597,6 @@ export const layer: Layer.Layer<
590
597
  */
591
598
  export const layerWith = (options: {
592
599
  readonly prefix?: string | undefined
593
- readonly replyPollInterval?: DurationInput | undefined
594
600
  }): Layer.Layer<MessageStorage.MessageStorage, never, SqlClient.SqlClient | ShardingConfig> =>
595
601
  Layer.scoped(MessageStorage.MessageStorage, make(options)).pipe(
596
602
  Layer.provide(Snowflake.layerGenerator)
@@ -638,8 +644,7 @@ const migrations = (options?: {
638
644
  last_reply_id BIGINT,
639
645
  last_read DATETIME,
640
646
  deliver_at BIGINT,
641
- UNIQUE (message_id),
642
- FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
647
+ UNIQUE (message_id)
643
648
  )
644
649
  `,
645
650
  mysql: () =>
@@ -665,8 +670,7 @@ const migrations = (options?: {
665
670
  last_read DATETIME,
666
671
  deliver_at BIGINT,
667
672
  UNIQUE (id),
668
- UNIQUE (message_id),
669
- FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
673
+ UNIQUE (message_id)
670
674
  )
671
675
  `,
672
676
  pg: () =>
@@ -691,8 +695,7 @@ const migrations = (options?: {
691
695
  last_reply_id BIGINT,
692
696
  last_read TIMESTAMP,
693
697
  deliver_at BIGINT,
694
- UNIQUE (message_id),
695
- FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
698
+ UNIQUE (message_id)
696
699
  )
697
700
  `.pipe(Effect.ignore),
698
701
  orElse: () =>
@@ -717,8 +720,7 @@ const migrations = (options?: {
717
720
  last_reply_id INTEGER,
718
721
  last_read TEXT,
719
722
  deliver_at INTEGER,
720
- UNIQUE (message_id),
721
- FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
723
+ UNIQUE (message_id)
722
724
  )
723
725
  `
724
726
  })
@@ -790,8 +792,7 @@ const migrations = (options?: {
790
792
  sequence INT,
791
793
  acked BIT NOT NULL DEFAULT 0,
792
794
  CONSTRAINT ${sql(repliesTable + "_one_exit")} UNIQUE (request_id, kind),
793
- CONSTRAINT ${sql(repliesTable + "_sequence")} UNIQUE (request_id, sequence),
794
- FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
795
+ CONSTRAINT ${sql(repliesTable + "_sequence")} UNIQUE (request_id, sequence)
795
796
  )
796
797
  `,
797
798
  mysql: () =>
@@ -806,8 +807,7 @@ const migrations = (options?: {
806
807
  acked BOOLEAN NOT NULL DEFAULT FALSE,
807
808
  UNIQUE (id),
808
809
  UNIQUE (request_id, kind),
809
- UNIQUE (request_id, sequence),
810
- FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
810
+ UNIQUE (request_id, sequence)
811
811
  )
812
812
  `,
813
813
  pg: () =>
@@ -821,8 +821,7 @@ const migrations = (options?: {
821
821
  sequence INT,
822
822
  acked BOOLEAN NOT NULL DEFAULT FALSE,
823
823
  UNIQUE (request_id, kind),
824
- UNIQUE (request_id, sequence),
825
- FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
824
+ UNIQUE (request_id, sequence)
826
825
  )
827
826
  `,
828
827
  orElse: () =>
@@ -836,8 +835,7 @@ const migrations = (options?: {
836
835
  sequence INTEGER,
837
836
  acked BOOLEAN NOT NULL DEFAULT FALSE,
838
837
  UNIQUE (request_id, kind),
839
- UNIQUE (request_id, sequence),
840
- FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
838
+ UNIQUE (request_id, sequence)
841
839
  )
842
840
  `
843
841
  })