-
Notifications
You must be signed in to change notification settings - Fork 6
/
pushnot-server.js
91 lines (69 loc) · 1.9 KB
/
pushnot-server.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
var config = require('./config')
var secure = require('./secure')
var storage = require('./storage')
// express app
var express = require('express')
var app = express()
app.use(express.urlencoded())
// zmq server
var zmq = require('zmq')
var pub = zmq.socket('pub')
pub.bindSync('tcp://0.0.0.0:' + config.zmq)
// initialize the database
storage.latest().otherwise(function() {
var welcomeMessage = { app: 'pushnot', text: 'Welcome to pushnot! :3' }
return storage.push(secure.encrypt(welcomeMessage))
.then(function() {
console.log('Welcome to pushnot! :)')
})
})
.otherwise(function() {
console.error('!!!!! CANNOT INITIALIZE DATABASE !!!!!')
})
// notify all subscribers
function notifyAll() {
storage.latest().then(function(id) {
pub.send('latest ' + JSON.stringify({ latest: id }))
})
.otherwise(console.error)
}
// authenticate using hawk...
var hawk = require('hawk')
function getCredentials(id, callback) {
callback(null, { key: config.key, user: 'pushnot', algorithm: 'sha256' })
}
app.use(function(req, res, next) {
hawk.server.authenticate(req, getCredentials, { }, function(err) {
if (err) {
next(err)
} else {
next()
}
})
})
// return the latest notification message
app.all('/latest', function(req, res, next) {
storage.latest().then(function(id) {
res.json({ latest: id })
})
.otherwise(next)
})
// return notification messages after specified id
app.all('/after/:id', function(req, res, next) {
storage.after(req.param('id')).then(function(data) {
res.json(data)
})
.otherwise(next)
})
// send notification
app.post('/notify', function(req, res, next) {
storage.push(req.param('data')).then(function(id) {
console.log(id, req.param('data'))
notifyAll()
pub.send('latest ' + JSON.stringify({ latest: id }))
res.json('k')
})
.otherwise(console.error)
})
app.listen(config.http)
setInterval(notifyAll, 15000)