summaryrefslogtreecommitdiff
path: root/src/server/client.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/client.zig')
-rw-r--r--src/server/client.zig17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/server/client.zig b/src/server/client.zig
index 9acc3b1..69e655b 100644
--- a/src/server/client.zig
+++ b/src/server/client.zig
@@ -7,6 +7,8 @@ pub const ClientState = struct {
/// Messages that this client should receive.
recv_queue: std.Io.Queue(Message) = undefined,
recv_queue_buffer: [1024]Message = undefined,
+ // Used to take ownership of values as they are put in the queue.
+ recv_alloc: std.mem.Allocator,
from_client: *std.Io.Reader,
to_client: *std.Io.Writer,
@@ -15,11 +17,13 @@ pub const ClientState = struct {
pub fn init(
connect: Message.AllocatedConnect,
+ alloc: std.mem.Allocator,
in: *std.Io.Reader,
out: *std.Io.Writer,
) !ClientState {
var res: ClientState = .{
.connect = connect,
+ .recv_alloc = alloc,
.from_client = in,
.to_client = out,
};
@@ -49,6 +53,7 @@ pub const ClientState = struct {
writeInfo(self.to_client, info) catch break;
},
.msg => |m| {
+ defer m.deinit(self.recv_alloc);
writeMsg(self.to_client, m) catch break;
},
else => {
@@ -68,8 +73,16 @@ pub const ClientState = struct {
}
/// Return true if the value was put in the clients buffer to process, else false.
- pub fn send(self: *ClientState, io: std.Io, msg: Message) (std.Io.Cancelable || std.Io.QueueClosedError)!void {
- try self.recv_queue.putOne(io, msg);
+ pub fn send(self: *ClientState, io: std.Io, msg: Message) !void {
+ // Client needs to own msg that is put in its queue
+ switch (msg) {
+ .msg => |m| {
+ try self.recv_queue.putOne(io, .{ .msg = try m.dupe(self.recv_alloc) });
+ },
+ else => {
+ try self.recv_queue.putOne(io, msg);
+ },
+ }
}
pub fn next(self: *ClientState, allocator: std.mem.Allocator) !Message {