UNPKG

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