@@ -3,6 +3,7 @@ use super::*;
33use crate :: client:: ClientActorId ;
44use crate :: database_logger;
55use crate :: energy:: { EnergyMonitor , FunctionBudget , FunctionFingerprint } ;
6+ use crate :: host:: host_controller:: CallProcedureReturn ;
67use crate :: host:: instance_env:: { InstanceEnv , TxSlot } ;
78use crate :: host:: module_common:: { build_common_module_from_raw, ModuleCommon } ;
89use crate :: host:: module_host:: {
@@ -20,6 +21,7 @@ use crate::messages::control_db::HostType;
2021use crate :: module_host_context:: ModuleCreationContextLimited ;
2122use crate :: replica_context:: ReplicaContext ;
2223use crate :: subscription:: module_subscription_actor:: commit_and_broadcast_event;
24+ use crate :: subscription:: module_subscription_manager:: TransactionOffset ;
2325use crate :: util:: prometheus_handle:: { HistogramExt , TimerGuard } ;
2426use crate :: worker_metrics:: WORKER_METRICS ;
2527use bytes:: Bytes ;
@@ -79,7 +81,7 @@ pub trait WasmInstance {
7981 & mut self ,
8082 op : ProcedureOp ,
8183 budget : FunctionBudget ,
82- ) -> impl Future < Output = ProcedureExecuteResult > ;
84+ ) -> impl Future < Output = ( ProcedureExecuteResult , Option < TransactionOffset > ) > ;
8385}
8486
8587pub struct EnergyStats {
@@ -378,15 +380,12 @@ impl<T: WasmInstance> WasmModuleInstance<T> {
378380 res
379381 }
380382
381- pub async fn call_procedure (
382- & mut self ,
383- params : CallProcedureParams ,
384- ) -> Result < ProcedureCallResult , ProcedureCallError > {
385- let res = self . common . call_procedure ( params, & mut self . instance ) . await ;
386- if res. is_err ( ) {
383+ pub async fn call_procedure ( & mut self , params : CallProcedureParams ) -> CallProcedureReturn {
384+ let ret = self . common . call_procedure ( params, & mut self . instance ) . await ;
385+ if ret. result . is_err ( ) {
387386 self . trapped = true ;
388387 }
389- res
388+ ret
390389 }
391390}
392391
@@ -575,7 +574,7 @@ impl InstanceCommon {
575574 & mut self ,
576575 params : CallProcedureParams ,
577576 inst : & mut I ,
578- ) -> Result < ProcedureCallResult , ProcedureCallError > {
577+ ) -> CallProcedureReturn {
579578 let CallProcedureParams {
580579 timestamp,
581580 caller_identity,
@@ -612,7 +611,7 @@ impl InstanceCommon {
612611 // TODO(procedure-energy): replace with call to separate function `procedure_budget`.
613612 let budget = self . energy_monitor . reducer_budget ( & energy_fingerprint) ;
614613
615- let result = inst. call_procedure ( op, budget) . await ;
614+ let ( result, tx_offset ) = inst. call_procedure ( op, budget) . await ;
616615
617616 let ProcedureExecuteResult {
618617 stats :
@@ -630,7 +629,7 @@ impl InstanceCommon {
630629 self . allocated_memory = memory_allocation;
631630 }
632631
633- match call_result {
632+ let result = match call_result {
634633 Err ( err) => {
635634 inst. log_traceback ( "procedure" , & procedure_def. name , & err) ;
636635
@@ -655,16 +654,17 @@ impl InstanceCommon {
655654 Ok ( return_val) => {
656655 let return_type = & procedure_def. return_type ;
657656 let seed = spacetimedb_sats:: WithTypespace :: new ( self . info . module_def . typespace ( ) , return_type) ;
658- let return_val = seed
659- . deserialize ( bsatn:: Deserializer :: new ( & mut & return_val[ ..] ) )
660- . map_err ( |err| ProcedureCallError :: InternalError ( format ! ( "{err}" ) ) ) ?;
661- Ok ( ProcedureCallResult {
662- return_val,
663- execution_duration : timer. map ( |timer| timer. elapsed ( ) ) . unwrap_or_default ( ) ,
664- start_timestamp : timestamp,
665- } )
657+ seed. deserialize ( bsatn:: Deserializer :: new ( & mut & return_val[ ..] ) )
658+ . map_err ( |err| ProcedureCallError :: InternalError ( format ! ( "{err}" ) ) )
659+ . map ( |return_val| ProcedureCallResult {
660+ return_val,
661+ execution_duration : timer. map ( |timer| timer. elapsed ( ) ) . unwrap_or_default ( ) ,
662+ start_timestamp : timestamp,
663+ } )
666664 }
667- }
665+ } ;
666+
667+ CallProcedureReturn { result, tx_offset }
668668 }
669669
670670 /// Execute a reducer.
0 commit comments