This repository has been archived by the owner on Jan 22, 2023. It is now read-only.
/
naviserver.js
executable file
·129 lines (98 loc) · 3.4 KB
/
naviserver.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/usr/bin/env node
'use strict';
var utils = require('./utils.js');
var udp = require('./udp.js');
var sources = require('./sources.js');
var jsonsource = require('./jsonsource.js');
var winston = require('winston');
var Bacon = require("baconjs").Bacon;
exports.startApp = function () {
var optimist = sources.usages()
.usage('$0: Http server and router for navigational data (NMEA 0183 & NMEA 2000)')
.describe('u', 'Broadcast nmea 0183 via udp on port 7777')
.describe('b', 'Broadcast address for udp broadcast')
.describe('writejson', 'Write the internal json stream to [filename]')
.describe('p', 'http port')
.demand('boat')
.describe('boat', 'boat configuration, loaded from lib/boats/ directory')
.options('p', {default: 8080})
.wrap(70);
var argv = optimist.argv;
if (argv.help) {
optimist.showHelp();
process.exit(0);
}
var express = require('express');
var app = express();
var path = require('path')
var oneDay = 86400000;
app.get("/swipe*", function(req,res) {
res.sendfile(path.resolve(__dirname + '/../webapp/swipe.html'));
});
app.get('/api/0.1/vessels', function (request, response) {
response.json([
{
name: 'Cassiopeia',
href: '../vessel/byName/cassiopeia'
},
{
name: 'Freya',
href: '../vessel/byName/freya'
},
{
name: 'Plaka',
href: '../vessel/byName/plaka'
}
]);
});
app.use(express.static(__dirname + '/../webapp/', { maxAge: oneDay }));
var server = require('http').createServer(app);
server.listen(Number(process.env.PORT || argv.p));
var primus = new require('primus')(server, {
parser: 'JSON'
});
var connectionEventsAsIntegers = new Bacon.Bus();
var hasActiveClients = connectionEventsAsIntegers.scan(0, function(x,y){return x +y;}).map(function(v) { return v > 0;});
var streamSources = sources.configure(argv, hasActiveClients);
require('./boats/' + argv.boat + '.js').boat.configureStreams(streamSources);
if (argv.u) {
udp.create(streamSources.nmea.raw, argv);
}
if (argv.writejson) {
jsonsource.startWriting(streamSources.n2k.all, streamSources.nmea, argv.writejson)
}
primus.on('connection', function (spark) {
spark['unsubscribe'] = [];
connectionEventsAsIntegers.push(1);
winston.info('Connect:' + spark.id + " " + JSON.stringify(spark.query));
if (spark.query['pgn'] != undefined) {
[].concat(spark.query['pgn']).map(function (pgn) {
var stream = streamconfig.out.pgn.pgnStream(pgn);
spark['unsubscribe'].push(stream.subscribe(function (event) {
spark.write(event.value());
}))
});
} else if (spark.query['gaugedata'] != undefined) {
spark['unsubscribe'].push(streamSources.gaugeData.subscribe(function (event) {
spark.write(event.value());
}));
} else {
spark['unsubscribe'].push(streamSources.n2k.subscribe(function (event) {
spark.write(event.value());
}));
spark['unsubscribe'].push(streamSources.nmea.json.subscribe(function (event) {
spark.write(event.value());
}));
}
}
)
;
primus.on('disconnection', function (spark) {
connectionEventsAsIntegers.push(-1);
winston.info("Disconnect:" + spark.id);
spark['unsubscribe'].map(function (unsubscribeF) {
unsubscribeF();
});
});
return server;
}