Skip to content

Commit 4b4b76b

Browse files
committed
refactor(rivetkit): restructure connection lifecycle contexts
1 parent af0bb93 commit 4b4b76b

File tree

24 files changed

+434
-594
lines changed

24 files changed

+434
-594
lines changed

examples/cursors-raw-websocket/src/backend/registry.ts

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/conn-params.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { actor } from "rivetkit";
22

33
export const counterWithParams = actor({
44
state: { count: 0, initializers: [] as string[] },
5-
createConnState: (c, opts, params: { name?: string }) => {
5+
createConnState: (c, params: { name?: string }) => {
66
return {
77
name: params.name || "anonymous",
88
};

rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/conn-state.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ export const connStateActor = actor({
1616
// Define connection state
1717
createConnState: (
1818
c,
19-
opts,
2019
params: { username?: string; role?: string; noCount?: boolean },
2120
): ConnState => {
2221
return {

rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/lifecycle.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ export const counterWithLifecycle = actor({
77
count: 0,
88
events: [] as string[],
99
},
10-
createConnState: (c, opts, params: ConnParams) => ({
10+
createConnState: (c, params: ConnParams) => ({
1111
joinTime: Date.now(),
1212
}),
1313
onWake: (c) => {
1414
c.state.events.push("onWake");
1515
},
16-
onBeforeConnect: (c, opts, params: ConnParams) => {
16+
onBeforeConnect: (c, params: ConnParams) => {
1717
if (params?.trackLifecycle) c.state.events.push("onBeforeConnect");
1818
},
1919
onConnect: (c, conn) => {

rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/raw-websocket.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export const rawWebSocketActor = actor({
55
connectionCount: 0,
66
messageCount: 0,
77
},
8-
onWebSocket(ctx, websocket, opts) {
8+
onWebSocket(ctx, websocket) {
99
ctx.state.connectionCount = ctx.state.connectionCount + 1;
1010
console.log(
1111
`[ACTOR] New connection, count: ${ctx.state.connectionCount}`,
@@ -51,15 +51,16 @@ export const rawWebSocketActor = actor({
5151
}),
5252
);
5353
} else if (parsed.type === "getRequestInfo") {
54+
throw "TODO";
5455
// Send back the request URL info
55-
websocket.send(
56-
JSON.stringify({
57-
type: "requestInfo",
58-
url: opts.request.url,
59-
pathname: new URL(opts.request.url).pathname,
60-
search: new URL(opts.request.url).search,
61-
}),
62-
);
56+
// websocket.send(
57+
// JSON.stringify({
58+
// type: "requestInfo",
59+
// url: opts.request.url,
60+
// pathname: new URL(opts.request.url).pathname,
61+
// search: new URL(opts.request.url).search,
62+
// }),
63+
// );
6364
} else {
6465
// Echo back
6566
websocket.send(data);
@@ -93,7 +94,7 @@ export const rawWebSocketActor = actor({
9394
});
9495

9596
export const rawWebSocketBinaryActor = actor({
96-
onWebSocket(ctx, websocket, opts) {
97+
onWebSocket(ctx, websocket) {
9798
// Handle binary data
9899
websocket.addEventListener("message", (event: any) => {
99100
const data = event.data;

rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/request-access.ts

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,19 @@ export const requestAccessActor = actor({
3131
requestHeaders: {} as Record<string, string>,
3232
},
3333
},
34-
createConnState: (c, { request }, params: { trackRequest?: boolean }) => {
34+
createConnState: (c, params: { trackRequest?: boolean }) => {
3535
// In createConnState, the state isn't available yet.
3636

3737
return {
3838
trackRequest: params?.trackRequest || false,
3939
requestInfo:
40-
params?.trackRequest && request
40+
params?.trackRequest && c.request
4141
? {
4242
hasRequest: true,
43-
requestUrl: request.url,
44-
requestMethod: request.method,
43+
requestUrl: c.request.url,
44+
requestMethod: c.request.method,
4545
requestHeaders: Object.fromEntries(
46-
request.headers.entries(),
46+
c.request.headers.entries(),
4747
),
4848
}
4949
: null,
@@ -55,16 +55,16 @@ export const requestAccessActor = actor({
5555
c.state.createConnStateRequest = conn.state.requestInfo;
5656
}
5757
},
58-
onBeforeConnect: (c, { request }, params) => {
58+
onBeforeConnect: (c, params) => {
5959
if (params?.trackRequest) {
60-
if (request) {
60+
if (c.request) {
6161
c.state.onBeforeConnectRequest.hasRequest = true;
62-
c.state.onBeforeConnectRequest.requestUrl = request.url;
63-
c.state.onBeforeConnectRequest.requestMethod = request.method;
62+
c.state.onBeforeConnectRequest.requestUrl = c.request.url;
63+
c.state.onBeforeConnectRequest.requestMethod = c.request.method;
6464

6565
// Store select headers
6666
const headers: Record<string, string> = {};
67-
request.headers.forEach((value, key) => {
67+
c.request.headers.forEach((value, key) => {
6868
headers[key] = value;
6969
});
7070
c.state.onBeforeConnectRequest.requestHeaders = headers;
@@ -101,15 +101,16 @@ export const requestAccessActor = actor({
101101
},
102102
);
103103
},
104-
onWebSocket: (c, websocket, { request }) => {
104+
onWebSocket: (c, websocket) => {
105+
if (!c.request) throw "Missing request";
105106
// Store request info
106107
c.state.onWebSocketRequest.hasRequest = true;
107-
c.state.onWebSocketRequest.requestUrl = request.url;
108-
c.state.onWebSocketRequest.requestMethod = request.method;
108+
c.state.onWebSocketRequest.requestUrl = c.request.url;
109+
c.state.onWebSocketRequest.requestMethod = c.request.method;
109110

110111
// Store select headers
111112
const headers: Record<string, string> = {};
112-
request.headers.forEach((value, key) => {
113+
c.request.headers.forEach((value, key) => {
113114
headers[key] = value;
114115
});
115116
c.state.onWebSocketRequest.requestHeaders = headers;
@@ -118,8 +119,8 @@ export const requestAccessActor = actor({
118119
websocket.send(
119120
JSON.stringify({
120121
hasRequest: true,
121-
requestUrl: request.url,
122-
requestMethod: request.method,
122+
requestUrl: c.request.url,
123+
requestMethod: c.request.method,
123124
requestHeaders: headers,
124125
}),
125126
);

rivetkit-typescript/packages/rivetkit/fixtures/driver-test-suite/sleep.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ export const sleepWithRawWebSocket = actor({
112112
onSleep: (c) => {
113113
c.state.sleepCount += 1;
114114
},
115-
onWebSocket: (c, websocket: UniversalWebSocket, opts) => {
115+
onWebSocket: (c, websocket: UniversalWebSocket) => {
116116
c.state.connectionCount += 1;
117117
c.log.info({
118118
msg: "websocket connected",

rivetkit-typescript/packages/rivetkit/src/actor/config.ts

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import type { UniversalWebSocket } from "@/common/websocket-interface";
33
import type { Conn } from "./conn/mod";
44
import type { ActionContext } from "./contexts/action";
55
import type { ActorContext } from "./contexts/actor";
6+
import type { CreateConnStateContext } from "./contexts/create-conn-state";
7+
import type { OnBeforeConnectContext } from "./contexts/on-before-connect";
8+
import type { OnConnectContext } from "./contexts/on-connect";
69
import type { RequestContext } from "./contexts/request";
710
import type { WebSocketContext } from "./contexts/websocket";
811
import type { AnyDatabaseProvider } from "./database";
@@ -113,15 +116,6 @@ export const ActorConfigSchema = z
113116
},
114117
);
115118

116-
export interface OnConnectOptions {
117-
/**
118-
* The request object associated with the connection.
119-
*
120-
* @experimental
121-
*/
122-
request?: Request;
123-
}
124-
125119
// Creates state config
126120
//
127121
// This must have only one or the other or else TState will not be able to be inferred
@@ -148,13 +142,12 @@ type CreateConnState<
148142
TConnState,
149143
TVars,
150144
TInput,
151-
TDatabase,
145+
TDatabase extends AnyDatabaseProvider,
152146
> =
153147
| { connState: TConnState }
154148
| {
155149
createConnState: (
156-
c: InitContext,
157-
opts: OnConnectOptions,
150+
c: CreateConnStateContext<TState, TVars, TInput, TDatabase>,
158151
params: TConnParams,
159152
) => TConnState | Promise<TConnState>;
160153
}
@@ -323,15 +316,7 @@ interface BaseActorConfig<
323316
* @throws Throw an error to reject the connection
324317
*/
325318
onBeforeConnect?: (
326-
c: ActorContext<
327-
TState,
328-
TConnParams,
329-
TConnState,
330-
TVars,
331-
TInput,
332-
TDatabase
333-
>,
334-
opts: OnConnectOptions,
319+
c: OnBeforeConnectContext<TState, TVars, TInput, TDatabase>,
335320
params: TConnParams,
336321
) => void | Promise<void>;
337322

@@ -345,14 +330,7 @@ interface BaseActorConfig<
345330
* @returns Void or a Promise that resolves when connection handling is complete
346331
*/
347332
onConnect?: (
348-
c: ActorContext<
349-
TState,
350-
TConnParams,
351-
TConnState,
352-
TVars,
353-
TInput,
354-
TDatabase
355-
>,
333+
c: OnConnectContext<TState, TVars, TInput, TDatabase>,
356334
conn: Conn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>,
357335
) => void | Promise<void>;
358336

@@ -446,7 +424,6 @@ interface BaseActorConfig<
446424
TDatabase
447425
>,
448426
websocket: UniversalWebSocket,
449-
opts: { request: Request },
450427
) => void | Promise<void>;
451428

452429
actions: TActions;

rivetkit-typescript/packages/rivetkit/src/actor/conn/drivers/websocket.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import type { CachedSerializer, Encoding } from "@/actor/protocol/serde";
55
import type * as protocol from "@/schemas/client-protocol/mod";
66
import { type ConnDriver, DriverReadyState } from "../driver";
77

8-
export type ConnDriverWebSocketState = {};
8+
export type ConnDriverWebSocketState = Record<never, never>;
99

1010
export function createWebSocketSocket(
1111
requestId: string,

0 commit comments

Comments
 (0)