@effect/cluster 0.37.1 → 0.38.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 (142) hide show
  1. package/ClusterCron/package.json +6 -0
  2. package/dist/cjs/ClusterCron.js +86 -0
  3. package/dist/cjs/ClusterCron.js.map +1 -0
  4. package/dist/cjs/ClusterSchema.js +9 -1
  5. package/dist/cjs/ClusterSchema.js.map +1 -1
  6. package/dist/cjs/ClusterWorkflowEngine.js +99 -78
  7. package/dist/cjs/ClusterWorkflowEngine.js.map +1 -1
  8. package/dist/cjs/Entity.js +6 -1
  9. package/dist/cjs/Entity.js.map +1 -1
  10. package/dist/cjs/EntityAddress.js +8 -1
  11. package/dist/cjs/EntityAddress.js.map +1 -1
  12. package/dist/cjs/MessageStorage.js +6 -4
  13. package/dist/cjs/MessageStorage.js.map +1 -1
  14. package/dist/cjs/Runner.js +15 -0
  15. package/dist/cjs/Runner.js.map +1 -1
  16. package/dist/cjs/RunnerAddress.js +8 -1
  17. package/dist/cjs/RunnerAddress.js.map +1 -1
  18. package/dist/cjs/Runners.js +5 -0
  19. package/dist/cjs/Runners.js.map +1 -1
  20. package/dist/cjs/ShardId.js +75 -7
  21. package/dist/cjs/ShardId.js.map +1 -1
  22. package/dist/cjs/ShardManager.js +63 -43
  23. package/dist/cjs/ShardManager.js.map +1 -1
  24. package/dist/cjs/ShardStorage.js +45 -36
  25. package/dist/cjs/ShardStorage.js.map +1 -1
  26. package/dist/cjs/Sharding.js +45 -37
  27. package/dist/cjs/Sharding.js.map +1 -1
  28. package/dist/cjs/ShardingConfig.js +9 -2
  29. package/dist/cjs/ShardingConfig.js.map +1 -1
  30. package/dist/cjs/Singleton.js +2 -2
  31. package/dist/cjs/Singleton.js.map +1 -1
  32. package/dist/cjs/SingletonAddress.js +2 -2
  33. package/dist/cjs/SingletonAddress.js.map +1 -1
  34. package/dist/cjs/SqlMessageStorage.js +32 -27
  35. package/dist/cjs/SqlMessageStorage.js.map +1 -1
  36. package/dist/cjs/SqlShardStorage.js +14 -14
  37. package/dist/cjs/SqlShardStorage.js.map +1 -1
  38. package/dist/cjs/index.js +3 -1
  39. package/dist/cjs/internal/entityManager.js +2 -1
  40. package/dist/cjs/internal/entityManager.js.map +1 -1
  41. package/dist/cjs/internal/shardManager.js +138 -37
  42. package/dist/cjs/internal/shardManager.js.map +1 -1
  43. package/dist/dts/ClusterCron.d.ts +37 -0
  44. package/dist/dts/ClusterCron.d.ts.map +1 -0
  45. package/dist/dts/ClusterSchema.d.ts +8 -0
  46. package/dist/dts/ClusterSchema.d.ts.map +1 -1
  47. package/dist/dts/ClusterWorkflowEngine.d.ts +4 -4
  48. package/dist/dts/ClusterWorkflowEngine.d.ts.map +1 -1
  49. package/dist/dts/Entity.d.ts +10 -0
  50. package/dist/dts/Entity.d.ts.map +1 -1
  51. package/dist/dts/EntityAddress.d.ts +9 -3
  52. package/dist/dts/EntityAddress.d.ts.map +1 -1
  53. package/dist/dts/MessageStorage.d.ts +3 -3
  54. package/dist/dts/MessageStorage.d.ts.map +1 -1
  55. package/dist/dts/Runner.d.ts +15 -0
  56. package/dist/dts/Runner.d.ts.map +1 -1
  57. package/dist/dts/RunnerAddress.d.ts +5 -0
  58. package/dist/dts/RunnerAddress.d.ts.map +1 -1
  59. package/dist/dts/Runners.d.ts.map +1 -1
  60. package/dist/dts/ShardId.d.ts +60 -6
  61. package/dist/dts/ShardId.d.ts.map +1 -1
  62. package/dist/dts/ShardManager.d.ts +13 -13
  63. package/dist/dts/ShardManager.d.ts.map +1 -1
  64. package/dist/dts/ShardStorage.d.ts +11 -14
  65. package/dist/dts/ShardStorage.d.ts.map +1 -1
  66. package/dist/dts/Sharding.d.ts +4 -2
  67. package/dist/dts/Sharding.d.ts.map +1 -1
  68. package/dist/dts/ShardingConfig.d.ts +32 -6
  69. package/dist/dts/ShardingConfig.d.ts.map +1 -1
  70. package/dist/dts/Singleton.d.ts +3 -1
  71. package/dist/dts/Singleton.d.ts.map +1 -1
  72. package/dist/dts/SingletonAddress.d.ts +4 -3
  73. package/dist/dts/SingletonAddress.d.ts.map +1 -1
  74. package/dist/dts/SqlMessageStorage.d.ts +3 -2
  75. package/dist/dts/SqlMessageStorage.d.ts.map +1 -1
  76. package/dist/dts/SqlShardStorage.d.ts +1 -1
  77. package/dist/dts/index.d.ts +4 -0
  78. package/dist/dts/index.d.ts.map +1 -1
  79. package/dist/esm/ClusterCron.js +77 -0
  80. package/dist/esm/ClusterCron.js.map +1 -0
  81. package/dist/esm/ClusterSchema.js +7 -0
  82. package/dist/esm/ClusterSchema.js.map +1 -1
  83. package/dist/esm/ClusterWorkflowEngine.js +99 -78
  84. package/dist/esm/ClusterWorkflowEngine.js.map +1 -1
  85. package/dist/esm/Entity.js +6 -1
  86. package/dist/esm/Entity.js.map +1 -1
  87. package/dist/esm/EntityAddress.js +8 -1
  88. package/dist/esm/EntityAddress.js.map +1 -1
  89. package/dist/esm/MessageStorage.js +6 -4
  90. package/dist/esm/MessageStorage.js.map +1 -1
  91. package/dist/esm/Runner.js +15 -0
  92. package/dist/esm/Runner.js.map +1 -1
  93. package/dist/esm/RunnerAddress.js +8 -1
  94. package/dist/esm/RunnerAddress.js.map +1 -1
  95. package/dist/esm/Runners.js +5 -0
  96. package/dist/esm/Runners.js.map +1 -1
  97. package/dist/esm/ShardId.js +73 -6
  98. package/dist/esm/ShardId.js.map +1 -1
  99. package/dist/esm/ShardManager.js +64 -45
  100. package/dist/esm/ShardManager.js.map +1 -1
  101. package/dist/esm/ShardStorage.js +44 -36
  102. package/dist/esm/ShardStorage.js.map +1 -1
  103. package/dist/esm/Sharding.js +45 -37
  104. package/dist/esm/Sharding.js.map +1 -1
  105. package/dist/esm/ShardingConfig.js +9 -2
  106. package/dist/esm/ShardingConfig.js.map +1 -1
  107. package/dist/esm/Singleton.js +2 -2
  108. package/dist/esm/Singleton.js.map +1 -1
  109. package/dist/esm/SingletonAddress.js +2 -2
  110. package/dist/esm/SingletonAddress.js.map +1 -1
  111. package/dist/esm/SqlMessageStorage.js +32 -27
  112. package/dist/esm/SqlMessageStorage.js.map +1 -1
  113. package/dist/esm/SqlShardStorage.js +14 -14
  114. package/dist/esm/SqlShardStorage.js.map +1 -1
  115. package/dist/esm/index.js +4 -0
  116. package/dist/esm/index.js.map +1 -1
  117. package/dist/esm/internal/entityManager.js +2 -1
  118. package/dist/esm/internal/entityManager.js.map +1 -1
  119. package/dist/esm/internal/shardManager.js +136 -36
  120. package/dist/esm/internal/shardManager.js.map +1 -1
  121. package/package.json +13 -5
  122. package/src/ClusterCron.ts +129 -0
  123. package/src/ClusterSchema.ts +9 -0
  124. package/src/ClusterWorkflowEngine.ts +93 -58
  125. package/src/Entity.ts +20 -1
  126. package/src/EntityAddress.ts +11 -1
  127. package/src/MessageStorage.ts +12 -7
  128. package/src/Runner.ts +18 -0
  129. package/src/RunnerAddress.ts +9 -1
  130. package/src/Runners.ts +5 -0
  131. package/src/ShardId.ts +81 -11
  132. package/src/ShardManager.ts +74 -45
  133. package/src/ShardStorage.ts +51 -47
  134. package/src/Sharding.ts +45 -39
  135. package/src/ShardingConfig.ts +36 -7
  136. package/src/Singleton.ts +5 -2
  137. package/src/SingletonAddress.ts +2 -2
  138. package/src/SqlMessageStorage.ts +36 -30
  139. package/src/SqlShardStorage.ts +15 -15
  140. package/src/index.ts +5 -0
  141. package/src/internal/entityManager.ts +2 -1
  142. package/src/internal/shardManager.ts +158 -52
@@ -11,9 +11,11 @@ import { ShardId } from "../ShardId.js";
11
11
  import { ShardStorage } from "../ShardStorage.js";
12
12
  /** @internal */
13
13
  export class State {
14
+ allRunners;
14
15
  runners;
15
16
  shards;
16
- static fromStorage = /*#__PURE__*/Effect.fnUntraced(function* (numberOfShards) {
17
+ shardsPerGroup;
18
+ static fromStorage = /*#__PURE__*/Effect.fnUntraced(function* (shardsPerGroup) {
17
19
  const storage = yield* ShardStorage;
18
20
  const runnerHealth = yield* RunnerHealth;
19
21
  // Fetch registered runners and shard assignments from cluster storage
@@ -36,11 +38,11 @@ export class State {
36
38
  yield* Effect.logWarning("Ignoring runners that are no longer considered alive:", deadRunners);
37
39
  }
38
40
  // Determine which shards remain unassigned to a runner
39
- const assignedShards = new Map();
41
+ const assignedShards = MutableHashMap.empty();
40
42
  const invalidAssignments = Arr.empty();
41
43
  for (const [shard, address] of storedAssignments) {
42
44
  if (Option.isSome(address) && MutableHashMap.has(aliveRunners, address.value)) {
43
- assignedShards.set(shard, address.value);
45
+ MutableHashMap.set(assignedShards, shard, address.value);
44
46
  } else if (Option.isSome(address)) {
45
47
  invalidAssignments.push([shard, address.value]);
46
48
  }
@@ -50,28 +52,98 @@ export class State {
50
52
  }
51
53
  // Construct the initial state
52
54
  const now = yield* Clock.currentTimeMillis;
53
- const runnerState = MutableHashMap.empty();
55
+ const allRunners = MutableHashMap.empty();
56
+ const runnerState = new Map();
57
+ // for (const group of groups) {
58
+ // runnerState.set(group, MutableHashMap.empty<RunnerAddress, RunnerWithMetadata>())
59
+ // }
54
60
  for (const [address, runner] of aliveRunners) {
55
- MutableHashMap.set(runnerState, address, RunnerWithMetadata({
61
+ const withMetadata = RunnerWithMetadata({
56
62
  runner,
57
63
  registeredAt: now
58
- }));
64
+ });
65
+ MutableHashMap.set(allRunners, address, withMetadata);
66
+ for (const group of runner.groups) {
67
+ let groupMap = runnerState.get(group);
68
+ if (!groupMap) {
69
+ groupMap = MutableHashMap.empty();
70
+ runnerState.set(group, groupMap);
71
+ }
72
+ MutableHashMap.set(groupMap, address, withMetadata);
73
+ }
59
74
  }
60
75
  const shardState = new Map();
61
- for (let n = 1; n <= numberOfShards; n++) {
62
- const shardId = ShardId.make(n);
63
- shardState.set(shardId, Option.fromNullable(assignedShards.get(shardId)));
76
+ for (const group of runnerState.keys()) {
77
+ const groupMap = new Map();
78
+ shardState.set(group, groupMap);
79
+ for (let n = 1; n <= shardsPerGroup; n++) {
80
+ const shardId = new ShardId({
81
+ group,
82
+ id: n
83
+ });
84
+ groupMap.set(n, MutableHashMap.get(assignedShards, shardId));
85
+ }
64
86
  }
65
- return new State(runnerState, shardState);
87
+ return new State(allRunners, runnerState, shardState, shardsPerGroup);
66
88
  });
67
- constructor(runners, shards) {
89
+ constructor(allRunners, runners, shards, shardsPerGroup) {
90
+ this.allRunners = allRunners;
68
91
  this.runners = runners;
69
92
  this.shards = shards;
93
+ this.shardsPerGroup = shardsPerGroup;
94
+ this.assignments = MutableHashMap.empty();
95
+ for (const [group, groupMap] of this.shards) {
96
+ for (const [id, address] of groupMap) {
97
+ MutableHashMap.set(this.assignments, new ShardId({
98
+ group,
99
+ id
100
+ }), address);
101
+ }
102
+ }
103
+ }
104
+ assignments;
105
+ addGroup(group) {
106
+ this.runners.set(group, MutableHashMap.empty());
107
+ const shardMap = new Map();
108
+ for (let n = 1; n <= this.shardsPerGroup; n++) {
109
+ shardMap.set(n, Option.none());
110
+ MutableHashMap.set(this.assignments, new ShardId({
111
+ group,
112
+ id: n
113
+ }), Option.none());
114
+ }
115
+ this.shards.set(group, shardMap);
116
+ }
117
+ addAssignments(shards, address) {
118
+ for (const shardId of shards) {
119
+ MutableHashMap.set(this.assignments, shardId, address);
120
+ this.shards.get(shardId.group)?.set(shardId.id, address);
121
+ }
122
+ }
123
+ addRunner(runner, registeredAt) {
124
+ const withMetadata = RunnerWithMetadata({
125
+ runner,
126
+ registeredAt
127
+ });
128
+ MutableHashMap.set(this.allRunners, runner.address, withMetadata);
129
+ for (const group of runner.groups) {
130
+ if (!this.runners.has(group)) {
131
+ this.addGroup(group);
132
+ }
133
+ const groupMap = this.runners.get(group);
134
+ MutableHashMap.set(groupMap, runner.address, withMetadata);
135
+ }
136
+ }
137
+ removeRunner(address) {
138
+ MutableHashMap.remove(this.allRunners, address);
139
+ for (const groupMap of this.runners.values()) {
140
+ MutableHashMap.remove(groupMap, address);
141
+ }
70
142
  }
71
143
  get maxVersion() {
72
- if (MutableHashMap.size(this.runners) === 0) return Option.none();
144
+ if (MutableHashMap.size(this.allRunners) === 0) return Option.none();
73
145
  let version = undefined;
74
- for (const [, meta] of this.runners) {
146
+ for (const [, meta] of this.allRunners) {
75
147
  if (version === undefined || meta.runner.version > version) {
76
148
  version = meta.runner.version;
77
149
  }
@@ -81,26 +153,39 @@ export class State {
81
153
  allRunnersHaveVersion(version) {
82
154
  return version.pipe(Option.map(max => Arr.every(this.runnerVersions, version => version === max)), Option.getOrElse(constFalse));
83
155
  }
84
- get shardsPerRunner() {
156
+ shardsPerRunner(group) {
157
+ const groupRunners = this.runners.get(group);
85
158
  const shards = MutableHashMap.empty();
86
- if (MutableHashMap.isEmpty(this.runners)) return shards;
87
- MutableHashMap.forEach(this.runners, (_, address) => {
159
+ if (!groupRunners || MutableHashMap.isEmpty(groupRunners)) return shards;
160
+ MutableHashMap.forEach(groupRunners, (_, address) => {
88
161
  MutableHashMap.set(shards, address, new Set());
89
162
  });
90
- for (const [shard, address] of this.shards) {
163
+ const assignments = this.shards.get(group);
164
+ for (const [id, address] of assignments) {
91
165
  if (Option.isNone(address)) continue;
92
166
  const shardIds = Option.getOrUndefined(MutableHashMap.get(shards, address.value));
93
- shardIds.add(shard);
167
+ shardIds.add(id);
94
168
  }
95
169
  return shards;
96
170
  }
97
- get averageShardsPerRunner() {
98
- const runnerCount = MutableHashMap.size(this.runners);
99
- return runnerCount > 0 ? this.shards.size / runnerCount : 0;
171
+ averageShardsPerRunner(group) {
172
+ const runnerCount = MutableHashMap.size(this.runners.get(group) ?? MutableHashMap.empty());
173
+ const shardGroup = this.shards.get(group) ?? new Map();
174
+ return runnerCount > 0 ? shardGroup.size / runnerCount : 0;
100
175
  }
101
- get unassignedShards() {
176
+ get allUnassignedShards() {
177
+ const unassigned = [];
178
+ for (const [shardId, address] of this.assignments) {
179
+ if (Option.isNone(address)) {
180
+ unassigned.push(shardId);
181
+ }
182
+ }
183
+ return unassigned;
184
+ }
185
+ unassignedShards(group) {
102
186
  const shardIds = [];
103
- for (const [shard, address] of this.shards) {
187
+ const assignments = this.shards.get(group);
188
+ for (const [shard, address] of assignments) {
104
189
  if (Option.isNone(address)) {
105
190
  shardIds.push(shard);
106
191
  }
@@ -109,7 +194,7 @@ export class State {
109
194
  }
110
195
  get runnerVersions() {
111
196
  const runnerVersions = [];
112
- for (const [, meta] of this.runners) {
197
+ for (const [, meta] of this.allRunners) {
113
198
  runnerVersions.push(meta.runner.version);
114
199
  }
115
200
  return runnerVersions;
@@ -118,22 +203,24 @@ export class State {
118
203
  /** @internal */
119
204
  export const RunnerWithMetadata = runner => runner;
120
205
  /** @internal */
121
- export function decideAssignmentsForUnassignedShards(state) {
122
- return pickNewRunners(state.unassignedShards, state, true, 1);
206
+ export function decideAssignmentsForUnassignedShards(state, group) {
207
+ return pickNewRunners(state.unassignedShards(group), state, group, true, 1);
123
208
  }
124
209
  const allocationOrder = /*#__PURE__*/Order.combine(/*#__PURE__*/Order.mapInput(Order.number, ([, shards]) => shards), /*#__PURE__*/Order.mapInput(Order.number, ([,, registeredAt]) => registeredAt));
125
210
  /** @internal */
126
- export function decideAssignmentsForUnbalancedShards(state, rate) {
127
- const shardsPerRunner = state.shardsPerRunner;
211
+ export function decideAssignmentsForUnbalancedShards(state, group, rate) {
212
+ const shardsPerRunner = state.shardsPerRunner(group);
128
213
  const maxVersion = state.maxVersion;
129
214
  const extraShardsToAllocate = Arr.empty();
215
+ const runnerGroup = state.runners.get(group);
216
+ const shardsGroup = state.shards.get(group);
130
217
  if (state.allRunnersHaveVersion(maxVersion)) {
131
- const averageShardsPerRunner = state.averageShardsPerRunner;
218
+ const averageShardsPerRunner = state.averageShardsPerRunner(group);
132
219
  MutableHashMap.forEach(shardsPerRunner, shards => {
133
220
  // Count how many extra shards there are compared to the average
134
221
  const extraShards = Math.max(0, shards.size - averageShardsPerRunner);
135
222
  for (const shard of takeRandom(shards, extraShards)) {
136
- const maybeAddress = state.shards.get(shard) ?? Option.none();
223
+ const maybeAddress = shardsGroup.get(shard) ?? Option.none();
137
224
  if (Option.isNone(maybeAddress)) {
138
225
  extraShardsToAllocate.push([shard, Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER]);
139
226
  continue;
@@ -142,7 +229,7 @@ export function decideAssignmentsForUnbalancedShards(state, rate) {
142
229
  extraShardsToAllocate.push([shard, Option.match(MutableHashMap.get(shardsPerRunner, address), {
143
230
  onNone: () => Number.MIN_SAFE_INTEGER,
144
231
  onSome: shards => -shards.size
145
- }), Option.match(MutableHashMap.get(state.runners, address), {
232
+ }), Option.match(MutableHashMap.get(runnerGroup, address), {
146
233
  onNone: () => Number.MIN_SAFE_INTEGER,
147
234
  onSome: meta => meta.registeredAt
148
235
  })]);
@@ -150,9 +237,9 @@ export function decideAssignmentsForUnbalancedShards(state, rate) {
150
237
  });
151
238
  }
152
239
  const sortedShardsToRebalance = extraShardsToAllocate.sort(allocationOrder).map(([shard]) => shard);
153
- return pickNewRunners(sortedShardsToRebalance, state, false, rate, shardsPerRunner, maxVersion);
240
+ return pickNewRunners(sortedShardsToRebalance, state, group, false, rate, shardsPerRunner, maxVersion);
154
241
  }
155
- function pickNewRunners(shardsToRebalance, state, immediate, rate, shardsPerRunner = state.shardsPerRunner, maybeMaxVersion = state.maxVersion) {
242
+ function pickNewRunners(shardsToRebalance, state, group, immediate, rate, shardsPerRunner = state.shardsPerRunner(group), maybeMaxVersion = state.maxVersion) {
156
243
  const addressAssignments = MutableHashMap.empty();
157
244
  const unassignments = MutableHashMap.empty();
158
245
  const changes = MutableHashSet.empty();
@@ -160,13 +247,15 @@ function pickNewRunners(shardsToRebalance, state, immediate, rate, shardsPerRunn
160
247
  return [addressAssignments, unassignments, changes];
161
248
  }
162
249
  const maxVersion = maybeMaxVersion.value;
250
+ const runnerGroup = state.runners.get(group);
251
+ const shardsGroup = state.shards.get(group);
163
252
  for (const shardId of shardsToRebalance) {
164
253
  // Find the runner with the fewest assigned shards
165
254
  let candidate;
166
255
  let candidateShards;
167
256
  for (const [address, shards] of shardsPerRunner) {
168
257
  // Keep only runners with the maximum version
169
- const maybeRunnerMeta = MutableHashMap.get(state.runners, address);
258
+ const maybeRunnerMeta = MutableHashMap.get(runnerGroup, address);
170
259
  if (Option.isNone(maybeRunnerMeta)) continue;
171
260
  const runnerMeta = maybeRunnerMeta.value;
172
261
  if (runnerMeta.runner.version !== maxVersion) continue;
@@ -176,7 +265,7 @@ function pickNewRunners(shardsToRebalance, state, immediate, rate, shardsPerRunn
176
265
  // occur immediately
177
266
  if (!immediate) {
178
267
  const assignmentCount = Option.getOrUndefined(MutableHashMap.get(addressAssignments, address))?.size ?? 0;
179
- if (assignmentCount >= state.shards.size * rate) continue;
268
+ if (assignmentCount >= shardsGroup.size * rate) continue;
180
269
  }
181
270
  if (candidate === undefined || shards.size < candidateShards.size) {
182
271
  candidate = address;
@@ -185,7 +274,7 @@ function pickNewRunners(shardsToRebalance, state, immediate, rate, shardsPerRunn
185
274
  }
186
275
  if (!candidate || !candidateShards) break;
187
276
  // If the old runner is the same as the new runner, do nothing
188
- const oldRunner = Option.getOrUndefined(state.shards.get(shardId) ?? Option.none());
277
+ const oldRunner = Option.getOrUndefined(shardsGroup.get(shardId) ?? Option.none());
189
278
  if (oldRunner && oldRunner.toString() === candidate.toString()) {
190
279
  continue;
191
280
  }
@@ -237,4 +326,15 @@ function swap(array, i, j) {
237
326
  array[j] = tmp;
238
327
  return array;
239
328
  }
329
+ /** @internal */
330
+ export const addAllNested = (self, key, values) => {
331
+ const oset = MutableHashMap.get(self, key);
332
+ if (Option.isSome(oset)) {
333
+ for (const value of values) {
334
+ MutableHashSet.add(oset.value, value);
335
+ }
336
+ } else {
337
+ MutableHashMap.set(self, key, MutableHashSet.fromIterable(values));
338
+ }
339
+ };
240
340
  //# sourceMappingURL=shardManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shardManager.js","names":["Arr","Clock","Effect","constFalse","MutableHashMap","MutableHashSet","Option","Order","RunnerHealth","ShardId","ShardStorage","State","runners","shards","fromStorage","fnUntraced","numberOfShards","storage","runnerHealth","storedRunners","getRunners","storedAssignments","getAssignments","deadRunners","empty","aliveRunners","forEach","address","runner","map","isAlive","set","push","concurrency","discard","length","logWarning","assignedShards","Map","invalidAssignments","shard","isSome","has","value","now","currentTimeMillis","runnerState","RunnerWithMetadata","registeredAt","shardState","n","shardId","make","fromNullable","get","constructor","maxVersion","size","none","version","undefined","meta","some","allRunnersHaveVersion","pipe","max","every","runnerVersions","getOrElse","shardsPerRunner","isEmpty","_","Set","isNone","shardIds","getOrUndefined","add","averageShardsPerRunner","runnerCount","unassignedShards","decideAssignmentsForUnassignedShards","state","pickNewRunners","allocationOrder","combine","mapInput","number","decideAssignmentsForUnbalancedShards","rate","extraShardsToAllocate","extraShards","Math","takeRandom","maybeAddress","Number","MIN_SAFE_INTEGER","match","onNone","onSome","sortedShardsToRebalance","sort","shardsToRebalance","immediate","maybeMaxVersion","addressAssignments","unassignments","changes","candidate","candidateShards","maybeRunnerMeta","runnerMeta","assignmentCount","oldRunner","toString","oldShards","modifyAt","delete","self","array","Array","from","currentIndex","randomIndex","floor","random","swap","slice","i","j","tmp"],"sources":["../../../src/internal/shardManager.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"shardManager.js","names":["Arr","Clock","Effect","constFalse","MutableHashMap","MutableHashSet","Option","Order","RunnerHealth","ShardId","ShardStorage","State","allRunners","runners","shards","shardsPerGroup","fromStorage","fnUntraced","storage","runnerHealth","storedRunners","getRunners","storedAssignments","getAssignments","deadRunners","empty","aliveRunners","forEach","address","runner","map","isAlive","set","push","concurrency","discard","length","logWarning","assignedShards","invalidAssignments","shard","isSome","has","value","now","currentTimeMillis","runnerState","Map","withMetadata","RunnerWithMetadata","registeredAt","group","groups","groupMap","get","shardState","keys","n","shardId","id","constructor","assignments","addGroup","shardMap","none","addAssignments","addRunner","removeRunner","remove","values","maxVersion","size","version","undefined","meta","some","allRunnersHaveVersion","pipe","max","every","runnerVersions","getOrElse","shardsPerRunner","groupRunners","isEmpty","_","Set","isNone","shardIds","getOrUndefined","add","averageShardsPerRunner","runnerCount","shardGroup","allUnassignedShards","unassigned","unassignedShards","decideAssignmentsForUnassignedShards","state","pickNewRunners","allocationOrder","combine","mapInput","number","decideAssignmentsForUnbalancedShards","rate","extraShardsToAllocate","runnerGroup","shardsGroup","extraShards","Math","takeRandom","maybeAddress","Number","MIN_SAFE_INTEGER","match","onNone","onSome","sortedShardsToRebalance","sort","shardsToRebalance","immediate","maybeMaxVersion","addressAssignments","unassignments","changes","candidate","candidateShards","maybeRunnerMeta","runnerMeta","assignmentCount","oldRunner","toString","oldShards","modifyAt","delete","self","array","Array","from","currentIndex","randomIndex","floor","random","swap","slice","i","j","tmp","addAllNested","key","oset","fromIterable"],"sources":["../../../src/internal/shardManager.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,GAAG,MAAM,cAAc;AACnC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,SAASC,UAAU,QAAQ,iBAAiB;AAC5C,OAAO,KAAKC,cAAc,MAAM,uBAAuB;AACvD,OAAO,KAAKC,cAAc,MAAM,uBAAuB;AACvD,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AAGrC,SAASC,YAAY,QAAQ,oBAAoB;AACjD,SAASC,OAAO,QAAQ,eAAe;AACvC,SAASC,YAAY,QAAQ,oBAAoB;AAEjD;AACA,OAAM,MAAOC,KAAK;EA6ELC,UAAA;EACAC,OAAA;EACAC,MAAA;EACAC,cAAA;EA/EX,OAAOC,WAAW,gBAAGd,MAAM,CAACe,UAAU,CAAC,WACrCF,cAAsB;IAEtB,MAAMG,OAAO,GAAG,OAAOR,YAAY;IACnC,MAAMS,YAAY,GAAG,OAAOX,YAAY;IAExC;IACA,MAAMY,aAAa,GAAG,OAAOF,OAAO,CAACG,UAAU;IAC/C,MAAMC,iBAAiB,GAAG,OAAOJ,OAAO,CAACK,cAAc;IAEvD;IACA,MAAMC,WAAW,GAAGxB,GAAG,CAACyB,KAAK,EAAU;IACvC,MAAMC,YAAY,GAAGtB,cAAc,CAACqB,KAAK,EAAyB;IAClE,OAAOvB,MAAM,CAACyB,OAAO,CAACP,aAAa,EAAE,CAAC,CAACQ,OAAO,EAAEC,MAAM,CAAC,KACrD3B,MAAM,CAAC4B,GAAG,CAACX,YAAY,CAACY,OAAO,CAACH,OAAO,CAAC,EAAGG,OAAO,IAAI;MACpD,IAAIA,OAAO,EAAE;QACX3B,cAAc,CAAC4B,GAAG,CAACN,YAAY,EAAEE,OAAO,EAAEC,MAAM,CAAC;MACnD,CAAC,MAAM;QACLL,WAAW,CAACS,IAAI,CAACJ,MAAM,CAAC;MAC1B;IACF,CAAC,CAAC,EAAE;MAAEK,WAAW,EAAE,WAAW;MAAEC,OAAO,EAAE;IAAI,CAAE,CAAC;IAClD,IAAIX,WAAW,CAACY,MAAM,GAAG,CAAC,EAAE;MAC1B,OAAOlC,MAAM,CAACmC,UAAU,CAAC,uDAAuD,EAAEb,WAAW,CAAC;IAChG;IAEA;IACA,MAAMc,cAAc,GAAGlC,cAAc,CAACqB,KAAK,EAA0B;IACrE,MAAMc,kBAAkB,GAAGvC,GAAG,CAACyB,KAAK,EAA4B;IAChE,KAAK,MAAM,CAACe,KAAK,EAAEZ,OAAO,CAAC,IAAIN,iBAAiB,EAAE;MAChD,IAAIhB,MAAM,CAACmC,MAAM,CAACb,OAAO,CAAC,IAAIxB,cAAc,CAACsC,GAAG,CAAChB,YAAY,EAAEE,OAAO,CAACe,KAAK,CAAC,EAAE;QAC7EvC,cAAc,CAAC4B,GAAG,CAACM,cAAc,EAAEE,KAAK,EAAEZ,OAAO,CAACe,KAAK,CAAC;MAC1D,CAAC,MAAM,IAAIrC,MAAM,CAACmC,MAAM,CAACb,OAAO,CAAC,EAAE;QACjCW,kBAAkB,CAACN,IAAI,CAAC,CAACO,KAAK,EAAEZ,OAAO,CAACe,KAAK,CAAC,CAAC;MACjD;IACF;IACA,IAAIJ,kBAAkB,CAACH,MAAM,GAAG,CAAC,EAAE;MACjC,OAAOlC,MAAM,CAACmC,UAAU,CACtB,8EAA8E,EAC9EE,kBAAkB,CACnB;IACH;IAEA;IACA,MAAMK,GAAG,GAAG,OAAO3C,KAAK,CAAC4C,iBAAiB;IAC1C,MAAMjC,UAAU,GAAGR,cAAc,CAACqB,KAAK,EAAqC;IAC5E,MAAMqB,WAAW,GAAG,IAAIC,GAAG,EAA4E;IACvG;IACA;IACA;IACA,KAAK,MAAM,CAACnB,OAAO,EAAEC,MAAM,CAAC,IAAIH,YAAY,EAAE;MAC5C,MAAMsB,YAAY,GAAGC,kBAAkB,CAAC;QAAEpB,MAAM;QAAEqB,YAAY,EAAEN;MAAG,CAAE,CAAC;MACtExC,cAAc,CAAC4B,GAAG,CAACpB,UAAU,EAAEgB,OAAO,EAAEoB,YAAY,CAAC;MACrD,KAAK,MAAMG,KAAK,IAAItB,MAAM,CAACuB,MAAM,EAAE;QACjC,IAAIC,QAAQ,GAAGP,WAAW,CAACQ,GAAG,CAACH,KAAK,CAAC;QACrC,IAAI,CAACE,QAAQ,EAAE;UACbA,QAAQ,GAAGjD,cAAc,CAACqB,KAAK,EAAqC;UACpEqB,WAAW,CAACd,GAAG,CAACmB,KAAK,EAAEE,QAAQ,CAAC;QAClC;QACAjD,cAAc,CAAC4B,GAAG,CAACqB,QAAQ,EAAEzB,OAAO,EAAEoB,YAAY,CAAC;MACrD;IACF;IAEA,MAAMO,UAAU,GAAG,IAAIR,GAAG,EAAqD;IAC/E,KAAK,MAAMI,KAAK,IAAIL,WAAW,CAACU,IAAI,EAAE,EAAE;MACtC,MAAMH,QAAQ,GAAG,IAAIN,GAAG,EAAwC;MAChEQ,UAAU,CAACvB,GAAG,CAACmB,KAAK,EAAEE,QAAQ,CAAC;MAC/B,KAAK,IAAII,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAI1C,cAAc,EAAE0C,CAAC,EAAE,EAAE;QACxC,MAAMC,OAAO,GAAG,IAAIjD,OAAO,CAAC;UAAE0C,KAAK;UAAEQ,EAAE,EAAEF;QAAC,CAAE,CAAC;QAC7CJ,QAAQ,CAACrB,GAAG,CAACyB,CAAC,EAAErD,cAAc,CAACkD,GAAG,CAAChB,cAAc,EAAEoB,OAAO,CAAC,CAAC;MAC9D;IACF;IAEA,OAAO,IAAI/C,KAAK,CAACC,UAAU,EAAEkC,WAAW,EAAES,UAAU,EAAExC,cAAc,CAAC;EACvE,CAAC,CAAC;EAEF6C,YACWhD,UAA4E,EAC5EC,OAAsF,EACtFC,MAA8D,EAC9DC,cAAsB;IAHtB,KAAAH,UAAU,GAAVA,UAAU;IACV,KAAAC,OAAO,GAAPA,OAAO;IACP,KAAAC,MAAM,GAANA,MAAM;IACN,KAAAC,cAAc,GAAdA,cAAc;IAEvB,IAAI,CAAC8C,WAAW,GAAGzD,cAAc,CAACqB,KAAK,EAAyC;IAChF,KAAK,MAAM,CAAC0B,KAAK,EAAEE,QAAQ,CAAC,IAAI,IAAI,CAACvC,MAAM,EAAE;MAC3C,KAAK,MAAM,CAAC6C,EAAE,EAAE/B,OAAO,CAAC,IAAIyB,QAAQ,EAAE;QACpCjD,cAAc,CAAC4B,GAAG,CAAC,IAAI,CAAC6B,WAAW,EAAE,IAAIpD,OAAO,CAAC;UAAE0C,KAAK;UAAEQ;QAAE,CAAE,CAAC,EAAE/B,OAAO,CAAC;MAC3E;IACF;EACF;EAESiC,WAAW;EAEpBC,QAAQA,CAACX,KAAa;IACpB,IAAI,CAACtC,OAAO,CAACmB,GAAG,CAACmB,KAAK,EAAE/C,cAAc,CAACqB,KAAK,EAAqC,CAAC;IAClF,MAAMsC,QAAQ,GAAG,IAAIhB,GAAG,EAAwC;IAChE,KAAK,IAAIU,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAI,IAAI,CAAC1C,cAAc,EAAE0C,CAAC,EAAE,EAAE;MAC7CM,QAAQ,CAAC/B,GAAG,CAACyB,CAAC,EAAEnD,MAAM,CAAC0D,IAAI,EAAE,CAAC;MAC9B5D,cAAc,CAAC4B,GAAG,CAAC,IAAI,CAAC6B,WAAW,EAAE,IAAIpD,OAAO,CAAC;QAAE0C,KAAK;QAAEQ,EAAE,EAAEF;MAAC,CAAE,CAAC,EAAEnD,MAAM,CAAC0D,IAAI,EAAE,CAAC;IACpF;IACA,IAAI,CAAClD,MAAM,CAACkB,GAAG,CAACmB,KAAK,EAAEY,QAAQ,CAAC;EAClC;EAEAE,cAAcA,CACZnD,MAAyB,EACzBc,OAAqC;IAErC,KAAK,MAAM8B,OAAO,IAAI5C,MAAM,EAAE;MAC5BV,cAAc,CAAC4B,GAAG,CAAC,IAAI,CAAC6B,WAAW,EAAEH,OAAO,EAAE9B,OAAO,CAAC;MACtD,IAAI,CAACd,MAAM,CAACwC,GAAG,CAACI,OAAO,CAACP,KAAK,CAAC,EAAEnB,GAAG,CAAC0B,OAAO,CAACC,EAAE,EAAE/B,OAAO,CAAC;IAC1D;EACF;EAEAsC,SAASA,CAACrC,MAAc,EAAEqB,YAAoB;IAC5C,MAAMF,YAAY,GAAGC,kBAAkB,CAAC;MAAEpB,MAAM;MAAEqB;IAAY,CAAE,CAAC;IACjE9C,cAAc,CAAC4B,GAAG,CAAC,IAAI,CAACpB,UAAU,EAAEiB,MAAM,CAACD,OAAO,EAAEoB,YAAY,CAAC;IACjE,KAAK,MAAMG,KAAK,IAAItB,MAAM,CAACuB,MAAM,EAAE;MACjC,IAAI,CAAC,IAAI,CAACvC,OAAO,CAAC6B,GAAG,CAACS,KAAK,CAAC,EAAE;QAC5B,IAAI,CAACW,QAAQ,CAACX,KAAK,CAAC;MACtB;MACA,MAAME,QAAQ,GAAG,IAAI,CAACxC,OAAO,CAACyC,GAAG,CAACH,KAAK,CAAE;MACzC/C,cAAc,CAAC4B,GAAG,CAACqB,QAAQ,EAAExB,MAAM,CAACD,OAAO,EAAEoB,YAAY,CAAC;IAC5D;EACF;EAEAmB,YAAYA,CAACvC,OAAsB;IACjCxB,cAAc,CAACgE,MAAM,CAAC,IAAI,CAACxD,UAAU,EAAEgB,OAAO,CAAC;IAC/C,KAAK,MAAMyB,QAAQ,IAAI,IAAI,CAACxC,OAAO,CAACwD,MAAM,EAAE,EAAE;MAC5CjE,cAAc,CAACgE,MAAM,CAACf,QAAQ,EAAEzB,OAAO,CAAC;IAC1C;EACF;EAEA,IAAI0C,UAAUA,CAAA;IACZ,IAAIlE,cAAc,CAACmE,IAAI,CAAC,IAAI,CAAC3D,UAAU,CAAC,KAAK,CAAC,EAAE,OAAON,MAAM,CAAC0D,IAAI,EAAE;IACpE,IAAIQ,OAAO,GAAuBC,SAAS;IAC3C,KAAK,MAAM,GAAGC,IAAI,CAAC,IAAI,IAAI,CAAC9D,UAAU,EAAE;MACtC,IAAI4D,OAAO,KAAKC,SAAS,IAAIC,IAAI,CAAC7C,MAAM,CAAC2C,OAAO,GAAGA,OAAO,EAAE;QAC1DA,OAAO,GAAGE,IAAI,CAAC7C,MAAM,CAAC2C,OAAO;MAC/B;IACF;IACA,OAAOlE,MAAM,CAACqE,IAAI,CAACH,OAAQ,CAAC;EAC9B;EAEAI,qBAAqBA,CAACJ,OAA8B;IAClD,OAAOA,OAAO,CAACK,IAAI,CACjBvE,MAAM,CAACwB,GAAG,CAAEgD,GAAG,IAAK9E,GAAG,CAAC+E,KAAK,CAAC,IAAI,CAACC,cAAc,EAAGR,OAAO,IAAKA,OAAO,KAAKM,GAAG,CAAC,CAAC,EACjFxE,MAAM,CAAC2E,SAAS,CAAC9E,UAAU,CAAC,CAC7B;EACH;EAEA+E,eAAeA,CAAC/B,KAAa;IAC3B,MAAMgC,YAAY,GAAG,IAAI,CAACtE,OAAO,CAACyC,GAAG,CAACH,KAAK,CAAC;IAC5C,MAAMrC,MAAM,GAAGV,cAAc,CAACqB,KAAK,EAA8B;IAEjE,IAAI,CAAC0D,YAAY,IAAI/E,cAAc,CAACgF,OAAO,CAACD,YAAY,CAAC,EAAE,OAAOrE,MAAM;IACxEV,cAAc,CAACuB,OAAO,CAACwD,YAAY,EAAE,CAACE,CAAC,EAAEzD,OAAO,KAAI;MAClDxB,cAAc,CAAC4B,GAAG,CAAClB,MAAM,EAAEc,OAAO,EAAE,IAAI0D,GAAG,EAAE,CAAC;IAChD,CAAC,CAAC;IAEF,MAAMzB,WAAW,GAAG,IAAI,CAAC/C,MAAM,CAACwC,GAAG,CAACH,KAAK,CAAE;IAC3C,KAAK,MAAM,CAACQ,EAAE,EAAE/B,OAAO,CAAC,IAAIiC,WAAW,EAAE;MACvC,IAAIvD,MAAM,CAACiF,MAAM,CAAC3D,OAAO,CAAC,EAAE;MAC5B,MAAM4D,QAAQ,GAAGlF,MAAM,CAACmF,cAAc,CAACrF,cAAc,CAACkD,GAAG,CAACxC,MAAM,EAAEc,OAAO,CAACe,KAAK,CAAC,CAAE;MAClF6C,QAAQ,CAACE,GAAG,CAAC/B,EAAE,CAAC;IAClB;IAEA,OAAO7C,MAAM;EACf;EAEA6E,sBAAsBA,CAACxC,KAAa;IAClC,MAAMyC,WAAW,GAAGxF,cAAc,CAACmE,IAAI,CAAC,IAAI,CAAC1D,OAAO,CAACyC,GAAG,CAACH,KAAK,CAAC,IAAI/C,cAAc,CAACqB,KAAK,EAAE,CAAC;IAC1F,MAAMoE,UAAU,GAAG,IAAI,CAAC/E,MAAM,CAACwC,GAAG,CAACH,KAAK,CAAC,IAAI,IAAIJ,GAAG,EAAE;IACtD,OAAO6C,WAAW,GAAG,CAAC,GAAGC,UAAU,CAACtB,IAAI,GAAGqB,WAAW,GAAG,CAAC;EAC5D;EAEA,IAAIE,mBAAmBA,CAAA;IACrB,MAAMC,UAAU,GAAmB,EAAE;IACrC,KAAK,MAAM,CAACrC,OAAO,EAAE9B,OAAO,CAAC,IAAI,IAAI,CAACiC,WAAW,EAAE;MACjD,IAAIvD,MAAM,CAACiF,MAAM,CAAC3D,OAAO,CAAC,EAAE;QAC1BmE,UAAU,CAAC9D,IAAI,CAACyB,OAAO,CAAC;MAC1B;IACF;IACA,OAAOqC,UAAU;EACnB;EAEAC,gBAAgBA,CAAC7C,KAAa;IAC5B,MAAMqC,QAAQ,GAAkB,EAAE;IAClC,MAAM3B,WAAW,GAAG,IAAI,CAAC/C,MAAM,CAACwC,GAAG,CAACH,KAAK,CAAE;IAC3C,KAAK,MAAM,CAACX,KAAK,EAAEZ,OAAO,CAAC,IAAIiC,WAAW,EAAE;MAC1C,IAAIvD,MAAM,CAACiF,MAAM,CAAC3D,OAAO,CAAC,EAAE;QAC1B4D,QAAQ,CAACvD,IAAI,CAACO,KAAK,CAAC;MACtB;IACF;IACA,OAAOgD,QAAQ;EACjB;EAEA,IAAYR,cAAcA,CAAA;IACxB,MAAMA,cAAc,GAAkB,EAAE;IACxC,KAAK,MAAM,GAAGN,IAAI,CAAC,IAAI,IAAI,CAAC9D,UAAU,EAAE;MACtCoE,cAAc,CAAC/C,IAAI,CAACyC,IAAI,CAAC7C,MAAM,CAAC2C,OAAO,CAAC;IAC1C;IACA,OAAOQ,cAAc;EACvB;;AAQF;AACA,OAAO,MAAM/B,kBAAkB,GAAIpB,MAA0B,IAAyBA,MAAM;AAE5F;AACA,OAAM,SAAUoE,oCAAoCA,CAACC,KAAY,EAAE/C,KAAa;EAK9E,OAAOgD,cAAc,CAACD,KAAK,CAACF,gBAAgB,CAAC7C,KAAK,CAAC,EAAE+C,KAAK,EAAE/C,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7E;AAEA,MAAMiD,eAAe,gBAA0C7F,KAAK,CAAC8F,OAAO,cAC1E9F,KAAK,CAAC+F,QAAQ,CAAC/F,KAAK,CAACgG,MAAM,EAAE,CAAC,GAAGzF,MAAM,CAAC,KAAKA,MAAM,CAAC,eACpDP,KAAK,CAAC+F,QAAQ,CAAC/F,KAAK,CAACgG,MAAM,EAAE,CAAC,IAAKrD,YAAY,CAAC,KAAKA,YAAY,CAAC,CACnE;AAED;AACA,OAAM,SAAUsD,oCAAoCA,CAACN,KAAY,EAAE/C,KAAa,EAAEsD,IAAY;EAK5F,MAAMvB,eAAe,GAAGgB,KAAK,CAAChB,eAAe,CAAC/B,KAAK,CAAC;EACpD,MAAMmB,UAAU,GAAG4B,KAAK,CAAC5B,UAAU;EACnC,MAAMoC,qBAAqB,GAAG1G,GAAG,CAACyB,KAAK,EAAyD;EAEhG,MAAMkF,WAAW,GAAGT,KAAK,CAACrF,OAAO,CAACyC,GAAG,CAACH,KAAK,CAAE;EAC7C,MAAMyD,WAAW,GAAGV,KAAK,CAACpF,MAAM,CAACwC,GAAG,CAACH,KAAK,CAAE;EAE5C,IAAI+C,KAAK,CAACtB,qBAAqB,CAACN,UAAU,CAAC,EAAE;IAC3C,MAAMqB,sBAAsB,GAAGO,KAAK,CAACP,sBAAsB,CAACxC,KAAK,CAAC;IAClE/C,cAAc,CAACuB,OAAO,CAACuD,eAAe,EAAGpE,MAAM,IAAI;MACjD;MACA,MAAM+F,WAAW,GAAGC,IAAI,CAAChC,GAAG,CAAC,CAAC,EAAEhE,MAAM,CAACyD,IAAI,GAAGoB,sBAAsB,CAAC;MACrE,KAAK,MAAMnD,KAAK,IAAIuE,UAAU,CAACjG,MAAM,EAAE+F,WAAW,CAAC,EAAE;QACnD,MAAMG,YAAY,GAAGJ,WAAW,CAACtD,GAAG,CAACd,KAAK,CAAC,IAAIlC,MAAM,CAAC0D,IAAI,EAAE;QAC5D,IAAI1D,MAAM,CAACiF,MAAM,CAACyB,YAAY,CAAC,EAAE;UAC/BN,qBAAqB,CAACzE,IAAI,CAAC,CAACO,KAAK,EAAEyE,MAAM,CAACC,gBAAgB,EAAED,MAAM,CAACC,gBAAgB,CAAC,CAAC;UACrF;QACF;QACA,MAAMtF,OAAO,GAAGoF,YAAY,CAACrE,KAAK;QAClC+D,qBAAqB,CAACzE,IAAI,CAAC,CACzBO,KAAK,EACLlC,MAAM,CAAC6G,KAAK,CAAC/G,cAAc,CAACkD,GAAG,CAAC4B,eAAe,EAAEtD,OAAO,CAAC,EAAE;UACzDwF,MAAM,EAAEA,CAAA,KAAMH,MAAM,CAACC,gBAAgB;UACrCG,MAAM,EAAGvG,MAAM,IAAK,CAACA,MAAM,CAACyD;SAC7B,CAAC,EACFjE,MAAM,CAAC6G,KAAK,CAAC/G,cAAc,CAACkD,GAAG,CAACqD,WAAW,EAAE/E,OAAO,CAAC,EAAE;UACrDwF,MAAM,EAAEA,CAAA,KAAMH,MAAM,CAACC,gBAAgB;UACrCG,MAAM,EAAG3C,IAAI,IAAKA,IAAI,CAACxB;SACxB,CAAC,CACH,CAAC;MACJ;IACF,CAAC,CAAC;EACJ;EAEA,MAAMoE,uBAAuB,GAAGZ,qBAAqB,CAACa,IAAI,CAACnB,eAAe,CAAC,CAACtE,GAAG,CAAC,CAAC,CAACU,KAAK,CAAC,KAAKA,KAAK,CAAC;EAEnG,OAAO2D,cAAc,CAACmB,uBAAuB,EAAEpB,KAAK,EAAE/C,KAAK,EAAE,KAAK,EAAEsD,IAAI,EAAEvB,eAAe,EAAEZ,UAAU,CAAC;AACxG;AAEA,SAAS6B,cAAcA,CACrBqB,iBAAwC,EACxCtB,KAAY,EACZ/C,KAAa,EACbsE,SAAkB,EAClBhB,IAAY,EACZvB,eAAe,GAAGgB,KAAK,CAAChB,eAAe,CAAC/B,KAAK,CAAC,EAC9CuE,eAAe,GAAGxB,KAAK,CAAC5B,UAAU;EAMlC,MAAMqD,kBAAkB,GAAGvH,cAAc,CAACqB,KAAK,EAA8B;EAC7E,MAAMmG,aAAa,GAAGxH,cAAc,CAACqB,KAAK,EAA8B;EACxE,MAAMoG,OAAO,GAAGxH,cAAc,CAACoB,KAAK,EAAiB;EAErD,IAAInB,MAAM,CAACiF,MAAM,CAACmC,eAAe,CAAC,EAAE;IAClC,OAAO,CAACC,kBAAkB,EAAEC,aAAa,EAAEC,OAAO,CAAC;EACrD;EACA,MAAMvD,UAAU,GAAGoD,eAAe,CAAC/E,KAAK;EAExC,MAAMgE,WAAW,GAAGT,KAAK,CAACrF,OAAO,CAACyC,GAAG,CAACH,KAAK,CAAE;EAC7C,MAAMyD,WAAW,GAAGV,KAAK,CAACpF,MAAM,CAACwC,GAAG,CAACH,KAAK,CAAE;EAE5C,KAAK,MAAMO,OAAO,IAAI8D,iBAAiB,EAAE;IACvC;IACA,IAAIM,SAAoC;IACxC,IAAIC,eAAwC;IAE5C,KAAK,MAAM,CAACnG,OAAO,EAAEd,MAAM,CAAC,IAAIoE,eAAe,EAAE;MAC/C;MACA,MAAM8C,eAAe,GAAG5H,cAAc,CAACkD,GAAG,CAACqD,WAAW,EAAE/E,OAAO,CAAC;MAChE,IAAItB,MAAM,CAACiF,MAAM,CAACyC,eAAe,CAAC,EAAE;MACpC,MAAMC,UAAU,GAAGD,eAAe,CAACrF,KAAK;MACxC,IAAIsF,UAAU,CAACpG,MAAM,CAAC2C,OAAO,KAAKF,UAAU,EAAE;MAE9C;MACA,IAAIlE,cAAc,CAACsC,GAAG,CAACkF,aAAa,EAAEhG,OAAO,CAAC,EAAE;MAEhD;MACA;MACA,IAAI,CAAC6F,SAAS,EAAE;QACd,MAAMS,eAAe,GAAG5H,MAAM,CAACmF,cAAc,CAACrF,cAAc,CAACkD,GAAG,CAACqE,kBAAkB,EAAE/F,OAAO,CAAC,CAAC,EAAE2C,IAAI,IAAI,CAAC;QACzG,IAAI2D,eAAe,IAAItB,WAAW,CAACrC,IAAI,GAAGkC,IAAI,EAAE;MAClD;MAEA,IAAIqB,SAAS,KAAKrD,SAAS,IAAI3D,MAAM,CAACyD,IAAI,GAAGwD,eAAgB,CAACxD,IAAI,EAAE;QAClEuD,SAAS,GAAGlG,OAAO;QACnBmG,eAAe,GAAGjH,MAAM;MAC1B;IACF;IACA,IAAI,CAACgH,SAAS,IAAI,CAACC,eAAe,EAAE;IAEpC;IACA,MAAMI,SAAS,GAAG7H,MAAM,CAACmF,cAAc,CAACmB,WAAW,CAACtD,GAAG,CAACI,OAAO,CAAC,IAAIpD,MAAM,CAAC0D,IAAI,EAAE,CAAC;IAClF,IAAImE,SAAS,IAAIA,SAAS,CAACC,QAAQ,EAAE,KAAKN,SAAS,CAACM,QAAQ,EAAE,EAAE;MAC9D;IACF;IACA,MAAMC,SAAS,GAAGF,SAAS,IAAI7H,MAAM,CAACmF,cAAc,CAACrF,cAAc,CAACkD,GAAG,CAAC4B,eAAe,EAAEiD,SAAS,CAAC,CAAC;IAEpG;IACA;IACA,IAAIE,SAAS,IAAIN,eAAe,CAACxD,IAAI,GAAG,CAAC,IAAI8D,SAAS,CAAC9D,IAAI,EAAE;IAE7D;IACAnE,cAAc,CAACkI,QAAQ,CACrBX,kBAAkB,EAClBG,SAAS,EACTxH,MAAM,CAAC6G,KAAK,CAAC;MACXC,MAAM,EAAEA,CAAA,KAAM9G,MAAM,CAACqE,IAAI,CAAC,IAAIW,GAAG,CAAC,CAAC5B,OAAO,CAAC,CAAC,CAAC;MAC7C2D,MAAM,EAAGvG,MAAM,IAAI;QACjBA,MAAM,CAAC4E,GAAG,CAAChC,OAAO,CAAC;QACnB,OAAOpD,MAAM,CAACqE,IAAI,CAAC7D,MAAM,CAAC;MAC5B;KACD,CAAC,CACH;IACD,IAAIqH,SAAS,EAAE;MACb/H,cAAc,CAACkI,QAAQ,CACrBV,aAAa,EACbO,SAAS,EACT7H,MAAM,CAAC6G,KAAK,CAAC;QACXC,MAAM,EAAEA,CAAA,KAAM9G,MAAM,CAACqE,IAAI,CAAC,IAAIW,GAAG,CAAC,CAAC5B,OAAO,CAAC,CAAC,CAAC;QAC7C2D,MAAM,EAAGvG,MAAM,IAAI;UACjBA,MAAM,CAAC4E,GAAG,CAAChC,OAAO,CAAC;UACnB,OAAOpD,MAAM,CAACqE,IAAI,CAAC7D,MAAM,CAAC;QAC5B;OACD,CAAC,CACH;IACH;IAEA;IACAiH,eAAe,CAACrC,GAAG,CAAChC,OAAO,CAAC;IAC5B,IAAI2E,SAAS,EAAE;MACbA,SAAS,CAACE,MAAM,CAAC7E,OAAO,CAAC;IAC3B;IAEA;IACArD,cAAc,CAACqF,GAAG,CAACmC,OAAO,EAAEC,SAAS,CAAC;IACtC,IAAIK,SAAS,EAAE9H,cAAc,CAACqF,GAAG,CAACmC,OAAO,EAAEM,SAAS,CAAC;EACvD;EAEA,OAAO,CAACR,kBAAkB,EAAEC,aAAa,EAAEC,OAAO,CAAC;AACrD;AAEA,SAASd,UAAUA,CAAIyB,IAAiB,EAAE/E,CAAS;EACjD,MAAMgF,KAAK,GAAGC,KAAK,CAACC,IAAI,CAACH,IAAI,CAAC;EAC9B,IAAII,YAAY,GAAGH,KAAK,CAACrG,MAAM;EAC/B,OAAOwG,YAAY,IAAI,CAAC,EAAE;IACxB,MAAMC,WAAW,GAAG/B,IAAI,CAACgC,KAAK,CAAChC,IAAI,CAACiC,MAAM,EAAE,GAAGH,YAAY,CAAC;IAC5DA,YAAY,GAAGA,YAAY,GAAG,CAAC;IAC/BI,IAAI,CAACP,KAAK,EAAEG,YAAY,EAAEC,WAAW,CAAC;EACxC;EACA,OAAOpF,CAAC,GAAGgF,KAAK,CAACrG,MAAM,GAAGqG,KAAK,CAACQ,KAAK,CAAC,CAAC,EAAExF,CAAC,CAAC,GAAGgF,KAAK;AACrD;AAEA,SAASO,IAAIA,CAAIP,KAAe,EAAES,CAAS,EAAEC,CAAS;EACpD,MAAMC,GAAG,GAAGX,KAAK,CAACS,CAAC,CAAC;EACpBT,KAAK,CAACS,CAAC,CAAC,GAAGT,KAAK,CAACU,CAAC,CAAC;EACnBV,KAAK,CAACU,CAAC,CAAC,GAAGC,GAAG;EACd,OAAOX,KAAK;AACd;AAEA;AACA,OAAO,MAAMY,YAAY,GAAGA,CAC1Bb,IAAwE,EACxEc,GAAM,EACNjF,MAAmB,KACjB;EACF,MAAMkF,IAAI,GAAGnJ,cAAc,CAACkD,GAAG,CAACkF,IAAI,EAAEc,GAAG,CAAC;EAC1C,IAAIhJ,MAAM,CAACmC,MAAM,CAAC8G,IAAI,CAAC,EAAE;IACvB,KAAK,MAAM5G,KAAK,IAAI0B,MAAM,EAAE;MAC1BhE,cAAc,CAACqF,GAAG,CAAC6D,IAAI,CAAC5G,KAAK,EAAEA,KAAK,CAAC;IACvC;EACF,CAAC,MAAM;IACLvC,cAAc,CAAC4B,GAAG,CAACwG,IAAI,EAAEc,GAAG,EAAEjJ,cAAc,CAACmJ,YAAY,CAACnF,MAAM,CAAC,CAAC;EACpE;AACF,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/cluster",
3
- "version": "0.37.1",
3
+ "version": "0.38.0",
4
4
  "description": "Unified interfaces for common cluster-specific services",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -11,10 +11,10 @@
11
11
  "sideEffects": [],
12
12
  "homepage": "https://effect.website",
13
13
  "peerDependencies": {
14
- "@effect/platform": "^0.84.4",
15
- "@effect/rpc": "^0.61.4",
16
- "@effect/sql": "^0.37.4",
17
- "@effect/workflow": "^0.1.1",
14
+ "@effect/platform": "^0.84.5",
15
+ "@effect/rpc": "^0.61.5",
16
+ "@effect/sql": "^0.37.5",
17
+ "@effect/workflow": "^0.1.2",
18
18
  "effect": "^3.16.3"
19
19
  },
20
20
  "publishConfig": {
@@ -30,6 +30,11 @@
30
30
  "import": "./dist/esm/index.js",
31
31
  "default": "./dist/cjs/index.js"
32
32
  },
33
+ "./ClusterCron": {
34
+ "types": "./dist/dts/ClusterCron.d.ts",
35
+ "import": "./dist/esm/ClusterCron.js",
36
+ "default": "./dist/cjs/ClusterCron.js"
37
+ },
33
38
  "./ClusterError": {
34
39
  "types": "./dist/dts/ClusterError.d.ts",
35
40
  "import": "./dist/esm/ClusterError.js",
@@ -218,6 +223,9 @@
218
223
  },
219
224
  "typesVersions": {
220
225
  "*": {
226
+ "ClusterCron": [
227
+ "./dist/dts/ClusterCron.d.ts"
228
+ ],
221
229
  "ClusterError": [
222
230
  "./dist/dts/ClusterError.d.ts"
223
231
  ],
@@ -0,0 +1,129 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Rpc from "@effect/rpc/Rpc"
5
+ import * as Cron from "effect/Cron"
6
+ import * as DateTime from "effect/DateTime"
7
+ import * as Duration from "effect/Duration"
8
+ import * as Effect from "effect/Effect"
9
+ import * as Layer from "effect/Layer"
10
+ import * as Option from "effect/Option"
11
+ import * as PrimaryKey from "effect/PrimaryKey"
12
+ import * as Schedule from "effect/Schedule"
13
+ import * as Schema from "effect/Schema"
14
+ import type { Scope } from "effect/Scope"
15
+ import * as ClusterSchema from "./ClusterSchema.js"
16
+ import { Persisted, Uninterruptible } from "./ClusterSchema.js"
17
+ import * as DeliverAt from "./DeliverAt.js"
18
+ import * as Entity from "./Entity.js"
19
+ import type { Sharding } from "./Sharding.js"
20
+ import * as Singleton from "./Singleton.js"
21
+
22
+ /**
23
+ * @since 1.0.0
24
+ * @category Constructors
25
+ */
26
+ export const make = <E, R>(options: {
27
+ readonly name: string
28
+ readonly cron: Cron.Cron
29
+ readonly execute: Effect.Effect<void, E, R>
30
+
31
+ /**
32
+ * Choose a shard group to run this cron job on.
33
+ */
34
+ readonly shardGroup?: string | undefined
35
+
36
+ /**
37
+ * Whether to run the next cron job based from the time of the previous run.
38
+ *
39
+ * Defaults to `false`, meaning the next run will be calculated from the
40
+ * current time.
41
+ */
42
+ readonly calculateNextRunFromPrevious?: boolean | undefined
43
+
44
+ /**
45
+ * If set, the cron job will skip execution if the scheduled time is older
46
+ * than this duration.
47
+ *
48
+ * This is useful to prevent running jobs that were scheduled too far in the
49
+ * past.
50
+ *
51
+ * Defaults to "1 day".
52
+ */
53
+ readonly skipIfOlderThan?: Duration.DurationInput | undefined
54
+ }): Layer.Layer<never, never, Sharding | Exclude<R, Scope>> => {
55
+ const CronEntity = Entity.make(`ClusterCron/${options.name}`, [
56
+ Rpc.make("run", {
57
+ payload: CronPayload
58
+ })
59
+ .annotate(Persisted, true)
60
+ .annotate(Uninterruptible, true)
61
+ ]).annotate(ClusterSchema.ShardGroup, () => options.shardGroup ?? "default")
62
+
63
+ const InitialRun = Singleton.make(
64
+ `ClusterCron/${options.name}`,
65
+ Effect.gen(function*() {
66
+ const client = (yield* CronEntity.client)("initial")
67
+ const now = yield* DateTime.now
68
+ const next = Cron.next(options.cron, now)
69
+ yield* client.run({
70
+ dateTime: DateTime.unsafeFromDate(next)
71
+ }, { discard: true })
72
+ }),
73
+ { shardGroup: options.shardGroup }
74
+ )
75
+
76
+ const skipIfOlderThan = Option.fromNullable(options.skipIfOlderThan).pipe(
77
+ Option.map(Duration.decode),
78
+ Option.getOrElse(() => Duration.days(1))
79
+ )
80
+
81
+ const effect = Effect.fnUntraced(function*(dateTime: DateTime.Utc) {
82
+ const now = yield* DateTime.now
83
+ if (DateTime.lessThan(dateTime, DateTime.subtractDuration(now, skipIfOlderThan))) {
84
+ return
85
+ }
86
+ return yield* options.execute
87
+ }, Effect.orDie)
88
+
89
+ const EntityLayer = CronEntity.toLayer(Effect.gen(function*() {
90
+ const makeClient = yield* CronEntity.client
91
+ return {
92
+ run(request) {
93
+ return Effect.ensuring(
94
+ effect(request.payload.dateTime),
95
+ Effect.gen(function*() {
96
+ const now = yield* DateTime.now
97
+ const next = DateTime.unsafeFromDate(Cron.next(
98
+ options.cron,
99
+ options.calculateNextRunFromPrevious ? request.payload.dateTime : now
100
+ ))
101
+ const client = makeClient(DateTime.formatIso(next))
102
+ return yield* client.run({ dateTime: next }, { discard: true })
103
+ }).pipe(
104
+ Effect.sandbox,
105
+ Effect.retry(retryPolicy),
106
+ Effect.orDie
107
+ )
108
+ )
109
+ }
110
+ }
111
+ }))
112
+
113
+ return Layer.merge(InitialRun, EntityLayer)
114
+ }
115
+
116
+ const retryPolicy = Schedule.exponential(200, 1.5).pipe(
117
+ Schedule.union(Schedule.spaced("1 minute"))
118
+ )
119
+
120
+ class CronPayload extends Schema.Class<CronPayload>("@effect/cluster/ClusterCron/CronPayload")({
121
+ dateTime: Schema.DateTimeUtc
122
+ }) {
123
+ [PrimaryKey.symbol]() {
124
+ return ""
125
+ }
126
+ [DeliverAt.symbol]() {
127
+ return this.dateTime
128
+ }
129
+ }
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import * as Context from "effect/Context"
5
5
  import { constFalse } from "effect/Function"
6
+ import type { EntityId } from "./EntityId.js"
6
7
 
7
8
  /**
8
9
  * @since 1.0.0
@@ -21,3 +22,11 @@ export class Uninterruptible
21
22
  defaultValue: constFalse
22
23
  })
23
24
  {}
25
+
26
+ /**
27
+ * @since 1.0.0
28
+ * @category Annotations
29
+ */
30
+ export class ShardGroup extends Context.Reference<ShardGroup>()("@effect/cluster/ClusterSchema/ShardGroup", {
31
+ defaultValue: (): (entityId: EntityId) => string => (_) => "default"
32
+ }) {}