@soundworks/core 3.6.0 → 4.0.0-alpha.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.
Files changed (125) hide show
  1. package/.eslintrc +16 -0
  2. package/LICENSE +1 -1
  3. package/README.md +32 -30
  4. package/package.json +57 -26
  5. package/src/client/Client.js +391 -0
  6. package/src/client/Context.js +225 -0
  7. package/src/client/ContextManager.js +111 -0
  8. package/src/client/Plugin.js +66 -0
  9. package/src/client/PluginManager.js +123 -0
  10. package/src/client/SharedState.js +84 -0
  11. package/src/client/Socket.js +389 -0
  12. package/src/client/StateManager.js +67 -0
  13. package/src/client/index.js +77 -0
  14. package/src/common/BasePlugin.js +163 -0
  15. package/src/common/BasePluginManager.js +227 -0
  16. package/src/common/BaseSharedState.js +473 -0
  17. package/src/common/BaseStateManager.js +200 -0
  18. package/{common → src/common}/ParameterBag.js +82 -122
  19. package/{common → src/common}/SharedStatePrivate.js +56 -64
  20. package/src/common/constants.js +51 -0
  21. package/src/common/logger.js +154 -0
  22. package/src/common/promise-store.js +25 -0
  23. package/src/common/sockets-utils.js +73 -0
  24. package/src/common/utils.js +22 -0
  25. package/src/server/Client.js +50 -0
  26. package/src/server/Context.js +99 -0
  27. package/src/server/ContextManager.js +266 -0
  28. package/src/server/Plugin.js +77 -0
  29. package/src/server/PluginManager.js +150 -0
  30. package/src/server/Server.js +849 -0
  31. package/src/server/SharedState.js +86 -0
  32. package/{server → src/server}/Socket.js +119 -94
  33. package/{server → src/server}/Sockets.js +73 -61
  34. package/{common/SharedStateManagerServer.js → src/server/StateManager.js} +183 -131
  35. package/src/server/audit-network-latency.worker.js +57 -0
  36. package/src/server/audit-schema.js +42 -0
  37. package/src/server/index.js +45 -0
  38. package/tsconfig.json +21 -0
  39. package/types/client/Client.d.ts +194 -0
  40. package/types/client/Client.d.ts.map +1 -0
  41. package/types/client/Context.d.ts +139 -0
  42. package/types/client/Context.d.ts.map +1 -0
  43. package/types/client/ContextManager.d.ts +45 -0
  44. package/types/client/ContextManager.d.ts.map +1 -0
  45. package/types/client/Plugin.d.ts +53 -0
  46. package/types/client/Plugin.d.ts.map +1 -0
  47. package/types/client/PluginManager.d.ts +96 -0
  48. package/types/client/PluginManager.d.ts.map +1 -0
  49. package/types/client/SharedState.d.ts +85 -0
  50. package/types/client/SharedState.d.ts.map +1 -0
  51. package/types/client/Socket.d.ts +138 -0
  52. package/types/client/Socket.d.ts.map +1 -0
  53. package/types/client/StateManager.d.ts +72 -0
  54. package/types/client/StateManager.d.ts.map +1 -0
  55. package/types/client/index.d.ts +11 -0
  56. package/types/client/index.d.ts.map +1 -0
  57. package/types/common/BasePlugin.d.ts +145 -0
  58. package/types/common/BasePlugin.d.ts.map +1 -0
  59. package/types/common/BasePluginManager.d.ts +88 -0
  60. package/types/common/BasePluginManager.d.ts.map +1 -0
  61. package/types/common/BaseSharedState.d.ts +173 -0
  62. package/types/common/BaseSharedState.d.ts.map +1 -0
  63. package/types/common/BaseStateManager.d.ts +70 -0
  64. package/types/common/BaseStateManager.d.ts.map +1 -0
  65. package/types/common/ParameterBag.d.ts +143 -0
  66. package/types/common/ParameterBag.d.ts.map +1 -0
  67. package/types/common/SharedStatePrivate.d.ts +20 -0
  68. package/types/common/SharedStatePrivate.d.ts.map +1 -0
  69. package/types/common/constants.d.ts +35 -0
  70. package/types/common/constants.d.ts.map +1 -0
  71. package/types/common/logger.d.ts +16 -0
  72. package/types/common/logger.d.ts.map +1 -0
  73. package/types/common/promise-store.d.ts +4 -0
  74. package/types/common/promise-store.d.ts.map +1 -0
  75. package/types/common/sockets-utils.d.ts +9 -0
  76. package/types/common/sockets-utils.d.ts.map +1 -0
  77. package/types/common/utils.d.ts +5 -0
  78. package/types/common/utils.d.ts.map +1 -0
  79. package/types/server/Client.d.ts +40 -0
  80. package/types/server/Client.d.ts.map +1 -0
  81. package/types/server/Context.d.ts +59 -0
  82. package/types/server/Context.d.ts.map +1 -0
  83. package/types/server/ContextManager.d.ts +69 -0
  84. package/types/server/ContextManager.d.ts.map +1 -0
  85. package/types/server/Plugin.d.ts +70 -0
  86. package/types/server/Plugin.d.ts.map +1 -0
  87. package/types/server/PluginManager.d.ts +91 -0
  88. package/types/server/PluginManager.d.ts.map +1 -0
  89. package/types/server/Server.d.ts +223 -0
  90. package/types/server/Server.d.ts.map +1 -0
  91. package/types/server/SharedState.d.ts +86 -0
  92. package/types/server/SharedState.d.ts.map +1 -0
  93. package/types/server/Socket.d.ts +128 -0
  94. package/types/server/Socket.d.ts.map +1 -0
  95. package/types/server/Sockets.d.ts +73 -0
  96. package/types/server/Sockets.d.ts.map +1 -0
  97. package/types/server/StateManager.d.ts +190 -0
  98. package/types/server/StateManager.d.ts.map +1 -0
  99. package/types/server/audit-network-latency.worker.d.ts +2 -0
  100. package/types/server/audit-network-latency.worker.d.ts.map +1 -0
  101. package/types/server/audit-schema.d.ts +27 -0
  102. package/types/server/audit-schema.d.ts.map +1 -0
  103. package/types/server/index.d.ts +7 -0
  104. package/types/server/index.d.ts.map +1 -0
  105. package/client/AbstractExperience.js +0 -54
  106. package/client/AbstractPlugin.js +0 -230
  107. package/client/Client.js +0 -190
  108. package/client/PluginManager.js +0 -267
  109. package/client/Socket.js +0 -338
  110. package/client/index.js +0 -48
  111. package/client.js +0 -28
  112. package/common/SharedState.js +0 -480
  113. package/common/SharedStateManagerClient.js +0 -194
  114. package/common/Signal.js +0 -40
  115. package/common/SignalAll.js +0 -44
  116. package/common/shared-state-utils.js +0 -90
  117. package/common/sockets-encoder-decoder.js +0 -73
  118. package/server/AbstractExperience.js +0 -126
  119. package/server/AbstractPlugin.js +0 -211
  120. package/server/Client.js +0 -70
  121. package/server/PluginManager.js +0 -177
  122. package/server/Server.js +0 -746
  123. package/server/index.js +0 -49
  124. package/server/utils/logger.js +0 -134
  125. package/server.js +0 -28
package/client/Socket.js DELETED
@@ -1,338 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _debug = _interopRequireDefault(require("debug"));
9
-
10
- var _isomorphicWs = _interopRequireDefault(require("isomorphic-ws"));
11
-
12
- var _socketsEncoderDecoder = require("../common/sockets-encoder-decoder.js");
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- const log = (0, _debug.default)('soundworks:socket'); // https://stackoverflow.com/questions/17575790/environment-detection-node-js-or-browser
17
-
18
- const isBrowser = new Function("try {return this===window;}catch(e){ return false;}"); // close
19
- // Fired when a connection with a websocket is closed.
20
- // Also available via the onclose property
21
- // error
22
- // Fired when a connection with a websocket has been closed because of an error, such as whensome data couldn't be sent.
23
- // Also available via the onerror property.
24
- // message
25
- // Fired when data is received through a websocket.
26
- // Also available via the onmessage property.
27
- // open
28
- // Fired when a connection with a websocket is opened.
29
- // Also available via the onopen property.
30
- // @todo - use isomorphic ws ? (does seems like a perfect idea)
31
-
32
- /**
33
- * Simple wrapper with simple pubsub system built on top of `ws` socket.
34
- * The abstraction actually open two different sockets:
35
- * - one configured for string (JSON compatible) messages
36
- * - one configured with `binaryType=arraybuffer` for streaming data more
37
- * efficiently.
38
- * The sockets also re-emits all "native" ws events.
39
- *
40
- * An instance of `Socket` is automatically created by the `soundworks.Client`.
41
- * @see {@link client.Client#socket}
42
- *
43
- * @see https://github.com/websockets/ws
44
- *
45
- * @memberof client
46
- */
47
-
48
- class Socket {
49
- constructor() {
50
- /**
51
- * WebSocket instance (string protocol - binaryType = 'string').
52
- */
53
-
54
- /** @private */
55
- this.ws = null;
56
- /**
57
- * WebSocket instance (binary protocol - binaryType = 'arraybuffer').
58
- */
59
-
60
- /** @private */
61
-
62
- this.binaryWs = null;
63
- this._stringListeners = new Map();
64
- this._binaryListeners = new Map();
65
- }
66
- /**
67
- * Initialize a websocket connection with the server. This is automatically
68
- * called in `client.init()`
69
- * @param {String} clientType - `client.type` {@link client}
70
- * @param {Object} options - Options of the socket
71
- * @param {Array<String>} options.path - Defines where socket should find the `socket.io` file
72
- */
73
-
74
- /** @private */
75
-
76
-
77
- async init(clientType, config) {
78
- // unique key that allows to associate the two sockets to the same client.
79
- // note: the key is only used to pair to two sockets, so its usage is very
80
- // limited in time therefore a random number should hopefully be sufficient.
81
- const key = (Math.random() + '').replace(/^0\./, ''); // open web sockets
82
-
83
- let {
84
- path
85
- } = config.env.websockets; // @note: keep this check
86
- // backward compatibility w/ assetsDomain and websocket old config way
87
- // cf. https://github.com/collective-soundworks/soundworks/issues/35
88
-
89
- if (config.env.subpath) {
90
- path = `${config.env.subpath}/${path}`;
91
- }
92
-
93
- let url;
94
- let webSocketOptions;
95
-
96
- if (isBrowser()) {
97
- const protocol = window.location.protocol.replace(/^http?/, 'ws');
98
- const {
99
- hostname,
100
- port
101
- } = window.location;
102
- url = `${protocol}//${hostname}:${port}/${path}`;
103
- webSocketOptions = [];
104
- } else {
105
- const protocol = config.env.useHttps ? 'wss:' : 'ws:';
106
- const {
107
- serverIp,
108
- port
109
- } = config.env;
110
- url = `${protocol}//${serverIp}:${port}/${path}`;
111
- webSocketOptions = {
112
- rejectUnauthorized: false
113
- };
114
- }
115
-
116
- const queryParams = `clientType=${clientType}&key=${key}`; // ----------------------------------------------------------
117
- // init string socket
118
- // ----------------------------------------------------------
119
-
120
- const stringSocketUrl = `${url}?binary=0&${queryParams}`;
121
- await new Promise((resolve, reject) => {
122
- let connectionRefusedLogged = false;
123
-
124
- const trySocket = async () => {
125
- log(`[string socket] trying connection - url: ${stringSocketUrl}`);
126
- const ws = new _isomorphicWs.default(stringSocketUrl, webSocketOptions);
127
- ws.addEventListener('open', connectEvent => {
128
- // parse incoming messages for pubsub
129
- this.ws = ws;
130
- this.ws.addEventListener('message', e => {
131
- const [channel, args] = (0, _socketsEncoderDecoder.unpackStringMessage)(e.data);
132
-
133
- this._emit(false, channel, ...args);
134
- }); // broadcast all `WebSocket` native events
135
-
136
- ['close', 'error', 'upgrade', 'message'].forEach(eventName => {
137
- this.ws.addEventListener(eventName, e => {
138
- this._emit(false, eventName, e);
139
- });
140
- }); // forward open event
141
-
142
- this._emit(false, 'open', connectEvent); // continue with raw socket
143
-
144
-
145
- resolve();
146
- }); // cf. https://github.com/collective-soundworks/soundworks/issues/17
147
-
148
- ws.addEventListener('error', e => {
149
- if (e.type === 'error' && e.error.code === 'ECONNREFUSED') {
150
- if (!connectionRefusedLogged) {
151
- console.log('[socket] connection refused, waiting for the server to start');
152
- connectionRefusedLogged = true;
153
- }
154
-
155
- setTimeout(trySocket, 1000);
156
- }
157
- });
158
- };
159
-
160
- trySocket();
161
- }); // // ----------------------------------------------------------
162
- // // init binary socket
163
- // // ----------------------------------------------------------
164
-
165
- const binarySocketUrl = `${url}?binary=1&${queryParams}`;
166
- await new Promise((resolve, reject) => {
167
- log(`[binary socket] trying connection - url: ${binarySocketUrl}`);
168
- const ws = new _isomorphicWs.default(binarySocketUrl, webSocketOptions);
169
- ws.binaryType = 'arraybuffer';
170
- ws.addEventListener('open', connectEvent => {
171
- // parse incoming messages for pubsub
172
- this.binaryWs = ws;
173
- this.binaryWs.addEventListener('message', e => {
174
- const [channel, data] = (0, _socketsEncoderDecoder.unpackBinaryMessage)(e.data);
175
-
176
- this._emit(true, channel, data);
177
- }); // broadcast all `WebSocket` native events
178
-
179
- ['close', 'error', 'upgrade', 'message'].forEach(eventName => {
180
- this.binaryWs.addEventListener(eventName, e => {
181
- this._emit(true, eventName, e);
182
- });
183
- }); // forward open event
184
-
185
- this._emit(true, 'open', connectEvent);
186
-
187
- resolve();
188
- });
189
- }); // everyone is connected
190
-
191
- return Promise.resolve();
192
- }
193
- /** @private */
194
-
195
-
196
- _emit(binary, channel, ...args) {
197
- const listeners = binary ? this._binaryListeners : this._stringListeners;
198
-
199
- if (listeners.has(channel)) {
200
- const callbacks = listeners.get(channel);
201
- callbacks.forEach(callback => callback(...args));
202
- }
203
- }
204
- /** @private */
205
-
206
-
207
- _addListener(listeners, channel, callback) {
208
- if (!listeners.has(channel)) {
209
- listeners.set(channel, new Set());
210
- }
211
-
212
- const callbacks = listeners.get(channel);
213
- callbacks.add(callback);
214
- }
215
- /** @private */
216
-
217
-
218
- _removeListener(listeners, channel, callback) {
219
- if (listeners.has(channel)) {
220
- const callbacks = listeners.get(channel);
221
- callbacks.delete(callback);
222
-
223
- if (callbacks.size === 0) {
224
- listeners.delete(channel);
225
- }
226
- }
227
- }
228
- /** @private */
229
-
230
-
231
- _removeAllListeners(listeners, channel) {
232
- if (listeners.has(channel)) {
233
- listeners.delete(channel);
234
- }
235
- }
236
- /**
237
- * Send JSON compatible messages on a given channel
238
- *
239
- * @param {String} channel - The channel of the message
240
- * @param {...*} args - Arguments of the message (as many as needed, of any type)
241
- */
242
-
243
-
244
- send(channel, ...args) {
245
- const msg = (0, _socketsEncoderDecoder.packStringMessage)(channel, ...args);
246
- this.ws.send(msg);
247
- }
248
- /**
249
- * Listen JSON compatible messages on a given channel
250
- *
251
- * @param {String} channel - Channel of the message
252
- * @param {Function} callback - Callback to execute when a message is received
253
- */
254
-
255
-
256
- addListener(channel, callback) {
257
- this._addListener(this._stringListeners, channel, callback);
258
- }
259
- /**
260
- * Remove a listener from JSON compatible messages on a given channel
261
- *
262
- * @param {String} channel - Channel of the message
263
- * @param {Function} callback - Callback to remove
264
- */
265
-
266
-
267
- removeListener(channel, callback) {
268
- this._removeListener(this._stringListeners, channel, callback);
269
- }
270
- /**
271
- * Remove all listeners from JSON compatible messages on a given channel
272
- *
273
- * @param {String} channel - Channel of the message
274
- */
275
-
276
-
277
- removeAllListeners(channel) {
278
- this._removeAllListeners(this._stringListeners, channel);
279
- }
280
- /**
281
- * Send binary messages on a given channel
282
- *
283
- * @param {String} channel - Channel of the message
284
- * @param {TypedArray} typedArray - Data to send
285
- */
286
-
287
-
288
- sendBinary(channel, typedArray) {
289
- const msg = (0, _socketsEncoderDecoder.packBinaryMessage)(channel, typedArray);
290
- this.binaryWs.send(msg);
291
- }
292
- /**
293
- * Listen binary messages on a given channel
294
- *
295
- * @param {String} channel - Channel of the message
296
- * @param {Function} callback - Callback to execute when a message is received
297
- */
298
-
299
-
300
- addBinaryListener(channel, callback) {
301
- this._addListener(this._binaryListeners, channel, callback);
302
- }
303
- /**
304
- * Remove a listener from binary compatible messages on a given channel
305
- *
306
- * @param {String} channel - Channel of the message
307
- * @param {Function} callback - Callback to cancel
308
- */
309
-
310
-
311
- removeBinaryListener(channel, callback) {
312
- this._removeListener(this._binaryListeners, channel, callback);
313
- }
314
- /**
315
- * Remove all listeners from binary compatible messages on a given channel
316
- *
317
- * @param {String} channel - Channel of the message
318
- */
319
-
320
-
321
- removeAllBinaryListeners(channel) {
322
- this._removeAllListeners(this._binaryListeners, channel);
323
- }
324
- /**
325
- * Immediately close the 2 sockets
326
- */
327
-
328
-
329
- terminate() {
330
- this.ws.close();
331
- this.binaryWs.close();
332
- }
333
-
334
- }
335
-
336
- ;
337
- var _default = Socket;
338
- exports.default = _default;
package/client/index.js DELETED
@@ -1,48 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = exports.Client = exports.AbstractExperience = void 0;
7
-
8
- var _AbstractExperience2 = _interopRequireDefault(require("./AbstractExperience.js"));
9
-
10
- var _Client2 = _interopRequireDefault(require("./Client.js"));
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
- /**
15
- * Client-side part of the *soundworks* framework.
16
- * Can run seamlessly in a browser or in node.js.
17
- *
18
- * @namespace client
19
- *
20
- * @example
21
- * import soundworks from '@soundworks/core/client';
22
- *
23
- * // create a new `soundworks.Client` instance
24
- * const client = new soundworks.Client();
25
- * // register a pre-defined or user-defined plugin
26
- * client.registerService('my-plugin', myServiceFactory);
27
- * // initialize the client (mainly connect and initialize WebSockets)
28
- * await client.init(config);
29
- * // create application specific experience
30
- * // must extends `soundworks.Experience`
31
- * const playerExperience = new PlayerExperience(client);
32
- * // init required plugins, if any
33
- * await client.start();
34
- * // when everything is ready, start the experience
35
- * playerExperience.start();
36
- */
37
- // `import soundworks from '@soundworks/core/client'``
38
- // or
39
- // `import { Client } from '@soundworks/core/client'`
40
- const AbstractExperience = _AbstractExperience2.default;
41
- exports.AbstractExperience = AbstractExperience;
42
- const Client = _Client2.default;
43
- exports.Client = Client;
44
- var _default = {
45
- AbstractExperience: _AbstractExperience2.default,
46
- Client: _Client2.default
47
- };
48
- exports.default = _default;
package/client.js DELETED
@@ -1,28 +0,0 @@
1
- "use strict";
2
-
3
- /**
4
- * This is a dirty shortcut to enable cleaner import in template using `type=module`
5
- * This should be cleaned little by little...
6
- *
7
- * We need to define if we can be backward compatible there if we go to full module (probably not)
8
- */
9
- Object.defineProperty(exports, "__esModule", {
10
- value: true
11
- });
12
- exports.default = exports.Client = exports.AbstractExperience = void 0;
13
-
14
- var _AbstractExperience2 = _interopRequireDefault(require("./client/AbstractExperience.js"));
15
-
16
- var _Client2 = _interopRequireDefault(require("./client/Client.js"));
17
-
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
- const AbstractExperience = _AbstractExperience2.default;
21
- exports.AbstractExperience = AbstractExperience;
22
- const Client = _Client2.default;
23
- exports.Client = Client;
24
- var _default = {
25
- AbstractExperience: _AbstractExperience2.default,
26
- Client: _Client2.default
27
- };
28
- exports.default = _default;