From 018ea4761cd8a61ef3b45d80b68808b06f4bf6f2 Mon Sep 17 00:00:00 2001 From: Robby Zambito Date: Sun, 25 Jan 2026 13:22:08 -0500 Subject: Move connection writer into connection Make chunk size a part of the connection type --- src/main.zig | 86 ++++-------------------------------------------------------- 1 file changed, 5 insertions(+), 81 deletions(-) (limited to 'src/main.zig') diff --git a/src/main.zig b/src/main.zig index c6a8e76..b4d1977 100644 --- a/src/main.zig +++ b/src/main.zig @@ -142,7 +142,7 @@ pub fn main(init: std.process.Init) !void { log.debug("Connection started", .{}); - var connection_writer: ConnectionWriter = .init(init.io, &connection, &con_buf); + var connection_writer: zaprus.Connection.Default.Writer = .init(init.io, &connection, &con_buf); next_message: while (true) { var res_buf: [2048]u8 = undefined; @@ -167,7 +167,10 @@ pub fn main(init: std.process.Init) !void { var child_output_buf: [SaprusClient.max_payload_len]u8 = undefined; var child_output_reader = child.stdout.?.reader(init.io, &child_output_buf); - _ = child_output_reader.interface.stream(&connection_writer.interface, .limited(SaprusClient.max_payload_len * 10)) catch continue :next_message; + _ = child_output_reader.interface.stream( + &connection_writer.interface, + .limited(@TypeOf(connection_writer.connection.*).chunk_size * 10), + ) catch continue :next_message; } } } @@ -175,85 +178,6 @@ pub fn main(init: std.process.Init) !void { unreachable; } -const ConnectionWriter = struct { - connection: *zaprus.Connection, - io: std.Io, - interface: Writer, - err: ?anyerror, - - pub fn init(io: std.Io, connection: *zaprus.Connection, buf: []u8) ConnectionWriter { - return .{ - .connection = connection, - .io = io, - .interface = .{ - .vtable = &.{ - .drain = drain, - }, - .buffer = buf, - }, - .err = null, - }; - } - - pub fn drain(io_w: *Writer, data: []const []const u8, splat: usize) Writer.Error!usize { - _ = splat; - const self: *ConnectionWriter = @alignCast(@fieldParentPtr("interface", io_w)); - var res: usize = 0; - - // Get buffered data from the writer - const buffered = io_w.buffered(); - var buf_offset: usize = 0; - - // Process buffered data in chunks - while (buf_offset < buffered.len) { - const chunk_size = @min(SaprusClient.max_payload_len, buffered.len - buf_offset); - const chunk = buffered[buf_offset..][0..chunk_size]; - - // Base64 encode the chunk - var encoded_buf: [SaprusClient.max_payload_len * 2]u8 = undefined; - const encoded_len = std.base64.standard.Encoder.calcSize(chunk.len); - const encoded = std.base64.standard.Encoder.encode(&encoded_buf, chunk); - - // Send encoded chunk - self.connection.send(self.io, encoded[0..encoded_len]) catch |err| { - self.err = err; - return error.WriteFailed; - }; - self.io.sleep(.fromMilliseconds(40), .boot) catch @panic("honk shoo"); - - buf_offset += chunk_size; - res += chunk_size; - } - - // Process data slices - for (data) |slice| { - var slice_offset: usize = 0; - - while (slice_offset < slice.len) { - const chunk_size = @min(SaprusClient.max_payload_len, slice.len - slice_offset); - const chunk = slice[slice_offset..][0..chunk_size]; - - // Base64 encode the chunk - var encoded_buf: [SaprusClient.max_payload_len * 2]u8 = undefined; - const encoded_len = std.base64.standard.Encoder.calcSize(chunk.len); - const encoded = std.base64.standard.Encoder.encode(&encoded_buf, chunk); - - // Send encoded chunk - self.connection.send(self.io, encoded[0..encoded_len]) catch |err| { - self.err = err; - return error.WriteFailed; - }; - self.io.sleep(.fromMilliseconds(40), .boot) catch @panic("honk shoo"); - - slice_offset += chunk_size; - res += chunk_size; - } - } - - return res; - } -}; - // const ConnectionWriter = struct { // connection: *zaprus.Connection, // io: std.Io, -- cgit