Lindenii Project Forge
Login

hare-ev

Temporary fork of hare-ev for... reasons

Warning: Due to various recent migrations, viewing non-HEAD refs may be broken.

/ev/server/server.ha (raw)

use ev;
use io;
use memio;
use os;

export type server = struct {
	sock: *ev::file,
	clients: []*server_client,
	cb: *opaque,
	user: nullable *opaque
};

export type server_client = struct {
	sock: *ev::file,
	server: *server,

	rbuf: [os::BUFSZ]u8,
	wbuf: []u8,
	buf: memio::stream,
};

export fn newserver(sock: *ev::file, cb: *opaque, user: nullable *opaque) (*server | nomem) = {
	return alloc(server {
		sock = sock,
		cb = cb,
		user = user,
		...
	});
};

export fn server_finish(serv: *server) void = {
	for (let i = 0z; i < len(serv.clients); i += 1) {
		client_close(serv.clients[i]);
		i -= 1;
	};
	free(serv);
};

export fn newclient(serv: *server, sock: *ev::file) (*server_client | nomem) = {
	return alloc(server_client {
		server = serv,
		sock = sock,
		buf = memio::dynamic(),
		...
	});
};

export fn client_close(client: *server_client) void = {
	const server = client.server;
	for (let i = 0z; i < len(server.clients); i += 1) {
		if (server.clients[i] == client) {
			delete(server.clients[i]);
			break;
		};
	};
	ev::close(client.sock);

	io::close(&client.buf)!;

	free(client);
};