╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭───────────────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭ find file ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ ╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ │ │ │http│ ssh │ │ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯
56 context: anytype, 57 comptime handleConn: fn (@TypeOf(context), std.Io.net.Stream) void, 58 ) void { 59 const Context = @TypeOf(context); 60 61 const Conn = struct { 62 context: Context, 63 stream: std.Io.net.Stream, 64 65 fn run(c: @This()) void { 66 handleConn(c.context, c.stream); 67 } 68 }; 69 70 const Listener = struct { 71 io: std.Io, 72 net_server: *std.Io.net.Server, 73 tasks: *std.Io.Group, 74 err: *std.Io.Writer, 75 name: []const u8, 76 context: Context, 77 78 fn run(self: @This()) void { 79 while (true) { 80 const stream = self.net_server.accept(self.io) catch |accept_err| { 81 if (accept_err == error.Canceled) return; 82 logError(self.io, self.err, "{s} accept failed: {s}\n", .{ self.name, @errorName(accept_err) }); 83 continue; 84 }; 85 self.tasks.concurrent(self.io, Conn.run, .{Conn{ .context = self.context, .stream = stream }}) catch |spawn_err| { 86 logError(self.io, self.err, "{s} connection spawn failed: {s}\n", .{ self.name, @errorName(spawn_err) }); 87 stream.close(self.io); 88 }; 89 } 90 } 91 }; 92 93 tasks.concurrent(io, Listener.run, .{Listener{ 94 .io = io, 95 .net_server = net_server, 96 .tasks = tasks, 97 .err = err, 98 .name = name, 99 .context = context, 100 }}) catch |spawn_err| { 101 logError(io, err, "{s}: listener spawn failed: {s}\n", .{ name, @errorName(spawn_err) }); 102 }; 103 } 104