From 8424f061ce93935739a5f41548562ff91194bd44 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Wed, 8 Feb 2023 16:03:42 +0100 Subject: [PATCH] Create basic TCP server for main and adapt to jsruntime arena change Signed-off-by: Francis Bouvier --- src/main.zig | 90 +++++++++++++++++++++++++++++++++++++--------- src/main_shell.zig | 12 +++---- 2 files changed, 80 insertions(+), 22 deletions(-) diff --git a/src/main.zig b/src/main.zig index 08420024..dea531fa 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,27 +1,85 @@ const std = @import("std"); -const runtime = @import("jsruntime"); +const jsruntime = @import("jsruntime"); -const EventTarget = @import("dom/event_target.zig").EventTarget; -const Node = @import("dom/node.zig").Node; -const Document = @import("dom/document.zig").Document; +const DOM = @import("dom.zig"); + +const html = @import("html.zig").html; + +const socket_path = "/tmp/browsercore-server.sock"; + +var doc: DOM.HTMLDocument = undefined; +var server: std.net.StreamServer = undefined; + +fn execJS( + alloc: std.mem.Allocator, + js_env: *jsruntime.Env, + comptime apis: []jsruntime.API, +) !void { + + // start JS env + js_env.start(); + defer js_env.stop(); + + // add document object + try js_env.addObject(apis, doc, "document"); + + while (true) { + + // read cmd + const conn = try server.accept(); + var buf: [100]u8 = undefined; + const read = try conn.stream.read(&buf); + const cmd = buf[0..read]; + std.debug.print("<- {s}\n", .{cmd}); + if (std.mem.eql(u8, cmd, "exit")) { + break; + } + + const res = try js_env.execTryCatch(alloc, cmd, "cdp"); + if (res.success) { + std.debug.print("-> {s}\n", .{res.result}); + } + _ = try conn.stream.write(res.result); + } +} pub fn main() !void { - // // generate APIs - // _ = comptime runtime.compile(.{ EventTarget, Node, Document }); + // generate APIs + const apis = jsruntime.compile(DOM.Interfaces); - // // create v8 vm - // const vm = runtime.VM.init(); - // defer vm.deinit(); + // create v8 vm + const vm = jsruntime.VM.init(); + defer vm.deinit(); - // // document - // var doc = Document.init(); - // defer doc.deinit(); - // var html: []const u8 = "
OK

blah-blah-blah

"; - // try doc.parse(html); - - // try doc.proto.make_tree(); + // document + doc = DOM.HTMLDocument.init(); + defer doc.deinit(); + try doc.parse(html); std.debug.print("ok\n", .{}); + + // remove socket file of internal server + // reuse_address (SO_REUSEADDR flag) does not seems to work on unix socket + // see: https://gavv.net/articles/unix-socket-reuse/ + // TODO: use a lock file instead + std.os.unlink(socket_path) catch |err| { + if (err != error.FileNotFound) { + return err; + } + }; + + // alloc + var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer _ = arena.deinit(); + + // server + var addr = try std.net.Address.initUnix(socket_path); + server = std.net.StreamServer.init(.{}); + defer server.deinit(); + try server.listen(addr); + std.debug.print("Listening on: {s}...\n", .{socket_path}); + + try jsruntime.loadEnv(&arena, execJS, apis); } diff --git a/src/main_shell.zig b/src/main_shell.zig index ff536faf..1c1e71d5 100644 --- a/src/main_shell.zig +++ b/src/main_shell.zig @@ -32,10 +32,9 @@ pub fn main() !void { const apis = jsruntime.compile(DOM.Interfaces); // document - var base_doc = DOM.Document.init(); - defer base_doc.deinit(); - try base_doc.parse(html); - doc = DOM.HTMLDocument{ .proto = base_doc }; + doc = DOM.HTMLDocument.init(); + defer doc.deinit(); + try doc.parse(html); // create JS vm const vm = jsruntime.VM.init(); @@ -44,8 +43,9 @@ pub fn main() !void { // alloc var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); - const alloc = gpa.allocator(); + var arena = std.heap.ArenaAllocator.init(gpa.allocator()); + defer arena.deinit(); // launch shell - try jsruntime.shell(alloc, false, apis, execJS, .{ .app_name = "browsercore" }); + try jsruntime.shell(&arena, apis, execJS, .{ .app_name = "browsercore" }); }