Mercurial > code > home > repos > homeauto
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 |
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 |