@effect/cluster 0.0.0-snapshot-d33d8b050b8e3c87dcde9587083e6c1cf733f72b
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/AtLeastOnce/package.json +6 -0
- package/AtLeastOnceStorage/package.json +6 -0
- package/Broadcaster/package.json +6 -0
- package/LICENSE +21 -0
- package/ManagerConfig/package.json +6 -0
- package/Message/package.json +6 -0
- package/MessageState/package.json +6 -0
- package/Messenger/package.json +6 -0
- package/Pod/package.json +6 -0
- package/PodAddress/package.json +6 -0
- package/Pods/package.json +6 -0
- package/PodsHealth/package.json +6 -0
- package/PoisonPill/package.json +6 -0
- package/README.md +3 -0
- package/RecipientAddress/package.json +6 -0
- package/RecipientBehaviour/package.json +6 -0
- package/RecipientBehaviourContext/package.json +6 -0
- package/RecipientType/package.json +6 -0
- package/Serialization/package.json +6 -0
- package/SerializedEnvelope/package.json +6 -0
- package/SerializedMessage/package.json +6 -0
- package/ShardId/package.json +6 -0
- package/ShardManager/package.json +6 -0
- package/ShardManagerClient/package.json +6 -0
- package/Sharding/package.json +6 -0
- package/ShardingConfig/package.json +6 -0
- package/ShardingEvent/package.json +6 -0
- package/ShardingException/package.json +6 -0
- package/ShardingRegistrationEvent/package.json +6 -0
- package/Storage/package.json +6 -0
- package/dist/cjs/AtLeastOnce.js +43 -0
- package/dist/cjs/AtLeastOnce.js.map +1 -0
- package/dist/cjs/AtLeastOnceStorage.js +48 -0
- package/dist/cjs/AtLeastOnceStorage.js.map +1 -0
- package/dist/cjs/Broadcaster.js +6 -0
- package/dist/cjs/Broadcaster.js.map +1 -0
- package/dist/cjs/ManagerConfig.js +57 -0
- package/dist/cjs/ManagerConfig.js.map +1 -0
- package/dist/cjs/Message.js +64 -0
- package/dist/cjs/Message.js.map +1 -0
- package/dist/cjs/MessageState.js +78 -0
- package/dist/cjs/MessageState.js.map +1 -0
- package/dist/cjs/Messenger.js +6 -0
- package/dist/cjs/Messenger.js.map +1 -0
- package/dist/cjs/Pod.js +101 -0
- package/dist/cjs/Pod.js.map +1 -0
- package/dist/cjs/PodAddress.js +100 -0
- package/dist/cjs/PodAddress.js.map +1 -0
- package/dist/cjs/Pods.js +58 -0
- package/dist/cjs/Pods.js.map +1 -0
- package/dist/cjs/PodsHealth.js +64 -0
- package/dist/cjs/PodsHealth.js.map +1 -0
- package/dist/cjs/PoisonPill.js +101 -0
- package/dist/cjs/PoisonPill.js.map +1 -0
- package/dist/cjs/RecipientAddress.js +102 -0
- package/dist/cjs/RecipientAddress.js.map +1 -0
- package/dist/cjs/RecipientBehaviour.js +61 -0
- package/dist/cjs/RecipientBehaviour.js.map +1 -0
- package/dist/cjs/RecipientBehaviourContext.js +87 -0
- package/dist/cjs/RecipientBehaviourContext.js.map +1 -0
- package/dist/cjs/RecipientType.js +142 -0
- package/dist/cjs/RecipientType.js.map +1 -0
- package/dist/cjs/Serialization.js +55 -0
- package/dist/cjs/Serialization.js.map +1 -0
- package/dist/cjs/SerializedEnvelope.js +111 -0
- package/dist/cjs/SerializedEnvelope.js.map +1 -0
- package/dist/cjs/SerializedMessage.js +87 -0
- package/dist/cjs/SerializedMessage.js.map +1 -0
- package/dist/cjs/ShardId.js +89 -0
- package/dist/cjs/ShardId.js.map +1 -0
- package/dist/cjs/ShardManager.js +48 -0
- package/dist/cjs/ShardManager.js.map +1 -0
- package/dist/cjs/ShardManagerClient.js +53 -0
- package/dist/cjs/ShardManagerClient.js.map +1 -0
- package/dist/cjs/Sharding.js +129 -0
- package/dist/cjs/Sharding.js.map +1 -0
- package/dist/cjs/ShardingConfig.js +64 -0
- package/dist/cjs/ShardingConfig.js.map +1 -0
- package/dist/cjs/ShardingEvent.js +72 -0
- package/dist/cjs/ShardingEvent.js.map +1 -0
- package/dist/cjs/ShardingException.js +130 -0
- package/dist/cjs/ShardingException.js.map +1 -0
- package/dist/cjs/ShardingRegistrationEvent.js +44 -0
- package/dist/cjs/ShardingRegistrationEvent.js.map +1 -0
- package/dist/cjs/Storage.js +63 -0
- package/dist/cjs/Storage.js.map +1 -0
- package/dist/cjs/index.js +88 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/internal/atLeastOnce.js +58 -0
- package/dist/cjs/internal/atLeastOnce.js.map +1 -0
- package/dist/cjs/internal/atLeastOnceStorage.js +186 -0
- package/dist/cjs/internal/atLeastOnceStorage.js.map +1 -0
- package/dist/cjs/internal/entityManager.js +191 -0
- package/dist/cjs/internal/entityManager.js.map +1 -0
- package/dist/cjs/internal/entityState.js +70 -0
- package/dist/cjs/internal/entityState.js.map +1 -0
- package/dist/cjs/internal/managerConfig.js +69 -0
- package/dist/cjs/internal/managerConfig.js.map +1 -0
- package/dist/cjs/internal/message.js +68 -0
- package/dist/cjs/internal/message.js.map +1 -0
- package/dist/cjs/internal/messageState.js +102 -0
- package/dist/cjs/internal/messageState.js.map +1 -0
- package/dist/cjs/internal/podWithMetadata.js +77 -0
- package/dist/cjs/internal/podWithMetadata.js.map +1 -0
- package/dist/cjs/internal/pods.js +58 -0
- package/dist/cjs/internal/pods.js.map +1 -0
- package/dist/cjs/internal/podsHealth.js +63 -0
- package/dist/cjs/internal/podsHealth.js.map +1 -0
- package/dist/cjs/internal/recipientBehaviour.js +75 -0
- package/dist/cjs/internal/recipientBehaviour.js.map +1 -0
- package/dist/cjs/internal/recipientBehaviourContext.js +59 -0
- package/dist/cjs/internal/recipientBehaviourContext.js.map +1 -0
- package/dist/cjs/internal/serialization.js +72 -0
- package/dist/cjs/internal/serialization.js.map +1 -0
- package/dist/cjs/internal/shardManager.js +291 -0
- package/dist/cjs/internal/shardManager.js.map +1 -0
- package/dist/cjs/internal/shardManagerClient.js +71 -0
- package/dist/cjs/internal/shardManagerClient.js.map +1 -0
- package/dist/cjs/internal/shardManagerState.js +67 -0
- package/dist/cjs/internal/shardManagerState.js.map +1 -0
- package/dist/cjs/internal/sharding.js +329 -0
- package/dist/cjs/internal/sharding.js.map +1 -0
- package/dist/cjs/internal/shardingConfig.js +79 -0
- package/dist/cjs/internal/shardingConfig.js.map +1 -0
- package/dist/cjs/internal/storage.js +75 -0
- package/dist/cjs/internal/storage.js.map +1 -0
- package/dist/cjs/internal/utils.js +92 -0
- package/dist/cjs/internal/utils.js.map +1 -0
- package/dist/dts/AtLeastOnce.d.ts +20 -0
- package/dist/dts/AtLeastOnce.d.ts.map +1 -0
- package/dist/dts/AtLeastOnceStorage.d.ts +75 -0
- package/dist/dts/AtLeastOnceStorage.d.ts.map +1 -0
- package/dist/dts/Broadcaster.d.ts +32 -0
- package/dist/dts/Broadcaster.d.ts.map +1 -0
- package/dist/dts/ManagerConfig.d.ts +61 -0
- package/dist/dts/ManagerConfig.d.ts.map +1 -0
- package/dist/dts/Message.d.ts +106 -0
- package/dist/dts/Message.d.ts.map +1 -0
- package/dist/dts/MessageState.d.ts +107 -0
- package/dist/dts/MessageState.d.ts.map +1 -0
- package/dist/dts/Messenger.d.ts +32 -0
- package/dist/dts/Messenger.d.ts.map +1 -0
- package/dist/dts/Pod.d.ts +81 -0
- package/dist/dts/Pod.d.ts.map +1 -0
- package/dist/dts/PodAddress.d.ts +80 -0
- package/dist/dts/PodAddress.d.ts.map +1 -0
- package/dist/dts/Pods.d.ts +78 -0
- package/dist/dts/Pods.d.ts.map +1 -0
- package/dist/dts/PodsHealth.d.ts +66 -0
- package/dist/dts/PodsHealth.d.ts.map +1 -0
- package/dist/dts/PoisonPill.d.ts +78 -0
- package/dist/dts/PoisonPill.d.ts.map +1 -0
- package/dist/dts/RecipientAddress.d.ts +57 -0
- package/dist/dts/RecipientAddress.d.ts.map +1 -0
- package/dist/dts/RecipientBehaviour.d.ts +72 -0
- package/dist/dts/RecipientBehaviour.d.ts.map +1 -0
- package/dist/dts/RecipientBehaviourContext.d.ts +83 -0
- package/dist/dts/RecipientBehaviourContext.d.ts.map +1 -0
- package/dist/dts/RecipientType.d.ts +96 -0
- package/dist/dts/RecipientType.d.ts.map +1 -0
- package/dist/dts/Serialization.d.ts +58 -0
- package/dist/dts/Serialization.d.ts.map +1 -0
- package/dist/dts/SerializedEnvelope.d.ts +87 -0
- package/dist/dts/SerializedEnvelope.d.ts.map +1 -0
- package/dist/dts/SerializedMessage.d.ts +66 -0
- package/dist/dts/SerializedMessage.d.ts.map +1 -0
- package/dist/dts/ShardId.d.ts +70 -0
- package/dist/dts/ShardId.d.ts.map +1 -0
- package/dist/dts/ShardManager.d.ts +44 -0
- package/dist/dts/ShardManager.d.ts.map +1 -0
- package/dist/dts/ShardManagerClient.d.ts +50 -0
- package/dist/dts/ShardManagerClient.d.ts.map +1 -0
- package/dist/dts/Sharding.d.ts +146 -0
- package/dist/dts/Sharding.d.ts.map +1 -0
- package/dist/dts/ShardingConfig.d.ts +69 -0
- package/dist/dts/ShardingConfig.d.ts.map +1 -0
- package/dist/dts/ShardingEvent.d.ts +90 -0
- package/dist/dts/ShardingEvent.d.ts.map +1 -0
- package/dist/dts/ShardingException.d.ts +125 -0
- package/dist/dts/ShardingException.d.ts.map +1 -0
- package/dist/dts/ShardingRegistrationEvent.d.ts +44 -0
- package/dist/dts/ShardingRegistrationEvent.d.ts.map +1 -0
- package/dist/dts/Storage.d.ts +78 -0
- package/dist/dts/Storage.d.ts.map +1 -0
- package/dist/dts/index.d.ts +113 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/dts/internal/atLeastOnce.d.ts +2 -0
- package/dist/dts/internal/atLeastOnce.d.ts.map +1 -0
- package/dist/dts/internal/atLeastOnceStorage.d.ts +2 -0
- package/dist/dts/internal/atLeastOnceStorage.d.ts.map +1 -0
- package/dist/dts/internal/entityManager.d.ts +2 -0
- package/dist/dts/internal/entityManager.d.ts.map +1 -0
- package/dist/dts/internal/entityState.d.ts +21 -0
- package/dist/dts/internal/entityState.d.ts.map +1 -0
- package/dist/dts/internal/managerConfig.d.ts +2 -0
- package/dist/dts/internal/managerConfig.d.ts.map +1 -0
- package/dist/dts/internal/message.d.ts +9 -0
- package/dist/dts/internal/message.d.ts.map +1 -0
- package/dist/dts/internal/messageState.d.ts +2 -0
- package/dist/dts/internal/messageState.d.ts.map +1 -0
- package/dist/dts/internal/podWithMetadata.d.ts +2 -0
- package/dist/dts/internal/podWithMetadata.d.ts.map +1 -0
- package/dist/dts/internal/pods.d.ts +2 -0
- package/dist/dts/internal/pods.d.ts.map +1 -0
- package/dist/dts/internal/podsHealth.d.ts +2 -0
- package/dist/dts/internal/podsHealth.d.ts.map +1 -0
- package/dist/dts/internal/recipientBehaviour.d.ts +2 -0
- package/dist/dts/internal/recipientBehaviour.d.ts.map +1 -0
- package/dist/dts/internal/recipientBehaviourContext.d.ts +2 -0
- package/dist/dts/internal/recipientBehaviourContext.d.ts.map +1 -0
- package/dist/dts/internal/serialization.d.ts +2 -0
- package/dist/dts/internal/serialization.d.ts.map +1 -0
- package/dist/dts/internal/shardManager.d.ts +12 -0
- package/dist/dts/internal/shardManager.d.ts.map +1 -0
- package/dist/dts/internal/shardManagerClient.d.ts +2 -0
- package/dist/dts/internal/shardManagerClient.d.ts.map +1 -0
- package/dist/dts/internal/shardManagerState.d.ts +26 -0
- package/dist/dts/internal/shardManagerState.d.ts.map +1 -0
- package/dist/dts/internal/sharding.d.ts +2 -0
- package/dist/dts/internal/sharding.d.ts.map +1 -0
- package/dist/dts/internal/shardingConfig.d.ts +2 -0
- package/dist/dts/internal/shardingConfig.d.ts.map +1 -0
- package/dist/dts/internal/storage.d.ts +2 -0
- package/dist/dts/internal/storage.d.ts.map +1 -0
- package/dist/dts/internal/utils.d.ts +2 -0
- package/dist/dts/internal/utils.d.ts.map +1 -0
- package/dist/esm/AtLeastOnce.js +12 -0
- package/dist/esm/AtLeastOnce.js.map +1 -0
- package/dist/esm/AtLeastOnceStorage.js +17 -0
- package/dist/esm/AtLeastOnceStorage.js.map +1 -0
- package/dist/esm/Broadcaster.js +2 -0
- package/dist/esm/Broadcaster.js.map +1 -0
- package/dist/esm/ManagerConfig.js +26 -0
- package/dist/esm/ManagerConfig.js.map +1 -0
- package/dist/esm/Message.js +33 -0
- package/dist/esm/Message.js.map +1 -0
- package/dist/esm/MessageState.js +47 -0
- package/dist/esm/MessageState.js.map +1 -0
- package/dist/esm/Messenger.js +2 -0
- package/dist/esm/Messenger.js.map +1 -0
- package/dist/esm/Pod.js +65 -0
- package/dist/esm/Pod.js.map +1 -0
- package/dist/esm/PodAddress.js +64 -0
- package/dist/esm/PodAddress.js.map +1 -0
- package/dist/esm/Pods.js +27 -0
- package/dist/esm/Pods.js.map +1 -0
- package/dist/esm/PodsHealth.js +33 -0
- package/dist/esm/PodsHealth.js.map +1 -0
- package/dist/esm/PoisonPill.js +65 -0
- package/dist/esm/PoisonPill.js.map +1 -0
- package/dist/esm/RecipientAddress.js +67 -0
- package/dist/esm/RecipientAddress.js.map +1 -0
- package/dist/esm/RecipientBehaviour.js +30 -0
- package/dist/esm/RecipientBehaviour.js.map +1 -0
- package/dist/esm/RecipientBehaviourContext.js +56 -0
- package/dist/esm/RecipientBehaviourContext.js.map +1 -0
- package/dist/esm/RecipientType.js +105 -0
- package/dist/esm/RecipientType.js.map +1 -0
- package/dist/esm/Serialization.js +24 -0
- package/dist/esm/Serialization.js.map +1 -0
- package/dist/esm/SerializedEnvelope.js +75 -0
- package/dist/esm/SerializedEnvelope.js.map +1 -0
- package/dist/esm/SerializedMessage.js +51 -0
- package/dist/esm/SerializedMessage.js.map +1 -0
- package/dist/esm/ShardId.js +54 -0
- package/dist/esm/ShardId.js.map +1 -0
- package/dist/esm/ShardManager.js +17 -0
- package/dist/esm/ShardManager.js.map +1 -0
- package/dist/esm/ShardManagerClient.js +22 -0
- package/dist/esm/ShardManagerClient.js.map +1 -0
- package/dist/esm/Sharding.js +98 -0
- package/dist/esm/Sharding.js.map +1 -0
- package/dist/esm/ShardingConfig.js +33 -0
- package/dist/esm/ShardingConfig.js.map +1 -0
- package/dist/esm/ShardingEvent.js +62 -0
- package/dist/esm/ShardingEvent.js.map +1 -0
- package/dist/esm/ShardingException.js +91 -0
- package/dist/esm/ShardingException.js.map +1 -0
- package/dist/esm/ShardingRegistrationEvent.js +36 -0
- package/dist/esm/ShardingRegistrationEvent.js.map +1 -0
- package/dist/esm/Storage.js +32 -0
- package/dist/esm/Storage.js.map +1 -0
- package/dist/esm/index.js +113 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/atLeastOnce.js +26 -0
- package/dist/esm/internal/atLeastOnce.js.map +1 -0
- package/dist/esm/internal/atLeastOnceStorage.js +154 -0
- package/dist/esm/internal/atLeastOnceStorage.js.map +1 -0
- package/dist/esm/internal/entityManager.js +159 -0
- package/dist/esm/internal/entityManager.js.map +1 -0
- package/dist/esm/internal/entityState.js +35 -0
- package/dist/esm/internal/entityState.js.map +1 -0
- package/dist/esm/internal/managerConfig.js +38 -0
- package/dist/esm/internal/managerConfig.js.map +1 -0
- package/dist/esm/internal/message.js +32 -0
- package/dist/esm/internal/message.js.map +1 -0
- package/dist/esm/internal/messageState.js +66 -0
- package/dist/esm/internal/messageState.js.map +1 -0
- package/dist/esm/internal/podWithMetadata.js +41 -0
- package/dist/esm/internal/podWithMetadata.js.map +1 -0
- package/dist/esm/internal/pods.js +25 -0
- package/dist/esm/internal/pods.js.map +1 -0
- package/dist/esm/internal/podsHealth.js +30 -0
- package/dist/esm/internal/podsHealth.js.map +1 -0
- package/dist/esm/internal/recipientBehaviour.js +42 -0
- package/dist/esm/internal/recipientBehaviour.js.map +1 -0
- package/dist/esm/internal/recipientBehaviourContext.js +26 -0
- package/dist/esm/internal/recipientBehaviourContext.js.map +1 -0
- package/dist/esm/internal/serialization.js +39 -0
- package/dist/esm/internal/serialization.js.map +1 -0
- package/dist/esm/internal/shardManager.js +256 -0
- package/dist/esm/internal/shardManager.js.map +1 -0
- package/dist/esm/internal/shardManagerClient.js +38 -0
- package/dist/esm/internal/shardManagerClient.js.map +1 -0
- package/dist/esm/internal/shardManagerState.js +36 -0
- package/dist/esm/internal/shardManagerState.js.map +1 -0
- package/dist/esm/internal/sharding.js +288 -0
- package/dist/esm/internal/sharding.js.map +1 -0
- package/dist/esm/internal/shardingConfig.js +47 -0
- package/dist/esm/internal/shardingConfig.js.map +1 -0
- package/dist/esm/internal/storage.js +42 -0
- package/dist/esm/internal/storage.js.map +1 -0
- package/dist/esm/internal/utils.js +56 -0
- package/dist/esm/internal/utils.js.map +1 -0
- package/dist/esm/package.json +4 -0
- package/package.json +259 -0
- package/src/AtLeastOnce.ts +28 -0
- package/src/AtLeastOnceStorage.ts +96 -0
- package/src/Broadcaster.ts +48 -0
- package/src/ManagerConfig.ts +67 -0
- package/src/Message.ts +132 -0
- package/src/MessageState.ts +126 -0
- package/src/Messenger.ts +40 -0
- package/src/Pod.ts +95 -0
- package/src/PodAddress.ts +94 -0
- package/src/Pods.ts +100 -0
- package/src/PodsHealth.ts +74 -0
- package/src/PoisonPill.ts +105 -0
- package/src/RecipientAddress.ts +72 -0
- package/src/RecipientBehaviour.ts +108 -0
- package/src/RecipientBehaviourContext.ts +101 -0
- package/src/RecipientType.ts +134 -0
- package/src/Serialization.ts +72 -0
- package/src/SerializedEnvelope.ts +109 -0
- package/src/SerializedMessage.ts +82 -0
- package/src/ShardId.ts +79 -0
- package/src/ShardManager.ts +53 -0
- package/src/ShardManagerClient.ts +57 -0
- package/src/Sharding.ts +214 -0
- package/src/ShardingConfig.ts +76 -0
- package/src/ShardingEvent.ts +121 -0
- package/src/ShardingException.ts +151 -0
- package/src/ShardingRegistrationEvent.ts +62 -0
- package/src/Storage.ts +92 -0
- package/src/index.ts +139 -0
- package/src/internal/atLeastOnce.ts +59 -0
- package/src/internal/atLeastOnceStorage.ts +218 -0
- package/src/internal/entityManager.ts +404 -0
- package/src/internal/entityState.ts +64 -0
- package/src/internal/managerConfig.ts +84 -0
- package/src/internal/message.ts +64 -0
- package/src/internal/messageState.ts +98 -0
- package/src/internal/podWithMetadata.ts +72 -0
- package/src/internal/pods.ts +29 -0
- package/src/internal/podsHealth.ts +39 -0
- package/src/internal/recipientBehaviour.ts +133 -0
- package/src/internal/recipientBehaviourContext.ts +70 -0
- package/src/internal/serialization.ts +59 -0
- package/src/internal/shardManager.ts +593 -0
- package/src/internal/shardManagerClient.ts +49 -0
- package/src/internal/shardManagerState.ts +80 -0
- package/src/internal/sharding.ts +793 -0
- package/src/internal/shardingConfig.ts +97 -0
- package/src/internal/storage.ts +60 -0
- package/src/internal/utils.ts +54 -0
@@ -0,0 +1,404 @@
|
|
1
|
+
import * as Clock from "effect/Clock"
|
2
|
+
import * as Duration from "effect/Duration"
|
3
|
+
import * as Effect from "effect/Effect"
|
4
|
+
import * as Exit from "effect/Exit"
|
5
|
+
import * as Fiber from "effect/Fiber"
|
6
|
+
import { pipe } from "effect/Function"
|
7
|
+
import * as HashMap from "effect/HashMap"
|
8
|
+
import * as HashSet from "effect/HashSet"
|
9
|
+
import * as Option from "effect/Option"
|
10
|
+
import * as Scope from "effect/Scope"
|
11
|
+
import * as RefSynchronized from "effect/SynchronizedRef"
|
12
|
+
import * as Message from "../Message.js"
|
13
|
+
import * as MessageState from "../MessageState.js"
|
14
|
+
import type * as RecipientAddress from "../RecipientAddress.js"
|
15
|
+
import type * as RecipientBehaviour from "../RecipientBehaviour.js"
|
16
|
+
import * as RecipientBehaviourContext from "../RecipientBehaviourContext.js"
|
17
|
+
import type * as RecipientType from "../RecipientType.js"
|
18
|
+
import type * as Serialization from "../Serialization.js"
|
19
|
+
import type * as SerializedEnvelope from "../SerializedEnvelope.js"
|
20
|
+
import type * as SerializedMessage from "../SerializedMessage.js"
|
21
|
+
import type * as ShardId from "../ShardId.js"
|
22
|
+
import type * as Sharding from "../Sharding.js"
|
23
|
+
import type * as ShardingConfig from "../ShardingConfig.js"
|
24
|
+
import * as ShardingException from "../ShardingException.js"
|
25
|
+
import * as EntityState from "./entityState.js"
|
26
|
+
|
27
|
+
/** @internal */
|
28
|
+
const EntityManagerSymbolKey = "@effect/cluster/EntityManager"
|
29
|
+
|
30
|
+
/** @internal */
|
31
|
+
export const EntityManagerTypeId = Symbol.for(
|
32
|
+
EntityManagerSymbolKey
|
33
|
+
)
|
34
|
+
|
35
|
+
/** @internal */
|
36
|
+
export type EntityManagerTypeId = typeof EntityManagerTypeId
|
37
|
+
|
38
|
+
/** @internal */
|
39
|
+
export interface EntityManager {
|
40
|
+
readonly [EntityManagerTypeId]: EntityManagerTypeId
|
41
|
+
|
42
|
+
/** @internal */
|
43
|
+
readonly sendAndGetState: (
|
44
|
+
envelope: SerializedEnvelope.SerializedEnvelope
|
45
|
+
) => Effect.Effect<
|
46
|
+
MessageState.MessageState<SerializedMessage.SerializedMessage>,
|
47
|
+
| ShardingException.EntityNotManagedByThisPodException
|
48
|
+
| ShardingException.PodUnavailableException
|
49
|
+
| ShardingException.ExceptionWhileOfferingMessageException
|
50
|
+
| ShardingException.SerializationException
|
51
|
+
>
|
52
|
+
|
53
|
+
/** @internal */
|
54
|
+
readonly terminateEntitiesOnShards: (
|
55
|
+
shards: HashSet.HashSet<ShardId.ShardId>
|
56
|
+
) => Effect.Effect<void>
|
57
|
+
|
58
|
+
/** @internal */
|
59
|
+
readonly terminateAllEntities: Effect.Effect<void>
|
60
|
+
}
|
61
|
+
|
62
|
+
/** @internal */
|
63
|
+
export function make<Msg extends Message.Message.Any, R>(
|
64
|
+
recipientType: RecipientType.RecipientType<Msg>,
|
65
|
+
recipientBehaviour: RecipientBehaviour.RecipientBehaviour<Msg, R>,
|
66
|
+
sharding: Sharding.Sharding,
|
67
|
+
config: ShardingConfig.ShardingConfig,
|
68
|
+
serialization: Serialization.Serialization,
|
69
|
+
options: RecipientBehaviour.EntityBehaviourOptions = {}
|
70
|
+
) {
|
71
|
+
return Effect.gen(function*(_) {
|
72
|
+
const entityMaxIdle = options.entityMaxIdleTime || Option.none()
|
73
|
+
const env = yield* _(Effect.context<Exclude<R, RecipientBehaviourContext.RecipientBehaviourContext>>())
|
74
|
+
const entityStates = yield* _(
|
75
|
+
RefSynchronized.make<
|
76
|
+
HashMap.HashMap<
|
77
|
+
RecipientAddress.RecipientAddress,
|
78
|
+
EntityState.EntityState
|
79
|
+
>
|
80
|
+
>(HashMap.empty())
|
81
|
+
)
|
82
|
+
|
83
|
+
function startExpirationFiber(recipientAddress: RecipientAddress.RecipientAddress) {
|
84
|
+
const maxIdleMillis = pipe(
|
85
|
+
entityMaxIdle,
|
86
|
+
Option.getOrElse(() => config.entityMaxIdleTime),
|
87
|
+
Duration.toMillis
|
88
|
+
)
|
89
|
+
|
90
|
+
function sleep(duration: number): Effect.Effect<void> {
|
91
|
+
return pipe(
|
92
|
+
Effect.Do,
|
93
|
+
Effect.zipLeft(Clock.sleep(Duration.millis(duration))),
|
94
|
+
Effect.bind("cdt", () => Clock.currentTimeMillis),
|
95
|
+
Effect.bind("map", () => RefSynchronized.get(entityStates)),
|
96
|
+
Effect.let("lastReceivedAt", ({ map }) =>
|
97
|
+
pipe(
|
98
|
+
HashMap.get(map, recipientAddress),
|
99
|
+
Option.map((_) => _.lastReceivedAt),
|
100
|
+
Option.getOrElse(() => 0)
|
101
|
+
)),
|
102
|
+
Effect.let("remaining", ({ cdt, lastReceivedAt }) => (maxIdleMillis - cdt + lastReceivedAt)),
|
103
|
+
Effect.tap((_) => _.remaining > 0 ? sleep(_.remaining) : Effect.void)
|
104
|
+
)
|
105
|
+
}
|
106
|
+
|
107
|
+
return pipe(
|
108
|
+
sleep(maxIdleMillis),
|
109
|
+
Effect.zipRight(forkEntityTermination(recipientAddress)),
|
110
|
+
Effect.asVoid,
|
111
|
+
Effect.interruptible,
|
112
|
+
Effect.annotateLogs("entityId", recipientAddress),
|
113
|
+
Effect.annotateLogs("recipientType", recipientType.name),
|
114
|
+
Effect.forkDaemon
|
115
|
+
)
|
116
|
+
}
|
117
|
+
|
118
|
+
/**
|
119
|
+
* Performs proper termination of the entity, interrupting the expiration timer, closing the scope and failing pending replies
|
120
|
+
*/
|
121
|
+
function terminateEntity(recipientAddress: RecipientAddress.RecipientAddress) {
|
122
|
+
return pipe(
|
123
|
+
// get the things to cleanup
|
124
|
+
RefSynchronized.get(
|
125
|
+
entityStates
|
126
|
+
),
|
127
|
+
Effect.map(HashMap.get(recipientAddress)),
|
128
|
+
Effect.flatMap(Option.match({
|
129
|
+
// there is no entity state to cleanup
|
130
|
+
onNone: () => Effect.void,
|
131
|
+
// found it!
|
132
|
+
onSome: (entityState) =>
|
133
|
+
pipe(
|
134
|
+
// interrupt the expiration timer
|
135
|
+
Fiber.interrupt(entityState.expirationFiber),
|
136
|
+
// close the scope of the entity,
|
137
|
+
Effect.ensuring(Scope.close(entityState.executionScope, Exit.void)),
|
138
|
+
// remove the entry from the map
|
139
|
+
Effect.ensuring(RefSynchronized.update(entityStates, HashMap.remove(recipientAddress))),
|
140
|
+
// log error if happens
|
141
|
+
Effect.catchAllCause(Effect.logError),
|
142
|
+
Effect.asVoid,
|
143
|
+
Effect.annotateLogs("entityId", recipientAddress.entityId),
|
144
|
+
Effect.annotateLogs("recipientType", recipientAddress.recipientTypeName)
|
145
|
+
)
|
146
|
+
}))
|
147
|
+
)
|
148
|
+
}
|
149
|
+
|
150
|
+
/**
|
151
|
+
* Begins entity termination (if needed) and return the fiber to wait for completed termination (if any)
|
152
|
+
*/
|
153
|
+
function forkEntityTermination(
|
154
|
+
recipientAddress: RecipientAddress.RecipientAddress
|
155
|
+
): Effect.Effect<Option.Option<Fiber.RuntimeFiber<void, never>>> {
|
156
|
+
return RefSynchronized.modifyEffect(entityStates, (entityStatesMap) =>
|
157
|
+
pipe(
|
158
|
+
HashMap.get(entityStatesMap, recipientAddress),
|
159
|
+
Option.match({
|
160
|
+
// if no entry is found, the entity has succefully shut down
|
161
|
+
onNone: () => Effect.succeed([Option.none(), entityStatesMap] as const),
|
162
|
+
// there is an entry, so we should begin termination
|
163
|
+
onSome: (entityState) =>
|
164
|
+
pipe(
|
165
|
+
entityState.terminationFiber,
|
166
|
+
Option.match({
|
167
|
+
// termination has already begun, keep everything as-is
|
168
|
+
onSome: () => Effect.succeed([entityState.terminationFiber, entityStatesMap] as const),
|
169
|
+
// begin to terminate the queue
|
170
|
+
onNone: () =>
|
171
|
+
pipe(
|
172
|
+
terminateEntity(recipientAddress),
|
173
|
+
Effect.forkDaemon,
|
174
|
+
Effect.map((terminationFiber) =>
|
175
|
+
[
|
176
|
+
Option.some(terminationFiber),
|
177
|
+
HashMap.modify(
|
178
|
+
entityStatesMap,
|
179
|
+
recipientAddress,
|
180
|
+
EntityState.withTerminationFiber(terminationFiber)
|
181
|
+
)
|
182
|
+
] as const
|
183
|
+
)
|
184
|
+
)
|
185
|
+
})
|
186
|
+
)
|
187
|
+
})
|
188
|
+
))
|
189
|
+
}
|
190
|
+
|
191
|
+
function getOrCreateEntityState(
|
192
|
+
recipientAddress: RecipientAddress.RecipientAddress
|
193
|
+
): Effect.Effect<
|
194
|
+
Option.Option<EntityState.EntityState>,
|
195
|
+
ShardingException.EntityNotManagedByThisPodException
|
196
|
+
> {
|
197
|
+
return RefSynchronized.modifyEffect(entityStates, (map) =>
|
198
|
+
pipe(
|
199
|
+
HashMap.get(map, recipientAddress),
|
200
|
+
Option.match({
|
201
|
+
onSome: (entityState) =>
|
202
|
+
pipe(
|
203
|
+
entityState.terminationFiber,
|
204
|
+
Option.match({
|
205
|
+
// offer exists, delay the interruption fiber and return the offer
|
206
|
+
onNone: () =>
|
207
|
+
pipe(
|
208
|
+
Clock.currentTimeMillis,
|
209
|
+
Effect.map(
|
210
|
+
(cdt) =>
|
211
|
+
[
|
212
|
+
Option.some(entityState),
|
213
|
+
HashMap.modify(map, recipientAddress, EntityState.withLastReceivedAd(cdt))
|
214
|
+
] as const
|
215
|
+
)
|
216
|
+
),
|
217
|
+
// the queue is shutting down, stash and retry
|
218
|
+
onSome: () => Effect.succeed([Option.none(), map] as const)
|
219
|
+
})
|
220
|
+
),
|
221
|
+
onNone: () =>
|
222
|
+
Effect.flatMap(sharding.isShuttingDown, (isGoingDown) => {
|
223
|
+
if (isGoingDown) {
|
224
|
+
// don't start any fiber while sharding is shutting down
|
225
|
+
return Effect.fail(new ShardingException.EntityNotManagedByThisPodException({ recipientAddress }))
|
226
|
+
} else {
|
227
|
+
// offer doesn't exist, create a new one
|
228
|
+
return Effect.gen(function*(_) {
|
229
|
+
const executionScope = yield* _(Scope.make())
|
230
|
+
const expirationFiber = yield* _(startExpirationFiber(recipientAddress))
|
231
|
+
const cdt = yield* _(Clock.currentTimeMillis)
|
232
|
+
const forkShutdown = pipe(forkEntityTermination(recipientAddress), Effect.asVoid)
|
233
|
+
const shardId = sharding.getShardId(recipientAddress)
|
234
|
+
|
235
|
+
const sendAndGetState = yield* _(pipe(
|
236
|
+
recipientBehaviour,
|
237
|
+
Effect.map((offer) => (envelope: SerializedEnvelope.SerializedEnvelope) =>
|
238
|
+
pipe(
|
239
|
+
serialization.decode(recipientType.schema, envelope.body),
|
240
|
+
Effect.flatMap((message) =>
|
241
|
+
pipe(
|
242
|
+
offer(message),
|
243
|
+
Effect.flatMap((_) =>
|
244
|
+
MessageState.mapEffect(
|
245
|
+
_,
|
246
|
+
(value) => serialization.encode(Message.exitSchema(message), value)
|
247
|
+
)
|
248
|
+
)
|
249
|
+
)
|
250
|
+
)
|
251
|
+
)
|
252
|
+
),
|
253
|
+
Scope.extend(executionScope),
|
254
|
+
Effect.provideService(
|
255
|
+
RecipientBehaviourContext.RecipientBehaviourContext,
|
256
|
+
RecipientBehaviourContext.make({
|
257
|
+
recipientAddress,
|
258
|
+
shardId,
|
259
|
+
recipientType: recipientType as any,
|
260
|
+
forkShutdown
|
261
|
+
})
|
262
|
+
),
|
263
|
+
Effect.provide(env)
|
264
|
+
))
|
265
|
+
|
266
|
+
const entityState = EntityState.make({
|
267
|
+
sendAndGetState,
|
268
|
+
expirationFiber,
|
269
|
+
executionScope,
|
270
|
+
terminationFiber: Option.none(),
|
271
|
+
lastReceivedAt: cdt
|
272
|
+
})
|
273
|
+
|
274
|
+
return [
|
275
|
+
Option.some(entityState),
|
276
|
+
HashMap.set(
|
277
|
+
map,
|
278
|
+
recipientAddress,
|
279
|
+
entityState
|
280
|
+
)
|
281
|
+
] as const
|
282
|
+
})
|
283
|
+
}
|
284
|
+
})
|
285
|
+
})
|
286
|
+
))
|
287
|
+
}
|
288
|
+
|
289
|
+
function sendAndGetState(
|
290
|
+
envelope: SerializedEnvelope.SerializedEnvelope
|
291
|
+
): Effect.Effect<
|
292
|
+
MessageState.MessageState<SerializedMessage.SerializedMessage>,
|
293
|
+
| ShardingException.EntityNotManagedByThisPodException
|
294
|
+
| ShardingException.PodUnavailableException
|
295
|
+
| ShardingException.ExceptionWhileOfferingMessageException
|
296
|
+
| ShardingException.SerializationException
|
297
|
+
> {
|
298
|
+
return pipe(
|
299
|
+
Effect.Do,
|
300
|
+
Effect.tap(() => {
|
301
|
+
// first, verify that this entity should be handled by this pod
|
302
|
+
if (recipientType._tag === "EntityType") {
|
303
|
+
return Effect.asVoid(Effect.unlessEffect(
|
304
|
+
Effect.fail(
|
305
|
+
new ShardingException.EntityNotManagedByThisPodException({
|
306
|
+
recipientAddress: envelope.recipientAddress
|
307
|
+
})
|
308
|
+
),
|
309
|
+
sharding.isEntityOnLocalShards(envelope.recipientAddress)
|
310
|
+
))
|
311
|
+
} else if (recipientType._tag === "TopicType") {
|
312
|
+
return Effect.void
|
313
|
+
}
|
314
|
+
return Effect.die("Unhandled recipientType")
|
315
|
+
}),
|
316
|
+
Effect.bind("maybeEntityState", () => getOrCreateEntityState(envelope.recipientAddress)),
|
317
|
+
Effect.flatMap((_) =>
|
318
|
+
pipe(
|
319
|
+
_.maybeEntityState,
|
320
|
+
Option.match({
|
321
|
+
onNone: () =>
|
322
|
+
pipe(
|
323
|
+
Effect.sleep(Duration.millis(100)),
|
324
|
+
Effect.flatMap(() => sendAndGetState(envelope))
|
325
|
+
),
|
326
|
+
onSome: (entityState) => {
|
327
|
+
return entityState.sendAndGetState(envelope)
|
328
|
+
}
|
329
|
+
})
|
330
|
+
)
|
331
|
+
)
|
332
|
+
)
|
333
|
+
}
|
334
|
+
|
335
|
+
const terminateAllEntities = pipe(
|
336
|
+
RefSynchronized.get(entityStates),
|
337
|
+
Effect.map(HashMap.keySet),
|
338
|
+
Effect.flatMap(terminateEntities)
|
339
|
+
)
|
340
|
+
|
341
|
+
function terminateEntities(
|
342
|
+
entitiesToTerminate: HashSet.HashSet<
|
343
|
+
RecipientAddress.RecipientAddress
|
344
|
+
>
|
345
|
+
) {
|
346
|
+
return pipe(
|
347
|
+
entitiesToTerminate,
|
348
|
+
Effect.forEach(
|
349
|
+
(recipientAddress) =>
|
350
|
+
pipe(
|
351
|
+
forkEntityTermination(recipientAddress),
|
352
|
+
Effect.flatMap((_) =>
|
353
|
+
Option.match(_, {
|
354
|
+
onNone: () => Effect.void,
|
355
|
+
onSome: (terminationFiber) =>
|
356
|
+
pipe(
|
357
|
+
Fiber.await(terminationFiber),
|
358
|
+
Effect.timeout(config.entityTerminationTimeout),
|
359
|
+
Effect.match({
|
360
|
+
onFailure: () =>
|
361
|
+
Effect.logError(
|
362
|
+
`Entity ${recipientAddress} termination is taking more than expected entityTerminationTimeout (${
|
363
|
+
Duration.toMillis(config.entityTerminationTimeout)
|
364
|
+
}ms).`
|
365
|
+
),
|
366
|
+
onSuccess: () =>
|
367
|
+
Effect.logDebug(
|
368
|
+
`Entity ${recipientAddress} cleaned up.`
|
369
|
+
)
|
370
|
+
}),
|
371
|
+
Effect.asVoid
|
372
|
+
)
|
373
|
+
})
|
374
|
+
)
|
375
|
+
),
|
376
|
+
{ concurrency: "inherit" }
|
377
|
+
),
|
378
|
+
Effect.asVoid
|
379
|
+
)
|
380
|
+
}
|
381
|
+
|
382
|
+
function terminateEntitiesOnShards(shards: HashSet.HashSet<ShardId.ShardId>) {
|
383
|
+
return pipe(
|
384
|
+
RefSynchronized.modify(entityStates, (entities) => [
|
385
|
+
HashMap.filter(
|
386
|
+
entities,
|
387
|
+
(_, recipientAddress) => HashSet.has(shards, sharding.getShardId(recipientAddress))
|
388
|
+
),
|
389
|
+
entities
|
390
|
+
]),
|
391
|
+
Effect.map(HashMap.keySet),
|
392
|
+
Effect.flatMap(terminateEntities)
|
393
|
+
)
|
394
|
+
}
|
395
|
+
|
396
|
+
const self: EntityManager = {
|
397
|
+
[EntityManagerTypeId]: EntityManagerTypeId,
|
398
|
+
sendAndGetState,
|
399
|
+
terminateAllEntities,
|
400
|
+
terminateEntitiesOnShards
|
401
|
+
}
|
402
|
+
return self
|
403
|
+
})
|
404
|
+
}
|
@@ -0,0 +1,64 @@
|
|
1
|
+
import * as Data from "effect/Data"
|
2
|
+
import type * as Effect from "effect/Effect"
|
3
|
+
import type * as Fiber from "effect/Fiber"
|
4
|
+
import * as Option from "effect/Option"
|
5
|
+
import type * as Scope from "effect/Scope"
|
6
|
+
import type * as MessageState from "../MessageState.js"
|
7
|
+
import type * as SerializedEnvelope from "../SerializedEnvelope.js"
|
8
|
+
import type * as SerializedMessage from "../SerializedMessage.js"
|
9
|
+
import type * as ShardingException from "../ShardingException.js"
|
10
|
+
|
11
|
+
/** @internal */
|
12
|
+
const EntityStateSymbolKey = "@effect/cluster/EntityState"
|
13
|
+
|
14
|
+
/** @internal */
|
15
|
+
export const EntityStateTypeId = Symbol.for(EntityStateSymbolKey)
|
16
|
+
|
17
|
+
/** @internal */
|
18
|
+
export type EntityStateTypeId = typeof EntityStateTypeId
|
19
|
+
|
20
|
+
/**
|
21
|
+
* @since 1.0.0
|
22
|
+
* @category models
|
23
|
+
*/
|
24
|
+
export interface EntityState {
|
25
|
+
readonly [EntityStateTypeId]: EntityStateTypeId
|
26
|
+
readonly sendAndGetState: (
|
27
|
+
envelope: SerializedEnvelope.SerializedEnvelope
|
28
|
+
) => Effect.Effect<
|
29
|
+
MessageState.MessageState<SerializedMessage.SerializedMessage>,
|
30
|
+
ShardingException.ExceptionWhileOfferingMessageException | ShardingException.SerializationException
|
31
|
+
>
|
32
|
+
readonly expirationFiber: Fiber.RuntimeFiber<void, never>
|
33
|
+
readonly executionScope: Scope.CloseableScope
|
34
|
+
readonly terminationFiber: Option.Option<Fiber.RuntimeFiber<void, never>>
|
35
|
+
readonly lastReceivedAt: number
|
36
|
+
}
|
37
|
+
|
38
|
+
/** @internal */
|
39
|
+
export function make(
|
40
|
+
data: Omit<EntityState, EntityStateTypeId>
|
41
|
+
): EntityState {
|
42
|
+
return Data.struct({ [EntityStateTypeId]: EntityStateTypeId, ...data })
|
43
|
+
}
|
44
|
+
|
45
|
+
/** @internal */
|
46
|
+
export function withTerminationFiber(
|
47
|
+
terminationFiber: Fiber.RuntimeFiber<void, never>
|
48
|
+
): (entityState: EntityState) => EntityState {
|
49
|
+
return (entityState) => ({ ...entityState, terminationFiber: Option.some(terminationFiber) })
|
50
|
+
}
|
51
|
+
|
52
|
+
/** @internal */
|
53
|
+
export function withExpirationFiber(
|
54
|
+
expirationFiber: Fiber.RuntimeFiber<void, never>
|
55
|
+
): (entityState: EntityState) => EntityState {
|
56
|
+
return (entityState) => ({ ...entityState, expirationFiber })
|
57
|
+
}
|
58
|
+
|
59
|
+
/** @internal */
|
60
|
+
export function withLastReceivedAd(
|
61
|
+
lastReceivedAt: number
|
62
|
+
): (entityState: EntityState) => EntityState {
|
63
|
+
return (entityState) => ({ ...entityState, lastReceivedAt })
|
64
|
+
}
|
@@ -0,0 +1,84 @@
|
|
1
|
+
import * as Config from "effect/Config"
|
2
|
+
import type * as ConfigError from "effect/ConfigError"
|
3
|
+
import * as Context from "effect/Context"
|
4
|
+
import * as Duration from "effect/Duration"
|
5
|
+
import { pipe } from "effect/Function"
|
6
|
+
import * as Layer from "effect/Layer"
|
7
|
+
import type * as ManagerConfig from "../ManagerConfig.js"
|
8
|
+
|
9
|
+
/** @internal */
|
10
|
+
const ManagerConfigSymbolKey = "@effect/cluster/ManagerConfig"
|
11
|
+
|
12
|
+
/** @internal */
|
13
|
+
export const ManagerConfigTypeId: ManagerConfig.ManagerConfigTypeId = Symbol.for(
|
14
|
+
ManagerConfigSymbolKey
|
15
|
+
) as ManagerConfig.ManagerConfigTypeId
|
16
|
+
|
17
|
+
/** @internal */
|
18
|
+
export const managerConfigTag: Context.Tag<ManagerConfig.ManagerConfig, ManagerConfig.ManagerConfig> = Context
|
19
|
+
.GenericTag(ManagerConfigSymbolKey)
|
20
|
+
|
21
|
+
/** @internal */
|
22
|
+
const defaultValues: ManagerConfig.ManagerConfig = {
|
23
|
+
numberOfShards: 300,
|
24
|
+
apiPort: 8080,
|
25
|
+
rebalanceInterval: Duration.seconds(20),
|
26
|
+
rebalanceRetryInterval: Duration.seconds(10),
|
27
|
+
pingTimeout: Duration.seconds(3),
|
28
|
+
persistRetryInterval: Duration.seconds(3),
|
29
|
+
persistRetryCount: 100,
|
30
|
+
rebalanceRate: 2 / 100
|
31
|
+
}
|
32
|
+
|
33
|
+
/** @internal */
|
34
|
+
export const defaults: Layer.Layer<ManagerConfig.ManagerConfig> = Layer.succeed(managerConfigTag, defaultValues)
|
35
|
+
|
36
|
+
/** @internal */
|
37
|
+
const config: Config.Config<ManagerConfig.ManagerConfig> = Config.all({
|
38
|
+
numberOfShards: pipe(
|
39
|
+
Config.number("NUMBER_OF_SHARDS"),
|
40
|
+
Config.withDefault(defaultValues.numberOfShards),
|
41
|
+
Config.withDescription("Number of shards")
|
42
|
+
),
|
43
|
+
apiPort: pipe(
|
44
|
+
Config.integer("API_PORT"),
|
45
|
+
Config.withDefault(defaultValues.apiPort),
|
46
|
+
Config.withDescription("API port")
|
47
|
+
),
|
48
|
+
rebalanceInterval: pipe(
|
49
|
+
Config.map(Config.number("REBALANCE_INTERVAL"), Duration.millis),
|
50
|
+
Config.withDefault(defaultValues.rebalanceInterval),
|
51
|
+
Config.withDescription("Interval of rebalance")
|
52
|
+
),
|
53
|
+
rebalanceRetryInterval: pipe(
|
54
|
+
Config.map(Config.number("REBALANCE_RETRY_INTERVAL"), Duration.millis),
|
55
|
+
Config.withDefault(defaultValues.rebalanceRetryInterval),
|
56
|
+
Config.withDescription("Retry interval of rebalance")
|
57
|
+
),
|
58
|
+
pingTimeout: pipe(
|
59
|
+
Config.map(Config.number("PING_TIMEOUT"), Duration.millis),
|
60
|
+
Config.withDefault(defaultValues.pingTimeout),
|
61
|
+
Config.withDescription("Ping timeout")
|
62
|
+
),
|
63
|
+
persistRetryInterval: pipe(
|
64
|
+
Config.map(Config.number("PERSIST_RETRY_INTERVAL"), Duration.millis),
|
65
|
+
Config.withDefault(defaultValues.persistRetryInterval),
|
66
|
+
Config.withDescription("Persist retry interval")
|
67
|
+
),
|
68
|
+
persistRetryCount: pipe(
|
69
|
+
Config.number("PERSIST_RETRY_COUNT"),
|
70
|
+
Config.withDefault(defaultValues.persistRetryCount),
|
71
|
+
Config.withDescription("Persist retry count")
|
72
|
+
),
|
73
|
+
rebalanceRate: pipe(
|
74
|
+
Config.number("REBALANCE_RATE"),
|
75
|
+
Config.withDefault(defaultValues.rebalanceRate),
|
76
|
+
Config.withDescription("Rebalance rate")
|
77
|
+
)
|
78
|
+
})
|
79
|
+
|
80
|
+
/** @internal */
|
81
|
+
export const fromConfig: Layer.Layer<ManagerConfig.ManagerConfig, ConfigError.ConfigError> = Layer.effect(
|
82
|
+
managerConfigTag,
|
83
|
+
config
|
84
|
+
)
|
@@ -0,0 +1,64 @@
|
|
1
|
+
import * as Schema from "@effect/schema/Schema"
|
2
|
+
import * as Serializable from "@effect/schema/Serializable"
|
3
|
+
import * as PrimaryKey from "effect/PrimaryKey"
|
4
|
+
import type * as Types from "effect/Types"
|
5
|
+
import type * as Message from "../Message.js"
|
6
|
+
|
7
|
+
/** @internal */
|
8
|
+
export function isMessageWithResult(value: unknown): value is Message.Message<unknown, unknown, unknown, unknown> {
|
9
|
+
return (
|
10
|
+
typeof value === "object" && value !== null &&
|
11
|
+
Serializable.symbolResult in value
|
12
|
+
)
|
13
|
+
}
|
14
|
+
|
15
|
+
/** @internal */
|
16
|
+
export function exitSchema<A extends Message.Message.Any>(
|
17
|
+
message: A
|
18
|
+
): Schema.Schema<Message.Message.Exit<A>, unknown> {
|
19
|
+
return Serializable.exitSchema(message as any) as any
|
20
|
+
}
|
21
|
+
|
22
|
+
/** @internal */
|
23
|
+
export function successSchema<A extends Message.Message.Any>(
|
24
|
+
message: A
|
25
|
+
): Schema.Schema<Message.Message.Success<A>, unknown> {
|
26
|
+
return Serializable.successSchema(message as any) as any
|
27
|
+
}
|
28
|
+
|
29
|
+
/** @internal */
|
30
|
+
export function failureSchema<A extends Message.Message.Any>(
|
31
|
+
message: A
|
32
|
+
): Schema.Schema<Message.Message.Error<A>, unknown> {
|
33
|
+
return Serializable.failureSchema(message as any) as any
|
34
|
+
}
|
35
|
+
|
36
|
+
/**
|
37
|
+
* @since 1.0.0
|
38
|
+
* @category schemas
|
39
|
+
*/
|
40
|
+
export const TaggedMessage_ = <Self>() =>
|
41
|
+
<Tag extends string, E, IE, A, IA, Fields extends Schema.Struct.Fields>(
|
42
|
+
tag: Tag,
|
43
|
+
failure: Schema.Schema<E, IE, never>,
|
44
|
+
success: Schema.Schema<A, IA, never>,
|
45
|
+
fields: Fields,
|
46
|
+
messageToId: (message: Schema.Struct.Encoded<Fields>) => string
|
47
|
+
): Message.TaggedMessageConstructor<
|
48
|
+
Tag,
|
49
|
+
Self,
|
50
|
+
Schema.Schema.Context<Fields[keyof Fields]>,
|
51
|
+
Types.Simplify<Schema.Struct.Encoded<Fields>>,
|
52
|
+
Types.Simplify<Schema.Struct.Type<Fields>>,
|
53
|
+
IE,
|
54
|
+
E,
|
55
|
+
IA,
|
56
|
+
A
|
57
|
+
> => {
|
58
|
+
return class extends (Schema.TaggedRequest<{}>()(tag, failure, success, fields) as any) {
|
59
|
+
constructor(props: any, disableValidation?: boolean) {
|
60
|
+
super(props, disableValidation)
|
61
|
+
;(this as any)[PrimaryKey.symbol] = () => messageToId(this as any)
|
62
|
+
}
|
63
|
+
} as any
|
64
|
+
}
|