@@ -30,9 +30,21 @@ const apiweb = @import("apiweb.zig");
3030pub const Types = jsruntime .reflect (apiweb .Interfaces );
3131pub 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
3850pub 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}
0 commit comments