@@ -3,6 +3,7 @@ const App = @import("app.zig").App;
33const Browser = @import ("browser/browser.zig" ).Browser ;
44const Session = @import ("browser/session.zig" ).Session ;
55const Page = @import ("browser/page.zig" ).Page ;
6+ const Scheduler = @import ("browser/Scheduler.zig" );
67const CDPT = @import ("cdp/cdp.zig" ).CDPT ;
78const BrowserContext = @import ("cdp/cdp.zig" ).BrowserContext ;
89
@@ -152,9 +153,27 @@ export fn lightpanda_cdp_browser_context(cdp_ptr: *anyopaque) *anyopaque {
152153 return & cdp .browser_context .? ;
153154}
154155
156+ // returns -1 if no session/page, or if no events reamin, otherwise returns
157+ // milliseconds until next scheduled task
155158export fn lightpanda_cdp_page_wait (cdp_ptr : * anyopaque , ms : i32 ) c_int {
156159 const cdp : * CDP = @ptrCast (@alignCast (cdp_ptr ));
157- return @intFromEnum (cdp .pageWait (ms ));
160+ _ = cdp .pageWait (ms );
161+
162+ // it's okay to panic if the session or page don't exist.
163+ const scheduler = & cdp .browser .session .? .page .? .scheduler ;
164+ return cdp_peek_next_delay_ms (scheduler ) orelse -1 ;
165+ }
166+
167+ fn cdp_peek_next_delay_ms (scheduler : * Scheduler ) ? i32 {
168+ if (scheduler .high_priority .count () == 0 ) {
169+ return null ;
170+ }
171+
172+ const now = std .time .milliTimestamp ();
173+ const next_task = scheduler .high_priority .peek ().? ;
174+ const time_to_next = next_task .ms - now ;
175+
176+ return if (time_to_next > 0 ) @intCast (time_to_next ) else 0 ;
158177}
159178
160179export fn lightpanda_browser_context_session (browser_context_ptr : * anyopaque ) * anyopaque {
0 commit comments