@soundworks/core 3.7.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.
- package/.eslintrc +16 -0
- package/LICENSE +1 -1
- package/README.md +32 -30
- package/package.json +48 -28
- package/src/client/Client.js +391 -0
- package/src/client/Context.js +225 -0
- package/src/client/ContextManager.js +111 -0
- package/src/client/Plugin.js +66 -0
- package/src/client/PluginManager.js +123 -0
- package/src/client/SharedState.js +84 -0
- package/src/client/Socket.js +389 -0
- package/src/client/StateManager.js +67 -0
- package/src/client/index.js +77 -0
- package/src/common/BasePlugin.js +163 -0
- package/src/common/BasePluginManager.js +227 -0
- package/{common/SharedState.js → src/common/BaseSharedState.js} +198 -234
- package/src/common/BaseStateManager.js +200 -0
- package/{common → src/common}/ParameterBag.js +74 -112
- package/{common → src/common}/SharedStatePrivate.js +56 -62
- package/src/common/constants.js +51 -0
- package/src/common/logger.js +154 -0
- package/src/common/promise-store.js +25 -0
- package/src/common/sockets-utils.js +73 -0
- package/src/common/utils.js +22 -0
- package/src/server/Client.js +50 -0
- package/src/server/Context.js +99 -0
- package/src/server/ContextManager.js +266 -0
- package/src/server/Plugin.js +77 -0
- package/src/server/PluginManager.js +150 -0
- package/src/server/Server.js +849 -0
- package/src/server/SharedState.js +86 -0
- package/{server → src/server}/Socket.js +114 -88
- package/{server → src/server}/Sockets.js +73 -60
- package/{common/SharedStateManagerServer.js → src/server/StateManager.js} +181 -129
- package/src/server/audit-network-latency.worker.js +57 -0
- package/src/server/audit-schema.js +42 -0
- package/src/server/index.js +45 -0
- package/tsconfig.json +21 -0
- package/types/client/Client.d.ts +194 -0
- package/types/client/Client.d.ts.map +1 -0
- package/types/client/Context.d.ts +139 -0
- package/types/client/Context.d.ts.map +1 -0
- package/types/client/ContextManager.d.ts +45 -0
- package/types/client/ContextManager.d.ts.map +1 -0
- package/types/client/Plugin.d.ts +53 -0
- package/types/client/Plugin.d.ts.map +1 -0
- package/types/client/PluginManager.d.ts +96 -0
- package/types/client/PluginManager.d.ts.map +1 -0
- package/types/client/SharedState.d.ts +85 -0
- package/types/client/SharedState.d.ts.map +1 -0
- package/types/client/Socket.d.ts +138 -0
- package/types/client/Socket.d.ts.map +1 -0
- package/types/client/StateManager.d.ts +72 -0
- package/types/client/StateManager.d.ts.map +1 -0
- package/types/client/index.d.ts +11 -0
- package/types/client/index.d.ts.map +1 -0
- package/types/common/BasePlugin.d.ts +145 -0
- package/types/common/BasePlugin.d.ts.map +1 -0
- package/types/common/BasePluginManager.d.ts +88 -0
- package/types/common/BasePluginManager.d.ts.map +1 -0
- package/types/common/BaseSharedState.d.ts +173 -0
- package/types/common/BaseSharedState.d.ts.map +1 -0
- package/types/common/BaseStateManager.d.ts +70 -0
- package/types/common/BaseStateManager.d.ts.map +1 -0
- package/types/common/ParameterBag.d.ts +143 -0
- package/types/common/ParameterBag.d.ts.map +1 -0
- package/types/common/SharedStatePrivate.d.ts +20 -0
- package/types/common/SharedStatePrivate.d.ts.map +1 -0
- package/types/common/constants.d.ts +35 -0
- package/types/common/constants.d.ts.map +1 -0
- package/types/common/logger.d.ts +16 -0
- package/types/common/logger.d.ts.map +1 -0
- package/types/common/promise-store.d.ts +4 -0
- package/types/common/promise-store.d.ts.map +1 -0
- package/types/common/sockets-utils.d.ts +9 -0
- package/types/common/sockets-utils.d.ts.map +1 -0
- package/types/common/utils.d.ts +5 -0
- package/types/common/utils.d.ts.map +1 -0
- package/types/server/Client.d.ts +40 -0
- package/types/server/Client.d.ts.map +1 -0
- package/types/server/Context.d.ts +59 -0
- package/types/server/Context.d.ts.map +1 -0
- package/types/server/ContextManager.d.ts +69 -0
- package/types/server/ContextManager.d.ts.map +1 -0
- package/types/server/Plugin.d.ts +70 -0
- package/types/server/Plugin.d.ts.map +1 -0
- package/types/server/PluginManager.d.ts +91 -0
- package/types/server/PluginManager.d.ts.map +1 -0
- package/types/server/Server.d.ts +223 -0
- package/types/server/Server.d.ts.map +1 -0
- package/types/server/SharedState.d.ts +86 -0
- package/types/server/SharedState.d.ts.map +1 -0
- package/types/server/Socket.d.ts +128 -0
- package/types/server/Socket.d.ts.map +1 -0
- package/types/server/Sockets.d.ts +73 -0
- package/types/server/Sockets.d.ts.map +1 -0
- package/types/server/StateManager.d.ts +190 -0
- package/types/server/StateManager.d.ts.map +1 -0
- package/types/server/audit-network-latency.worker.d.ts +2 -0
- package/types/server/audit-network-latency.worker.d.ts.map +1 -0
- package/types/server/audit-schema.d.ts +27 -0
- package/types/server/audit-schema.d.ts.map +1 -0
- package/types/server/index.d.ts +7 -0
- package/types/server/index.d.ts.map +1 -0
- package/client/AbstractExperience.js +0 -54
- package/client/AbstractPlugin.js +0 -230
- package/client/Client.js +0 -193
- package/client/PluginManager.js +0 -279
- package/client/Socket.js +0 -346
- package/client/index.js +0 -48
- package/client.js +0 -28
- package/common/SharedStateManagerClient.js +0 -194
- package/common/Signal.js +0 -40
- package/common/SignalAll.js +0 -44
- package/common/logger.js +0 -162
- package/common/shared-state-utils.js +0 -89
- package/common/sockets-encoder-decoder.js +0 -73
- package/server/AbstractExperience.js +0 -126
- package/server/AbstractPlugin.js +0 -214
- package/server/Client.js +0 -70
- package/server/PluginManager.js +0 -273
- package/server/Server.js +0 -785
- package/server/index.js +0 -49
- package/server.js +0 -28
package/server/Client.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _uuid = require("uuid");
|
|
9
|
-
|
|
10
|
-
function* idGenerator() {
|
|
11
|
-
for (let i = 0; true; i++) {
|
|
12
|
-
yield i;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const generateId = idGenerator();
|
|
17
|
-
/**
|
|
18
|
-
* Server side representation of a client.
|
|
19
|
-
*
|
|
20
|
-
* @memberof server
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
class Client {
|
|
24
|
-
/**
|
|
25
|
-
* @param {String} clientType - Type of the client
|
|
26
|
-
* @param {server.Socket} socket - Socket connection with the client
|
|
27
|
-
*/
|
|
28
|
-
constructor(clientType, socket) {
|
|
29
|
-
/**
|
|
30
|
-
* Client type, as specified when initializing the client side {@link client.Client}.
|
|
31
|
-
*
|
|
32
|
-
* @see {@link client.Client#init}
|
|
33
|
-
* @type {String}
|
|
34
|
-
*/
|
|
35
|
-
this.type = clientType;
|
|
36
|
-
/**
|
|
37
|
-
* Session id (incremeted positive number).
|
|
38
|
-
* The counter is reset when the server restarts.
|
|
39
|
-
* @type {Number}
|
|
40
|
-
*/
|
|
41
|
-
|
|
42
|
-
this.id = generateId.next().value;
|
|
43
|
-
/**
|
|
44
|
-
* Unique session id (uuidv4).
|
|
45
|
-
* @type {String}
|
|
46
|
-
*/
|
|
47
|
-
|
|
48
|
-
this.uuid = (0, _uuid.v4)();
|
|
49
|
-
/**
|
|
50
|
-
* Socket connection with the remote {@link client.Client}.
|
|
51
|
-
* @type {server.Socket}
|
|
52
|
-
*/
|
|
53
|
-
|
|
54
|
-
this.socket = socket;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Destroy the client.
|
|
58
|
-
* @private
|
|
59
|
-
*/
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
destroy() {
|
|
63
|
-
this.uuid = null;
|
|
64
|
-
this.id = null;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
var _default = Client;
|
|
70
|
-
exports.default = _default;
|
package/server/PluginManager.js
DELETED
|
@@ -1,273 +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 _AbstractPlugin = _interopRequireDefault(require("./AbstractPlugin.js"));
|
|
11
|
-
|
|
12
|
-
var _Signal = _interopRequireDefault(require("../common/Signal.js"));
|
|
13
|
-
|
|
14
|
-
var _SignalAll = _interopRequireDefault(require("../common/SignalAll.js"));
|
|
15
|
-
|
|
16
|
-
var _logger = _interopRequireDefault(require("../common/logger.js"));
|
|
17
|
-
|
|
18
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
|
-
const log = (0, _debug.default)('soundworks:lifecycle');
|
|
21
|
-
/**
|
|
22
|
-
* Manager the plugins and their relations. Acts as a factory to ensure plugins
|
|
23
|
-
* are instanciated only once.
|
|
24
|
-
*
|
|
25
|
-
* @memberof server
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
class PluginManager {
|
|
29
|
-
constructor(server) {
|
|
30
|
-
/** @private */
|
|
31
|
-
this._server = server;
|
|
32
|
-
/** @private */
|
|
33
|
-
|
|
34
|
-
this._registeredPlugins = new Map();
|
|
35
|
-
/** @private */
|
|
36
|
-
|
|
37
|
-
this._instances = new Map();
|
|
38
|
-
/** @private */
|
|
39
|
-
|
|
40
|
-
this._observers = new Set();
|
|
41
|
-
/** @private */
|
|
42
|
-
|
|
43
|
-
this._pluginsStatuses = {}; // @todo - move to Promise based logic
|
|
44
|
-
|
|
45
|
-
this.signals = {
|
|
46
|
-
start: new _Signal.default(),
|
|
47
|
-
ready: new _SignalAll.default()
|
|
48
|
-
};
|
|
49
|
-
this.ready = new Promise(resolve => {
|
|
50
|
-
this._resolveReadyPromise = resolve;
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
/** @private */
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
start() {
|
|
57
|
-
log('> pluginManager start');
|
|
58
|
-
|
|
59
|
-
_logger.default.title('initializing plugins');
|
|
60
|
-
|
|
61
|
-
this.signals.ready.addObserver(() => {
|
|
62
|
-
log('> pluginManager ready');
|
|
63
|
-
|
|
64
|
-
this._resolveReadyPromise();
|
|
65
|
-
}); // propagate all 'idle' statuses before start
|
|
66
|
-
|
|
67
|
-
this._propagateStatusChange(); // start before ready, even if no deps
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
this.signals.start.value = true;
|
|
71
|
-
|
|
72
|
-
if (this.signals.ready.length === 0) {
|
|
73
|
-
this.signals.ready.value = true;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return this.ready;
|
|
77
|
-
}
|
|
78
|
-
/** @private */
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
_propagateStatusChange(name = null, status = null) {
|
|
82
|
-
if (name != null && status != null) {
|
|
83
|
-
this._pluginsStatuses[name] = status;
|
|
84
|
-
const statuses = this.getStatuses();
|
|
85
|
-
|
|
86
|
-
this._observers.forEach(observer => observer(statuses, {
|
|
87
|
-
[name]: status
|
|
88
|
-
}));
|
|
89
|
-
} else {
|
|
90
|
-
const statuses = this.getStatuses();
|
|
91
|
-
|
|
92
|
-
this._observers.forEach(observer => observer(statuses, {}));
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
/** @private */
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
observe(observer) {
|
|
99
|
-
this._observers.add(observer);
|
|
100
|
-
|
|
101
|
-
return () => {
|
|
102
|
-
this._observers.delete(observer);
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
/** @private */
|
|
106
|
-
// @todo rename to `getStatuses`
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
getStatuses() {
|
|
110
|
-
return Object.assign({}, this._pluginsStatuses);
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Register a plugin (server-side) into soundworks.
|
|
114
|
-
*
|
|
115
|
-
* _A plugin must be registered both client-side and server-side_
|
|
116
|
-
* @see {@link client.PluginManager#register}
|
|
117
|
-
*
|
|
118
|
-
* @param {String} name - Name of the plugin
|
|
119
|
-
* @param {Function} factory - Factory function that return the plugin class
|
|
120
|
-
* @param {Object} options - Options to configure the plugin
|
|
121
|
-
* @param {Array} deps - List of plugins' names the plugin depends on
|
|
122
|
-
*
|
|
123
|
-
* @example
|
|
124
|
-
* ```js
|
|
125
|
-
* server.pluginManager.register('user-defined-name', pluginFactory);
|
|
126
|
-
* ```
|
|
127
|
-
*/
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
register(name, factory = null, options = {}, deps = []) {
|
|
131
|
-
if (this._registeredPlugins.has(name)) {
|
|
132
|
-
const ctor = factory(_AbstractPlugin.default);
|
|
133
|
-
throw new Error(`[soundworks:core] Plugin "${name}" of type "${ctor.name}" already registered`);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const ctor = factory(_AbstractPlugin.default);
|
|
137
|
-
|
|
138
|
-
this._registeredPlugins.set(name, {
|
|
139
|
-
ctor,
|
|
140
|
-
options,
|
|
141
|
-
deps
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Retrieve an instance of a registered plugin according to its given name.
|
|
146
|
-
* Except if you know what you are doing, prefer `Experience.require('my-plugin')`
|
|
147
|
-
*
|
|
148
|
-
* @param {String} name - Name of the registered plugin
|
|
149
|
-
*/
|
|
150
|
-
// @todo - review this API, this is ugly and error prone
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
get(name, _experience = null) {
|
|
154
|
-
if (!this._registeredPlugins.has(name)) {
|
|
155
|
-
let msg = `[soundworks:core] Cannot get or require plugin "${name}", plugin is not registered`;
|
|
156
|
-
|
|
157
|
-
if (this._registeredPlugins.size > 0) {
|
|
158
|
-
msg += `
|
|
159
|
-
> registered plugins are:
|
|
160
|
-
${Array.from(this._registeredPlugins.keys()).map(name => `> - ${name}\n`).join('')}`;
|
|
161
|
-
} else {
|
|
162
|
-
msg += `
|
|
163
|
-
> no plugin registered`;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
throw new Error(msg);
|
|
167
|
-
} // required by experience and manager already started
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
if (_experience && this.signals.start.value === true) {
|
|
171
|
-
throw new Error(`[soundworks:core] Cannot require plugin ("${name}") after server.start()`);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
if (!this._instances.has(name)) {
|
|
175
|
-
this._createInstance(name);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
const instance = this._instances.get(name); // if require by the experience, map client types
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
if (_experience) {
|
|
182
|
-
_experience.clientTypes.forEach(clientType => {
|
|
183
|
-
instance.clientTypes.add(clientType);
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return instance;
|
|
188
|
-
}
|
|
189
|
-
/** @private */
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
_createInstance(name) {
|
|
193
|
-
log(`> instantiating plugin "${name}"`);
|
|
194
|
-
|
|
195
|
-
const {
|
|
196
|
-
ctor,
|
|
197
|
-
options,
|
|
198
|
-
deps
|
|
199
|
-
} = this._registeredPlugins.get(name);
|
|
200
|
-
|
|
201
|
-
const instance = new ctor(this._server, name, options);
|
|
202
|
-
this.signals.ready.add(instance.signals.ready);
|
|
203
|
-
instance.signals.start.add(this.signals.start);
|
|
204
|
-
|
|
205
|
-
if (deps.length > 0) {
|
|
206
|
-
deps.forEach(dependencyName => {
|
|
207
|
-
if (!this._instances.has(dependencyName)) {
|
|
208
|
-
this.get(dependencyName, _experience); // propagate client types
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
const dependency = this._instances.get(dependencyName);
|
|
212
|
-
|
|
213
|
-
instance.signals.start.add(dependency.signals.ready);
|
|
214
|
-
});
|
|
215
|
-
} // handle plugin status reporting
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
this._pluginsStatuses[name] = 'idle';
|
|
219
|
-
|
|
220
|
-
const onPluginStarted = () => {
|
|
221
|
-
this._propagateStatusChange(name, 'started');
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
const onPluginErrored = () => {
|
|
225
|
-
this._propagateStatusChange(name, 'errored');
|
|
226
|
-
|
|
227
|
-
instance.signals.started.removeObserver(onPluginStarted);
|
|
228
|
-
instance.signals.ready.removeObserver(onPluginReady);
|
|
229
|
-
instance.signals.errored.removeObserver(onPluginErrored);
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
const onPluginReady = () => {
|
|
233
|
-
this._propagateStatusChange(name, 'ready');
|
|
234
|
-
|
|
235
|
-
instance.signals.started.removeObserver(onPluginStarted);
|
|
236
|
-
instance.signals.ready.removeObserver(onPluginReady);
|
|
237
|
-
instance.signals.errored.removeObserver(onPluginErrored);
|
|
238
|
-
}; // listen the signals
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
instance.signals.started.addObserver(onPluginStarted);
|
|
242
|
-
instance.signals.ready.addObserver(onPluginReady);
|
|
243
|
-
instance.signals.errored.addObserver(onPluginErrored);
|
|
244
|
-
|
|
245
|
-
this._instances.set(name, instance);
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* @private
|
|
249
|
-
* This method is protected (semi-private), only used by server to check
|
|
250
|
-
* consistency between client and server experiences requirements.
|
|
251
|
-
*/
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
getRequiredPlugins(clientType = null) {
|
|
255
|
-
const plugins = [];
|
|
256
|
-
|
|
257
|
-
for (let name of this._instances.keys()) {
|
|
258
|
-
if (clientType !== null) {
|
|
259
|
-
if (this._instances.get(name).clientTypes.has(clientType)) {
|
|
260
|
-
plugins.push(name);
|
|
261
|
-
}
|
|
262
|
-
} else {
|
|
263
|
-
plugins.push(name);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
return plugins;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
var _default = PluginManager;
|
|
273
|
-
exports.default = _default;
|