@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.
- package/RunnerStorage/package.json +6 -0
- package/SqlRunnerStorage/package.json +6 -0
- package/dist/cjs/ClusterError.js +2 -24
- package/dist/cjs/ClusterError.js.map +1 -1
- package/dist/cjs/ClusterMetrics.js +13 -15
- package/dist/cjs/ClusterMetrics.js.map +1 -1
- package/dist/cjs/ClusterSchema.js +17 -2
- package/dist/cjs/ClusterSchema.js.map +1 -1
- package/dist/cjs/ClusterWorkflowEngine.js +50 -83
- package/dist/cjs/ClusterWorkflowEngine.js.map +1 -1
- package/dist/cjs/Entity.js +1 -13
- package/dist/cjs/Entity.js.map +1 -1
- package/dist/cjs/EntityAddress.js +9 -1
- package/dist/cjs/EntityAddress.js.map +1 -1
- package/dist/cjs/EntityId.js +7 -1
- package/dist/cjs/EntityId.js.map +1 -1
- package/dist/cjs/EntityProxy.js +1 -1
- package/dist/cjs/EntityProxy.js.map +1 -1
- package/dist/cjs/HttpRunner.js +69 -43
- package/dist/cjs/HttpRunner.js.map +1 -1
- package/dist/cjs/MessageStorage.js +64 -16
- package/dist/cjs/MessageStorage.js.map +1 -1
- package/dist/cjs/Runner.js +3 -3
- package/dist/cjs/Runner.js.map +1 -1
- package/dist/cjs/RunnerAddress.js +7 -0
- package/dist/cjs/RunnerAddress.js.map +1 -1
- package/dist/cjs/RunnerHealth.js +91 -32
- package/dist/cjs/RunnerHealth.js.map +1 -1
- package/dist/cjs/RunnerServer.js +38 -24
- package/dist/cjs/RunnerServer.js.map +1 -1
- package/dist/cjs/RunnerStorage.js +100 -0
- package/dist/cjs/RunnerStorage.js.map +1 -0
- package/dist/cjs/Runners.js +18 -22
- package/dist/cjs/Runners.js.map +1 -1
- package/dist/cjs/ShardId.js +17 -7
- package/dist/cjs/ShardId.js.map +1 -1
- package/dist/cjs/Sharding.js +444 -320
- package/dist/cjs/Sharding.js.map +1 -1
- package/dist/cjs/ShardingConfig.js +10 -14
- package/dist/cjs/ShardingConfig.js.map +1 -1
- package/dist/cjs/Snowflake.js +1 -1
- package/dist/cjs/SocketRunner.js +1 -1
- package/dist/cjs/SocketRunner.js.map +1 -1
- package/dist/cjs/SqlMessageStorage.js +22 -28
- package/dist/cjs/SqlMessageStorage.js.map +1 -1
- package/dist/cjs/SqlRunnerStorage.js +375 -0
- package/dist/cjs/SqlRunnerStorage.js.map +1 -0
- package/dist/cjs/index.js +5 -15
- package/dist/cjs/internal/entityManager.js +42 -23
- package/dist/cjs/internal/entityManager.js.map +1 -1
- package/dist/dts/ClusterError.d.ts +0 -22
- package/dist/dts/ClusterError.d.ts.map +1 -1
- package/dist/dts/ClusterMetrics.d.ts +4 -14
- package/dist/dts/ClusterMetrics.d.ts.map +1 -1
- package/dist/dts/ClusterSchema.d.ts +9 -1
- package/dist/dts/ClusterSchema.d.ts.map +1 -1
- package/dist/dts/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/dts/Entity.d.ts +3 -14
- package/dist/dts/Entity.d.ts.map +1 -1
- package/dist/dts/EntityAddress.d.ts +11 -0
- package/dist/dts/EntityAddress.d.ts.map +1 -1
- package/dist/dts/EntityId.d.ts +5 -0
- package/dist/dts/EntityId.d.ts.map +1 -1
- package/dist/dts/EntityProxy.d.ts +5 -6
- package/dist/dts/EntityProxy.d.ts.map +1 -1
- package/dist/dts/HttpRunner.d.ts +48 -25
- package/dist/dts/HttpRunner.d.ts.map +1 -1
- package/dist/dts/MessageStorage.d.ts +13 -5
- package/dist/dts/MessageStorage.d.ts.map +1 -1
- package/dist/dts/Runner.d.ts +4 -4
- package/dist/dts/Runner.d.ts.map +1 -1
- package/dist/dts/RunnerAddress.d.ts +5 -0
- package/dist/dts/RunnerAddress.d.ts.map +1 -1
- package/dist/dts/RunnerHealth.d.ts +24 -16
- package/dist/dts/RunnerHealth.d.ts.map +1 -1
- package/dist/dts/RunnerServer.d.ts +5 -4
- package/dist/dts/RunnerServer.d.ts.map +1 -1
- package/dist/dts/{ShardStorage.d.ts → RunnerStorage.d.ts} +41 -54
- package/dist/dts/RunnerStorage.d.ts.map +1 -0
- package/dist/dts/Runners.d.ts +15 -11
- package/dist/dts/Runners.d.ts.map +1 -1
- package/dist/dts/ShardId.d.ts +1 -1
- package/dist/dts/ShardId.d.ts.map +1 -1
- package/dist/dts/Sharding.d.ts +20 -10
- package/dist/dts/Sharding.d.ts.map +1 -1
- package/dist/dts/ShardingConfig.d.ts +40 -14
- package/dist/dts/ShardingConfig.d.ts.map +1 -1
- package/dist/dts/SocketRunner.d.ts +4 -3
- package/dist/dts/SocketRunner.d.ts.map +1 -1
- package/dist/dts/SqlMessageStorage.d.ts +2 -3
- package/dist/dts/SqlMessageStorage.d.ts.map +1 -1
- package/dist/dts/SqlRunnerStorage.d.ts +40 -0
- package/dist/dts/SqlRunnerStorage.d.ts.map +1 -0
- package/dist/dts/index.d.ts +4 -24
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/esm/ClusterError.js +0 -21
- package/dist/esm/ClusterError.js.map +1 -1
- package/dist/esm/ClusterMetrics.js +12 -14
- package/dist/esm/ClusterMetrics.js.map +1 -1
- package/dist/esm/ClusterSchema.js +17 -2
- package/dist/esm/ClusterSchema.js.map +1 -1
- package/dist/esm/ClusterWorkflowEngine.js +50 -83
- package/dist/esm/ClusterWorkflowEngine.js.map +1 -1
- package/dist/esm/Entity.js +0 -12
- package/dist/esm/Entity.js.map +1 -1
- package/dist/esm/EntityAddress.js +7 -0
- package/dist/esm/EntityAddress.js.map +1 -1
- package/dist/esm/EntityId.js +5 -0
- package/dist/esm/EntityId.js.map +1 -1
- package/dist/esm/EntityProxy.js +2 -2
- package/dist/esm/EntityProxy.js.map +1 -1
- package/dist/esm/HttpRunner.js +62 -39
- package/dist/esm/HttpRunner.js.map +1 -1
- package/dist/esm/MessageStorage.js +65 -17
- package/dist/esm/MessageStorage.js.map +1 -1
- package/dist/esm/Runner.js +3 -3
- package/dist/esm/Runner.js.map +1 -1
- package/dist/esm/RunnerAddress.js +7 -0
- package/dist/esm/RunnerAddress.js.map +1 -1
- package/dist/esm/RunnerHealth.js +88 -30
- package/dist/esm/RunnerHealth.js.map +1 -1
- package/dist/esm/RunnerServer.js +38 -24
- package/dist/esm/RunnerServer.js.map +1 -1
- package/dist/esm/RunnerStorage.js +90 -0
- package/dist/esm/RunnerStorage.js.map +1 -0
- package/dist/esm/Runners.js +19 -23
- package/dist/esm/Runners.js.map +1 -1
- package/dist/esm/ShardId.js +16 -6
- package/dist/esm/ShardId.js.map +1 -1
- package/dist/esm/Sharding.js +447 -323
- package/dist/esm/Sharding.js.map +1 -1
- package/dist/esm/ShardingConfig.js +10 -14
- package/dist/esm/ShardingConfig.js.map +1 -1
- package/dist/esm/Snowflake.js +1 -1
- package/dist/esm/SocketRunner.js +1 -1
- package/dist/esm/SocketRunner.js.map +1 -1
- package/dist/esm/SqlMessageStorage.js +22 -28
- package/dist/esm/SqlMessageStorage.js.map +1 -1
- package/dist/esm/SqlRunnerStorage.js +366 -0
- package/dist/esm/SqlRunnerStorage.js.map +1 -0
- package/dist/esm/index.js +4 -24
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/entityManager.js +41 -22
- package/dist/esm/internal/entityManager.js.map +1 -1
- package/package.json +20 -60
- package/src/ClusterError.ts +0 -24
- package/src/ClusterMetrics.ts +12 -16
- package/src/ClusterSchema.ts +17 -2
- package/src/ClusterWorkflowEngine.ts +48 -80
- package/src/Entity.ts +3 -21
- package/src/EntityAddress.ts +10 -0
- package/src/EntityId.ts +6 -0
- package/src/EntityProxy.ts +10 -10
- package/src/HttpRunner.ts +132 -67
- package/src/MessageStorage.ts +89 -24
- package/src/Runner.ts +4 -4
- package/src/RunnerAddress.ts +8 -0
- package/src/RunnerHealth.ts +119 -56
- package/src/RunnerServer.ts +64 -47
- package/src/RunnerStorage.ts +218 -0
- package/src/Runners.ts +32 -45
- package/src/ShardId.ts +14 -3
- package/src/Sharding.ts +561 -417
- package/src/ShardingConfig.ts +39 -31
- package/src/Snowflake.ts +1 -1
- package/src/SocketRunner.ts +6 -4
- package/src/SqlMessageStorage.ts +28 -30
- package/src/SqlRunnerStorage.ts +537 -0
- package/src/index.ts +4 -29
- package/src/internal/entityManager.ts +45 -29
- package/HttpCommon/package.json +0 -6
- package/HttpShardManager/package.json +0 -6
- package/ShardManager/package.json +0 -6
- package/ShardStorage/package.json +0 -6
- package/SocketShardManager/package.json +0 -6
- package/SqlShardStorage/package.json +0 -6
- package/SynchronizedClock/package.json +0 -6
- package/dist/cjs/HttpCommon.js +0 -48
- package/dist/cjs/HttpCommon.js.map +0 -1
- package/dist/cjs/HttpShardManager.js +0 -139
- package/dist/cjs/HttpShardManager.js.map +0 -1
- package/dist/cjs/ShardManager.js +0 -549
- package/dist/cjs/ShardManager.js.map +0 -1
- package/dist/cjs/ShardStorage.js +0 -151
- package/dist/cjs/ShardStorage.js.map +0 -1
- package/dist/cjs/SocketShardManager.js +0 -32
- package/dist/cjs/SocketShardManager.js.map +0 -1
- package/dist/cjs/SqlShardStorage.js +0 -253
- package/dist/cjs/SqlShardStorage.js.map +0 -1
- package/dist/cjs/SynchronizedClock.js +0 -65
- package/dist/cjs/SynchronizedClock.js.map +0 -1
- package/dist/cjs/internal/shardManager.js +0 -353
- package/dist/cjs/internal/shardManager.js.map +0 -1
- package/dist/dts/HttpCommon.d.ts +0 -25
- package/dist/dts/HttpCommon.d.ts.map +0 -1
- package/dist/dts/HttpShardManager.d.ts +0 -119
- package/dist/dts/HttpShardManager.d.ts.map +0 -1
- package/dist/dts/ShardManager.d.ts +0 -459
- package/dist/dts/ShardManager.d.ts.map +0 -1
- package/dist/dts/ShardStorage.d.ts.map +0 -1
- package/dist/dts/SocketShardManager.d.ts +0 -17
- package/dist/dts/SocketShardManager.d.ts.map +0 -1
- package/dist/dts/SqlShardStorage.d.ts +0 -38
- package/dist/dts/SqlShardStorage.d.ts.map +0 -1
- package/dist/dts/SynchronizedClock.d.ts +0 -19
- package/dist/dts/SynchronizedClock.d.ts.map +0 -1
- package/dist/dts/internal/shardManager.d.ts +0 -2
- package/dist/dts/internal/shardManager.d.ts.map +0 -1
- package/dist/esm/HttpCommon.js +0 -38
- package/dist/esm/HttpCommon.js.map +0 -1
- package/dist/esm/HttpShardManager.js +0 -128
- package/dist/esm/HttpShardManager.js.map +0 -1
- package/dist/esm/ShardManager.js +0 -535
- package/dist/esm/ShardManager.js.map +0 -1
- package/dist/esm/ShardStorage.js +0 -141
- package/dist/esm/ShardStorage.js.map +0 -1
- package/dist/esm/SocketShardManager.js +0 -24
- package/dist/esm/SocketShardManager.js.map +0 -1
- package/dist/esm/SqlShardStorage.js +0 -244
- package/dist/esm/SqlShardStorage.js.map +0 -1
- package/dist/esm/SynchronizedClock.js +0 -57
- package/dist/esm/SynchronizedClock.js.map +0 -1
- package/dist/esm/internal/shardManager.js +0 -342
- package/dist/esm/internal/shardManager.js.map +0 -1
- package/src/HttpCommon.ts +0 -73
- package/src/HttpShardManager.ts +0 -273
- package/src/ShardManager.ts +0 -823
- package/src/ShardStorage.ts +0 -297
- package/src/SocketShardManager.ts +0 -48
- package/src/SqlShardStorage.ts +0 -329
- package/src/SynchronizedClock.ts +0 -82
- package/src/internal/shardManager.ts +0 -412
package/src/ShardingConfig.ts
CHANGED
|
@@ -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
|
-
*
|
|
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
|
|
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
|
-
*
|
|
59
|
+
* Shard lock refresh interval.
|
|
54
60
|
*/
|
|
55
|
-
readonly
|
|
61
|
+
readonly shardLockRefreshInterval: DurationInput
|
|
56
62
|
/**
|
|
57
|
-
*
|
|
58
|
-
* assignments will be reset.
|
|
63
|
+
* Shard lock expiration duration.
|
|
59
64
|
*/
|
|
60
|
-
readonly
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
159
|
-
Config.withDefault(defaults.
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
|
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 >=
|
|
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++
|
package/src/SocketRunner.ts
CHANGED
|
@@ -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
|
-
|
|
|
41
|
+
| RunnerStorage.RunnerStorage
|
|
42
|
+
| RunnerHealth
|
|
41
43
|
> = RunnerServer.layerWithClients.pipe(
|
|
42
44
|
withLogAddress,
|
|
43
|
-
Layer.provide(
|
|
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
|
package/src/SqlMessageStorage.ts
CHANGED
|
@@ -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
|
|
288
|
-
mssql: () => sql.literal(`DATEADD(MINUTE, -
|
|
289
|
-
mysql: () => sql.literal(`NOW() - INTERVAL
|
|
290
|
-
pg: () => sql.literal(`NOW() - INTERVAL '
|
|
291
|
-
orElse: () => sql.literal(`DATETIME('now', '-
|
|
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 < ${
|
|
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 < ${
|
|
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
|
})
|