rivetkit 2.0.3 → 2.0.4
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/README.md +11 -0
- package/dist/schemas/actor-persist/v1.ts +21 -24
- package/dist/schemas/client-protocol/v1.ts +6 -0
- package/dist/tsup/actor/errors.cjs +10 -2
- package/dist/tsup/actor/errors.cjs.map +1 -1
- package/dist/tsup/actor/errors.d.cts +17 -4
- package/dist/tsup/actor/errors.d.ts +17 -4
- package/dist/tsup/actor/errors.js +11 -3
- package/dist/tsup/{chunk-6PDXBYI5.js → chunk-3F2YSRJL.js} +8 -23
- package/dist/tsup/chunk-3F2YSRJL.js.map +1 -0
- package/dist/tsup/chunk-4CXBCT26.cjs +250 -0
- package/dist/tsup/chunk-4CXBCT26.cjs.map +1 -0
- package/dist/tsup/chunk-4R73YDN3.cjs +20 -0
- package/dist/tsup/chunk-4R73YDN3.cjs.map +1 -0
- package/dist/tsup/{chunk-OGAPU3UG.cjs → chunk-6LJT3QRL.cjs} +39 -25
- package/dist/tsup/chunk-6LJT3QRL.cjs.map +1 -0
- package/dist/tsup/{chunk-6WKQDDUD.cjs → chunk-GICQ3YCU.cjs} +143 -141
- package/dist/tsup/chunk-GICQ3YCU.cjs.map +1 -0
- package/dist/tsup/{chunk-FLMTTN27.js → chunk-H26RP6GD.js} +15 -8
- package/dist/tsup/chunk-H26RP6GD.js.map +1 -0
- package/dist/tsup/chunk-HI3HWJRC.js +20 -0
- package/dist/tsup/chunk-HI3HWJRC.js.map +1 -0
- package/dist/tsup/{chunk-4NSUQZ2H.js → chunk-HLLF4B4Q.js} +116 -114
- package/dist/tsup/chunk-HLLF4B4Q.js.map +1 -0
- package/dist/tsup/{chunk-FCCPJNMA.cjs → chunk-IH6CKNDW.cjs} +12 -27
- package/dist/tsup/chunk-IH6CKNDW.cjs.map +1 -0
- package/dist/tsup/chunk-LV2S3OU3.js +250 -0
- package/dist/tsup/chunk-LV2S3OU3.js.map +1 -0
- package/dist/tsup/{chunk-R2OPSKIV.cjs → chunk-LWNKVZG5.cjs} +20 -13
- package/dist/tsup/chunk-LWNKVZG5.cjs.map +1 -0
- package/dist/tsup/{chunk-INGJP237.js → chunk-NFU2BBT5.js} +102 -43
- package/dist/tsup/chunk-NFU2BBT5.js.map +1 -0
- package/dist/tsup/{chunk-3H7O2A7I.js → chunk-PQY7KKTL.js} +33 -19
- package/dist/tsup/chunk-PQY7KKTL.js.map +1 -0
- package/dist/tsup/{chunk-PO4VLDWA.js → chunk-QK72M5JB.js} +3 -5
- package/dist/tsup/chunk-QK72M5JB.js.map +1 -0
- package/dist/tsup/{chunk-TZJKSBUQ.cjs → chunk-QNNXFOQV.cjs} +3 -5
- package/dist/tsup/chunk-QNNXFOQV.cjs.map +1 -0
- package/dist/tsup/{chunk-GIR3AFFI.cjs → chunk-SBHHJ6QS.cjs} +102 -43
- package/dist/tsup/chunk-SBHHJ6QS.cjs.map +1 -0
- package/dist/tsup/chunk-TQ62L3X7.js +325 -0
- package/dist/tsup/chunk-TQ62L3X7.js.map +1 -0
- package/dist/tsup/chunk-VO7ZRVVD.cjs +6293 -0
- package/dist/tsup/chunk-VO7ZRVVD.cjs.map +1 -0
- package/dist/tsup/chunk-WHBPJNGW.cjs +325 -0
- package/dist/tsup/chunk-WHBPJNGW.cjs.map +1 -0
- package/dist/tsup/chunk-XJQHKJ4P.js +6293 -0
- package/dist/tsup/chunk-XJQHKJ4P.js.map +1 -0
- package/dist/tsup/client/mod.cjs +10 -10
- package/dist/tsup/client/mod.d.cts +7 -13
- package/dist/tsup/client/mod.d.ts +7 -13
- package/dist/tsup/client/mod.js +9 -9
- package/dist/tsup/common/log.cjs +12 -4
- package/dist/tsup/common/log.cjs.map +1 -1
- package/dist/tsup/common/log.d.cts +23 -17
- package/dist/tsup/common/log.d.ts +23 -17
- package/dist/tsup/common/log.js +15 -7
- package/dist/tsup/common/websocket.cjs +5 -5
- package/dist/tsup/common/websocket.js +4 -4
- package/dist/tsup/{common-CpqORuCq.d.cts → common-CXCe7s6i.d.cts} +2 -2
- package/dist/tsup/{common-CpqORuCq.d.ts → common-CXCe7s6i.d.ts} +2 -2
- package/dist/tsup/{connection-BwUMoe6n.d.ts → connection-BI-6UIBJ.d.ts} +196 -226
- package/dist/tsup/{connection-BR_Ve4ku.d.cts → connection-Dyd4NLGW.d.cts} +196 -226
- package/dist/tsup/driver-helpers/mod.cjs +6 -9
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +5 -6
- package/dist/tsup/driver-helpers/mod.d.ts +5 -6
- package/dist/tsup/driver-helpers/mod.js +6 -9
- package/dist/tsup/driver-test-suite/mod.cjs +155 -1363
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +11 -5
- package/dist/tsup/driver-test-suite/mod.d.ts +11 -5
- package/dist/tsup/driver-test-suite/mod.js +876 -2084
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +6 -8
- package/dist/tsup/inspector/mod.cjs.map +1 -1
- package/dist/tsup/inspector/mod.d.cts +3 -3
- package/dist/tsup/inspector/mod.d.ts +3 -3
- package/dist/tsup/inspector/mod.js +8 -10
- package/dist/tsup/mod.cjs +9 -15
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +47 -42
- package/dist/tsup/mod.d.ts +47 -42
- package/dist/tsup/mod.js +10 -16
- package/dist/tsup/{router-endpoints-DAbqVFx2.d.ts → router-endpoints-BTe_Rsdn.d.cts} +2 -3
- package/dist/tsup/{router-endpoints-AYkXG8Tl.d.cts → router-endpoints-CBSrKHmo.d.ts} +2 -3
- package/dist/tsup/test/mod.cjs +10 -14
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +4 -5
- package/dist/tsup/test/mod.d.ts +4 -5
- package/dist/tsup/test/mod.js +9 -13
- package/dist/tsup/{utils-CT0cv4jd.d.ts → utils-fwx3o3K9.d.cts} +1 -0
- package/dist/tsup/{utils-CT0cv4jd.d.cts → utils-fwx3o3K9.d.ts} +1 -0
- package/dist/tsup/utils.cjs +3 -3
- package/dist/tsup/utils.d.cts +1 -1
- package/dist/tsup/utils.d.ts +1 -1
- package/dist/tsup/utils.js +2 -2
- package/package.json +4 -4
- package/src/actor/action.ts +1 -5
- package/src/actor/config.ts +27 -295
- package/src/actor/connection.ts +9 -12
- package/src/actor/context.ts +1 -4
- package/src/actor/definition.ts +7 -11
- package/src/actor/errors.ts +97 -35
- package/src/actor/generic-conn-driver.ts +28 -16
- package/src/actor/instance.ts +177 -133
- package/src/actor/log.ts +4 -13
- package/src/actor/mod.ts +0 -5
- package/src/actor/protocol/old.ts +42 -26
- package/src/actor/protocol/serde.ts +1 -1
- package/src/actor/router-endpoints.ts +41 -38
- package/src/actor/router.ts +20 -18
- package/src/actor/unstable-react.ts +1 -1
- package/src/actor/utils.ts +6 -2
- package/src/client/actor-common.ts +1 -1
- package/src/client/actor-conn.ts +152 -91
- package/src/client/actor-handle.ts +85 -25
- package/src/client/actor-query.ts +65 -0
- package/src/client/client.ts +29 -98
- package/src/client/config.ts +44 -0
- package/src/client/errors.ts +1 -0
- package/src/client/log.ts +2 -4
- package/src/client/mod.ts +16 -12
- package/src/client/raw-utils.ts +82 -25
- package/src/client/utils.ts +5 -3
- package/src/common/fake-event-source.ts +10 -9
- package/src/common/inline-websocket-adapter2.ts +39 -30
- package/src/common/log.ts +176 -101
- package/src/common/logfmt.ts +21 -30
- package/src/common/router.ts +12 -19
- package/src/common/utils.ts +27 -13
- package/src/common/websocket.ts +0 -1
- package/src/driver-helpers/mod.ts +1 -1
- package/src/driver-test-suite/log.ts +1 -3
- package/src/driver-test-suite/mod.ts +86 -60
- package/src/driver-test-suite/tests/actor-handle.ts +33 -0
- package/src/driver-test-suite/tests/manager-driver.ts +5 -3
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -226
- package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -392
- package/src/driver-test-suite/tests/request-access.ts +112 -126
- package/src/driver-test-suite/utils.ts +13 -10
- package/src/drivers/default.ts +7 -4
- package/src/drivers/engine/actor-driver.ts +22 -13
- package/src/drivers/engine/config.ts +2 -10
- package/src/drivers/engine/kv.ts +1 -1
- package/src/drivers/engine/log.ts +1 -3
- package/src/drivers/engine/mod.ts +2 -3
- package/src/drivers/file-system/actor.ts +1 -1
- package/src/drivers/file-system/global-state.ts +33 -20
- package/src/drivers/file-system/log.ts +1 -3
- package/src/drivers/file-system/manager.ts +31 -8
- package/src/inspector/config.ts +9 -4
- package/src/inspector/log.ts +1 -1
- package/src/inspector/manager.ts +2 -2
- package/src/inspector/utils.ts +1 -1
- package/src/manager/driver.ts +10 -2
- package/src/manager/hono-websocket-adapter.ts +21 -12
- package/src/manager/log.ts +2 -4
- package/src/manager/mod.ts +1 -1
- package/src/manager/router.ts +277 -1657
- package/src/manager-api/routes/actors-create.ts +16 -0
- package/src/manager-api/routes/actors-delete.ts +4 -0
- package/src/manager-api/routes/actors-get-by-id.ts +7 -0
- package/src/manager-api/routes/actors-get-or-create-by-id.ts +29 -0
- package/src/manager-api/routes/actors-get.ts +7 -0
- package/src/manager-api/routes/common.ts +18 -0
- package/src/mod.ts +0 -2
- package/src/registry/config.ts +1 -1
- package/src/registry/log.ts +2 -4
- package/src/registry/mod.ts +57 -24
- package/src/registry/run-config.ts +31 -33
- package/src/registry/serve.ts +4 -5
- package/src/remote-manager-driver/actor-http-client.ts +72 -0
- package/src/remote-manager-driver/actor-websocket-client.ts +63 -0
- package/src/remote-manager-driver/api-endpoints.ts +79 -0
- package/src/remote-manager-driver/api-utils.ts +43 -0
- package/src/remote-manager-driver/log.ts +5 -0
- package/src/remote-manager-driver/mod.ts +274 -0
- package/src/{drivers/engine → remote-manager-driver}/ws-proxy.ts +24 -14
- package/src/serde.ts +8 -2
- package/src/test/log.ts +1 -3
- package/src/test/mod.ts +17 -16
- package/dist/tsup/chunk-2CRLFV6Z.cjs +0 -202
- package/dist/tsup/chunk-2CRLFV6Z.cjs.map +0 -1
- package/dist/tsup/chunk-3H7O2A7I.js.map +0 -1
- package/dist/tsup/chunk-42I3OZ3Q.js +0 -15
- package/dist/tsup/chunk-42I3OZ3Q.js.map +0 -1
- package/dist/tsup/chunk-4NSUQZ2H.js.map +0 -1
- package/dist/tsup/chunk-6PDXBYI5.js.map +0 -1
- package/dist/tsup/chunk-6WKQDDUD.cjs.map +0 -1
- package/dist/tsup/chunk-CTBOSFUH.cjs +0 -116
- package/dist/tsup/chunk-CTBOSFUH.cjs.map +0 -1
- package/dist/tsup/chunk-EGVZZFE2.js +0 -2857
- package/dist/tsup/chunk-EGVZZFE2.js.map +0 -1
- package/dist/tsup/chunk-FCCPJNMA.cjs.map +0 -1
- package/dist/tsup/chunk-FLMTTN27.js.map +0 -1
- package/dist/tsup/chunk-GIR3AFFI.cjs.map +0 -1
- package/dist/tsup/chunk-INGJP237.js.map +0 -1
- package/dist/tsup/chunk-KJCJLKRM.js +0 -116
- package/dist/tsup/chunk-KJCJLKRM.js.map +0 -1
- package/dist/tsup/chunk-KUPQZYUQ.cjs +0 -15
- package/dist/tsup/chunk-KUPQZYUQ.cjs.map +0 -1
- package/dist/tsup/chunk-O2MBYIXO.cjs +0 -2857
- package/dist/tsup/chunk-O2MBYIXO.cjs.map +0 -1
- package/dist/tsup/chunk-OGAPU3UG.cjs.map +0 -1
- package/dist/tsup/chunk-OV6AYD4S.js +0 -4406
- package/dist/tsup/chunk-OV6AYD4S.js.map +0 -1
- package/dist/tsup/chunk-PO4VLDWA.js.map +0 -1
- package/dist/tsup/chunk-R2OPSKIV.cjs.map +0 -1
- package/dist/tsup/chunk-TZJKSBUQ.cjs.map +0 -1
- package/dist/tsup/chunk-UBUC5C3G.cjs +0 -189
- package/dist/tsup/chunk-UBUC5C3G.cjs.map +0 -1
- package/dist/tsup/chunk-UIM22YJL.cjs +0 -4406
- package/dist/tsup/chunk-UIM22YJL.cjs.map +0 -1
- package/dist/tsup/chunk-URVFQMYI.cjs +0 -230
- package/dist/tsup/chunk-URVFQMYI.cjs.map +0 -1
- package/dist/tsup/chunk-UVUPOS46.js +0 -230
- package/dist/tsup/chunk-UVUPOS46.js.map +0 -1
- package/dist/tsup/chunk-VRRHBNJC.js +0 -189
- package/dist/tsup/chunk-VRRHBNJC.js.map +0 -1
- package/dist/tsup/chunk-XFSS33EQ.js +0 -202
- package/dist/tsup/chunk-XFSS33EQ.js.map +0 -1
- package/src/client/http-client-driver.ts +0 -326
- package/src/driver-test-suite/test-inline-client-driver.ts +0 -402
- package/src/driver-test-suite/tests/actor-auth.ts +0 -591
- package/src/drivers/engine/api-endpoints.ts +0 -128
- package/src/drivers/engine/api-utils.ts +0 -70
- package/src/drivers/engine/manager-driver.ts +0 -391
- package/src/inline-client-driver/log.ts +0 -7
- package/src/inline-client-driver/mod.ts +0 -385
- package/src/manager/auth.ts +0 -121
- /package/src/{drivers/engine → actor}/keys.test.ts +0 -0
- /package/src/{drivers/engine → actor}/keys.ts +0 -0
package/src/common/router.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from "@/actor/router-endpoints";
|
|
8
8
|
import { HttpResponseError } from "@/schemas/client-protocol/mod";
|
|
9
9
|
import { HTTP_RESPONSE_ERROR_VERSIONED } from "@/schemas/client-protocol/versioned";
|
|
10
|
-
import { serializeWithEncoding } from "@/serde";
|
|
10
|
+
import { encodingIsBinary, serializeWithEncoding } from "@/serde";
|
|
11
11
|
import { bufferToArrayBuffer } from "@/utils";
|
|
12
12
|
import { getLogger, type Logger } from "./log";
|
|
13
13
|
import { deconstructError, stringifyError } from "./utils";
|
|
@@ -25,7 +25,8 @@ export function loggerMiddleware(logger: Logger) {
|
|
|
25
25
|
await next();
|
|
26
26
|
|
|
27
27
|
const duration = Date.now() - startTime;
|
|
28
|
-
logger.debug(
|
|
28
|
+
logger.debug({
|
|
29
|
+
msg: "http request",
|
|
29
30
|
method,
|
|
30
31
|
path,
|
|
31
32
|
status: c.res.status,
|
|
@@ -41,19 +42,10 @@ export function handleRouteNotFound(c: HonoContext) {
|
|
|
41
42
|
return c.text("Not Found (RivetKit)", 404);
|
|
42
43
|
}
|
|
43
44
|
|
|
44
|
-
export
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function handleRouteError(
|
|
49
|
-
opts: HandleRouterErrorOpts,
|
|
50
|
-
error: unknown,
|
|
51
|
-
c: HonoContext,
|
|
52
|
-
) {
|
|
53
|
-
const exposeInternalError =
|
|
54
|
-
opts.enableExposeInternalError && getRequestExposeInternalError(c.req.raw);
|
|
45
|
+
export function handleRouteError(error: unknown, c: HonoContext) {
|
|
46
|
+
const exposeInternalError = getRequestExposeInternalError(c.req.raw);
|
|
55
47
|
|
|
56
|
-
const { statusCode, code, message, metadata } = deconstructError(
|
|
48
|
+
const { statusCode, group, code, message, metadata } = deconstructError(
|
|
57
49
|
error,
|
|
58
50
|
logger(),
|
|
59
51
|
{
|
|
@@ -66,19 +58,20 @@ export function handleRouteError(
|
|
|
66
58
|
let encoding: Encoding;
|
|
67
59
|
try {
|
|
68
60
|
encoding = getRequestEncoding(c.req);
|
|
69
|
-
} catch (
|
|
70
|
-
logger().debug("failed to extract encoding", {
|
|
71
|
-
error: stringifyError(err),
|
|
72
|
-
});
|
|
61
|
+
} catch (_) {
|
|
73
62
|
encoding = "json";
|
|
74
63
|
}
|
|
75
64
|
|
|
76
65
|
const output = serializeWithEncoding(
|
|
77
66
|
encoding,
|
|
78
67
|
{
|
|
68
|
+
group,
|
|
79
69
|
code,
|
|
80
70
|
message,
|
|
81
|
-
|
|
71
|
+
// TODO: Cannot serialize non-binary meta since it requires ArrayBuffer atm
|
|
72
|
+
metadata: encodingIsBinary(encoding)
|
|
73
|
+
? bufferToArrayBuffer(cbor.encode(metadata))
|
|
74
|
+
: null,
|
|
82
75
|
},
|
|
83
76
|
HTTP_RESPONSE_ERROR_VERSIONED,
|
|
84
77
|
);
|
package/src/common/utils.ts
CHANGED
|
@@ -186,6 +186,7 @@ export interface DeconstructedError {
|
|
|
186
186
|
__type: "ActorError";
|
|
187
187
|
statusCode: ContentfulStatusCode;
|
|
188
188
|
public: boolean;
|
|
189
|
+
group: string;
|
|
189
190
|
code: string;
|
|
190
191
|
message: string;
|
|
191
192
|
metadata?: unknown;
|
|
@@ -203,6 +204,7 @@ export function deconstructError(
|
|
|
203
204
|
// We log the error here instead of after generating the code & message because we need to log the original error, not the masked internal error.
|
|
204
205
|
let statusCode: ContentfulStatusCode;
|
|
205
206
|
let public_: boolean;
|
|
207
|
+
let group: string;
|
|
206
208
|
let code: string;
|
|
207
209
|
let message: string;
|
|
208
210
|
let metadata: unknown;
|
|
@@ -212,60 +214,71 @@ export function deconstructError(
|
|
|
212
214
|
"statusCode" in error && error.statusCode ? error.statusCode : 400
|
|
213
215
|
) as ContentfulStatusCode;
|
|
214
216
|
public_ = true;
|
|
217
|
+
group = error.group;
|
|
215
218
|
code = error.code;
|
|
216
219
|
message = getErrorMessage(error);
|
|
217
220
|
metadata = error.metadata;
|
|
218
221
|
|
|
219
|
-
logger.info(
|
|
222
|
+
logger.info({
|
|
223
|
+
msg: "public error",
|
|
224
|
+
group,
|
|
220
225
|
code,
|
|
221
226
|
message,
|
|
222
|
-
issues: "https://github.com/rivet-
|
|
223
|
-
support: "https://rivet.
|
|
227
|
+
issues: "https://github.com/rivet-dev/rivetkit/issues",
|
|
228
|
+
support: "https://rivet.dev/discord",
|
|
224
229
|
...extraLog,
|
|
225
230
|
});
|
|
226
231
|
} else if (exposeInternalError) {
|
|
227
232
|
if (errors.ActorError.isActorError(error)) {
|
|
228
233
|
statusCode = 500;
|
|
229
234
|
public_ = false;
|
|
235
|
+
group = error.group;
|
|
230
236
|
code = error.code;
|
|
231
237
|
message = getErrorMessage(error);
|
|
232
238
|
metadata = error.metadata;
|
|
233
239
|
|
|
234
|
-
logger.info(
|
|
240
|
+
logger.info({
|
|
241
|
+
msg: "internal error",
|
|
242
|
+
group,
|
|
235
243
|
code,
|
|
236
244
|
message,
|
|
237
|
-
issues: "https://github.com/rivet-
|
|
238
|
-
support: "https://rivet.
|
|
245
|
+
issues: "https://github.com/rivet-dev/rivetkit/issues",
|
|
246
|
+
support: "https://rivet.dev/discord",
|
|
239
247
|
...extraLog,
|
|
240
248
|
});
|
|
241
249
|
} else {
|
|
242
250
|
statusCode = 500;
|
|
243
251
|
public_ = false;
|
|
252
|
+
group = "internal";
|
|
244
253
|
code = errors.INTERNAL_ERROR_CODE;
|
|
245
254
|
message = getErrorMessage(error);
|
|
246
255
|
|
|
247
|
-
logger.info(
|
|
256
|
+
logger.info({
|
|
257
|
+
msg: "internal error",
|
|
258
|
+
group,
|
|
248
259
|
code,
|
|
249
260
|
message,
|
|
250
|
-
issues: "https://github.com/rivet-
|
|
251
|
-
support: "https://rivet.
|
|
261
|
+
issues: "https://github.com/rivet-dev/rivetkit/issues",
|
|
262
|
+
support: "https://rivet.dev/discord",
|
|
252
263
|
...extraLog,
|
|
253
264
|
});
|
|
254
265
|
}
|
|
255
266
|
} else {
|
|
256
267
|
statusCode = 500;
|
|
257
268
|
public_ = false;
|
|
269
|
+
group = "internal";
|
|
258
270
|
code = errors.INTERNAL_ERROR_CODE;
|
|
259
271
|
message = errors.INTERNAL_ERROR_DESCRIPTION;
|
|
260
272
|
metadata = {
|
|
261
|
-
//url: `https://hub.rivet.
|
|
273
|
+
//url: `https://hub.rivet.dev/projects/${actorMetadata.project.slug}/environments/${actorMetadata.environment.slug}/actors?actorId=${actorMetadata.actor.id}`,
|
|
262
274
|
} satisfies errors.InternalErrorMetadata;
|
|
263
275
|
|
|
264
|
-
logger.warn(
|
|
276
|
+
logger.warn({
|
|
277
|
+
msg: "internal error",
|
|
265
278
|
error: getErrorMessage(error),
|
|
266
279
|
stack: (error as Error)?.stack,
|
|
267
|
-
issues: "https://github.com/rivet-
|
|
268
|
-
support: "https://rivet.
|
|
280
|
+
issues: "https://github.com/rivet-dev/rivetkit/issues",
|
|
281
|
+
support: "https://rivet.dev/discord",
|
|
269
282
|
...extraLog,
|
|
270
283
|
});
|
|
271
284
|
}
|
|
@@ -274,6 +287,7 @@ export function deconstructError(
|
|
|
274
287
|
__type: "ActorError",
|
|
275
288
|
statusCode,
|
|
276
289
|
public: public_,
|
|
290
|
+
group,
|
|
277
291
|
code,
|
|
278
292
|
message,
|
|
279
293
|
metadata,
|
package/src/common/websocket.ts
CHANGED
|
@@ -16,7 +16,6 @@ export async function importWebSocket(): Promise<typeof WebSocket> {
|
|
|
16
16
|
if (typeof WebSocket !== "undefined") {
|
|
17
17
|
// Browser environment
|
|
18
18
|
_WebSocket = WebSocket as unknown as typeof WebSocket;
|
|
19
|
-
logger().debug("using native websocket");
|
|
20
19
|
} else {
|
|
21
20
|
// Node.js environment
|
|
22
21
|
try {
|
|
@@ -8,7 +8,6 @@ export {
|
|
|
8
8
|
HEADER_CONN_PARAMS,
|
|
9
9
|
HEADER_CONN_TOKEN,
|
|
10
10
|
HEADER_ENCODING,
|
|
11
|
-
HEADER_EXPOSE_INTERNAL_ERROR,
|
|
12
11
|
} from "@/actor/router-endpoints";
|
|
13
12
|
export type {
|
|
14
13
|
ActorOutput,
|
|
@@ -16,6 +15,7 @@ export type {
|
|
|
16
15
|
GetForIdInput,
|
|
17
16
|
GetOrCreateWithKeyInput,
|
|
18
17
|
GetWithKeyInput,
|
|
18
|
+
ManagerDisplayInformation,
|
|
19
19
|
ManagerDriver,
|
|
20
20
|
} from "@/manager/driver";
|
|
21
21
|
export { DriverConfigSchema, RunConfigSchema } from "@/registry/run-config";
|
|
@@ -4,13 +4,12 @@ import { bundleRequire } from "bundle-require";
|
|
|
4
4
|
import invariant from "invariant";
|
|
5
5
|
import { describe } from "vitest";
|
|
6
6
|
import type { Transport } from "@/client/mod";
|
|
7
|
-
import { createInlineClientDriver } from "@/inline-client-driver/mod";
|
|
8
7
|
import { createManagerRouter } from "@/manager/router";
|
|
9
8
|
import type { DriverConfig, Registry, RunConfig } from "@/mod";
|
|
10
9
|
import { RunConfigSchema } from "@/registry/run-config";
|
|
11
10
|
import { getPort } from "@/test/mod";
|
|
11
|
+
import { logger } from "./log";
|
|
12
12
|
import { runActionFeaturesTests } from "./tests/action-features";
|
|
13
|
-
import { runActorAuthTests } from "./tests/actor-auth";
|
|
14
13
|
import { runActorConnTests } from "./tests/actor-conn";
|
|
15
14
|
import { runActorConnStateTests } from "./tests/actor-conn-state";
|
|
16
15
|
import {
|
|
@@ -26,10 +25,8 @@ import { runActorOnStateChangeTests } from "./tests/actor-onstatechange";
|
|
|
26
25
|
import { runActorVarsTests } from "./tests/actor-vars";
|
|
27
26
|
import { runManagerDriverTests } from "./tests/manager-driver";
|
|
28
27
|
import { runRawHttpTests } from "./tests/raw-http";
|
|
29
|
-
import { runRawHttpDirectRegistryTests } from "./tests/raw-http-direct-registry";
|
|
30
28
|
import { runRawHttpRequestPropertiesTests } from "./tests/raw-http-request-properties";
|
|
31
29
|
import { runRawWebSocketTests } from "./tests/raw-websocket";
|
|
32
|
-
import { runRawWebSocketDirectRegistryTests } from "./tests/raw-websocket-direct-registry";
|
|
33
30
|
import { runRequestAccessTests } from "./tests/request-access";
|
|
34
31
|
|
|
35
32
|
export interface SkipTests {
|
|
@@ -68,6 +65,8 @@ type ClientType = "http" | "inline";
|
|
|
68
65
|
|
|
69
66
|
export interface DriverDeployOutput {
|
|
70
67
|
endpoint: string;
|
|
68
|
+
namespace: string;
|
|
69
|
+
runnerName: string;
|
|
71
70
|
|
|
72
71
|
/** Cleans up the test. */
|
|
73
72
|
cleanup(): Promise<void>;
|
|
@@ -114,8 +113,6 @@ export function runDriverTests(
|
|
|
114
113
|
|
|
115
114
|
runActorErrorHandlingTests(driverTestConfig);
|
|
116
115
|
|
|
117
|
-
runActorAuthTests(driverTestConfig);
|
|
118
|
-
|
|
119
116
|
runActorInlineClientTests(driverTestConfig);
|
|
120
117
|
|
|
121
118
|
runRawHttpTests(driverTestConfig);
|
|
@@ -124,9 +121,11 @@ export function runDriverTests(
|
|
|
124
121
|
|
|
125
122
|
runRawWebSocketTests(driverTestConfig);
|
|
126
123
|
|
|
127
|
-
|
|
124
|
+
// TODO: re-expose this once we can have actor queries on the gateway
|
|
125
|
+
// runRawHttpDirectRegistryTests(driverTestConfig);
|
|
128
126
|
|
|
129
|
-
|
|
127
|
+
// TODO: re-expose this once we can have actor queries on the gateway
|
|
128
|
+
// runRawWebSocketDirectRegistryTests(driverTestConfig);
|
|
130
129
|
|
|
131
130
|
runActorInspectorTests(driverTestConfig);
|
|
132
131
|
});
|
|
@@ -141,6 +140,7 @@ export function runDriverTests(
|
|
|
141
140
|
export async function createTestRuntime(
|
|
142
141
|
registryPath: string,
|
|
143
142
|
driverFactory: (registry: Registry<any>) => Promise<{
|
|
143
|
+
rivetEngine?: { endpoint: string; namespace: string; runnerName: string };
|
|
144
144
|
driver: DriverConfig;
|
|
145
145
|
cleanup?: () => Promise<void>;
|
|
146
146
|
}>,
|
|
@@ -156,58 +156,84 @@ export async function createTestRuntime(
|
|
|
156
156
|
registry.config.test.enabled = true;
|
|
157
157
|
|
|
158
158
|
// Build drivers
|
|
159
|
-
const {
|
|
160
|
-
|
|
161
|
-
// Build driver config
|
|
162
|
-
let injectWebSocket: NodeWebSocket["injectWebSocket"] | undefined;
|
|
163
|
-
let upgradeWebSocket: any;
|
|
164
|
-
const config: RunConfig = RunConfigSchema.parse({
|
|
159
|
+
const {
|
|
165
160
|
driver,
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
token: () => "token",
|
|
170
|
-
},
|
|
171
|
-
});
|
|
161
|
+
cleanup: driverCleanup,
|
|
162
|
+
rivetEngine,
|
|
163
|
+
} = await driverFactory(registry);
|
|
172
164
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
//
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
165
|
+
if (rivetEngine) {
|
|
166
|
+
// TODO: We don't need createTestRuntime fort his
|
|
167
|
+
// Using external Rivet engine
|
|
168
|
+
|
|
169
|
+
const cleanup = async () => {
|
|
170
|
+
await driverCleanup?.();
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
return {
|
|
174
|
+
endpoint: rivetEngine.endpoint,
|
|
175
|
+
namespace: rivetEngine.namespace,
|
|
176
|
+
runnerName: rivetEngine.runnerName,
|
|
177
|
+
cleanup,
|
|
178
|
+
};
|
|
179
|
+
} else {
|
|
180
|
+
// Start server for Rivet engine
|
|
181
|
+
|
|
182
|
+
// Build driver config
|
|
183
|
+
// biome-ignore lint/style/useConst: Assigned later
|
|
184
|
+
let upgradeWebSocket: any;
|
|
185
|
+
const config: RunConfig = RunConfigSchema.parse({
|
|
186
|
+
driver,
|
|
187
|
+
getUpgradeWebSocket: () => upgradeWebSocket!,
|
|
188
|
+
inspector: {
|
|
189
|
+
enabled: true,
|
|
190
|
+
token: () => "token",
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
// Create router
|
|
195
|
+
const managerDriver = driver.manager(registry.config, config);
|
|
196
|
+
const { router } = createManagerRouter(
|
|
197
|
+
registry.config,
|
|
198
|
+
config,
|
|
199
|
+
managerDriver,
|
|
200
|
+
false,
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
// Inject WebSocket
|
|
204
|
+
const nodeWebSocket = createNodeWebSocket({ app: router });
|
|
205
|
+
upgradeWebSocket = nodeWebSocket.upgradeWebSocket;
|
|
206
|
+
|
|
207
|
+
// Start server
|
|
208
|
+
const port = await getPort();
|
|
209
|
+
const server = honoServe({
|
|
210
|
+
fetch: router.fetch,
|
|
211
|
+
hostname: "127.0.0.1",
|
|
212
|
+
port,
|
|
213
|
+
});
|
|
214
|
+
invariant(
|
|
215
|
+
nodeWebSocket.injectWebSocket !== undefined,
|
|
216
|
+
"should have injectWebSocket",
|
|
217
|
+
);
|
|
218
|
+
nodeWebSocket.injectWebSocket(server);
|
|
219
|
+
const serverEndpoint = `http://127.0.0.1:${port}`;
|
|
220
|
+
|
|
221
|
+
logger().info({ msg: "test serer listening", port });
|
|
222
|
+
|
|
223
|
+
// Cleanup
|
|
224
|
+
const cleanup = async () => {
|
|
225
|
+
// Stop server
|
|
226
|
+
await new Promise((resolve) => server.close(() => resolve(undefined)));
|
|
227
|
+
|
|
228
|
+
// Extra cleanup
|
|
229
|
+
await driverCleanup?.();
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
return {
|
|
233
|
+
endpoint: serverEndpoint,
|
|
234
|
+
namespace: "default",
|
|
235
|
+
runnerName: "rivetkit",
|
|
236
|
+
cleanup,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
213
239
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "vitest";
|
|
2
|
+
import type { ActorError } from "@/client/mod";
|
|
2
3
|
import type { DriverTestConfig } from "../mod";
|
|
3
4
|
import { setupDriverTest } from "../utils";
|
|
4
5
|
|
|
@@ -74,6 +75,38 @@ export function runActorHandleTests(driverTestConfig: DriverTestConfig) {
|
|
|
74
75
|
const retrievedCount = await handle.getCount();
|
|
75
76
|
expect(retrievedCount).toBe(9);
|
|
76
77
|
});
|
|
78
|
+
|
|
79
|
+
test("errors when calling create twice with the same key", async (c) => {
|
|
80
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
81
|
+
|
|
82
|
+
const key = ["duplicate-create-handle", crypto.randomUUID()];
|
|
83
|
+
|
|
84
|
+
// First create should succeed
|
|
85
|
+
await client.counter.create(key);
|
|
86
|
+
|
|
87
|
+
// Second create with same key should throw ActorAlreadyExists
|
|
88
|
+
try {
|
|
89
|
+
await client.counter.create(key);
|
|
90
|
+
expect.fail("did not error on duplicate create");
|
|
91
|
+
} catch (err) {
|
|
92
|
+
expect((err as ActorError).group).toBe("actor");
|
|
93
|
+
expect((err as ActorError).code).toBe("already_exists");
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test(".get().resolve() errors for non-existent actor", async (c) => {
|
|
98
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
99
|
+
|
|
100
|
+
const missingId = `nonexistent-${crypto.randomUUID()}`;
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
await client.counter.get([missingId]).resolve();
|
|
104
|
+
expect.fail("did not error for get().resolve() on missing actor");
|
|
105
|
+
} catch (err) {
|
|
106
|
+
expect((err as ActorError).group).toBe("actor");
|
|
107
|
+
expect((err as ActorError).code).toBe("not_found");
|
|
108
|
+
}
|
|
109
|
+
});
|
|
77
110
|
});
|
|
78
111
|
|
|
79
112
|
describe("Action Functionality", () => {
|
|
@@ -39,7 +39,8 @@ export function runManagerDriverTests(driverTestConfig: DriverTestConfig) {
|
|
|
39
39
|
await client.counter.create(uniqueKey);
|
|
40
40
|
expect.fail("did not error on duplicate create");
|
|
41
41
|
} catch (err) {
|
|
42
|
-
expect((err as ActorError).
|
|
42
|
+
expect((err as ActorError).group).toBe("actor");
|
|
43
|
+
expect((err as ActorError).code).toBe("already_exists");
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
// Verify the original actor still works and has its state
|
|
@@ -60,7 +61,8 @@ export function runManagerDriverTests(driverTestConfig: DriverTestConfig) {
|
|
|
60
61
|
await client.counter.get([nonexistentId]).resolve();
|
|
61
62
|
expect.fail("did not error for get");
|
|
62
63
|
} catch (err) {
|
|
63
|
-
expect((err as ActorError).
|
|
64
|
+
expect((err as ActorError).group).toBe("actor");
|
|
65
|
+
expect((err as ActorError).code).toBe("not_found");
|
|
64
66
|
}
|
|
65
67
|
|
|
66
68
|
// Create the actor
|
|
@@ -319,7 +321,7 @@ export function runManagerDriverTests(driverTestConfig: DriverTestConfig) {
|
|
|
319
321
|
});
|
|
320
322
|
|
|
321
323
|
describe("Multiple Actor Instances", () => {
|
|
322
|
-
// TODO: This test is flakey https://github.com/rivet-
|
|
324
|
+
// TODO: This test is flakey https://github.com/rivet-dev/rivetkit/issues/873
|
|
323
325
|
test("creates multiple actor instances of the same type", async (c) => {
|
|
324
326
|
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
325
327
|
|