From 968a92b60685d453d67084aa7dda1c655b853167 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Wed, 19 Nov 2025 22:42:08 -0800 Subject: [PATCH] fix(pegboard-gateway): write hws immediately on socket hibernate --- engine/packages/pegboard-gateway/src/lib.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/engine/packages/pegboard-gateway/src/lib.rs b/engine/packages/pegboard-gateway/src/lib.rs index 898f6af5ca..2bdcd2903d 100644 --- a/engine/packages/pegboard-gateway/src/lib.rs +++ b/engine/packages/pegboard-gateway/src/lib.rs @@ -539,6 +539,16 @@ impl CustomServeTrait for PegboardGateway { ) -> Result { let request_id = unique_request_id; + // Insert hibernating request entry before checking for pending messages + // This ensures the entry exists even if we immediately rewake the actor + self.ctx + .op(pegboard::ops::actor::hibernating_request::upsert::Input { + actor_id: self.actor_id, + gateway_id: self.shared_state.gateway_id(), + request_id, + }) + .await?; + // Immediately rewake if we have pending messages if self .shared_state @@ -549,6 +559,7 @@ impl CustomServeTrait for PegboardGateway { ?unique_request_id, "detected pending requests on websocket hibernation, rewaking actor" ); + return Ok(HibernationResult::Continue); } @@ -567,6 +578,10 @@ impl CustomServeTrait for PegboardGateway { )); ping_interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); + // Discard the first tick since it fires immediately and we've already called this + // above + ping_interval.tick().await; + loop { ping_interval.tick().await;