Skip to content

Commit 9400dd7

Browse files
Add cli options for server (host, port, timeout)
Signed-off-by: Francis Bouvier <[email protected]>
1 parent ff0bbc3 commit 9400dd7

File tree

2 files changed

+98
-14
lines changed

2 files changed

+98
-14
lines changed

src/main.zig

Lines changed: 89 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,21 @@ const apiweb = @import("apiweb.zig");
3030
pub const Types = jsruntime.reflect(apiweb.Interfaces);
3131
pub const UserContext = apiweb.UserContext;
3232

33-
// TODO: move to cli options
34-
const host = "127.0.0.1";
35-
const port = 3245;
33+
// Default options
34+
const Host = "127.0.0.1";
35+
const Port = 3245;
36+
const Timeout = 3; // in seconds
37+
38+
const usage =
39+
\\usage: {s} [options]
40+
\\ start Lightpanda browser in CDP server mode
41+
\\
42+
\\ -h, --help Print this help message and exit.
43+
\\ --host Host of the server (default "127.0.0.1")
44+
\\ --port Port of the server (default "3245")
45+
\\ --timeout Timeout for incoming connections in seconds (default "3")
46+
\\
47+
;
3648

3749
// Inspired by std.net.StreamServer in Zig < 0.12
3850
pub const StreamServer = struct {
@@ -130,34 +142,100 @@ pub const StreamServer = struct {
130142
}
131143
};
132144

133-
pub fn main() !void {
145+
fn printUsageExit(execname: []const u8, res: u8) void {
146+
std.io.getStdErr().writer().print(usage, .{execname}) catch |err| {
147+
std.log.err("Print usage error: {any}", .{err});
148+
std.posix.exit(1);
149+
};
150+
std.posix.exit(res);
151+
}
134152

135-
// create v8 vm
136-
const vm = jsruntime.VM.init();
137-
defer vm.deinit();
153+
pub fn main() !void {
138154

139-
// alloc
155+
// allocator
140156
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
141157
defer arena.deinit();
142158

159+
// args
160+
var args = try std.process.argsWithAllocator(arena.allocator());
161+
defer args.deinit();
162+
163+
const execname = args.next().?;
164+
var host: []const u8 = Host;
165+
var port: u16 = Port;
166+
var addr: std.net.Address = undefined;
167+
var timeout: u8 = undefined;
168+
169+
while (args.next()) |opt| {
170+
if (std.mem.eql(u8, "-h", opt) or std.mem.eql(u8, "--help", opt)) {
171+
printUsageExit(execname, 0);
172+
}
173+
if (std.mem.eql(u8, "--host", opt)) {
174+
if (args.next()) |arg| {
175+
host = arg;
176+
continue;
177+
} else {
178+
std.log.err("--host not provided\n", .{});
179+
return printUsageExit(execname, 1);
180+
}
181+
}
182+
if (std.mem.eql(u8, "--port", opt)) {
183+
if (args.next()) |arg| {
184+
port = std.fmt.parseInt(u16, arg, 10) catch |err| {
185+
std.log.err("--port {any}\n", .{err});
186+
return printUsageExit(execname, 1);
187+
};
188+
continue;
189+
} else {
190+
std.log.err("--port not provided\n", .{});
191+
return printUsageExit(execname, 1);
192+
}
193+
}
194+
if (std.mem.eql(u8, "--timeout", opt)) {
195+
if (args.next()) |arg| {
196+
timeout = std.fmt.parseInt(u8, arg, 10) catch |err| {
197+
std.log.err("--timeout {any}\n", .{err});
198+
return printUsageExit(execname, 1);
199+
};
200+
continue;
201+
} else {
202+
std.log.err("--timeout not provided\n", .{});
203+
return printUsageExit(execname, 1);
204+
}
205+
}
206+
}
207+
addr = std.net.Address.parseIp4(host, port) catch |err| {
208+
std.log.err("address (host:port) {any}\n", .{err});
209+
return printUsageExit(execname, 1);
210+
};
211+
143212
// server
144-
const addr = try std.net.Address.parseIp4(host, port);
145213
var srv = StreamServer.init(.{
146214
.reuse_address = true,
147215
.reuse_port = true,
148216
.nonblocking = true,
149217
});
150218
defer srv.deinit();
151219

152-
try srv.listen(addr);
220+
srv.listen(addr) catch |err| {
221+
std.log.err("address (host:port) {any}\n", .{err});
222+
return printUsageExit(execname, 1);
223+
};
153224
defer srv.close();
154225
std.log.info("Listening on: {s}:{d}...", .{ host, port });
155226

227+
// create v8 vm
228+
const vm = jsruntime.VM.init();
229+
defer vm.deinit();
230+
231+
// loop
156232
var loop = try jsruntime.Loop.init(arena.allocator());
157233
defer loop.deinit();
158234

235+
// browser
159236
var browser = try Browser.init(arena.allocator(), &loop);
160237
defer browser.deinit();
161238

162-
try server.listen(&browser, &loop, srv.sockfd.?);
239+
// listen
240+
try server.listen(&browser, &loop, srv.sockfd.?, std.time.ns_per_s * @as(u64, timeout));
163241
}

src/server.zig

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ const IOError = AcceptError || RecvError || SendError || CloseError || TimeoutEr
3535
const Error = IOError || std.fmt.ParseIntError || cdp.Error || NoError;
3636

3737
const TimeoutCheck = std.time.ns_per_ms * 100;
38-
const TimeoutRead = std.time.ns_per_s * 3; // TODO: cli option
3938

4039
// I/O Main
4140
// --------
@@ -56,6 +55,7 @@ pub const Ctx = struct {
5655
// I/O fields
5756
conn_completion: *Completion,
5857
timeout_completion: *Completion,
58+
timeout: u64,
5959
last_active: ?std.time.Instant = null,
6060

6161
// CDP
@@ -146,7 +146,7 @@ pub const Ctx = struct {
146146
return;
147147
};
148148

149-
if (now.since(self.last_active.?) > TimeoutRead) {
149+
if (now.since(self.last_active.?) > self.timeout) {
150150
// closing
151151
std.log.debug("conn timeout, closing...", .{});
152152

@@ -334,7 +334,12 @@ pub fn sendSync(ctx: *Ctx, msg: []const u8) !void {
334334
// Listen
335335
// ------
336336

337-
pub fn listen(browser: *Browser, loop: *public.Loop, server_socket: std.posix.socket_t) anyerror!void {
337+
pub fn listen(
338+
browser: *Browser,
339+
loop: *public.Loop,
340+
server_socket: std.posix.socket_t,
341+
timeout: u64,
342+
) anyerror!void {
338343

339344
// create buffers
340345
var read_buf: [BufReadSize]u8 = undefined;
@@ -354,6 +359,7 @@ pub fn listen(browser: *Browser, loop: *public.Loop, server_socket: std.posix.so
354359
.read_buf = &read_buf,
355360
.msg_buf = &msg_buf,
356361
.accept_socket = server_socket,
362+
.timeout = timeout,
357363
.conn_completion = &conn_completion,
358364
.timeout_completion = &timeout_completion,
359365
};

0 commit comments

Comments
 (0)