@rivetkit/effect 0.0.0-codex-rivetkit-cli-preview.5e414a8
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,12 @@
|
|
|
1
|
+
import type { Schema } from "effect";
|
|
2
|
+
export interface StateOptions<in out S extends Schema.Top> {
|
|
3
|
+
readonly schema: S;
|
|
4
|
+
readonly initialValue: () => S["Type"];
|
|
5
|
+
}
|
|
6
|
+
export interface Any {
|
|
7
|
+
readonly schema: Schema.Top;
|
|
8
|
+
readonly initialValue: () => unknown;
|
|
9
|
+
}
|
|
10
|
+
export type Encoded<State extends Any> = State["schema"]["Encoded"] | ([State] extends [never] ? undefined : never);
|
|
11
|
+
export type Decoded<State extends Any> = State["schema"]["Type"];
|
|
12
|
+
//# sourceMappingURL=StateOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateOptions.d.ts","sourceRoot":"","sources":["../../src/internal/StateOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,MAAM,WAAW,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG;IACxD,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,GAAG;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC;CACrC;AAED,MAAM,MAAM,OAAO,CAAC,KAAK,SAAS,GAAG,IAClC,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAC1B,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC;AAEjD,MAAM,MAAM,OAAO,CAAC,KAAK,SAAS,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateOptions.js","sourceRoot":"","sources":["../../src/internal/StateOptions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Context, Effect, Logger as EffectLogger, type LogLevel } from "effect";
|
|
2
|
+
import type * as Rivetkit from "rivetkit";
|
|
3
|
+
import { type Logger as PinoLogger, type LogLevel as PinoLogLevel } from "rivetkit/log";
|
|
4
|
+
type ActorLogContext = {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly key: Rivetkit.ActorKey;
|
|
7
|
+
readonly actorId: string;
|
|
8
|
+
};
|
|
9
|
+
declare const BaseLogger_base: Context.ServiceClass<BaseLogger, "@rivetkit/effect/Logger/BaseLogger", PinoLogger>;
|
|
10
|
+
export declare class BaseLogger extends BaseLogger_base {
|
|
11
|
+
}
|
|
12
|
+
export declare const toPinoLevel: (logLevel: LogLevel.LogLevel) => PinoLogLevel;
|
|
13
|
+
export declare const makeDefaultBaseLogger: Effect.Effect<PinoLogger>;
|
|
14
|
+
export declare const getOrCreateBaseLogger: Effect.Effect<PinoLogger>;
|
|
15
|
+
export declare function makeActorLogAnnotations(context: ActorLogContext): {
|
|
16
|
+
readonly actor: string;
|
|
17
|
+
readonly key: string;
|
|
18
|
+
readonly actorId: string;
|
|
19
|
+
};
|
|
20
|
+
export declare function serializeActorKey(key: Rivetkit.ActorKey): string;
|
|
21
|
+
export declare function makeEffectLogger(baseLogger: PinoLogger): EffectLogger.Logger<unknown, void>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/internal/logging.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,OAAO,EACP,MAAM,EACN,MAAM,IAAI,YAAY,EACtB,KAAK,QAAQ,EAEb,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,KAAK,QAAQ,MAAM,UAAU,CAAC;AAC1C,OAAO,EAGN,KAAK,MAAM,IAAI,UAAU,EACzB,KAAK,QAAQ,IAAI,YAAY,EAC7B,MAAM,cAAc,CAAC;AAKtB,KAAK,eAAe,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB,CAAC;;AAEF,qBAAa,UAAW,SAAQ,eAE/B;CAAG;AAaJ,eAAO,MAAM,WAAW,GAAI,UAAU,QAAQ,CAAC,QAAQ,KAAG,YACzB,CAAC;AA4BlC,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAoB3D,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAS3D,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG;IAClE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB,CAMA;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAgBhE;AAmED,wBAAgB,gBAAgB,CAC/B,UAAU,EAAE,UAAU,GACpB,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAoCpC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { Cause, Config, Context, Effect, Logger as EffectLogger, References, } from "effect";
|
|
2
|
+
import { configureDefaultLogger, getBaseLogger, } from "rivetkit/log";
|
|
3
|
+
const EMPTY_KEY = "/";
|
|
4
|
+
const KEY_SEPARATOR = "/";
|
|
5
|
+
export class BaseLogger extends Context.Service()("@rivetkit/effect/Logger/BaseLogger") {
|
|
6
|
+
}
|
|
7
|
+
const PinoLevelByEffectLevel = {
|
|
8
|
+
All: "trace",
|
|
9
|
+
Trace: "trace",
|
|
10
|
+
Debug: "debug",
|
|
11
|
+
Info: "info",
|
|
12
|
+
Warn: "warn",
|
|
13
|
+
Error: "error",
|
|
14
|
+
Fatal: "fatal",
|
|
15
|
+
None: "silent",
|
|
16
|
+
};
|
|
17
|
+
export const toPinoLevel = (logLevel) => PinoLevelByEffectLevel[logLevel];
|
|
18
|
+
const EffectLevelByPinoLevel = {
|
|
19
|
+
trace: "Trace",
|
|
20
|
+
debug: "Debug",
|
|
21
|
+
info: "Info",
|
|
22
|
+
warn: "Warn",
|
|
23
|
+
error: "Error",
|
|
24
|
+
fatal: "Fatal",
|
|
25
|
+
silent: "None",
|
|
26
|
+
};
|
|
27
|
+
const pinoLogLevelFromEnv = Config.string("RIVET_LOG_LEVEL").pipe(Config.map((value) => {
|
|
28
|
+
const pinoLevel = value.toLowerCase();
|
|
29
|
+
if (pinoLevel in EffectLevelByPinoLevel) {
|
|
30
|
+
return EffectLevelByPinoLevel[pinoLevel];
|
|
31
|
+
}
|
|
32
|
+
return "Info";
|
|
33
|
+
}));
|
|
34
|
+
const logLevelFromEnv = Config.logLevel("RIVET_LOG_LEVEL").pipe(Config.orElse(() => pinoLogLevelFromEnv), Effect.option);
|
|
35
|
+
export const makeDefaultBaseLogger = Effect.gen(function* () {
|
|
36
|
+
const context = yield* Effect.context();
|
|
37
|
+
const providedMinimumLogLevel = Context.getOrUndefined(context, References.MinimumLogLevel);
|
|
38
|
+
const envLogLevel = yield* logLevelFromEnv;
|
|
39
|
+
const logLevel = providedMinimumLogLevel !== undefined
|
|
40
|
+
? providedMinimumLogLevel
|
|
41
|
+
: envLogLevel._tag === "Some"
|
|
42
|
+
? envLogLevel.value
|
|
43
|
+
: yield* References.MinimumLogLevel;
|
|
44
|
+
return yield* Effect.sync(() => {
|
|
45
|
+
configureDefaultLogger(toPinoLevel(logLevel));
|
|
46
|
+
return getBaseLogger();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
export const getOrCreateBaseLogger = Effect.gen(function* () {
|
|
50
|
+
const provided = yield* Effect.serviceOption(BaseLogger);
|
|
51
|
+
if (provided._tag === "Some") {
|
|
52
|
+
return provided.value;
|
|
53
|
+
}
|
|
54
|
+
return yield* makeDefaultBaseLogger;
|
|
55
|
+
});
|
|
56
|
+
export function makeActorLogAnnotations(context) {
|
|
57
|
+
return {
|
|
58
|
+
actor: context.name,
|
|
59
|
+
key: serializeActorKey(context.key),
|
|
60
|
+
actorId: context.actorId,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function serializeActorKey(key) {
|
|
64
|
+
if (key.length === 0) {
|
|
65
|
+
return EMPTY_KEY;
|
|
66
|
+
}
|
|
67
|
+
return key
|
|
68
|
+
.map((part) => {
|
|
69
|
+
if (part === "") {
|
|
70
|
+
return "\\0";
|
|
71
|
+
}
|
|
72
|
+
return part
|
|
73
|
+
.replace(/\\/g, "\\\\")
|
|
74
|
+
.replace(/\//g, `\\${KEY_SEPARATOR}`);
|
|
75
|
+
})
|
|
76
|
+
.join(KEY_SEPARATOR);
|
|
77
|
+
}
|
|
78
|
+
function structuredValue(value) {
|
|
79
|
+
if (value instanceof Error) {
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
function extractMessageAndFields(message) {
|
|
85
|
+
const values = Array.isArray(message) ? message : [message];
|
|
86
|
+
if (values.length === 0) {
|
|
87
|
+
return { msg: undefined, fields: {} };
|
|
88
|
+
}
|
|
89
|
+
const [first, ...rest] = values;
|
|
90
|
+
const fields = {};
|
|
91
|
+
let msg;
|
|
92
|
+
if (first instanceof Error) {
|
|
93
|
+
fields.error = first;
|
|
94
|
+
msg = first.message;
|
|
95
|
+
}
|
|
96
|
+
else if (first !== null && typeof first === "object") {
|
|
97
|
+
const firstFields = first;
|
|
98
|
+
for (const [key, value] of Object.entries(firstFields)) {
|
|
99
|
+
if (key === "msg") {
|
|
100
|
+
if (value !== undefined) {
|
|
101
|
+
msg = String(value);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
fields[key] = structuredValue(value);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else if (first !== undefined) {
|
|
110
|
+
msg = String(first);
|
|
111
|
+
}
|
|
112
|
+
const args = [];
|
|
113
|
+
for (const value of rest) {
|
|
114
|
+
if (value instanceof Error) {
|
|
115
|
+
fields.error = value;
|
|
116
|
+
}
|
|
117
|
+
else if (value !== null &&
|
|
118
|
+
typeof value === "object" &&
|
|
119
|
+
!Array.isArray(value)) {
|
|
120
|
+
for (const [key, fieldValue] of Object.entries(value)) {
|
|
121
|
+
fields[key] = structuredValue(fieldValue);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
args.push(value);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (args.length > 0) {
|
|
129
|
+
fields.args = args;
|
|
130
|
+
}
|
|
131
|
+
return { msg, fields };
|
|
132
|
+
}
|
|
133
|
+
export function makeEffectLogger(baseLogger) {
|
|
134
|
+
return EffectLogger.make(({ cause, date, fiber, logLevel, message }) => {
|
|
135
|
+
const { msg, fields } = extractMessageAndFields(message);
|
|
136
|
+
for (const [key, value] of Object.entries(fiber.getRef(References.CurrentLogAnnotations))) {
|
|
137
|
+
fields[key] = structuredValue(value);
|
|
138
|
+
}
|
|
139
|
+
const spans = {};
|
|
140
|
+
for (const [label, startTime] of fiber.getRef(References.CurrentLogSpans)) {
|
|
141
|
+
spans[label] = date.getTime() - startTime;
|
|
142
|
+
}
|
|
143
|
+
if (Object.keys(spans).length > 0) {
|
|
144
|
+
fields.spans = spans;
|
|
145
|
+
}
|
|
146
|
+
if (cause.reasons.length > 0) {
|
|
147
|
+
fields.cause = Cause.pretty(cause);
|
|
148
|
+
}
|
|
149
|
+
const pinoLevel = toPinoLevel(logLevel);
|
|
150
|
+
if (pinoLevel === "silent") {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const logger = baseLogger[pinoLevel];
|
|
154
|
+
if (msg === undefined) {
|
|
155
|
+
logger.call(baseLogger, fields);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
logger.call(baseLogger, fields, msg);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/internal/logging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identifies the SDK as the RPC system on action spans. Stamped onto
|
|
3
|
+
* the `rpc.system.name` OTel attribute.
|
|
4
|
+
*/
|
|
5
|
+
export declare const rpcSystem = "rivet.actors";
|
|
6
|
+
/**
|
|
7
|
+
* Cross-wire trace metadata. Carries just enough of an `Effect.Tracer`
|
|
8
|
+
* span to reconstitute it on the server as a `Tracer.externalSpan`
|
|
9
|
+
* parent for the handler's span.
|
|
10
|
+
*/
|
|
11
|
+
export interface TraceMeta {
|
|
12
|
+
readonly traceId: string;
|
|
13
|
+
readonly spanId: string;
|
|
14
|
+
readonly sampled: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Pull a valid `TraceMeta` out of the wire `ActionMeta` envelope, or
|
|
18
|
+
* `undefined` if the caller didn't ship one (or shipped something
|
|
19
|
+
* malformed). Kept lenient because the meta envelope is forward-
|
|
20
|
+
* extensible — future fields shouldn't break trace extraction.
|
|
21
|
+
*/
|
|
22
|
+
export declare const readTraceMeta: (meta: unknown) => TraceMeta | undefined;
|
|
23
|
+
//# sourceMappingURL=tracing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/internal/tracing.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,OAAO,KAAG,SAAS,GAAG,SAgBzD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Predicate } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* Identifies the SDK as the RPC system on action spans. Stamped onto
|
|
4
|
+
* the `rpc.system.name` OTel attribute.
|
|
5
|
+
*/
|
|
6
|
+
export const rpcSystem = "rivet.actors";
|
|
7
|
+
/**
|
|
8
|
+
* Pull a valid `TraceMeta` out of the wire `ActionMeta` envelope, or
|
|
9
|
+
* `undefined` if the caller didn't ship one (or shipped something
|
|
10
|
+
* malformed). Kept lenient because the meta envelope is forward-
|
|
11
|
+
* extensible — future fields shouldn't break trace extraction.
|
|
12
|
+
*/
|
|
13
|
+
export const readTraceMeta = (meta) => {
|
|
14
|
+
if (!Predicate.isObject(meta))
|
|
15
|
+
return undefined;
|
|
16
|
+
const trace = meta.trace;
|
|
17
|
+
if (!Predicate.isObject(trace))
|
|
18
|
+
return undefined;
|
|
19
|
+
if (!Predicate.isString(trace.traceId) ||
|
|
20
|
+
!Predicate.isString(trace.spanId) ||
|
|
21
|
+
!Predicate.isBoolean(trace.sampled)) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
traceId: trace.traceId,
|
|
26
|
+
spanId: trace.spanId,
|
|
27
|
+
sampled: trace.sampled,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=tracing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/internal/tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,cAAc,CAAC;AAaxC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAa,EAAyB,EAAE;IACrE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,IACC,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;QAClC,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QACjC,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAClC,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO;QACN,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;KACtB,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Predicate } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* Refinement that narrows `unknown` to an object with `key` set to a
|
|
4
|
+
* `string`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const hasStringProperty: <K extends PropertyKey>(key: K) => Predicate.Refinement<unknown, { readonly [P in K]: string; }>;
|
|
7
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,CAAC,SAAS,WAAW,EACrB,KAAK,CAAC,KACJ,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,MAAM,GAAE,CAEF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Predicate } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* Refinement that narrows `unknown` to an object with `key` set to a
|
|
4
|
+
* `string`.
|
|
5
|
+
*/
|
|
6
|
+
export const hasStringProperty = (key) => (u) => Predicate.hasProperty(u, key) && Predicate.isString(u[key]);
|
|
7
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAC7B,CACC,GAAM,EACyD,EAAE,CAClE,CAAC,CAAC,EAAsC,EAAE,CACzC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC"}
|
package/dist/mod.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * as Action from "./Action.ts";
|
|
2
|
+
export * as Actor from "./Actor.ts";
|
|
3
|
+
export * as Client from "./Client.ts";
|
|
4
|
+
export * as Logger from "./Logger.ts";
|
|
5
|
+
export * as Registry from "./Registry.ts";
|
|
6
|
+
export * as RivetError from "./RivetError.ts";
|
|
7
|
+
export * as State from "./State.ts";
|
|
8
|
+
//# sourceMappingURL=mod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC"}
|
package/dist/mod.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * as Action from "./Action.js";
|
|
2
|
+
export * as Actor from "./Actor.js";
|
|
3
|
+
export * as Client from "./Client.js";
|
|
4
|
+
export * as Logger from "./Logger.js";
|
|
5
|
+
export * as Registry from "./Registry.js";
|
|
6
|
+
export * as RivetError from "./RivetError.js";
|
|
7
|
+
export * as State from "./State.js";
|
|
8
|
+
//# sourceMappingURL=mod.js.map
|
package/dist/mod.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rivetkit/effect",
|
|
3
|
+
"version": "0.0.0-codex-rivetkit-cli-preview.5e414a8",
|
|
4
|
+
"description": "Effect SDK for Rivet Actors",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"files": [
|
|
9
|
+
"src/**/*.ts",
|
|
10
|
+
"dist/**/*.js",
|
|
11
|
+
"dist/**/*.js.map",
|
|
12
|
+
"dist/**/*.d.ts",
|
|
13
|
+
"dist/**/*.d.ts.map"
|
|
14
|
+
],
|
|
15
|
+
"exports": {
|
|
16
|
+
".": "./src/mod.ts"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": "./dist/mod.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc -p tsconfig.build.json",
|
|
26
|
+
"check-types": "tsc --noEmit",
|
|
27
|
+
"lint:publint": "publint --strict",
|
|
28
|
+
"lint:attw": "attw --pack . --profile esm-only",
|
|
29
|
+
"test": "vitest --typecheck",
|
|
30
|
+
"coverage": "vitest run --coverage"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"effect": "^4.0.0-beta.66",
|
|
34
|
+
"rivetkit": "0.0.0-codex-rivetkit-cli-preview.5e414a8"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@arethetypeswrong/cli": "^0.18.3",
|
|
38
|
+
"@effect/language-service": "^0.85.1",
|
|
39
|
+
"@effect/vitest": "^4.0.0-beta.66",
|
|
40
|
+
"@types/node": "^22.18.1",
|
|
41
|
+
"@vitest/coverage-v8": "^4.1.7",
|
|
42
|
+
"publint": "^0.3.21",
|
|
43
|
+
"typescript": "^5.9.2",
|
|
44
|
+
"vitest": "^4.1.5"
|
|
45
|
+
}
|
|
46
|
+
}
|
package/src/Action.ts
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { type Effect, Predicate, Schema } from "effect";
|
|
2
|
+
|
|
3
|
+
const TypeId = "~@rivetkit/effect/Action";
|
|
4
|
+
|
|
5
|
+
export const isAction = (u: unknown): u is Action<any, any, any, any> =>
|
|
6
|
+
Predicate.hasProperty(u, TypeId);
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A value-level definition for a non-durable, request-response call.
|
|
10
|
+
*/
|
|
11
|
+
export interface Action<
|
|
12
|
+
Tag extends string,
|
|
13
|
+
Payload extends Schema.Top = Schema.Void,
|
|
14
|
+
Success extends Schema.Top = Schema.Void,
|
|
15
|
+
Error extends Schema.Top = Schema.Never,
|
|
16
|
+
> {
|
|
17
|
+
readonly [TypeId]: typeof TypeId;
|
|
18
|
+
readonly _tag: Tag;
|
|
19
|
+
readonly key: string;
|
|
20
|
+
/**
|
|
21
|
+
* Raw RivetKit clients omit the argument for no-payload actions, so
|
|
22
|
+
* the actor wrapper uses this to adapt only those calls to the Effect
|
|
23
|
+
* JSON Void codec's null representation.
|
|
24
|
+
*/
|
|
25
|
+
readonly hasPayload: boolean;
|
|
26
|
+
readonly payloadSchema: Payload;
|
|
27
|
+
readonly successSchema: Success;
|
|
28
|
+
readonly errorSchema: Error;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Type-erased view of any `Action`. Useful for collections of actions
|
|
33
|
+
* where the specific schemas don't matter.
|
|
34
|
+
*/
|
|
35
|
+
export interface Any {
|
|
36
|
+
readonly [TypeId]: typeof TypeId;
|
|
37
|
+
readonly _tag: string;
|
|
38
|
+
readonly key: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Like `Any`, but with the prop fields (`*Schema`) accessible. Used
|
|
43
|
+
* by internal builders that need to read schemas off an action.
|
|
44
|
+
*/
|
|
45
|
+
export interface AnyWithProps {
|
|
46
|
+
readonly [TypeId]: typeof TypeId;
|
|
47
|
+
readonly _tag: string;
|
|
48
|
+
readonly key: string;
|
|
49
|
+
readonly hasPayload: boolean;
|
|
50
|
+
readonly payloadSchema: Schema.Top;
|
|
51
|
+
readonly successSchema: Schema.Top;
|
|
52
|
+
readonly errorSchema: Schema.Top;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// --- Type helpers ---------------------------------------------------
|
|
56
|
+
|
|
57
|
+
export type Tag<R> =
|
|
58
|
+
R extends Action<infer _Tag, infer _Payload, infer _Success, infer _Error>
|
|
59
|
+
? _Tag
|
|
60
|
+
: never;
|
|
61
|
+
|
|
62
|
+
export type PayloadSchema<R> =
|
|
63
|
+
R extends Action<infer _Tag, infer _Payload, infer _Success, infer _Error>
|
|
64
|
+
? _Payload
|
|
65
|
+
: never;
|
|
66
|
+
|
|
67
|
+
export type Payload<R> = PayloadSchema<R>["Type"];
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The shape accepted by the payload schema's `make` constructor on the
|
|
71
|
+
* client side (i.e. before encoding). Useful for typing the call site.
|
|
72
|
+
*/
|
|
73
|
+
export type PayloadConstructor<R> =
|
|
74
|
+
R extends Action<infer _Tag, infer _Payload, infer _Success, infer _Error>
|
|
75
|
+
? _Payload["~type.make.in"]
|
|
76
|
+
: never;
|
|
77
|
+
|
|
78
|
+
export type SuccessSchema<R> =
|
|
79
|
+
R extends Action<infer _Tag, infer _Payload, infer _Success, infer _Error>
|
|
80
|
+
? _Success
|
|
81
|
+
: never;
|
|
82
|
+
|
|
83
|
+
export type Success<R> = SuccessSchema<R>["Type"];
|
|
84
|
+
|
|
85
|
+
export type ErrorSchema<R> =
|
|
86
|
+
R extends Action<infer _Tag, infer _Payload, infer _Success, infer _Error>
|
|
87
|
+
? _Error
|
|
88
|
+
: never;
|
|
89
|
+
|
|
90
|
+
export type Error<R> = ErrorSchema<R>["Type"];
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The full set of decoding/encoding services required by every schema
|
|
94
|
+
* referenced by the action. Code generators include this in the `R`
|
|
95
|
+
* channel of any effect that handles or invokes the action.
|
|
96
|
+
*/
|
|
97
|
+
export type Services<R> =
|
|
98
|
+
R extends Action<infer _Tag, infer _Payload, infer _Success, infer _Error>
|
|
99
|
+
?
|
|
100
|
+
| _Payload["DecodingServices"]
|
|
101
|
+
| _Payload["EncodingServices"]
|
|
102
|
+
| _Success["DecodingServices"]
|
|
103
|
+
| _Success["EncodingServices"]
|
|
104
|
+
| _Error["DecodingServices"]
|
|
105
|
+
| _Error["EncodingServices"]
|
|
106
|
+
: never;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* The subset of `Services` actually needed on the client side: encoding
|
|
110
|
+
* the payload, decoding the success response, decoding the error.
|
|
111
|
+
*/
|
|
112
|
+
export type ServicesClient<R> =
|
|
113
|
+
R extends Action<infer _Tag, infer _Payload, infer _Success, infer _Error>
|
|
114
|
+
?
|
|
115
|
+
| _Payload["EncodingServices"]
|
|
116
|
+
| _Success["DecodingServices"]
|
|
117
|
+
| _Error["DecodingServices"]
|
|
118
|
+
: never;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* The subset of `Services` needed on the server side: decoding the
|
|
122
|
+
* payload, encoding the success response, encoding the error.
|
|
123
|
+
*/
|
|
124
|
+
export type ServicesServer<R> =
|
|
125
|
+
R extends Action<infer _Tag, infer _Payload, infer _Success, infer _Error>
|
|
126
|
+
?
|
|
127
|
+
| _Payload["DecodingServices"]
|
|
128
|
+
| _Success["EncodingServices"]
|
|
129
|
+
| _Error["EncodingServices"]
|
|
130
|
+
: never;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Extract the action with the matching tag from a union of actions.
|
|
134
|
+
*/
|
|
135
|
+
export type ExtractTag<R extends Any, Tag extends string> = R extends {
|
|
136
|
+
readonly _tag: Tag;
|
|
137
|
+
}
|
|
138
|
+
? R
|
|
139
|
+
: never;
|
|
140
|
+
|
|
141
|
+
export type ResultFrom<R extends Any, Services> = R extends Action<
|
|
142
|
+
infer _Tag,
|
|
143
|
+
infer _Payload,
|
|
144
|
+
infer _Success,
|
|
145
|
+
infer _Error
|
|
146
|
+
>
|
|
147
|
+
? Effect.Effect<_Success["Type"], _Error["Type"], Services>
|
|
148
|
+
: never;
|
|
149
|
+
|
|
150
|
+
// --- Implementation -------------------------------------------------
|
|
151
|
+
|
|
152
|
+
const Proto = {
|
|
153
|
+
[TypeId]: TypeId,
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const makeProto = <
|
|
157
|
+
const Tag extends string,
|
|
158
|
+
Payload extends Schema.Top,
|
|
159
|
+
Success extends Schema.Top,
|
|
160
|
+
Error extends Schema.Top,
|
|
161
|
+
>(options: {
|
|
162
|
+
readonly _tag: Tag;
|
|
163
|
+
readonly hasPayload: boolean;
|
|
164
|
+
readonly payloadSchema: Payload;
|
|
165
|
+
readonly successSchema: Success;
|
|
166
|
+
readonly errorSchema: Error;
|
|
167
|
+
}): Action<Tag, Payload, Success, Error> => {
|
|
168
|
+
const self = Object.assign(Object.create(Proto), options);
|
|
169
|
+
self.key = `@rivetkit/effect/Action/${options._tag}`;
|
|
170
|
+
return self;
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Define a Rivet Actor action.
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* ```ts
|
|
178
|
+
* import { Schema } from "effect"
|
|
179
|
+
* import { Action } from "@rivetkit/effect"
|
|
180
|
+
*
|
|
181
|
+
* class CounterOverflow extends Schema.TaggedErrorClass<CounterOverflow>()(
|
|
182
|
+
* "CounterOverflow",
|
|
183
|
+
* { limit: Schema.Number },
|
|
184
|
+
* ) {}
|
|
185
|
+
*
|
|
186
|
+
* export const Increment = Action.make("Increment", {
|
|
187
|
+
* payload: { amount: Schema.Number },
|
|
188
|
+
* success: Schema.Number,
|
|
189
|
+
* error: CounterOverflow,
|
|
190
|
+
* })
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
export const make = <
|
|
194
|
+
const Tag extends string,
|
|
195
|
+
Payload extends Schema.Top | Schema.Struct.Fields = Schema.Void,
|
|
196
|
+
Success extends Schema.Top = Schema.Void,
|
|
197
|
+
Error extends Schema.Top = Schema.Never,
|
|
198
|
+
>(
|
|
199
|
+
tag: Tag,
|
|
200
|
+
options?: {
|
|
201
|
+
readonly payload?: Payload;
|
|
202
|
+
readonly success?: Success;
|
|
203
|
+
readonly error?: Error;
|
|
204
|
+
},
|
|
205
|
+
): Action<
|
|
206
|
+
Tag,
|
|
207
|
+
Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload,
|
|
208
|
+
Success,
|
|
209
|
+
Error
|
|
210
|
+
> => {
|
|
211
|
+
const successSchema = options?.success ?? Schema.Void;
|
|
212
|
+
const errorSchema = options?.error ?? Schema.Never;
|
|
213
|
+
const hasPayload = options?.payload !== undefined;
|
|
214
|
+
const payloadSchema: Schema.Top = Schema.isSchema(options?.payload)
|
|
215
|
+
? (options?.payload as any)
|
|
216
|
+
: options?.payload
|
|
217
|
+
? Schema.Struct(options?.payload as any)
|
|
218
|
+
: Schema.Void;
|
|
219
|
+
return makeProto({
|
|
220
|
+
_tag: tag,
|
|
221
|
+
hasPayload,
|
|
222
|
+
payloadSchema,
|
|
223
|
+
successSchema,
|
|
224
|
+
errorSchema,
|
|
225
|
+
}) as Action<
|
|
226
|
+
Tag,
|
|
227
|
+
Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload,
|
|
228
|
+
Success,
|
|
229
|
+
Error
|
|
230
|
+
>;
|
|
231
|
+
};
|