@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
package/src/Runners.ts CHANGED
@@ -17,13 +17,7 @@ import * as RcMap from "effect/RcMap"
17
17
  import * as Schema from "effect/Schema"
18
18
  import type { Scope } from "effect/Scope"
19
19
  import type { PersistenceError } from "./ClusterError.js"
20
- import {
21
- AlreadyProcessingMessage,
22
- EntityNotAssignedToRunner,
23
- EntityNotManagedByRunner,
24
- MailboxFull,
25
- RunnerUnavailable
26
- } from "./ClusterError.js"
20
+ import { AlreadyProcessingMessage, EntityNotAssignedToRunner, MailboxFull, RunnerUnavailable } from "./ClusterError.js"
27
21
  import { Persisted } from "./ClusterSchema.js"
28
22
  import * as Envelope from "./Envelope.js"
29
23
  import * as Message from "./Message.js"
@@ -56,13 +50,13 @@ export class Runners extends Context.Tag("@effect/cluster/Runners")<Runners, {
56
50
  message: Message.IncomingLocal<Rpc>
57
51
  ) => Effect.Effect<
58
52
  void,
59
- EntityNotManagedByRunner | EntityNotAssignedToRunner | MailboxFull | AlreadyProcessingMessage
53
+ EntityNotAssignedToRunner | MailboxFull | AlreadyProcessingMessage
60
54
  >
61
55
  readonly simulateRemoteSerialization: boolean
62
56
  }
63
57
  ) => Effect.Effect<
64
58
  void,
65
- EntityNotManagedByRunner | EntityNotAssignedToRunner | MailboxFull | AlreadyProcessingMessage | PersistenceError
59
+ EntityNotAssignedToRunner | MailboxFull | AlreadyProcessingMessage | PersistenceError
66
60
  >
67
61
 
68
62
  /**
@@ -75,7 +69,6 @@ export class Runners extends Context.Tag("@effect/cluster/Runners")<Runners, {
75
69
  }
76
70
  ) => Effect.Effect<
77
71
  void,
78
- | EntityNotManagedByRunner
79
72
  | EntityNotAssignedToRunner
80
73
  | RunnerUnavailable
81
74
  | MailboxFull
@@ -92,7 +85,7 @@ export class Runners extends Context.Tag("@effect/cluster/Runners")<Runners, {
92
85
  readonly message: Message.Outgoing<R>
93
86
  readonly discard: boolean
94
87
  }
95
- ) => Effect.Effect<void, EntityNotManagedByRunner | PersistenceError>
88
+ ) => Effect.Effect<void, PersistenceError>
96
89
 
97
90
  /**
98
91
  * Notify the current Runner that a message is available, then read replies from
@@ -106,11 +99,16 @@ export class Runners extends Context.Tag("@effect/cluster/Runners")<Runners, {
106
99
  readonly message: Message.Outgoing<R>
107
100
  readonly notify: (
108
101
  options: Message.IncomingLocal<any>
109
- ) => Effect.Effect<void, EntityNotManagedByRunner | EntityNotAssignedToRunner>
102
+ ) => Effect.Effect<void, EntityNotAssignedToRunner>
110
103
  readonly discard: boolean
111
104
  readonly storageOnly?: boolean | undefined
112
105
  }
113
- ) => Effect.Effect<void, EntityNotManagedByRunner | PersistenceError>
106
+ ) => Effect.Effect<void, PersistenceError>
107
+
108
+ /**
109
+ * Mark a Runner as unavailable.
110
+ */
111
+ readonly onRunnerUnavailable: (address: RunnerAddress) => Effect.Effect<void>
114
112
  }>() {}
115
113
 
116
114
  /**
@@ -243,6 +241,7 @@ export const make: (options: Omit<Runners["Type"], "sendLocal" | "notifyLocal">)
243
241
  for (const message of entry.messages) {
244
242
  yield* message.respond(reply)
245
243
  }
244
+ // wait for ack
246
245
  yield* entry.latch.await
247
246
  }
248
247
  entry.replies = []
@@ -266,6 +265,8 @@ export const make: (options: Omit<Runners["Type"], "sendLocal" | "notifyLocal">)
266
265
  const storageLatch = Effect.unsafeMakeLatch(false)
267
266
  if (storage !== MessageStorage.noop) {
268
267
  yield* Effect.gen(function*() {
268
+ const foundRequests = new Set<StorageRequestEntry>()
269
+
269
270
  while (true) {
270
271
  yield* storageLatch.await
271
272
  storageLatch.unsafeClose()
@@ -283,8 +284,6 @@ export const make: (options: Omit<Runners["Type"], "sendLocal" | "notifyLocal">)
283
284
  )
284
285
  )
285
286
 
286
- const foundRequests = new Set<StorageRequestEntry>()
287
-
288
287
  // put the replies into the storage requests and then open the latches
289
288
  for (let i = 0; i < replies.length; i++) {
290
289
  const reply = replies[i]
@@ -296,6 +295,7 @@ export const make: (options: Omit<Runners["Type"], "sendLocal" | "notifyLocal">)
296
295
  }
297
296
 
298
297
  foundRequests.forEach((entry) => entry.latch.unsafeOpen())
298
+ foundRequests.clear()
299
299
  }
300
300
  }).pipe(
301
301
  Effect.interruptible,
@@ -350,12 +350,7 @@ export const make: (options: Omit<Runners["Type"], "sendLocal" | "notifyLocal">)
350
350
  address: options_.address.value,
351
351
  message
352
352
  }),
353
- (error) => {
354
- if (error._tag === "EntityNotManagedByRunner") {
355
- return Effect.fail(error)
356
- }
357
- return replyFromStorage(message)
358
- }
353
+ (_) => replyFromStorage(message)
359
354
  )
360
355
  }
361
356
  return options.notify(options_).pipe(
@@ -372,17 +367,9 @@ export const make: (options: Omit<Runners["Type"], "sendLocal" | "notifyLocal">)
372
367
  () => Effect.void
373
368
  )
374
369
  } else if (!duplicate && options.storageOnly !== true) {
375
- return storage.registerReplyHandler(
376
- message,
377
- Effect.suspend(() =>
378
- replyFromStorage(message).pipe(
379
- Effect.forkIn(runnersScope),
380
- Effect.interruptible
381
- )
382
- )
383
- ).pipe(
384
- Effect.andThen(options.notify(Message.incomingLocalFromOutgoing(message))),
385
- Effect.catchTag("EntityNotAssignedToRunner", () => Effect.void)
370
+ return options.notify(Message.incomingLocalFromOutgoing(message)).pipe(
371
+ Effect.andThen(storage.registerReplyHandler(message)),
372
+ Effect.catchTag("EntityNotAssignedToRunner", () => replyFromStorage(message))
386
373
  )
387
374
  }
388
375
  return options.notify(Message.incomingLocalFromOutgoing(message)).pipe(
@@ -403,9 +390,10 @@ export const makeNoop: Effect.Effect<
403
390
  never,
404
391
  MessageStorage.MessageStorage | Snowflake.Generator | ShardingConfig | Scope
405
392
  > = make({
406
- send: ({ message }) => Effect.fail(new EntityNotManagedByRunner({ address: message.envelope.address })),
393
+ send: ({ message }) => Effect.fail(new EntityNotAssignedToRunner({ address: message.envelope.address })),
407
394
  notify: () => Effect.void,
408
- ping: () => Effect.void
395
+ ping: () => Effect.void,
396
+ onRunnerUnavailable: () => Effect.void
409
397
  })
410
398
 
411
399
  /**
@@ -419,12 +407,10 @@ export const layerNoop: Layer.Layer<
419
407
  > = Layer.scoped(Runners, makeNoop).pipe(Layer.provide([Snowflake.layerGenerator]))
420
408
 
421
409
  const rpcErrors: Schema.Union<[
422
- typeof EntityNotManagedByRunner,
423
410
  typeof EntityNotAssignedToRunner,
424
411
  typeof MailboxFull,
425
412
  typeof AlreadyProcessingMessage
426
413
  ]> = Schema.Union(
427
- EntityNotManagedByRunner,
428
414
  EntityNotAssignedToRunner,
429
415
  MailboxFull,
430
416
  AlreadyProcessingMessage
@@ -441,7 +427,7 @@ export class Rpcs extends RpcGroup.make(
441
427
  envelope: Envelope.PartialEncoded
442
428
  },
443
429
  success: Schema.Void,
444
- error: Schema.Union(EntityNotManagedByRunner, EntityNotAssignedToRunner, AlreadyProcessingMessage)
430
+ error: Schema.Union(EntityNotAssignedToRunner, AlreadyProcessingMessage)
445
431
  }),
446
432
  Rpc.make("Effect", {
447
433
  payload: {
@@ -510,7 +496,12 @@ export const makeRpc: Effect.Effect<
510
496
  ping(address) {
511
497
  return RcMap.get(clients, address).pipe(
512
498
  Effect.flatMap((client) => client.Ping()),
513
- Effect.catchAllCause(() => Effect.fail(new RunnerUnavailable({ address }))),
499
+ Effect.catchAllCause(() => {
500
+ return Effect.zipRight(
501
+ RcMap.invalidate(clients, address),
502
+ Effect.fail(new RunnerUnavailable({ address }))
503
+ )
504
+ }),
514
505
  Effect.scoped
515
506
  )
516
507
  },
@@ -603,14 +594,10 @@ export const makeRpc: Effect.Effect<
603
594
  return RcMap.get(clients, address.value).pipe(
604
595
  Effect.flatMap((client) => client.Notify({ envelope })),
605
596
  Effect.scoped,
606
- Effect.catchAll((error) => {
607
- if (error._tag === "EntityNotManagedByRunner") {
608
- return Effect.fail(error)
609
- }
610
- return Effect.void
611
- })
597
+ Effect.ignore
612
598
  )
613
- }
599
+ },
600
+ onRunnerUnavailable: (address) => RcMap.invalidate(clients, address)
614
601
  })
615
602
  })
616
603
 
package/src/ShardId.ts CHANGED
@@ -23,7 +23,17 @@ const constDisableValidation = { disableValidation: true }
23
23
  * @since 1.0.0
24
24
  * @category Constructors
25
25
  */
26
- export const make = (group: string, id: number): ShardId => new ShardId({ group, id }, constDisableValidation)
26
+ export const make = (group: string, id: number): ShardId => {
27
+ const key = `${group}:${id}`
28
+ let shardId = shardIdCache.get(key)
29
+ if (!shardId) {
30
+ shardId = new ShardId({ group, id }, constDisableValidation)
31
+ shardIdCache.set(key, shardId)
32
+ }
33
+ return shardId
34
+ }
35
+
36
+ const shardIdCache = new Map<string, ShardId>()
27
37
 
28
38
  /**
29
39
  * @since 1.0.0
@@ -89,9 +99,10 @@ export class ShardId extends S.Class<ShardId>("@effect/cluster/ShardId")({
89
99
  }
90
100
 
91
101
  /**
92
- * @since 1.0.0
102
+ * @since 4.0.0
93
103
  */
94
104
  static fromString(s: string): ShardId {
95
- return new ShardId(ShardId.fromStringEncoded(s), constDisableValidation)
105
+ const encoded = ShardId.fromStringEncoded(s)
106
+ return make(encoded.group, encoded.id)
96
107
  }
97
108
  }