UNPKG

5.3 kBJavaScriptView Raw
1'use strict';
2
3var path = require('path');
4var express = require('express');
5var app = express();
6var http = require('http');
7
8var bodyParser = require('body-parser');
9
10var argv = require('minimist')(process.argv.slice(2));
11
12var port = argv.p || 7500;
13
14if (argv.v) {
15 var pack = require('./package.json');
16 console.log('collar-dev-server version ' + pack.version);
17 process.exit();
18}
19
20// const io = require('socket.io')(server);
21
22app.use(bodyParser.json());
23app.use(bodyParser.urlencoded({ extended: false }));
24app.use(express.static(path.join(__dirname, 'public')));
25
26var elementBuffer = [];
27var signalBuffer = [];
28
29var apps = {}; // app id
30
31var DEFAULT_ELEMENT_BLOCK = 10;
32var DEFAULT_SIGNAL_BLOCK = 10;
33
34var record = false;
35var count = 0;
36
37function getProcessId(data) {
38 var processId = '__anonymous__';
39 if (data && data.process) {
40 processId = data.process;
41 }
42 return processId;
43}
44
45var WebSocketServer = require('collar-websocket').Server;
46
47var server = http.createServer(app);
48var wss = new WebSocketServer(server);
49wss.onAuth(function (id, secret, done) {
50 // todo: authenticate the requests
51 // accept all request
52 done(null, { id: id });
53});
54wss.on('connect', function (socket) {
55 var ns = socket.ns;
56
57 if (ns === '/client') {
58 console.log('client [' + socket.clientId + '] connected');
59 /*
60 * Clients
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 * Applications
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
217server.listen(port, function () {
218 console.log('collar dev server listening on port', port);
219});