@@ -24,6 +24,13 @@ import {
24
24
} from "./run-config" ;
25
25
import { crossPlatformServe } from "./serve" ;
26
26
27
+ export type ServerlessActorDriverBuilder = (
28
+ token ?: string ,
29
+ totalSlots ?: number ,
30
+ runnerName ?: string ,
31
+ namespace ?: string ,
32
+ ) => ActorDriver ;
33
+
27
34
interface ServerOutput < A extends Registry < any > > {
28
35
/** Client to communicate with the actors. */
29
36
client : Client < A > ;
@@ -72,6 +79,9 @@ export class Registry<A extends RegistryActors> {
72
79
config . disableActorDriver = true ;
73
80
config . noWelcome = true ;
74
81
}
82
+ if ( config . runnerKind === "serverless" ) {
83
+ config . disableActorDriver = true ;
84
+ }
75
85
76
86
// Configure getUpgradeWebSocket lazily so we can assign it in crossPlatformServe
77
87
let upgradeWebSocket : any ;
@@ -113,6 +123,7 @@ export class Registry<A extends RegistryActors> {
113
123
console . log ( ) ;
114
124
}
115
125
126
+ let serverlessActorDriverBuilder : undefined | ServerlessActorDriverBuilder ;
116
127
// HACK: We need to find a better way to let the driver itself decide when to start the actor driver
117
128
// Create runner
118
129
//
@@ -124,117 +135,22 @@ export class Registry<A extends RegistryActors> {
124
135
managerDriver ,
125
136
client ,
126
137
) ;
127
- }
128
-
129
- const { router : hono } = createManagerRouter (
130
- this . #config,
131
- config ,
132
- managerDriver ,
133
- undefined ,
134
- ) ;
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
138
} 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
-
188
- // Create client
189
- const client = createClientWithDriver < this> ( managerDriver , config ) ;
190
-
191
- const driverLog = managerDriver . extraStartupLog ?.( ) ?? { } ;
192
- logger ( ) . info ( {
193
- msg : "rivetkit ready" ,
194
- driver : driver . name ,
195
- definitions : Object . keys ( this . #config. use ) . length ,
196
- ...driverLog ,
197
- } ) ;
198
- if ( config . inspector ?. enabled && managerDriver . inspector ) {
199
- logger ( ) . info ( { msg : "inspector ready" , url : getInspectorUrl ( config ) } ) ;
200
- }
201
-
202
- // Print welcome information
203
- if ( ! config . noWelcome ) {
204
- const displayInfo = managerDriver . displayInformation ( ) ;
205
- console . log ( ) ;
206
- console . log ( ` RivetKit ${ pkg . version } (${ displayInfo . name } )` ) ;
207
- console . log ( ` - Endpoint: http://127.0.0.1:6420` ) ;
208
- for ( const [ k , v ] of Object . entries ( displayInfo . properties ) ) {
209
- const padding = " " . repeat ( Math . max ( 0 , 13 - k . length ) ) ;
210
- console . log ( ` - ${ k } :${ padding } ${ v } ` ) ;
211
- }
212
- if ( config . inspector ?. enabled && managerDriver . inspector ) {
213
- console . log ( ` - Inspector: ${ getInspectorUrl ( config ) } ` ) ;
214
- }
215
- console . log ( ) ;
216
- }
217
-
218
- let serverlessActorDriverBuilder :
219
- | ( ( token ?: string , totalSlots ?: number ) => ActorDriver )
220
- | undefined = (
221
- token : string | undefined ,
222
- totalSlots : number | undefined ,
223
- ) => {
224
- // Override config
225
- if ( token ) config . token = token ;
226
- if ( totalSlots ) config . totalSlots = totalSlots ;
227
-
228
- return driver . actor ( this . #config, config , managerDriver , client ) ;
229
- } ;
230
-
231
- // HACK: We need to find a better way to let the driver itself decide when to start the actor driver
232
- // Create runner
233
- //
234
- // Even though we do not use the return value, this is required to start the code that will handle incoming actors
235
- if ( ! config . disableActorDriver ) {
236
- const _actorDriver = serverlessActorDriverBuilder ( ) ;
237
- serverlessActorDriverBuilder = undefined ;
139
+ serverlessActorDriverBuilder = (
140
+ token ,
141
+ totalSlots ,
142
+ runnerName ,
143
+ namespace ,
144
+ ) => {
145
+ // Override config
146
+ if ( token ) config . token = token ;
147
+ if ( totalSlots ) config . totalSlots = totalSlots ;
148
+ if ( runnerName ) config . runnerName = runnerName ;
149
+ if ( namespace ) config . namespace = namespace ;
150
+
151
+ // Create new actor driver with updated config
152
+ return driver . actor ( this . #config, config , managerDriver , client ) ;
153
+ } ;
238
154
}
239
155
240
156
const { router : hono } = createManagerRouter (
0 commit comments