╭ changed ────╮ │src/serve.zig│ ╰─────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭──────────────────────────────────────────────────────────────────╮ │2 const xit = @import("xit"); │ │3 const rp = xit.repo; │ │4 const web = @import("./web.zig"); │ │5 +const serve_common = @import("./serve_common.zig"); │ │6 const serve_ssh_protocol = @import("./serve_ssh_protocol.zig");│ │7 const serve_ssh = @import("./serve_ssh.zig"); │ │8 const serve_http = @import("./serve_http.zig"); │ ╰──────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────╮ │108 try err.print("serving web UI on http://{s}/\n", .{options.wui_listen}); │ │109 try err.flush(); │ │110 │ │110 - web.run(io, allocator, &wui_server, &tasks, admin_repo_path, session_store, err); │ │111 + runWebListener(io, allocator, &wui_server, &tasks, admin_repo_path, session_store, err);│ │112 │ │113 if (@TypeOf(runnable) != void) { │ │114 try runnable.run(); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │115 } else { │ │116 try tasks.await(io); │ │117 } │ │118 +} │ │119 + │ │120 +fn runWebListener( │ │121 + io: std.Io, │ │122 + allocator: std.mem.Allocator, │ │123 + net_server: *std.Io.net.Server, │ │124 + tasks: *std.Io.Group, │ │125 + admin_repo_path: []const u8, │ │126 + session_store: web.SessionStore, │ │127 + err: *std.Io.Writer, │ │128 +) void { │ │129 + const Context = struct { │ │130 + io: std.Io, │ │131 + allocator: std.mem.Allocator, │ │132 + admin_repo_path: []const u8, │ │133 + session_store: web.SessionStore, │ │134 + err: *std.Io.Writer, │ │135 + }; │ │136 + │ │137 + const handle = struct { │ │138 + fn h(ctx: Context, stream: std.Io.net.Stream) void { │ │139 + defer stream.close(ctx.io); │ │140 + web.handleConnection(ctx.io, ctx.allocator, stream, ctx.admin_repo_path, ctx.session_store, ctx.err) catch |request_err| {│ │141 + serve_common.logError(ctx.err, "web ui request failed: {s}\n", .{@errorName(request_err)}); │ │142 + }; │ │143 + } │ │144 + }.h; │ │145 + │ │146 + serve_common.runListener(io, net_server, tasks, err, "web ui", Context{ │ │147 + .io = io, │ │148 + .allocator = allocator, │ │149 + .admin_repo_path = admin_repo_path, │ │150 + .session_store = session_store, │ │151 + .err = err, │ │152 + }, handle); │ │153 } │ │154 │ │155 fn parseListenAddress(value: []const u8) !ListenAddress { │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯