@@ -16,7 +16,7 @@ use rivetkit_core::{
1616 EnqueueAndWaitOpts , ListOpts , QueueMessage , QueueNextBatchOpts , QueueSendResult ,
1717 QueueSendStatus , QueueTryNextBatchOpts , QueueWaitOpts , Request , RequestSaveOpts , Response ,
1818 RuntimeSpawner , SerializeStateReason , ServeConfig , ServerlessRequest , StateDelta , WebSocket ,
19- WebSocketCallbackRegion , WsMessage ,
19+ KeepAwakeRegion , WebSocketCallbackRegion , WsMessage ,
2020} ;
2121use scc:: HashMap as SccHashMap ;
2222use tokio:: sync:: oneshot;
@@ -1058,7 +1058,9 @@ pub struct WasmActorContext {
10581058 inner : rivetkit_core:: ActorContext ,
10591059 callbacks : WasmCallbacks ,
10601060 runtime_state : JsValue ,
1061+ keep_awake_regions : Rc < RefCell < HashMap < u32 , KeepAwakeRegion > > > ,
10611062 websocket_callback_regions : Rc < RefCell < HashMap < u32 , WebSocketCallbackRegion > > > ,
1063+ next_keep_awake_region_id : Rc < Cell < u32 > > ,
10621064 next_websocket_callback_region_id : Rc < Cell < u32 > > ,
10631065}
10641066
@@ -1068,7 +1070,9 @@ impl WasmActorContext {
10681070 inner,
10691071 callbacks,
10701072 runtime_state : Object :: new ( ) . into ( ) ,
1073+ keep_awake_regions : Rc :: new ( RefCell :: new ( HashMap :: new ( ) ) ) ,
10711074 websocket_callback_regions : Rc :: new ( RefCell :: new ( HashMap :: new ( ) ) ) ,
1075+ next_keep_awake_region_id : Rc :: new ( Cell :: new ( 0 ) ) ,
10721076 next_websocket_callback_region_id : Rc :: new ( Cell :: new ( 0 ) ) ,
10731077 }
10741078 }
@@ -1121,6 +1125,20 @@ impl WasmActorContext {
11211125 }
11221126 }
11231127
1128+ fn allocate_keep_awake_region_id (
1129+ & self ,
1130+ regions : & HashMap < u32 , KeepAwakeRegion > ,
1131+ ) -> Option < u32 > {
1132+ for _ in 0 ..=u32:: MAX {
1133+ let next = self . next_keep_awake_region_id . get ( ) . wrapping_add ( 1 ) ;
1134+ self . next_keep_awake_region_id . set ( next) ;
1135+ if next != 0 && !regions. contains_key ( & next) {
1136+ return Some ( next) ;
1137+ }
1138+ }
1139+ None
1140+ }
1141+
11241142 #[ wasm_bindgen]
11251143 pub fn kv ( & self ) -> WasmKv {
11261144 WasmKv {
@@ -1359,11 +1377,19 @@ impl WasmActorContext {
13591377 }
13601378
13611379 #[ wasm_bindgen( js_name = keepAwake) ]
1362- pub async fn keep_awake ( & self , promise : Promise ) -> Result < JsValue , JsValue > {
1363- self . inner
1364- . keep_awake ( JsFuture :: from ( promise) )
1365- . await
1366- . map_err ( |error| error)
1380+ pub fn keep_awake ( & self , promise : Promise ) {
1381+ console_error ( "keepAwake binding is deprecated; use beginKeepAwake/endKeepAwake" ) ;
1382+ let region = self . inner . keep_awake_region ( ) ;
1383+ let actor_id = self . inner . actor_id ( ) . to_owned ( ) ;
1384+ self . inner . register_task ( async move {
1385+ let _region = region;
1386+ if let Err ( error) = JsFuture :: from ( promise) . await {
1387+ console_error ( & format ! (
1388+ "actor keepAwake promise rejected for actor {actor_id}: {}" ,
1389+ js_value_to_anyhow( error)
1390+ ) ) ;
1391+ }
1392+ } ) ;
13671393 }
13681394
13691395 #[ wasm_bindgen( js_name = registerTask) ]
@@ -1384,6 +1410,25 @@ impl WasmActorContext {
13841410 start_run_handler ( & self . callbacks , self ) ;
13851411 }
13861412
1413+ #[ wasm_bindgen( js_name = beginKeepAwake) ]
1414+ pub fn begin_keep_awake ( & self ) -> u32 {
1415+ let mut regions = self . keep_awake_regions . borrow_mut ( ) ;
1416+ let Some ( region_id) = self . allocate_keep_awake_region_id ( & regions) else {
1417+ console_error ( "failed to begin keep-awake region: no region ids available" ) ;
1418+ return 0 ;
1419+ } ;
1420+ regions. insert ( region_id, self . inner . keep_awake_region ( ) ) ;
1421+ region_id
1422+ }
1423+
1424+ #[ wasm_bindgen( js_name = endKeepAwake) ]
1425+ pub fn end_keep_awake ( & self , region_id : u32 ) {
1426+ if region_id == 0 {
1427+ return ;
1428+ }
1429+ self . keep_awake_regions . borrow_mut ( ) . remove ( & region_id) ;
1430+ }
1431+
13871432 #[ wasm_bindgen( js_name = beginWebsocketCallback) ]
13881433 pub fn begin_websocket_callback ( & self ) -> u32 {
13891434 let mut regions = self . websocket_callback_regions . borrow_mut ( ) ;
0 commit comments