@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,126 @@
|
|
1
|
+
/**
|
2
|
+
* @since 1.0.0
|
3
|
+
*/
|
4
|
+
import type * as Schema from "@effect/schema/Schema"
|
5
|
+
import type * as Effect from "effect/Effect"
|
6
|
+
import * as internal from "./internal/messageState.js"
|
7
|
+
|
8
|
+
/**
|
9
|
+
* @since 1.0.0
|
10
|
+
* @category symbols
|
11
|
+
*/
|
12
|
+
export const MessageStateTypeId: unique symbol = internal.MessageStateTypeId
|
13
|
+
|
14
|
+
/**
|
15
|
+
* @since 1.0.0
|
16
|
+
* @category symbols
|
17
|
+
*/
|
18
|
+
export type MessageStateTypeId = typeof MessageStateTypeId
|
19
|
+
|
20
|
+
/**
|
21
|
+
* A message state given to just acknowledged messages.
|
22
|
+
* This state tells the sender that the receiver has received the message and will eventually process it later.
|
23
|
+
*
|
24
|
+
* @since 1.0.0
|
25
|
+
* @category models
|
26
|
+
*/
|
27
|
+
export interface MessageStateAcknowledged {
|
28
|
+
readonly [MessageStateTypeId]: MessageStateTypeId
|
29
|
+
readonly _tag: "@effect/cluster/MessageState/Acknowledged"
|
30
|
+
}
|
31
|
+
|
32
|
+
/**
|
33
|
+
* A message state given to processed messages.
|
34
|
+
* This state tells the sender that the receiver has already received and processed the message.
|
35
|
+
* This will also tell the sender the result for this message.
|
36
|
+
*
|
37
|
+
* @since 1.0.0
|
38
|
+
* @category models
|
39
|
+
*/
|
40
|
+
export interface MessageStateProcessed<A> {
|
41
|
+
readonly [MessageStateTypeId]: MessageStateTypeId
|
42
|
+
readonly _tag: "@effect/cluster/MessageState/Processed"
|
43
|
+
readonly result: A
|
44
|
+
}
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Once a Message is sent to an entity to be processed,
|
48
|
+
* the state of that message over that entity is either Acknoledged (not yet processed) or Processed.
|
49
|
+
*
|
50
|
+
* @since 1.0.0
|
51
|
+
* @category models
|
52
|
+
*/
|
53
|
+
export type MessageState<A> = MessageStateAcknowledged | MessageStateProcessed<A>
|
54
|
+
|
55
|
+
/**
|
56
|
+
* @since 1.0.0
|
57
|
+
* @category models
|
58
|
+
*/
|
59
|
+
export namespace MessageState {
|
60
|
+
/**
|
61
|
+
* @since 1.0.0
|
62
|
+
* @category models
|
63
|
+
*/
|
64
|
+
export type Encoded<I> = {
|
65
|
+
readonly "@effect/cluster/MessageState": "@effect/cluster/MessageState"
|
66
|
+
readonly _tag: "@effect/cluster/MessageState/Acknowledged"
|
67
|
+
} | {
|
68
|
+
readonly result: I
|
69
|
+
readonly "@effect/cluster/MessageState": "@effect/cluster/MessageState"
|
70
|
+
readonly _tag: "@effect/cluster/MessageState/Processed"
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
/**
|
75
|
+
* Ensures that the given value is a MessageState
|
76
|
+
*
|
77
|
+
* @since 1.0.0
|
78
|
+
* @category utils
|
79
|
+
*/
|
80
|
+
export const isMessageState = internal.isMessageState
|
81
|
+
|
82
|
+
/**
|
83
|
+
* Match over the possible states of a MessageState
|
84
|
+
*
|
85
|
+
* @since 1.0.0
|
86
|
+
* @category utils
|
87
|
+
*/
|
88
|
+
export const match = internal.match
|
89
|
+
|
90
|
+
/**
|
91
|
+
* Constructs an AcknowledgedMessageState.
|
92
|
+
*
|
93
|
+
* @since 1.0.0
|
94
|
+
* @category constructors
|
95
|
+
*/
|
96
|
+
export const Acknowledged: MessageStateAcknowledged = internal.Acknowledged
|
97
|
+
|
98
|
+
/**
|
99
|
+
* Constructs a ProcessedMessageState from the result of the message being processed.
|
100
|
+
*
|
101
|
+
* @since 1.0.0
|
102
|
+
* @category constructors
|
103
|
+
*/
|
104
|
+
export const Processed: <A>(result: A) => MessageStateProcessed<A> = internal.Processed
|
105
|
+
|
106
|
+
/**
|
107
|
+
* Effectfully transform the <A> type of the MessageState<A>.
|
108
|
+
*
|
109
|
+
* @since 1.0.0
|
110
|
+
* @category utils
|
111
|
+
*/
|
112
|
+
export const mapEffect: <A, B, R, E>(
|
113
|
+
value: MessageState<A>,
|
114
|
+
fn: (value: A) => Effect.Effect<B, E, R>
|
115
|
+
) => Effect.Effect<MessageState<B>, E, R> = internal.mapEffect
|
116
|
+
|
117
|
+
/**
|
118
|
+
* @since 1.0.0
|
119
|
+
* @category schema
|
120
|
+
*/
|
121
|
+
export const schema: <A, I>(
|
122
|
+
result: Schema.Schema<A, I>
|
123
|
+
) => Schema.Schema<
|
124
|
+
MessageState<A>,
|
125
|
+
MessageState.Encoded<I>
|
126
|
+
> = internal.schema
|
package/src/Messenger.ts
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
/**
|
2
|
+
* @since 1.0.0
|
3
|
+
*/
|
4
|
+
import type * as Effect from "effect/Effect"
|
5
|
+
import type * as Message from "./Message.js"
|
6
|
+
import type * as ShardingException from "./ShardingException.js"
|
7
|
+
|
8
|
+
/**
|
9
|
+
* An interface to communicate with a remote entity.
|
10
|
+
*
|
11
|
+
* @tparam Msg the type of message that can be sent to this entity type
|
12
|
+
* @since 1.0.0
|
13
|
+
* @category models
|
14
|
+
*/
|
15
|
+
export interface Messenger<Msg extends Message.Message.Any> {
|
16
|
+
/**
|
17
|
+
* Send a message without waiting for a response (fire and forget)
|
18
|
+
*
|
19
|
+
* You can use Effect timeout to get send timeouts. The default behaviour is to send the message indifinetely
|
20
|
+
*
|
21
|
+
* @since 1.0.0
|
22
|
+
*/
|
23
|
+
sendDiscard(entityId: string): (message: Msg) => Effect.Effect<void, ShardingException.ShardingException>
|
24
|
+
|
25
|
+
/**
|
26
|
+
* Send a message and wait for a response.
|
27
|
+
*
|
28
|
+
* You can use Effect timeout to get send timeouts. The default behaviour is to send the message indifinetely
|
29
|
+
*
|
30
|
+
* @since 1.0.0
|
31
|
+
*/
|
32
|
+
send(
|
33
|
+
entityId: string
|
34
|
+
): <A extends Msg>(
|
35
|
+
message: A
|
36
|
+
) => Effect.Effect<
|
37
|
+
Message.Message.Success<A>,
|
38
|
+
ShardingException.ShardingException | Message.Message.Error<A>
|
39
|
+
>
|
40
|
+
}
|
package/src/Pod.ts
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
/**
|
2
|
+
* @since 1.0.0
|
3
|
+
*/
|
4
|
+
import * as Schema from "@effect/schema/Schema"
|
5
|
+
import { TypeIdSchema } from "./internal/utils.js"
|
6
|
+
import * as PodAddress from "./PodAddress.js"
|
7
|
+
|
8
|
+
/** @internal */
|
9
|
+
const PodSymbolKey = "@effect/cluster/Pod"
|
10
|
+
|
11
|
+
/**
|
12
|
+
* @since 1.0.0
|
13
|
+
* @category symbols
|
14
|
+
*/
|
15
|
+
export const PodTypeId: unique symbol = Symbol.for(PodSymbolKey)
|
16
|
+
|
17
|
+
/**
|
18
|
+
* @since 1.0.0
|
19
|
+
* @category symbols
|
20
|
+
*/
|
21
|
+
export type PodTypeId = typeof PodTypeId
|
22
|
+
|
23
|
+
/** @internal */
|
24
|
+
const PodTypeIdSchema = TypeIdSchema(PodSymbolKey, PodTypeId)
|
25
|
+
|
26
|
+
/**
|
27
|
+
* A pod is an application server that is able to run entities. A pod can run multiple entities,
|
28
|
+
* but a single entity will live on a given pod at a time.
|
29
|
+
* Since this is an application server, it needs to have an unique identifier where it's addressed (PodAddress),
|
30
|
+
* and has a version of the application that's running on it.
|
31
|
+
* Version is used during the rebalance phase to give priority to newer application servers and slowly kill older ones.
|
32
|
+
*
|
33
|
+
* @since 1.0.0
|
34
|
+
* @category models
|
35
|
+
*/
|
36
|
+
export class Pod extends Schema.Class<Pod>(PodSymbolKey)({
|
37
|
+
[PodTypeId]: Schema.propertySignature(PodTypeIdSchema).pipe(Schema.fromKey(PodSymbolKey)),
|
38
|
+
address: PodAddress.schema,
|
39
|
+
version: Schema.String
|
40
|
+
}) {
|
41
|
+
/**
|
42
|
+
* @since 1.0.0
|
43
|
+
*/
|
44
|
+
toString() {
|
45
|
+
return `Pod(${this.address}, ${this.version})`
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
/**
|
50
|
+
* @since 1.0.0
|
51
|
+
* @category models
|
52
|
+
*/
|
53
|
+
export namespace Pod {
|
54
|
+
/**
|
55
|
+
* This is the shape that a Pod is represented over the wire.
|
56
|
+
*
|
57
|
+
* @since 1.0.0
|
58
|
+
* @category models
|
59
|
+
*/
|
60
|
+
export interface Encoded extends Schema.Schema.Encoded<typeof Pod> {}
|
61
|
+
}
|
62
|
+
|
63
|
+
/**
|
64
|
+
* Given a value, ensures that it's a valid Pod.
|
65
|
+
*
|
66
|
+
* @since 1.0.0
|
67
|
+
* @category utils
|
68
|
+
*/
|
69
|
+
export function isPod(value: unknown): value is Pod {
|
70
|
+
return (
|
71
|
+
typeof value === "object" &&
|
72
|
+
value !== null &&
|
73
|
+
PodTypeId in value &&
|
74
|
+
value[PodTypeId] === PodTypeId
|
75
|
+
)
|
76
|
+
}
|
77
|
+
|
78
|
+
/**
|
79
|
+
* Constructs a Pod from it's identifing PodAddress and application server version.
|
80
|
+
*
|
81
|
+
* @since 1.0.0
|
82
|
+
* @category constructors
|
83
|
+
*/
|
84
|
+
export function make(address: PodAddress.PodAddress, version: string): Pod {
|
85
|
+
return new Pod({ [PodTypeId]: PodTypeId, address, version })
|
86
|
+
}
|
87
|
+
|
88
|
+
/**
|
89
|
+
* @since 1.0.0
|
90
|
+
* @category schema
|
91
|
+
*/
|
92
|
+
export const schema: Schema.Schema<
|
93
|
+
Pod,
|
94
|
+
Pod.Encoded
|
95
|
+
> = Schema.asSchema(Pod)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
/**
|
2
|
+
* @since 1.0.0
|
3
|
+
*/
|
4
|
+
import * as Schema from "@effect/schema/Schema"
|
5
|
+
import { TypeIdSchema } from "./internal/utils.js"
|
6
|
+
|
7
|
+
/** @internal */
|
8
|
+
const PodAddressSymbolKey = "@effect/cluster/PodAddress"
|
9
|
+
|
10
|
+
/**
|
11
|
+
* @since 1.0.0
|
12
|
+
* @category symbols
|
13
|
+
*/
|
14
|
+
export const PodAddressTypeId: unique symbol = Symbol.for(PodAddressSymbolKey)
|
15
|
+
|
16
|
+
/** @internal */
|
17
|
+
export const PodAddressTypeIdSchema = TypeIdSchema(PodAddressSymbolKey, PodAddressTypeId)
|
18
|
+
|
19
|
+
/**
|
20
|
+
* @since 1.0.0
|
21
|
+
* @category symbols
|
22
|
+
*/
|
23
|
+
export type PodAddressTypeId = typeof PodAddressTypeId
|
24
|
+
|
25
|
+
/**
|
26
|
+
* A PodAddress is a unique identifier of a Pod (application server).
|
27
|
+
* It is conventially built by using an address and a port, so that messaging implementations may use directly the
|
28
|
+
* PodAddress to know how to connect to the specific Pod.
|
29
|
+
*
|
30
|
+
* @since 1.0.0
|
31
|
+
* @category models
|
32
|
+
*/
|
33
|
+
export class PodAddress extends Schema.Class<PodAddress>(PodAddressSymbolKey)({
|
34
|
+
[PodAddressTypeId]: Schema.propertySignature(PodAddressTypeIdSchema).pipe(Schema.fromKey(PodAddressSymbolKey)),
|
35
|
+
host: Schema.String,
|
36
|
+
port: Schema.Number
|
37
|
+
}) {
|
38
|
+
/**
|
39
|
+
* @since 1.0.0
|
40
|
+
*/
|
41
|
+
toString() {
|
42
|
+
return `PodAddress(${this.host}:${this.port})`
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
/**
|
47
|
+
* @since 1.0.0
|
48
|
+
* @category models
|
49
|
+
*/
|
50
|
+
export namespace PodAddress {
|
51
|
+
/**
|
52
|
+
* This is the shape one PodAddress has over the wire.
|
53
|
+
*
|
54
|
+
* @since 1.0.0
|
55
|
+
* @category models
|
56
|
+
*/
|
57
|
+
export interface Encoded extends Schema.Schema.Encoded<typeof PodAddress> {}
|
58
|
+
}
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Constructs a PodAddress from an host and a port.
|
62
|
+
*
|
63
|
+
* @since 1.0.0
|
64
|
+
* @category constructors
|
65
|
+
*/
|
66
|
+
export function make(host: string, port: number): PodAddress {
|
67
|
+
return new PodAddress({ [PodAddressTypeId]: PodAddressTypeId, host, port })
|
68
|
+
}
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Ensures that the given value is a valid PodAddress.
|
72
|
+
*
|
73
|
+
* @since 1.0.0
|
74
|
+
* @category utils
|
75
|
+
*/
|
76
|
+
export function isPodAddress(value: unknown): value is PodAddress {
|
77
|
+
return (
|
78
|
+
typeof value === "object" &&
|
79
|
+
value !== null &&
|
80
|
+
PodAddressTypeId in value &&
|
81
|
+
value[PodAddressTypeId] === PodAddressTypeId
|
82
|
+
)
|
83
|
+
}
|
84
|
+
|
85
|
+
/**
|
86
|
+
* This is the schema for a PodAddress.
|
87
|
+
*
|
88
|
+
* @since 1.0.0
|
89
|
+
* @category schema
|
90
|
+
*/
|
91
|
+
export const schema: Schema.Schema<
|
92
|
+
PodAddress,
|
93
|
+
PodAddress.Encoded
|
94
|
+
> = Schema.asSchema(PodAddress)
|
package/src/Pods.ts
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
/**
|
2
|
+
* @since 1.0.0
|
3
|
+
*/
|
4
|
+
import type * as Context from "effect/Context"
|
5
|
+
import type * as Effect from "effect/Effect"
|
6
|
+
import type * as HashSet from "effect/HashSet"
|
7
|
+
import type * as Layer from "effect/Layer"
|
8
|
+
import * as internal from "./internal/pods.js"
|
9
|
+
import type * as MessageState from "./MessageState.js"
|
10
|
+
import type * as PodAddress from "./PodAddress.js"
|
11
|
+
import type * as SerializedEnvelope from "./SerializedEnvelope.js"
|
12
|
+
import type * as SerializedMessage from "./SerializedMessage.js"
|
13
|
+
import type * as ShardId from "./ShardId.js"
|
14
|
+
import type * as ShardingException from "./ShardingException.js"
|
15
|
+
|
16
|
+
/**
|
17
|
+
* @since 1.0.0
|
18
|
+
* @category symbols
|
19
|
+
*/
|
20
|
+
export const PodsTypeId: unique symbol = internal.PodsTypeId
|
21
|
+
|
22
|
+
/**
|
23
|
+
* @since 1.0.0
|
24
|
+
* @category symbols
|
25
|
+
*/
|
26
|
+
export type PodsTypeId = typeof PodsTypeId
|
27
|
+
|
28
|
+
/**
|
29
|
+
* An interface to communicate with remote pods.
|
30
|
+
* This is used by the Shard Manager for assigning and unassigning shards.
|
31
|
+
* This is also used by pods for internal communication (forward messages to each other).
|
32
|
+
*
|
33
|
+
* @since 1.0.0
|
34
|
+
* @category models
|
35
|
+
*/
|
36
|
+
export interface Pods {
|
37
|
+
/**
|
38
|
+
* @since 1.0.0
|
39
|
+
*/
|
40
|
+
readonly [PodsTypeId]: PodsTypeId
|
41
|
+
|
42
|
+
/**
|
43
|
+
* Notify a pod that it was assigned a list of shards
|
44
|
+
* @since 1.0.0
|
45
|
+
*/
|
46
|
+
readonly assignShards: (
|
47
|
+
pod: PodAddress.PodAddress,
|
48
|
+
shards: HashSet.HashSet<ShardId.ShardId>
|
49
|
+
) => Effect.Effect<void, ShardingException.PodUnavailableException>
|
50
|
+
|
51
|
+
/**
|
52
|
+
* Notify a pod that it was unassigned a list of shards
|
53
|
+
* @since 1.0.0
|
54
|
+
*/
|
55
|
+
readonly unassignShards: (
|
56
|
+
pod: PodAddress.PodAddress,
|
57
|
+
shards: HashSet.HashSet<ShardId.ShardId>
|
58
|
+
) => Effect.Effect<void, ShardingException.PodUnavailableException>
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Check that a pod is responsive
|
62
|
+
* @since 1.0.0
|
63
|
+
*/
|
64
|
+
readonly ping: (pod: PodAddress.PodAddress) => Effect.Effect<void, ShardingException.PodUnavailableException>
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Send a message to a pod and receive its message state
|
68
|
+
* @since 1.0.0
|
69
|
+
*/
|
70
|
+
readonly sendAndGetState: (
|
71
|
+
pod: PodAddress.PodAddress,
|
72
|
+
envelope: SerializedEnvelope.SerializedEnvelope
|
73
|
+
) => Effect.Effect<
|
74
|
+
MessageState.MessageState<SerializedMessage.SerializedMessage>,
|
75
|
+
ShardingException.ShardingException
|
76
|
+
>
|
77
|
+
}
|
78
|
+
|
79
|
+
/**
|
80
|
+
* @since 1.0.0
|
81
|
+
* @category context
|
82
|
+
*/
|
83
|
+
export const Pods: Context.Tag<Pods, Pods> = internal.podsTag
|
84
|
+
|
85
|
+
/**
|
86
|
+
* Constructs a Pods service from its implementation
|
87
|
+
*
|
88
|
+
* @since 1.0.0
|
89
|
+
* @category context
|
90
|
+
*/
|
91
|
+
export const make: (args: Omit<Pods, typeof PodsTypeId>) => Pods = internal.make
|
92
|
+
|
93
|
+
/**
|
94
|
+
* A layer that creates a service that does nothing when called.
|
95
|
+
* Useful for testing ShardManager or when using Sharding.local.
|
96
|
+
*
|
97
|
+
* @since 1.0.0
|
98
|
+
* @category layers
|
99
|
+
*/
|
100
|
+
export const noop: Layer.Layer<Pods> = internal.noop
|
@@ -0,0 +1,74 @@
|
|
1
|
+
/**
|
2
|
+
* @since 1.0.0
|
3
|
+
*/
|
4
|
+
import type * as Context from "effect/Context"
|
5
|
+
import type * as Effect from "effect/Effect"
|
6
|
+
import type * as Layer from "effect/Layer"
|
7
|
+
import * as internal from "./internal/podsHealth.js"
|
8
|
+
import type * as PodAddress from "./PodAddress.js"
|
9
|
+
import type * as Pods from "./Pods.js"
|
10
|
+
|
11
|
+
/**
|
12
|
+
* @since 1.0.0
|
13
|
+
* @category symbols
|
14
|
+
*/
|
15
|
+
export const PodsHealthTypeId: unique symbol = internal.PodsHealthTypeId
|
16
|
+
|
17
|
+
/**
|
18
|
+
* @since 1.0.0
|
19
|
+
* @category symbols
|
20
|
+
*/
|
21
|
+
export type PodsHealthTypeId = typeof PodsHealthTypeId
|
22
|
+
|
23
|
+
/**
|
24
|
+
* An interface to check a pod's health.
|
25
|
+
* This is used when a pod is unresponsive, to check if it should be unassigned all its shards or not.
|
26
|
+
* If the pod is alive, shards will not be unassigned because the pods might still be processing messages and might be responsive again.
|
27
|
+
* If the pod is not alive, shards can be safely reassigned somewhere else.
|
28
|
+
* A typical implementation for this is using k8s to check if the pod still exists.
|
29
|
+
*
|
30
|
+
* @since 1.0.0
|
31
|
+
* @category models
|
32
|
+
*/
|
33
|
+
export interface PodsHealth {
|
34
|
+
/**
|
35
|
+
* @since 1.0.0
|
36
|
+
*/
|
37
|
+
readonly [PodsHealthTypeId]: PodsHealthTypeId
|
38
|
+
|
39
|
+
/**
|
40
|
+
* Check if a pod is still alive.
|
41
|
+
* @since 1.0.0
|
42
|
+
*/
|
43
|
+
readonly isAlive: (podAddress: PodAddress.PodAddress) => Effect.Effect<boolean>
|
44
|
+
}
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Constructs a PodsHealth from its implementation
|
48
|
+
*
|
49
|
+
* @since 1.0.0
|
50
|
+
* @category constructors
|
51
|
+
*/
|
52
|
+
export const make: (args: Omit<PodsHealth, typeof PodsHealthTypeId>) => PodsHealth = internal.make
|
53
|
+
|
54
|
+
/**
|
55
|
+
* @since 1.0.0
|
56
|
+
* @category context
|
57
|
+
*/
|
58
|
+
export const PodsHealth: Context.Tag<PodsHealth, PodsHealth> = internal.podsHealthTag
|
59
|
+
|
60
|
+
/**
|
61
|
+
* A layer that considers pods as always alive.
|
62
|
+
* This is useful for testing only.
|
63
|
+
* @since 1.0.0
|
64
|
+
* @category layers
|
65
|
+
*/
|
66
|
+
export const noop: Layer.Layer<PodsHealth> = internal.noop
|
67
|
+
|
68
|
+
/**
|
69
|
+
* A layer that pings the pod directly to check if it's alive.
|
70
|
+
* This is useful for developing and testing but not reliable in production.
|
71
|
+
* @since 1.0.0
|
72
|
+
* @category layers
|
73
|
+
*/
|
74
|
+
export const local: Layer.Layer<PodsHealth, never, Pods.Pods> = internal.local
|
@@ -0,0 +1,105 @@
|
|
1
|
+
/**
|
2
|
+
* @since 1.0.0
|
3
|
+
*/
|
4
|
+
import * as Schema from "@effect/schema/Schema"
|
5
|
+
import * as Effect from "effect/Effect"
|
6
|
+
import { pipe } from "effect/Function"
|
7
|
+
import * as Queue from "effect/Queue"
|
8
|
+
import { TypeIdSchema } from "./internal/utils.js"
|
9
|
+
|
10
|
+
/** @internal */
|
11
|
+
const PoisonPillSymbolKey = "@effect/cluster/PoisonPill"
|
12
|
+
|
13
|
+
/**
|
14
|
+
* @since 1.0.0
|
15
|
+
* @category symbols
|
16
|
+
*/
|
17
|
+
export const PoisonPillTypeId: unique symbol = Symbol.for(PoisonPillSymbolKey)
|
18
|
+
|
19
|
+
/**
|
20
|
+
* @since 1.0.0
|
21
|
+
* @category symbols
|
22
|
+
*/
|
23
|
+
export type PoisonPillTypeId = typeof PoisonPillTypeId
|
24
|
+
|
25
|
+
/** @internal */
|
26
|
+
const PoisonPillTypeIdSchema = TypeIdSchema(PoisonPillSymbolKey, PoisonPillTypeId)
|
27
|
+
|
28
|
+
/**
|
29
|
+
* @since 1.0.0
|
30
|
+
*/
|
31
|
+
export namespace PoisonPill {
|
32
|
+
/**
|
33
|
+
* This is the shape that a PoisonPill takes over the wire.
|
34
|
+
*
|
35
|
+
* @since 1.0.0
|
36
|
+
* @category models
|
37
|
+
*/
|
38
|
+
export interface Encoded extends Schema.Schema.Encoded<typeof PoisonPill> {}
|
39
|
+
}
|
40
|
+
|
41
|
+
/**
|
42
|
+
* A PoisonPill is a special value that tells a behaviour entity to shut itself down.
|
43
|
+
* PoisonPill is handled only when you are using a Queue-based RecipientBehaviour.
|
44
|
+
* Other RecipientBehaviour such as fromFunctionEffect would not care about PoisonPill.
|
45
|
+
*
|
46
|
+
* @since 1.0.0
|
47
|
+
* @category models
|
48
|
+
*/
|
49
|
+
export class PoisonPill extends Schema.Class<PoisonPill>(PoisonPillSymbolKey)({
|
50
|
+
[PoisonPillTypeId]: Schema.propertySignature(PoisonPillTypeIdSchema).pipe(Schema.fromKey(PoisonPillSymbolKey))
|
51
|
+
}) {
|
52
|
+
}
|
53
|
+
|
54
|
+
/**
|
55
|
+
* Constructs a new PosionPill
|
56
|
+
*
|
57
|
+
* @since 1.0.0
|
58
|
+
* @category constructors
|
59
|
+
*/
|
60
|
+
export const make: Effect.Effect<PoisonPill> = Effect.succeed(
|
61
|
+
new PoisonPill({ [PoisonPillTypeId]: PoisonPillTypeId })
|
62
|
+
)
|
63
|
+
|
64
|
+
/**
|
65
|
+
* Checks if the given value is a PoisonPill.
|
66
|
+
*
|
67
|
+
* @since 1.0.0
|
68
|
+
* @category utils
|
69
|
+
*/
|
70
|
+
export function isPoisonPill(value: unknown): value is PoisonPill {
|
71
|
+
return (
|
72
|
+
typeof value === "object" &&
|
73
|
+
value !== null &&
|
74
|
+
PoisonPillTypeId in value &&
|
75
|
+
value[PoisonPillTypeId] === PoisonPillTypeId
|
76
|
+
)
|
77
|
+
}
|
78
|
+
|
79
|
+
/**
|
80
|
+
* This is the schema for a PoisonPill that is used to encode the value over the wire.
|
81
|
+
* This is useful if you want a behavior that can be shut down from an external message.
|
82
|
+
*
|
83
|
+
* @since 1.0.0
|
84
|
+
* @category schema
|
85
|
+
*/
|
86
|
+
export const schema: Schema.Schema<
|
87
|
+
PoisonPill,
|
88
|
+
PoisonPill.Encoded
|
89
|
+
> = Schema.asSchema(PoisonPill)
|
90
|
+
|
91
|
+
/**
|
92
|
+
* Attempts to take a message from the queue in the same way Queue.take does.
|
93
|
+
* If the result is a PoisonPill, it will interrupt the effect.
|
94
|
+
*
|
95
|
+
* @since 1.0.0
|
96
|
+
* @category utils
|
97
|
+
*/
|
98
|
+
export function takeOrInterrupt<Req>(
|
99
|
+
dequeue: Queue.Dequeue<Req | PoisonPill>
|
100
|
+
): Effect.Effect<Req> {
|
101
|
+
return pipe(
|
102
|
+
Queue.take(dequeue),
|
103
|
+
Effect.flatMap((msg) => isPoisonPill(msg) ? Effect.interrupt : Effect.succeed(msg))
|
104
|
+
)
|
105
|
+
}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
/**
|
2
|
+
* @since 1.0.0
|
3
|
+
*/
|
4
|
+
import * as Schema from "@effect/schema/Schema"
|
5
|
+
import * as Equal from "effect/Equal"
|
6
|
+
import * as Hash from "effect/Hash"
|
7
|
+
import { TypeIdSchema } from "./internal/utils.js"
|
8
|
+
|
9
|
+
const RecipientAddressSymbolKey = "@effect/cluster/RecipientAddress"
|
10
|
+
|
11
|
+
/**
|
12
|
+
* @since 1.0.0
|
13
|
+
* @category symbols
|
14
|
+
*/
|
15
|
+
export const RecipientAddressTypeId: unique symbol = Symbol.for(RecipientAddressSymbolKey)
|
16
|
+
|
17
|
+
/** @internal */
|
18
|
+
const RecipientAddressTypeIdSchema = TypeIdSchema(RecipientAddressSymbolKey, RecipientAddressTypeId)
|
19
|
+
|
20
|
+
/**
|
21
|
+
* A RecipientAddress uniquely identifies a RecipientType + EntityId instance.
|
22
|
+
*
|
23
|
+
* @since 1.0.0
|
24
|
+
* @category models
|
25
|
+
*/
|
26
|
+
export class RecipientAddress extends Schema.Class<RecipientAddress>(RecipientAddressSymbolKey)({
|
27
|
+
[RecipientAddressTypeId]: Schema.propertySignature(RecipientAddressTypeIdSchema).pipe(
|
28
|
+
Schema.fromKey(RecipientAddressSymbolKey)
|
29
|
+
),
|
30
|
+
recipientTypeName: Schema.String,
|
31
|
+
entityId: Schema.String
|
32
|
+
}) {
|
33
|
+
/**
|
34
|
+
* @since 1.0.0
|
35
|
+
*/
|
36
|
+
[Hash.symbol](): number {
|
37
|
+
return Hash.structure({ recipientTypeName: this.recipientTypeName, entityId: this.entityId })
|
38
|
+
}
|
39
|
+
|
40
|
+
/**
|
41
|
+
* @since 1.0.0
|
42
|
+
*/
|
43
|
+
[Equal.symbol](this: RecipientAddress, that: Equal.Equal): boolean {
|
44
|
+
if (isRecipientAddress(that)) {
|
45
|
+
return this.recipientTypeName === that.recipientTypeName && this.entityId === that.entityId
|
46
|
+
}
|
47
|
+
return false
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
/**
|
52
|
+
* Ensure that given value is a RecipientAddress
|
53
|
+
* @since 1.0.0
|
54
|
+
* @category constructors
|
55
|
+
*/
|
56
|
+
export function isRecipientAddress(value: unknown): value is RecipientAddress {
|
57
|
+
return typeof value === "object" && value !== null && RecipientAddressTypeId in value &&
|
58
|
+
value[RecipientAddressTypeId] === RecipientAddressTypeId
|
59
|
+
}
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Given a name and a schema for the protocol, constructs an EntityType.
|
63
|
+
*
|
64
|
+
* @since 1.0.0
|
65
|
+
* @category constructors
|
66
|
+
*/
|
67
|
+
export function makeRecipientAddress(
|
68
|
+
recipientTypeName: string,
|
69
|
+
entityId: string
|
70
|
+
): RecipientAddress {
|
71
|
+
return new RecipientAddress({ [RecipientAddressTypeId]: RecipientAddressTypeId, recipientTypeName, entityId })
|
72
|
+
}
|