ioserver 1.2.6 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,20 +8,15 @@
8
8
  [![Known Vulnerabilities](https://snyk.io/test/github/x42en/ioserver/badge.svg)](https://snyk.io/test/github/x42en/ioserver)
9
9
 
10
10
 
11
- Damn simple way to setup your [Socket.io](http://socket.io) server using coffeescript.
11
+ Damn simple way to setup your [Socket.io](http://socket.io) server using coffeescript or vanilla JS.
12
12
 
13
- This will launch a server on port specified (default: 8080) and will register all method of the class set as service, except ones starting by '_' (underscore).
14
- These registrated methods will then be accessible as standard client-side socket.io event:
13
+ This will launch a server on hots:port specified (default: localhost:8080) and will register all method of the class set as service, except ones starting by '_' (underscore). The web server is based on [Fastify](https://fastify.io/) so you can even add REST routes and interact with your socket.io rooms and namespaces.
14
+
15
+ The socket.io's registrated methods will then be accessible as standard client-side socket.io event:
15
16
  ```coffeescript
16
17
  socket.emit 'method_name', data
17
18
  ```
18
19
 
19
- **Warning: Version 1.2.x removed embedded HTTP(S) server and then changed constructor arguments !!**
20
-
21
- **Warning: Version 1.1.x changed 'interact' method to 'sendTo', and rename its arguments:**
22
- **- service -> namespace**
23
- **- method -> event**
24
-
25
20
  ## Install
26
21
 
27
22
  Install with npm:
@@ -33,7 +28,10 @@ Install with npm:
33
28
 
34
29
  Require the module:
35
30
  ```coffeescript
36
- app = require 'ioserver'
31
+ IOServer = require 'ioserver'
32
+
33
+ app = new IOServer
34
+ verbose: true
37
35
  ```
38
36
 
39
37
  Add manager using:
@@ -50,6 +48,20 @@ Add services using:
50
48
  service: ServiceClass
51
49
  ```
52
50
 
51
+ Add watchers using:
52
+ ```coffeescript
53
+ app.addWatcher
54
+ name: 'watcher_name'
55
+ watcher: WatcherClass
56
+ ```
57
+
58
+ Add controller using:
59
+ ```coffeescript
60
+ app.addController
61
+ name: 'controller_name'
62
+ controller: ControllerClass
63
+ ```
64
+
53
65
  Start the server...
54
66
  ```coffeescript
55
67
  app.start()
@@ -101,6 +113,70 @@ and even specific socket.id
101
113
  data: data
102
114
  ```
103
115
 
116
+ You can add controller with Middlewares and routes prefix:
117
+ ```coffeescript
118
+ app.addController
119
+ name: 'controller_name'
120
+ prefix: '/my_prefix/'
121
+ controller: ControllerClass
122
+ middlewares: [
123
+ RESTMiddleware
124
+ ]
125
+ ```
126
+
127
+ You cann add watchers class that will be launched at start using watch() method
128
+ ```coffeescript
129
+ app.addWatcher
130
+ name: 'watcher_name'
131
+ watcher: WatcherClass
132
+ ```
133
+
134
+ In order to meet the fastify requirements, some pre-requised are needed to setup REST endpoints.
135
+ 1. First your JS class will define your accessible controller's methods
136
+ ```coffeescript
137
+ module.exports = class HelloController
138
+ constructor: (@app) ->
139
+
140
+ _isAuthentified: (req, reply, next) ->
141
+ if not req.headers['x-authentication']?
142
+ return reply.forbidden()
143
+
144
+ next()
145
+
146
+ world: (req, reply) ->
147
+ return { message: "Hello world" }
148
+
149
+ display: (req, reply) ->
150
+ return { message: "Hello #{req.params.message}" }
151
+
152
+ restricted: (req, reply) ->
153
+ return { message: "Welcome on Private Area" }
154
+ ```
155
+
156
+ 2. Then setup a routes description file (by default it will be looked-up into a `routes/${controller_name}.json` directory at root level of your project). *You can use different location by specifying `routes` options on IOServer instanciation (see unit-tests for examples).*
157
+ ```json
158
+ [
159
+ {
160
+ "method": "GET",
161
+ "url": "/",
162
+ "handler": "world"
163
+ },
164
+ {
165
+ "method": "GET",
166
+ "url": "/:message",
167
+ "handler": "display"
168
+ },
169
+ {
170
+ "method": "GET",
171
+ "url": "/private/",
172
+ "handler": "restricted",
173
+ "preValidation": "_isAuthentified"
174
+ }
175
+ ]
176
+ ```
177
+ **All routes options from [fastify](https://www.fastify.io/docs/latest/Routes/#full-declaration) are supported**
178
+
179
+
104
180
  Common options are:
105
181
  ```coffeescript
106
182
  app = require 'ioserver'
@@ -227,6 +303,7 @@ npm --no-git-tag-version version [<newversion> | major | minor | patch]
227
303
  ```
228
304
 
229
305
  ## TODO
230
- * write better doc
231
- * publish chat demo example
232
- * improve unit tests for complete coverage (restricted method)
306
+ * [ ] write better doc
307
+ * [ ] publish chat demo example
308
+ * [x] improve unit tests for complete coverage (restricted method)
309
+ * [x] Add REST API support
package/build/ioserver.js CHANGED
@@ -1,6 +1,6 @@
1
1
  (function() {
2
2
  //###################################################
3
- // IOServer - v1.2.6 #
3
+ // IOServer - v1.3.0 #
4
4
  // #
5
5
  // Damn simple socket.io server #
6
6
  //###################################################
@@ -25,15 +25,17 @@
25
25
  // limitations under the License.
26
26
 
27
27
  // Add required packages
28
- var HOST, IOServer, IOServerError, LOG_LEVEL, PORT, TRANSPORTS, VERSION, closer, http,
28
+ var HOST, IOServer, IOServerError, LOG_LEVEL, PORT, RESERVED_NAMES, TRANSPORTS, VERSION, fastify, fs, path,
29
29
  indexOf = [].indexOf;
30
30
 
31
- http = require('http');
31
+ fs = require('fs');
32
32
 
33
- closer = require('http-terminator');
33
+ path = require('path');
34
+
35
+ fastify = require('fastify');
34
36
 
35
37
  // Set global vars
36
- VERSION = '1.2.4';
38
+ VERSION = '1.3.0';
37
39
 
38
40
  PORT = 8080;
39
41
 
@@ -43,57 +45,130 @@
43
45
 
44
46
  TRANSPORTS = ['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling'];
45
47
 
48
+ RESERVED_NAMES = ['send', 'log', 'verbose'];
49
+
46
50
  module.exports = IOServer = class IOServer {
47
51
  // Define the variables used by the server
48
52
  constructor(options = {}) {
49
- var cookie, cors, e, host, i, m, middleware, mode, port, ref, ref1, ref2, verbose;
53
+ var _cookie, _cors, _mode, cookie, cors, default_routes, err, host, i, m, mode, port, ref, ref1, ref2, routes, verbose;
50
54
  // Allow sending message from external app
51
55
  this.sendTo = this.sendTo.bind(this);
52
56
  // Set default options
53
- ({verbose, host, port, cookie, mode, cors, middleware} = options);
57
+ ({verbose, host, port, cookie, mode, cors, routes} = options);
54
58
  this.host = host ? String(host) : HOST;
55
59
  try {
56
60
  this.port = port ? Number(port) : PORT;
57
- } catch (error) {
58
- e = error;
59
- throw new Error('Invalid port.');
61
+ if (this.port <= 0) {
62
+ throw new Error('Invalid port');
63
+ }
64
+ if (this.port > 65535) {
65
+ throw new Error('Invalid port');
66
+ }
67
+ } catch (error1) {
68
+ err = error1;
69
+ throw new Error(err);
60
70
  }
61
- this.cookie = cookie ? Boolean(cookie) : false;
71
+ _cookie = Boolean(cookie) ? Boolean(cookie) : false;
62
72
  this.verbose = (ref = String(verbose).toUpperCase(), indexOf.call(LOG_LEVEL, ref) >= 0) ? String(verbose).toUpperCase() : 'ERROR';
73
+ // Does not yell if route directory does not exists... change that ?
74
+ default_routes = path.join(process.cwd(), 'routes');
75
+ this._routes = fs.existsSync(routes) ? String(routes) : default_routes;
63
76
 
64
77
  // Process transport mode options
65
- this.mode = [];
78
+ _mode = [];
66
79
  if (mode) {
67
80
  if (ref1 = String(mode).toLowerCase(), indexOf.call(TRANSPORTS, ref1) >= 0) {
68
- this.mode.push(String(mode).toLowerCase());
81
+ _mode.push(String(mode).toLowerCase());
69
82
  } else if (mode.constructor === Array) {
70
83
  for (i in mode) {
71
84
  m = mode[i];
72
85
  if (ref2 = String(m).toLowerCase(), indexOf.call(TRANSPORTS, ref2) >= 0) {
73
- this.mode.push(m);
86
+ _mode.push(m);
74
87
  }
75
88
  }
76
89
  }
77
90
  } else {
78
- this.mode.push('websocket');
79
- this.mode.push('polling');
91
+ _mode.push('websocket');
92
+ _mode.push('polling');
80
93
  }
81
94
 
82
95
  // Setup CORS since necessary in socket.io v3
83
- this.cors = (cors != null) && cors ? cors : {};
84
- if (!this.cors.methods) {
85
- this.cors.methods = ['GET', 'POST'];
96
+ _cors = (cors != null) && cors ? cors : {};
97
+ if (!_cors.methods) {
98
+ _cors.methods = ['GET', 'POST'];
86
99
  }
87
- if (!this.cors.origin) {
88
- this.cors.origin = [`https://${this.host}`, `http://${this.host}`];
100
+ if (!_cors.origin) {
101
+ _cors.origin = [`https://${this.host}`, `http://${this.host}`];
89
102
  }
90
103
 
91
104
  // Setup internal lists
92
105
  this.service_list = {};
93
106
  this.manager_list = {};
94
107
  this.method_list = {};
95
- this.middlewares = {};
96
-
108
+ this.watcher_list = {};
109
+ this.controller_list = {};
110
+ this.middleware_list = {};
111
+ try {
112
+ // Instanciate server (needed to register controllers)
113
+ this._webapp = fastify({
114
+ logger: this.verbose,
115
+ ignoreTrailingSlash: true,
116
+ maxParamLength: 200,
117
+ caseSensitive: true
118
+ });
119
+ } catch (error1) {
120
+ err = error1;
121
+ throw new Error(`[!] Unable to instanciate server: ${err}`);
122
+ }
123
+ try {
124
+ // Register standard HTTP error shortcuts
125
+ this._webapp.register(require('fastify-sensible'), {
126
+ errorHandler: false
127
+ });
128
+ } catch (error1) {
129
+ err = error1;
130
+ throw new Error(`[!] Unable to register sensible plugin: ${err}`);
131
+ }
132
+ try {
133
+ // Allow developper to use throw Error directly in methods
134
+ this._webapp.setErrorHandler(function(error, req, reply) {
135
+ var code;
136
+ // Handle IOServerError
137
+ if (error instanceof IOServerError) {
138
+ code = error.getCode() < 0 ? 500 : error.getCode();
139
+ return reply.status(code).send(error);
140
+ // Handle HTTPErrors
141
+ } else if ((error.status != null)) {
142
+ return reply.status(error.status).send({
143
+ message: error.message
144
+ });
145
+ } else {
146
+ // Handle standard Error
147
+ return reply.status(500).send(error.message);
148
+ }
149
+ });
150
+ } catch (error1) {
151
+ err = error1;
152
+ throw new Error(`[!] Unable to register error handler: ${err}`);
153
+ }
154
+ try {
155
+ // Register standard HTTP error shortcuts
156
+ this._webapp.register(require('fastify-cors'), _cors);
157
+ } catch (error1) {
158
+ err = error1;
159
+ throw new Error(`[!] Unable to register CORS plugin: ${err}`);
160
+ }
161
+ try {
162
+ // Register socket.io listener
163
+ this._webapp.register(require('fastify-socket.io'), {
164
+ transports: _mode,
165
+ cookie: _cookie,
166
+ cors: _cors
167
+ });
168
+ } catch (error1) {
169
+ err = error1;
170
+ throw new Error(`[!] Unable to register socket.io plugin: ${err}`);
171
+ }
97
172
  // Register the global app handle
98
173
  // that will be passed to all entities
99
174
  this.appHandle = {
@@ -101,7 +176,6 @@
101
176
  log: this._logify,
102
177
  verbose: this.verbose
103
178
  };
104
- this.server = null;
105
179
  }
106
180
 
107
181
  _logify(level, text) {
@@ -132,26 +206,54 @@
132
206
  return result;
133
207
  }
134
208
 
135
- addManager({name, manager}) {
209
+ _method_exists(klass, name) {
210
+ return klass[name] != null;
211
+ }
212
+
213
+ _register_internal_class(type, name, klass) {
136
214
  var err;
137
215
  if (!name) {
138
- throw "[!] Manager name is mandatory";
216
+ throw new Error("name is mandatory");
139
217
  }
140
- if (name && name.length < 2) {
141
- throw "[!] Manager name MUST be longer than 2 characters";
218
+ if ((type !== 'service') && name.length < 2) {
219
+ throw new Error("name MUST be longer than 2 characters");
142
220
  }
143
- if (name === 'send') {
144
- throw "[!] Sorry this is a reserved name";
221
+ if (indexOf.call(RESERVED_NAMES, name) >= 0) {
222
+ throw new Error("Sorry this is a reserved name");
145
223
  }
146
- if (!(manager || manager.prototype)) {
147
- throw "[!] Manager MUST be a function";
224
+ if (!(klass && klass.prototype)) {
225
+ throw new Error("MUST be a function");
226
+ }
227
+ if (this[`${type}_list`][name] != null) {
228
+ throw new Error(`Sorry this ${type} already exists`);
148
229
  }
149
230
  try {
150
- // Register manager with handle reference
151
- return this.manager_list[name] = new manager(this.appHandle);
152
- } catch (error) {
153
- err = error;
154
- return this._logify(3, `[!] Error while instantiate ${name} -> ${err}`);
231
+ // Register klass with handle reference
232
+ this._logify(7, `[*] Register ${type} ${name}`);
233
+ return this[`${type}_list`][name] = new klass(this.appHandle);
234
+ } catch (error1) {
235
+ err = error1;
236
+ throw new Error(err);
237
+ }
238
+ }
239
+
240
+ addWatcher({name, watcher}) {
241
+ var err;
242
+ try {
243
+ return this._register_internal_class('watcher', name, watcher);
244
+ } catch (error1) {
245
+ err = error1;
246
+ throw new Error(`[!] Error while instantiate ${name} watcher -> ${err}`);
247
+ }
248
+ }
249
+
250
+ addManager({name, manager}) {
251
+ var err;
252
+ try {
253
+ return this._register_internal_class('manager', name, manager);
254
+ } catch (error1) {
255
+ err = error1;
256
+ throw new Error(`[!] Error while instantiate ${name} manager -> ${err}`);
155
257
  }
156
258
  }
157
259
 
@@ -159,28 +261,88 @@
159
261
  // this class will be bind to a specific namespace
160
262
  addService({name, service, middlewares}) {
161
263
  var err;
162
- if (!(service && service.prototype)) {
163
- throw "[!] Service function is mandatory";
164
- }
165
-
166
264
  // Allow global register for '/'
167
265
  if (!name) {
168
266
  name = '/';
169
-
170
- // Otherwise service must comply certain rules
171
- } else if (name.length < 2) {
172
- throw "[!] Service name MUST be longer than 2 characters";
173
267
  }
174
268
  try {
175
- this.service_list[name] = new service(this.appHandle);
176
- } catch (error) {
177
- err = error;
178
- this._logify(3, `[!] Error while instantiate ${name} -> ${err}`);
269
+ this._register_internal_class('service', name, service);
270
+ } catch (error1) {
271
+ err = error1;
272
+ throw new Error(`[!] Error while instantiate ${name} service -> ${err}`);
179
273
  }
180
274
  // list methods of object... it will be the list of io actions
181
275
  this.method_list[name] = this._dumpMethods(service);
182
276
  // Register middlewares if necessary
183
- return this.middlewares[name] = middlewares ? middlewares : [];
277
+ return this.middleware_list[name] = middlewares ? middlewares : [];
278
+ }
279
+
280
+
281
+ // Allow to register easily controllers for REST API
282
+ // this method should be called automatically when fastify is started
283
+ addController({name, controller, middlewares, prefix}) {
284
+ var controller_routes, entry, err, j, len, len1, len2, mdwr, middleware, n, o, option, ref, results;
285
+ if (!middlewares) {
286
+ middlewares = [];
287
+ }
288
+
289
+ // Sanitize prefix
290
+ if (prefix && !prefix.startsWith('/')) {
291
+ prefix = `/${prefix}`;
292
+ }
293
+ if (prefix && prefix.endsWith('/')) {
294
+ prefix = prefix.slice(0, -1);
295
+ }
296
+ try {
297
+ this._register_internal_class('controller', name, controller);
298
+ } catch (error1) {
299
+ err = error1;
300
+ throw new Error(`[!] Error while instantiate ${name} controller -> ${err}`);
301
+ }
302
+ if (!fs.existsSync(`${this._routes}/${name}.json`)) {
303
+ throw new Error(`[!] Predicted routes file does not exists: ${this._routes}/${name}.json`);
304
+ }
305
+ // Load defined routes
306
+ controller_routes = require(`${this._routes}/${name}.json`);
307
+ // Parse all routes found, and register corresponding controller method
308
+ results = [];
309
+ for (j = 0, len = controller_routes.length; j < len; j++) {
310
+ entry = controller_routes[j];
311
+ ref = ['onRequest', 'preParsing', 'preValidation', 'preHandler', 'preSerialization', 'onSend', 'onResponse', 'handler', 'errorHandler'];
312
+ // Auto load function or array of function for fastify routes options
313
+ for (n = 0, len1 = ref.length; n < len1; n++) {
314
+ option = ref[n];
315
+ // Avoid override undefined keys
316
+ if (entry[option] == null) {
317
+ continue;
318
+ }
319
+ // Adapt object using current controller name
320
+ if (this.controller_list[name][entry[option]] != null) {
321
+ entry[option] = this.controller_list[name][entry[option]];
322
+ }
323
+ }
324
+
325
+ // Adapt all urls if prefix is set, otherwise prefix with controller name
326
+ entry.url = prefix != null ? `${prefix}${entry.url}` : `/${name}${entry.url}`;
327
+
328
+ // Always setup preValidation middlewares
329
+ if (entry.preValidation == null) {
330
+ entry.preValidation = [];
331
+ }
332
+ for (o = 0, len2 = middlewares.length; o < len2; o++) {
333
+ middleware = middlewares[o];
334
+ mdwr = new middleware();
335
+ entry.preValidation.push(mdwr.handle(this.appHandle));
336
+ }
337
+ try {
338
+ this._logify(7, `[*] Register controller route ${entry.method} ${entry.url}`);
339
+ results.push(this._webapp.route(entry));
340
+ } catch (error1) {
341
+ err = error1;
342
+ results.push(this._logify(3, `[!] Unable to register route entry: ${err}`));
343
+ }
344
+ }
345
+ return results;
184
346
  }
185
347
 
186
348
  // Get service running
@@ -190,12 +352,8 @@
190
352
 
191
353
  // Launch socket IO and get ready to handle events on connection
192
354
  // Pass web server used for connections
193
- start(webapp) {
194
- var d, day, hours, j, len, manager, manager_name, mdwr, middleware, minutes, month, ns, ref, ref1, ref2, seconds, server, service, service_name;
195
- // If nothing set use standard module
196
- if (webapp == null) {
197
- webapp = http.createServer();
198
- }
355
+ async start() {
356
+ var d, day, err, hours, manager, manager_name, minutes, month, ns, ref, ref1, seconds, watcher, watcher_name;
199
357
  d = new Date();
200
358
  day = d.getDate() < 10 ? `0${d.getDate()}` : d.getDate();
201
359
  month = d.getMonth() < 10 ? `0${d.getMonth()}` : d.getMonth();
@@ -204,57 +362,74 @@
204
362
  seconds = d.getSeconds() < 10 ? `0${d.getSeconds()}` : d.getSeconds();
205
363
  this._logify(4, `################### IOServer v${VERSION} ###################`);
206
364
  this._logify(5, `################### ${day}/${month}/${d.getFullYear()} - ${hours}:${minutes}:${seconds} #########################`);
207
-
208
- // Start web server
209
- this._logify(5, `[*] Starting server on https://${this.host}:${this.port} ...`);
210
- server = webapp.listen(this.port, this.host);
211
- // Start socket.io listener
212
- this.io = require('socket.io')(server, {
213
- transports: this.mode,
214
- cookie: this.cookie,
215
- cors: this.cors
216
- });
217
365
  ns = {};
218
366
  ref = this.manager_list;
219
367
  // Register all managers
220
368
  for (manager_name in ref) {
221
369
  manager = ref[manager_name];
222
- this._logify(6, `[*] register ${manager_name} manager`);
370
+ this._logify(6, `[*] Register ${manager_name} manager`);
223
371
  this.appHandle[manager_name] = manager;
224
372
  }
225
- ref1 = this.service_list;
226
- // Register each different services by its namespace
227
- for (service_name in ref1) {
228
- service = ref1[service_name];
229
- ns[service_name] = service_name === '/' ? this.io.of('/') : this.io.of(`/${service_name}`);
230
- ref2 = this.middlewares[service_name];
231
- // Register middleware for namespace
232
- for (j = 0, len = ref2.length; j < len; j++) {
233
- middleware = ref2[j];
234
- mdwr = new middleware();
235
- ns[service_name].use(mdwr.handle(this.appHandle));
373
+ ref1 = this.watcher_list;
374
+
375
+ // Start all watchers
376
+ for (watcher_name in ref1) {
377
+ watcher = ref1[watcher_name];
378
+ this._logify(6, `[*] Start watcher ${watcher_name}`);
379
+ try {
380
+ watcher.watch();
381
+ } catch (error1) {
382
+ err = error1;
383
+ throw new Error(`Unable to start watch method of watcher ${watcher_name}: ${err}`);
236
384
  }
237
- // get ready for connection
238
- ns[service_name].on("connection", this._handleEvents(service_name));
239
- this._logify(6, `[*] service ${service_name} registered...`);
240
385
  }
241
-
242
- // Create terminator handler
243
- return this.stopper = closer.createHttpTerminator({server});
386
+ // Once webapp is ready
387
+ this._webapp.ready((err) => {
388
+ var j, len, mdwr, middleware, ref2, results, service_name;
389
+ // Register each different services by its namespace
390
+ results = [];
391
+ for (service_name in this.service_list) {
392
+ ns[service_name] = service_name === '/' ? this._webapp.io.of('/') : this._webapp.io.of(`/${service_name}`);
393
+ ref2 = this.middleware_list[service_name];
394
+ // Register middleware for namespace
395
+ for (j = 0, len = ref2.length; j < len; j++) {
396
+ middleware = ref2[j];
397
+ mdwr = new middleware();
398
+ ns[service_name].use(mdwr.handle(this.appHandle));
399
+ }
400
+ // get ready for connection
401
+ ns[service_name].on("connection", this._handleEvents(service_name));
402
+ results.push(this._logify(6, `[*] service ${service_name} registered...`));
403
+ }
404
+ return results;
405
+ });
406
+ try {
407
+ // Start web server
408
+ this._logify(5, `[*] Starting server on https://${this.host}:${this.port} ...`);
409
+ return (await this._webapp.listen(this.port, this.host));
410
+ } catch (error1) {
411
+ err = error1;
412
+ return this._logify(3, `[!] Unable to start server: ${err}`);
413
+ }
244
414
  }
245
415
 
246
416
 
247
417
  // Force server stop
248
418
  stop() {
249
- this._logify(6, "[*] Stopping server");
250
- if (this.stopper) {
251
- return this.stopper.terminate();
419
+ var err;
420
+ try {
421
+ return this._webapp.close(() => {
422
+ return this._logify(6, "[*] Server stopped");
423
+ });
424
+ } catch (error1) {
425
+ err = error1;
426
+ throw new Error(`[!] Unable to stop server: ${err}`);
252
427
  }
253
428
  }
254
429
 
255
430
  sendTo({namespace, event, data, room = false, sid = false} = {}) {
256
431
  var ns, sockets;
257
- ns = this.io.of(namespace || "/");
432
+ ns = this._webapp.io.of(namespace || "/");
258
433
  // Send event to specific sid if set
259
434
  if ((sid != null) && sid) {
260
435
  return ns.sockets.get(sid).emit(event, data);
@@ -299,13 +474,13 @@
299
474
  _handleCallback({service, method, socket}) {
300
475
  return (data, callback) => {
301
476
  this._logify(6, `[*] call method ${method} of service ${service}`);
302
- return new Promise((resolve, reject) => {
477
+ return new Promise(async(resolve, reject) => {
303
478
  var err;
304
479
  try {
305
- this.service_list[service][method](socket, data, callback);
480
+ await this.service_list[service][method](socket, data, callback);
306
481
  return resolve();
307
- } catch (error) {
308
- err = error;
482
+ } catch (error1) {
483
+ err = error1;
309
484
  return reject(err);
310
485
  }
311
486
  }).catch((err) => {
@@ -6,8 +6,8 @@
6
6
  "src/ioserver.coffee"
7
7
  ],
8
8
  "names": [],
9
- "mappings": "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",
9
+ "mappings": "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",
10
10
  "sourcesContent": [
11
- "####################################################\n# IOServer - v1.2.6 #\n# #\n# Damn simple socket.io server #\n####################################################\n# - Copyright 2020 - #\n# #\n# License: Apache v 2.0 #\n# @Author: Ben Mz #\n# @Email: 0x42en (at) users.noreply.github.com #\n# #\n####################################################\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Add required packages\nhttp = require 'http'\ncloser = require 'http-terminator'\n\n# Set global vars\nVERSION = '1.2.4'\nPORT = 8080\nHOST = 'localhost'\nLOG_LEVEL = ['EMERGENCY','ALERT','CRITICAL','ERROR','WARNING','NOTIFICATION','INFORMATION','DEBUG']\nTRANSPORTS = ['websocket','htmlfile','xhr-polling','jsonp-polling']\n\nmodule.exports = class IOServer\n # Define the variables used by the server\n constructor: (options = {}) ->\n # Set default options\n {verbose, host, port, cookie, mode, cors, middleware} = options\n\n @host = if host then String(host) else HOST\n try\n @port = if port then Number(port) else PORT\n catch e\n throw new Error 'Invalid port.'\n \n @cookie = if cookie then Boolean(cookie) else false\n @verbose = if String(verbose).toUpperCase() in LOG_LEVEL then String(verbose).toUpperCase() else 'ERROR'\n \n # Process transport mode options\n @mode = []\n if mode\n if String(mode).toLowerCase() in TRANSPORTS\n @mode.push String(mode).toLowerCase()\n else if mode.constructor is Array\n for i,m of mode\n if String(m).toLowerCase() in TRANSPORTS\n @mode.push m\n else\n @mode.push 'websocket'\n @mode.push 'polling'\n \n # Setup CORS since necessary in socket.io v3\n @cors = if cors? and cors then cors else {}\n if not @cors.methods\n @cors.methods = ['GET','POST']\n if not @cors.origin\n @cors.origin = [\"https://#{@host}\",\"http://#{@host}\"]\n \n # Setup internal lists\n @service_list = {}\n @manager_list = {}\n @method_list = {}\n @middlewares = {}\n \n # Register the global app handle\n # that will be passed to all entities\n @appHandle = {\n send: @sendTo\n log: @_logify\n verbose: @verbose\n }\n @server = null\n \n _logify: (level, text) ->\n current_level = LOG_LEVEL.indexOf @verbose\n if level <= current_level\n if level <= 4\n console.error text\n else\n console.log text\n \n _unique: (arr) ->\n hash = {}\n result = []\n\n i = 0\n l = arr.length\n while i < l\n unless hash.hasOwnProperty(arr[i])\n hash[arr[i]] = true\n result.push arr[i]\n ++i\n\n return result\n\n addManager: ({name, manager}) ->\n if not name\n throw \"[!] Manager name is mandatory\"\n if name and name.length < 2\n throw \"[!] Manager name MUST be longer than 2 characters\"\n if name in ['send']\n throw \"[!] Sorry this is a reserved name\"\n \n if not (manager or manager.prototype)\n throw \"[!] Manager MUST be a function\"\n \n try\n # Register manager with handle reference\n @manager_list[name] = new manager(@appHandle)\n catch err\n @_logify 3, \"[!] Error while instantiate #{name} -> #{err}\"\n\n # Allow to register easily a class to this server\n # this class will be bind to a specific namespace\n addService: ({name, service, middlewares}) ->\n if not (service and service.prototype)\n throw \"[!] Service function is mandatory\"\n \n # Allow global register for '/'\n if not name\n name = '/'\n \n # Otherwise service must comply certain rules\n else if name.length < 2\n throw \"[!] Service name MUST be longer than 2 characters\"\n \n try\n @service_list[name] = new service(@appHandle)\n catch err\n @_logify 3, \"[!] Error while instantiate #{name} -> #{err}\"\n\n # list methods of object... it will be the list of io actions\n @method_list[name] = @_dumpMethods service\n # Register middlewares if necessary\n @middlewares[name] = if middlewares then middlewares else []\n\n # Get service running\n getService: (name) -> @service_list[name]\n\n # Launch socket IO and get ready to handle events on connection\n # Pass web server used for connections\n start: (webapp) ->\n # If nothing set use standard module\n if not webapp?\n webapp = http.createServer()\n\n d = new Date()\n day = if d.getDate() < 10 then \"0#{d.getDate()}\" else d.getDate()\n month = if d.getMonth() < 10 then \"0#{d.getMonth()}\" else d.getMonth()\n hours = if d.getHours() < 10 then \"0#{d.getHours()}\" else d.getHours()\n minutes = if d.getMinutes() < 10 then \"0#{d.getMinutes()}\" else d.getMinutes()\n seconds = if d.getSeconds() < 10 then \"0#{d.getSeconds()}\" else d.getSeconds()\n @_logify 4, \"################### IOServer v#{VERSION} ###################\"\n @_logify 5, \"################### #{day}/#{month}/#{d.getFullYear()} - #{hours}:#{minutes}:#{seconds} #########################\"\n \n # Start web server\n @_logify 5, \"[*] Starting server on https://#{@host}:#{@port} ...\"\n server = webapp.listen @port, @host\n\n # Start socket.io listener\n @io = require('socket.io')(server, {\n transports: @mode,\n cookie: @cookie\n cors: @cors\n })\n\n ns = {}\n\n # Register all managers\n for manager_name, manager of @manager_list\n @_logify 6, \"[*] register #{manager_name} manager\"\n @appHandle[manager_name] = manager\n\n # Register each different services by its namespace\n for service_name, service of @service_list\n ns[service_name] = if service_name is '/' then @io.of '/' else @io.of \"/#{service_name}\"\n\n # Register middleware for namespace \n for middleware in @middlewares[service_name]\n mdwr = new middleware()\n ns[service_name].use mdwr.handle(@appHandle)\n\n # get ready for connection\n ns[service_name].on \"connection\", @_handleEvents(service_name)\n @_logify 6, \"[*] service #{service_name} registered...\"\n \n # Create terminator handler\n @stopper = closer.createHttpTerminator {server}\n \n # Force server stop\n stop: ->\n @_logify 6, \"[*] Stopping server\" \n if @stopper\n @stopper.terminate()\n\n # Allow sending message from external app\n sendTo: ({namespace, event, data, room=false, sid=false}={}) =>\n ns = @io.of(namespace || \"/\")\n # Send event to specific sid if set\n if sid? and sid\n ns.sockets.get(sid).emit event, data\n else\n # Restrict access to clients in room if set\n sockets = if room? and room then ns.in(room) else ns\n sockets.emit event, data\n\n # Once a client is connected, get ready to handle his events\n _handleEvents: (service_name) ->\n (socket, next) =>\n @_logify 5, \"[*] received connection for service #{service_name}\"\n \n # The register all user defined functions\n for index, action of @method_list[service_name]\n # does not listen for private methods\n if action.substring(0,1) is '_'\n continue\n # do not listen for constructor method\n if action is 'constructor'\n continue\n \n @_logify 6, \"[*] method #{action} of #{service_name} listening...\"\n socket.on action, @_handleCallback\n service: service_name\n method: action\n socket: socket\n\n # On a specific event call the appropriate method of object\n _handleCallback: ({service, method, socket}) ->\n return (data, callback) =>\n @_logify 6, \"[*] call method #{method} of service #{service}\"\n return new Promise (resolve, reject) =>\n try\n @service_list[service][method](socket, data, callback)\n resolve()\n catch err\n reject(err)\n .catch (err) =>\n if typeof err is 'string'\n err = new IOServerError(err, -1)\n\n payload = { \n status: 'error',\n type: err.constructor.name or 'Error',\n message: err.message or null,\n code: err.code or -1\n }\n\n @_logify 5, \"Error on #{service}:#{method} execution: #{err}\"\n if callback\n callback payload\n else\n socket.emit 'error', payload\n \n # Based on Kri-ban solution\n # http://stackoverflow.com/questions/7445726/how-to-list-methods-of-inherited-classes-in-coffeescript-or-javascript\n # Thanks ___ ;)\n _dumpMethods: (klass) ->\n result = []\n k = klass.prototype\n while k\n names = Object.getOwnPropertyNames(k)\n result = result.concat(names)\n k = Object.getPrototypeOf(k)\n break if not Object.getPrototypeOf(k) # avoid listing Object properties\n\n return @_unique(result).sort()\n\n# IO Server error class\nmodule.exports.IOServerError = class IOServerError extends Error\n constructor: (message, code = -1) ->\n super(message)\n @type = @constructor.name\n @code = code\n \n getMessage: () ->\n return @message\n \n getType: () ->\n return @type\n \n getCode: () ->\n return @code\n\n toJson: () ->\n return {\n message: @message\n type: @type\n code: @code\n }"
11
+ "####################################################\n# IOServer - v1.3.0 #\n# #\n# Damn simple socket.io server #\n####################################################\n# - Copyright 2020 - #\n# #\n# License: Apache v 2.0 #\n# @Author: Ben Mz #\n# @Email: 0x42en (at) users.noreply.github.com #\n# #\n####################################################\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# Add required packages\nfs = require 'fs'\npath = require 'path'\nfastify = require 'fastify'\n\n# Set global vars\nVERSION = '1.3.0'\nPORT = 8080\nHOST = 'localhost'\nLOG_LEVEL = ['EMERGENCY','ALERT','CRITICAL','ERROR','WARNING','NOTIFICATION','INFORMATION','DEBUG']\nTRANSPORTS = ['websocket','htmlfile','xhr-polling','jsonp-polling']\nRESERVED_NAMES = ['send', 'log', 'verbose']\n\nmodule.exports = class IOServer\n # Define the variables used by the server\n constructor: (options = {}) ->\n # Set default options\n { verbose, host, port, cookie, mode, cors, routes } = options\n\n @host = if host then String(host) else HOST\n try\n @port = if port then Number(port) else PORT\n if @port <= 0\n throw new Error 'Invalid port'\n if @port > 65535\n throw new Error 'Invalid port'\n catch err\n throw new Error err\n \n _cookie = if Boolean(cookie) then Boolean(cookie) else false\n @verbose = if String(verbose).toUpperCase() in LOG_LEVEL then String(verbose).toUpperCase() else 'ERROR'\n # Does not yell if route directory does not exists... change that ?\n default_routes = path.join(process.cwd(), 'routes')\n @_routes = if fs.existsSync(routes) then String(routes) else default_routes\n \n # Process transport mode options\n _mode = []\n if mode\n if String(mode).toLowerCase() in TRANSPORTS\n _mode.push String(mode).toLowerCase()\n else if mode.constructor is Array\n for i,m of mode\n if String(m).toLowerCase() in TRANSPORTS\n _mode.push m\n else\n _mode.push 'websocket'\n _mode.push 'polling'\n \n # Setup CORS since necessary in socket.io v3\n _cors = if cors? and cors then cors else {}\n if not _cors.methods\n _cors.methods = ['GET','POST']\n if not _cors.origin\n _cors.origin = [\"https://#{@host}\",\"http://#{@host}\"]\n \n # Setup internal lists\n @service_list = {}\n @manager_list = {}\n @method_list = {}\n @watcher_list = {}\n \n @controller_list = {}\n @middleware_list = {}\n \n try\n # Instanciate server (needed to register controllers)\n @_webapp = fastify({\n logger: @verbose\n ignoreTrailingSlash: true\n maxParamLength: 200\n caseSensitive: true\n })\n catch err\n throw new Error \"[!] Unable to instanciate server: #{err}\"\n \n try\n # Register standard HTTP error shortcuts\n @_webapp.register(require('fastify-sensible'), { errorHandler: false })\n catch err\n throw new Error \"[!] Unable to register sensible plugin: #{err}\"\n \n try\n # Allow developper to use throw Error directly in methods\n @_webapp.setErrorHandler (error, req, reply) ->\n # Handle IOServerError\n if (error instanceof IOServerError)\n code = if error.getCode() < 0 then 500 else error.getCode()\n reply.status(code).send(error)\n # Handle HTTPErrors\n else if (error.status?)\n reply.status(error.status).send({message: error.message})\n # Handle standard Error\n else\n reply.status(500).send(error.message)\n catch err\n throw new Error \"[!] Unable to register error handler: #{err}\"\n \n try\n # Register standard HTTP error shortcuts\n @_webapp.register(require('fastify-cors'), _cors)\n catch err\n throw new Error \"[!] Unable to register CORS plugin: #{err}\"\n \n try\n # Register socket.io listener\n @_webapp.register( require('fastify-socket.io'), {\n transports: _mode,\n cookie: _cookie\n cors: _cors\n })\n catch err\n throw new Error \"[!] Unable to register socket.io plugin: #{err}\"\n\n # Register the global app handle\n # that will be passed to all entities\n @appHandle = {\n send: @sendTo\n log: @_logify\n verbose: @verbose\n }\n \n _logify: (level, text) ->\n current_level = LOG_LEVEL.indexOf @verbose\n\n if level <= current_level\n if level <= 4\n console.error text\n else\n console.log text\n \n _unique: (arr) ->\n hash = {}\n result = []\n\n i = 0\n l = arr.length\n while i < l\n unless hash.hasOwnProperty(arr[i])\n hash[arr[i]] = true\n result.push arr[i]\n ++i\n\n return result\n \n _method_exists: (klass, name) ->\n return klass[name]?\n \n _register_internal_class: (type, name, klass) ->\n if not name\n throw new Error \"name is mandatory\"\n if (type isnt 'service') and name.length < 2\n throw new Error \"name MUST be longer than 2 characters\"\n if name in RESERVED_NAMES\n throw new Error \"Sorry this is a reserved name\"\n \n if not (klass and klass.prototype)\n throw new Error \"MUST be a function\"\n \n if @[\"#{type}_list\"][name]?\n throw new Error \"Sorry this #{type} already exists\"\n \n try\n # Register klass with handle reference\n @_logify 7, \"[*] Register #{type} #{name}\"\n @[\"#{type}_list\"][name] = new klass(@appHandle)\n catch err\n throw new Error err\n\n \n addWatcher: ({name, watcher}) ->\n try\n @_register_internal_class 'watcher', name, watcher\n catch err\n throw new Error \"[!] Error while instantiate #{name} watcher -> #{err}\"\n\n addManager: ({name, manager}) ->\n try\n @_register_internal_class 'manager', name, manager\n catch err\n throw new Error \"[!] Error while instantiate #{name} manager -> #{err}\"\n\n # Allow to register easily a class to this server\n # this class will be bind to a specific namespace\n addService: ({name, service, middlewares}) ->\n # Allow global register for '/'\n if not name\n name = '/'\n try\n @_register_internal_class 'service', name, service\n catch err\n throw new Error \"[!] Error while instantiate #{name} service -> #{err}\"\n\n # list methods of object... it will be the list of io actions\n @method_list[name] = @_dumpMethods service\n # Register middlewares if necessary\n @middleware_list[name] = if middlewares then middlewares else []\n \n # Allow to register easily controllers for REST API\n # this method should be called automatically when fastify is started\n addController: ({name, controller, middlewares, prefix}) ->\n if not middlewares\n middlewares = []\n \n # Sanitize prefix\n if prefix and not prefix.startsWith('/')\n prefix = \"/#{prefix}\"\n \n if prefix and prefix.endsWith('/')\n prefix = prefix.slice(0, -1)\n \n try\n @_register_internal_class 'controller', name, controller\n catch err\n throw new Error \"[!] Error while instantiate #{name} controller -> #{err}\"\n \n if not fs.existsSync(\"#{@_routes}/#{name}.json\")\n throw new Error \"[!] Predicted routes file does not exists: #{@_routes}/#{name}.json\"\n\n # Load defined routes\n controller_routes = require \"#{@_routes}/#{name}.json\"\n\n # Parse all routes found, and register corresponding controller method\n for entry in controller_routes\n\n # Auto load function or array of function for fastify routes options\n for option in ['onRequest', 'preParsing', 'preValidation', 'preHandler', 'preSerialization', 'onSend', 'onResponse', 'handler', 'errorHandler']\n # Avoid override undefined keys\n if not entry[option]?\n continue\n # Adapt object using current controller name\n if @controller_list[name][entry[option]]?\n entry[option] = @controller_list[name][entry[option]]\n \n # Adapt all urls if prefix is set, otherwise prefix with controller name\n entry.url = if prefix? then \"#{prefix}#{entry.url}\" else \"/#{name}#{entry.url}\"\n \n # Always setup preValidation middlewares\n if not entry.preValidation?\n entry.preValidation = []\n\n for middleware in middlewares\n mdwr = new middleware()\n entry.preValidation.push mdwr.handle(@appHandle)\n\n try\n @_logify 7, \"[*] Register controller route #{entry.method} #{entry.url}\"\n @_webapp.route entry\n catch err\n @_logify 3, \"[!] Unable to register route entry: #{err}\"\n\n # Get service running\n getService: (name) -> @service_list[name]\n\n # Launch socket IO and get ready to handle events on connection\n # Pass web server used for connections\n start: ->\n d = new Date()\n day = if d.getDate() < 10 then \"0#{d.getDate()}\" else d.getDate()\n month = if d.getMonth() < 10 then \"0#{d.getMonth()}\" else d.getMonth()\n hours = if d.getHours() < 10 then \"0#{d.getHours()}\" else d.getHours()\n minutes = if d.getMinutes() < 10 then \"0#{d.getMinutes()}\" else d.getMinutes()\n seconds = if d.getSeconds() < 10 then \"0#{d.getSeconds()}\" else d.getSeconds()\n @_logify 4, \"################### IOServer v#{VERSION} ###################\"\n @_logify 5, \"################### #{day}/#{month}/#{d.getFullYear()} - #{hours}:#{minutes}:#{seconds} #########################\"\n \n ns = {}\n\n # Register all managers\n for manager_name, manager of @manager_list\n @_logify 6, \"[*] Register #{manager_name} manager\"\n @appHandle[manager_name] = manager\n \n # Start all watchers\n for watcher_name, watcher of @watcher_list\n @_logify 6, \"[*] Start watcher #{watcher_name}\"\n try\n watcher.watch()\n catch err\n throw new Error \"Unable to start watch method of watcher #{watcher_name}: #{err}\"\n\n # Once webapp is ready\n @_webapp.ready (err) =>\n # Register each different services by its namespace\n for service_name of @service_list\n ns[service_name] = if service_name is '/' then @_webapp.io.of '/' else @_webapp.io.of \"/#{service_name}\"\n\n # Register middleware for namespace \n for middleware in @middleware_list[service_name]\n mdwr = new middleware()\n ns[service_name].use mdwr.handle(@appHandle)\n\n # get ready for connection\n ns[service_name].on \"connection\", @_handleEvents(service_name)\n @_logify 6, \"[*] service #{service_name} registered...\"\n \n try\n # Start web server\n @_logify 5, \"[*] Starting server on https://#{@host}:#{@port} ...\"\n await @_webapp.listen @port, @host\n catch err\n @_logify 3, \"[!] Unable to start server: #{err}\"\n \n # Force server stop\n stop: ->\n try\n @_webapp.close () =>\n @_logify 6, \"[*] Server stopped\"\n catch err\n throw new Error \"[!] Unable to stop server: #{err}\"\n\n # Allow sending message from external app\n sendTo: ({namespace, event, data, room=false, sid=false}={}) =>\n ns = @_webapp.io.of(namespace || \"/\")\n # Send event to specific sid if set\n if sid? and sid\n ns.sockets.get(sid).emit event, data\n else\n # Restrict access to clients in room if set\n sockets = if room? and room then ns.in(room) else ns\n sockets.emit event, data\n\n # Once a client is connected, get ready to handle his events\n _handleEvents: (service_name) ->\n (socket, next) =>\n @_logify 5, \"[*] received connection for service #{service_name}\"\n \n # The register all user defined functions\n for index, action of @method_list[service_name]\n # does not listen for private methods\n if action.substring(0,1) is '_'\n continue\n # do not listen for constructor method\n if action is 'constructor'\n continue\n \n @_logify 6, \"[*] method #{action} of #{service_name} listening...\"\n socket.on action, @_handleCallback\n service: service_name\n method: action\n socket: socket\n\n # On a specific event call the appropriate method of object\n _handleCallback: ({service, method, socket}) ->\n return (data, callback) =>\n @_logify 6, \"[*] call method #{method} of service #{service}\"\n return new Promise (resolve, reject) =>\n try\n await @service_list[service][method](socket, data, callback)\n resolve()\n catch err\n reject(err)\n .catch (err) =>\n if typeof err is 'string'\n err = new IOServerError(err, -1)\n\n payload = { \n status: 'error',\n type: err.constructor.name or 'Error',\n message: err.message or null,\n code: err.code or -1\n }\n\n @_logify 5, \"Error on #{service}:#{method} execution: #{err}\"\n if callback\n callback payload\n else\n socket.emit 'error', payload\n \n # Based on Kri-ban solution\n # http://stackoverflow.com/questions/7445726/how-to-list-methods-of-inherited-classes-in-coffeescript-or-javascript\n # Thanks ___ ;)\n _dumpMethods: (klass) ->\n result = []\n k = klass.prototype\n while k\n names = Object.getOwnPropertyNames(k)\n result = result.concat(names)\n k = Object.getPrototypeOf(k)\n break if not Object.getPrototypeOf(k) # avoid listing Object properties\n\n return @_unique(result).sort()\n\n# IO Server error class\nmodule.exports.IOServerError = class IOServerError extends Error\n constructor: (message, code = -1) ->\n super(message)\n @type = @constructor.name\n @code = code\n \n getMessage: () ->\n return @message\n \n getType: () ->\n return @type\n \n getCode: () ->\n return @code\n\n toJson: () ->\n return {\n message: @message\n type: @type\n code: @code\n }"
12
12
  ]
13
13
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ioserver",
3
- "version": "1.2.6",
4
- "description": "Damn simple IOServer instance, allowing developpers to add services as simple coffeescript class.",
3
+ "version": "1.3.1",
4
+ "description": "Damn simple way to setup your Socket.io server using coffeescript or vanilla JS class.",
5
5
  "main": "build/ioserver.js",
6
6
  "files": [
7
7
  "build/"
@@ -11,15 +11,19 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "colors": "^1.4.0",
14
- "http-terminator": "^2.0.3",
15
- "socket.io": "^3.0.5"
14
+ "fastify": "^3.20.1",
15
+ "fastify-cors": "^6.0.2",
16
+ "fastify-sensible": "^3.1.1",
17
+ "fastify-socket.io": "^3.0.0",
18
+ "socket.io": "^4.4.1"
16
19
  },
17
20
  "devDependencies": {
18
- "chai": "^4.2.0",
21
+ "chai": "^4.3.3",
22
+ "chai-http": "^4.3.0",
19
23
  "coffeescript": "^2.5.1",
20
- "mocha": "^8.2.1",
21
- "snyk": "^1.437.3",
22
- "socket.io-client": "^3.0.5"
24
+ "mocha": "^9.1.0",
25
+ "snyk": "^1.467.0",
26
+ "socket.io-client": "^4.4.1"
23
27
  },
24
28
  "scripts": {
25
29
  "dev": "$(npm bin)/coffee --no-header --map --watch --output build/ --compile src/",