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
|
// static server (8089)
var http = require('http')
var serve = require('ecstatic')
var open = require('open')
http.createServer(
serve({ root: __dirname})
).listen(8089)
open('http://localhost:8089')
// ws server (8080)
var WebSocket = require('ws')
var fs = require('fs')
var nacl = require('tweetnacl')
nacl.util = require('tweetnacl-util')
var wserver = new WebSocket.Server({ port: 8080 })
wserver.on('connection', function (ws) {
ws.on('message', function (message) {
var req = JSON.parse(message)
if (req.seq) {
if (fs.existsSync(__dirname + '/bogs/' + req.src)) {
fs.readFile(__dirname + '/bogs/' + req.src, 'UTF-8', function (err, data) {
if (data) {
var log = JSON.parse(data)
var pubkey = nacl.util.decodeBase64(req.src.substring(1))
var sig = nacl.util.decodeBase64(log[0].signature)
var opened = JSON.parse(nacl.util.encodeUTF8(nacl.sign.open(sig, pubkey)))
var res = {
feed: req.src,
seq: opened.seq
}
ws.send(JSON.stringify(res))
if(res.seq > req.seq) {
console.log('Sending diff of' + req.src + ' to ' + req.requester)
var diff = res.seq - req.seq
var sendlog = log.slice(0, diff)
var send = {
src: req.src,
log: sendlog
}
ws.send(JSON.stringify(send))
}
}
})
} else {
var res = {
feed: req.src,
seq: null
}
ws.send(JSON.stringify(res))
}
} else if (req.seq === null) {
if (fs.existsSync(__dirname + '/bogs/' + req.src)) {
fs.readFile(__dirname + '/bogs/' + req.src, 'UTF-8', function (err, data) {
var log = JSON.parse(data)
var res = {
src: req.src,
log
}
console.log('Sending full log of ' + req.src + ' to ' + req.requester )
ws.send(JSON.stringify(res))
})
}
}
if (req.log) {
if (fs.existsSync(__dirname + '/bogs/' + req.src)) {
fs.readFile(__dirname + '/bogs/' + req.src, 'UTF-8', function (err, data) {
var serverlog = JSON.parse(data)
var newlog = req.log.concat(serverlog)
fs.writeFile(__dirname + '/bogs/' + req.src, JSON.stringify(newlog), 'UTF-8', function (err, success) {
console.log('Appending diff of ' + req.src + ' from ' + req.requester + ' and saved to server')
})
})
} else {
fs.writeFile(__dirname + '/bogs/' + req.src, JSON.stringify(req.log), 'UTF-8', function (err, success) {
if (err) throw err
else
console.log('Saved new log of ' + req.src + ' that was sent from ' + req.requester )
})
}
}
})
})
|