@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.
Files changed (124) hide show
  1. package/.eslintrc +16 -0
  2. package/LICENSE +1 -1
  3. package/README.md +32 -30
  4. package/package.json +48 -28
  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/{common/SharedState.js → src/common/BaseSharedState.js} +198 -234
  17. package/src/common/BaseStateManager.js +200 -0
  18. package/{common → src/common}/ParameterBag.js +74 -112
  19. package/{common → src/common}/SharedStatePrivate.js +56 -62
  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 +114 -88
  33. package/{server → src/server}/Sockets.js +73 -60
  34. package/{common/SharedStateManagerServer.js → src/server/StateManager.js} +181 -129
  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 -193
  108. package/client/PluginManager.js +0 -279
  109. package/client/Socket.js +0 -346
  110. package/client/index.js +0 -48
  111. package/client.js +0 -28
  112. package/common/SharedStateManagerClient.js +0 -194
  113. package/common/Signal.js +0 -40
  114. package/common/SignalAll.js +0 -44
  115. package/common/logger.js +0 -162
  116. package/common/shared-state-utils.js +0 -89
  117. package/common/sockets-encoder-decoder.js +0 -73
  118. package/server/AbstractExperience.js +0 -126
  119. package/server/AbstractPlugin.js +0 -214
  120. package/server/Client.js +0 -70
  121. package/server/PluginManager.js +0 -273
  122. package/server/Server.js +0 -785
  123. package/server/index.js +0 -49
  124. 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;
@@ -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;