@effect/cluster 0.33.3 → 0.34.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/dist/cjs/ClusterError.js +24 -3
- package/dist/cjs/ClusterError.js.map +1 -1
- package/dist/cjs/ClusterMetrics.js +1 -2
- package/dist/cjs/ClusterMetrics.js.map +1 -1
- package/dist/cjs/ClusterSchema.js +1 -2
- package/dist/cjs/ClusterSchema.js.map +1 -1
- package/dist/cjs/Entity.js +81 -3
- package/dist/cjs/Entity.js.map +1 -1
- package/dist/cjs/EntityAddress.js +1 -2
- package/dist/cjs/EntityAddress.js.map +1 -1
- package/dist/cjs/EntityId.js +2 -3
- package/dist/cjs/EntityId.js.map +1 -1
- package/dist/cjs/EntityType.js +2 -3
- package/dist/cjs/EntityType.js.map +1 -1
- package/dist/cjs/Envelope.js +2 -3
- package/dist/cjs/Envelope.js.map +1 -1
- package/dist/cjs/HttpCommon.js +1 -2
- package/dist/cjs/HttpCommon.js.map +1 -1
- package/dist/cjs/HttpRunner.js +8 -9
- package/dist/cjs/HttpRunner.js.map +1 -1
- package/dist/cjs/HttpShardManager.js +1 -2
- package/dist/cjs/HttpShardManager.js.map +1 -1
- package/dist/cjs/MachineId.js +2 -3
- package/dist/cjs/MachineId.js.map +1 -1
- package/dist/cjs/Message.js +1 -2
- package/dist/cjs/Message.js.map +1 -1
- package/dist/cjs/MessageStorage.js +2 -3
- package/dist/cjs/MessageStorage.js.map +1 -1
- package/dist/cjs/Reply.js +2 -3
- package/dist/cjs/Reply.js.map +1 -1
- package/dist/cjs/Runner.js +3 -4
- package/dist/cjs/Runner.js.map +1 -1
- package/dist/cjs/RunnerAddress.js +1 -2
- package/dist/cjs/RunnerAddress.js.map +1 -1
- package/dist/cjs/RunnerHealth.js +2 -3
- package/dist/cjs/RunnerHealth.js.map +1 -1
- package/dist/cjs/RunnerServer.js +5 -6
- package/dist/cjs/RunnerServer.js.map +1 -1
- package/dist/cjs/Runners.js +27 -18
- package/dist/cjs/Runners.js.map +1 -1
- package/dist/cjs/ShardId.js +2 -3
- package/dist/cjs/ShardId.js.map +1 -1
- package/dist/cjs/ShardManager.js +15 -16
- package/dist/cjs/ShardManager.js.map +1 -1
- package/dist/cjs/ShardStorage.js +1 -2
- package/dist/cjs/ShardStorage.js.map +1 -1
- package/dist/cjs/Sharding.js +23 -8
- package/dist/cjs/Sharding.js.map +1 -1
- package/dist/cjs/ShardingConfig.js +15 -16
- package/dist/cjs/ShardingConfig.js.map +1 -1
- package/dist/cjs/ShardingRegistrationEvent.js +1 -2
- package/dist/cjs/ShardingRegistrationEvent.js.map +1 -1
- package/dist/cjs/Singleton.js +1 -2
- package/dist/cjs/Singleton.js.map +1 -1
- package/dist/cjs/SingletonAddress.js +1 -2
- package/dist/cjs/SingletonAddress.js.map +1 -1
- package/dist/cjs/Snowflake.js +3 -4
- package/dist/cjs/Snowflake.js.map +1 -1
- package/dist/cjs/SocketRunner.js +1 -2
- package/dist/cjs/SocketRunner.js.map +1 -1
- package/dist/cjs/SocketShardManager.js +1 -2
- package/dist/cjs/SocketShardManager.js.map +1 -1
- package/dist/cjs/SqlMessageStorage.js +2 -3
- package/dist/cjs/SqlMessageStorage.js.map +1 -1
- package/dist/cjs/SqlShardStorage.js +1 -2
- package/dist/cjs/SqlShardStorage.js.map +1 -1
- package/dist/cjs/SynchronizedClock.js +2 -3
- package/dist/cjs/SynchronizedClock.js.map +1 -1
- package/dist/cjs/index.js +1 -2
- package/dist/cjs/internal/entityManager.js +3 -4
- package/dist/cjs/internal/entityManager.js.map +1 -1
- package/dist/cjs/internal/entityReaper.js +1 -2
- package/dist/cjs/internal/entityReaper.js.map +1 -1
- package/dist/cjs/internal/resourceMap.js +1 -2
- package/dist/cjs/internal/resourceMap.js.map +1 -1
- package/dist/cjs/internal/resourceRef.js +1 -2
- package/dist/cjs/internal/resourceRef.js.map +1 -1
- package/dist/cjs/internal/shardManager.js +2 -3
- package/dist/cjs/internal/shardManager.js.map +1 -1
- package/dist/dts/ClusterError.d.ts +22 -0
- package/dist/dts/ClusterError.d.ts.map +1 -1
- package/dist/dts/DeliverAt.d.ts.map +1 -1
- package/dist/dts/Entity.d.ts +34 -10
- package/dist/dts/Entity.d.ts.map +1 -1
- package/dist/dts/Envelope.d.ts.map +1 -1
- package/dist/dts/HttpCommon.d.ts.map +1 -1
- package/dist/dts/HttpRunner.d.ts.map +1 -1
- package/dist/dts/HttpShardManager.d.ts.map +1 -1
- package/dist/dts/MachineId.d.ts.map +1 -1
- package/dist/dts/Message.d.ts +1 -1
- package/dist/dts/Message.d.ts.map +1 -1
- package/dist/dts/MessageStorage.d.ts.map +1 -1
- package/dist/dts/Reply.d.ts.map +1 -1
- package/dist/dts/Runner.d.ts.map +1 -1
- package/dist/dts/RunnerAddress.d.ts.map +1 -1
- package/dist/dts/Runners.d.ts +12 -11
- package/dist/dts/Runners.d.ts.map +1 -1
- package/dist/dts/ShardId.d.ts.map +1 -1
- package/dist/dts/ShardManager.d.ts +1 -1
- package/dist/dts/ShardManager.d.ts.map +1 -1
- package/dist/dts/Sharding.d.ts +6 -6
- package/dist/dts/Sharding.d.ts.map +1 -1
- package/dist/dts/ShardingConfig.d.ts +2 -2
- package/dist/dts/ShardingConfig.d.ts.map +1 -1
- package/dist/dts/Singleton.d.ts.map +1 -1
- package/dist/dts/Snowflake.d.ts.map +1 -1
- package/dist/dts/SqlMessageStorage.d.ts.map +1 -1
- package/dist/dts/SqlShardStorage.d.ts.map +1 -1
- package/dist/esm/ClusterError.js +21 -0
- package/dist/esm/ClusterError.js.map +1 -1
- package/dist/esm/Entity.js +79 -0
- package/dist/esm/Entity.js.map +1 -1
- package/dist/esm/EntityId.js +1 -1
- package/dist/esm/EntityId.js.map +1 -1
- package/dist/esm/EntityType.js +1 -1
- package/dist/esm/EntityType.js.map +1 -1
- package/dist/esm/Envelope.js +1 -1
- package/dist/esm/Envelope.js.map +1 -1
- package/dist/esm/HttpRunner.js +7 -7
- package/dist/esm/HttpRunner.js.map +1 -1
- package/dist/esm/MachineId.js +1 -1
- package/dist/esm/MachineId.js.map +1 -1
- package/dist/esm/MessageStorage.js +1 -1
- package/dist/esm/MessageStorage.js.map +1 -1
- package/dist/esm/Reply.js +1 -1
- package/dist/esm/Reply.js.map +1 -1
- package/dist/esm/Runner.js +2 -2
- package/dist/esm/Runner.js.map +1 -1
- package/dist/esm/RunnerHealth.js +1 -1
- package/dist/esm/RunnerHealth.js.map +1 -1
- package/dist/esm/RunnerServer.js +4 -4
- package/dist/esm/RunnerServer.js.map +1 -1
- package/dist/esm/Runners.js +27 -17
- package/dist/esm/Runners.js.map +1 -1
- package/dist/esm/ShardId.js +1 -1
- package/dist/esm/ShardId.js.map +1 -1
- package/dist/esm/ShardManager.js +14 -14
- package/dist/esm/ShardManager.js.map +1 -1
- package/dist/esm/Sharding.js +23 -7
- package/dist/esm/Sharding.js.map +1 -1
- package/dist/esm/ShardingConfig.js +14 -14
- package/dist/esm/ShardingConfig.js.map +1 -1
- package/dist/esm/Snowflake.js +2 -2
- package/dist/esm/Snowflake.js.map +1 -1
- package/dist/esm/SqlMessageStorage.js +1 -1
- package/dist/esm/SqlMessageStorage.js.map +1 -1
- package/dist/esm/SynchronizedClock.js +1 -1
- package/dist/esm/SynchronizedClock.js.map +1 -1
- package/dist/esm/internal/entityManager.js +3 -3
- package/dist/esm/internal/entityManager.js.map +1 -1
- package/dist/esm/internal/shardManager.js +1 -1
- package/dist/esm/internal/shardManager.js.map +1 -1
- package/package.json +5 -5
- package/src/ClusterError.ts +24 -0
- package/src/Entity.ts +120 -9
- package/src/Message.ts +1 -1
- package/src/Runners.ts +59 -26
- package/src/Sharding.ts +81 -37
- package/src/ShardingConfig.ts +1 -1
- package/src/internal/entityManager.ts +8 -8
- package/src/internal/entityReaper.ts +3 -3
package/src/Sharding.ts
CHANGED
@@ -29,9 +29,14 @@ import * as Schedule from "effect/Schedule"
|
|
29
29
|
import * as Scope from "effect/Scope"
|
30
30
|
import * as Stream from "effect/Stream"
|
31
31
|
import type { MailboxFull, PersistenceError } from "./ClusterError.js"
|
32
|
-
import {
|
32
|
+
import {
|
33
|
+
AlreadyProcessingMessage,
|
34
|
+
EntityNotAssignedToRunner,
|
35
|
+
EntityNotManagedByRunner,
|
36
|
+
RunnerUnavailable
|
37
|
+
} from "./ClusterError.js"
|
33
38
|
import { Persisted } from "./ClusterSchema.js"
|
34
|
-
import type { CurrentAddress, Entity, HandlersFrom } from "./Entity.js"
|
39
|
+
import type { CurrentAddress, CurrentRunnerAddress, Entity, HandlersFrom } from "./Entity.js"
|
35
40
|
import { EntityAddress } from "./EntityAddress.js"
|
36
41
|
import { EntityId } from "./EntityId.js"
|
37
42
|
import type { EntityType } from "./EntityType.js"
|
@@ -83,7 +88,9 @@ export class Sharding extends Context.Tag("@effect/cluster/Sharding")<Sharding,
|
|
83
88
|
readonly makeClient: <Rpcs extends Rpc.Any>(
|
84
89
|
entity: Entity<Rpcs>
|
85
90
|
) => Effect.Effect<
|
86
|
-
(
|
91
|
+
(
|
92
|
+
entityId: string
|
93
|
+
) => RpcClient.RpcClient<Rpcs, MailboxFull | AlreadyProcessingMessage | PersistenceError | EntityNotManagedByRunner>
|
87
94
|
>
|
88
95
|
|
89
96
|
/**
|
@@ -97,7 +104,11 @@ export class Sharding extends Context.Tag("@effect/cluster/Sharding")<Sharding,
|
|
97
104
|
readonly concurrency?: number | "unbounded" | undefined
|
98
105
|
readonly mailboxCapacity?: number | "unbounded" | undefined
|
99
106
|
}
|
100
|
-
) => Effect.Effect<
|
107
|
+
) => Effect.Effect<
|
108
|
+
void,
|
109
|
+
never,
|
110
|
+
Rpc.Context<Rpcs> | Rpc.Middleware<Rpcs> | Exclude<RX, Scope.Scope | CurrentAddress | CurrentRunnerAddress>
|
111
|
+
>
|
101
112
|
|
102
113
|
/**
|
103
114
|
* Registers a new singleton with the runner.
|
@@ -112,7 +123,7 @@ export class Sharding extends Context.Tag("@effect/cluster/Sharding")<Sharding,
|
|
112
123
|
*/
|
113
124
|
readonly send: (message: Message.Incoming<any>) => Effect.Effect<
|
114
125
|
void,
|
115
|
-
EntityNotManagedByRunner | MailboxFull | AlreadyProcessingMessage
|
126
|
+
EntityNotManagedByRunner | EntityNotAssignedToRunner | MailboxFull | AlreadyProcessingMessage
|
116
127
|
>
|
117
128
|
|
118
129
|
/**
|
@@ -120,7 +131,7 @@ export class Sharding extends Context.Tag("@effect/cluster/Sharding")<Sharding,
|
|
120
131
|
*/
|
121
132
|
readonly notify: (message: Message.Incoming<any>) => Effect.Effect<
|
122
133
|
void,
|
123
|
-
EntityNotManagedByRunner | AlreadyProcessingMessage
|
134
|
+
EntityNotManagedByRunner | EntityNotAssignedToRunner | AlreadyProcessingMessage
|
124
135
|
>
|
125
136
|
|
126
137
|
/**
|
@@ -422,8 +433,18 @@ const make = Effect.gen(function*() {
|
|
422
433
|
currentSentRequestIds.add(message.envelope.requestId)
|
423
434
|
}
|
424
435
|
const address = message.envelope.address
|
436
|
+
if (!acquiredShards.has(address.shardId)) {
|
437
|
+
return Effect.void
|
438
|
+
}
|
425
439
|
const state = entityManagers.get(address.entityType)
|
426
|
-
if (!state
|
440
|
+
if (!state) {
|
441
|
+
if (message._tag === "IncomingRequest") {
|
442
|
+
return Effect.orDie(message.respond(Reply.ReplyWithContext.fromDefect({
|
443
|
+
id: snowflakeGen.unsafeNext(),
|
444
|
+
requestId: message.envelope.requestId,
|
445
|
+
defect: new EntityNotManagedByRunner({ address })
|
446
|
+
})))
|
447
|
+
}
|
427
448
|
return Effect.void
|
428
449
|
}
|
429
450
|
|
@@ -563,11 +584,11 @@ const make = Effect.gen(function*() {
|
|
563
584
|
|
564
585
|
const sendWithRetry: Effect.Effect<
|
565
586
|
void,
|
566
|
-
EntityNotManagedByRunner
|
587
|
+
EntityNotManagedByRunner | EntityNotAssignedToRunner
|
567
588
|
> = Effect.catchTags(
|
568
589
|
Effect.suspend(() => {
|
569
590
|
if (!acquiredShards.has(address.shardId)) {
|
570
|
-
return Effect.fail(new
|
591
|
+
return Effect.fail(new EntityNotAssignedToRunner({ address }))
|
571
592
|
}
|
572
593
|
|
573
594
|
const message = messages[index]
|
@@ -632,16 +653,20 @@ const make = Effect.gen(function*() {
|
|
632
653
|
|
633
654
|
// --- Sending messages ---
|
634
655
|
|
635
|
-
const sendLocal = (
|
636
|
-
message:
|
656
|
+
const sendLocal = <M extends Message.Outgoing<any> | Message.Incoming<any>>(
|
657
|
+
message: M
|
637
658
|
): Effect.Effect<
|
638
659
|
void,
|
639
|
-
|
660
|
+
| EntityNotAssignedToRunner
|
661
|
+
| EntityNotManagedByRunner
|
662
|
+
| MailboxFull
|
663
|
+
| AlreadyProcessingMessage
|
664
|
+
| (M extends Message.Incoming<any> ? never : PersistenceError)
|
640
665
|
> =>
|
641
666
|
Effect.suspend(() => {
|
642
667
|
const address = message.envelope.address
|
643
668
|
if (!isEntityOnLocalShards(address)) {
|
644
|
-
return Effect.fail(new
|
669
|
+
return Effect.fail(new EntityNotAssignedToRunner({ address }))
|
645
670
|
}
|
646
671
|
const state = entityManagers.get(address.entityType)
|
647
672
|
if (!state) {
|
@@ -654,39 +679,52 @@ const make = Effect.gen(function*() {
|
|
654
679
|
message,
|
655
680
|
send: state.manager.sendLocal,
|
656
681
|
simulateRemoteSerialization: config.simulateRemoteSerialization
|
657
|
-
})
|
682
|
+
}) as any
|
658
683
|
})
|
659
684
|
|
660
|
-
const notifyLocal = (
|
661
|
-
message:
|
685
|
+
const notifyLocal = <M extends Message.Outgoing<any> | Message.Incoming<any>>(
|
686
|
+
message: M,
|
662
687
|
discard: boolean
|
663
688
|
) =>
|
664
|
-
Effect.suspend(
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
689
|
+
Effect.suspend(
|
690
|
+
(): Effect.Effect<
|
691
|
+
void,
|
692
|
+
| EntityNotManagedByRunner
|
693
|
+
| EntityNotAssignedToRunner
|
694
|
+
| AlreadyProcessingMessage
|
695
|
+
| (M extends Message.Incoming<any> ? never : PersistenceError)
|
696
|
+
> => {
|
697
|
+
const address = message.envelope.address
|
698
|
+
if (!isEntityOnLocalShards(address)) {
|
699
|
+
return Effect.fail(new EntityNotAssignedToRunner({ address }))
|
700
|
+
} else if (!entityManagers.has(address.entityType)) {
|
701
|
+
return Effect.fail(new EntityNotManagedByRunner({ address }))
|
702
|
+
}
|
669
703
|
|
670
|
-
|
671
|
-
|
672
|
-
|
704
|
+
const notify = storageEnabled
|
705
|
+
? openStorageReadLatch
|
706
|
+
: () => Effect.dieMessage("Sharding.notifyLocal: storage is disabled")
|
673
707
|
|
674
|
-
|
675
|
-
|
676
|
-
|
708
|
+
if (message._tag === "IncomingRequest" || message._tag === "IncomingEnvelope") {
|
709
|
+
if (message._tag === "IncomingRequest" && storageAlreadyProcessed(message)) {
|
710
|
+
return Effect.fail(new AlreadyProcessingMessage({ address, envelopeId: message.envelope.requestId }))
|
711
|
+
}
|
712
|
+
return notify()
|
677
713
|
}
|
678
|
-
return notify()
|
679
|
-
}
|
680
714
|
|
681
|
-
|
682
|
-
|
715
|
+
return runners.notifyLocal({ message, notify, discard }) as any
|
716
|
+
}
|
717
|
+
)
|
683
718
|
|
684
|
-
const isTransientError = Predicate.or(RunnerUnavailable.is,
|
719
|
+
const isTransientError = Predicate.or(RunnerUnavailable.is, EntityNotAssignedToRunner.is)
|
685
720
|
function sendOutgoing(
|
686
721
|
message: Message.Outgoing<any>,
|
687
722
|
discard: boolean,
|
688
723
|
retries?: number
|
689
|
-
): Effect.Effect<
|
724
|
+
): Effect.Effect<
|
725
|
+
void,
|
726
|
+
EntityNotManagedByRunner | MailboxFull | AlreadyProcessingMessage | PersistenceError
|
727
|
+
> {
|
690
728
|
return Effect.catchIf(
|
691
729
|
Effect.suspend(() => {
|
692
730
|
const address = message.envelope.address
|
@@ -701,7 +739,7 @@ const make = Effect.gen(function*() {
|
|
701
739
|
? notifyLocal(message, discard)
|
702
740
|
: runners.notify({ address: maybeRunner, message, discard })
|
703
741
|
} else if (Option.isNone(maybeRunner)) {
|
704
|
-
return Effect.fail(new
|
742
|
+
return Effect.fail(new EntityNotAssignedToRunner({ address }))
|
705
743
|
}
|
706
744
|
return runnerIsLocal
|
707
745
|
? sendLocal(message)
|
@@ -858,13 +896,19 @@ const make = Effect.gen(function*() {
|
|
858
896
|
|
859
897
|
const clients: ResourceMap<
|
860
898
|
Entity<any>,
|
861
|
-
(entityId: string) => RpcClient.RpcClient<
|
899
|
+
(entityId: string) => RpcClient.RpcClient<
|
900
|
+
any,
|
901
|
+
MailboxFull | AlreadyProcessingMessage | EntityNotManagedByRunner
|
902
|
+
>,
|
862
903
|
never
|
863
904
|
> = yield* ResourceMap.make(Effect.fnUntraced(function*(entity: Entity<any>) {
|
864
905
|
const client = yield* RpcClient.makeNoSerialization(entity.protocol, {
|
865
906
|
supportsAck: true,
|
866
907
|
generateRequestId: () => RequestId(snowflakeGen.unsafeNext()),
|
867
|
-
onFromClient(options): Effect.Effect<
|
908
|
+
onFromClient(options): Effect.Effect<
|
909
|
+
void,
|
910
|
+
MailboxFull | AlreadyProcessingMessage | EntityNotManagedByRunner | PersistenceError
|
911
|
+
> {
|
868
912
|
const address = Context.unsafeGet(options.context, ClientAddressTag)
|
869
913
|
switch (options.message._tag) {
|
870
914
|
case "Request": {
|
@@ -985,7 +1029,7 @@ const make = Effect.gen(function*() {
|
|
985
1029
|
}))
|
986
1030
|
|
987
1031
|
const makeClient = <Rpcs extends Rpc.Any>(entity: Entity<Rpcs>): Effect.Effect<
|
988
|
-
(entityId: string) => RpcClient.RpcClient<Rpcs, MailboxFull | AlreadyProcessingMessage>
|
1032
|
+
(entityId: string) => RpcClient.RpcClient<Rpcs, MailboxFull | AlreadyProcessingMessage | EntityNotManagedByRunner>
|
989
1033
|
> => clients.get(entity)
|
990
1034
|
|
991
1035
|
const clientRespondDiscard = (_reply: Reply.Reply<any>) => Effect.void
|
package/src/ShardingConfig.ts
CHANGED
@@ -70,7 +70,7 @@ export class ShardingConfig extends Context.Tag("@effect/cluster/ShardingConfig"
|
|
70
70
|
readonly entityReplyPollInterval: DurationInput
|
71
71
|
readonly refreshAssignmentsInterval: DurationInput
|
72
72
|
/**
|
73
|
-
* The interval to retry a send if
|
73
|
+
* The interval to retry a send if EntityNotAssignedToRunner is returned.
|
74
74
|
*/
|
75
75
|
readonly sendRetryInterval: DurationInput
|
76
76
|
// readonly unhealthyRunnerReportInterval: Duration.Duration
|
@@ -16,7 +16,7 @@ import * as Option from "effect/Option"
|
|
16
16
|
import * as Schedule from "effect/Schedule"
|
17
17
|
import * as Schema from "effect/Schema"
|
18
18
|
import * as Scope from "effect/Scope"
|
19
|
-
import { AlreadyProcessingMessage,
|
19
|
+
import { AlreadyProcessingMessage, EntityNotAssignedToRunner, MailboxFull, MalformedMessage } from "../ClusterError.js"
|
20
20
|
import * as ClusterMetrics from "../ClusterMetrics.js"
|
21
21
|
import { Persisted } from "../ClusterSchema.js"
|
22
22
|
import type { Entity, HandlersFrom } from "../Entity.js"
|
@@ -41,11 +41,11 @@ import { ResourceRef } from "./resourceRef.js"
|
|
41
41
|
export interface EntityManager {
|
42
42
|
readonly sendLocal: <R extends Rpc.Any>(
|
43
43
|
message: Message.IncomingLocal<R>
|
44
|
-
) => Effect.Effect<void,
|
44
|
+
) => Effect.Effect<void, EntityNotAssignedToRunner | MailboxFull | AlreadyProcessingMessage>
|
45
45
|
|
46
46
|
readonly send: (
|
47
47
|
message: Message.Incoming<any>
|
48
|
-
) => Effect.Effect<void,
|
48
|
+
) => Effect.Effect<void, EntityNotAssignedToRunner | MailboxFull | AlreadyProcessingMessage>
|
49
49
|
|
50
50
|
readonly isProcessingFor: (message: Message.Incoming<any>, options?: {
|
51
51
|
readonly excludeReplies?: boolean
|
@@ -102,10 +102,10 @@ export const make = Effect.fnUntraced(function*<
|
|
102
102
|
const entities: ResourceMap<
|
103
103
|
EntityAddress,
|
104
104
|
EntityState,
|
105
|
-
|
105
|
+
EntityNotAssignedToRunner
|
106
106
|
> = yield* ResourceMap.make(Effect.fnUntraced(function*(address) {
|
107
107
|
if (yield* options.sharding.isShutdown) {
|
108
|
-
return yield* new
|
108
|
+
return yield* new EntityNotAssignedToRunner({ address })
|
109
109
|
}
|
110
110
|
|
111
111
|
const scope = yield* Effect.scope
|
@@ -317,11 +317,11 @@ export const make = Effect.fnUntraced(function*<
|
|
317
317
|
|
318
318
|
function sendLocal<R extends Rpc.Any>(
|
319
319
|
message: Message.IncomingLocal<R>
|
320
|
-
): Effect.Effect<void,
|
320
|
+
): Effect.Effect<void, EntityNotAssignedToRunner | MailboxFull | AlreadyProcessingMessage> {
|
321
321
|
return Effect.locally(
|
322
322
|
Effect.flatMap(
|
323
323
|
entities.get(message.envelope.address),
|
324
|
-
(server): Effect.Effect<void,
|
324
|
+
(server): Effect.Effect<void, EntityNotAssignedToRunner | MailboxFull | AlreadyProcessingMessage> => {
|
325
325
|
switch (message._tag) {
|
326
326
|
case "IncomingRequestLocal": {
|
327
327
|
// If the request is already running, then we might have more than
|
@@ -371,7 +371,7 @@ export const make = Effect.fnUntraced(function*<
|
|
371
371
|
case "IncomingEnvelope": {
|
372
372
|
const entry = server.activeRequests.get(message.envelope.requestId)
|
373
373
|
if (!entry) {
|
374
|
-
return Effect.fail(new
|
374
|
+
return Effect.fail(new EntityNotAssignedToRunner({ address: message.envelope.address }))
|
375
375
|
} else if (
|
376
376
|
message.envelope._tag === "AckChunk" &&
|
377
377
|
Option.isSome(entry.lastSentChunk) &&
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import * as Effect from "effect/Effect"
|
2
|
-
import type {
|
2
|
+
import type { EntityNotAssignedToRunner } from "../ClusterError.js"
|
3
3
|
import type { EntityAddress } from "../EntityAddress.js"
|
4
4
|
import type { EntityId } from "../EntityId.js"
|
5
5
|
import type { EntityState } from "./entityManager.js"
|
@@ -12,14 +12,14 @@ export class EntityReaper extends Effect.Service<EntityReaper>()("@effect/cluste
|
|
12
12
|
const registered: Array<{
|
13
13
|
readonly maxIdleTime: number
|
14
14
|
readonly servers: Map<EntityId, EntityState>
|
15
|
-
readonly entities: ResourceMap<EntityAddress, EntityState,
|
15
|
+
readonly entities: ResourceMap<EntityAddress, EntityState, EntityNotAssignedToRunner>
|
16
16
|
}> = []
|
17
17
|
const latch = yield* Effect.makeLatch()
|
18
18
|
|
19
19
|
const register = (options: {
|
20
20
|
readonly maxIdleTime: number
|
21
21
|
readonly servers: Map<EntityId, EntityState>
|
22
|
-
readonly entities: ResourceMap<EntityAddress, EntityState,
|
22
|
+
readonly entities: ResourceMap<EntityAddress, EntityState, EntityNotAssignedToRunner>
|
23
23
|
}) =>
|
24
24
|
Effect.suspend(() => {
|
25
25
|
currentResolution = Math.max(Math.min(currentResolution, options.maxIdleTime), 5000)
|