v2 / examples / websocket / client-server / server.v
60 lines · 53 sloc · 1.59 KB · a80bc2331450fc28c900097f8afafe173f161d27
Raw
1// vtest build: present_openssl?
2module main
3
4import net.websocket
5import term
6
7fn 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
12fn main() {
13 eprintln('press ctrl-c to quit...')
14 start_server()!
15}
16
17fn 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