@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.
- package/.eslintrc +16 -0
- package/LICENSE +1 -1
- package/README.md +32 -30
- package/package.json +57 -26
- 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/src/common/BaseSharedState.js +473 -0
- package/src/common/BaseStateManager.js +200 -0
- package/{common → src/common}/ParameterBag.js +82 -122
- package/{common → src/common}/SharedStatePrivate.js +56 -64
- 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 +119 -94
- package/{server → src/server}/Sockets.js +73 -61
- package/{common/SharedStateManagerServer.js → src/server/StateManager.js} +183 -131
- 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 -190
- package/client/PluginManager.js +0 -267
- package/client/Socket.js +0 -338
- package/client/index.js +0 -48
- package/client.js +0 -28
- package/common/SharedState.js +0 -480
- package/common/SharedStateManagerClient.js +0 -194
- package/common/Signal.js +0 -40
- package/common/SignalAll.js +0 -44
- package/common/shared-state-utils.js +0 -90
- package/common/sockets-encoder-decoder.js +0 -73
- package/server/AbstractExperience.js +0 -126
- package/server/AbstractPlugin.js +0 -211
- package/server/Client.js +0 -70
- package/server/PluginManager.js +0 -177
- package/server/Server.js +0 -746
- package/server/index.js +0 -49
- package/server/utils/logger.js +0 -134
- package/server.js +0 -28
|
@@ -1,18 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.types = exports.sharedOptions = exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
var _lodash = _interopRequireDefault(require("lodash.clonedeep"));
|
|
9
|
-
|
|
10
|
-
var _fastDeepEqual = _interopRequireDefault(require("fast-deep-equal"));
|
|
11
|
-
|
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
|
|
14
|
-
// import types from './types';
|
|
15
|
-
// import shallowClone from 'shallow-clone';
|
|
1
|
+
import cloneDeep from 'lodash.clonedeep';
|
|
2
|
+
import equal from 'fast-deep-equal';
|
|
16
3
|
|
|
17
4
|
/**
|
|
18
5
|
* @typedef {Object} server.SharedStateManagerServer~schema
|
|
@@ -44,7 +31,6 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
44
31
|
* }
|
|
45
32
|
* }
|
|
46
33
|
*/
|
|
47
|
-
|
|
48
34
|
/**
|
|
49
35
|
* @typedef {Object} server.SharedStateManagerServer~schemaBooleanDef
|
|
50
36
|
*
|
|
@@ -62,15 +48,14 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
62
48
|
* (which has no state per se). As such, setting this options to `false` if
|
|
63
49
|
* `event=true` does not make sens.
|
|
64
50
|
* @property {Boolean} [immediate=false] - Setting this option to `true` will
|
|
65
|
-
* trigger any change (e.g. call the
|
|
51
|
+
* trigger any change (e.g. call the `onUpdate` listeners) immediately on the
|
|
66
52
|
* state that generate the update (i.e. calling `set`), before propagating the
|
|
67
53
|
* change on the network. This option can be usefull in cases the network
|
|
68
54
|
* would introduce a noticeable latency on the client. If for some reason
|
|
69
|
-
* the value is overriden server-side (e.g. in an updateHook) the listeners
|
|
55
|
+
* the value is overriden server-side (e.g. in an `updateHook`) the listeners
|
|
70
56
|
* will be called again on when the "real" / final value will be received.
|
|
71
57
|
* @property {Object} [metas={}] - Optionnal metadata of the parameter.
|
|
72
58
|
*/
|
|
73
|
-
|
|
74
59
|
/**
|
|
75
60
|
* @typedef {Object} server.SharedStateManagerServer~schemaStringDef
|
|
76
61
|
*
|
|
@@ -88,15 +73,14 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
88
73
|
* (which has no state per se). As such, setting this options to `false` if
|
|
89
74
|
* `event=true` does not make sens.
|
|
90
75
|
* @property {Boolean} [immediate=false] - Setting this option to `true` will
|
|
91
|
-
* trigger any change (e.g. call the
|
|
76
|
+
* trigger any change (e.g. call the `onUpdate` listeners) immediately on the
|
|
92
77
|
* state that generate the update (i.e. calling `set`), before propagating the
|
|
93
78
|
* change on the network. This option can be usefull in cases the network
|
|
94
79
|
* would introduce a noticeable latency on the client. If for some reason
|
|
95
|
-
* the value is overriden server-side (e.g. in an updateHook) the listeners
|
|
80
|
+
* the value is overriden server-side (e.g. in an `updateHook`) the listeners
|
|
96
81
|
* will be called again on when the "real" / final value will be received.
|
|
97
82
|
* @property {Object} [metas={}] - Optionnal metadata of the parameter.
|
|
98
83
|
*/
|
|
99
|
-
|
|
100
84
|
/**
|
|
101
85
|
@typedef {Object} server.SharedStateManagerServer~schemaIntegerDef
|
|
102
86
|
*
|
|
@@ -116,15 +100,14 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
116
100
|
* (which has no state per se). As such, setting this options to `false` if
|
|
117
101
|
* `event=true` does not make sens.
|
|
118
102
|
* @property {Boolean} [immediate=false] - Setting this option to `true` will
|
|
119
|
-
* trigger any change (e.g. call the
|
|
103
|
+
* trigger any change (e.g. call the `onUpdate` listeners) immediately on the
|
|
120
104
|
* state that generate the update (i.e. calling `set`), before propagating the
|
|
121
105
|
* change on the network. This option can be usefull in cases the network
|
|
122
106
|
* would introduce a noticeable latency on the client. If for some reason
|
|
123
|
-
* the value is overriden server-side (e.g. in an updateHook) the listeners
|
|
107
|
+
* the value is overriden server-side (e.g. in an `updateHook`) the listeners
|
|
124
108
|
* will be called again on when the "real" / final value will be received.
|
|
125
109
|
* @property {Object} [metas={}] - Optionnal metadata of the parameter.
|
|
126
110
|
*/
|
|
127
|
-
|
|
128
111
|
/**
|
|
129
112
|
* @typedef {Object} server.SharedStateManagerServer~schemaFloatDef
|
|
130
113
|
*
|
|
@@ -144,15 +127,14 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
144
127
|
* (which has no state per se). As such, setting this options to `false` if
|
|
145
128
|
* `event=true` does not make sens.
|
|
146
129
|
* @property {Boolean} [immediate=false] - Setting this option to `true` will
|
|
147
|
-
* trigger any change (e.g. call the
|
|
130
|
+
* trigger any change (e.g. call the `onUpdate` listeners) immediately on the
|
|
148
131
|
* state that generate the update (i.e. calling `set`), before propagating the
|
|
149
132
|
* change on the network. This option can be usefull in cases the network
|
|
150
133
|
* would introduce a noticeable latency on the client. If for some reason
|
|
151
|
-
* the value is overriden server-side (e.g. in an updateHook) the listeners
|
|
134
|
+
* the value is overriden server-side (e.g. in an `updateHook`) the listeners
|
|
152
135
|
* will be called again on when the "real" / final value will be received.
|
|
153
136
|
* @property {Object} [metas={}] - Optionnal metadata of the parameter.
|
|
154
137
|
*/
|
|
155
|
-
|
|
156
138
|
/**
|
|
157
139
|
* @typedef {Object} server.SharedStateManagerServer~schemaEnumDef
|
|
158
140
|
*
|
|
@@ -171,15 +153,14 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
171
153
|
* (which has no state per se). As such, setting this options to `false` if
|
|
172
154
|
* `event=true` does not make sens.
|
|
173
155
|
* @property {Boolean} [immediate=false] - Setting this option to `true` will
|
|
174
|
-
* trigger any change (e.g. call the
|
|
156
|
+
* trigger any change (e.g. call the `onUpdate` listeners) immediately on the
|
|
175
157
|
* state that generate the update (i.e. calling `set`), before propagating the
|
|
176
158
|
* change on the network. This option can be usefull in cases the network
|
|
177
159
|
* would introduce a noticeable latency on the client. If for some reason
|
|
178
|
-
* the value is overriden server-side (e.g. in an updateHook) the listeners
|
|
160
|
+
* the value is overriden server-side (e.g. in an `updateHook`) the listeners
|
|
179
161
|
* will be called again on when the "real" / final value will be received.
|
|
180
162
|
* @property {Object} [metas={}] - Optionnal metadata of the parameter.
|
|
181
163
|
*/
|
|
182
|
-
|
|
183
164
|
/**
|
|
184
165
|
* @typedef {Object} server.SharedStateManagerServer~schemaAnyDef
|
|
185
166
|
*
|
|
@@ -200,65 +181,59 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
200
181
|
* (which has no state per se). As such, setting this options to `false` if
|
|
201
182
|
* `event=true` does not make sens.
|
|
202
183
|
* @property {Boolean} [immediate=false] - Setting this option to `true` will
|
|
203
|
-
* trigger any change (e.g. call the
|
|
184
|
+
* trigger any change (e.g. call the `onUpdate` listeners) immediately on the
|
|
204
185
|
* state that generate the update (i.e. calling `set`), before propagating the
|
|
205
186
|
* change on the network. This option can be usefull in cases the network
|
|
206
187
|
* would introduce a noticeable latency on the client. If for some reason
|
|
207
|
-
* the value is overriden server-side (e.g. in an updateHook) the listeners
|
|
188
|
+
* the value is overriden server-side (e.g. in an `updateHook`) the listeners
|
|
208
189
|
* will be called again on when the "real" / final value will be received.
|
|
209
190
|
* @property {Object} [metas={}] - Optionnal metadata of the parameter.
|
|
210
191
|
*/
|
|
211
|
-
|
|
192
|
+
|
|
193
|
+
export const sharedOptions = {
|
|
212
194
|
nullable: false,
|
|
213
|
-
event: false,
|
|
214
|
-
// if event=true, nullable=true
|
|
195
|
+
event: false, // if event=true, nullable=true
|
|
215
196
|
metas: {},
|
|
216
197
|
filterChange: true,
|
|
217
|
-
immediate: false
|
|
198
|
+
immediate: false,
|
|
218
199
|
};
|
|
219
|
-
|
|
220
|
-
const types = {
|
|
200
|
+
|
|
201
|
+
export const types = {
|
|
221
202
|
boolean: {
|
|
222
203
|
required: ['default'],
|
|
223
|
-
|
|
224
204
|
get defaultOptions() {
|
|
225
|
-
return Object.assign((
|
|
205
|
+
return Object.assign(cloneDeep(sharedOptions), {});
|
|
226
206
|
},
|
|
227
|
-
|
|
228
207
|
coerceFunction: (name, def, value) => {
|
|
229
208
|
if (typeof value !== 'boolean') {
|
|
230
209
|
throw new TypeError(`[stateManager] Invalid value for boolean param "${name}": ${value}`);
|
|
231
210
|
}
|
|
232
211
|
|
|
233
212
|
return value;
|
|
234
|
-
}
|
|
213
|
+
},
|
|
235
214
|
},
|
|
236
215
|
string: {
|
|
237
216
|
required: ['default'],
|
|
238
|
-
|
|
239
217
|
get defaultOptions() {
|
|
240
|
-
return Object.assign((
|
|
218
|
+
return Object.assign(cloneDeep(sharedOptions), {});
|
|
241
219
|
},
|
|
242
|
-
|
|
243
220
|
coerceFunction: (name, def, value) => {
|
|
244
221
|
if (typeof value !== 'string') {
|
|
245
222
|
throw new TypeError(`[stateManager] Invalid value for string param "${name}": ${value}`);
|
|
246
223
|
}
|
|
247
224
|
|
|
248
225
|
return value;
|
|
249
|
-
}
|
|
226
|
+
},
|
|
250
227
|
},
|
|
251
228
|
integer: {
|
|
252
229
|
required: ['default'],
|
|
253
|
-
|
|
254
230
|
get defaultOptions() {
|
|
255
|
-
return Object.assign((
|
|
231
|
+
return Object.assign(cloneDeep(sharedOptions), {
|
|
256
232
|
min: -Infinity,
|
|
257
|
-
max: +Infinity
|
|
233
|
+
max: +Infinity,
|
|
258
234
|
});
|
|
259
235
|
},
|
|
260
|
-
|
|
261
|
-
sanitizeSchema: def => {
|
|
236
|
+
sanitizeSchema: (def) => {
|
|
262
237
|
// sanitize `null` values in received schema, this prevent a bug when
|
|
263
238
|
// `min` and `max` are explicitely set to `±Infinity`, the schema is stringified
|
|
264
239
|
// when sent over the network and therefore Infinity is transformed to `null`
|
|
@@ -281,19 +256,17 @@ const types = {
|
|
|
281
256
|
}
|
|
282
257
|
|
|
283
258
|
return Math.max(def.min, Math.min(def.max, value));
|
|
284
|
-
}
|
|
259
|
+
},
|
|
285
260
|
},
|
|
286
261
|
float: {
|
|
287
262
|
required: ['default'],
|
|
288
|
-
|
|
289
263
|
get defaultOptions() {
|
|
290
|
-
return Object.assign((
|
|
264
|
+
return Object.assign(cloneDeep(sharedOptions), {
|
|
291
265
|
min: -Infinity,
|
|
292
|
-
max: +Infinity
|
|
266
|
+
max: +Infinity,
|
|
293
267
|
});
|
|
294
268
|
},
|
|
295
|
-
|
|
296
|
-
sanitizeSchema: def => {
|
|
269
|
+
sanitizeSchema: (def) => {
|
|
297
270
|
// sanitize `null` values in received schema, this prevent a bug when
|
|
298
271
|
// `min` and `max` are explicitely set to `±Infinity`, the schema is stringified
|
|
299
272
|
// when sent over the network and therefore Infinity is transformed to `null`
|
|
@@ -311,66 +284,63 @@ const types = {
|
|
|
311
284
|
return def;
|
|
312
285
|
},
|
|
313
286
|
coerceFunction: (name, def, value) => {
|
|
314
|
-
if (typeof value !== 'number' || value !== value) {
|
|
315
|
-
// reject NaN
|
|
287
|
+
if (typeof value !== 'number' || value !== value) { // reject NaN
|
|
316
288
|
throw new TypeError(`[stateManager] Invalid value for float param "${name}": ${value}`);
|
|
317
289
|
}
|
|
318
290
|
|
|
319
291
|
return Math.max(def.min, Math.min(def.max, value));
|
|
320
|
-
}
|
|
292
|
+
},
|
|
321
293
|
},
|
|
322
294
|
enum: {
|
|
323
295
|
required: ['default', 'list'],
|
|
324
|
-
|
|
325
296
|
get defaultOptions() {
|
|
326
|
-
return Object.assign((
|
|
297
|
+
return Object.assign(cloneDeep(sharedOptions), {});
|
|
327
298
|
},
|
|
328
|
-
|
|
329
299
|
coerceFunction: (name, def, value) => {
|
|
330
300
|
if (def.list.indexOf(value) === -1) {
|
|
331
301
|
throw new TypeError(`[stateManager] Invalid value for enum param "${name}": ${value}`);
|
|
332
302
|
}
|
|
333
303
|
|
|
304
|
+
|
|
334
305
|
return value;
|
|
335
|
-
}
|
|
306
|
+
},
|
|
336
307
|
},
|
|
337
308
|
any: {
|
|
338
309
|
required: ['default'],
|
|
339
|
-
|
|
340
310
|
get defaultOptions() {
|
|
341
|
-
return Object.assign((
|
|
311
|
+
return Object.assign(cloneDeep(sharedOptions), {});
|
|
342
312
|
},
|
|
343
|
-
|
|
344
313
|
coerceFunction: (name, def, value) => {
|
|
345
314
|
// no check as it can have any type...
|
|
346
315
|
return value;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
316
|
+
},
|
|
317
|
+
},
|
|
349
318
|
};
|
|
319
|
+
|
|
320
|
+
|
|
350
321
|
/**
|
|
351
322
|
* Bag of parameters.
|
|
352
323
|
* @private
|
|
353
324
|
*/
|
|
354
|
-
|
|
355
|
-
exports.types = types;
|
|
356
|
-
|
|
357
325
|
class ParameterBag {
|
|
358
326
|
static validateSchema(schema) {
|
|
359
327
|
for (let name in schema) {
|
|
360
328
|
const def = schema[name];
|
|
361
329
|
|
|
362
|
-
if (!
|
|
330
|
+
if (!Object.prototype.hasOwnProperty.call(def, 'type')) {
|
|
363
331
|
throw new TypeError(`[stateManager] Invalid schema definition - param "${name}": "type" key is required`);
|
|
364
332
|
}
|
|
365
333
|
|
|
366
|
-
if (!
|
|
334
|
+
if (!Object.prototype.hasOwnProperty.call(types, def.type)) {
|
|
367
335
|
throw new TypeError(`[stateManager] Invalid schema definition - param "${name}": "{ type: '${def.type}' }" does not exists`);
|
|
368
336
|
}
|
|
369
337
|
|
|
370
338
|
const required = types[def.type].required;
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
339
|
+
|
|
340
|
+
required.forEach(key => {
|
|
341
|
+
if (def.event === true && key === 'default') {
|
|
342
|
+
// do nothing, default is always null for `event` params
|
|
343
|
+
} else if (!Object.prototype.hasOwnProperty.call(def, key)) {
|
|
374
344
|
throw new TypeError(`[stateManager] Invalid schema definition - param "${name}" (type "${def.type}"): "${key}" key is required`);
|
|
375
345
|
}
|
|
376
346
|
});
|
|
@@ -382,8 +352,9 @@ class ParameterBag {
|
|
|
382
352
|
throw new Error(`[stateManager] schema is mandatory`);
|
|
383
353
|
}
|
|
384
354
|
|
|
385
|
-
schema = (
|
|
386
|
-
initValues = (
|
|
355
|
+
schema = cloneDeep(schema);
|
|
356
|
+
initValues = cloneDeep(initValues);
|
|
357
|
+
|
|
387
358
|
/**
|
|
388
359
|
* List of parameters.
|
|
389
360
|
*
|
|
@@ -393,8 +364,8 @@ class ParameterBag {
|
|
|
393
364
|
* @instance
|
|
394
365
|
* @private
|
|
395
366
|
*/
|
|
396
|
-
|
|
397
367
|
this._values = {};
|
|
368
|
+
|
|
398
369
|
/**
|
|
399
370
|
* List of schema with init values.
|
|
400
371
|
*
|
|
@@ -404,29 +375,26 @@ class ParameterBag {
|
|
|
404
375
|
* @instance
|
|
405
376
|
* @private
|
|
406
377
|
*/
|
|
407
|
-
|
|
408
378
|
this._schema = {};
|
|
409
|
-
ParameterBag.validateSchema(schema); // make shure initValues make sens according to the given schema
|
|
410
379
|
|
|
380
|
+
ParameterBag.validateSchema(schema);
|
|
381
|
+
|
|
382
|
+
// make shure initValues make sens according to the given schema
|
|
411
383
|
for (let name in initValues) {
|
|
412
|
-
if (!
|
|
384
|
+
if (!Object.prototype.hasOwnProperty.call(schema, name)) {
|
|
413
385
|
throw new ReferenceError(`[stateManager] init value defined for undefined param "${name}"`);
|
|
414
386
|
}
|
|
415
387
|
}
|
|
416
388
|
|
|
417
389
|
for (let [name, def] of Object.entries(schema)) {
|
|
418
|
-
const {
|
|
419
|
-
defaultOptions,
|
|
420
|
-
coerceFunction
|
|
421
|
-
} = types[def.type];
|
|
422
|
-
|
|
423
390
|
if (types[def.type].sanitizeSchema) {
|
|
424
391
|
def = types[def.type].sanitizeSchema(def);
|
|
425
392
|
}
|
|
426
393
|
|
|
427
|
-
|
|
394
|
+
const { defaultOptions } = types[def.type];
|
|
395
|
+
def = Object.assign({}, defaultOptions, def);
|
|
396
|
+
// if event property is set to true, the param must
|
|
428
397
|
// be nullable and its default value is `undefined`
|
|
429
|
-
|
|
430
398
|
if (def.event === true) {
|
|
431
399
|
def.nullable = true;
|
|
432
400
|
def.default = null;
|
|
@@ -434,37 +402,38 @@ class ParameterBag {
|
|
|
434
402
|
|
|
435
403
|
let initValue;
|
|
436
404
|
|
|
437
|
-
if (
|
|
405
|
+
if (Object.prototype.hasOwnProperty.call(initValues, name)) {
|
|
438
406
|
initValue = initValues[name];
|
|
439
407
|
} else {
|
|
440
408
|
initValue = def.default;
|
|
441
409
|
}
|
|
442
410
|
|
|
443
|
-
this._schema[name] = def; // coerce init value and store in definition
|
|
444
411
|
|
|
412
|
+
this._schema[name] = def;
|
|
413
|
+
// coerce init value and store in definition
|
|
445
414
|
initValue = this.set(name, initValue)[0];
|
|
415
|
+
|
|
446
416
|
this._schema[name].initValue = initValue;
|
|
447
417
|
this._values[name] = initValue;
|
|
418
|
+
|
|
448
419
|
}
|
|
449
420
|
}
|
|
421
|
+
|
|
450
422
|
/**
|
|
451
423
|
* Define if the parameter exists.
|
|
452
424
|
*
|
|
453
425
|
* @param {String} name - Name of the parameter.
|
|
454
426
|
* @return {Boolean}
|
|
455
427
|
*/
|
|
456
|
-
|
|
457
|
-
|
|
458
428
|
has(name) {
|
|
459
|
-
return
|
|
429
|
+
return Object.prototype.hasOwnProperty.call(this._schema, name);
|
|
460
430
|
}
|
|
431
|
+
|
|
461
432
|
/**
|
|
462
433
|
* Return values of all parameters as a flat object.
|
|
463
434
|
*
|
|
464
435
|
* @return {Object}
|
|
465
436
|
*/
|
|
466
|
-
|
|
467
|
-
|
|
468
437
|
getValues() {
|
|
469
438
|
let values = {};
|
|
470
439
|
|
|
@@ -474,6 +443,7 @@ class ParameterBag {
|
|
|
474
443
|
|
|
475
444
|
return values;
|
|
476
445
|
}
|
|
446
|
+
|
|
477
447
|
/**
|
|
478
448
|
* Return the value of the given parameter. If the parameter is of `any` type,
|
|
479
449
|
* a deep copy is returned.
|
|
@@ -481,19 +451,18 @@ class ParameterBag {
|
|
|
481
451
|
* @param {String} name - Name of the parameter.
|
|
482
452
|
* @return {Mixed} - Value of the parameter.
|
|
483
453
|
*/
|
|
484
|
-
|
|
485
|
-
|
|
486
454
|
get(name) {
|
|
487
455
|
if (!this.has(name)) {
|
|
488
456
|
throw new ReferenceError(`[stateManager] Cannot get value of undefined parameter "${name}"`);
|
|
489
457
|
}
|
|
490
458
|
|
|
491
459
|
if (this._schema[name].type === 'any') {
|
|
492
|
-
return (
|
|
460
|
+
return cloneDeep(this._values[name]);
|
|
493
461
|
} else {
|
|
494
462
|
return this._values[name];
|
|
495
463
|
}
|
|
496
464
|
}
|
|
465
|
+
|
|
497
466
|
/**
|
|
498
467
|
* Set the value of a parameter. If the value of the parameter is updated
|
|
499
468
|
* (aka if previous value is different from new value) all registered
|
|
@@ -505,32 +474,31 @@ class ParameterBag {
|
|
|
505
474
|
* if the value has not changed.
|
|
506
475
|
* @return {Array} - [new value, updated flag].
|
|
507
476
|
*/
|
|
508
|
-
|
|
509
|
-
|
|
510
477
|
set(name, value) {
|
|
511
478
|
if (!this.has(name)) {
|
|
512
479
|
throw new ReferenceError(`[stateManager] Cannot set value of undefined parameter "${name}"`);
|
|
513
480
|
}
|
|
514
481
|
|
|
515
482
|
const def = this._schema[name];
|
|
516
|
-
const {
|
|
517
|
-
coerceFunction
|
|
518
|
-
} = types[def.type];
|
|
483
|
+
const { coerceFunction } = types[def.type];
|
|
519
484
|
|
|
520
485
|
if (value === null && def.nullable === false) {
|
|
521
486
|
throw new TypeError(`[stateManager] Invalid value for ${def.type} param "${name}": value is null and param is not nullable`);
|
|
522
487
|
} else if (value === null && def.nullable === true) {
|
|
523
|
-
value =
|
|
488
|
+
value = null;
|
|
524
489
|
} else {
|
|
525
490
|
value = coerceFunction(name, def, value);
|
|
526
491
|
}
|
|
527
492
|
|
|
528
493
|
const currentValue = this._values[name];
|
|
529
|
-
const updated = !(
|
|
530
|
-
|
|
494
|
+
const updated = !equal(currentValue, value);
|
|
495
|
+
|
|
496
|
+
this._values[name] = value;
|
|
531
497
|
|
|
498
|
+
// return tuple so that the state manager can handle the `filterChange` option
|
|
532
499
|
return [value, updated];
|
|
533
500
|
}
|
|
501
|
+
|
|
534
502
|
/**
|
|
535
503
|
* Reset a parameter to its initialization values. Reset all parameters if no argument.
|
|
536
504
|
* @note - prefer `state.set(state.getInitValues())`
|
|
@@ -553,8 +521,6 @@ class ParameterBag {
|
|
|
553
521
|
*
|
|
554
522
|
* @return {Object}
|
|
555
523
|
*/
|
|
556
|
-
|
|
557
|
-
|
|
558
524
|
getSchema(name = null) {
|
|
559
525
|
if (name === null) {
|
|
560
526
|
return this._schema;
|
|
@@ -565,31 +531,25 @@ class ParameterBag {
|
|
|
565
531
|
|
|
566
532
|
return this._schema[name];
|
|
567
533
|
}
|
|
568
|
-
}
|
|
569
|
-
|
|
534
|
+
}
|
|
570
535
|
|
|
536
|
+
// return the default value, if initValue has been given, return init values
|
|
571
537
|
getInitValues() {
|
|
572
538
|
const initValues = {};
|
|
573
|
-
|
|
574
539
|
for (let [name, def] of Object.entries(this._schema)) {
|
|
575
540
|
initValues[name] = def.initValue;
|
|
576
541
|
}
|
|
577
|
-
|
|
578
542
|
return initValues;
|
|
579
|
-
}
|
|
580
|
-
|
|
543
|
+
}
|
|
581
544
|
|
|
545
|
+
// return the default value, if initValue has been given, return init values
|
|
582
546
|
getDefaults() {
|
|
583
547
|
const defaults = {};
|
|
584
|
-
|
|
585
548
|
for (let [name, def] of Object.entries(this._schema)) {
|
|
586
549
|
defaults[name] = def.defaults;
|
|
587
550
|
}
|
|
588
|
-
|
|
589
551
|
return defaults;
|
|
590
552
|
}
|
|
591
|
-
|
|
592
553
|
}
|
|
593
554
|
|
|
594
|
-
|
|
595
|
-
exports.default = _default;
|
|
555
|
+
export default ParameterBag;
|