rivetkit 2.0.2 → 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 +3 -5
- package/dist/schemas/actor-persist/v1.ts +225 -0
- package/dist/schemas/client-protocol/v1.ts +435 -0
- package/dist/schemas/file-system-driver/v1.ts +102 -0
- package/dist/tsup/actor/errors.cjs +77 -0
- package/dist/tsup/actor/errors.cjs.map +1 -0
- package/dist/tsup/actor/errors.d.cts +156 -0
- package/dist/tsup/actor/errors.d.ts +156 -0
- package/dist/tsup/actor/errors.js +77 -0
- package/dist/tsup/actor/errors.js.map +1 -0
- package/dist/tsup/chunk-3F2YSRJL.js +117 -0
- 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-6LJT3QRL.cjs +539 -0
- package/dist/tsup/chunk-6LJT3QRL.cjs.map +1 -0
- package/dist/tsup/chunk-GICQ3YCU.cjs +1792 -0
- package/dist/tsup/chunk-GICQ3YCU.cjs.map +1 -0
- package/dist/tsup/chunk-H26RP6GD.js +251 -0
- 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-HLLF4B4Q.js +1792 -0
- package/dist/tsup/chunk-HLLF4B4Q.js.map +1 -0
- package/dist/tsup/chunk-IH6CKNDW.cjs +117 -0
- 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-LWNKVZG5.cjs +251 -0
- package/dist/tsup/chunk-LWNKVZG5.cjs.map +1 -0
- package/dist/tsup/chunk-NFU2BBT5.js +374 -0
- package/dist/tsup/chunk-NFU2BBT5.js.map +1 -0
- package/dist/tsup/chunk-PQY7KKTL.js +539 -0
- package/dist/tsup/chunk-PQY7KKTL.js.map +1 -0
- package/dist/tsup/chunk-QK72M5JB.js +45 -0
- package/dist/tsup/chunk-QK72M5JB.js.map +1 -0
- package/dist/tsup/chunk-QNNXFOQV.cjs +45 -0
- package/dist/tsup/chunk-QNNXFOQV.cjs.map +1 -0
- package/dist/tsup/chunk-SBHHJ6QS.cjs +374 -0
- 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 +32 -0
- package/dist/tsup/client/mod.cjs.map +1 -0
- package/dist/tsup/client/mod.d.cts +20 -0
- package/dist/tsup/client/mod.d.ts +20 -0
- package/dist/tsup/client/mod.js +32 -0
- package/dist/tsup/client/mod.js.map +1 -0
- package/dist/tsup/common/log.cjs +21 -0
- package/dist/tsup/common/log.cjs.map +1 -0
- package/dist/tsup/common/log.d.cts +26 -0
- package/dist/tsup/common/log.d.ts +26 -0
- package/dist/tsup/common/log.js +21 -0
- package/dist/tsup/common/log.js.map +1 -0
- package/dist/tsup/common/websocket.cjs +10 -0
- package/dist/tsup/common/websocket.cjs.map +1 -0
- package/dist/tsup/common/websocket.d.cts +3 -0
- package/dist/tsup/common/websocket.d.ts +3 -0
- package/dist/tsup/common/websocket.js +10 -0
- package/dist/tsup/common/websocket.js.map +1 -0
- package/dist/tsup/common-CXCe7s6i.d.cts +218 -0
- package/dist/tsup/common-CXCe7s6i.d.ts +218 -0
- package/dist/tsup/connection-BI-6UIBJ.d.ts +2087 -0
- package/dist/tsup/connection-Dyd4NLGW.d.cts +2087 -0
- package/dist/tsup/driver-helpers/mod.cjs +30 -0
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -0
- package/dist/tsup/driver-helpers/mod.d.cts +17 -0
- package/dist/tsup/driver-helpers/mod.d.ts +17 -0
- package/dist/tsup/driver-helpers/mod.js +30 -0
- package/dist/tsup/driver-helpers/mod.js.map +1 -0
- package/dist/tsup/driver-test-suite/mod.cjs +3411 -0
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -0
- package/dist/tsup/driver-test-suite/mod.d.cts +63 -0
- package/dist/tsup/driver-test-suite/mod.d.ts +63 -0
- package/dist/tsup/driver-test-suite/mod.js +3411 -0
- package/dist/tsup/driver-test-suite/mod.js.map +1 -0
- package/dist/tsup/inspector/mod.cjs +51 -0
- package/dist/tsup/inspector/mod.cjs.map +1 -0
- package/dist/tsup/inspector/mod.d.cts +408 -0
- package/dist/tsup/inspector/mod.d.ts +408 -0
- package/dist/tsup/inspector/mod.js +51 -0
- package/dist/tsup/inspector/mod.js.map +1 -0
- package/dist/tsup/mod.cjs +67 -0
- package/dist/tsup/mod.cjs.map +1 -0
- package/dist/tsup/mod.d.cts +105 -0
- package/dist/tsup/mod.d.ts +105 -0
- package/dist/tsup/mod.js +67 -0
- package/dist/tsup/mod.js.map +1 -0
- package/dist/tsup/router-endpoints-BTe_Rsdn.d.cts +65 -0
- package/dist/tsup/router-endpoints-CBSrKHmo.d.ts +65 -0
- package/dist/tsup/test/mod.cjs +17 -0
- package/dist/tsup/test/mod.cjs.map +1 -0
- package/dist/tsup/test/mod.d.cts +26 -0
- package/dist/tsup/test/mod.d.ts +26 -0
- package/dist/tsup/test/mod.js +17 -0
- package/dist/tsup/test/mod.js.map +1 -0
- package/dist/tsup/utils-fwx3o3K9.d.cts +18 -0
- package/dist/tsup/utils-fwx3o3K9.d.ts +18 -0
- package/dist/tsup/utils.cjs +26 -0
- package/dist/tsup/utils.cjs.map +1 -0
- package/dist/tsup/utils.d.cts +36 -0
- package/dist/tsup/utils.d.ts +36 -0
- package/dist/tsup/utils.js +26 -0
- package/dist/tsup/utils.js.map +1 -0
- package/package.json +208 -5
- package/src/actor/action.ts +178 -0
- package/src/actor/config.ts +497 -0
- package/src/actor/connection.ts +257 -0
- package/src/actor/context.ts +168 -0
- package/src/actor/database.ts +23 -0
- package/src/actor/definition.ts +82 -0
- package/src/actor/driver.ts +84 -0
- package/src/actor/errors.ts +422 -0
- package/src/actor/generic-conn-driver.ts +246 -0
- package/src/actor/instance.ts +1844 -0
- package/src/actor/keys.test.ts +266 -0
- package/src/actor/keys.ts +89 -0
- package/src/actor/log.ts +6 -0
- package/src/actor/mod.ts +108 -0
- package/src/actor/persisted.ts +42 -0
- package/src/actor/protocol/old.ts +297 -0
- package/src/actor/protocol/serde.ts +131 -0
- package/src/actor/router-endpoints.ts +688 -0
- package/src/actor/router.ts +265 -0
- package/src/actor/schedule.ts +17 -0
- package/src/actor/unstable-react.ts +110 -0
- package/src/actor/utils.ts +102 -0
- package/src/client/actor-common.ts +30 -0
- package/src/client/actor-conn.ts +865 -0
- package/src/client/actor-handle.ts +268 -0
- package/src/client/actor-query.ts +65 -0
- package/src/client/client.ts +554 -0
- package/src/client/config.ts +44 -0
- package/src/client/errors.ts +42 -0
- package/src/client/log.ts +5 -0
- package/src/client/mod.ts +60 -0
- package/src/client/raw-utils.ts +149 -0
- package/src/client/test.ts +44 -0
- package/src/client/utils.ts +152 -0
- package/src/common/eventsource-interface.ts +47 -0
- package/src/common/eventsource.ts +80 -0
- package/src/common/fake-event-source.ts +267 -0
- package/src/common/inline-websocket-adapter2.ts +454 -0
- package/src/common/log-levels.ts +27 -0
- package/src/common/log.ts +214 -0
- package/src/common/logfmt.ts +219 -0
- package/src/common/network.ts +2 -0
- package/src/common/router.ts +80 -0
- package/src/common/utils.ts +336 -0
- package/src/common/versioned-data.ts +95 -0
- package/src/common/websocket-interface.ts +49 -0
- package/src/common/websocket.ts +42 -0
- package/src/driver-helpers/mod.ts +22 -0
- package/src/driver-helpers/utils.ts +17 -0
- package/src/driver-test-suite/log.ts +5 -0
- package/src/driver-test-suite/mod.ts +239 -0
- package/src/driver-test-suite/tests/action-features.ts +136 -0
- package/src/driver-test-suite/tests/actor-conn-state.ts +249 -0
- package/src/driver-test-suite/tests/actor-conn.ts +349 -0
- package/src/driver-test-suite/tests/actor-driver.ts +25 -0
- package/src/driver-test-suite/tests/actor-error-handling.ts +158 -0
- package/src/driver-test-suite/tests/actor-handle.ts +292 -0
- package/src/driver-test-suite/tests/actor-inline-client.ts +152 -0
- package/src/driver-test-suite/tests/actor-inspector.ts +570 -0
- package/src/driver-test-suite/tests/actor-metadata.ts +116 -0
- package/src/driver-test-suite/tests/actor-onstatechange.ts +95 -0
- package/src/driver-test-suite/tests/actor-schedule.ts +108 -0
- package/src/driver-test-suite/tests/actor-sleep.ts +413 -0
- package/src/driver-test-suite/tests/actor-state.ts +54 -0
- package/src/driver-test-suite/tests/actor-vars.ts +93 -0
- package/src/driver-test-suite/tests/manager-driver.ts +367 -0
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -0
- package/src/driver-test-suite/tests/raw-http-request-properties.ts +414 -0
- package/src/driver-test-suite/tests/raw-http.ts +347 -0
- package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -0
- package/src/driver-test-suite/tests/raw-websocket.ts +484 -0
- package/src/driver-test-suite/tests/request-access.ts +230 -0
- package/src/driver-test-suite/utils.ts +71 -0
- package/src/drivers/default.ts +34 -0
- package/src/drivers/engine/actor-driver.ts +369 -0
- package/src/drivers/engine/config.ts +31 -0
- package/src/drivers/engine/kv.ts +3 -0
- package/src/drivers/engine/log.ts +5 -0
- package/src/drivers/engine/mod.ts +35 -0
- package/src/drivers/file-system/actor.ts +91 -0
- package/src/drivers/file-system/global-state.ts +686 -0
- package/src/drivers/file-system/log.ts +5 -0
- package/src/drivers/file-system/manager.ts +329 -0
- package/src/drivers/file-system/mod.ts +48 -0
- package/src/drivers/file-system/utils.ts +109 -0
- package/src/globals.d.ts +6 -0
- package/src/inspector/actor.ts +298 -0
- package/src/inspector/config.ts +88 -0
- package/src/inspector/log.ts +5 -0
- package/src/inspector/manager.ts +86 -0
- package/src/inspector/mod.ts +2 -0
- package/src/inspector/protocol/actor.ts +10 -0
- package/src/inspector/protocol/common.ts +196 -0
- package/src/inspector/protocol/manager.ts +10 -0
- package/src/inspector/protocol/mod.ts +2 -0
- package/src/inspector/utils.ts +76 -0
- package/src/manager/driver.ts +88 -0
- package/src/manager/hono-websocket-adapter.ts +342 -0
- package/src/manager/log.ts +5 -0
- package/src/manager/mod.ts +2 -0
- package/src/manager/protocol/mod.ts +24 -0
- package/src/manager/protocol/query.ts +89 -0
- package/src/manager/router.ts +412 -0
- 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 +18 -0
- package/src/registry/config.ts +32 -0
- package/src/registry/log.ts +5 -0
- package/src/registry/mod.ts +157 -0
- package/src/registry/run-config.ts +52 -0
- package/src/registry/serve.ts +52 -0
- 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/remote-manager-driver/ws-proxy.ts +180 -0
- package/src/schemas/actor-persist/mod.ts +1 -0
- package/src/schemas/actor-persist/versioned.ts +25 -0
- package/src/schemas/client-protocol/mod.ts +1 -0
- package/src/schemas/client-protocol/versioned.ts +63 -0
- package/src/schemas/file-system-driver/mod.ts +1 -0
- package/src/schemas/file-system-driver/versioned.ts +28 -0
- package/src/serde.ts +90 -0
- package/src/test/config.ts +16 -0
- package/src/test/log.ts +5 -0
- package/src/test/mod.ts +154 -0
- package/src/utils.ts +172 -0
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { HEADER_ACTOR_QUERY } from "@/driver-helpers/mod";
|
|
3
|
+
import {
|
|
4
|
+
createActorInspectorClient,
|
|
5
|
+
createManagerInspectorClient,
|
|
6
|
+
} from "@/inspector/mod";
|
|
7
|
+
import type { ActorQuery } from "@/mod";
|
|
8
|
+
import type { DriverTestConfig } from "../mod";
|
|
9
|
+
import { setupDriverTest } from "../utils";
|
|
10
|
+
|
|
11
|
+
export function runActorInspectorTests(driverTestConfig: DriverTestConfig) {
|
|
12
|
+
describe("Actor Inspector Tests", () => {
|
|
13
|
+
describe("Manager Inspector", () => {
|
|
14
|
+
test("should respond to ping", async (c) => {
|
|
15
|
+
const { endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
16
|
+
|
|
17
|
+
const http = createManagerInspectorClient(`${endpoint}/inspect`, {
|
|
18
|
+
headers: {
|
|
19
|
+
Authorization: `Bearer token`,
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const response = await http.ping.$get();
|
|
24
|
+
expect(response.status).toBe(200);
|
|
25
|
+
|
|
26
|
+
const data = await response.json();
|
|
27
|
+
expect(data).toEqual({ message: "pong" });
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test("should get actors with pagination", async (c) => {
|
|
31
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
32
|
+
|
|
33
|
+
// Create some actors first
|
|
34
|
+
await client.counter.create(["test-actor-1"]);
|
|
35
|
+
await client.counter.create(["test-actor-2"]);
|
|
36
|
+
|
|
37
|
+
const http = createManagerInspectorClient(`${endpoint}/inspect`, {
|
|
38
|
+
headers: {
|
|
39
|
+
Authorization: `Bearer token`,
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const response = await http.actors.$get({
|
|
44
|
+
query: { limit: "1" },
|
|
45
|
+
});
|
|
46
|
+
expect(response.status).toBe(200);
|
|
47
|
+
|
|
48
|
+
const data = await response.json();
|
|
49
|
+
expect(data).toEqual(
|
|
50
|
+
expect.arrayContaining([
|
|
51
|
+
expect.objectContaining({ key: ["test-actor-1"] }),
|
|
52
|
+
]),
|
|
53
|
+
);
|
|
54
|
+
expect(data.length).toBe(1);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("should get all actors with pagination", async (c) => {
|
|
58
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
59
|
+
|
|
60
|
+
const actorKey1 = ["test-cursor-1"];
|
|
61
|
+
const actorKey2 = ["test-cursor-2"];
|
|
62
|
+
|
|
63
|
+
// Create some actors first
|
|
64
|
+
await client.counter.create(actorKey1);
|
|
65
|
+
await client.counter.create(actorKey2);
|
|
66
|
+
|
|
67
|
+
const http = createManagerInspectorClient(`${endpoint}/inspect`, {
|
|
68
|
+
headers: {
|
|
69
|
+
Authorization: `Bearer token`,
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const response = await http.actors.$get({
|
|
74
|
+
query: { limit: "5" },
|
|
75
|
+
});
|
|
76
|
+
expect(response.status).toBe(200);
|
|
77
|
+
|
|
78
|
+
const data = await response.json();
|
|
79
|
+
expect(data).toEqual(
|
|
80
|
+
expect.arrayContaining([
|
|
81
|
+
expect.objectContaining({
|
|
82
|
+
id: expect.any(String),
|
|
83
|
+
key: actorKey1,
|
|
84
|
+
}),
|
|
85
|
+
expect.objectContaining({
|
|
86
|
+
id: expect.any(String),
|
|
87
|
+
key: actorKey2,
|
|
88
|
+
}),
|
|
89
|
+
]),
|
|
90
|
+
);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("should handle invalid limit parameter", async (c) => {
|
|
94
|
+
const { endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
95
|
+
|
|
96
|
+
const http = createManagerInspectorClient(`${endpoint}/inspect`, {
|
|
97
|
+
headers: {
|
|
98
|
+
Authorization: `Bearer token`,
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const response = await http.actors.$get({
|
|
103
|
+
query: { limit: "0" },
|
|
104
|
+
});
|
|
105
|
+
expect(response.status).toBe(400);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test("should create a new actor", async (c) => {
|
|
109
|
+
const { endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
110
|
+
|
|
111
|
+
const http = createManagerInspectorClient(`${endpoint}/inspect`, {
|
|
112
|
+
headers: {
|
|
113
|
+
Authorization: `Bearer token`,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const response = await http.actors.$post({
|
|
118
|
+
json: {
|
|
119
|
+
name: "default",
|
|
120
|
+
key: ["test-create-actor"],
|
|
121
|
+
input: {},
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
expect(response.status).toBe(201);
|
|
126
|
+
const data = await response.json();
|
|
127
|
+
expect(data).toEqual(
|
|
128
|
+
expect.objectContaining({
|
|
129
|
+
id: expect.any(String),
|
|
130
|
+
name: "default",
|
|
131
|
+
key: ["test-create-actor"],
|
|
132
|
+
}),
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test("should get builds", async (c) => {
|
|
137
|
+
const { endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
138
|
+
|
|
139
|
+
const http = createManagerInspectorClient(`${endpoint}/inspect`, {
|
|
140
|
+
headers: {
|
|
141
|
+
Authorization: `Bearer token`,
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
const response = await http.builds.$get();
|
|
146
|
+
expect(response.status).toBe(200);
|
|
147
|
+
|
|
148
|
+
const data = await response.json();
|
|
149
|
+
expect(data).toEqual(
|
|
150
|
+
expect.arrayContaining([
|
|
151
|
+
expect.objectContaining({ name: expect.any(String) }),
|
|
152
|
+
]),
|
|
153
|
+
);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test("should get actor by id", async (c) => {
|
|
157
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
158
|
+
|
|
159
|
+
// Create an actor and get its ID
|
|
160
|
+
const handle = await client.counter.create(["test-get-by-id"]);
|
|
161
|
+
const actorId = await handle.resolve();
|
|
162
|
+
|
|
163
|
+
const http = createManagerInspectorClient(`${endpoint}/inspect`, {
|
|
164
|
+
headers: {
|
|
165
|
+
Authorization: `Bearer token`,
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
const response = await http.actor[":id"].$get({
|
|
170
|
+
param: { id: actorId },
|
|
171
|
+
});
|
|
172
|
+
expect(response.status).toBe(200);
|
|
173
|
+
|
|
174
|
+
const data = await response.json();
|
|
175
|
+
expect(data).toHaveProperty("id", actorId);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test("should return 404 for non-existent actor", async (c) => {
|
|
179
|
+
const { endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
180
|
+
|
|
181
|
+
const http = createManagerInspectorClient(`${endpoint}/inspect`, {
|
|
182
|
+
headers: {
|
|
183
|
+
Authorization: `Bearer token`,
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const response = await http.actor[":id"].$get({
|
|
188
|
+
param: { id: "non-existent-id" },
|
|
189
|
+
});
|
|
190
|
+
expect(response.status).toBe(404);
|
|
191
|
+
|
|
192
|
+
const data = await response.json();
|
|
193
|
+
expect(data).toEqual({ error: "Actor not found" });
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
test("should get bootstrap data", async (c) => {
|
|
197
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
198
|
+
|
|
199
|
+
// Create at least one actor to ensure bootstrap has data
|
|
200
|
+
// Create an actor and get its ID
|
|
201
|
+
const handle = await client.counter.create(["test-bootstrap"]);
|
|
202
|
+
await handle.resolve();
|
|
203
|
+
|
|
204
|
+
const http = createManagerInspectorClient(`${endpoint}/inspect`, {
|
|
205
|
+
headers: {
|
|
206
|
+
Authorization: `Bearer token`,
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
const response = await http.bootstrap.$get();
|
|
211
|
+
expect(response.status).toBe(200);
|
|
212
|
+
|
|
213
|
+
const data = await response.json();
|
|
214
|
+
expect(data.actors).toEqual(
|
|
215
|
+
expect.arrayContaining([
|
|
216
|
+
expect.objectContaining({
|
|
217
|
+
key: ["test-bootstrap"],
|
|
218
|
+
name: "counter",
|
|
219
|
+
}),
|
|
220
|
+
]),
|
|
221
|
+
);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
describe("Actor Inspector", () => {
|
|
226
|
+
test("should handle actor not found", async (c) => {
|
|
227
|
+
const { endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
228
|
+
|
|
229
|
+
const actorId = "non-existing";
|
|
230
|
+
|
|
231
|
+
const http = createActorInspectorClient(`${endpoint}/actors/inspect`, {
|
|
232
|
+
headers: {
|
|
233
|
+
Authorization: `Bearer token`,
|
|
234
|
+
[HEADER_ACTOR_QUERY]: JSON.stringify({
|
|
235
|
+
getForId: { name: "counter", actorId },
|
|
236
|
+
} satisfies ActorQuery),
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
const response = await http.ping.$get();
|
|
241
|
+
expect(response.ok).toBe(false);
|
|
242
|
+
});
|
|
243
|
+
test("should respond to ping", async (c) => {
|
|
244
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
245
|
+
|
|
246
|
+
const handle = await client.counter.create(["test-ping"]);
|
|
247
|
+
const actorId = await handle.resolve();
|
|
248
|
+
|
|
249
|
+
const http = createActorInspectorClient(`${endpoint}/actors/inspect`, {
|
|
250
|
+
headers: {
|
|
251
|
+
Authorization: `Bearer token`,
|
|
252
|
+
[HEADER_ACTOR_QUERY]: JSON.stringify({
|
|
253
|
+
getForId: { name: "counter", actorId },
|
|
254
|
+
} satisfies ActorQuery),
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
const response = await http.ping.$get();
|
|
259
|
+
expect(response.status).toBe(200);
|
|
260
|
+
|
|
261
|
+
const data = await response.json();
|
|
262
|
+
expect(data).toEqual({ message: "pong" });
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
test("should get actor state", async (c) => {
|
|
266
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
267
|
+
|
|
268
|
+
const handle = await client.counter.create(["test-state"]);
|
|
269
|
+
const actorId = await handle.resolve();
|
|
270
|
+
|
|
271
|
+
// Increment the counter to set some state
|
|
272
|
+
await handle.increment(5);
|
|
273
|
+
|
|
274
|
+
const http = createActorInspectorClient(`${endpoint}/actors/inspect`, {
|
|
275
|
+
headers: {
|
|
276
|
+
Authorization: `Bearer token`,
|
|
277
|
+
[HEADER_ACTOR_QUERY]: JSON.stringify({
|
|
278
|
+
getForId: { name: "counter", actorId },
|
|
279
|
+
} satisfies ActorQuery),
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
const response = await http.state.$get();
|
|
284
|
+
expect(response.status).toBe(200);
|
|
285
|
+
|
|
286
|
+
const data = await response.json();
|
|
287
|
+
expect(data).toEqual({
|
|
288
|
+
enabled: true,
|
|
289
|
+
state: expect.objectContaining({
|
|
290
|
+
count: 5,
|
|
291
|
+
}),
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
test("should update actor state with replace", async (c) => {
|
|
296
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
297
|
+
|
|
298
|
+
const handle = await client.counter.create(["test-state-replace"]);
|
|
299
|
+
const actorId = await handle.resolve();
|
|
300
|
+
|
|
301
|
+
const http = createActorInspectorClient(`${endpoint}/actors/inspect`, {
|
|
302
|
+
headers: {
|
|
303
|
+
Authorization: `Bearer token`,
|
|
304
|
+
[HEADER_ACTOR_QUERY]: JSON.stringify({
|
|
305
|
+
getForId: { name: "counter", actorId },
|
|
306
|
+
} satisfies ActorQuery),
|
|
307
|
+
},
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
// Replace the entire state
|
|
311
|
+
const response = await http.state.$patch({
|
|
312
|
+
json: {
|
|
313
|
+
replace: { count: 10 },
|
|
314
|
+
},
|
|
315
|
+
});
|
|
316
|
+
expect(response.status).toBe(200);
|
|
317
|
+
|
|
318
|
+
const data = await response.json();
|
|
319
|
+
expect(data).toEqual({
|
|
320
|
+
enabled: true,
|
|
321
|
+
state: { count: 10 },
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
test("should update actor state with patch", async (c) => {
|
|
326
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
327
|
+
|
|
328
|
+
const handle = await client.counter.create(["test-state-patch"]);
|
|
329
|
+
const actorId = await handle.resolve();
|
|
330
|
+
|
|
331
|
+
// Set initial state
|
|
332
|
+
await handle.increment(3);
|
|
333
|
+
|
|
334
|
+
const http = createActorInspectorClient(`${endpoint}/actors/inspect`, {
|
|
335
|
+
headers: {
|
|
336
|
+
Authorization: `Bearer token`,
|
|
337
|
+
[HEADER_ACTOR_QUERY]: JSON.stringify({
|
|
338
|
+
getForId: { name: "counter", actorId },
|
|
339
|
+
} satisfies ActorQuery),
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
// Patch the state
|
|
344
|
+
const response = await http.state.$patch({
|
|
345
|
+
json: {
|
|
346
|
+
patch: [
|
|
347
|
+
{
|
|
348
|
+
op: "replace",
|
|
349
|
+
path: "/count",
|
|
350
|
+
value: 7,
|
|
351
|
+
},
|
|
352
|
+
],
|
|
353
|
+
},
|
|
354
|
+
});
|
|
355
|
+
expect(response.status).toBe(200);
|
|
356
|
+
|
|
357
|
+
const data = await response.json();
|
|
358
|
+
expect(data).toEqual({
|
|
359
|
+
enabled: true,
|
|
360
|
+
state: expect.objectContaining({
|
|
361
|
+
count: 7,
|
|
362
|
+
}),
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
test("should get actor connections", async (c) => {
|
|
367
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
368
|
+
|
|
369
|
+
const handle = await client.counter.create(["test-connections"]);
|
|
370
|
+
const actorId = await handle.resolve();
|
|
371
|
+
handle.connect();
|
|
372
|
+
await handle.increment(10);
|
|
373
|
+
|
|
374
|
+
const http = createActorInspectorClient(`${endpoint}/actors/inspect`, {
|
|
375
|
+
headers: {
|
|
376
|
+
Authorization: `Bearer token`,
|
|
377
|
+
[HEADER_ACTOR_QUERY]: JSON.stringify({
|
|
378
|
+
getForId: { name: "counter", actorId },
|
|
379
|
+
} satisfies ActorQuery),
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
const response = await http.connections.$get();
|
|
384
|
+
expect(response.status).toBe(200);
|
|
385
|
+
|
|
386
|
+
const data = await response.json();
|
|
387
|
+
expect(data.connections).toEqual(
|
|
388
|
+
expect.arrayContaining([
|
|
389
|
+
expect.objectContaining({
|
|
390
|
+
id: expect.any(String),
|
|
391
|
+
}),
|
|
392
|
+
]),
|
|
393
|
+
);
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
test("should get actor events", async (c) => {
|
|
397
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
398
|
+
|
|
399
|
+
const handle = await client.counter.create(["test-events"]);
|
|
400
|
+
const actorId = await handle.resolve();
|
|
401
|
+
|
|
402
|
+
handle.connect();
|
|
403
|
+
await handle.increment(10);
|
|
404
|
+
|
|
405
|
+
const http = createActorInspectorClient(`${endpoint}/actors/inspect`, {
|
|
406
|
+
headers: {
|
|
407
|
+
Authorization: `Bearer token`,
|
|
408
|
+
[HEADER_ACTOR_QUERY]: JSON.stringify({
|
|
409
|
+
getForId: { name: "counter", actorId },
|
|
410
|
+
} satisfies ActorQuery),
|
|
411
|
+
},
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
const response = await http.events.$get();
|
|
415
|
+
expect(response.status).toBe(200);
|
|
416
|
+
|
|
417
|
+
const data = await response.json();
|
|
418
|
+
expect(data.events).toEqual(
|
|
419
|
+
expect.arrayContaining([
|
|
420
|
+
expect.objectContaining({
|
|
421
|
+
type: "broadcast",
|
|
422
|
+
id: expect.any(String),
|
|
423
|
+
}),
|
|
424
|
+
]),
|
|
425
|
+
);
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
test("should clear actor events", async (c) => {
|
|
429
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
430
|
+
|
|
431
|
+
const handle = await client.counter.create(["test-events-clear"]);
|
|
432
|
+
const actorId = await handle.resolve();
|
|
433
|
+
|
|
434
|
+
handle.connect();
|
|
435
|
+
await handle.increment(10);
|
|
436
|
+
|
|
437
|
+
const http = createActorInspectorClient(`${endpoint}/actors/inspect`, {
|
|
438
|
+
headers: {
|
|
439
|
+
Authorization: `Bearer token`,
|
|
440
|
+
[HEADER_ACTOR_QUERY]: JSON.stringify({
|
|
441
|
+
getForId: { name: "counter", actorId },
|
|
442
|
+
} satisfies ActorQuery),
|
|
443
|
+
},
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
{
|
|
447
|
+
const response = await http.events.$get();
|
|
448
|
+
expect(response.status).toBe(200);
|
|
449
|
+
|
|
450
|
+
const data = await response.json();
|
|
451
|
+
expect(data.events).toEqual(
|
|
452
|
+
expect.arrayContaining([
|
|
453
|
+
expect.objectContaining({
|
|
454
|
+
type: "broadcast",
|
|
455
|
+
id: expect.any(String),
|
|
456
|
+
}),
|
|
457
|
+
]),
|
|
458
|
+
);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
const response = await http.events.clear.$post();
|
|
462
|
+
expect(response.status).toBe(200);
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
test("should get actor rpcs", async (c) => {
|
|
466
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
467
|
+
|
|
468
|
+
const handle = await client.counter.create(["test-rpcs"]);
|
|
469
|
+
const actorId = await handle.resolve();
|
|
470
|
+
|
|
471
|
+
const http = createActorInspectorClient(`${endpoint}/actors/inspect`, {
|
|
472
|
+
headers: {
|
|
473
|
+
Authorization: `Bearer token`,
|
|
474
|
+
[HEADER_ACTOR_QUERY]: JSON.stringify({
|
|
475
|
+
getForId: { name: "counter", actorId },
|
|
476
|
+
} satisfies ActorQuery),
|
|
477
|
+
},
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
const response = await http.rpcs.$get();
|
|
481
|
+
expect(response.status).toBe(200);
|
|
482
|
+
|
|
483
|
+
const data = await response.json();
|
|
484
|
+
expect(data).toEqual(
|
|
485
|
+
expect.objectContaining({
|
|
486
|
+
rpcs: expect.arrayContaining(["increment", "getCount"]),
|
|
487
|
+
}),
|
|
488
|
+
);
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
// database is not officially supported yet
|
|
492
|
+
test.skip("should get actor database info", async (c) => {
|
|
493
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
494
|
+
|
|
495
|
+
const handle = await client.counter.create(["test-db"]);
|
|
496
|
+
const actorId = await handle.resolve();
|
|
497
|
+
|
|
498
|
+
const http = createActorInspectorClient(`${endpoint}/actors/inspect`, {
|
|
499
|
+
headers: {
|
|
500
|
+
Authorization: `Bearer token`,
|
|
501
|
+
[HEADER_ACTOR_QUERY]: JSON.stringify({
|
|
502
|
+
getForId: { name: "counter", actorId },
|
|
503
|
+
} satisfies ActorQuery),
|
|
504
|
+
},
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
const response = await http.db.$get();
|
|
508
|
+
expect(response.status).toBe(200);
|
|
509
|
+
|
|
510
|
+
const data = await response.json();
|
|
511
|
+
// Database might be enabled or disabled depending on actor configuration
|
|
512
|
+
expect(data).toHaveProperty("enabled");
|
|
513
|
+
expect(typeof data.enabled).toBe("boolean");
|
|
514
|
+
|
|
515
|
+
if (data.enabled) {
|
|
516
|
+
expect(data).toHaveProperty("db");
|
|
517
|
+
expect(Array.isArray(data.db)).toBe(true);
|
|
518
|
+
} else {
|
|
519
|
+
expect(data.db).toBe(null);
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
test.skip("should execute database query when database is enabled", async (c) => {
|
|
524
|
+
const { client, endpoint } = await setupDriverTest(c, driverTestConfig);
|
|
525
|
+
|
|
526
|
+
const handle = await client.counter.create(["test-db-query"]);
|
|
527
|
+
const actorId = await handle.resolve();
|
|
528
|
+
|
|
529
|
+
const http = createActorInspectorClient(`${endpoint}/actors/inspect`, {
|
|
530
|
+
headers: {
|
|
531
|
+
Authorization: `Bearer token`,
|
|
532
|
+
[HEADER_ACTOR_QUERY]: JSON.stringify({
|
|
533
|
+
getForId: { name: "counter", actorId },
|
|
534
|
+
} satisfies ActorQuery),
|
|
535
|
+
},
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
// First check if database is enabled
|
|
539
|
+
const dbInfoResponse = await http.db.$get();
|
|
540
|
+
const dbInfo = await dbInfoResponse.json();
|
|
541
|
+
|
|
542
|
+
if (dbInfo.enabled) {
|
|
543
|
+
// Execute a simple query
|
|
544
|
+
const queryResponse = await http.db.$post({
|
|
545
|
+
json: {
|
|
546
|
+
query: "SELECT 1 as test",
|
|
547
|
+
params: [],
|
|
548
|
+
},
|
|
549
|
+
});
|
|
550
|
+
expect(queryResponse.status).toBe(200);
|
|
551
|
+
|
|
552
|
+
const queryData = await queryResponse.json();
|
|
553
|
+
expect(queryData).toHaveProperty("result");
|
|
554
|
+
} else {
|
|
555
|
+
// If database is not enabled, the POST should return enabled: false
|
|
556
|
+
const queryResponse = await http.db.$post({
|
|
557
|
+
json: {
|
|
558
|
+
query: "SELECT 1 as test",
|
|
559
|
+
params: [],
|
|
560
|
+
},
|
|
561
|
+
});
|
|
562
|
+
expect(queryResponse.status).toBe(200);
|
|
563
|
+
|
|
564
|
+
const queryData = await queryResponse.json();
|
|
565
|
+
expect(queryData).toEqual({ enabled: false });
|
|
566
|
+
}
|
|
567
|
+
});
|
|
568
|
+
});
|
|
569
|
+
});
|
|
570
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import type { DriverTestConfig } from "../mod";
|
|
3
|
+
import { setupDriverTest } from "../utils";
|
|
4
|
+
|
|
5
|
+
export function runActorMetadataTests(driverTestConfig: DriverTestConfig) {
|
|
6
|
+
describe("Actor Metadata Tests", () => {
|
|
7
|
+
describe("Actor Name", () => {
|
|
8
|
+
test("should provide access to actor name", async (c) => {
|
|
9
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
10
|
+
|
|
11
|
+
// Get the actor name
|
|
12
|
+
const handle = client.metadataActor.getOrCreate();
|
|
13
|
+
const actorName = await handle.getActorName();
|
|
14
|
+
|
|
15
|
+
// Verify it matches the expected name
|
|
16
|
+
expect(actorName).toBe("metadataActor");
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test("should preserve actor name in state during onStart", async (c) => {
|
|
20
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
21
|
+
|
|
22
|
+
// Get the stored actor name
|
|
23
|
+
const handle = client.metadataActor.getOrCreate();
|
|
24
|
+
const storedName = await handle.getStoredActorName();
|
|
25
|
+
|
|
26
|
+
// Verify it was stored correctly
|
|
27
|
+
expect(storedName).toBe("metadataActor");
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe("Actor Tags", () => {
|
|
32
|
+
test("should provide access to tags", async (c) => {
|
|
33
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
34
|
+
|
|
35
|
+
// Create actor and set up test tags
|
|
36
|
+
const handle = client.metadataActor.getOrCreate();
|
|
37
|
+
await handle.setupTestTags({
|
|
38
|
+
env: "test",
|
|
39
|
+
purpose: "metadata-test",
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Get the tags
|
|
43
|
+
const tags = await handle.getTags();
|
|
44
|
+
|
|
45
|
+
// Verify the tags are accessible
|
|
46
|
+
expect(tags).toHaveProperty("env");
|
|
47
|
+
expect(tags.env).toBe("test");
|
|
48
|
+
expect(tags).toHaveProperty("purpose");
|
|
49
|
+
expect(tags.purpose).toBe("metadata-test");
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("should allow accessing individual tags", async (c) => {
|
|
53
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
54
|
+
|
|
55
|
+
// Create actor and set up test tags
|
|
56
|
+
const handle = client.metadataActor.getOrCreate();
|
|
57
|
+
await handle.setupTestTags({
|
|
58
|
+
category: "test-actor",
|
|
59
|
+
version: "1.0",
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Get individual tags
|
|
63
|
+
const category = await handle.getTag("category");
|
|
64
|
+
const version = await handle.getTag("version");
|
|
65
|
+
const nonexistent = await handle.getTag("nonexistent");
|
|
66
|
+
|
|
67
|
+
// Verify the tag values
|
|
68
|
+
expect(category).toBe("test-actor");
|
|
69
|
+
expect(version).toBe("1.0");
|
|
70
|
+
expect(nonexistent).toBeNull();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe("Metadata Structure", () => {
|
|
75
|
+
test("should provide complete metadata object", async (c) => {
|
|
76
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
77
|
+
|
|
78
|
+
// Create actor and set up test metadata
|
|
79
|
+
const handle = client.metadataActor.getOrCreate();
|
|
80
|
+
await handle.setupTestTags({ type: "metadata-test" });
|
|
81
|
+
await handle.setupTestRegion("us-west-1");
|
|
82
|
+
|
|
83
|
+
// Get all metadata
|
|
84
|
+
const metadata = await handle.getMetadata();
|
|
85
|
+
|
|
86
|
+
// Verify structure of metadata
|
|
87
|
+
expect(metadata).toHaveProperty("name");
|
|
88
|
+
expect(metadata.name).toBe("metadataActor");
|
|
89
|
+
|
|
90
|
+
expect(metadata).toHaveProperty("tags");
|
|
91
|
+
expect(metadata.tags).toHaveProperty("type");
|
|
92
|
+
expect(metadata.tags.type).toBe("metadata-test");
|
|
93
|
+
|
|
94
|
+
// Region should be set to our test value
|
|
95
|
+
expect(metadata).toHaveProperty("region");
|
|
96
|
+
expect(metadata.region).toBe("us-west-1");
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
describe("Region Information", () => {
|
|
101
|
+
test("should retrieve region information", async (c) => {
|
|
102
|
+
const { client } = await setupDriverTest(c, driverTestConfig);
|
|
103
|
+
|
|
104
|
+
// Create actor and set up test region
|
|
105
|
+
const handle = client.metadataActor.getOrCreate();
|
|
106
|
+
await handle.setupTestRegion("eu-central-1");
|
|
107
|
+
|
|
108
|
+
// Get the region
|
|
109
|
+
const region = await handle.getRegion();
|
|
110
|
+
|
|
111
|
+
// Verify the region is set correctly
|
|
112
|
+
expect(region).toBe("eu-central-1");
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|