From 211fa3d9470ee919075f10b3c73db6c4c7b0f3db Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Tue, 16 Apr 2024 16:38:15 +0200 Subject: [PATCH] Handle several JSON msg in 1 read Signed-off-by: Francis Bouvier --- src/server.zig | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/src/server.zig b/src/server.zig index 1ee9f953..79ebba04 100644 --- a/src/server.zig +++ b/src/server.zig @@ -35,7 +35,11 @@ pub const Cmd = struct { return; }; - const input = self.buf[0..size]; + // input + var input = self.buf[0..size]; + if (std.log.defaultLogEnabled(.debug)) { + std.debug.print("\ninput {s}\n", .{input}); + } // close on exit command if (std.mem.eql(u8, input, "exit")) { @@ -43,22 +47,35 @@ pub const Cmd = struct { return; } - // input - if (std.log.defaultLogEnabled(.debug)) { - std.debug.print("\ninput {s}\n", .{input}); - } + // cmds + var cmd: []const u8 = undefined; + while (true) { - // cdp - const res = cdp.do(self.alloc(), input, self) catch |err| { - if (cdp.isCdpError(err)) |e| { - self.err = e; - return; + // handle several JSON msg in 1 read + const pos = std.mem.indexOf(u8, input, "}{"); + if (pos) |p| { + cmd = input[0 .. p + 1]; + input = input[p + 1 ..]; + } else { + cmd = input; } - @panic(@errorName(err)); - }; - std.log.debug("res {s}", .{res}); - sendAsync(self, res) catch unreachable; + // cdp + const res = cdp.do(self.alloc(), cmd, self) catch |err| { + if (cdp.isCdpError(err)) |e| { + self.err = e; + return; + } + @panic(@errorName(err)); + }; + std.log.debug("res {s}", .{res}); + + sendAsync(self, res) catch unreachable; + + if (pos == null) break; + + // TODO: handle 1 read smaller than a complete JSON msg + } // continue receving incomming messages asynchronously self.loop().io.recv(*Cmd, self, cbk, completion, self.socket, self.buf);