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 +90 -13
- package/build/ioserver.js +267 -92
- package/build/ioserver.js.map +2 -2
- package/package.json +12 -8
package/README.md
CHANGED
|
@@ -8,20 +8,15 @@
|
|
|
8
8
|
[](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
|
-
|
|
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
|
-
|
|
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.
|
|
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,
|
|
28
|
+
var HOST, IOServer, IOServerError, LOG_LEVEL, PORT, RESERVED_NAMES, TRANSPORTS, VERSION, fastify, fs, path,
|
|
29
29
|
indexOf = [].indexOf;
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
fs = require('fs');
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
path = require('path');
|
|
34
|
+
|
|
35
|
+
fastify = require('fastify');
|
|
34
36
|
|
|
35
37
|
// Set global vars
|
|
36
|
-
VERSION = '1.
|
|
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,
|
|
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,
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
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
|
-
|
|
78
|
+
_mode = [];
|
|
66
79
|
if (mode) {
|
|
67
80
|
if (ref1 = String(mode).toLowerCase(), indexOf.call(TRANSPORTS, ref1) >= 0) {
|
|
68
|
-
|
|
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
|
-
|
|
86
|
+
_mode.push(m);
|
|
74
87
|
}
|
|
75
88
|
}
|
|
76
89
|
}
|
|
77
90
|
} else {
|
|
78
|
-
|
|
79
|
-
|
|
91
|
+
_mode.push('websocket');
|
|
92
|
+
_mode.push('polling');
|
|
80
93
|
}
|
|
81
94
|
|
|
82
95
|
// Setup CORS since necessary in socket.io v3
|
|
83
|
-
|
|
84
|
-
if (!
|
|
85
|
-
|
|
96
|
+
_cors = (cors != null) && cors ? cors : {};
|
|
97
|
+
if (!_cors.methods) {
|
|
98
|
+
_cors.methods = ['GET', 'POST'];
|
|
86
99
|
}
|
|
87
|
-
if (!
|
|
88
|
-
|
|
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.
|
|
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
|
-
|
|
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 "
|
|
216
|
+
throw new Error("name is mandatory");
|
|
139
217
|
}
|
|
140
|
-
if (
|
|
141
|
-
throw "
|
|
218
|
+
if ((type !== 'service') && name.length < 2) {
|
|
219
|
+
throw new Error("name MUST be longer than 2 characters");
|
|
142
220
|
}
|
|
143
|
-
if (name
|
|
144
|
-
throw "
|
|
221
|
+
if (indexOf.call(RESERVED_NAMES, name) >= 0) {
|
|
222
|
+
throw new Error("Sorry this is a reserved name");
|
|
145
223
|
}
|
|
146
|
-
if (!(
|
|
147
|
-
throw "
|
|
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
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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.
|
|
176
|
-
} catch (
|
|
177
|
-
err =
|
|
178
|
-
|
|
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.
|
|
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(
|
|
194
|
-
var d, day,
|
|
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, `[*]
|
|
370
|
+
this._logify(6, `[*] Register ${manager_name} manager`);
|
|
223
371
|
this.appHandle[manager_name] = manager;
|
|
224
372
|
}
|
|
225
|
-
ref1 = this.
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
243
|
-
|
|
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
|
-
|
|
250
|
-
|
|
251
|
-
return this.
|
|
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 (
|
|
308
|
-
err =
|
|
482
|
+
} catch (error1) {
|
|
483
|
+
err = error1;
|
|
309
484
|
return reject(err);
|
|
310
485
|
}
|
|
311
486
|
}).catch((err) => {
|
package/build/ioserver.js.map
CHANGED
|
@@ -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.
|
|
4
|
-
"description": "Damn simple
|
|
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
|
-
"
|
|
15
|
-
"
|
|
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.
|
|
21
|
+
"chai": "^4.3.3",
|
|
22
|
+
"chai-http": "^4.3.0",
|
|
19
23
|
"coffeescript": "^2.5.1",
|
|
20
|
-
"mocha": "^
|
|
21
|
-
"snyk": "^1.
|
|
22
|
-
"socket.io-client": "^
|
|
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/",
|