annotate service/rfid_pn532/graphserver.nim @ 1202:3c5e5c9ac935

a little further on toplevel nim code. event passing is not working Ignore-this: 86bdf86c796f2cf2ce2f245a0468c4eb darcs-hash:559bcdbc0750d19eb770bb78171ef7e9ec317960
author drewp <drewp@bigasterisk.com>
date Thu, 21 Feb 2019 22:37:04 -0800
parents 87283af13f15
children 56af0ca2db10
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1199
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
1 import asynchttpserver, asyncdispatch, asyncnet, strtabs, sequtils, times, os, strutils, strformat
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
2
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
3 type
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
4 GraphServer* = ref object of RootObj
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
5 port*: int
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
6 clients: seq[AsyncSocket]
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
7 previousUpdateTime: int
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
8 httpServer: AsyncHttpServer
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
9 serverReady: Future[void]
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
10
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
11 proc handleCORS(req: Request) {.async.} =
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
12 await req.respond(Http204, "", newHttpHeaders({
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
13 "Access-Control-Allow-Origin": "*",
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
14 "Connection": "close"}))
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
15
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
16 proc handle404(req: Request) {.async.} =
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
17 let headers = newHttpHeaders({"Content-Type": "text/plain",
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
18 "Connection": "close"})
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
19
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
20 await req.respond(Http404, "File not found", headers)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
21 req.client.close()
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
22
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
23 proc handleSSE(self: GraphServer, req: Request) {.async.} =
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
24 let headers = newHttpHeaders({"Content-Type": "text/event-stream",
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
25 "Access-Control-Allow-Origin": "*",
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
26 "Cache-Control": "no-cache",
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
27 "Connection": "keep-alive"})
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
28
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
29 await req.client.send("HTTP/1.1 200 OK\c\L")
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
30 await req.sendHeaders(headers)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
31 await req.client.send("\c\L:ok\n\n")
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
32 self.clients.add(req.client)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
33
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
34 proc handleConnections(self: GraphServer, req: Request) {.async.} =
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
35 let clientCount = self.clients.len
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
36 let headers = newHttpHeaders({"Content-Type": "text/plain",
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
37 "Access-Control-Allow-Origin": "*",
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
38 "Cache-Control": "no-cache",
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
39 "Connection": "close"})
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
40
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
41 await req.respond(Http200, $clientCount, headers)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
42 req.client.close()
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
43
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
44 proc requestCallback(self: GraphServer, req: Request) {.async.} =
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
45 if req.reqMethod == HttpOptions:
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
46 asyncCheck handleCORS(req)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
47 else:
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
48 case req.url.path
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
49 of "/connections": asyncCheck self.handleConnections(req)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
50 of "/sse": asyncCheck self.handleSSE(req)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
51 else: asyncCheck handle404(req)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
52
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
53 proc newGraphServer*(port: int): GraphServer =
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
54 new(result)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
55 result.port = port
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
56 result.previousUpdateTime = toInt(epochTime() * 1000)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
57
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
58 result.httpServer = newAsyncHttpServer(true)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
59 let self = result
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
60 self.serverReady = self.httpServer.serve(
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
61 Port(self.port),
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
62 proc (req: Request): Future[void] = self.requestCallback(req),
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
63 address="0.0.0.0")
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
64 asyncCheck self.serverReady
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
65 echo "Listening on " & $self.port
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
66
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
67
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
68 proc checkClients(self: GraphServer) =
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
69 self.clients = self.clients.filterIt(not it.isClosed())
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
70
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
71 proc pingClients(self: GraphServer) {.async.} =
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
72 let currentTime = toInt(epochTime() * 1000)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
73
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
74 if currentTime - self.previousUpdateTime < 1000:
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
75 return
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
76
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
77 for client in self.clients:
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
78 if not client.isClosed():
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
79 asyncCheck client.send("data: " & $currentTime & "\n\n")
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
80
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
81 self.previousUpdateTime = toInt(epochTime() * 1000)
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
82
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
83 proc run*(self: GraphServer) =
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
84 while true:
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
85 self.checkClients()
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
86 asyncCheck self.pingClients()
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
87 poll()
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
88
87283af13f15 starting pn532 rfid reader in nim
drewp <drewp@bigasterisk.com>
parents:
diff changeset
89
1202
3c5e5c9ac935 a little further on toplevel nim code. event passing is not working
drewp <drewp@bigasterisk.com>
parents: 1199
diff changeset
90 # Replace graph contents
3c5e5c9ac935 a little further on toplevel nim code. event passing is not working
drewp <drewp@bigasterisk.com>
parents: 1199
diff changeset
91 proc setGraph*(self: GraphServer) =
3c5e5c9ac935 a little further on toplevel nim code. event passing is not working
drewp <drewp@bigasterisk.com>
parents: 1199
diff changeset
92 echo "graph replaced"
3c5e5c9ac935 a little further on toplevel nim code. event passing is not working
drewp <drewp@bigasterisk.com>
parents: 1199
diff changeset
93