From 6d530691f30797cf17259066996aab69b4af723d Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Wed, 29 Jan 2025 18:38:05 +0100 Subject: [PATCH] cdp: use an enum for SessionID --- src/cdp/cdp.zig | 19 ++++++++++++++++--- src/cdp/runtime.zig | 7 ++++++- src/cdp/target.zig | 8 +++++++- src/server.zig | 2 +- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/cdp/cdp.zig b/src/cdp/cdp.zig index 7fcdeeb4..65e2cc85 100644 --- a/src/cdp/cdp.zig +++ b/src/cdp/cdp.zig @@ -121,7 +121,7 @@ pub fn dispatch( pub const State = struct { executionContextId: u32 = 0, contextID: ?[]const u8 = null, - sessionID: ?[]const u8 = null, + sessionID: SessionID = .CONTEXTSESSIONID0497A05C95417CF4, frameID: []const u8 = FrameID, url: []const u8 = URLBase, securityOrigin: []const u8 = URLBase, @@ -225,8 +225,21 @@ pub fn sendEvent( // ------ // TODO: hard coded IDs -pub const BrowserSessionID = "BROWSERSESSIONID597D9875C664CAC0"; -pub const ContextSessionID = "CONTEXTSESSIONID0497A05C95417CF4"; +pub const SessionID = enum { + BROWSERSESSIONID597D9875C664CAC0, + CONTEXTSESSIONID0497A05C95417CF4, + + pub fn parse(str: []const u8) !SessionID { + inline for (@typeInfo(SessionID).Enum.fields) |enumField| { + if (std.mem.eql(u8, str, enumField.name)) { + return @field(SessionID, enumField.name); + } + } + return error.InvalidSessionID; + } +}; +pub const BrowserSessionID = @tagName(SessionID.BROWSERSESSIONID597D9875C664CAC0); +pub const ContextSessionID = @tagName(SessionID.CONTEXTSESSIONID0497A05C95417CF4); pub const URLBase = "chrome://newtab/"; pub const LoaderID = "LOADERID24DD2FD56CF1EF33C965C79C"; pub const FrameID = "FRAMEIDD8AED408A0467AC93100BCDBE"; diff --git a/src/cdp/runtime.zig b/src/cdp/runtime.zig index f0c58b53..44c1a907 100644 --- a/src/cdp/runtime.zig +++ b/src/cdp/runtime.zig @@ -117,7 +117,12 @@ fn sendInspector( } } - ctx.state.sessionID = msg.sessionId; + if (msg.sessionId) |s| { + ctx.state.sessionID = cdp.SessionID.parse(s) catch |err| { + log.err("parse sessionID: {s} {any}", .{ s, err }); + return err; + }; + } // remove awaitPromise true params // TODO: delete when Promise are correctly handled by zig-js-runtime diff --git a/src/cdp/target.zig b/src/cdp/target.zig index e3120379..90384b64 100644 --- a/src/cdp/target.zig +++ b/src/cdp/target.zig @@ -344,7 +344,13 @@ fn createTarget( ctx.state.securityOrigin = "://"; ctx.state.secureContextType = "InsecureScheme"; ctx.state.loaderID = LoaderID; - ctx.state.sessionID = msg.sessionId; + + if (msg.sessionId) |s| { + ctx.state.sessionID = cdp.SessionID.parse(s) catch |err| { + log.err("parse sessionID: {s} {any}", .{ s, err }); + return err; + }; + } // TODO stop the previous page instead? if (ctx.browser.session.page != null) return error.pageAlreadyExists; diff --git a/src/server.zig b/src/server.zig index b498e24a..cbe16e12 100644 --- a/src/server.zig +++ b/src/server.zig @@ -348,7 +348,7 @@ pub const Ctx = struct { const s = try std.fmt.allocPrint( allocator, tpl, - .{ msg_open, ctx.state.sessionID orelse cdp.ContextSessionID }, + .{ msg_open, @tagName(ctx.state.sessionID) }, ); try ctx.send(s);