| 1 | // vtest build: present_openssl? |
| 2 | module main |
| 3 | |
| 4 | import net.websocket |
| 5 | import term |
| 6 | |
| 7 | fn slog(message string) { |
| 8 | eprintln(term.colorize(term.bright_yellow, message)) |
| 9 | } |
| 10 | |
| 11 | // this server accepts client connections and broadcast all messages to other connected clients |
| 12 | fn main() { |
| 13 | eprintln('press ctrl-c to quit...') |
| 14 | start_server()! |
| 15 | } |
| 16 | |
| 17 | fn start_server() ! { |
| 18 | slog('start_server') |
| 19 | mut s := websocket.new_server(.ip6, 30000, '') |
| 20 | defer { |
| 21 | unsafe { |
| 22 | s.free() |
| 23 | } |
| 24 | } |
| 25 | // Make that in execution test time give time to execute at least one time |
| 26 | s.set_ping_interval(100) |
| 27 | s.on_connect(fn (mut s websocket.ServerClient) !bool { |
| 28 | slog('s.on_connect') |
| 29 | // Here you can look att the client info and accept or not accept |
| 30 | // just returning a true/false |
| 31 | if s.resource_name != '/' { |
| 32 | return false |
| 33 | } |
| 34 | return true |
| 35 | })! |
| 36 | |
| 37 | // on_message_ref, broadcast all incoming messages to all clients except the one sent it |
| 38 | s.on_message_ref(fn (mut ws websocket.Client, msg &websocket.Message, mut m websocket.Server) ! { |
| 39 | slog('s.on_message_ref') |
| 40 | // for _, cli in m.clients { |
| 41 | for i, _ in rlock m.server_state { |
| 42 | m.server_state.clients |
| 43 | } { |
| 44 | mut c := rlock m.server_state { |
| 45 | m.server_state.clients[i] or { continue } |
| 46 | } |
| 47 | if c.client.get_state() == .open && c.client.id != ws.id { |
| 48 | c.client.write(msg.payload, websocket.OPCode.text_frame) or { panic(err) } |
| 49 | } |
| 50 | } |
| 51 | }, s) |
| 52 | |
| 53 | s.on_close(fn (mut ws websocket.Client, code int, reason string) ! { |
| 54 | slog('s.on_close') |
| 55 | println(term.green('client (${ws.id}) closed connection')) |
| 56 | }) |
| 57 | |
| 58 | s.listen() or { println(term.red('error on server listen: ${err}')) } |
| 59 | slog('s.listen done') |
| 60 | } |
| 61 | |