@typeonce/effect-machine 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE +5 -0
- package/README.md +117 -0
- package/dist/AtomMachine.d.ts +141 -0
- package/dist/AtomMachine.d.ts.map +1 -0
- package/dist/AtomMachine.js +191 -0
- package/dist/AtomMachine.js.map +1 -0
- package/dist/ClusterMachine.d.ts +250 -0
- package/dist/ClusterMachine.d.ts.map +1 -0
- package/dist/ClusterMachine.js +280 -0
- package/dist/ClusterMachine.js.map +1 -0
- package/dist/Machine.d.ts +2587 -0
- package/dist/Machine.d.ts.map +1 -0
- package/dist/Machine.js +923 -0
- package/dist/Machine.js.map +1 -0
- package/dist/cluster.d.ts +2 -0
- package/dist/cluster.d.ts.map +1 -0
- package/dist/cluster.js +2 -0
- package/dist/cluster.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/machineErrors.d.ts +109 -0
- package/dist/internal/machineErrors.d.ts.map +1 -0
- package/dist/internal/machineErrors.js +65 -0
- package/dist/internal/machineErrors.js.map +1 -0
- package/dist/internal/machineModel.d.ts +88 -0
- package/dist/internal/machineModel.d.ts.map +1 -0
- package/dist/internal/machineModel.js +713 -0
- package/dist/internal/machineModel.js.map +1 -0
- package/dist/internal/machinePlanner.d.ts +64 -0
- package/dist/internal/machinePlanner.d.ts.map +1 -0
- package/dist/internal/machinePlanner.js +594 -0
- package/dist/internal/machinePlanner.js.map +1 -0
- package/dist/internal/machineProcess.d.ts +16 -0
- package/dist/internal/machineProcess.d.ts.map +1 -0
- package/dist/internal/machineProcess.js +170 -0
- package/dist/internal/machineProcess.js.map +1 -0
- package/dist/internal/machineRuntime.d.ts +119 -0
- package/dist/internal/machineRuntime.d.ts.map +1 -0
- package/dist/internal/machineRuntime.js +354 -0
- package/dist/internal/machineRuntime.js.map +1 -0
- package/dist/reactivity.d.ts +2 -0
- package/dist/reactivity.d.ts.map +1 -0
- package/dist/reactivity.js +2 -0
- package/dist/reactivity.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import * as Context from "effect/Context";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import * as Option from "effect/Option";
|
|
5
|
+
import * as Schema from "effect/Schema";
|
|
6
|
+
import * as Machine from "./Machine.js";
|
|
7
|
+
import { Rpc } from "effect/unstable/rpc";
|
|
8
|
+
import { ClusterError, Entity, EntityAddress, MessageStorage, type Sharding, Snowflake } from "effect/unstable/cluster";
|
|
9
|
+
type EntityAddress = EntityAddress.EntityAddress;
|
|
10
|
+
type PersistenceError = ClusterError.PersistenceError;
|
|
11
|
+
type Snowflake = Snowflake.Snowflake;
|
|
12
|
+
/**
|
|
13
|
+
* Persisted machine checkpoint owned by the Cluster bridge.
|
|
14
|
+
*
|
|
15
|
+
* **Details**
|
|
16
|
+
*
|
|
17
|
+
* Machine identity and deployment version are stored around the generic
|
|
18
|
+
* encoded snapshot. The request id records the request that produced the
|
|
19
|
+
* checkpoint.
|
|
20
|
+
*
|
|
21
|
+
* @category models
|
|
22
|
+
* @since 4.0.0
|
|
23
|
+
*/
|
|
24
|
+
export interface Checkpoint {
|
|
25
|
+
readonly machineId: string;
|
|
26
|
+
readonly version: string;
|
|
27
|
+
readonly requestId: Snowflake;
|
|
28
|
+
readonly snapshot: Machine.Machine.EncodedSnapshot;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Result of loading a checkpoint for a Cluster machine request.
|
|
32
|
+
*
|
|
33
|
+
* **Details**
|
|
34
|
+
*
|
|
35
|
+
* `processed` reports whether the exact Cluster request id was already
|
|
36
|
+
* committed. Storage implementations must retain enough request ids to detect
|
|
37
|
+
* redelivery even after later requests have advanced the checkpoint.
|
|
38
|
+
*
|
|
39
|
+
* @category models
|
|
40
|
+
* @since 4.0.0
|
|
41
|
+
*/
|
|
42
|
+
export interface LoadResult {
|
|
43
|
+
readonly checkpoint: Option.Option<Checkpoint>;
|
|
44
|
+
readonly processed: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Result of atomically committing a Cluster machine request.
|
|
48
|
+
*
|
|
49
|
+
* @category models
|
|
50
|
+
* @since 4.0.0
|
|
51
|
+
*/
|
|
52
|
+
export type CommitResult = CommitResult.Committed | CommitResult.Duplicate;
|
|
53
|
+
/**
|
|
54
|
+
* Constructors and types for Cluster machine commit results.
|
|
55
|
+
*
|
|
56
|
+
* @category models
|
|
57
|
+
* @since 4.0.0
|
|
58
|
+
*/
|
|
59
|
+
export declare const CommitResult: {
|
|
60
|
+
Committed: () => CommitResult.Committed;
|
|
61
|
+
Duplicate: () => CommitResult.Duplicate;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Types for Cluster machine commit results.
|
|
65
|
+
*
|
|
66
|
+
* @since 4.0.0
|
|
67
|
+
*/
|
|
68
|
+
export declare namespace CommitResult {
|
|
69
|
+
/**
|
|
70
|
+
* Indicates that the request id and checkpoint were committed atomically.
|
|
71
|
+
*
|
|
72
|
+
* @category models
|
|
73
|
+
* @since 4.0.0
|
|
74
|
+
*/
|
|
75
|
+
interface Committed {
|
|
76
|
+
readonly _tag: "Committed";
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Indicates that the request id was already committed.
|
|
80
|
+
*
|
|
81
|
+
* @category models
|
|
82
|
+
* @since 4.0.0
|
|
83
|
+
*/
|
|
84
|
+
interface Duplicate {
|
|
85
|
+
readonly _tag: "Duplicate";
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
declare const Storage_base: Context.ServiceClass<Storage, "effect/cluster/ClusterMachine/Storage", {
|
|
89
|
+
readonly load: (address: EntityAddress, requestId: Snowflake) => Effect.Effect<LoadResult, PersistenceError>;
|
|
90
|
+
readonly commit: (address: EntityAddress, checkpoint: Checkpoint) => Effect.Effect<CommitResult, PersistenceError>;
|
|
91
|
+
}>;
|
|
92
|
+
/**
|
|
93
|
+
* Checkpoint persistence service used by Cluster machines.
|
|
94
|
+
*
|
|
95
|
+
* **When to use**
|
|
96
|
+
*
|
|
97
|
+
* Use to connect `ClusterMachine` to a durable checkpoint store that can
|
|
98
|
+
* atomically deduplicate request ids and replace the current checkpoint.
|
|
99
|
+
*
|
|
100
|
+
* **Gotchas**
|
|
101
|
+
*
|
|
102
|
+
* For checkpoint and emitted-message persistence to commit atomically, this
|
|
103
|
+
* service must join the transaction opened through the configured
|
|
104
|
+
* `MessageStorage`. The reply is persisted after that transaction; storing the
|
|
105
|
+
* request id with the checkpoint makes a redelivery recover that reply without
|
|
106
|
+
* applying the transition again. A separate transaction or database cannot
|
|
107
|
+
* provide checkpoint-and-emission atomicity.
|
|
108
|
+
*
|
|
109
|
+
* @category services
|
|
110
|
+
* @since 4.0.0
|
|
111
|
+
*/
|
|
112
|
+
export declare class Storage extends Storage_base {
|
|
113
|
+
}
|
|
114
|
+
declare const Accepted_base: Schema.Class<Accepted, Schema.TaggedStruct<"Accepted", {}>, {}>;
|
|
115
|
+
/**
|
|
116
|
+
* Successful result returned after a Cluster machine request is committed or
|
|
117
|
+
* recognized as a redelivery.
|
|
118
|
+
*
|
|
119
|
+
* @category models
|
|
120
|
+
* @since 4.0.0
|
|
121
|
+
*/
|
|
122
|
+
export declare class Accepted extends Accepted_base {
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Schema for reasons a Cluster machine request can be rejected without
|
|
126
|
+
* advancing its checkpoint.
|
|
127
|
+
*
|
|
128
|
+
* @category models
|
|
129
|
+
* @since 4.0.0
|
|
130
|
+
*/
|
|
131
|
+
export declare const RejectionReason: Schema.Literals<readonly ["MachineIdMismatch", "VersionMismatch", "InvalidCheckpoint", "UnsupportedProcessLocal", "TransitionFailure", "PersistenceFailure", "EmissionFailure"]>;
|
|
132
|
+
/**
|
|
133
|
+
* Type of {@link RejectionReason}.
|
|
134
|
+
*
|
|
135
|
+
* @category models
|
|
136
|
+
* @since 4.0.0
|
|
137
|
+
*/
|
|
138
|
+
export type RejectionReason = typeof RejectionReason.Type;
|
|
139
|
+
declare const Rejected_base: Schema.Class<Rejected, Schema.TaggedStruct<"Rejected", {
|
|
140
|
+
readonly reason: Schema.Literals<readonly ["MachineIdMismatch", "VersionMismatch", "InvalidCheckpoint", "UnsupportedProcessLocal", "TransitionFailure", "PersistenceFailure", "EmissionFailure"]>;
|
|
141
|
+
readonly message: Schema.String;
|
|
142
|
+
}>, {}>;
|
|
143
|
+
/**
|
|
144
|
+
* Rejected Cluster machine request. Transaction-participating durable storage
|
|
145
|
+
* leaves the previous checkpoint in place and suppresses emitted events.
|
|
146
|
+
*
|
|
147
|
+
* @category models
|
|
148
|
+
* @since 4.0.0
|
|
149
|
+
*/
|
|
150
|
+
export declare class Rejected extends Rejected_base {
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Schema for Cluster machine request outcomes.
|
|
154
|
+
*
|
|
155
|
+
* @category schemas
|
|
156
|
+
* @since 4.0.0
|
|
157
|
+
*/
|
|
158
|
+
export declare const SendResult: Schema.Union<readonly [typeof Accepted, typeof Rejected]>;
|
|
159
|
+
type SendRpc<Events extends ReadonlyArray<Machine.Machine.TaggedSchema>> = Rpc.Rpc<"send", Schema.Union<Events>, typeof SendResult>;
|
|
160
|
+
type MachineEvents<M extends Machine.Machine.Any> = M extends Machine.Machine<any, infer Events, any, any, any, any, any, any, any, any, any, any> ? Events & ReadonlyArray<Machine.Machine.TaggedSchema> : never;
|
|
161
|
+
type MachineEmits<M extends Machine.Machine.Any> = M extends Machine.Machine<any, any, any, any, any, any, any, any, any, any, infer Emits, any> ? Emits & ReadonlyArray<Machine.Machine.TaggedSchema> : never;
|
|
162
|
+
/**
|
|
163
|
+
* Cluster adapter for one machine definition and entity type.
|
|
164
|
+
*
|
|
165
|
+
* **Details**
|
|
166
|
+
*
|
|
167
|
+
* The adapter exposes one persisted `send` RPC. Entity requests are serialized
|
|
168
|
+
* by the normal Cluster entity concurrency and every accepted request advances
|
|
169
|
+
* the checkpoint at most once.
|
|
170
|
+
*
|
|
171
|
+
* @category models
|
|
172
|
+
* @since 4.0.0
|
|
173
|
+
*/
|
|
174
|
+
export interface ClusterMachine<in out Type extends string, in out M extends Machine.Machine.Any, out Services = MachineServices<M>> {
|
|
175
|
+
readonly machine: M;
|
|
176
|
+
readonly entity: Entity.Entity<Type, SendRpc<MachineEvents<M>>>;
|
|
177
|
+
/**
|
|
178
|
+
* Creates the Cluster entity layer for this machine.
|
|
179
|
+
*
|
|
180
|
+
* **Gotchas**
|
|
181
|
+
*
|
|
182
|
+
* `enqueue` runs after the checkpoint write in the same `MessageStorage`
|
|
183
|
+
* transaction. It must durably enqueue emitted events in that transaction;
|
|
184
|
+
* arbitrary external effects are not atomic with the checkpoint. The reply
|
|
185
|
+
* is persisted after commit and recovered through request-id deduplication if
|
|
186
|
+
* delivery is interrupted. Machines that never emit may omit `enqueue`.
|
|
187
|
+
*/
|
|
188
|
+
readonly toLayer: <R = never>(options?: {
|
|
189
|
+
readonly enqueue?: (event: Machine.Machine.EmitOf<MachineEmits<M>>) => Effect.Effect<void, unknown, R>;
|
|
190
|
+
}) => Layer.Layer<never, never, Storage | MessageStorage.MessageStorage | Sharding.Sharding | R | Services>;
|
|
191
|
+
}
|
|
192
|
+
type MachineServices<M extends Machine.Machine.Any> = M extends Machine.Machine<infer States, infer Events, any, any, any, infer R, any, infer InitialR, any, any, infer Emits, any> ? ExcludeCompatibleRuntime<Machine.ExecutionServices<R | InitialR>, Machine.Machine.EventOf<Events & ReadonlyArray<Machine.Machine.TaggedSchema>>, Machine.Machine.EmitOf<Emits & ReadonlyArray<Machine.Machine.TaggedSchema>>> | Machine.Machine.SnapshotDecodingServices<States & Machine.Machine.StateSchemas> | Machine.Machine.SnapshotEncodingServices<States & Machine.Machine.StateSchemas> : never;
|
|
193
|
+
type IsAny<A> = 0 extends (1 & A) ? true : false;
|
|
194
|
+
type ExcludeCompatibleRuntime<Requirements, Events, Emits> = Requirements extends Machine.Runtime.Requirement<infer RequiredEvents, infer RequiredEmits> ? IsAny<Requirements> extends true ? Requirements : [RequiredEvents] extends [Events] ? [RequiredEmits] extends [Emits] ? never : Requirements : Requirements : Requirements;
|
|
195
|
+
/**
|
|
196
|
+
* Creates an in-memory Cluster machine checkpoint store.
|
|
197
|
+
*
|
|
198
|
+
* **When to use**
|
|
199
|
+
*
|
|
200
|
+
* Use when you test or run a local process that does not require checkpoints
|
|
201
|
+
* to survive a restart.
|
|
202
|
+
*
|
|
203
|
+
* **Gotchas**
|
|
204
|
+
*
|
|
205
|
+
* This store is not durable and does not provide rollback with the in-memory
|
|
206
|
+
* `MessageStorage` transaction marker.
|
|
207
|
+
*
|
|
208
|
+
* @category constructors
|
|
209
|
+
* @since 4.0.0
|
|
210
|
+
*/
|
|
211
|
+
export declare const makeMemory: Effect.Effect<Storage["Service"]>;
|
|
212
|
+
/**
|
|
213
|
+
* Layer providing the in-memory Cluster machine checkpoint store.
|
|
214
|
+
*
|
|
215
|
+
* @category layers
|
|
216
|
+
* @since 4.0.0
|
|
217
|
+
*/
|
|
218
|
+
export declare const layerMemory: Layer.Layer<Storage>;
|
|
219
|
+
/**
|
|
220
|
+
* Creates a persisted Cluster entity adapter for a machine.
|
|
221
|
+
*
|
|
222
|
+
* **When to use**
|
|
223
|
+
*
|
|
224
|
+
* Use when each Cluster entity id should own one durable machine snapshot and
|
|
225
|
+
* accept schema-validated machine events through a persisted `send` RPC.
|
|
226
|
+
*
|
|
227
|
+
* **Details**
|
|
228
|
+
*
|
|
229
|
+
* A missing checkpoint runs initial planning before the first event. Existing
|
|
230
|
+
* checkpoints are identity-checked, version-checked, decoded, and resumed
|
|
231
|
+
* without rerunning initial entry behavior. Final checkpoints accept later
|
|
232
|
+
* requests as no-ops. The stable bridge identity is `machine.id` when present,
|
|
233
|
+
* otherwise the Cluster entity type.
|
|
234
|
+
*
|
|
235
|
+
* **Gotchas**
|
|
236
|
+
*
|
|
237
|
+
* Invoked processes, spawned children, action-time `runtime.raise`, timers,
|
|
238
|
+
* subscriptions, and other process-local state are not durable and are
|
|
239
|
+
* rejected. Planning-time raised events remain part of the current macrostep.
|
|
240
|
+
* Arbitrary action effects may run again after a crash before checkpoint
|
|
241
|
+
* commit, so the bridge does not provide exactly-once external effects.
|
|
242
|
+
*
|
|
243
|
+
* @category constructors
|
|
244
|
+
* @since 4.0.0
|
|
245
|
+
*/
|
|
246
|
+
export declare const make: <const Type extends string, States extends Machine.Machine.StateSchemas, Events extends ReadonlyArray<Machine.Machine.TaggedSchema>, Input extends Schema.Top, UnhandledStates extends Machine.Machine.StateIdentifier<States>, E, R, InitialE, InitialR, FinalStates extends Machine.Machine.StateIdentifier<States>, Output, Emits extends ReadonlyArray<Machine.Machine.TaggedSchema>, OutputStates extends Machine.Machine.StateIdentifier<States>>(type: Type, machine: Machine.Machine<States, Events, Input, UnhandledStates, E, R, InitialE, InitialR, FinalStates, Output, Emits, OutputStates>, options: {
|
|
247
|
+
readonly version: string;
|
|
248
|
+
}, ...input: [...Machine.Machine.InputArgs<Input>]) => ClusterMachine<Type, Machine.Machine<States, Events, Input, UnhandledStates, E, R, InitialE, InitialR, FinalStates, Output, Emits, OutputStates>, ExcludeCompatibleRuntime<Machine.ExecutionServices<R | InitialR>, Machine.Machine.EventOf<Events>, Machine.Machine.EmitOf<Emits>> | Machine.Machine.SnapshotDecodingServices<States> | Machine.Machine.SnapshotEncodingServices<States>>;
|
|
249
|
+
export {};
|
|
250
|
+
//# sourceMappingURL=ClusterMachine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClusterMachine.d.ts","sourceRoot":"","sources":["../src/ClusterMachine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs Effect machines as persisted Cluster entities.
|
|
3
|
+
*
|
|
4
|
+
* @since 4.0.0
|
|
5
|
+
*/
|
|
6
|
+
import * as Cause from "effect/Cause";
|
|
7
|
+
import * as Context from "effect/Context";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import * as Layer from "effect/Layer";
|
|
10
|
+
import * as Option from "effect/Option";
|
|
11
|
+
import * as Schema from "effect/Schema";
|
|
12
|
+
import * as Machine from "./Machine.js";
|
|
13
|
+
import { Rpc } from "effect/unstable/rpc";
|
|
14
|
+
import { ClusterError, ClusterSchema, Entity, EntityAddress, MessageStorage, Snowflake } from "effect/unstable/cluster";
|
|
15
|
+
/**
|
|
16
|
+
* Constructors and types for Cluster machine commit results.
|
|
17
|
+
*
|
|
18
|
+
* @category models
|
|
19
|
+
* @since 4.0.0
|
|
20
|
+
*/
|
|
21
|
+
export const CommitResult = {
|
|
22
|
+
Committed: () => ({ _tag: "Committed" }),
|
|
23
|
+
Duplicate: () => ({ _tag: "Duplicate" })
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Checkpoint persistence service used by Cluster machines.
|
|
27
|
+
*
|
|
28
|
+
* **When to use**
|
|
29
|
+
*
|
|
30
|
+
* Use to connect `ClusterMachine` to a durable checkpoint store that can
|
|
31
|
+
* atomically deduplicate request ids and replace the current checkpoint.
|
|
32
|
+
*
|
|
33
|
+
* **Gotchas**
|
|
34
|
+
*
|
|
35
|
+
* For checkpoint and emitted-message persistence to commit atomically, this
|
|
36
|
+
* service must join the transaction opened through the configured
|
|
37
|
+
* `MessageStorage`. The reply is persisted after that transaction; storing the
|
|
38
|
+
* request id with the checkpoint makes a redelivery recover that reply without
|
|
39
|
+
* applying the transition again. A separate transaction or database cannot
|
|
40
|
+
* provide checkpoint-and-emission atomicity.
|
|
41
|
+
*
|
|
42
|
+
* @category services
|
|
43
|
+
* @since 4.0.0
|
|
44
|
+
*/
|
|
45
|
+
export class Storage extends Context.Service()("effect/cluster/ClusterMachine/Storage") {
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Successful result returned after a Cluster machine request is committed or
|
|
49
|
+
* recognized as a redelivery.
|
|
50
|
+
*
|
|
51
|
+
* @category models
|
|
52
|
+
* @since 4.0.0
|
|
53
|
+
*/
|
|
54
|
+
export class Accepted extends Schema.TaggedClass("effect/cluster/ClusterMachine/Accepted")("Accepted", {}) {
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Schema for reasons a Cluster machine request can be rejected without
|
|
58
|
+
* advancing its checkpoint.
|
|
59
|
+
*
|
|
60
|
+
* @category models
|
|
61
|
+
* @since 4.0.0
|
|
62
|
+
*/
|
|
63
|
+
export const RejectionReason = Schema.Literals([
|
|
64
|
+
"MachineIdMismatch",
|
|
65
|
+
"VersionMismatch",
|
|
66
|
+
"InvalidCheckpoint",
|
|
67
|
+
"UnsupportedProcessLocal",
|
|
68
|
+
"TransitionFailure",
|
|
69
|
+
"PersistenceFailure",
|
|
70
|
+
"EmissionFailure"
|
|
71
|
+
]);
|
|
72
|
+
/**
|
|
73
|
+
* Rejected Cluster machine request. Transaction-participating durable storage
|
|
74
|
+
* leaves the previous checkpoint in place and suppresses emitted events.
|
|
75
|
+
*
|
|
76
|
+
* @category models
|
|
77
|
+
* @since 4.0.0
|
|
78
|
+
*/
|
|
79
|
+
export class Rejected extends Schema.TaggedClass("effect/cluster/ClusterMachine/Rejected")("Rejected", {
|
|
80
|
+
reason: RejectionReason,
|
|
81
|
+
message: Schema.String
|
|
82
|
+
}) {
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Schema for Cluster machine request outcomes.
|
|
86
|
+
*
|
|
87
|
+
* @category schemas
|
|
88
|
+
* @since 4.0.0
|
|
89
|
+
*/
|
|
90
|
+
export const SendResult = Schema.Union([Accepted, Rejected]);
|
|
91
|
+
const hasInvokes = (machine) => Reflect.ownKeys(machine.handlers).some((key) => machine.handlers[key]?.invoke !== undefined);
|
|
92
|
+
const reject = (reason, message) => new Rejected({ reason, message });
|
|
93
|
+
const fail = (reason, message) => Effect.fail(reject(reason, message));
|
|
94
|
+
const messageFromCause = (cause) => {
|
|
95
|
+
const squashed = Cause.squash(cause);
|
|
96
|
+
return squashed instanceof globalThis.Error ? squashed.message : String(squashed);
|
|
97
|
+
};
|
|
98
|
+
const rejectionFromCause = (cause) => {
|
|
99
|
+
const error = Cause.findErrorOption(cause);
|
|
100
|
+
if (Option.isSome(error) && error.value instanceof Rejected) {
|
|
101
|
+
return error.value;
|
|
102
|
+
}
|
|
103
|
+
if (Option.isSome(error) && error.value instanceof Machine.ProcessLocalError) {
|
|
104
|
+
return reject("UnsupportedProcessLocal", `${error.value.operation} is process-local and is not supported`);
|
|
105
|
+
}
|
|
106
|
+
return reject("TransitionFailure", messageFromCause(cause));
|
|
107
|
+
};
|
|
108
|
+
const addressKey = (address) => `${address.entityType}\u0000${address.entityId}`;
|
|
109
|
+
/**
|
|
110
|
+
* Creates an in-memory Cluster machine checkpoint store.
|
|
111
|
+
*
|
|
112
|
+
* **When to use**
|
|
113
|
+
*
|
|
114
|
+
* Use when you test or run a local process that does not require checkpoints
|
|
115
|
+
* to survive a restart.
|
|
116
|
+
*
|
|
117
|
+
* **Gotchas**
|
|
118
|
+
*
|
|
119
|
+
* This store is not durable and does not provide rollback with the in-memory
|
|
120
|
+
* `MessageStorage` transaction marker.
|
|
121
|
+
*
|
|
122
|
+
* @category constructors
|
|
123
|
+
* @since 4.0.0
|
|
124
|
+
*/
|
|
125
|
+
export const makeMemory = Effect.sync(() => {
|
|
126
|
+
const entries = new Map();
|
|
127
|
+
return Storage.of({
|
|
128
|
+
load: (address, requestId) => Effect.sync(() => {
|
|
129
|
+
const entry = entries.get(addressKey(address));
|
|
130
|
+
return {
|
|
131
|
+
checkpoint: Option.fromNullishOr(entry?.checkpoint),
|
|
132
|
+
processed: entry?.requests.has(requestId) ?? false
|
|
133
|
+
};
|
|
134
|
+
}),
|
|
135
|
+
commit: (address, checkpoint) => Effect.sync(() => {
|
|
136
|
+
const key = addressKey(address);
|
|
137
|
+
const entry = entries.get(key);
|
|
138
|
+
if (entry?.requests.has(checkpoint.requestId)) {
|
|
139
|
+
return CommitResult.Duplicate();
|
|
140
|
+
}
|
|
141
|
+
if (entry === undefined) {
|
|
142
|
+
entries.set(key, {
|
|
143
|
+
checkpoint,
|
|
144
|
+
requests: new Set([checkpoint.requestId])
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
entry.checkpoint = checkpoint;
|
|
149
|
+
entry.requests.add(checkpoint.requestId);
|
|
150
|
+
}
|
|
151
|
+
return CommitResult.Committed();
|
|
152
|
+
})
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
/**
|
|
156
|
+
* Layer providing the in-memory Cluster machine checkpoint store.
|
|
157
|
+
*
|
|
158
|
+
* @category layers
|
|
159
|
+
* @since 4.0.0
|
|
160
|
+
*/
|
|
161
|
+
export const layerMemory = Layer.effect(Storage, makeMemory);
|
|
162
|
+
/**
|
|
163
|
+
* Creates a persisted Cluster entity adapter for a machine.
|
|
164
|
+
*
|
|
165
|
+
* **When to use**
|
|
166
|
+
*
|
|
167
|
+
* Use when each Cluster entity id should own one durable machine snapshot and
|
|
168
|
+
* accept schema-validated machine events through a persisted `send` RPC.
|
|
169
|
+
*
|
|
170
|
+
* **Details**
|
|
171
|
+
*
|
|
172
|
+
* A missing checkpoint runs initial planning before the first event. Existing
|
|
173
|
+
* checkpoints are identity-checked, version-checked, decoded, and resumed
|
|
174
|
+
* without rerunning initial entry behavior. Final checkpoints accept later
|
|
175
|
+
* requests as no-ops. The stable bridge identity is `machine.id` when present,
|
|
176
|
+
* otherwise the Cluster entity type.
|
|
177
|
+
*
|
|
178
|
+
* **Gotchas**
|
|
179
|
+
*
|
|
180
|
+
* Invoked processes, spawned children, action-time `runtime.raise`, timers,
|
|
181
|
+
* subscriptions, and other process-local state are not durable and are
|
|
182
|
+
* rejected. Planning-time raised events remain part of the current macrostep.
|
|
183
|
+
* Arbitrary action effects may run again after a crash before checkpoint
|
|
184
|
+
* commit, so the bridge does not provide exactly-once external effects.
|
|
185
|
+
*
|
|
186
|
+
* @category constructors
|
|
187
|
+
* @since 4.0.0
|
|
188
|
+
*/
|
|
189
|
+
export const make = (type, machine, options, ...input) => {
|
|
190
|
+
const eventSchema = Schema.Union(machine.events);
|
|
191
|
+
const rpc = Rpc.make("send", {
|
|
192
|
+
payload: eventSchema,
|
|
193
|
+
success: SendResult
|
|
194
|
+
})
|
|
195
|
+
.annotate(ClusterSchema.Persisted, true);
|
|
196
|
+
const entity = Entity.make(type, [rpc]);
|
|
197
|
+
const machineId = machine.id ?? type;
|
|
198
|
+
const toLayer = (layerOptions) => entity.toLayer(Effect.gen(function* () {
|
|
199
|
+
const storage = yield* Storage;
|
|
200
|
+
const messageStorage = yield* MessageStorage.MessageStorage;
|
|
201
|
+
const handle = Effect.fnUntraced(function* (request) {
|
|
202
|
+
if (hasInvokes(machine)) {
|
|
203
|
+
return yield* fail("UnsupportedProcessLocal", "Machine invoke configurations are process-local and cannot be restored");
|
|
204
|
+
}
|
|
205
|
+
const loaded = yield* storage.load(request.address, request.requestId).pipe(Effect.mapError((error) => reject("PersistenceFailure", String(error.cause))));
|
|
206
|
+
let current;
|
|
207
|
+
const emitted = [];
|
|
208
|
+
if (Option.isSome(loaded.checkpoint)) {
|
|
209
|
+
const checkpoint = loaded.checkpoint.value;
|
|
210
|
+
if (loaded.processed) {
|
|
211
|
+
return new Accepted({});
|
|
212
|
+
}
|
|
213
|
+
if (checkpoint.machineId !== machineId) {
|
|
214
|
+
return yield* fail("MachineIdMismatch", `Expected machine id ${machineId}, received ${checkpoint.machineId}`);
|
|
215
|
+
}
|
|
216
|
+
if (checkpoint.version !== options.version) {
|
|
217
|
+
return yield* fail("VersionMismatch", `Expected version ${options.version}, received ${checkpoint.version}`);
|
|
218
|
+
}
|
|
219
|
+
current = yield* Machine.decodeSnapshot(machine, checkpoint.snapshot).pipe(Effect.mapError((error) => reject("InvalidCheckpoint", String(error.cause))));
|
|
220
|
+
}
|
|
221
|
+
else if (loaded.processed) {
|
|
222
|
+
return yield* fail("InvalidCheckpoint", "The request was recorded without a checkpoint");
|
|
223
|
+
}
|
|
224
|
+
const runtime = {
|
|
225
|
+
raise: () => Effect.die(new Machine.ProcessLocalError({ operation: "runtime.raise" })),
|
|
226
|
+
sendParent: (event) => Effect.sync(() => {
|
|
227
|
+
emitted.push(event);
|
|
228
|
+
})
|
|
229
|
+
};
|
|
230
|
+
if (current === undefined) {
|
|
231
|
+
const initial = yield* Machine.planInitial(machine, ...input);
|
|
232
|
+
yield* Machine.runActions(initial.actions, runtime);
|
|
233
|
+
current = initial.state;
|
|
234
|
+
emitted.push(...initial.emittedEvents);
|
|
235
|
+
}
|
|
236
|
+
if (!Machine.isFinal(machine, current)) {
|
|
237
|
+
const planned = yield* Machine.plan(machine, current, request.payload);
|
|
238
|
+
yield* Machine.runActions(planned.actions, runtime);
|
|
239
|
+
current = planned.next;
|
|
240
|
+
emitted.push(...planned.emittedEvents);
|
|
241
|
+
}
|
|
242
|
+
const encoded = yield* Machine.encodeSnapshot(machine, current);
|
|
243
|
+
if (emitted.length > 0 && layerOptions?.enqueue === undefined) {
|
|
244
|
+
return yield* fail("EmissionFailure", "No durable enqueue handler was configured");
|
|
245
|
+
}
|
|
246
|
+
const committed = yield* storage.commit(request.address, {
|
|
247
|
+
machineId,
|
|
248
|
+
version: options.version,
|
|
249
|
+
requestId: request.requestId,
|
|
250
|
+
snapshot: encoded
|
|
251
|
+
}).pipe(Effect.mapError((error) => reject("PersistenceFailure", String(error.cause))));
|
|
252
|
+
if (committed._tag === "Duplicate") {
|
|
253
|
+
return new Accepted({});
|
|
254
|
+
}
|
|
255
|
+
if (layerOptions?.enqueue !== undefined) {
|
|
256
|
+
yield* Effect.forEach(emitted, layerOptions.enqueue, { discard: true }).pipe(Effect.mapError((error) => reject("EmissionFailure", String(error))));
|
|
257
|
+
}
|
|
258
|
+
return new Accepted({});
|
|
259
|
+
});
|
|
260
|
+
return entity.of({
|
|
261
|
+
send: (request) => messageStorage.withTransaction(handle(request).pipe(Effect.catchCause((cause) => Cause.hasInterrupts(cause)
|
|
262
|
+
? Effect.failCause(cause)
|
|
263
|
+
: Effect.fail(rejectionFromCause(cause))))).pipe(Effect.catchCause((cause) => {
|
|
264
|
+
if (Cause.hasInterrupts(cause)) {
|
|
265
|
+
return Effect.failCause(cause);
|
|
266
|
+
}
|
|
267
|
+
const error = Cause.findErrorOption(cause);
|
|
268
|
+
return Effect.succeed(Option.isSome(error) && error.value instanceof Rejected
|
|
269
|
+
? error.value
|
|
270
|
+
: reject("PersistenceFailure", messageFromCause(cause)));
|
|
271
|
+
}))
|
|
272
|
+
});
|
|
273
|
+
}));
|
|
274
|
+
return {
|
|
275
|
+
machine,
|
|
276
|
+
entity,
|
|
277
|
+
toLayer
|
|
278
|
+
};
|
|
279
|
+
};
|
|
280
|
+
//# sourceMappingURL=ClusterMachine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClusterMachine.js","sourceRoot":"","sources":["../src/ClusterMachine.ts"],"names":[],"mappings":"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"}
|