@rivetkit/effect 0.0.0-06-09-refactor-rivetkit-split-workflow-context-into-workflowcontext-workflowstepcontext.e0c9540
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/Action.d.ts +104 -0
- package/dist/Action.d.ts.map +1 -0
- package/dist/Action.js +50 -0
- package/dist/Action.js.map +1 -0
- package/dist/Actor.d.ts +133 -0
- package/dist/Actor.d.ts.map +1 -0
- package/dist/Actor.js +104 -0
- package/dist/Actor.js.map +1 -0
- package/dist/Client.d.ts +31 -0
- package/dist/Client.d.ts.map +1 -0
- package/dist/Client.js +98 -0
- package/dist/Client.js.map +1 -0
- package/dist/Logger.d.ts +29 -0
- package/dist/Logger.d.ts.map +1 -0
- package/dist/Logger.js +31 -0
- package/dist/Logger.js.map +1 -0
- package/dist/Registry.d.ts +72 -0
- package/dist/Registry.d.ts.map +1 -0
- package/dist/Registry.js +125 -0
- package/dist/Registry.js.map +1 -0
- package/dist/RivetError.d.ts +438 -0
- package/dist/RivetError.d.ts.map +1 -0
- package/dist/RivetError.js +873 -0
- package/dist/RivetError.js.map +1 -0
- package/dist/State.d.ts +123 -0
- package/dist/State.d.ts.map +1 -0
- package/dist/State.js +104 -0
- package/dist/State.js.map +1 -0
- package/dist/internal/ActionDispatcher.d.ts +14 -0
- package/dist/internal/ActionDispatcher.d.ts.map +1 -0
- package/dist/internal/ActionDispatcher.js +100 -0
- package/dist/internal/ActionDispatcher.js.map +1 -0
- package/dist/internal/ActionErrorEnvelope.d.ts +11 -0
- package/dist/internal/ActionErrorEnvelope.d.ts.map +1 -0
- package/dist/internal/ActionErrorEnvelope.js +14 -0
- package/dist/internal/ActionErrorEnvelope.js.map +1 -0
- package/dist/internal/ActorInstanceManager.d.ts +28 -0
- package/dist/internal/ActorInstanceManager.d.ts.map +1 -0
- package/dist/internal/ActorInstanceManager.js +51 -0
- package/dist/internal/ActorInstanceManager.js.map +1 -0
- package/dist/internal/ActorStateAdapter.d.ts +18 -0
- package/dist/internal/ActorStateAdapter.d.ts.map +1 -0
- package/dist/internal/ActorStateAdapter.js +29 -0
- package/dist/internal/ActorStateAdapter.js.map +1 -0
- package/dist/internal/StateOptions.d.ts +12 -0
- package/dist/internal/StateOptions.d.ts.map +1 -0
- package/dist/internal/StateOptions.js +2 -0
- package/dist/internal/StateOptions.js.map +1 -0
- package/dist/internal/logging.d.ts +23 -0
- package/dist/internal/logging.d.ts.map +1 -0
- package/dist/internal/logging.js +162 -0
- package/dist/internal/logging.js.map +1 -0
- package/dist/internal/tracing.d.ts +23 -0
- package/dist/internal/tracing.d.ts.map +1 -0
- package/dist/internal/tracing.js +30 -0
- package/dist/internal/tracing.js.map +1 -0
- package/dist/internal/utils.d.ts +7 -0
- package/dist/internal/utils.d.ts.map +1 -0
- package/dist/internal/utils.js +7 -0
- package/dist/internal/utils.js.map +1 -0
- package/dist/mod.d.ts +8 -0
- package/dist/mod.d.ts.map +1 -0
- package/dist/mod.js +8 -0
- package/dist/mod.js.map +1 -0
- package/package.json +46 -0
- package/src/Action.ts +231 -0
- package/src/Actor.test-d.ts +603 -0
- package/src/Actor.test.ts +206 -0
- package/src/Actor.ts +550 -0
- package/src/Client.test.ts +210 -0
- package/src/Client.ts +216 -0
- package/src/Logger.ts +43 -0
- package/src/Registry.test-d.ts +126 -0
- package/src/Registry.test.ts +411 -0
- package/src/Registry.ts +243 -0
- package/src/RivetError.test.ts +188 -0
- package/src/RivetError.ts +1044 -0
- package/src/State.test.ts +181 -0
- package/src/State.ts +224 -0
- package/src/internal/ActionDispatcher.ts +192 -0
- package/src/internal/ActionErrorEnvelope.ts +19 -0
- package/src/internal/ActorInstanceManager.ts +143 -0
- package/src/internal/ActorStateAdapter.ts +88 -0
- package/src/internal/StateOptions.ts +17 -0
- package/src/internal/logging.test.ts +288 -0
- package/src/internal/logging.ts +237 -0
- package/src/internal/tracing.ts +42 -0
- package/src/internal/utils.ts +12 -0
- package/src/mod.ts +7 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { assert, describe, it } from "@effect/vitest";
|
|
2
|
+
import { Actor, State } from "@rivetkit/effect";
|
|
3
|
+
import { Context, Effect, Layer } from "effect";
|
|
4
|
+
import type * as Rivetkit from "rivetkit";
|
|
5
|
+
|
|
6
|
+
class Prefix extends Context.Service<Prefix, { readonly value: string }>()(
|
|
7
|
+
"Actor.test/Prefix",
|
|
8
|
+
) {}
|
|
9
|
+
const PrefixLive = Layer.succeed(Prefix, Prefix.of({ value: "svc" }));
|
|
10
|
+
|
|
11
|
+
describe("Actor.toWakeHandler", () => {
|
|
12
|
+
it("defaults actions to an empty array", () => {
|
|
13
|
+
const actor = Actor.make("NoActions");
|
|
14
|
+
|
|
15
|
+
assert.deepStrictEqual(actor.actions, []);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it.effect("wraps a plain action handler object", () =>
|
|
19
|
+
Effect.gen(function* () {
|
|
20
|
+
const wake = { Ping: () => Effect.succeed("pong") };
|
|
21
|
+
const wakeHandler = Actor.toWakeHandler(wake);
|
|
22
|
+
const actionHandlers = yield* wakeHandler({} as Actor.WakeOptions);
|
|
23
|
+
|
|
24
|
+
assert.strictEqual(actionHandlers, wake);
|
|
25
|
+
}),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
it.effect("runs an Effect that resolves to action handlers", () =>
|
|
29
|
+
Effect.gen(function* () {
|
|
30
|
+
const wake = Effect.gen(function* () {
|
|
31
|
+
const prefix = yield* Prefix;
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
Ping: () => Effect.succeed(`${prefix.value}:pong`),
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
const wakeHandler = Actor.toWakeHandler(wake);
|
|
38
|
+
const actionHandlers = yield* wakeHandler({} as Actor.WakeOptions);
|
|
39
|
+
|
|
40
|
+
assert.strictEqual(yield* actionHandlers.Ping(), "svc:pong");
|
|
41
|
+
}).pipe(Effect.provide(PrefixLive)),
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
it.effect("calls a wake function with wake options", () =>
|
|
45
|
+
Effect.gen(function* () {
|
|
46
|
+
const rawRivetkitContext = {
|
|
47
|
+
key: ["room", "1"],
|
|
48
|
+
} as Rivetkit.WakeContextOf<Rivetkit.AnyActorDefinition>;
|
|
49
|
+
const wakeOptions: Actor.WakeOptions = {
|
|
50
|
+
rawRivetkitContext,
|
|
51
|
+
};
|
|
52
|
+
const wake = (wakeOptions: Actor.WakeOptions) => ({
|
|
53
|
+
GetKey: () =>
|
|
54
|
+
Effect.succeed(
|
|
55
|
+
wakeOptions.rawRivetkitContext.key.join("/"),
|
|
56
|
+
),
|
|
57
|
+
});
|
|
58
|
+
const wakeHandler = Actor.toWakeHandler(wake);
|
|
59
|
+
const actionHandlers = yield* wakeHandler(wakeOptions);
|
|
60
|
+
|
|
61
|
+
assert.strictEqual(wakeOptions.rawRivetkitContext, rawRivetkitContext);
|
|
62
|
+
assert.strictEqual(yield* actionHandlers.GetKey(), "room/1");
|
|
63
|
+
}),
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
it.effect("passes actor state through wake options", () =>
|
|
67
|
+
Effect.gen(function* () {
|
|
68
|
+
const cell = { value: { count: 1 } };
|
|
69
|
+
const state = yield* State.make(
|
|
70
|
+
() => Effect.sync(() => cell.value),
|
|
71
|
+
(value: { readonly count: number }) =>
|
|
72
|
+
Effect.sync(() => {
|
|
73
|
+
cell.value = value;
|
|
74
|
+
}),
|
|
75
|
+
);
|
|
76
|
+
type StatefulWakeOptions = Actor.WakeOptions & {
|
|
77
|
+
readonly state: State.State<
|
|
78
|
+
{ readonly count: number },
|
|
79
|
+
never,
|
|
80
|
+
never
|
|
81
|
+
>;
|
|
82
|
+
};
|
|
83
|
+
const wakeOptions: StatefulWakeOptions = {
|
|
84
|
+
rawRivetkitContext:
|
|
85
|
+
{} as Rivetkit.WakeContextOf<Rivetkit.AnyActorDefinition>,
|
|
86
|
+
state,
|
|
87
|
+
};
|
|
88
|
+
const wake = (wakeOptions: StatefulWakeOptions) => ({
|
|
89
|
+
GetCount: () => State.get(wakeOptions.state),
|
|
90
|
+
SetCount: (count: number) =>
|
|
91
|
+
State.set(wakeOptions.state, { count }),
|
|
92
|
+
});
|
|
93
|
+
const wakeHandler = Actor.toWakeHandler(wake);
|
|
94
|
+
const actionHandlers = yield* wakeHandler(wakeOptions);
|
|
95
|
+
|
|
96
|
+
assert.deepStrictEqual(yield* actionHandlers.GetCount(), {
|
|
97
|
+
count: 1,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
yield* actionHandlers.SetCount(7);
|
|
101
|
+
assert.deepStrictEqual(cell.value, { count: 7 });
|
|
102
|
+
}),
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
it.effect("flattens a wake function returning an Effect", () =>
|
|
106
|
+
Effect.gen(function* () {
|
|
107
|
+
const wakeOptions: Actor.WakeOptions = {
|
|
108
|
+
rawRivetkitContext: {
|
|
109
|
+
key: ["room", "2"],
|
|
110
|
+
} as Rivetkit.WakeContextOf<Rivetkit.AnyActorDefinition>,
|
|
111
|
+
};
|
|
112
|
+
const wake = (options: Actor.WakeOptions) =>
|
|
113
|
+
Effect.gen(function* () {
|
|
114
|
+
const prefix = yield* Prefix;
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
GetKey: () =>
|
|
118
|
+
Effect.succeed(
|
|
119
|
+
`${prefix.value}:${options.rawRivetkitContext.key.join("/")}`,
|
|
120
|
+
),
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
const wakeHandler = Actor.toWakeHandler(wake);
|
|
124
|
+
const actionHandlers = yield* wakeHandler(wakeOptions);
|
|
125
|
+
|
|
126
|
+
assert.strictEqual(yield* actionHandlers.GetKey(), "svc:room/2");
|
|
127
|
+
}).pipe(Effect.provide(PrefixLive)),
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
it.effect("runs an Effect that resolves to a wake function", () =>
|
|
131
|
+
Effect.gen(function* () {
|
|
132
|
+
const wakeOptions: Actor.WakeOptions = {
|
|
133
|
+
rawRivetkitContext: {
|
|
134
|
+
actorId: "actor-1",
|
|
135
|
+
} as Rivetkit.WakeContextOf<Rivetkit.AnyActorDefinition>,
|
|
136
|
+
};
|
|
137
|
+
const wake = Effect.gen(function* () {
|
|
138
|
+
const prefix = yield* Prefix;
|
|
139
|
+
|
|
140
|
+
return (options: Actor.WakeOptions) =>
|
|
141
|
+
Effect.succeed({
|
|
142
|
+
GetActorId: () =>
|
|
143
|
+
Effect.succeed(
|
|
144
|
+
`${prefix.value}:${options.rawRivetkitContext.actorId}`,
|
|
145
|
+
),
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
const wakeHandler = Actor.toWakeHandler(wake);
|
|
149
|
+
const actionHandlers = yield* wakeHandler(wakeOptions);
|
|
150
|
+
|
|
151
|
+
assert.strictEqual(
|
|
152
|
+
yield* actionHandlers.GetActorId(),
|
|
153
|
+
"svc:actor-1",
|
|
154
|
+
);
|
|
155
|
+
}).pipe(Effect.provide(PrefixLive)),
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
it.effect("accepts an Effect.fn wake function", () =>
|
|
159
|
+
Effect.gen(function* () {
|
|
160
|
+
const wakeOptions: Actor.WakeOptions = {
|
|
161
|
+
rawRivetkitContext: {
|
|
162
|
+
key: ["effect", "fn"],
|
|
163
|
+
} as Rivetkit.WakeContextOf<Rivetkit.AnyActorDefinition>,
|
|
164
|
+
};
|
|
165
|
+
const wake = Effect.fn("wake")(function* (
|
|
166
|
+
options: Actor.WakeOptions,
|
|
167
|
+
) {
|
|
168
|
+
const prefix = yield* Prefix;
|
|
169
|
+
|
|
170
|
+
return {
|
|
171
|
+
GetKey: () =>
|
|
172
|
+
Effect.succeed(
|
|
173
|
+
`${prefix.value}:${options.rawRivetkitContext.key.join("/")}`,
|
|
174
|
+
),
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
const wakeHandler = Actor.toWakeHandler(wake);
|
|
178
|
+
const actionHandlers = yield* wakeHandler(wakeOptions);
|
|
179
|
+
|
|
180
|
+
assert.strictEqual(yield* actionHandlers.GetKey(), "svc:effect/fn");
|
|
181
|
+
}).pipe(Effect.provide(PrefixLive)),
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
it.effect(
|
|
185
|
+
"defers wake functions until the returned handler is invoked",
|
|
186
|
+
() =>
|
|
187
|
+
Effect.gen(function* () {
|
|
188
|
+
let calls = 0;
|
|
189
|
+
const wake = () => {
|
|
190
|
+
calls++;
|
|
191
|
+
return { Count: () => Effect.succeed(calls) };
|
|
192
|
+
};
|
|
193
|
+
const wakeHandler = Actor.toWakeHandler(wake);
|
|
194
|
+
|
|
195
|
+
assert.strictEqual(calls, 0);
|
|
196
|
+
|
|
197
|
+
const first = yield* wakeHandler({} as Actor.WakeOptions);
|
|
198
|
+
assert.strictEqual(calls, 1);
|
|
199
|
+
assert.strictEqual(yield* first.Count(), 1);
|
|
200
|
+
|
|
201
|
+
const second = yield* wakeHandler({} as Actor.WakeOptions);
|
|
202
|
+
assert.strictEqual(calls, 2);
|
|
203
|
+
assert.strictEqual(yield* second.Count(), 2);
|
|
204
|
+
}),
|
|
205
|
+
);
|
|
206
|
+
});
|