-
Notifications
You must be signed in to change notification settings - Fork 0
/
router.js
103 lines (81 loc) · 2.68 KB
/
router.js
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
var jsonBody = require("body/json")
var sendJson = require("send-data/json")
var Router = require("routes")
var extend = require("util")._extend
var EventEmitter = require("events").EventEmitter
var isSend = /\/send$/
var isQuery = /.*\/query\/(.+)/
module.exports = EventLogRouter
/* EventLog is a router where you can handle event's and queries.
```js
var router = EventLogRouter(EventLog(...))
router.addRoute("/event/{{ev.value.type}}", function (ev, req, res) {
// is this event valid?
// store it
// return some kind of error or ok message
})
router.addRoute("/event/*", function (ev, req, res) {
// all other events not manually enumerated
})
router.addRoute("/query/{{query.name}}", function () {
// someone asked for a query
// find the thing in the database
// return it
})
httpRouter.addRoute("/event-log/*", router)
```
To use this you should make http requests to
POST /event-log/send EVENT_BODY
POST /event-log/query/QUERY_NAME
*/
function EventLogRouter(log, opts) {
var router = Router()
var notFound = (opts && opts.notFound) || fourofour
handler.addRoute = function addRoute(uri, fn) {
router.addRoute(uri, fn)
}
extend(handler, EventEmitter.prototype)
handler._events = {}
return handler
function handler(req, res) {
var uri = req.url
var isSendRequest = uri.match(isSend)
var isQueryRequest = uri.match(isQuery)
if (!isSendRequest && !isQueryRequest) {
return notFound(req, res)
}
jsonBody(req, res)(function (err, body) {
if (err) {
return sendJson(req, res, {
body: { message: err.message },
statusCode: 500
})
}
var route
if (isSendRequest) {
var type = body && body.value && body.value.type
if (type) {
route = router.match("/event/" + type)
} else {
route = router.match("/event")
}
handler.emit("event", req, res, body)
} else if (isQueryRequest) {
var viewName = isQueryRequest[1]
route = router.match("/query/" + viewName)
}
if (!route) {
return notFound(req, res)
}
route.fn(req, res, body, route.params)
})
}
function fourofour(req, res) {
sendJson(req, res, {
body: {
message: "event-log-server: 404 Not Found"
},
statusCode: 404
})
}
}