Skip to content

Commit ed38705

Browse files
Basic version using Browser
Signed-off-by: Francis Bouvier <[email protected]>
1 parent 1a1cd03 commit ed38705

File tree

2 files changed

+33
-40
lines changed

2 files changed

+33
-40
lines changed

src/main.zig

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const std = @import("std");
2020

2121
const jsruntime = @import("jsruntime");
2222

23+
const Browser = @import("browser/browser.zig").Browser;
2324
const server = @import("server.zig");
2425

2526
const parser = @import("netsurf");
@@ -60,7 +61,9 @@ pub fn main() !void {
6061
defer srv.deinit();
6162
try srv.listen(addr);
6263
std.debug.print("Listening on: {s}...\n", .{socket_path});
63-
server.socket_fd = srv.sockfd.?;
6464

65-
try jsruntime.loadEnv(&arena, server.execJS);
65+
var browser = try Browser.init(arena.allocator(), vm);
66+
defer browser.deinit();
67+
68+
try server.listen(&browser, srv.sockfd.?);
6669
}

src/server.zig

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ const RecvError = public.IO.RecvError;
77
const SendError = public.IO.SendError;
88
const TimeoutError = public.IO.TimeoutError;
99

10-
const Window = @import("html/window.zig").Window;
10+
const Browser = @import("browser/browser.zig").Browser;
1111

1212
const cdp = @import("cdp/cdp.zig");
13-
pub var socket_fd: std.os.socket_t = undefined;
1413

1514
const NoError = error{NoError};
1615
const Error = AcceptError || RecvError || SendError || TimeoutError || cdp.Error || NoError;
@@ -29,19 +28,25 @@ pub const Cmd = struct {
2928
state: cdp.State = .{},
3029

3130
// JS fields
32-
js_env: *public.Env,
33-
try_catch: public.TryCatch,
31+
browser: *Browser, // TODO: is pointer mandatory here?
32+
// try_catch: public.TryCatch, // TODO
3433

3534
fn cbk(self: *Cmd, completion: *Completion, result: RecvError!usize) void {
3635
const size = result catch |err| {
3736
self.err = err;
3837
return;
3938
};
4039

40+
if (size == 0) {
41+
// continue receving incomming messages asynchronously
42+
self.loop().io.recv(*Cmd, self, cbk, completion, self.socket, self.buf);
43+
return;
44+
}
45+
4146
// input
4247
var input = self.buf[0..size];
4348
if (std.log.defaultLogEnabled(.debug)) {
44-
std.debug.print("\ninput {s}\n", .{input});
49+
std.debug.print("\ninput size: {d}, content: {s}\n", .{ size, input });
4550
}
4651

4752
// close on exit command
@@ -86,11 +91,13 @@ pub const Cmd = struct {
8691

8792
// shortcuts
8893
fn alloc(self: *Cmd) std.mem.Allocator {
89-
return self.js_env.nat_ctx.alloc;
94+
// TODO: should we return the allocator from the page instead?
95+
return self.browser.currentSession().alloc;
9096
}
9197

92-
fn loop(self: *Cmd) *public.Loop {
93-
return self.js_env.nat_ctx.loop;
98+
fn loop(self: *Cmd) public.Loop {
99+
// TODO: pointer instead?
100+
return self.browser.currentSession().loop;
94101
}
95102
};
96103

@@ -179,58 +186,41 @@ const Accept = struct {
179186
}
180187
};
181188

182-
pub fn execJS(alloc: std.mem.Allocator, js_env: *public.Env) anyerror!void {
183-
184-
// start JS env
185-
try js_env.start(alloc);
186-
defer js_env.stop();
189+
// Listen
190+
// ------
187191

188-
// alias global as self
189-
try js_env.attachObject(try js_env.getGlobal(), "self", null);
190-
191-
// alias global as self and window
192-
const window = Window.create(null);
193-
// window.replaceDocument(doc); TODO
194-
try js_env.bindGlobal(window);
195-
196-
// add console object
197-
const console = public.Console{};
198-
try js_env.addObject(console, "console");
199-
200-
// JS try cache
201-
var try_catch = public.TryCatch.init(js_env.*);
202-
defer try_catch.deinit();
192+
pub fn listen(browser: *Browser, socket: std.os.socket_t) anyerror!void {
203193

204194
// create I/O contexts and callbacks
205195
// for accepting connections and receving messages
206196
var input: [1024]u8 = undefined;
207197
var cmd = Cmd{
208-
.js_env = js_env,
198+
.browser = browser,
209199
.socket = undefined,
210200
.buf = &input,
211-
.try_catch = try_catch,
212201
};
213202
var accept = Accept{
214203
.cmd = &cmd,
215-
.socket = socket_fd,
204+
.socket = socket,
216205
};
217206

218207
// accepting connection asynchronously on internal server
219-
const loop = js_env.nat_ctx.loop;
208+
const loop = browser.currentSession().loop;
220209
var completion: Completion = undefined;
221-
loop.io.accept(*Accept, &accept, Accept.cbk, &completion, socket_fd);
210+
loop.io.accept(*Accept, &accept, Accept.cbk, &completion, socket);
222211

223212
// infinite loop on I/O events, either:
224213
// - cmd from incoming connection on server socket
225214
// - JS callbacks events from scripts
226215
while (true) {
227216
try loop.io.tick();
228217
if (loop.cbk_error) {
229-
if (try try_catch.exception(alloc, js_env.*)) |msg| {
230-
std.debug.print("\n\rUncaught {s}\n\r", .{msg});
231-
alloc.free(msg);
232-
}
233-
loop.cbk_error = false;
218+
std.log.err("JS error", .{});
219+
// if (try try_catch.exception(alloc, js_env.*)) |msg| {
220+
// std.debug.print("\n\rUncaught {s}\n\r", .{msg});
221+
// alloc.free(msg);
222+
// }
223+
// loop.cbk_error = false;
234224
}
235225
if (cmd.err) |err| {
236226
if (err != error.NoError) std.log.err("Server error: {any}", .{err});

0 commit comments

Comments
 (0)