@@ -9,6 +9,7 @@ use self::syscall::{call_call_reducer, call_describe_module, call_reducer_fun, r
99use super :: module_common:: { build_common_module_from_raw, run_describer, ModuleCommon } ;
1010use super :: module_host:: { CallProcedureParams , CallReducerParams , Module , ModuleInfo , ModuleRuntime } ;
1111use super :: UpdateDatabaseResult ;
12+ use crate :: client:: ClientActorId ;
1213use crate :: host:: instance_env:: { ChunkPool , InstanceEnv } ;
1314use crate :: host:: module_host:: {
1415 call_identity_connected, call_scheduled_reducer, init_database, ClientConnectedError , Instance ,
@@ -17,7 +18,7 @@ use crate::host::scheduler::QueueItem;
1718use crate :: host:: wasm_common:: instrumentation:: CallTimes ;
1819use crate :: host:: wasm_common:: module_host_actor:: { DescribeError , ExecuteResult , ExecutionTimings , InstanceCommon } ;
1920use crate :: host:: wasm_common:: { RowIters , TimingSpanSet } ;
20- use crate :: host:: { ReducerCallError , ReducerCallResult , Scheduler } ;
21+ use crate :: host:: { ModuleHost , ReducerCallError , ReducerCallResult , Scheduler } ;
2122use crate :: module_host_context:: { ModuleCreationContext , ModuleCreationContextLimited } ;
2223use crate :: replica_context:: ReplicaContext ;
2324use crate :: util:: asyncify;
@@ -28,7 +29,7 @@ use itertools::Either;
2829use spacetimedb_auth:: identity:: ConnectionAuthCtx ;
2930use spacetimedb_datastore:: locking_tx_datastore:: MutTxId ;
3031use spacetimedb_datastore:: traits:: Program ;
31- use spacetimedb_lib:: { ConnectionId , RawModuleDef , Timestamp } ;
32+ use spacetimedb_lib:: { ConnectionId , Identity , RawModuleDef , Timestamp } ;
3233use spacetimedb_schema:: auto_migrate:: MigrationPolicy ;
3334use std:: sync:: mpsc:: { Receiver , SyncSender } ;
3435use std:: sync:: { mpsc, Arc , LazyLock } ;
@@ -333,6 +334,28 @@ impl JsInstance {
333334 } )
334335 }
335336
337+ pub fn call_identity_disconnected (
338+ & mut self ,
339+ caller_identity : Identity ,
340+ caller_connection_id : ConnectionId ,
341+ ) -> Result < ( ) , ReducerCallError > {
342+ self . can_trap ( move |this| {
343+ this. send_recv (
344+ JsWorkerReply :: into_call_identity_disconnected,
345+ JsWorkerRequest :: CallIdentityDisconnected ( caller_identity, caller_connection_id) ,
346+ )
347+ } )
348+ }
349+
350+ pub fn disconnect_client ( & mut self , client_id : ClientActorId ) -> Result < ( ) , ReducerCallError > {
351+ self . can_trap ( move |this| {
352+ this. send_recv (
353+ JsWorkerReply :: into_disconnect_client,
354+ JsWorkerRequest :: DisconnectClient ( client_id) ,
355+ )
356+ } )
357+ }
358+
336359 pub ( crate ) fn call_scheduled_reducer ( & mut self , item : QueueItem ) -> Result < ReducerCallResult , ReducerCallError > {
337360 self . can_trap ( move |this| {
338361 this. send_recv (
@@ -366,6 +389,8 @@ enum JsWorkerReply {
366389 CallReducer ( ( ReducerCallResult , bool ) ) ,
367390 ClearAllClients ( anyhow:: Result < ( ) > ) ,
368391 CallIdentityConnected ( ( Result < ( ) , ClientConnectedError > , bool ) ) ,
392+ CallIdentityDisconnected ( ( Result < ( ) , ReducerCallError > , bool ) ) ,
393+ DisconnectClient ( ( Result < ( ) , ReducerCallError > , bool ) ) ,
369394 CallScheduledReducer ( ( Result < ReducerCallResult , ReducerCallError > , bool ) ) ,
370395 InitDatabase ( ( anyhow:: Result < Option < ReducerCallResult > > , bool ) ) ,
371396}
@@ -390,6 +415,10 @@ enum JsWorkerRequest {
390415 ClearAllClients ,
391416 /// See [`JsInstance::call_identity_connected`].
392417 CallIdentityConnected ( ConnectionAuthCtx , ConnectionId ) ,
418+ /// See [`JsInstance::call_identity_disconnected`].
419+ CallIdentityDisconnected ( Identity , ConnectionId ) ,
420+ /// See [`JsInstance::disconnect_client`].
421+ DisconnectClient ( ClientActorId ) ,
393422 /// See [`JsInstance::call_scheduled_reducer`].
394423 CallScheduledReducer ( QueueItem ) ,
395424 /// See [`JsInstance::init_database`].
@@ -503,6 +532,9 @@ fn spawn_instance_worker(
503532 }
504533 } ;
505534 for request in request_rx. iter ( ) {
535+ let mut call_reducer =
536+ |tx, params| call_reducer ( & mut instance_common, replica_ctx, scope, call_reducer_fun, tx, params) ;
537+
506538 match request {
507539 JsWorkerRequest :: UpdateDatabase {
508540 program,
@@ -519,34 +551,46 @@ fn spawn_instance_worker(
519551 // but rather let this happen by `return_instance` using `JsInstance::trapped`
520552 // which will cause `JsInstance` to be dropped,
521553 // which in turn results in the loop being terminated.
522- let res = call_reducer ( & mut instance_common , replica_ctx , scope , call_reducer_fun , tx, params) ;
554+ let res = call_reducer ( tx, params) ;
523555 reply ( "call_reducer" , JsWorkerReply :: CallReducer ( res) ) ;
524556 }
525557 JsWorkerRequest :: ClearAllClients => {
526558 let res = instance_common. clear_all_clients ( ) ;
527559 reply ( "clear_all_clients" , JsWorkerReply :: ClearAllClients ( res) ) ;
528560 }
529561 JsWorkerRequest :: CallIdentityConnected ( caller_auth, caller_connection_id) => {
530- let call_reducer = |tx, params| {
531- call_reducer ( & mut instance_common, replica_ctx, scope, call_reducer_fun, tx, params)
532- } ;
533562 let mut trapped = false ;
534563 let res =
535564 call_identity_connected ( caller_auth, caller_connection_id, info, call_reducer, & mut trapped) ;
536565 let res = ( res, trapped) ;
537566 reply ( "call_identity_connected" , JsWorkerReply :: CallIdentityConnected ( res) ) ;
538567 }
568+ JsWorkerRequest :: CallIdentityDisconnected ( caller_identity, caller_connection_id) => {
569+ let mut trapped = false ;
570+ let res = ModuleHost :: call_identity_disconnected_inner (
571+ caller_identity,
572+ caller_connection_id,
573+ info,
574+ call_reducer,
575+ & mut trapped,
576+ ) ;
577+ let res = ( res, trapped) ;
578+ reply (
579+ "call_identity_disconnected" ,
580+ JsWorkerReply :: CallIdentityDisconnected ( res) ,
581+ ) ;
582+ }
583+ JsWorkerRequest :: DisconnectClient ( client_id) => {
584+ let mut trapped = false ;
585+ let res = ModuleHost :: disconnect_client_inner ( client_id, info, call_reducer, & mut trapped) ;
586+ let res = ( res, trapped) ;
587+ reply ( "disconnect_client" , JsWorkerReply :: DisconnectClient ( res) ) ;
588+ }
539589 JsWorkerRequest :: CallScheduledReducer ( queue_item) => {
540- let call_reducer = |tx, params| {
541- call_reducer ( & mut instance_common, replica_ctx, scope, call_reducer_fun, tx, params)
542- } ;
543590 let res = call_scheduled_reducer ( info, queue_item, call_reducer) ;
544591 reply ( "call_scheduled_reducer" , JsWorkerReply :: CallScheduledReducer ( res) ) ;
545592 }
546593 JsWorkerRequest :: InitDatabase ( program) => {
547- let call_reducer = |tx, params| {
548- call_reducer ( & mut instance_common, replica_ctx, scope, call_reducer_fun, tx, params)
549- } ;
550594 let res = init_database ( replica_ctx, & module_common. info ( ) . module_def , program, call_reducer) ;
551595 reply ( "init_database" , JsWorkerReply :: InitDatabase ( res) ) ;
552596 }
0 commit comments