@schukai/monster 3.1.2 → 3.2.0
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/package.json
CHANGED
@@ -24,7 +24,7 @@ const receiveQueueSymbol = Symbol("queue");
|
|
24
24
|
/**
|
25
25
|
* @private
|
26
26
|
* @type {Symbol}
|
27
|
-
*
|
27
|
+
*
|
28
28
|
* hint: this name is used in the tests. if you want to change it, please change it in the tests as well.
|
29
29
|
*/
|
30
30
|
const connectionSymbol = Symbol("connection");
|
@@ -55,6 +55,96 @@ const connectionStatusCode = {
|
|
55
55
|
1015: "TLS handshake"
|
56
56
|
};
|
57
57
|
|
58
|
+
/**
|
59
|
+
* @private
|
60
|
+
* @this {WebSocketDatasource}
|
61
|
+
* @throws {Error} No url defined for websocket datasource.
|
62
|
+
*/
|
63
|
+
function connectServer(resolve, reject) {
|
64
|
+
const self = this;
|
65
|
+
|
66
|
+
let promiseAllredyResolved = false;
|
67
|
+
let connectionTimeout = self.getOption('connection.timeout');
|
68
|
+
if (!isInteger(connectionTimeout) || connectionTimeout < 100) {
|
69
|
+
connectionTimeout = 5000;
|
70
|
+
}
|
71
|
+
|
72
|
+
setTimeout(() => {
|
73
|
+
if (promiseAllredyResolved) {
|
74
|
+
return;
|
75
|
+
}
|
76
|
+
reject(new Error("Connection timeout"));
|
77
|
+
}, connectionTimeout);
|
78
|
+
|
79
|
+
let reconnectTimeout = self.getOption('connection.reconnect.timeout');
|
80
|
+
if (!isInteger(reconnectTimeout) || reconnectTimeout < 1000) reconnectTimeout = 1000;
|
81
|
+
let reconnectAttempts = self.getOption('connection.reconnect.attempts');
|
82
|
+
if (!isInteger(reconnectAttempts) || reconnectAttempts < 1) reconnectAttempts = 1;
|
83
|
+
let reconnectEnabled = self.getOption('connection.reconnect.enabled');
|
84
|
+
if (reconnectEnabled !== true) reconnectEnabled = false;
|
85
|
+
|
86
|
+
self[manualCloseSymbol] = false;
|
87
|
+
self[connectionSymbol].reconnectCounter++;
|
88
|
+
|
89
|
+
if (self[connectionSymbol].socket && self[connectionSymbol].socket.readyState < 2) {
|
90
|
+
self[connectionSymbol].socket.close();
|
91
|
+
}
|
92
|
+
self[connectionSymbol].socket = null;
|
93
|
+
|
94
|
+
const url = self.getOption('url');
|
95
|
+
if (!url) {
|
96
|
+
reject('No url defined for websocket datasource.');
|
97
|
+
return;
|
98
|
+
}
|
99
|
+
|
100
|
+
self[connectionSymbol].socket = new WebSocket(url);
|
101
|
+
|
102
|
+
self[connectionSymbol].socket.onmessage = function (event) {
|
103
|
+
self[receiveQueueSymbol].add(event);
|
104
|
+
setTimeout(function () {
|
105
|
+
self.read();
|
106
|
+
}, 1);
|
107
|
+
};
|
108
|
+
|
109
|
+
self[connectionSymbol].socket.onopen = function () {
|
110
|
+
self[connectionSymbol].reconnectCounter = 0;
|
111
|
+
if (typeof resolve === 'function' && !promiseAllredyResolved) {
|
112
|
+
promiseAllredyResolved = true;
|
113
|
+
resolve();
|
114
|
+
}
|
115
|
+
};
|
116
|
+
|
117
|
+
self[connectionSymbol].socket.close = function (event) {
|
118
|
+
|
119
|
+
if (self[manualCloseSymbol]) {
|
120
|
+
self[manualCloseSymbol] = false;
|
121
|
+
return;
|
122
|
+
}
|
123
|
+
|
124
|
+
if (reconnectEnabled && this[connectionSymbol].reconnectCounter < reconnectAttempts) {
|
125
|
+
setTimeout(() => {
|
126
|
+
self.connect();
|
127
|
+
}, reconnectTimeout * this[connectionSymbol].reconnectCounter);
|
128
|
+
}
|
129
|
+
|
130
|
+
};
|
131
|
+
|
132
|
+
self[connectionSymbol].socket.onerror = (error) => {
|
133
|
+
|
134
|
+
if (reconnectEnabled && self[connectionSymbol].reconnectCounter < reconnectAttempts) {
|
135
|
+
setTimeout(() => {
|
136
|
+
self.connect();
|
137
|
+
}, reconnectTimeout * this[connectionSymbol].reconnectCounter);
|
138
|
+
} else {
|
139
|
+
if (typeof reject === 'function' && !promiseAllredyResolved) {
|
140
|
+
promiseAllredyResolved = true;
|
141
|
+
reject(error);
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
};
|
146
|
+
}
|
147
|
+
|
58
148
|
/**
|
59
149
|
* The RestAPI is a class that enables a REST API server.
|
60
150
|
*
|
@@ -85,78 +175,26 @@ class WebSocketDatasource extends Datasource {
|
|
85
175
|
this[connectionSymbol] = {};
|
86
176
|
this[connectionSymbol].socket = null;
|
87
177
|
this[connectionSymbol].reconnectCounter = 0;
|
88
|
-
this[manualCloseSymbol]=false;
|
178
|
+
this[manualCloseSymbol] = false;
|
89
179
|
}
|
90
180
|
|
91
181
|
/**
|
92
182
|
*
|
93
|
-
* @returns {
|
94
|
-
* @throws {Error} No url defined for websocket datasource.
|
183
|
+
* @returns {Promise}
|
95
184
|
*/
|
96
185
|
connect() {
|
97
186
|
const self = this;
|
98
187
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
let reconnectAttempts = self.getOption('reconnect.attempts');
|
103
|
-
if (!isInteger(reconnectAttempts) || reconnectAttempts < 1) reconnectAttempts = 1;
|
104
|
-
let reconnectEnabled = self.getOption('reconnect.enabled');
|
105
|
-
if (reconnectEnabled !== true) reconnectEnabled = false;
|
106
|
-
|
107
|
-
self[manualCloseSymbol] = false;
|
108
|
-
self[connectionSymbol].reconnectCounter++;
|
109
|
-
|
110
|
-
if (self[connectionSymbol].socket && self[connectionSymbol].socket.readyState < 2) {
|
111
|
-
self[connectionSymbol].socket.close();
|
112
|
-
}
|
113
|
-
self[connectionSymbol].socket = null;
|
114
|
-
|
115
|
-
const url = self.getOption('url');
|
116
|
-
if (!url) throw new Error('No url defined for websocket datasource.');
|
117
|
-
|
118
|
-
self[connectionSymbol].socket = new WebSocket(url);
|
119
|
-
|
120
|
-
self[connectionSymbol].socket.onmessage = function (event) {
|
121
|
-
self[receiveQueueSymbol].add(event);
|
122
|
-
setTimeout(function () {
|
123
|
-
self.read();
|
124
|
-
}, 0);
|
125
|
-
};
|
126
|
-
|
127
|
-
self[connectionSymbol].socket.onopen = function () {
|
128
|
-
connected = true;
|
129
|
-
self[connectionSymbol].reconnectCounter = 0;
|
130
|
-
};
|
131
|
-
|
132
|
-
self[connectionSymbol].socket.close = function (event) {
|
133
|
-
|
134
|
-
if (self[manualCloseSymbol]) {
|
135
|
-
self[manualCloseSymbol] = false;
|
136
|
-
return;
|
137
|
-
}
|
138
|
-
|
139
|
-
if (reconnectEnabled && this[connectionSymbol].reconnectCounter < reconnectAttempts) {
|
140
|
-
setTimeout(() => {
|
141
|
-
self.connect();
|
142
|
-
}, reconnectTimeout * this[connectionSymbol].reconnectCounter);
|
143
|
-
}
|
144
|
-
|
145
|
-
};
|
146
|
-
|
147
|
-
self[connectionSymbol].socket.onerror = (error) => {
|
148
|
-
|
149
|
-
if (reconnectEnabled && self[connectionSymbol].reconnectCounter < reconnectAttempts) {
|
150
|
-
setTimeout(() => {
|
151
|
-
self.connect();
|
152
|
-
}, reconnectTimeout * this[connectionSymbol].reconnectCounter);
|
153
|
-
}
|
154
|
-
|
155
|
-
};
|
188
|
+
return new Promise((resolve, reject) => {
|
189
|
+
connectServer.call(this, resolve, reject);
|
190
|
+
});
|
156
191
|
}
|
157
192
|
|
193
|
+
/**
|
194
|
+
* @returns {boolean}
|
195
|
+
*/
|
158
196
|
isConnected() {
|
159
|
-
|
197
|
+
return this[connectionSymbol]?.socket?.readyState === 1;
|
160
198
|
}
|
161
199
|
|
162
200
|
/**
|
@@ -169,9 +207,11 @@ class WebSocketDatasource extends Datasource {
|
|
169
207
|
|
170
208
|
/**
|
171
209
|
* @property {string} url=undefined Defines the resource that you wish to fetch.
|
172
|
-
* @property {
|
173
|
-
* @property {
|
174
|
-
* @property {
|
210
|
+
* @property {Object} connection
|
211
|
+
* @property {Object} connection.timeout=5000 Defines the timeout for the connection.
|
212
|
+
* @property {Number} connection.reconnect.timeout The timeout in milliseconds for the reconnect.
|
213
|
+
* @property {Number} connection.reconnect.attempts The maximum number of reconnects.
|
214
|
+
* @property {Bool} connection.reconnect.enabled If the reconnect is enabled.
|
175
215
|
* @property {Object} write={} Options
|
176
216
|
* @property {Object} write.mapping the mapping is applied before writing.
|
177
217
|
* @property {String} write.mapping.transformer Transformer to select the appropriate entries
|
@@ -208,21 +248,24 @@ class WebSocketDatasource extends Datasource {
|
|
208
248
|
callbacks: []
|
209
249
|
},
|
210
250
|
},
|
211
|
-
|
212
|
-
timeout:
|
213
|
-
|
214
|
-
|
251
|
+
connection: {
|
252
|
+
timeout: 5000,
|
253
|
+
reconnect: {
|
254
|
+
timeout: 1000,
|
255
|
+
attempts: 1,
|
256
|
+
enabled: false,
|
257
|
+
}
|
215
258
|
}
|
216
259
|
});
|
217
260
|
}
|
218
261
|
|
219
262
|
/**
|
220
263
|
* This method closes the connection.
|
221
|
-
*
|
264
|
+
*
|
222
265
|
* @returns {Promise}
|
223
266
|
*/
|
224
267
|
close() {
|
225
|
-
this[manualCloseSymbol]=true;
|
268
|
+
this[manualCloseSymbol] = true;
|
226
269
|
if (this[connectionSymbol].socket) {
|
227
270
|
this[connectionSymbol].socket.close();
|
228
271
|
}
|
@@ -236,9 +279,9 @@ class WebSocketDatasource extends Datasource {
|
|
236
279
|
const self = this;
|
237
280
|
let response;
|
238
281
|
|
239
|
-
if (self[connectionSymbol]?.socket?.readyState!==1) {
|
282
|
+
if (self[connectionSymbol]?.socket?.readyState !== 1) {
|
240
283
|
return Promise.reject('The connection is not established.');
|
241
|
-
}
|
284
|
+
}
|
242
285
|
|
243
286
|
return new Promise((resolve, reject) => {
|
244
287
|
if (self[receiveQueueSymbol].isEmpty()) {
|
@@ -246,7 +289,7 @@ class WebSocketDatasource extends Datasource {
|
|
246
289
|
}
|
247
290
|
|
248
291
|
while (!self[receiveQueueSymbol].isEmpty()) {
|
249
|
-
|
292
|
+
|
250
293
|
const event = self[receiveQueueSymbol].poll();
|
251
294
|
const body = event?.data;
|
252
295
|
if (!body) continue;
|
@@ -291,8 +334,8 @@ class WebSocketDatasource extends Datasource {
|
|
291
334
|
*/
|
292
335
|
write() {
|
293
336
|
const self = this;
|
294
|
-
|
295
|
-
if (self[connectionSymbol]?.socket?.readyState!==1) {
|
337
|
+
|
338
|
+
if (self[connectionSymbol]?.socket?.readyState !== 1) {
|
296
339
|
return Promise.reject('The connection is not established.');
|
297
340
|
}
|
298
341
|
|
@@ -319,7 +362,7 @@ class WebSocketDatasource extends Datasource {
|
|
319
362
|
}
|
320
363
|
|
321
364
|
return new Promise((resolve, reject) => {
|
322
|
-
|
365
|
+
|
323
366
|
if (self[connectionSymbol].socket.readyState !== 1) {
|
324
367
|
reject('the socket is not ready');
|
325
368
|
}
|
package/source/types/version.mjs
CHANGED
package/test/cases/monster.mjs
CHANGED