Skip to content

Commit f362601

Browse files
committed
makes it so lightpanda_cdp_page_wait emits a number, which is the peeked number of
milliseconds until the next event is required
1 parent 587f527 commit f362601

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

include/lightpanda.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
#ifndef _LIGHTPANDA_H
22
#define _LIGHTPANDA_H
33

4-
typedef enum {
5-
done = 0,
6-
no_page = 1,
7-
extra_socket = 2,
8-
} Session_WaitResult;
9-
104
void* lightpanda_app_init();
115
void lightpanda_app_deinit(void* app_ptr);
126

@@ -26,7 +20,7 @@ const char* lightpanda_cdp_create_browser_context(void* cdp_ptr);
2620
void* lightpanda_cdp_browser(void* cdp_ptr);
2721
void lightpanda_cdp_process_message(void* cdp_ptr, const char *msg);
2822
void* lightpanda_cdp_browser_context(void* cdp_ptr);
29-
Session_WaitResult lightpanda_cdp_page_wait(void* cdp_ptr, int ms);
23+
int lightpanda_cdp_page_wait(void* cdp_ptr, int ms);
3024

3125
void* lightpanda_browser_context_session(void* browser_context_ptr);
3226

src/lib.zig

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const App = @import("app.zig").App;
33
const Browser = @import("browser/browser.zig").Browser;
44
const Session = @import("browser/session.zig").Session;
55
const Page = @import("browser/page.zig").Page;
6+
const Scheduler = @import("browser/Scheduler.zig");
67
const CDPT = @import("cdp/cdp.zig").CDPT;
78
const 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
155158
export 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

160179
export fn lightpanda_browser_context_session(browser_context_ptr: *anyopaque) *anyopaque {

0 commit comments

Comments
 (0)