@effect/cluster 0.28.4 → 0.29.1
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/ClusterError/package.json +6 -0
- package/ClusterMetrics/package.json +6 -0
- package/ClusterSchema/package.json +6 -0
- package/DeliverAt/package.json +6 -0
- package/Entity/package.json +6 -0
- package/EntityAddress/package.json +6 -0
- package/EntityId/package.json +6 -0
- package/EntityType/package.json +6 -0
- package/Envelope/package.json +6 -0
- package/HttpCommon/package.json +6 -0
- package/HttpRunner/package.json +6 -0
- package/HttpShardManager/package.json +6 -0
- package/MachineId/package.json +6 -0
- package/MessageStorage/package.json +6 -0
- package/README.md +2 -2
- package/Reply/package.json +6 -0
- package/Runner/package.json +6 -0
- package/RunnerAddress/package.json +6 -0
- package/RunnerHealth/package.json +6 -0
- package/RunnerServer/package.json +6 -0
- package/Runners/package.json +6 -0
- package/ShardStorage/package.json +6 -0
- package/Singleton/package.json +6 -0
- package/SingletonAddress/package.json +6 -0
- package/Snowflake/package.json +6 -0
- package/SocketRunner/package.json +6 -0
- package/SocketShardManager/package.json +6 -0
- package/SqlMessageStorage/package.json +6 -0
- package/SqlShardStorage/package.json +6 -0
- package/SynchronizedClock/package.json +6 -0
- package/dist/cjs/ClusterError.js +180 -0
- package/dist/cjs/ClusterError.js.map +1 -0
- package/dist/cjs/ClusterMetrics.js +63 -0
- package/dist/cjs/ClusterMetrics.js.map +1 -0
- package/dist/cjs/{Pods.js → ClusterSchema.js} +10 -22
- package/dist/cjs/ClusterSchema.js.map +1 -0
- package/dist/cjs/DeliverAt.js +30 -0
- package/dist/cjs/DeliverAt.js.map +1 -0
- package/dist/cjs/Entity.js +187 -0
- package/dist/cjs/Entity.js.map +1 -0
- package/dist/cjs/EntityAddress.js +54 -0
- package/dist/cjs/EntityAddress.js.map +1 -0
- package/dist/cjs/{AtLeastOnce.js → EntityId.js} +6 -7
- package/dist/cjs/EntityId.js.map +1 -0
- package/dist/cjs/{ShardManagerClient.js → EntityType.js} +5 -16
- package/dist/cjs/EntityType.js.map +1 -0
- package/dist/cjs/Envelope.js +168 -0
- package/dist/cjs/Envelope.js.map +1 -0
- package/dist/cjs/HttpCommon.js +49 -0
- package/dist/cjs/HttpCommon.js.map +1 -0
- package/dist/cjs/HttpRunner.js +108 -0
- package/dist/cjs/HttpRunner.js.map +1 -0
- package/dist/cjs/HttpShardManager.js +140 -0
- package/dist/cjs/HttpShardManager.js.map +1 -0
- package/dist/cjs/{AtLeastOnceStorage.js → MachineId.js} +11 -9
- package/dist/cjs/MachineId.js.map +1 -0
- package/dist/cjs/Message.js +99 -18
- package/dist/cjs/Message.js.map +1 -1
- package/dist/cjs/MessageStorage.js +356 -0
- package/dist/cjs/MessageStorage.js.map +1 -0
- package/dist/cjs/Reply.js +200 -0
- package/dist/cjs/Reply.js.map +1 -0
- package/dist/cjs/Runner.js +79 -0
- package/dist/cjs/Runner.js.map +1 -0
- package/dist/cjs/RunnerAddress.js +63 -0
- package/dist/cjs/RunnerAddress.js.map +1 -0
- package/dist/cjs/RunnerHealth.js +68 -0
- package/dist/cjs/RunnerHealth.js.map +1 -0
- package/dist/cjs/RunnerServer.js +125 -0
- package/dist/cjs/RunnerServer.js.map +1 -0
- package/dist/cjs/Runners.js +344 -0
- package/dist/cjs/Runners.js.map +1 -0
- package/dist/cjs/ShardId.js +7 -46
- package/dist/cjs/ShardId.js.map +1 -1
- package/dist/cjs/ShardManager.js +493 -8
- package/dist/cjs/ShardManager.js.map +1 -1
- package/dist/cjs/ShardStorage.js +139 -0
- package/dist/cjs/ShardStorage.js.map +1 -0
- package/dist/cjs/Sharding.js +731 -91
- package/dist/cjs/Sharding.js.map +1 -1
- package/dist/cjs/ShardingConfig.js +85 -18
- package/dist/cjs/ShardingConfig.js.map +1 -1
- package/dist/cjs/ShardingRegistrationEvent.js +26 -32
- package/dist/cjs/ShardingRegistrationEvent.js.map +1 -1
- package/dist/cjs/{ManagerConfig.js → Singleton.js} +11 -20
- package/dist/cjs/Singleton.js.map +1 -0
- package/dist/cjs/SingletonAddress.js +50 -0
- package/dist/cjs/SingletonAddress.js.map +1 -0
- package/dist/cjs/Snowflake.js +133 -0
- package/dist/cjs/Snowflake.js.map +1 -0
- package/dist/cjs/SocketRunner.js +40 -0
- package/dist/cjs/SocketRunner.js.map +1 -0
- package/dist/cjs/SocketShardManager.js +33 -0
- package/dist/cjs/SocketShardManager.js.map +1 -0
- package/dist/cjs/SqlMessageStorage.js +668 -0
- package/dist/cjs/SqlMessageStorage.js.map +1 -0
- package/dist/cjs/SqlShardStorage.js +228 -0
- package/dist/cjs/SqlShardStorage.js.map +1 -0
- package/dist/cjs/SynchronizedClock.js +66 -0
- package/dist/cjs/SynchronizedClock.js.map +1 -0
- package/dist/cjs/index.js +57 -45
- package/dist/cjs/internal/entityManager.js +311 -143
- package/dist/cjs/internal/entityManager.js.map +1 -1
- package/dist/cjs/internal/entityReaper.js +47 -0
- package/dist/cjs/internal/entityReaper.js.map +1 -0
- package/dist/cjs/internal/hash.js +20 -0
- package/dist/cjs/internal/hash.js.map +1 -0
- package/dist/cjs/internal/interruptors.js +9 -0
- package/dist/cjs/internal/interruptors.js.map +1 -0
- package/dist/cjs/internal/resourceMap.js +88 -0
- package/dist/cjs/internal/resourceMap.js.map +1 -0
- package/dist/cjs/internal/resourceRef.js +92 -0
- package/dist/cjs/internal/resourceRef.js.map +1 -0
- package/dist/cjs/internal/shardManager.js +219 -235
- package/dist/cjs/internal/shardManager.js.map +1 -1
- package/dist/dts/ClusterError.d.ts +169 -0
- package/dist/dts/ClusterError.d.ts.map +1 -0
- package/dist/dts/ClusterMetrics.d.ts +50 -0
- package/dist/dts/ClusterMetrics.d.ts.map +1 -0
- package/dist/dts/ClusterSchema.d.ts +13 -0
- package/dist/dts/ClusterSchema.d.ts.map +1 -0
- package/dist/dts/DeliverAt.d.ts +27 -0
- package/dist/dts/DeliverAt.d.ts.map +1 -0
- package/dist/dts/Entity.d.ts +180 -0
- package/dist/dts/Entity.d.ts.map +1 -0
- package/dist/dts/EntityAddress.d.ts +55 -0
- package/dist/dts/EntityAddress.d.ts.map +1 -0
- package/dist/dts/EntityId.d.ts +15 -0
- package/dist/dts/EntityId.d.ts.map +1 -0
- package/dist/dts/EntityType.d.ts +15 -0
- package/dist/dts/EntityType.d.ts.map +1 -0
- package/dist/dts/Envelope.d.ts +252 -0
- package/dist/dts/Envelope.d.ts.map +1 -0
- package/dist/dts/HttpCommon.d.ts +25 -0
- package/dist/dts/HttpCommon.d.ts.map +1 -0
- package/dist/dts/HttpRunner.d.ts +76 -0
- package/dist/dts/HttpRunner.d.ts.map +1 -0
- package/dist/dts/HttpShardManager.d.ts +119 -0
- package/dist/dts/HttpShardManager.d.ts.map +1 -0
- package/dist/dts/MachineId.d.ts +20 -0
- package/dist/dts/MachineId.d.ts.map +1 -0
- package/dist/dts/Message.d.ts +91 -74
- package/dist/dts/Message.d.ts.map +1 -1
- package/dist/dts/MessageStorage.d.ts +336 -0
- package/dist/dts/MessageStorage.d.ts.map +1 -0
- package/dist/dts/Reply.d.ts +171 -0
- package/dist/dts/Reply.d.ts.map +1 -0
- package/dist/dts/Runner.d.ts +81 -0
- package/dist/dts/Runner.d.ts.map +1 -0
- package/dist/dts/RunnerAddress.d.ts +56 -0
- package/dist/dts/RunnerAddress.d.ts.map +1 -0
- package/dist/dts/RunnerHealth.d.ts +54 -0
- package/dist/dts/RunnerHealth.d.ts.map +1 -0
- package/dist/dts/RunnerServer.d.ts +44 -0
- package/dist/dts/RunnerServer.d.ts.map +1 -0
- package/dist/dts/Runners.d.ts +161 -0
- package/dist/dts/Runners.d.ts.map +1 -0
- package/dist/dts/ShardId.d.ts +5 -55
- package/dist/dts/ShardId.d.ts.map +1 -1
- package/dist/dts/ShardManager.d.ts +435 -23
- package/dist/dts/ShardManager.d.ts.map +1 -1
- package/dist/dts/ShardStorage.d.ts +200 -0
- package/dist/dts/ShardStorage.d.ts.map +1 -0
- package/dist/dts/Sharding.d.ts +64 -133
- package/dist/dts/Sharding.d.ts.map +1 -1
- package/dist/dts/ShardingConfig.d.ts +147 -44
- package/dist/dts/ShardingConfig.d.ts.map +1 -1
- package/dist/dts/ShardingRegistrationEvent.d.ts +38 -23
- package/dist/dts/ShardingRegistrationEvent.d.ts.map +1 -1
- package/dist/dts/Singleton.d.ts +13 -0
- package/dist/dts/Singleton.d.ts.map +1 -0
- package/dist/dts/SingletonAddress.d.ts +49 -0
- package/dist/dts/SingletonAddress.d.ts.map +1 -0
- package/dist/dts/Snowflake.d.ts +121 -0
- package/dist/dts/Snowflake.d.ts.map +1 -0
- package/dist/dts/SocketRunner.d.ts +22 -0
- package/dist/dts/SocketRunner.d.ts.map +1 -0
- package/dist/dts/SocketShardManager.d.ts +17 -0
- package/dist/dts/SocketShardManager.d.ts.map +1 -0
- package/dist/dts/SqlMessageStorage.d.ts +43 -0
- package/dist/dts/SqlMessageStorage.d.ts.map +1 -0
- package/dist/dts/SqlShardStorage.d.ts +38 -0
- package/dist/dts/SqlShardStorage.d.ts.map +1 -0
- package/dist/dts/SynchronizedClock.d.ts +19 -0
- package/dist/dts/SynchronizedClock.d.ts.map +1 -0
- package/dist/dts/index.d.ts +48 -24
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/dts/internal/entityReaper.d.ts +2 -0
- package/dist/dts/internal/entityReaper.d.ts.map +1 -0
- package/dist/dts/internal/hash.d.ts +2 -0
- package/dist/dts/internal/hash.d.ts.map +1 -0
- package/dist/dts/internal/interruptors.d.ts +2 -0
- package/dist/dts/internal/interruptors.d.ts.map +1 -0
- package/dist/dts/internal/resourceMap.d.ts +22 -0
- package/dist/dts/internal/resourceMap.d.ts.map +1 -0
- package/dist/dts/internal/resourceRef.d.ts +25 -0
- package/dist/dts/internal/resourceRef.d.ts.map +1 -0
- package/dist/dts/internal/shardManager.d.ts +1 -11
- package/dist/dts/internal/shardManager.d.ts.map +1 -1
- package/dist/esm/ClusterError.js +164 -0
- package/dist/esm/ClusterError.js.map +1 -0
- package/dist/esm/ClusterMetrics.js +54 -0
- package/dist/esm/ClusterMetrics.js.map +1 -0
- package/dist/esm/ClusterSchema.js +13 -0
- package/dist/esm/ClusterSchema.js.map +1 -0
- package/dist/esm/DeliverAt.js +22 -0
- package/dist/esm/DeliverAt.js.map +1 -0
- package/dist/esm/Entity.js +173 -0
- package/dist/esm/Entity.js.map +1 -0
- package/dist/esm/EntityAddress.js +44 -0
- package/dist/esm/EntityAddress.js.map +1 -0
- package/dist/esm/EntityId.js +10 -0
- package/dist/esm/EntityId.js.map +1 -0
- package/dist/esm/EntityType.js +10 -0
- package/dist/esm/EntityType.js.map +1 -0
- package/dist/esm/Envelope.js +154 -0
- package/dist/esm/Envelope.js.map +1 -0
- package/dist/esm/HttpCommon.js +38 -0
- package/dist/esm/HttpCommon.js.map +1 -0
- package/dist/esm/HttpRunner.js +98 -0
- package/dist/esm/HttpRunner.js.map +1 -0
- package/dist/esm/HttpShardManager.js +128 -0
- package/dist/esm/HttpShardManager.js.map +1 -0
- package/dist/esm/MachineId.js +17 -0
- package/dist/esm/MachineId.js.map +1 -0
- package/dist/esm/Message.js +88 -17
- package/dist/esm/Message.js.map +1 -1
- package/dist/esm/MessageStorage.js +345 -0
- package/dist/esm/MessageStorage.js.map +1 -0
- package/dist/esm/Reply.js +184 -0
- package/dist/esm/Reply.js.map +1 -0
- package/dist/esm/Runner.js +68 -0
- package/dist/esm/Runner.js.map +1 -0
- package/dist/esm/RunnerAddress.js +52 -0
- package/dist/esm/RunnerAddress.js.map +1 -0
- package/dist/esm/RunnerHealth.js +58 -0
- package/dist/esm/RunnerHealth.js.map +1 -0
- package/dist/esm/RunnerServer.js +116 -0
- package/dist/esm/RunnerServer.js.map +1 -0
- package/dist/esm/Runners.js +332 -0
- package/dist/esm/Runners.js.map +1 -0
- package/dist/esm/ShardId.js +5 -42
- package/dist/esm/ShardId.js.map +1 -1
- package/dist/esm/ShardManager.js +486 -7
- package/dist/esm/ShardManager.js.map +1 -1
- package/dist/esm/ShardStorage.js +129 -0
- package/dist/esm/ShardStorage.js.map +1 -0
- package/dist/esm/Sharding.js +729 -90
- package/dist/esm/Sharding.js.map +1 -1
- package/dist/esm/ShardingConfig.js +80 -17
- package/dist/esm/ShardingConfig.js.map +1 -1
- package/dist/esm/ShardingRegistrationEvent.js +19 -29
- package/dist/esm/ShardingRegistrationEvent.js.map +1 -1
- package/dist/esm/Singleton.js +15 -0
- package/dist/esm/Singleton.js.map +1 -0
- package/dist/esm/SingletonAddress.js +40 -0
- package/dist/esm/SingletonAddress.js.map +1 -0
- package/dist/esm/Snowflake.js +117 -0
- package/dist/esm/Snowflake.js.map +1 -0
- package/dist/esm/SocketRunner.js +31 -0
- package/dist/esm/SocketRunner.js.map +1 -0
- package/dist/esm/SocketShardManager.js +24 -0
- package/dist/esm/SocketShardManager.js.map +1 -0
- package/dist/esm/SqlMessageStorage.js +658 -0
- package/dist/esm/SqlMessageStorage.js.map +1 -0
- package/dist/esm/SqlShardStorage.js +218 -0
- package/dist/esm/SqlShardStorage.js.map +1 -0
- package/dist/esm/SynchronizedClock.js +57 -0
- package/dist/esm/SynchronizedClock.js.map +1 -0
- package/dist/esm/index.js +48 -24
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/entityManager.js +311 -142
- package/dist/esm/internal/entityManager.js.map +1 -1
- package/dist/esm/internal/entityReaper.js +38 -0
- package/dist/esm/internal/entityReaper.js.map +1 -0
- package/dist/esm/internal/hash.js +12 -0
- package/dist/esm/internal/hash.js.map +1 -0
- package/dist/esm/internal/interruptors.js +3 -0
- package/dist/esm/internal/interruptors.js.map +1 -0
- package/dist/esm/internal/resourceMap.js +79 -0
- package/dist/esm/internal/resourceMap.js.map +1 -0
- package/dist/esm/internal/resourceRef.js +83 -0
- package/dist/esm/internal/resourceRef.js.map +1 -0
- package/dist/esm/internal/shardManager.js +217 -233
- package/dist/esm/internal/shardManager.js.map +1 -1
- package/package.json +212 -154
- package/src/ClusterError.ts +193 -0
- package/src/ClusterMetrics.ts +62 -0
- package/src/ClusterSchema.ts +13 -0
- package/src/DeliverAt.ts +36 -0
- package/src/Entity.ts +438 -0
- package/src/EntityAddress.ts +55 -0
- package/src/EntityId.ts +16 -0
- package/src/EntityType.ts +16 -0
- package/src/Envelope.ts +352 -0
- package/src/HttpCommon.ts +73 -0
- package/src/HttpRunner.ts +196 -0
- package/src/HttpShardManager.ts +273 -0
- package/src/MachineId.ts +27 -0
- package/src/Message.ts +143 -92
- package/src/MessageStorage.ts +697 -0
- package/src/Reply.ts +295 -0
- package/src/Runner.ts +84 -0
- package/src/RunnerAddress.ts +61 -0
- package/src/RunnerHealth.ts +87 -0
- package/src/RunnerServer.ts +156 -0
- package/src/Runners.ts +533 -0
- package/src/ShardId.ts +10 -62
- package/src/ShardManager.ts +780 -29
- package/src/ShardStorage.ts +289 -0
- package/src/Sharding.ts +1059 -186
- package/src/ShardingConfig.ts +186 -45
- package/src/ShardingRegistrationEvent.ts +38 -39
- package/src/Singleton.ts +20 -0
- package/src/SingletonAddress.ts +47 -0
- package/src/Snowflake.ts +194 -0
- package/src/SocketRunner.ts +59 -0
- package/src/SocketShardManager.ts +48 -0
- package/src/SqlMessageStorage.ts +833 -0
- package/src/SqlShardStorage.ts +292 -0
- package/src/SynchronizedClock.ts +82 -0
- package/src/index.ts +54 -24
- package/src/internal/entityManager.ts +464 -361
- package/src/internal/entityReaper.ts +53 -0
- package/src/internal/hash.ts +11 -0
- package/src/internal/interruptors.ts +4 -0
- package/src/internal/resourceMap.ts +89 -0
- package/src/internal/resourceRef.ts +88 -0
- package/src/internal/shardManager.ts +273 -546
- package/AtLeastOnce/package.json +0 -6
- package/AtLeastOnceStorage/package.json +0 -6
- package/Broadcaster/package.json +0 -6
- package/ManagerConfig/package.json +0 -6
- package/MessageState/package.json +0 -6
- package/Messenger/package.json +0 -6
- package/Pod/package.json +0 -6
- package/PodAddress/package.json +0 -6
- package/Pods/package.json +0 -6
- package/PodsHealth/package.json +0 -6
- package/PoisonPill/package.json +0 -6
- package/RecipientAddress/package.json +0 -6
- package/RecipientBehaviour/package.json +0 -6
- package/RecipientBehaviourContext/package.json +0 -6
- package/RecipientType/package.json +0 -6
- package/Serialization/package.json +0 -6
- package/SerializedEnvelope/package.json +0 -6
- package/SerializedMessage/package.json +0 -6
- package/ShardManagerClient/package.json +0 -6
- package/ShardingEvent/package.json +0 -6
- package/ShardingException/package.json +0 -6
- package/Storage/package.json +0 -6
- package/dist/cjs/AtLeastOnce.js.map +0 -1
- package/dist/cjs/AtLeastOnceStorage.js.map +0 -1
- package/dist/cjs/Broadcaster.js +0 -6
- package/dist/cjs/Broadcaster.js.map +0 -1
- package/dist/cjs/ManagerConfig.js.map +0 -1
- package/dist/cjs/MessageState.js +0 -55
- package/dist/cjs/MessageState.js.map +0 -1
- package/dist/cjs/Messenger.js +0 -6
- package/dist/cjs/Messenger.js.map +0 -1
- package/dist/cjs/Pod.js +0 -78
- package/dist/cjs/Pod.js.map +0 -1
- package/dist/cjs/PodAddress.js +0 -77
- package/dist/cjs/PodAddress.js.map +0 -1
- package/dist/cjs/Pods.js.map +0 -1
- package/dist/cjs/PodsHealth.js +0 -41
- package/dist/cjs/PodsHealth.js.map +0 -1
- package/dist/cjs/PoisonPill.js +0 -78
- package/dist/cjs/PoisonPill.js.map +0 -1
- package/dist/cjs/RecipientAddress.js +0 -79
- package/dist/cjs/RecipientAddress.js.map +0 -1
- package/dist/cjs/RecipientBehaviour.js +0 -38
- package/dist/cjs/RecipientBehaviour.js.map +0 -1
- package/dist/cjs/RecipientBehaviourContext.js +0 -64
- package/dist/cjs/RecipientBehaviourContext.js.map +0 -1
- package/dist/cjs/RecipientType.js +0 -123
- package/dist/cjs/RecipientType.js.map +0 -1
- package/dist/cjs/Serialization.js +0 -32
- package/dist/cjs/Serialization.js.map +0 -1
- package/dist/cjs/SerializedEnvelope.js +0 -87
- package/dist/cjs/SerializedEnvelope.js.map +0 -1
- package/dist/cjs/SerializedMessage.js +0 -64
- package/dist/cjs/SerializedMessage.js.map +0 -1
- package/dist/cjs/ShardManagerClient.js.map +0 -1
- package/dist/cjs/ShardingEvent.js +0 -72
- package/dist/cjs/ShardingEvent.js.map +0 -1
- package/dist/cjs/ShardingException.js +0 -107
- package/dist/cjs/ShardingException.js.map +0 -1
- package/dist/cjs/Storage.js +0 -40
- package/dist/cjs/Storage.js.map +0 -1
- package/dist/cjs/internal/atLeastOnce.js +0 -35
- package/dist/cjs/internal/atLeastOnce.js.map +0 -1
- package/dist/cjs/internal/atLeastOnceStorage.js +0 -163
- package/dist/cjs/internal/atLeastOnceStorage.js.map +0 -1
- package/dist/cjs/internal/entityState.js +0 -47
- package/dist/cjs/internal/entityState.js.map +0 -1
- package/dist/cjs/internal/managerConfig.js +0 -46
- package/dist/cjs/internal/managerConfig.js.map +0 -1
- package/dist/cjs/internal/message.js +0 -48
- package/dist/cjs/internal/message.js.map +0 -1
- package/dist/cjs/internal/messageState.js +0 -79
- package/dist/cjs/internal/messageState.js.map +0 -1
- package/dist/cjs/internal/podWithMetadata.js +0 -54
- package/dist/cjs/internal/podWithMetadata.js.map +0 -1
- package/dist/cjs/internal/pods.js +0 -35
- package/dist/cjs/internal/pods.js.map +0 -1
- package/dist/cjs/internal/podsHealth.js +0 -40
- package/dist/cjs/internal/podsHealth.js.map +0 -1
- package/dist/cjs/internal/recipientBehaviour.js +0 -52
- package/dist/cjs/internal/recipientBehaviour.js.map +0 -1
- package/dist/cjs/internal/recipientBehaviourContext.js +0 -36
- package/dist/cjs/internal/recipientBehaviourContext.js.map +0 -1
- package/dist/cjs/internal/serialization.js +0 -48
- package/dist/cjs/internal/serialization.js.map +0 -1
- package/dist/cjs/internal/shardManagerClient.js +0 -48
- package/dist/cjs/internal/shardManagerClient.js.map +0 -1
- package/dist/cjs/internal/shardManagerState.js +0 -44
- package/dist/cjs/internal/shardManagerState.js.map +0 -1
- package/dist/cjs/internal/sharding.js +0 -306
- package/dist/cjs/internal/sharding.js.map +0 -1
- package/dist/cjs/internal/shardingConfig.js +0 -56
- package/dist/cjs/internal/shardingConfig.js.map +0 -1
- package/dist/cjs/internal/storage.js +0 -52
- package/dist/cjs/internal/storage.js.map +0 -1
- package/dist/cjs/internal/utils.js +0 -69
- package/dist/cjs/internal/utils.js.map +0 -1
- package/dist/dts/AtLeastOnce.d.ts +0 -20
- package/dist/dts/AtLeastOnce.d.ts.map +0 -1
- package/dist/dts/AtLeastOnceStorage.d.ts +0 -75
- package/dist/dts/AtLeastOnceStorage.d.ts.map +0 -1
- package/dist/dts/Broadcaster.d.ts +0 -32
- package/dist/dts/Broadcaster.d.ts.map +0 -1
- package/dist/dts/ManagerConfig.d.ts +0 -61
- package/dist/dts/ManagerConfig.d.ts.map +0 -1
- package/dist/dts/MessageState.d.ts +0 -107
- package/dist/dts/MessageState.d.ts.map +0 -1
- package/dist/dts/Messenger.d.ts +0 -32
- package/dist/dts/Messenger.d.ts.map +0 -1
- package/dist/dts/Pod.d.ts +0 -81
- package/dist/dts/Pod.d.ts.map +0 -1
- package/dist/dts/PodAddress.d.ts +0 -80
- package/dist/dts/PodAddress.d.ts.map +0 -1
- package/dist/dts/Pods.d.ts +0 -78
- package/dist/dts/Pods.d.ts.map +0 -1
- package/dist/dts/PodsHealth.d.ts +0 -66
- package/dist/dts/PodsHealth.d.ts.map +0 -1
- package/dist/dts/PoisonPill.d.ts +0 -78
- package/dist/dts/PoisonPill.d.ts.map +0 -1
- package/dist/dts/RecipientAddress.d.ts +0 -57
- package/dist/dts/RecipientAddress.d.ts.map +0 -1
- package/dist/dts/RecipientBehaviour.d.ts +0 -72
- package/dist/dts/RecipientBehaviour.d.ts.map +0 -1
- package/dist/dts/RecipientBehaviourContext.d.ts +0 -83
- package/dist/dts/RecipientBehaviourContext.d.ts.map +0 -1
- package/dist/dts/RecipientType.d.ts +0 -93
- package/dist/dts/RecipientType.d.ts.map +0 -1
- package/dist/dts/Serialization.d.ts +0 -58
- package/dist/dts/Serialization.d.ts.map +0 -1
- package/dist/dts/SerializedEnvelope.d.ts +0 -86
- package/dist/dts/SerializedEnvelope.d.ts.map +0 -1
- package/dist/dts/SerializedMessage.d.ts +0 -66
- package/dist/dts/SerializedMessage.d.ts.map +0 -1
- package/dist/dts/ShardManagerClient.d.ts +0 -50
- package/dist/dts/ShardManagerClient.d.ts.map +0 -1
- package/dist/dts/ShardingEvent.d.ts +0 -90
- package/dist/dts/ShardingEvent.d.ts.map +0 -1
- package/dist/dts/ShardingException.d.ts +0 -125
- package/dist/dts/ShardingException.d.ts.map +0 -1
- package/dist/dts/Storage.d.ts +0 -78
- package/dist/dts/Storage.d.ts.map +0 -1
- package/dist/dts/internal/atLeastOnce.d.ts +0 -2
- package/dist/dts/internal/atLeastOnce.d.ts.map +0 -1
- package/dist/dts/internal/atLeastOnceStorage.d.ts +0 -2
- package/dist/dts/internal/atLeastOnceStorage.d.ts.map +0 -1
- package/dist/dts/internal/entityState.d.ts +0 -21
- package/dist/dts/internal/entityState.d.ts.map +0 -1
- package/dist/dts/internal/managerConfig.d.ts +0 -2
- package/dist/dts/internal/managerConfig.d.ts.map +0 -1
- package/dist/dts/internal/message.d.ts +0 -9
- package/dist/dts/internal/message.d.ts.map +0 -1
- package/dist/dts/internal/messageState.d.ts +0 -2
- package/dist/dts/internal/messageState.d.ts.map +0 -1
- package/dist/dts/internal/podWithMetadata.d.ts +0 -2
- package/dist/dts/internal/podWithMetadata.d.ts.map +0 -1
- package/dist/dts/internal/pods.d.ts +0 -2
- package/dist/dts/internal/pods.d.ts.map +0 -1
- package/dist/dts/internal/podsHealth.d.ts +0 -2
- package/dist/dts/internal/podsHealth.d.ts.map +0 -1
- package/dist/dts/internal/recipientBehaviour.d.ts +0 -2
- package/dist/dts/internal/recipientBehaviour.d.ts.map +0 -1
- package/dist/dts/internal/recipientBehaviourContext.d.ts +0 -2
- package/dist/dts/internal/recipientBehaviourContext.d.ts.map +0 -1
- package/dist/dts/internal/serialization.d.ts +0 -2
- package/dist/dts/internal/serialization.d.ts.map +0 -1
- package/dist/dts/internal/shardManagerClient.d.ts +0 -2
- package/dist/dts/internal/shardManagerClient.d.ts.map +0 -1
- package/dist/dts/internal/shardManagerState.d.ts +0 -26
- package/dist/dts/internal/shardManagerState.d.ts.map +0 -1
- package/dist/dts/internal/sharding.d.ts +0 -2
- package/dist/dts/internal/sharding.d.ts.map +0 -1
- package/dist/dts/internal/shardingConfig.d.ts +0 -2
- package/dist/dts/internal/shardingConfig.d.ts.map +0 -1
- package/dist/dts/internal/storage.d.ts +0 -2
- package/dist/dts/internal/storage.d.ts.map +0 -1
- package/dist/dts/internal/utils.d.ts +0 -2
- package/dist/dts/internal/utils.d.ts.map +0 -1
- package/dist/esm/AtLeastOnce.js +0 -12
- package/dist/esm/AtLeastOnce.js.map +0 -1
- package/dist/esm/AtLeastOnceStorage.js +0 -17
- package/dist/esm/AtLeastOnceStorage.js.map +0 -1
- package/dist/esm/Broadcaster.js +0 -2
- package/dist/esm/Broadcaster.js.map +0 -1
- package/dist/esm/ManagerConfig.js +0 -26
- package/dist/esm/ManagerConfig.js.map +0 -1
- package/dist/esm/MessageState.js +0 -47
- package/dist/esm/MessageState.js.map +0 -1
- package/dist/esm/Messenger.js +0 -2
- package/dist/esm/Messenger.js.map +0 -1
- package/dist/esm/Pod.js +0 -65
- package/dist/esm/Pod.js.map +0 -1
- package/dist/esm/PodAddress.js +0 -64
- package/dist/esm/PodAddress.js.map +0 -1
- package/dist/esm/Pods.js +0 -27
- package/dist/esm/Pods.js.map +0 -1
- package/dist/esm/PodsHealth.js +0 -33
- package/dist/esm/PodsHealth.js.map +0 -1
- package/dist/esm/PoisonPill.js +0 -65
- package/dist/esm/PoisonPill.js.map +0 -1
- package/dist/esm/RecipientAddress.js +0 -67
- package/dist/esm/RecipientAddress.js.map +0 -1
- package/dist/esm/RecipientBehaviour.js +0 -30
- package/dist/esm/RecipientBehaviour.js.map +0 -1
- package/dist/esm/RecipientBehaviourContext.js +0 -56
- package/dist/esm/RecipientBehaviourContext.js.map +0 -1
- package/dist/esm/RecipientType.js +0 -108
- package/dist/esm/RecipientType.js.map +0 -1
- package/dist/esm/Serialization.js +0 -24
- package/dist/esm/Serialization.js.map +0 -1
- package/dist/esm/SerializedEnvelope.js +0 -74
- package/dist/esm/SerializedEnvelope.js.map +0 -1
- package/dist/esm/SerializedMessage.js +0 -51
- package/dist/esm/SerializedMessage.js.map +0 -1
- package/dist/esm/ShardManagerClient.js +0 -22
- package/dist/esm/ShardManagerClient.js.map +0 -1
- package/dist/esm/ShardingEvent.js +0 -62
- package/dist/esm/ShardingEvent.js.map +0 -1
- package/dist/esm/ShardingException.js +0 -91
- package/dist/esm/ShardingException.js.map +0 -1
- package/dist/esm/Storage.js +0 -32
- package/dist/esm/Storage.js.map +0 -1
- package/dist/esm/internal/atLeastOnce.js +0 -26
- package/dist/esm/internal/atLeastOnce.js.map +0 -1
- package/dist/esm/internal/atLeastOnceStorage.js +0 -154
- package/dist/esm/internal/atLeastOnceStorage.js.map +0 -1
- package/dist/esm/internal/entityState.js +0 -35
- package/dist/esm/internal/entityState.js.map +0 -1
- package/dist/esm/internal/managerConfig.js +0 -38
- package/dist/esm/internal/managerConfig.js.map +0 -1
- package/dist/esm/internal/message.js +0 -35
- package/dist/esm/internal/message.js.map +0 -1
- package/dist/esm/internal/messageState.js +0 -66
- package/dist/esm/internal/messageState.js.map +0 -1
- package/dist/esm/internal/podWithMetadata.js +0 -41
- package/dist/esm/internal/podWithMetadata.js.map +0 -1
- package/dist/esm/internal/pods.js +0 -25
- package/dist/esm/internal/pods.js.map +0 -1
- package/dist/esm/internal/podsHealth.js +0 -30
- package/dist/esm/internal/podsHealth.js.map +0 -1
- package/dist/esm/internal/recipientBehaviour.js +0 -42
- package/dist/esm/internal/recipientBehaviour.js.map +0 -1
- package/dist/esm/internal/recipientBehaviourContext.js +0 -26
- package/dist/esm/internal/recipientBehaviourContext.js.map +0 -1
- package/dist/esm/internal/serialization.js +0 -38
- package/dist/esm/internal/serialization.js.map +0 -1
- package/dist/esm/internal/shardManagerClient.js +0 -38
- package/dist/esm/internal/shardManagerClient.js.map +0 -1
- package/dist/esm/internal/shardManagerState.js +0 -36
- package/dist/esm/internal/shardManagerState.js.map +0 -1
- package/dist/esm/internal/sharding.js +0 -288
- package/dist/esm/internal/sharding.js.map +0 -1
- package/dist/esm/internal/shardingConfig.js +0 -47
- package/dist/esm/internal/shardingConfig.js.map +0 -1
- package/dist/esm/internal/storage.js +0 -42
- package/dist/esm/internal/storage.js.map +0 -1
- package/dist/esm/internal/utils.js +0 -56
- package/dist/esm/internal/utils.js.map +0 -1
- package/src/AtLeastOnce.ts +0 -28
- package/src/AtLeastOnceStorage.ts +0 -96
- package/src/Broadcaster.ts +0 -48
- package/src/ManagerConfig.ts +0 -67
- package/src/MessageState.ts +0 -126
- package/src/Messenger.ts +0 -40
- package/src/Pod.ts +0 -95
- package/src/PodAddress.ts +0 -94
- package/src/Pods.ts +0 -100
- package/src/PodsHealth.ts +0 -74
- package/src/PoisonPill.ts +0 -105
- package/src/RecipientAddress.ts +0 -72
- package/src/RecipientBehaviour.ts +0 -108
- package/src/RecipientBehaviourContext.ts +0 -101
- package/src/RecipientType.ts +0 -134
- package/src/Serialization.ts +0 -72
- package/src/SerializedEnvelope.ts +0 -108
- package/src/SerializedMessage.ts +0 -82
- package/src/ShardManagerClient.ts +0 -57
- package/src/ShardingEvent.ts +0 -121
- package/src/ShardingException.ts +0 -151
- package/src/Storage.ts +0 -92
- package/src/internal/atLeastOnce.ts +0 -59
- package/src/internal/atLeastOnceStorage.ts +0 -218
- package/src/internal/entityState.ts +0 -64
- package/src/internal/managerConfig.ts +0 -84
- package/src/internal/message.ts +0 -63
- package/src/internal/messageState.ts +0 -98
- package/src/internal/podWithMetadata.ts +0 -72
- package/src/internal/pods.ts +0 -29
- package/src/internal/podsHealth.ts +0 -39
- package/src/internal/recipientBehaviour.ts +0 -133
- package/src/internal/recipientBehaviourContext.ts +0 -70
- package/src/internal/serialization.ts +0 -63
- package/src/internal/shardManagerClient.ts +0 -49
- package/src/internal/shardManagerState.ts +0 -80
- package/src/internal/sharding.ts +0 -789
- package/src/internal/shardingConfig.ts +0 -97
- package/src/internal/storage.ts +0 -60
- package/src/internal/utils.ts +0 -54
@@ -0,0 +1,697 @@
|
|
1
|
+
/**
|
2
|
+
* @since 1.0.0
|
3
|
+
*/
|
4
|
+
import type * as Rpc from "@effect/rpc/Rpc"
|
5
|
+
import * as Arr from "effect/Array"
|
6
|
+
import * as Context from "effect/Context"
|
7
|
+
import * as Data from "effect/Data"
|
8
|
+
import * as Effect from "effect/Effect"
|
9
|
+
import * as Exit from "effect/Exit"
|
10
|
+
import * as FiberRef from "effect/FiberRef"
|
11
|
+
import { globalValue } from "effect/GlobalValue"
|
12
|
+
import * as Iterable from "effect/Iterable"
|
13
|
+
import * as Layer from "effect/Layer"
|
14
|
+
import * as Option from "effect/Option"
|
15
|
+
import type { ParseError } from "effect/ParseResult"
|
16
|
+
import type { Predicate } from "effect/Predicate"
|
17
|
+
import * as Schema from "effect/Schema"
|
18
|
+
import type { PersistenceError } from "./ClusterError.js"
|
19
|
+
import { MalformedMessage } from "./ClusterError.js"
|
20
|
+
import * as DeliverAt from "./DeliverAt.js"
|
21
|
+
import type { EntityAddress } from "./EntityAddress.js"
|
22
|
+
import * as Envelope from "./Envelope.js"
|
23
|
+
import * as Message from "./Message.js"
|
24
|
+
import * as Reply from "./Reply.js"
|
25
|
+
import type { ShardId } from "./ShardId.js"
|
26
|
+
import type { ShardingConfig } from "./ShardingConfig.js"
|
27
|
+
import * as Snowflake from "./Snowflake.js"
|
28
|
+
|
29
|
+
/**
|
30
|
+
* @since 1.0.0
|
31
|
+
* @category context
|
32
|
+
*/
|
33
|
+
export class MessageStorage extends Context.Tag("@effect/cluster/MessageStorage")<MessageStorage, {
|
34
|
+
/**
|
35
|
+
* Save the provided message and its associated metadata.
|
36
|
+
*/
|
37
|
+
readonly saveRequest: <R extends Rpc.Any>(
|
38
|
+
envelope: Message.OutgoingRequest<R>
|
39
|
+
) => Effect.Effect<SaveResult<R>, PersistenceError | MalformedMessage>
|
40
|
+
|
41
|
+
/**
|
42
|
+
* Save the provided message and its associated metadata.
|
43
|
+
*/
|
44
|
+
readonly saveEnvelope: (
|
45
|
+
envelope: Message.OutgoingEnvelope
|
46
|
+
) => Effect.Effect<void, PersistenceError | MalformedMessage>
|
47
|
+
|
48
|
+
/**
|
49
|
+
* Save the provided `Reply` and its associated metadata.
|
50
|
+
*/
|
51
|
+
readonly saveReply: <R extends Rpc.Any>(
|
52
|
+
reply: Reply.ReplyWithContext<R>
|
53
|
+
) => Effect.Effect<void, PersistenceError | MalformedMessage>
|
54
|
+
|
55
|
+
/**
|
56
|
+
* Retrieves the replies for the specified requests.
|
57
|
+
*
|
58
|
+
* - Un-acknowledged chunk replies
|
59
|
+
* - WithExit replies
|
60
|
+
*/
|
61
|
+
readonly repliesFor: <R extends Rpc.Any>(
|
62
|
+
requests: Iterable<Message.OutgoingRequest<R>>
|
63
|
+
) => Effect.Effect<Array<Reply.Reply<R>>, PersistenceError | MalformedMessage>
|
64
|
+
|
65
|
+
/**
|
66
|
+
* For locally sent messages, register a handler to process the replies.
|
67
|
+
*/
|
68
|
+
readonly registerReplyHandler: <R extends Rpc.Any>(message: Message.OutgoingRequest<R>) => Effect.Effect<void>
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Retrieves the unprocessed messages for the specified shards.
|
72
|
+
*
|
73
|
+
* A message is unprocessed when:
|
74
|
+
*
|
75
|
+
* - Requests that have no WithExit replies
|
76
|
+
* - Or they have no unacknowledged chunk replies
|
77
|
+
* - The latest AckChunk envelope
|
78
|
+
* - All Interrupt's for unprocessed requests
|
79
|
+
*/
|
80
|
+
readonly unprocessedMessages: (
|
81
|
+
shardIds: Iterable<ShardId>
|
82
|
+
) => Effect.Effect<Array<Message.Incoming<any>>, PersistenceError>
|
83
|
+
|
84
|
+
/**
|
85
|
+
* Retrieves the unprocessed messages by id.
|
86
|
+
*/
|
87
|
+
readonly unprocessedMessagesById: <R extends Rpc.Any>(
|
88
|
+
messageIds: Iterable<Snowflake.Snowflake>
|
89
|
+
) => Effect.Effect<Array<Message.Incoming<R>>, PersistenceError>
|
90
|
+
|
91
|
+
/**
|
92
|
+
* Reset the mailbox state for the provided address.
|
93
|
+
*/
|
94
|
+
readonly resetAddress: (
|
95
|
+
address: EntityAddress
|
96
|
+
) => Effect.Effect<void, PersistenceError>
|
97
|
+
}>() {}
|
98
|
+
|
99
|
+
/**
|
100
|
+
* @since 1.0.0
|
101
|
+
* @category SaveResult
|
102
|
+
*/
|
103
|
+
export type SaveResult<R extends Rpc.Any> = SaveResult.Success | SaveResult.Duplicate<R>
|
104
|
+
|
105
|
+
/**
|
106
|
+
* @since 1.0.0
|
107
|
+
* @category SaveResult
|
108
|
+
*/
|
109
|
+
export const SaveResult = Data.taggedEnum<SaveResult.Constructor>()
|
110
|
+
|
111
|
+
/**
|
112
|
+
* @since 1.0.0
|
113
|
+
* @category SaveResult
|
114
|
+
*/
|
115
|
+
export const SaveResultEncoded = Data.taggedEnum<SaveResult.Encoded>()
|
116
|
+
|
117
|
+
/**
|
118
|
+
* @since 1.0.0
|
119
|
+
* @category SaveResult
|
120
|
+
*/
|
121
|
+
export declare namespace SaveResult {
|
122
|
+
/**
|
123
|
+
* @since 1.0.0
|
124
|
+
* @category SaveResult
|
125
|
+
*/
|
126
|
+
export type Encoded = SaveResult.Success | SaveResult.DuplicateEncoded
|
127
|
+
|
128
|
+
/**
|
129
|
+
* @since 1.0.0
|
130
|
+
* @category SaveResult
|
131
|
+
*/
|
132
|
+
export interface Success {
|
133
|
+
readonly _tag: "Success"
|
134
|
+
}
|
135
|
+
|
136
|
+
/**
|
137
|
+
* @since 1.0.0
|
138
|
+
* @category SaveResult
|
139
|
+
*/
|
140
|
+
export interface Duplicate<R extends Rpc.Any> {
|
141
|
+
readonly _tag: "Duplicate"
|
142
|
+
readonly originalId: Snowflake.Snowflake
|
143
|
+
readonly lastReceivedReply: Option.Option<Reply.Reply<R>>
|
144
|
+
}
|
145
|
+
|
146
|
+
/**
|
147
|
+
* @since 1.0.0
|
148
|
+
* @category SaveResult
|
149
|
+
*/
|
150
|
+
export interface DuplicateEncoded {
|
151
|
+
readonly _tag: "Duplicate"
|
152
|
+
readonly originalId: Snowflake.Snowflake
|
153
|
+
readonly lastReceivedReply: Option.Option<Reply.ReplyEncoded<any>>
|
154
|
+
}
|
155
|
+
|
156
|
+
/**
|
157
|
+
* @since 1.0.0
|
158
|
+
* @category SaveResult
|
159
|
+
*/
|
160
|
+
export interface Constructor extends Data.TaggedEnum.WithGenerics<1> {
|
161
|
+
readonly taggedEnum: SaveResult<this["A"]>
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
165
|
+
/**
|
166
|
+
* @since 1.0.0
|
167
|
+
* @category Encoded
|
168
|
+
*/
|
169
|
+
export type Encoded = {
|
170
|
+
/**
|
171
|
+
* Save the provided message and its associated metadata.
|
172
|
+
*/
|
173
|
+
readonly saveEnvelope: (
|
174
|
+
options: {
|
175
|
+
readonly envelope: Envelope.Envelope.Encoded
|
176
|
+
readonly primaryKey: string | null
|
177
|
+
readonly deliverAt: number | null
|
178
|
+
}
|
179
|
+
) => Effect.Effect<SaveResult.Encoded, PersistenceError>
|
180
|
+
|
181
|
+
/**
|
182
|
+
* Save the provided `Reply` and its associated metadata.
|
183
|
+
*/
|
184
|
+
readonly saveReply: (
|
185
|
+
reply: Reply.ReplyEncoded<any>
|
186
|
+
) => Effect.Effect<void, PersistenceError>
|
187
|
+
|
188
|
+
/**
|
189
|
+
* Retrieves the replies for the specified requests.
|
190
|
+
*
|
191
|
+
* - Un-acknowledged chunk replies
|
192
|
+
* - WithExit replies
|
193
|
+
*/
|
194
|
+
readonly repliesFor: (requestIds: Array<string>) => Effect.Effect<
|
195
|
+
Array<Reply.ReplyEncoded<any>>,
|
196
|
+
PersistenceError
|
197
|
+
>
|
198
|
+
|
199
|
+
/**
|
200
|
+
* Retrieves the unprocessed messages for the given shards.
|
201
|
+
*
|
202
|
+
* A message is unprocessed when:
|
203
|
+
*
|
204
|
+
* - Requests that have no WithExit replies
|
205
|
+
* - Or they have no unacknowledged chunk replies
|
206
|
+
* - The latest AckChunk envelope
|
207
|
+
* - All Interrupt's for unprocessed requests
|
208
|
+
*/
|
209
|
+
readonly unprocessedMessages: (
|
210
|
+
shardIds: ReadonlyArray<number>,
|
211
|
+
now: number
|
212
|
+
) => Effect.Effect<
|
213
|
+
Array<{
|
214
|
+
readonly envelope: Envelope.Envelope.Encoded
|
215
|
+
readonly lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
|
216
|
+
}>,
|
217
|
+
PersistenceError
|
218
|
+
>
|
219
|
+
|
220
|
+
/**
|
221
|
+
* Retrieves the unprocessed messages by id.
|
222
|
+
*/
|
223
|
+
readonly unprocessedMessagesById: (
|
224
|
+
messageIds: ReadonlyArray<Snowflake.Snowflake>,
|
225
|
+
now: number
|
226
|
+
) => Effect.Effect<
|
227
|
+
Array<{
|
228
|
+
readonly envelope: Envelope.Envelope.Encoded
|
229
|
+
readonly lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
|
230
|
+
}>,
|
231
|
+
PersistenceError
|
232
|
+
>
|
233
|
+
|
234
|
+
/**
|
235
|
+
* Reset the mailbox state for the provided address.
|
236
|
+
*/
|
237
|
+
readonly resetAddress: (
|
238
|
+
address: EntityAddress
|
239
|
+
) => Effect.Effect<void, PersistenceError>
|
240
|
+
}
|
241
|
+
|
242
|
+
/**
|
243
|
+
* @since 1.0.0
|
244
|
+
* @category Encoded
|
245
|
+
*/
|
246
|
+
export type EncodedUnprocessedOptions<A> = {
|
247
|
+
readonly existingShards: Array<number>
|
248
|
+
readonly newShards: Array<number>
|
249
|
+
readonly cursor: Option.Option<A>
|
250
|
+
}
|
251
|
+
|
252
|
+
/**
|
253
|
+
* @since 1.0.0
|
254
|
+
* @category Encoded
|
255
|
+
*/
|
256
|
+
export type EncodedRepliesOptions<A> = {
|
257
|
+
readonly existingRequests: Array<string>
|
258
|
+
readonly newRequests: Array<string>
|
259
|
+
readonly cursor: Option.Option<A>
|
260
|
+
}
|
261
|
+
|
262
|
+
/**
|
263
|
+
* @since 1.0.0
|
264
|
+
* @category constructors
|
265
|
+
*/
|
266
|
+
export const make = (
|
267
|
+
storage: Omit<MessageStorage["Type"], "registerReplyHandler">
|
268
|
+
): Effect.Effect<MessageStorage["Type"]> =>
|
269
|
+
Effect.sync(() => {
|
270
|
+
const replyHandlers = new Map<
|
271
|
+
Snowflake.Snowflake,
|
272
|
+
(reply: Reply.Reply<any>) => Effect.Effect<void, PersistenceError>
|
273
|
+
>()
|
274
|
+
return MessageStorage.of({
|
275
|
+
...storage,
|
276
|
+
registerReplyHandler: (message) =>
|
277
|
+
Effect.sync(() => {
|
278
|
+
replyHandlers.set(message.envelope.requestId, message.respond)
|
279
|
+
}),
|
280
|
+
saveReply(reply) {
|
281
|
+
return Effect.flatMap(storage.saveReply(reply), () => {
|
282
|
+
const handler = replyHandlers.get(reply.reply.requestId)
|
283
|
+
if (!handler) {
|
284
|
+
return Effect.void
|
285
|
+
} else if (reply.reply._tag === "WithExit") {
|
286
|
+
replyHandlers.delete(reply.reply.requestId)
|
287
|
+
}
|
288
|
+
return handler(reply.reply)
|
289
|
+
})
|
290
|
+
}
|
291
|
+
})
|
292
|
+
})
|
293
|
+
|
294
|
+
/**
|
295
|
+
* @since 1.0.0
|
296
|
+
* @category constructors
|
297
|
+
*/
|
298
|
+
export const makeEncoded: (encoded: Encoded) => Effect.Effect<
|
299
|
+
MessageStorage["Type"],
|
300
|
+
never,
|
301
|
+
Snowflake.Generator
|
302
|
+
> = Effect.fnUntraced(function*(encoded: Encoded) {
|
303
|
+
const snowflakeGen = yield* Snowflake.Generator
|
304
|
+
const clock = yield* Effect.clock
|
305
|
+
|
306
|
+
const storage: MessageStorage["Type"] = yield* make({
|
307
|
+
saveRequest: (message) =>
|
308
|
+
Message.serializeEnvelope(message).pipe(
|
309
|
+
Effect.flatMap((envelope) =>
|
310
|
+
encoded.saveEnvelope({
|
311
|
+
envelope,
|
312
|
+
primaryKey: Envelope.primaryKey(message.envelope),
|
313
|
+
deliverAt: DeliverAt.toMillis(message.envelope.payload)
|
314
|
+
})
|
315
|
+
),
|
316
|
+
Effect.flatMap((result) => {
|
317
|
+
if (result._tag === "Success" || result.lastReceivedReply._tag === "None") {
|
318
|
+
return Effect.succeed(result as SaveResult<any>)
|
319
|
+
}
|
320
|
+
const duplicate = result
|
321
|
+
const schema = Reply.Reply(message.rpc)
|
322
|
+
return Schema.decode(schema)(result.lastReceivedReply.value).pipe(
|
323
|
+
Effect.locally(FiberRef.currentContext, message.context),
|
324
|
+
MalformedMessage.refail,
|
325
|
+
Effect.map((reply) =>
|
326
|
+
SaveResult.Duplicate({
|
327
|
+
originalId: duplicate.originalId,
|
328
|
+
lastReceivedReply: Option.some(reply)
|
329
|
+
})
|
330
|
+
)
|
331
|
+
)
|
332
|
+
})
|
333
|
+
),
|
334
|
+
saveEnvelope: (message) =>
|
335
|
+
Message.serializeEnvelope(message).pipe(
|
336
|
+
Effect.flatMap((envelope) =>
|
337
|
+
encoded.saveEnvelope({
|
338
|
+
envelope,
|
339
|
+
primaryKey: null,
|
340
|
+
deliverAt: null
|
341
|
+
})
|
342
|
+
),
|
343
|
+
Effect.asVoid
|
344
|
+
),
|
345
|
+
saveReply: (reply) => Effect.flatMap(Reply.serialize(reply), encoded.saveReply),
|
346
|
+
repliesFor: Effect.fnUntraced(function*(messages) {
|
347
|
+
const requestIds = Arr.empty<string>()
|
348
|
+
const map = new Map<string, Message.OutgoingRequest<any>>()
|
349
|
+
for (const message of messages) {
|
350
|
+
const id = String(message.envelope.requestId)
|
351
|
+
requestIds.push(id)
|
352
|
+
map.set(id, message)
|
353
|
+
}
|
354
|
+
if (requestIds.length === 0) return []
|
355
|
+
const encodedReplies = yield* encoded.repliesFor(requestIds)
|
356
|
+
return yield* decodeReplies(map, encodedReplies)
|
357
|
+
}),
|
358
|
+
unprocessedMessages: (shardIds) => {
|
359
|
+
const shards = Array.from(shardIds)
|
360
|
+
if (shards.length === 0) return Effect.succeed([])
|
361
|
+
return Effect.flatMap(
|
362
|
+
Effect.suspend(() => encoded.unprocessedMessages(shards, clock.unsafeCurrentTimeMillis())),
|
363
|
+
decodeMessages
|
364
|
+
)
|
365
|
+
},
|
366
|
+
unprocessedMessagesById(messageIds) {
|
367
|
+
const ids = Array.from(messageIds)
|
368
|
+
if (ids.length === 0) return Effect.succeed([])
|
369
|
+
return Effect.flatMap(
|
370
|
+
Effect.suspend(() => encoded.unprocessedMessagesById(ids, clock.unsafeCurrentTimeMillis())),
|
371
|
+
decodeMessages
|
372
|
+
)
|
373
|
+
},
|
374
|
+
resetAddress: (address) => encoded.resetAddress(address)
|
375
|
+
})
|
376
|
+
|
377
|
+
const decodeMessages = (
|
378
|
+
envelopes: Array<{
|
379
|
+
readonly envelope: Envelope.Envelope.Encoded
|
380
|
+
readonly lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
|
381
|
+
}>
|
382
|
+
) => {
|
383
|
+
const messages: Array<Message.Incoming<any>> = []
|
384
|
+
let index = 0
|
385
|
+
|
386
|
+
// if we have a malformed message, we should not return it and update
|
387
|
+
// the storage with a defect
|
388
|
+
const decodeMessage = Effect.catchAll(
|
389
|
+
Effect.suspend(() => {
|
390
|
+
const envelope = envelopes[index]
|
391
|
+
if (!envelope) return Effect.succeed(undefined)
|
392
|
+
return decodeEnvelopeWithReply(envelope)
|
393
|
+
}),
|
394
|
+
(error) => {
|
395
|
+
const envelope = envelopes[index]
|
396
|
+
return storage.saveReply(Reply.ReplyWithContext.fromDefect({
|
397
|
+
id: snowflakeGen.unsafeNext(),
|
398
|
+
requestId: Snowflake.Snowflake(envelope.envelope.requestId),
|
399
|
+
defect: error.toString()
|
400
|
+
})).pipe(
|
401
|
+
Effect.forkDaemon,
|
402
|
+
Effect.asVoid
|
403
|
+
)
|
404
|
+
}
|
405
|
+
)
|
406
|
+
return Effect.as(
|
407
|
+
Effect.whileLoop({
|
408
|
+
while: () => index < envelopes.length,
|
409
|
+
body: () => decodeMessage,
|
410
|
+
step: (message) => {
|
411
|
+
const envelope = envelopes[index++]
|
412
|
+
if (!message) return
|
413
|
+
messages.push(
|
414
|
+
message.envelope._tag === "Request"
|
415
|
+
? new Message.IncomingRequest({
|
416
|
+
envelope: message.envelope,
|
417
|
+
lastSentReply: envelope.lastSentReply,
|
418
|
+
respond: storage.saveReply
|
419
|
+
})
|
420
|
+
: new Message.IncomingEnvelope({
|
421
|
+
envelope: message.envelope
|
422
|
+
})
|
423
|
+
)
|
424
|
+
}
|
425
|
+
}),
|
426
|
+
messages
|
427
|
+
)
|
428
|
+
}
|
429
|
+
|
430
|
+
const decodeReplies = (
|
431
|
+
messages: Map<string, Message.OutgoingRequest<any>>,
|
432
|
+
encodedReplies: Array<Reply.ReplyEncoded<any>>
|
433
|
+
) => {
|
434
|
+
const replies: Array<Reply.Reply<any>> = []
|
435
|
+
const ignoredRequests = new Set<string>()
|
436
|
+
let index = 0
|
437
|
+
|
438
|
+
const decodeReply: Effect.Effect<void | Reply.Reply<any>> = Effect.catchAll(
|
439
|
+
Effect.suspend(() => {
|
440
|
+
const reply = encodedReplies[index]
|
441
|
+
if (ignoredRequests.has(reply.requestId)) return Effect.void
|
442
|
+
const message = messages.get(reply.requestId)
|
443
|
+
if (!message) return Effect.void
|
444
|
+
const schema = Reply.Reply(message.rpc)
|
445
|
+
return Schema.decode(schema)(reply).pipe(
|
446
|
+
Effect.locally(FiberRef.currentContext, message.context)
|
447
|
+
) as Effect.Effect<Reply.Reply<any>, ParseError>
|
448
|
+
}),
|
449
|
+
(error) => {
|
450
|
+
const reply = encodedReplies[index]
|
451
|
+
ignoredRequests.add(reply.requestId)
|
452
|
+
return Effect.succeed(
|
453
|
+
new Reply.WithExit({
|
454
|
+
id: snowflakeGen.unsafeNext(),
|
455
|
+
requestId: Snowflake.Snowflake(reply.requestId),
|
456
|
+
exit: Exit.die(error)
|
457
|
+
})
|
458
|
+
)
|
459
|
+
}
|
460
|
+
)
|
461
|
+
|
462
|
+
return Effect.as(
|
463
|
+
Effect.whileLoop({
|
464
|
+
while: () => index < encodedReplies.length,
|
465
|
+
body: () => decodeReply,
|
466
|
+
step: (reply) => {
|
467
|
+
index++
|
468
|
+
if (reply) replies.push(reply)
|
469
|
+
}
|
470
|
+
}),
|
471
|
+
replies
|
472
|
+
)
|
473
|
+
}
|
474
|
+
|
475
|
+
return storage
|
476
|
+
})
|
477
|
+
|
478
|
+
/**
|
479
|
+
* @since 1.0.0
|
480
|
+
* @category Constructors
|
481
|
+
*/
|
482
|
+
export const noop: MessageStorage["Type"] = globalValue(
|
483
|
+
"@effect/cluster/MessageStorage/noop",
|
484
|
+
() =>
|
485
|
+
Effect.runSync(make({
|
486
|
+
saveRequest: () => Effect.succeed(SaveResult.Success()),
|
487
|
+
saveEnvelope: () => Effect.void,
|
488
|
+
saveReply: () => Effect.void,
|
489
|
+
repliesFor: () => Effect.succeed([]),
|
490
|
+
unprocessedMessages: () => Effect.succeed([]),
|
491
|
+
unprocessedMessagesById: () => Effect.succeed([]),
|
492
|
+
resetAddress: () => Effect.void
|
493
|
+
}))
|
494
|
+
)
|
495
|
+
|
496
|
+
/**
|
497
|
+
* @since 1.0.0
|
498
|
+
* @category Memory
|
499
|
+
*/
|
500
|
+
export type MemoryEntry = {
|
501
|
+
readonly envelope: Envelope.Request.Encoded
|
502
|
+
lastReceivedChunk: Option.Option<Reply.ChunkEncoded<any>>
|
503
|
+
replies: Array<Reply.ReplyEncoded<any>>
|
504
|
+
}
|
505
|
+
|
506
|
+
/**
|
507
|
+
* @since 1.0.0
|
508
|
+
* @category Memory
|
509
|
+
*/
|
510
|
+
export class MemoryDriver extends Effect.Service<MemoryDriver>()("@effect/cluster/MessageStorage/MemoryDriver", {
|
511
|
+
dependencies: [Snowflake.layerGenerator],
|
512
|
+
effect: Effect.gen(function*() {
|
513
|
+
const requests = new Map<string, MemoryEntry>()
|
514
|
+
const requestsByPrimaryKey = new Map<string, MemoryEntry>()
|
515
|
+
const unprocessed = new Set<Envelope.Request.Encoded>()
|
516
|
+
const replyIds = new Set<string>()
|
517
|
+
|
518
|
+
const journal: Array<Envelope.Envelope.Encoded> = []
|
519
|
+
|
520
|
+
const cursors = new WeakMap<{}, number>()
|
521
|
+
|
522
|
+
const unprocessedWith = (predicate: Predicate<Envelope.Envelope.Encoded>) => {
|
523
|
+
const messages: Array<{
|
524
|
+
readonly envelope: Envelope.Envelope.Encoded
|
525
|
+
readonly lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
|
526
|
+
}> = []
|
527
|
+
for (const envelope of unprocessed) {
|
528
|
+
if (!predicate(envelope)) {
|
529
|
+
continue
|
530
|
+
}
|
531
|
+
if (envelope._tag === "Request") {
|
532
|
+
const entry = requests.get(envelope.requestId)
|
533
|
+
messages.push({
|
534
|
+
envelope,
|
535
|
+
lastSentReply: Option.fromNullable(entry?.replies[entry.replies.length - 1])
|
536
|
+
})
|
537
|
+
} else {
|
538
|
+
messages.push({
|
539
|
+
envelope,
|
540
|
+
lastSentReply: Option.none()
|
541
|
+
})
|
542
|
+
}
|
543
|
+
}
|
544
|
+
return messages
|
545
|
+
}
|
546
|
+
|
547
|
+
const replyLatch = yield* Effect.makeLatch()
|
548
|
+
|
549
|
+
const encoded: Encoded = {
|
550
|
+
saveEnvelope: ({ envelope, primaryKey }) =>
|
551
|
+
Effect.sync(() => {
|
552
|
+
const existing = primaryKey
|
553
|
+
? requestsByPrimaryKey.get(primaryKey)
|
554
|
+
: envelope._tag === "Request" && requests.get(envelope.requestId)
|
555
|
+
if (existing) {
|
556
|
+
return SaveResultEncoded.Duplicate({
|
557
|
+
originalId: Snowflake.Snowflake(existing.envelope.requestId),
|
558
|
+
lastReceivedReply: existing.lastReceivedChunk
|
559
|
+
})
|
560
|
+
}
|
561
|
+
if (envelope._tag === "Request") {
|
562
|
+
const entry: MemoryEntry = { envelope, replies: [], lastReceivedChunk: Option.none() }
|
563
|
+
requests.set(envelope.requestId, entry)
|
564
|
+
if (primaryKey) {
|
565
|
+
requestsByPrimaryKey.set(primaryKey, entry)
|
566
|
+
}
|
567
|
+
unprocessed.add(envelope)
|
568
|
+
} else if (envelope._tag === "AckChunk") {
|
569
|
+
const entry = requests.get(envelope.requestId)
|
570
|
+
if (entry) {
|
571
|
+
entry.lastReceivedChunk = Arr.findFirst(
|
572
|
+
entry.replies,
|
573
|
+
(r): r is Reply.ChunkEncoded<any> => r._tag === "Chunk" && r.id === envelope.replyId
|
574
|
+
).pipe(Option.orElse(() => entry.lastReceivedChunk))
|
575
|
+
}
|
576
|
+
}
|
577
|
+
journal.push(envelope)
|
578
|
+
return SaveResultEncoded.Success()
|
579
|
+
}),
|
580
|
+
saveReply: (reply) =>
|
581
|
+
Effect.sync(() => {
|
582
|
+
const entry = requests.get(reply.requestId)
|
583
|
+
if (!entry || replyIds.has(reply.id)) return
|
584
|
+
if (reply._tag === "WithExit") {
|
585
|
+
unprocessed.delete(entry.envelope)
|
586
|
+
}
|
587
|
+
entry.replies.push(reply)
|
588
|
+
replyIds.add(reply.id)
|
589
|
+
replyLatch.unsafeOpen()
|
590
|
+
}),
|
591
|
+
repliesFor: (requestIds) =>
|
592
|
+
Effect.sync(() => {
|
593
|
+
const replies = Arr.empty<Reply.ReplyEncoded<any>>()
|
594
|
+
for (const requestId of requestIds) {
|
595
|
+
const request = requests.get(requestId)
|
596
|
+
if (!request) continue
|
597
|
+
else if (Option.isNone(request.lastReceivedChunk)) {
|
598
|
+
// eslint-disable-next-line no-restricted-syntax
|
599
|
+
replies.push(...request.replies)
|
600
|
+
continue
|
601
|
+
}
|
602
|
+
const sequence = request.lastReceivedChunk.value.sequence
|
603
|
+
for (const reply of request.replies) {
|
604
|
+
if (reply._tag === "Chunk" && reply.sequence <= sequence) {
|
605
|
+
continue
|
606
|
+
}
|
607
|
+
replies.push(reply)
|
608
|
+
}
|
609
|
+
}
|
610
|
+
return replies
|
611
|
+
}),
|
612
|
+
unprocessedMessages: (shardIds) =>
|
613
|
+
Effect.sync(() => {
|
614
|
+
if (unprocessed.size === 0) return []
|
615
|
+
const messages = Arr.empty<{
|
616
|
+
envelope: Envelope.Envelope.Encoded
|
617
|
+
lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
|
618
|
+
}>()
|
619
|
+
let index = journal.indexOf(Iterable.unsafeHead(unprocessed))
|
620
|
+
for (; index < journal.length; index++) {
|
621
|
+
const envelope = journal[index]
|
622
|
+
if (!shardIds.includes(envelope.address.shardId)) {
|
623
|
+
continue
|
624
|
+
}
|
625
|
+
if (envelope._tag === "Request") {
|
626
|
+
const entry = requests.get(envelope.requestId)!
|
627
|
+
messages.push({
|
628
|
+
envelope,
|
629
|
+
lastSentReply: Arr.last(entry.replies)
|
630
|
+
})
|
631
|
+
} else {
|
632
|
+
messages.push({
|
633
|
+
envelope,
|
634
|
+
lastSentReply: Option.none()
|
635
|
+
})
|
636
|
+
}
|
637
|
+
}
|
638
|
+
return messages
|
639
|
+
}),
|
640
|
+
unprocessedMessagesById: (ids) =>
|
641
|
+
Effect.sync(() => {
|
642
|
+
const envelopeIds = new Set<string>()
|
643
|
+
for (const id of ids) {
|
644
|
+
envelopeIds.add(String(id))
|
645
|
+
}
|
646
|
+
return unprocessedWith((envelope) => envelopeIds.has(envelope.requestId))
|
647
|
+
}),
|
648
|
+
resetAddress: () => Effect.void
|
649
|
+
}
|
650
|
+
|
651
|
+
const storage = yield* makeEncoded(encoded)
|
652
|
+
|
653
|
+
return {
|
654
|
+
storage,
|
655
|
+
encoded,
|
656
|
+
requests,
|
657
|
+
requestsByPrimaryKey,
|
658
|
+
unprocessed,
|
659
|
+
replyIds,
|
660
|
+
journal,
|
661
|
+
cursors
|
662
|
+
} as const
|
663
|
+
})
|
664
|
+
}) {}
|
665
|
+
|
666
|
+
/**
|
667
|
+
* @since 1.0.0
|
668
|
+
* @category layers
|
669
|
+
*/
|
670
|
+
export const layerNoop: Layer.Layer<MessageStorage> = Layer.succeed(MessageStorage, noop)
|
671
|
+
|
672
|
+
/**
|
673
|
+
* @since 1.0.0
|
674
|
+
* @category layers
|
675
|
+
*/
|
676
|
+
export const layerMemory: Layer.Layer<
|
677
|
+
MessageStorage | MemoryDriver,
|
678
|
+
never,
|
679
|
+
ShardingConfig
|
680
|
+
> = Layer.effect(MessageStorage, Effect.map(MemoryDriver, (_) => _.storage)).pipe(
|
681
|
+
Layer.provideMerge(MemoryDriver.Default)
|
682
|
+
)
|
683
|
+
|
684
|
+
// --- internal ---
|
685
|
+
|
686
|
+
const EnvelopeWithReply: Schema.Schema<{
|
687
|
+
readonly envelope: Envelope.Envelope.PartialEncoded
|
688
|
+
readonly lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
|
689
|
+
}, {
|
690
|
+
readonly envelope: Envelope.Envelope.Encoded
|
691
|
+
readonly lastSentReply: Schema.OptionEncoded<Reply.ReplyEncoded<any>>
|
692
|
+
}> = Schema.Struct({
|
693
|
+
envelope: Envelope.PartialEncoded,
|
694
|
+
lastSentReply: Schema.OptionFromSelf(Reply.Encoded)
|
695
|
+
}) as any
|
696
|
+
|
697
|
+
const decodeEnvelopeWithReply = Schema.decode(EnvelopeWithReply)
|