rivetkit 2.0.6 → 2.0.7-rc.1

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.
Files changed (170) hide show
  1. package/dist/schemas/actor-persist/v1.ts +0 -6
  2. package/dist/tsup/actor-router-consts-B3Lu87yJ.d.cts +28 -0
  3. package/dist/tsup/actor-router-consts-B3Lu87yJ.d.ts +28 -0
  4. package/dist/tsup/{chunk-MRRT2CZD.cjs → chunk-3MBP4WNC.cjs} +7 -7
  5. package/dist/tsup/{chunk-MRRT2CZD.cjs.map → chunk-3MBP4WNC.cjs.map} +1 -1
  6. package/dist/tsup/{chunk-TWGATZ3X.cjs → chunk-3Y45CIF4.cjs} +922 -872
  7. package/dist/tsup/chunk-3Y45CIF4.cjs.map +1 -0
  8. package/dist/tsup/chunk-4GP7BZSR.js +102 -0
  9. package/dist/tsup/chunk-4GP7BZSR.js.map +1 -0
  10. package/dist/tsup/{chunk-UFWAK3X2.cjs → chunk-5ZOHIKWG.cjs} +660 -385
  11. package/dist/tsup/chunk-5ZOHIKWG.cjs.map +1 -0
  12. package/dist/tsup/{chunk-5JBFVV4C.cjs → chunk-6EUWRXLT.cjs} +21 -7
  13. package/dist/tsup/chunk-6EUWRXLT.cjs.map +1 -0
  14. package/dist/tsup/{chunk-UTI5NCES.cjs → chunk-6OVKCDSH.cjs} +6 -6
  15. package/dist/tsup/{chunk-UTI5NCES.cjs.map → chunk-6OVKCDSH.cjs.map} +1 -1
  16. package/dist/tsup/{chunk-VPV4MWXR.js → chunk-7N56ZUC7.js} +3 -3
  17. package/dist/tsup/{chunk-DIAYNQTE.cjs → chunk-B3TLRM4Q.cjs} +12 -12
  18. package/dist/tsup/{chunk-DIAYNQTE.cjs.map → chunk-B3TLRM4Q.cjs.map} +1 -1
  19. package/dist/tsup/{chunk-4CKHQRXG.js → chunk-BW5DPM6Z.js} +515 -240
  20. package/dist/tsup/chunk-BW5DPM6Z.js.map +1 -0
  21. package/dist/tsup/{chunk-NTCUGYSD.cjs → chunk-DFS77KAA.cjs} +34 -31
  22. package/dist/tsup/chunk-DFS77KAA.cjs.map +1 -0
  23. package/dist/tsup/{chunk-VCEHU56K.js → chunk-E4UVJKSV.js} +2 -2
  24. package/dist/tsup/chunk-G4ABMAQY.cjs +102 -0
  25. package/dist/tsup/chunk-G4ABMAQY.cjs.map +1 -0
  26. package/dist/tsup/{chunk-ZYLTS2EM.js → chunk-GZVBFXBI.js} +2 -2
  27. package/dist/tsup/{chunk-W6LN7AF5.js → chunk-HPT3I7UU.js} +866 -816
  28. package/dist/tsup/chunk-HPT3I7UU.js.map +1 -0
  29. package/dist/tsup/{chunk-7OUKNSTU.js → chunk-JD54PXWP.js} +17 -14
  30. package/dist/tsup/chunk-JD54PXWP.js.map +1 -0
  31. package/dist/tsup/{chunk-KG3C7MKR.cjs → chunk-K4ENQCC4.cjs} +3 -3
  32. package/dist/tsup/{chunk-KG3C7MKR.cjs.map → chunk-K4ENQCC4.cjs.map} +1 -1
  33. package/dist/tsup/{chunk-WC2PSJWN.js → chunk-PUSQNDJG.js} +2 -2
  34. package/dist/tsup/{chunk-RGQR2J7S.js → chunk-RVP5RUSC.js} +20 -6
  35. package/dist/tsup/chunk-RVP5RUSC.js.map +1 -0
  36. package/dist/tsup/{chunk-TCUI5JFE.cjs → chunk-SAZCNSVY.cjs} +45 -18
  37. package/dist/tsup/chunk-SAZCNSVY.cjs.map +1 -0
  38. package/dist/tsup/{chunk-G75SVQON.js → chunk-SBKRVQS2.js} +9 -5
  39. package/dist/tsup/chunk-SBKRVQS2.js.map +1 -0
  40. package/dist/tsup/{chunk-6P6RA47N.cjs → chunk-TZGUSEIJ.cjs} +14 -10
  41. package/dist/tsup/chunk-TZGUSEIJ.cjs.map +1 -0
  42. package/dist/tsup/{chunk-2K3JMDAN.js → chunk-YQ4XQYPM.js} +40 -13
  43. package/dist/tsup/chunk-YQ4XQYPM.js.map +1 -0
  44. package/dist/tsup/client/mod.cjs +9 -9
  45. package/dist/tsup/client/mod.d.cts +7 -8
  46. package/dist/tsup/client/mod.d.ts +7 -8
  47. package/dist/tsup/client/mod.js +8 -8
  48. package/dist/tsup/common/log.cjs +3 -3
  49. package/dist/tsup/common/log.js +2 -2
  50. package/dist/tsup/common/websocket.cjs +4 -4
  51. package/dist/tsup/common/websocket.js +3 -3
  52. package/dist/tsup/{connection-BLemxi4f.d.ts → conn-DCSQgIlw.d.ts} +1605 -1353
  53. package/dist/tsup/{connection-CpDIydXf.d.cts → conn-DdzHTm2E.d.cts} +1605 -1353
  54. package/dist/tsup/driver-helpers/mod.cjs +31 -5
  55. package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
  56. package/dist/tsup/driver-helpers/mod.d.cts +7 -8
  57. package/dist/tsup/driver-helpers/mod.d.ts +7 -8
  58. package/dist/tsup/driver-helpers/mod.js +33 -7
  59. package/dist/tsup/driver-test-suite/mod.cjs +317 -222
  60. package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
  61. package/dist/tsup/driver-test-suite/mod.d.cts +7 -7
  62. package/dist/tsup/driver-test-suite/mod.d.ts +7 -7
  63. package/dist/tsup/driver-test-suite/mod.js +582 -487
  64. package/dist/tsup/driver-test-suite/mod.js.map +1 -1
  65. package/dist/tsup/inspector/mod.cjs +16 -6
  66. package/dist/tsup/inspector/mod.cjs.map +1 -1
  67. package/dist/tsup/inspector/mod.d.cts +34 -7
  68. package/dist/tsup/inspector/mod.d.ts +34 -7
  69. package/dist/tsup/inspector/mod.js +17 -7
  70. package/dist/tsup/mod.cjs +10 -20
  71. package/dist/tsup/mod.cjs.map +1 -1
  72. package/dist/tsup/mod.d.cts +9 -7
  73. package/dist/tsup/mod.d.ts +9 -7
  74. package/dist/tsup/mod.js +9 -19
  75. package/dist/tsup/test/mod.cjs +11 -11
  76. package/dist/tsup/test/mod.d.cts +6 -7
  77. package/dist/tsup/test/mod.d.ts +6 -7
  78. package/dist/tsup/test/mod.js +10 -10
  79. package/dist/tsup/utils.cjs +4 -2
  80. package/dist/tsup/utils.cjs.map +1 -1
  81. package/dist/tsup/utils.d.cts +11 -1
  82. package/dist/tsup/utils.d.ts +11 -1
  83. package/dist/tsup/utils.js +3 -1
  84. package/package.json +8 -4
  85. package/src/actor/action.ts +1 -1
  86. package/src/actor/config.ts +1 -1
  87. package/src/actor/conn-drivers.ts +205 -0
  88. package/src/actor/conn-socket.ts +6 -0
  89. package/src/actor/{connection.ts → conn.ts} +78 -84
  90. package/src/actor/context.ts +1 -1
  91. package/src/actor/driver.ts +4 -43
  92. package/src/actor/instance.ts +162 -86
  93. package/src/actor/mod.ts +1 -11
  94. package/src/actor/persisted.ts +2 -5
  95. package/src/actor/protocol/old.ts +1 -1
  96. package/src/actor/router-endpoints.ts +142 -106
  97. package/src/actor/router.ts +81 -45
  98. package/src/actor/utils.ts +5 -1
  99. package/src/client/actor-conn.ts +154 -23
  100. package/src/client/client.ts +1 -1
  101. package/src/client/config.ts +7 -0
  102. package/src/common/actor-router-consts.ts +29 -8
  103. package/src/common/router.ts +2 -1
  104. package/src/common/versioned-data.ts +5 -5
  105. package/src/driver-helpers/mod.ts +14 -1
  106. package/src/driver-test-suite/mod.ts +11 -2
  107. package/src/driver-test-suite/test-inline-client-driver.ts +36 -18
  108. package/src/driver-test-suite/tests/actor-conn-state.ts +66 -22
  109. package/src/driver-test-suite/tests/actor-conn.ts +65 -126
  110. package/src/driver-test-suite/tests/actor-reconnect.ts +160 -0
  111. package/src/driver-test-suite/tests/actor-sleep.ts +0 -1
  112. package/src/driver-test-suite/tests/raw-websocket.ts +0 -35
  113. package/src/driver-test-suite/utils.ts +3 -3
  114. package/src/drivers/default.ts +8 -7
  115. package/src/drivers/engine/actor-driver.ts +53 -31
  116. package/src/drivers/engine/config.ts +4 -0
  117. package/src/drivers/file-system/actor.ts +0 -6
  118. package/src/drivers/file-system/global-state.ts +3 -14
  119. package/src/drivers/file-system/manager.ts +12 -8
  120. package/src/inspector/actor.ts +4 -3
  121. package/src/inspector/config.ts +10 -1
  122. package/src/inspector/mod.ts +1 -0
  123. package/src/inspector/utils.ts +23 -4
  124. package/src/manager/driver.ts +11 -1
  125. package/src/manager/gateway.ts +407 -0
  126. package/src/manager/router.ts +269 -468
  127. package/src/manager-api/actors.ts +61 -0
  128. package/src/manager-api/common.ts +4 -0
  129. package/src/mod.ts +1 -1
  130. package/src/registry/mod.ts +119 -10
  131. package/src/remote-manager-driver/actor-http-client.ts +30 -19
  132. package/src/remote-manager-driver/actor-websocket-client.ts +43 -16
  133. package/src/remote-manager-driver/api-endpoints.ts +19 -21
  134. package/src/remote-manager-driver/api-utils.ts +10 -1
  135. package/src/remote-manager-driver/mod.ts +51 -48
  136. package/src/remote-manager-driver/ws-proxy.ts +2 -9
  137. package/src/test/mod.ts +6 -2
  138. package/src/utils.ts +21 -2
  139. package/dist/tsup/actor-router-consts-BK6arfy8.d.cts +0 -17
  140. package/dist/tsup/actor-router-consts-BK6arfy8.d.ts +0 -17
  141. package/dist/tsup/chunk-2K3JMDAN.js.map +0 -1
  142. package/dist/tsup/chunk-42I3OZ3Q.js +0 -15
  143. package/dist/tsup/chunk-42I3OZ3Q.js.map +0 -1
  144. package/dist/tsup/chunk-4CKHQRXG.js.map +0 -1
  145. package/dist/tsup/chunk-5JBFVV4C.cjs.map +0 -1
  146. package/dist/tsup/chunk-6P6RA47N.cjs.map +0 -1
  147. package/dist/tsup/chunk-7OUKNSTU.js.map +0 -1
  148. package/dist/tsup/chunk-G75SVQON.js.map +0 -1
  149. package/dist/tsup/chunk-KUPQZYUQ.cjs +0 -15
  150. package/dist/tsup/chunk-KUPQZYUQ.cjs.map +0 -1
  151. package/dist/tsup/chunk-NTCUGYSD.cjs.map +0 -1
  152. package/dist/tsup/chunk-RGQR2J7S.js.map +0 -1
  153. package/dist/tsup/chunk-TCUI5JFE.cjs.map +0 -1
  154. package/dist/tsup/chunk-TWGATZ3X.cjs.map +0 -1
  155. package/dist/tsup/chunk-UFWAK3X2.cjs.map +0 -1
  156. package/dist/tsup/chunk-W6LN7AF5.js.map +0 -1
  157. package/dist/tsup/common-CXCe7s6i.d.cts +0 -218
  158. package/dist/tsup/common-CXCe7s6i.d.ts +0 -218
  159. package/src/actor/generic-conn-driver.ts +0 -246
  160. package/src/common/fake-event-source.ts +0 -267
  161. package/src/manager-api/routes/actors-create.ts +0 -16
  162. package/src/manager-api/routes/actors-delete.ts +0 -4
  163. package/src/manager-api/routes/actors-get-by-id.ts +0 -7
  164. package/src/manager-api/routes/actors-get-or-create-by-id.ts +0 -29
  165. package/src/manager-api/routes/actors-get.ts +0 -7
  166. package/src/manager-api/routes/common.ts +0 -18
  167. /package/dist/tsup/{chunk-VPV4MWXR.js.map → chunk-7N56ZUC7.js.map} +0 -0
  168. /package/dist/tsup/{chunk-VCEHU56K.js.map → chunk-E4UVJKSV.js.map} +0 -0
  169. /package/dist/tsup/{chunk-ZYLTS2EM.js.map → chunk-GZVBFXBI.js.map} +0 -0
  170. /package/dist/tsup/{chunk-WC2PSJWN.js.map → chunk-PUSQNDJG.js.map} +0 -0
@@ -0,0 +1,61 @@
1
+ import { z } from "zod";
2
+ import { RivetIdSchema } from "./common";
3
+
4
+ export const ActorSchema = z.object({
5
+ actor_id: RivetIdSchema,
6
+ name: z.string(),
7
+ key: z.string(),
8
+ namespace_id: RivetIdSchema,
9
+ runner_name_selector: z.string(),
10
+ create_ts: z.number(),
11
+ connectable_ts: z.number().nullable().optional(),
12
+ destroy_ts: z.number().nullable().optional(),
13
+ sleep_ts: z.number().nullable().optional(),
14
+ start_ts: z.number().nullable().optional(),
15
+ });
16
+ export type Actor = z.infer<typeof ActorSchema>;
17
+
18
+ // MARK: GET /actors
19
+ export const ActorsListResponseSchema = z.object({
20
+ actors: z.array(ActorSchema),
21
+ });
22
+ export type ActorsListResponse = z.infer<typeof ActorsListResponseSchema>;
23
+
24
+ // MARK: POST /actors
25
+ export const ActorsCreateRequestSchema = z.object({
26
+ name: z.string(),
27
+ runner_name_selector: z.string(),
28
+ crash_policy: z.string(),
29
+ key: z.string().nullable().optional(),
30
+ input: z.string().nullable().optional(),
31
+ });
32
+ export type ActorsCreateRequest = z.infer<typeof ActorsCreateRequestSchema>;
33
+
34
+ export const ActorsCreateResponseSchema = z.object({
35
+ actor: ActorSchema,
36
+ });
37
+ export type ActorsCreateResponse = z.infer<typeof ActorsCreateResponseSchema>;
38
+
39
+ // MARK: PUT /actors
40
+ export const ActorsGetOrCreateRequestSchema = z.object({
41
+ name: z.string(),
42
+ key: z.string(),
43
+ runner_name_selector: z.string(),
44
+ crash_policy: z.string(),
45
+ input: z.string().nullable().optional(),
46
+ });
47
+ export type ActorsGetOrCreateRequest = z.infer<
48
+ typeof ActorsGetOrCreateRequestSchema
49
+ >;
50
+
51
+ export const ActorsGetOrCreateResponseSchema = z.object({
52
+ actor: ActorSchema,
53
+ created: z.boolean(),
54
+ });
55
+ export type ActorsGetOrCreateResponse = z.infer<
56
+ typeof ActorsGetOrCreateResponseSchema
57
+ >;
58
+
59
+ // MARK: DELETE /actors/{}
60
+ export const ActorsDeleteResponseSchema = z.object({});
61
+ export type ActorsDeleteResponse = z.infer<typeof ActorsDeleteResponseSchema>;
@@ -0,0 +1,4 @@
1
+ import { z } from "zod";
2
+
3
+ export const RivetIdSchema = z.string();
4
+ export type RivetId = z.infer<typeof RivetIdSchema>;
package/src/mod.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { generateConnId, generateConnToken } from "@/actor/connection";
1
+ export { generateConnId, generateConnToken } from "@/actor/conn";
2
2
  export * from "@/actor/mod";
3
3
  export {
4
4
  type AnyClient,
@@ -1,7 +1,12 @@
1
1
  import { type Client, createClientWithDriver } from "@/client/client";
2
2
  import { configureBaseLogger, configureDefaultLogger } from "@/common/log";
3
+ import type { ActorDriver } from "@/driver-helpers/mod";
3
4
  import { chooseDefaultDriver } from "@/drivers/default";
4
- import { getInspectorUrl } from "@/inspector/utils";
5
+ import {
6
+ configureInspectorAccessToken,
7
+ getInspectorUrl,
8
+ isInspectorEnabled,
9
+ } from "@/inspector/utils";
5
10
  import { createManagerRouter } from "@/manager/router";
6
11
  import pkg from "../../package.json" with { type: "json" };
7
12
  import {
@@ -58,11 +63,11 @@ export class Registry<A extends RegistryActors> {
58
63
 
59
64
  // TODO: Find cleaner way of disabling by default
60
65
  if (driver.name === "engine") {
61
- config.inspector.enabled = false;
66
+ config.inspector.enabled = { manager: false, actor: true };
62
67
  config.disableServer = true;
63
68
  }
64
69
  if (driver.name === "cloudflare-workers") {
65
- config.inspector.enabled = false;
70
+ config.inspector.enabled = { manager: false, actor: true };
66
71
  config.disableServer = true;
67
72
  config.disableActorDriver = true;
68
73
  config.noWelcome = true;
@@ -76,13 +81,110 @@ export class Registry<A extends RegistryActors> {
76
81
 
77
82
  // Create router
78
83
  const managerDriver = driver.manager(this.#config, config);
84
+ configureInspectorAccessToken(config, managerDriver);
85
+
86
+ // Create client
87
+ const client = createClientWithDriver<this>(managerDriver, config);
88
+
89
+ const driverLog = managerDriver.extraStartupLog?.() ?? {};
90
+ logger().info({
91
+ msg: "rivetkit ready",
92
+ driver: driver.name,
93
+ definitions: Object.keys(this.#config.use).length,
94
+ ...driverLog,
95
+ });
96
+ if (isInspectorEnabled(config, "manager") && managerDriver.inspector) {
97
+ logger().info({ msg: "inspector ready", url: getInspectorUrl(config) });
98
+ }
99
+
100
+ // Print welcome information
101
+ if (!config.noWelcome) {
102
+ const displayInfo = managerDriver.displayInformation();
103
+ console.log();
104
+ console.log(` RivetKit ${pkg.version} (${displayInfo.name})`);
105
+ console.log(` - Endpoint: http://127.0.0.1:6420`);
106
+ for (const [k, v] of Object.entries(displayInfo.properties)) {
107
+ const padding = " ".repeat(Math.max(0, 13 - k.length));
108
+ console.log(` - ${k}:${padding}${v}`);
109
+ }
110
+ if (isInspectorEnabled(config, "manager") && managerDriver.inspector) {
111
+ console.log(` - Inspector: ${getInspectorUrl(config)}`);
112
+ }
113
+ console.log();
114
+ }
115
+
116
+ // HACK: We need to find a better way to let the driver itself decide when to start the actor driver
117
+ // Create runner
118
+ //
119
+ // Even though we do not use the return value, this is required to start the code that will handle incoming actors
120
+ if (!config.disableActorDriver) {
121
+ const _actorDriver = driver.actor(
122
+ this.#config,
123
+ config,
124
+ managerDriver,
125
+ client,
126
+ );
127
+ }
128
+
79
129
  const { router: hono } = createManagerRouter(
80
130
  this.#config,
81
131
  config,
82
132
  managerDriver,
83
- false,
133
+ undefined,
84
134
  );
85
135
 
136
+ // Start server
137
+ if (!config.disableServer) {
138
+ (async () => {
139
+ const out = await crossPlatformServe(hono, undefined);
140
+ upgradeWebSocket = out.upgradeWebSocket;
141
+ })();
142
+ }
143
+
144
+ return {
145
+ client,
146
+ fetch: hono.fetch.bind(hono),
147
+ };
148
+ }
149
+
150
+ public startServerless(inputConfig?: RunConfigInput): ServerOutput<this> {
151
+ const config = RunConfigSchema.parse(inputConfig);
152
+
153
+ // Configure logger
154
+ if (config.logging?.baseLogger) {
155
+ // Use provided base logger
156
+ configureBaseLogger(config.logging.baseLogger);
157
+ } else {
158
+ // Configure default logger with log level from config
159
+ // getPinoLevel will handle env variable priority
160
+ configureDefaultLogger(config.logging?.level);
161
+ }
162
+
163
+ // Choose the driver based on configuration
164
+ const driver = chooseDefaultDriver(config);
165
+
166
+ // TODO: Find cleaner way of disabling by default
167
+ if (driver.name === "engine") {
168
+ config.inspector.enabled = false;
169
+ config.disableServer = true;
170
+ config.disableActorDriver = true;
171
+ }
172
+ if (driver.name === "cloudflare-workers") {
173
+ config.inspector.enabled = false;
174
+ config.disableServer = true;
175
+ config.disableActorDriver = true;
176
+ config.noWelcome = true;
177
+ }
178
+
179
+ // Configure getUpgradeWebSocket lazily so we can assign it in crossPlatformServe
180
+ let upgradeWebSocket: any;
181
+ if (!config.getUpgradeWebSocket) {
182
+ config.getUpgradeWebSocket = () => upgradeWebSocket!;
183
+ }
184
+
185
+ // Create router
186
+ const managerDriver = driver.manager(this.#config, config);
187
+
86
188
  // Create client
87
189
  const client = createClientWithDriver<this>(managerDriver, config);
88
190
 
@@ -113,19 +215,26 @@ export class Registry<A extends RegistryActors> {
113
215
  console.log();
114
216
  }
115
217
 
218
+ let serverlessActorDriverBuilder: (() => ActorDriver) | undefined = () => {
219
+ return driver.actor(this.#config, config, managerDriver, client);
220
+ };
221
+
116
222
  // HACK: We need to find a better way to let the driver itself decide when to start the actor driver
117
223
  // Create runner
118
224
  //
119
225
  // Even though we do not use the return value, this is required to start the code that will handle incoming actors
120
226
  if (!config.disableActorDriver) {
121
- const _actorDriver = driver.actor(
122
- this.#config,
123
- config,
124
- managerDriver,
125
- client,
126
- );
227
+ const _actorDriver = serverlessActorDriverBuilder();
228
+ serverlessActorDriverBuilder = undefined;
127
229
  }
128
230
 
231
+ const { router: hono } = createManagerRouter(
232
+ this.#config,
233
+ config,
234
+ managerDriver,
235
+ serverlessActorDriverBuilder,
236
+ );
237
+
129
238
  // Start server
130
239
  if (!config.disableServer) {
131
240
  (async () => {
@@ -1,4 +1,9 @@
1
1
  import type { ClientConfig } from "@/client/config";
2
+ import {
3
+ HEADER_RIVET_ACTOR,
4
+ HEADER_RIVET_TARGET,
5
+ HEADER_RIVET_TOKEN,
6
+ } from "@/common/actor-router-consts";
2
7
  import { combineUrlPath } from "@/utils";
3
8
  import { getEndpoint } from "./api-utils";
4
9
 
@@ -14,30 +19,29 @@ export async function sendHttpRequestToActor(
14
19
 
15
20
  // Handle body properly based on method and presence
16
21
  let bodyToSend: ArrayBuffer | null = null;
17
- const guardHeaders = buildGuardHeadersForHttp(actorRequest, actorId);
22
+ const guardHeaders = buildGuardHeadersForHttp(
23
+ runConfig,
24
+ actorRequest,
25
+ actorId,
26
+ );
18
27
 
19
- if (
20
- actorRequest.body &&
21
- actorRequest.method !== "GET" &&
22
- actorRequest.method !== "HEAD"
23
- ) {
28
+ if (actorRequest.method !== "GET" && actorRequest.method !== "HEAD") {
24
29
  if (actorRequest.bodyUsed) {
25
30
  throw new Error("Request body has already been consumed");
26
31
  }
27
32
 
28
33
  // TODO: This buffers the entire request in memory every time. We
29
34
  // need to properly implement streaming bodies.
30
- // Clone and read the body to ensure it can be sent
31
- const clonedRequest = actorRequest.clone();
32
- bodyToSend = await clonedRequest.arrayBuffer();
35
+ const reqBody = await actorRequest.arrayBuffer();
33
36
 
34
- // If this is a streaming request, we need to convert the headers
35
- // for the basic array buffer
36
- guardHeaders.delete("transfer-encoding");
37
- guardHeaders.set(
38
- "content-length",
39
- String((bodyToSend as ArrayBuffer).byteLength),
40
- );
37
+ if (reqBody.byteLength !== 0) {
38
+ bodyToSend = reqBody;
39
+
40
+ // If this is a streaming request, we need to convert the headers
41
+ // for the basic array buffer
42
+ guardHeaders.delete("transfer-encoding");
43
+ guardHeaders.set("content-length", String(bodyToSend.byteLength));
44
+ }
41
45
  }
42
46
 
43
47
  const guardRequest = new Request(guardUrl, {
@@ -58,6 +62,7 @@ function mutableResponse(fetchRes: Response): Response {
58
62
  }
59
63
 
60
64
  function buildGuardHeadersForHttp(
65
+ runConfig: ClientConfig,
61
66
  actorRequest: Request,
62
67
  actorId: string,
63
68
  ): Headers {
@@ -66,9 +71,15 @@ function buildGuardHeadersForHttp(
66
71
  for (const [key, value] of actorRequest.headers.entries()) {
67
72
  headers.set(key, value);
68
73
  }
74
+ // Add extra headers from config
75
+ for (const [key, value] of Object.entries(runConfig.headers)) {
76
+ headers.set(key, value);
77
+ }
69
78
  // Add guard-specific headers
70
- headers.set("x-rivet-target", "actor");
71
- headers.set("x-rivet-actor", actorId);
72
- headers.set("x-rivet-port", "main");
79
+ headers.set(HEADER_RIVET_TARGET, "actor");
80
+ headers.set(HEADER_RIVET_ACTOR, actorId);
81
+ if (runConfig.token) {
82
+ headers.set(HEADER_RIVET_TOKEN, runConfig.token);
83
+ }
73
84
  return headers;
74
85
  }
@@ -1,8 +1,15 @@
1
1
  import type { ClientConfig } from "@/client/config";
2
2
  import {
3
- HEADER_AUTH_DATA,
4
3
  HEADER_CONN_PARAMS,
5
4
  HEADER_ENCODING,
5
+ WS_PROTOCOL_ACTOR,
6
+ WS_PROTOCOL_CONN_ID,
7
+ WS_PROTOCOL_CONN_PARAMS,
8
+ WS_PROTOCOL_CONN_TOKEN,
9
+ WS_PROTOCOL_ENCODING,
10
+ WS_PROTOCOL_STANDARD as WS_PROTOCOL_RIVETKIT,
11
+ WS_PROTOCOL_TARGET,
12
+ WS_PROTOCOL_TOKEN,
6
13
  } from "@/common/actor-router-consts";
7
14
  import { importWebSocket } from "@/common/websocket";
8
15
  import type { Encoding, UniversalWebSocket } from "@/mod";
@@ -16,6 +23,8 @@ export async function openWebSocketToActor(
16
23
  actorId: string,
17
24
  encoding: Encoding,
18
25
  params: unknown,
26
+ connId?: string,
27
+ connToken?: string,
19
28
  ): Promise<UniversalWebSocket> {
20
29
  const WebSocket = await importWebSocket();
21
30
 
@@ -31,9 +40,17 @@ export async function openWebSocketToActor(
31
40
  });
32
41
 
33
42
  // Create WebSocket connection
34
- const ws = new WebSocket(guardUrl, {
35
- headers: buildGuardHeadersForWebSocket(actorId, encoding, params),
36
- });
43
+ const ws = new WebSocket(
44
+ guardUrl,
45
+ buildWebSocketProtocols(
46
+ runConfig,
47
+ actorId,
48
+ encoding,
49
+ params,
50
+ connId,
51
+ connToken,
52
+ ),
53
+ );
37
54
 
38
55
  // Set binary type to arraybuffer for proper encoding support
39
56
  ws.binaryType = "arraybuffer";
@@ -43,22 +60,32 @@ export async function openWebSocketToActor(
43
60
  return ws as UniversalWebSocket;
44
61
  }
45
62
 
46
- export function buildGuardHeadersForWebSocket(
63
+ export function buildWebSocketProtocols(
64
+ runConfig: ClientConfig,
47
65
  actorId: string,
48
66
  encoding: Encoding,
49
67
  params?: unknown,
50
- authData?: unknown,
51
- ): Record<string, string> {
52
- const headers: Record<string, string> = {};
53
- headers["x-rivet-target"] = "actor";
54
- headers["x-rivet-actor"] = actorId;
55
- headers["x-rivet-port"] = "main";
56
- headers[HEADER_ENCODING] = encoding;
68
+ connId?: string,
69
+ connToken?: string,
70
+ ): string[] {
71
+ const protocols: string[] = [];
72
+ protocols.push(WS_PROTOCOL_RIVETKIT);
73
+ protocols.push(`${WS_PROTOCOL_TARGET}actor`);
74
+ protocols.push(`${WS_PROTOCOL_ACTOR}${actorId}`);
75
+ protocols.push(`${WS_PROTOCOL_ENCODING}${encoding}`);
76
+ if (runConfig.token) {
77
+ protocols.push(`${WS_PROTOCOL_TOKEN}${runConfig.token}`);
78
+ }
57
79
  if (params) {
58
- headers[HEADER_CONN_PARAMS] = JSON.stringify(params);
80
+ protocols.push(
81
+ `${WS_PROTOCOL_CONN_PARAMS}${encodeURIComponent(JSON.stringify(params))}`,
82
+ );
83
+ }
84
+ if (connId) {
85
+ protocols.push(`${WS_PROTOCOL_CONN_ID}${connId}`);
59
86
  }
60
- if (authData) {
61
- headers[HEADER_AUTH_DATA] = JSON.stringify(authData);
87
+ if (connToken) {
88
+ protocols.push(`${WS_PROTOCOL_CONN_TOKEN}${connToken}`);
62
89
  }
63
- return headers;
90
+ return protocols;
64
91
  }
@@ -3,52 +3,50 @@ import type { ClientConfig } from "@/client/client";
3
3
  import type {
4
4
  ActorsCreateRequest,
5
5
  ActorsCreateResponse,
6
- } from "@/manager-api/routes/actors-create";
7
- import type { ActorsDeleteResponse } from "@/manager-api/routes/actors-delete";
8
- import type { ActorsGetResponse } from "@/manager-api/routes/actors-get";
9
- import type { ActorsGetByIdResponse } from "@/manager-api/routes/actors-get-by-id";
10
- import type {
11
- ActorsGetOrCreateByIdRequest,
12
- ActorsGetOrCreateByIdResponse,
13
- } from "@/manager-api/routes/actors-get-or-create-by-id";
14
- import type { RivetId } from "@/manager-api/routes/common";
6
+ ActorsDeleteResponse,
7
+ ActorsGetOrCreateRequest,
8
+ ActorsGetOrCreateResponse,
9
+ ActorsListResponse,
10
+ } from "@/manager-api/actors";
11
+ import type { RivetId } from "@/manager-api/common";
15
12
  import { apiCall } from "./api-utils";
16
13
 
17
14
  // MARK: Get actor
18
15
  export async function getActor(
19
16
  config: ClientConfig,
17
+ name: string,
20
18
  actorId: RivetId,
21
- ): Promise<ActorsGetResponse> {
22
- return apiCall<never, ActorsGetResponse>(
19
+ ): Promise<ActorsListResponse> {
20
+ return apiCall<never, ActorsListResponse>(
23
21
  config,
24
22
  "GET",
25
- `/actors/${encodeURIComponent(actorId)}`,
23
+ `/actors?name=${name}&actor_ids=${encodeURIComponent(actorId)}`,
26
24
  );
27
25
  }
28
26
 
29
27
  // MARK: Get actor by id
30
- export async function getActorById(
28
+ export async function getActorByKey(
31
29
  config: ClientConfig,
32
30
  name: string,
33
31
  key: string[],
34
- ): Promise<ActorsGetByIdResponse> {
32
+ ): Promise<ActorsListResponse> {
35
33
  const serializedKey = serializeActorKey(key);
36
- return apiCall<never, ActorsGetByIdResponse>(
34
+ return apiCall<never, ActorsListResponse>(
37
35
  config,
38
36
  "GET",
39
- `/actors/by-id?name=${encodeURIComponent(name)}&key=${encodeURIComponent(serializedKey)}`,
37
+ `/actors?name=${encodeURIComponent(name)}&key=${encodeURIComponent(serializedKey)}`,
40
38
  );
41
39
  }
42
40
 
43
41
  // MARK: Get or create actor by id
44
- export async function getOrCreateActorById(
42
+ export async function getOrCreateActor(
45
43
  config: ClientConfig,
46
- request: ActorsGetOrCreateByIdRequest,
47
- ): Promise<ActorsGetOrCreateByIdResponse> {
48
- return apiCall<ActorsGetOrCreateByIdRequest, ActorsGetOrCreateByIdResponse>(
44
+ request: ActorsGetOrCreateRequest,
45
+ ): Promise<ActorsGetOrCreateResponse> {
46
+ return apiCall<ActorsGetOrCreateRequest, ActorsGetOrCreateResponse>(
49
47
  config,
50
48
  "PUT",
51
- `/actors/by-id`,
49
+ `/actors`,
52
50
  request,
53
51
  );
54
52
  }
@@ -33,10 +33,19 @@ export async function apiCall<TInput = unknown, TOutput = unknown>(
33
33
 
34
34
  logger().debug({ msg: "making api call", method, url });
35
35
 
36
+ const headers: Record<string, string> = {
37
+ ...config.headers,
38
+ };
39
+
40
+ // Add Authorization header if token is provided
41
+ if (config.token) {
42
+ headers.Authorization = `Bearer ${config.token}`;
43
+ }
44
+
36
45
  return await sendHttpRequest<TInput, TOutput>({
37
46
  method,
38
47
  url,
39
- headers: {},
48
+ headers,
40
49
  body,
41
50
  encoding: "json",
42
51
  skipParseResponse: false,