1 | 'use strict';
|
2 |
|
3 | var path = require('path');
|
4 | var express = require('express');
|
5 | var app = express();
|
6 | var http = require('http');
|
7 |
|
8 | var bodyParser = require('body-parser');
|
9 |
|
10 | var argv = require('minimist')(process.argv.slice(2));
|
11 |
|
12 | var port = argv.p || 7500;
|
13 |
|
14 | if (argv.v) {
|
15 | var pack = require('./package.json');
|
16 | console.log('collar-dev-server version ' + pack.version);
|
17 | process.exit();
|
18 | }
|
19 |
|
20 |
|
21 |
|
22 | app.use(bodyParser.json());
|
23 | app.use(bodyParser.urlencoded({ extended: false }));
|
24 | app.use(express.static(path.join(__dirname, 'public')));
|
25 |
|
26 | var elementBuffer = [];
|
27 | var signalBuffer = [];
|
28 |
|
29 | var apps = {};
|
30 |
|
31 | var DEFAULT_ELEMENT_BLOCK = 10;
|
32 | var DEFAULT_SIGNAL_BLOCK = 10;
|
33 |
|
34 | var record = false;
|
35 | var count = 0;
|
36 |
|
37 | function getProcessId(data) {
|
38 | var processId = '__anonymous__';
|
39 | if (data && data.process) {
|
40 | processId = data.process;
|
41 | }
|
42 | return processId;
|
43 | }
|
44 |
|
45 | var WebSocketServer = require('collar-websocket').Server;
|
46 |
|
47 | var server = http.createServer(app);
|
48 | var wss = new WebSocketServer(server);
|
49 | wss.onAuth(function (id, secret, done) {
|
50 |
|
51 |
|
52 | done(null, { id: id });
|
53 | });
|
54 | wss.on('connect', function (socket) {
|
55 | var ns = socket.ns;
|
56 |
|
57 | if (ns === '/client') {
|
58 | console.log('client [' + socket.clientId + '] connected');
|
59 | |
60 |
|
61 |
|
62 | socket.on('start record', function (data) {
|
63 | console.log('start recording');
|
64 | record = true;
|
65 | count = new Date().getTime();
|
66 | signalBuffer = [];
|
67 | });
|
68 |
|
69 | socket.on('stop record', function (data) {
|
70 | console.log('stop recording');
|
71 | record = false;
|
72 | count = new Date().getTime();
|
73 | signalBuffer = [];
|
74 | });
|
75 |
|
76 | socket.on('push', function (data) {
|
77 | var id = data.nodeId;
|
78 | var signal = data.signal;
|
79 |
|
80 | wss.of('/app').emit('push', data);
|
81 | });
|
82 |
|
83 | socket.on('send', function (data) {
|
84 | var id = data.nodeId;
|
85 | var signal = data.signal;
|
86 |
|
87 | wss.of('/app').emit('send', data);
|
88 | });
|
89 |
|
90 | socket.on('clear', function (data) {
|
91 | elementBuffer = [];
|
92 | signalBuffer = [];
|
93 | });
|
94 |
|
95 | socket.on('ready to receive elements', function (blockSize) {
|
96 | if (!blockSize || typeof blockSize !== 'number') {
|
97 | blockSize = DEFAULT_ELEMENT_BLOCK;
|
98 | }
|
99 |
|
100 | var tobesent = [];
|
101 | for (var i = 0; i < blockSize; i++) {
|
102 | if (elementBuffer.length > i) {
|
103 | tobesent.push(elementBuffer.shift());
|
104 | } else {
|
105 | break;
|
106 | }
|
107 | }
|
108 |
|
109 | if (tobesent.length > 0) {
|
110 | wss.of('/client').emit('append elements', {
|
111 | elements: tobesent
|
112 | });
|
113 | }
|
114 | });
|
115 |
|
116 | socket.on('ready to receive signals', function (blockSize) {
|
117 | if (!record) return;
|
118 |
|
119 | if (!blockSize || typeof blockSize !== 'number') {
|
120 | blockSize = DEFAULT_SIGNAL_BLOCK;
|
121 | }
|
122 |
|
123 | var tobesent = [];
|
124 | for (var i = 0; i < blockSize; i++) {
|
125 | if (signalBuffer.length > i) {
|
126 | tobesent.push(signalBuffer.shift());
|
127 | } else {
|
128 | break;
|
129 | }
|
130 | }
|
131 |
|
132 | if (tobesent.length > 0 && record) {
|
133 | wss.of('/client').emit('append signals', {
|
134 | signals: tobesent
|
135 | });
|
136 | }
|
137 | });
|
138 | } else if (ns === '/app') {
|
139 | console.log('application [' + socket.clientId + '] connected');
|
140 |
|
141 | |
142 |
|
143 |
|
144 | socket.on('new model', function (data) {
|
145 | var processId = getProcessId(data);
|
146 | wss.of('/client').emit('new model', {
|
147 | processId: processId
|
148 | });
|
149 | });
|
150 |
|
151 | socket.on('append elements', function (data) {
|
152 | if (typeof data === 'string') {
|
153 | try {
|
154 | data = JSON.parse(data);
|
155 | } catch (err) {
|
156 | console.warn('error parsing received "append elements" data');
|
157 | return;
|
158 | }
|
159 | }
|
160 |
|
161 | var _iteratorNormalCompletion = true;
|
162 | var _didIteratorError = false;
|
163 | var _iteratorError = undefined;
|
164 |
|
165 | try {
|
166 | for (var _iterator = data.elements[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
167 | var elem = _step.value;
|
168 |
|
169 | if (!elem.data) elem.data = {};
|
170 | elementBuffer.push(elem);
|
171 | }
|
172 | } catch (err) {
|
173 | _didIteratorError = true;
|
174 | _iteratorError = err;
|
175 | } finally {
|
176 | try {
|
177 | if (!_iteratorNormalCompletion && _iterator.return) {
|
178 | _iterator.return();
|
179 | }
|
180 | } finally {
|
181 | if (_didIteratorError) {
|
182 | throw _iteratorError;
|
183 | }
|
184 | }
|
185 | }
|
186 | });
|
187 |
|
188 | socket.on('append signals', function (data) {
|
189 | if (typeof data === 'string') {
|
190 | try {
|
191 | data = JSON.parse(data);
|
192 | } catch (err) {
|
193 | console.warn('error parsing received "append elements" data');
|
194 | return;
|
195 | }
|
196 | }
|
197 |
|
198 | var signals = data.signals.filter(function (n) {
|
199 | return n != undefined && n != null;
|
200 | });
|
201 |
|
202 | if (record) {
|
203 | for (var i = 0; i < signals.length; i++) {
|
204 | if (!signals[i]) {
|
205 | continue;
|
206 | }
|
207 | signals[i].time = count;
|
208 | count++;
|
209 |
|
210 | signalBuffer.push(signals[i]);
|
211 | }
|
212 | }
|
213 | });
|
214 | }
|
215 | });
|
216 |
|
217 | server.listen(port, function () {
|
218 | console.log('collar dev server listening on port', port);
|
219 | });
|