blob: d26aa0a36daf840890ddd063dde91998115591b1 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import asyncnet, asyncdispatch, strtabs
type
WebSocketCallback = proc (client: WebSocket, message: WebSocketMessage) {.closure, gcsafe.}
WebSocketRecvClosure = proc (ws: WebSocket): Future[string] {.gcsafe.}
WebSocketMessage = ref object
msg: string
WebSocket = ref object
socket: AsyncSocket
header: StringTableRef
onOpen: WebSocketCallback
onMessage: WebSocketCallback
onClose: WebSocketCallback
proc recv(ws: WebSocket, p: WebSocketRecvClosure): Future[string] {.async.}=
if not ws.socket.isClosed():
result = await ws.p()
if result == "":
ws.socket.close()
if ws.onClose != nil:
ws.onClose(ws, nil)
return result
proc reсvSize(ws: WebSocket, size: int): Future[string] {.async.} =
proc recvSizeClosure(ws: WebSocket): Future[string] {.async.} =
return await ws.socket.recv(size)
return await ws.recv(recvSizeClosure)
|