@monterosa/sdk-lvis 0.18.8 → 0.18.10
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/dist/index.cjs.js +1 -1
- package/dist/index.esm2017.js +204 -781
- package/dist/index.esm2017.js.map +1 -1
- package/dist/index.esm5.js +355 -1036
- package/dist/index.esm5.js.map +1 -1
- package/package.json +4 -4
package/dist/index.esm2017.js
CHANGED
|
@@ -13,7 +13,7 @@ import Cookie from 'js-cookie';
|
|
|
13
13
|
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
|
|
14
14
|
import _regeneratorRuntime from '@babel/runtime/regenerator';
|
|
15
15
|
|
|
16
|
-
var version = "0.18.
|
|
16
|
+
var version = "0.18.10";
|
|
17
17
|
|
|
18
18
|
var LViSDate = new Emitter();
|
|
19
19
|
LViSDate.trigger = LViSDate.emit;
|
|
@@ -24,11 +24,8 @@ LViSDate.ON_NEXT = 'next';
|
|
|
24
24
|
var serverTimestamp;
|
|
25
25
|
var lastTickTimestamp;
|
|
26
26
|
var tickTimeoutId = null;
|
|
27
|
-
|
|
28
27
|
var getCurrentTimestamp = () => Date.now() / 1000;
|
|
29
|
-
|
|
30
28
|
var getMiddleTimestamp = timestamp => Math.floor(timestamp) + 0.5;
|
|
31
|
-
|
|
32
29
|
var tick = () => {
|
|
33
30
|
clearTimeout(tickTimeoutId);
|
|
34
31
|
var currentTimestamp = getCurrentTimestamp();
|
|
@@ -40,14 +37,11 @@ var tick = () => {
|
|
|
40
37
|
tickTimeoutId = setTimeout(tick, delay);
|
|
41
38
|
LViSDate.trigger(LViSDate.ON_TICK, serverTimestamp);
|
|
42
39
|
};
|
|
43
|
-
|
|
44
40
|
LViSDate.setTime = time => {
|
|
45
41
|
lastTickTimestamp = getCurrentTimestamp();
|
|
46
42
|
serverTimestamp = getMiddleTimestamp(time);
|
|
47
43
|
};
|
|
48
|
-
|
|
49
44
|
LViSDate.now = () => Math.floor(serverTimestamp);
|
|
50
|
-
|
|
51
45
|
LViSDate.setTime(getCurrentTimestamp());
|
|
52
46
|
tick();
|
|
53
47
|
|
|
@@ -61,127 +55,102 @@ var Sync = (() => {
|
|
|
61
55
|
var defaultDelay;
|
|
62
56
|
var maxDelay;
|
|
63
57
|
var Event;
|
|
64
|
-
|
|
65
58
|
var setDelay = (value, force) => {
|
|
66
59
|
var max = Number.MAX_SAFE_INTEGER || 9007199254740991;
|
|
67
|
-
|
|
68
60
|
if (value > max) {
|
|
69
61
|
console.warn("User delay can't be greater than ".concat(max, " seconds"));
|
|
70
62
|
return;
|
|
71
63
|
}
|
|
72
|
-
|
|
73
64
|
if (value < 0) {
|
|
74
65
|
value = 0;
|
|
75
66
|
}
|
|
76
|
-
|
|
77
67
|
if (value > maxDelay) {
|
|
78
68
|
value = maxDelay;
|
|
79
69
|
}
|
|
80
|
-
|
|
81
70
|
if (force || value !== delay) {
|
|
82
71
|
delay = value;
|
|
83
72
|
self.trigger(self.ON_DELAY_CHANGE, delay);
|
|
84
73
|
}
|
|
85
74
|
};
|
|
86
|
-
|
|
87
75
|
self._resetSettings = () => {
|
|
88
76
|
delay = null;
|
|
89
77
|
defaultDelay = 0;
|
|
90
78
|
maxDelay = Number.MAX_SAFE_INTEGER || 9007199254740991;
|
|
91
79
|
};
|
|
92
|
-
|
|
93
80
|
self.setMaxDelay = value => {
|
|
94
81
|
value = parseInt(value, 10);
|
|
95
|
-
|
|
96
82
|
if (value >= 0) {
|
|
97
83
|
maxDelay = value;
|
|
98
84
|
}
|
|
99
85
|
};
|
|
100
|
-
|
|
101
86
|
self.setDefaultDelay = value => {
|
|
102
87
|
value = parseInt(value, 10);
|
|
103
|
-
|
|
104
88
|
if (value > maxDelay) {
|
|
105
89
|
defaultDelay = maxDelay;
|
|
106
90
|
} else if (value > 0 && value <= maxDelay) {
|
|
107
91
|
defaultDelay = value;
|
|
108
92
|
}
|
|
109
93
|
};
|
|
110
|
-
|
|
111
94
|
self.setDelay = function () {
|
|
112
95
|
var value;
|
|
113
|
-
|
|
114
96
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
115
97
|
args[_key] = arguments[_key];
|
|
116
98
|
}
|
|
117
|
-
|
|
118
99
|
var force = [...args].pop();
|
|
119
100
|
force = typeof force === 'boolean' ? force : false;
|
|
120
|
-
|
|
121
101
|
switch (args[0].constructor) {
|
|
122
102
|
// (<LViS.Event> event, <Integer> timecode, [<Boolen> force = true]);
|
|
123
103
|
case Event:
|
|
124
104
|
{
|
|
125
105
|
var event = args[0],
|
|
126
|
-
|
|
106
|
+
timecode = args[1];
|
|
127
107
|
value = LViSDate.now() - event.getOriginalStartAt() - timecode;
|
|
128
108
|
break;
|
|
129
109
|
}
|
|
130
|
-
// (<Date> time, [<Boolen> force = true]);
|
|
131
110
|
|
|
111
|
+
// (<Date> time, [<Boolen> force = true]);
|
|
132
112
|
case Date:
|
|
133
113
|
{
|
|
134
114
|
var time = args[0];
|
|
135
115
|
value = LViSDate.now() - Math.floor(time.getTime() / 1000);
|
|
136
116
|
break;
|
|
137
117
|
}
|
|
138
|
-
// (<Integer> delay, [<Boolen> force = true]);
|
|
139
118
|
|
|
119
|
+
// (<Integer> delay, [<Boolen> force = true]);
|
|
140
120
|
case Number:
|
|
141
121
|
{
|
|
142
122
|
value = args[0];
|
|
143
|
-
|
|
144
123
|
if (parseInt(value, 10) !== value) {
|
|
145
124
|
console.warn('User delay must be an integer');
|
|
146
125
|
return;
|
|
147
126
|
}
|
|
148
|
-
|
|
149
127
|
break;
|
|
150
128
|
}
|
|
151
|
-
|
|
152
129
|
default:
|
|
153
130
|
console.warn('Unknown interface of setDelay() method');
|
|
154
131
|
return;
|
|
155
132
|
}
|
|
156
|
-
|
|
157
133
|
setDelay(value, force);
|
|
158
134
|
};
|
|
159
|
-
|
|
160
135
|
self.getMaxDelay = () => maxDelay;
|
|
161
|
-
|
|
162
136
|
self.getDelay = () => {
|
|
163
137
|
if (delay !== null) {
|
|
164
138
|
return delay;
|
|
165
139
|
}
|
|
166
|
-
|
|
167
140
|
return defaultDelay;
|
|
168
141
|
};
|
|
169
|
-
|
|
170
142
|
self._resetSettings();
|
|
171
|
-
|
|
172
143
|
self.init = config => {
|
|
173
144
|
// used to avoid cycle dependency:
|
|
174
145
|
// Event -> ConnectionAdaptor -> Sync -> Event
|
|
175
146
|
Event = config.Event;
|
|
176
147
|
};
|
|
177
|
-
|
|
178
148
|
return self;
|
|
179
149
|
})();
|
|
180
150
|
|
|
181
151
|
/* eslint @typescript-eslint/indent: "off" */
|
|
182
152
|
var regularQueue = [];
|
|
183
153
|
var priorityQueue = [];
|
|
184
|
-
|
|
185
154
|
var add = queue => function (func) {
|
|
186
155
|
var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
187
156
|
return queue.push({
|
|
@@ -189,13 +158,11 @@ var add = queue => function (func) {
|
|
|
189
158
|
context
|
|
190
159
|
});
|
|
191
160
|
};
|
|
192
|
-
|
|
193
161
|
var execute = function execute() {
|
|
194
162
|
var queue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
195
163
|
return () => {
|
|
196
164
|
var item;
|
|
197
165
|
var total = queue.length;
|
|
198
|
-
|
|
199
166
|
while (total > 0) {
|
|
200
167
|
item = queue.shift();
|
|
201
168
|
item.func.apply(item.context);
|
|
@@ -203,20 +170,16 @@ var execute = function execute() {
|
|
|
203
170
|
}
|
|
204
171
|
};
|
|
205
172
|
};
|
|
206
|
-
|
|
207
173
|
var force = () => {
|
|
208
174
|
executePriority();
|
|
209
175
|
executeRegular();
|
|
210
176
|
};
|
|
211
|
-
|
|
212
177
|
var handleDateTick = () => {
|
|
213
178
|
force();
|
|
214
179
|
};
|
|
215
|
-
|
|
216
180
|
var handleDateNext = func => {
|
|
217
181
|
nextRegular(func);
|
|
218
182
|
};
|
|
219
|
-
|
|
220
183
|
var nextRegular = add(regularQueue);
|
|
221
184
|
var nextPriority = add(priorityQueue);
|
|
222
185
|
var executeRegular = execute(regularQueue);
|
|
@@ -235,10 +198,12 @@ var ConnectionAdaptor = (() => {
|
|
|
235
198
|
/*
|
|
236
199
|
* Link to the current scope
|
|
237
200
|
*/
|
|
201
|
+
|
|
238
202
|
var self = new Emitter();
|
|
239
203
|
self.trigger = self.emit;
|
|
240
204
|
self.bind = self.on;
|
|
241
205
|
self.unbind = self.off;
|
|
206
|
+
|
|
242
207
|
/*
|
|
243
208
|
* Constants
|
|
244
209
|
*/
|
|
@@ -246,6 +211,7 @@ var ConnectionAdaptor = (() => {
|
|
|
246
211
|
self.ON_EOC = Enmasse.ON_EOC;
|
|
247
212
|
self.ON_MESSAGE = Enmasse.ON_MESSAGE;
|
|
248
213
|
self.ON_SETTINGS = 'settings';
|
|
214
|
+
|
|
249
215
|
/*
|
|
250
216
|
* Private variable
|
|
251
217
|
*/
|
|
@@ -253,87 +219,71 @@ var ConnectionAdaptor = (() => {
|
|
|
253
219
|
var queue = [];
|
|
254
220
|
var EOCs = {};
|
|
255
221
|
var processIsInThePriorityQueue = false;
|
|
256
|
-
|
|
257
222
|
var handleMessage = message => {
|
|
258
223
|
deduplicate(message);
|
|
259
224
|
queue.push(message);
|
|
260
225
|
Run.nextPriority(() => process());
|
|
261
226
|
Run.force();
|
|
262
227
|
};
|
|
263
|
-
|
|
264
228
|
var handleDelayChange = () => {
|
|
265
229
|
clearQueue();
|
|
266
230
|
};
|
|
267
|
-
|
|
268
231
|
var handleState = state => {
|
|
269
232
|
switch (state) {
|
|
270
233
|
case Enmasse.STATE_DISCONNECTED:
|
|
271
234
|
clearEOCs();
|
|
272
235
|
break;
|
|
273
|
-
|
|
274
236
|
case Enmasse.STATE_CONNECTED:
|
|
275
237
|
break;
|
|
276
|
-
|
|
277
238
|
case Enmasse.STATE_CONNECTING:
|
|
278
239
|
break;
|
|
279
240
|
}
|
|
280
241
|
};
|
|
281
|
-
|
|
282
242
|
var handleEOC = channel => {
|
|
283
243
|
EOCs[channel] = true;
|
|
284
244
|
self.trigger(self.ON_EOC, channel);
|
|
285
245
|
Run.nextPriority(() => process());
|
|
286
246
|
Run.force();
|
|
287
247
|
};
|
|
288
|
-
|
|
289
248
|
var deduplicate = message => {
|
|
290
249
|
if (message.klass !== 'create') {
|
|
291
250
|
return;
|
|
292
251
|
}
|
|
293
|
-
|
|
294
252
|
var id;
|
|
295
|
-
|
|
296
253
|
try {
|
|
297
254
|
id = JSON.parse(message.body[0]).id;
|
|
298
255
|
} catch (e) {
|
|
299
256
|
return;
|
|
300
257
|
}
|
|
301
|
-
|
|
302
258
|
var itemId = null;
|
|
303
|
-
|
|
304
259
|
for (var idx = 0; idx < queue.length; idx++) {
|
|
305
260
|
try {
|
|
306
261
|
itemId = JSON.parse(queue[idx].body[0]).id;
|
|
307
262
|
} catch (e) {
|
|
308
263
|
continue;
|
|
309
264
|
}
|
|
310
|
-
|
|
311
265
|
if (itemId === id) {
|
|
312
266
|
queue.splice(idx, 1);
|
|
313
267
|
break;
|
|
314
268
|
}
|
|
315
269
|
}
|
|
316
270
|
};
|
|
317
|
-
|
|
318
271
|
var process = () => {
|
|
319
272
|
var idx = 0;
|
|
320
273
|
var message;
|
|
321
|
-
|
|
322
274
|
while (idx < queue.length) {
|
|
323
275
|
if (canAdapt(queue[idx])) {
|
|
324
276
|
var _queue$splice = queue.splice(idx, 1);
|
|
325
|
-
|
|
326
277
|
var _queue$splice2 = _slicedToArray(_queue$splice, 1);
|
|
327
|
-
|
|
328
278
|
message = _queue$splice2[0];
|
|
329
279
|
adaptMessage(message);
|
|
330
280
|
self.trigger(self.ON_MESSAGE, message);
|
|
331
281
|
} else {
|
|
332
282
|
idx++;
|
|
333
283
|
}
|
|
334
|
-
}
|
|
335
|
-
|
|
284
|
+
}
|
|
336
285
|
|
|
286
|
+
// if there are still left message in queue
|
|
337
287
|
if (queue.length > 0 && !processIsInThePriorityQueue) {
|
|
338
288
|
processIsInThePriorityQueue = true;
|
|
339
289
|
Run.nextPriority(() => {
|
|
@@ -342,74 +292,56 @@ var ConnectionAdaptor = (() => {
|
|
|
342
292
|
});
|
|
343
293
|
}
|
|
344
294
|
};
|
|
345
|
-
|
|
346
295
|
var canAdapt = message => {
|
|
347
296
|
var checker = (() => {
|
|
348
297
|
switch (message.klass) {
|
|
349
298
|
case 'create':
|
|
350
299
|
return canAdaptCreate;
|
|
351
|
-
|
|
352
300
|
case 'reveal':
|
|
353
301
|
return canAdaptReveal;
|
|
354
|
-
|
|
355
302
|
case 'revoke':
|
|
356
303
|
return canAdaptRevoke;
|
|
357
|
-
|
|
358
304
|
case 'stop':
|
|
359
305
|
return canAdaptStop;
|
|
360
|
-
|
|
361
306
|
case 'p':
|
|
362
307
|
return canAdaptPoll;
|
|
363
|
-
|
|
364
308
|
case 'subscounter':
|
|
365
309
|
return canAdaptSubsCounter;
|
|
366
|
-
|
|
367
310
|
default:
|
|
368
311
|
return canAdaptOther;
|
|
369
312
|
}
|
|
370
313
|
})();
|
|
371
|
-
|
|
372
314
|
return checker(message);
|
|
373
315
|
};
|
|
374
|
-
|
|
375
316
|
var canAdaptCreate = message => {
|
|
376
317
|
var data;
|
|
377
|
-
|
|
378
318
|
try {
|
|
379
319
|
data = JSON.parse(message.body[0]);
|
|
380
320
|
} catch (e) {
|
|
381
321
|
return false;
|
|
382
322
|
}
|
|
383
|
-
|
|
384
323
|
return canAdaptGeneric(message.channel, data.published_at);
|
|
385
324
|
};
|
|
386
|
-
|
|
387
325
|
var canAdaptReveal = message => canAdaptGeneric(message.channel, parseInt(message.body[2], 10));
|
|
388
|
-
|
|
389
326
|
var canAdaptRevoke = message => {
|
|
390
327
|
var data;
|
|
391
|
-
|
|
392
328
|
try {
|
|
393
329
|
data = JSON.parse(message.body[0]);
|
|
394
330
|
} catch (e) {
|
|
395
331
|
return false;
|
|
396
332
|
}
|
|
397
|
-
|
|
398
333
|
return canAdaptGeneric(message.channel, data.sent_at);
|
|
399
334
|
};
|
|
400
|
-
|
|
401
335
|
var canAdaptStop = message => canAdaptGeneric(message.channel, parseInt(message.body[1], 10));
|
|
402
|
-
|
|
403
336
|
var canAdaptPoll = message => canAdaptGeneric(message.channel, parseInt(message.body[1], 10));
|
|
404
|
-
|
|
405
337
|
var canAdaptSubsCounter = message => canAdaptGeneric(message.channel, parseInt(message.sent_at, 10));
|
|
406
|
-
|
|
407
338
|
var canAdaptOther = () => true;
|
|
408
|
-
|
|
409
339
|
var canAdaptGeneric = (channel, publishAt) => {
|
|
410
340
|
var now = LViSDate.now();
|
|
411
341
|
var hasEOC = EOCs[channel] !== undefined;
|
|
412
|
-
var publishAtDelayed = publishAt + Sync.getDelay();
|
|
342
|
+
var publishAtDelayed = publishAt + Sync.getDelay();
|
|
343
|
+
|
|
344
|
+
// Can publish whether:
|
|
413
345
|
// a. publishedAt is in the past,
|
|
414
346
|
// b. publishedAt is now, but only if we already received EOC. If we
|
|
415
347
|
// have not yet received EOC then there is a risk that we will receive
|
|
@@ -419,186 +351,159 @@ var ConnectionAdaptor = (() => {
|
|
|
419
351
|
// element into history rather than trigger ON_PUBLISHED. With this
|
|
420
352
|
// check we guarantee that if create and EOC arrive at the same second
|
|
421
353
|
// we do not trigger elements until we handled EOC.
|
|
422
|
-
|
|
423
354
|
return publishAtDelayed < now || publishAtDelayed === now && hasEOC;
|
|
424
355
|
};
|
|
425
|
-
|
|
426
356
|
var adaptMessage = message => {
|
|
427
357
|
var adaptor = (() => {
|
|
428
358
|
switch (message.klass) {
|
|
429
359
|
case 'snapshot':
|
|
430
360
|
return adaptSnapshot;
|
|
431
|
-
|
|
432
361
|
case 'listings':
|
|
433
362
|
return adaptListings;
|
|
434
|
-
|
|
435
363
|
case 'create':
|
|
436
364
|
return adaptCreate;
|
|
437
|
-
|
|
438
365
|
case 'reveal':
|
|
439
366
|
return adaptReveal;
|
|
440
|
-
|
|
441
367
|
case 'revoke':
|
|
442
368
|
return adaptRevoke;
|
|
443
|
-
|
|
444
369
|
case 'stop':
|
|
445
370
|
return adaptStop;
|
|
446
|
-
|
|
447
371
|
case 'p':
|
|
448
372
|
return adaptPoll;
|
|
449
|
-
|
|
450
373
|
case 'subscounter':
|
|
451
374
|
return adaptSubsCounter;
|
|
452
|
-
|
|
453
375
|
default:
|
|
454
376
|
return adaptOther;
|
|
455
377
|
}
|
|
456
378
|
})();
|
|
457
|
-
|
|
458
379
|
adaptor(message);
|
|
459
380
|
};
|
|
460
|
-
|
|
461
381
|
var adaptSnapshot = message => {
|
|
462
382
|
// console.log('ConnectionAdaptor::adaptSnapshot', message);
|
|
463
|
-
var snapshot;
|
|
464
383
|
|
|
384
|
+
var snapshot;
|
|
465
385
|
try {
|
|
466
386
|
snapshot = JSON.parse(message.body[0]);
|
|
467
|
-
} catch (e) {
|
|
387
|
+
} catch (e) {
|
|
388
|
+
// console.error('ConnectionAdaptor: Unable to parse listings data');
|
|
468
389
|
}
|
|
469
|
-
|
|
470
390
|
adaptSnapshotData(snapshot);
|
|
471
391
|
message.body[0] = JSON.stringify(snapshot);
|
|
472
392
|
};
|
|
473
|
-
|
|
474
393
|
var adaptSnapshotData = snapshot => {
|
|
475
394
|
snapshot.published_at += Sync.getDelay();
|
|
476
395
|
snapshot.published_at_iso = new Date(snapshot.published_at * 1000).toISOString();
|
|
477
|
-
|
|
478
396
|
var adapter = (() => {
|
|
479
397
|
switch (snapshot.type) {
|
|
480
398
|
case 'prediction':
|
|
481
399
|
return adaptPredictionSnapshot;
|
|
482
|
-
|
|
483
400
|
default:
|
|
484
401
|
return adaptOtherSnapshot;
|
|
485
402
|
}
|
|
486
403
|
})();
|
|
487
|
-
|
|
488
404
|
adapter(snapshot);
|
|
489
405
|
};
|
|
490
|
-
|
|
491
406
|
var adaptPredictionSnapshot = snapshot => {
|
|
492
407
|
var data = snapshot.data;
|
|
493
408
|
var delay = Sync.getDelay();
|
|
494
409
|
data.start_at += delay;
|
|
495
410
|
data.start_at_iso = new Date(data.start_at * 1000).toISOString();
|
|
496
|
-
|
|
497
411
|
if (data.stop_at) {
|
|
498
412
|
data.stop_at += delay;
|
|
499
413
|
data.stop_at_iso = new Date(data.stop_at * 1000).toISOString();
|
|
500
414
|
}
|
|
501
|
-
|
|
502
415
|
if (data.reveal_answer_at) {
|
|
503
416
|
data.reveal_answer_at += delay;
|
|
504
417
|
data.reveal_answer_at_iso = new Date(data.reveal_answer_at * 1000).toISOString();
|
|
505
418
|
}
|
|
506
419
|
};
|
|
507
|
-
|
|
508
|
-
|
|
420
|
+
var adaptOtherSnapshot = () => {
|
|
421
|
+
// console.log('ConnectionAdaptor::adaptOtherSnapshot', snapshot);
|
|
509
422
|
};
|
|
510
|
-
|
|
511
423
|
var adaptListings = message => {
|
|
512
424
|
// console.log('ConnectionAdaptor::adaptListings');
|
|
513
|
-
var listings;
|
|
514
425
|
|
|
426
|
+
var listings;
|
|
515
427
|
try {
|
|
516
428
|
listings = JSON.parse(message.body[0]);
|
|
517
|
-
} catch (e) {
|
|
429
|
+
} catch (e) {
|
|
430
|
+
// console.error('ConnectionAdaptor: Unable to parse listings data');
|
|
518
431
|
}
|
|
519
|
-
|
|
520
432
|
Sync.setMaxDelay(listings.project.audio_sync_max_delay);
|
|
521
433
|
Sync.setDefaultDelay(listings.project.audio_sync_default_delay);
|
|
522
|
-
|
|
523
434
|
for (var uuid in listings.events) {
|
|
524
435
|
if ({}.hasOwnProperty.call(listings.events, uuid)) {
|
|
525
436
|
adaptEvent(listings.events[uuid]);
|
|
526
437
|
}
|
|
527
438
|
}
|
|
528
|
-
|
|
529
439
|
message.body[0] = JSON.stringify(listings);
|
|
530
440
|
};
|
|
531
|
-
|
|
532
441
|
var adaptEvent = event => {
|
|
533
442
|
var delay = Sync.getDelay();
|
|
534
443
|
event.start_at += delay;
|
|
535
444
|
event.start_at_iso = new Date(event.start_at * 1000).toISOString();
|
|
536
445
|
event.end_at += delay;
|
|
537
|
-
event.end_at_iso = new Date(event.end_at * 1000).toISOString();
|
|
446
|
+
event.end_at_iso = new Date(event.end_at * 1000).toISOString();
|
|
538
447
|
|
|
448
|
+
// store delay
|
|
539
449
|
event.__delay = delay;
|
|
540
450
|
};
|
|
541
|
-
|
|
542
451
|
var adaptCreate = message => {
|
|
543
452
|
// console.log('ConnectionAdaptor::adaptCreate', message);
|
|
544
|
-
var data;
|
|
545
453
|
|
|
454
|
+
var data;
|
|
546
455
|
try {
|
|
547
456
|
data = JSON.parse(message.body[0]);
|
|
548
|
-
} catch (e) {
|
|
457
|
+
} catch (e) {
|
|
458
|
+
// console.error('ConnectionAdaptor: Unable to parse create data');
|
|
549
459
|
}
|
|
550
|
-
|
|
551
460
|
data.published_at += Sync.getDelay();
|
|
552
461
|
data.published_at_iso = new Date(data.published_at * 1000).toISOString();
|
|
553
462
|
message.body[0] = JSON.stringify(data);
|
|
554
463
|
};
|
|
555
|
-
|
|
556
464
|
var adaptPoll = message => {
|
|
557
465
|
// console.log('ConnectionAdaptor::adaptPoll', message);
|
|
466
|
+
|
|
558
467
|
message.body[1] = parseInt(message.body[1], 10) + Sync.getDelay();
|
|
559
468
|
};
|
|
560
|
-
|
|
561
469
|
var adaptStop = message => {
|
|
562
470
|
// console.log('ConnectionAdaptor::adaptStop', message);
|
|
471
|
+
|
|
563
472
|
message.body[1] = parseInt(message.body[1], 10) + Sync.getDelay();
|
|
564
473
|
};
|
|
565
|
-
|
|
566
474
|
var adaptReveal = message => {
|
|
567
475
|
// console.log('ConnectionAdaptor::adaptReveal', message);
|
|
476
|
+
|
|
568
477
|
message.body[2] = parseInt(message.body[2], 10) + Sync.getDelay();
|
|
569
478
|
};
|
|
570
|
-
|
|
571
479
|
var adaptRevoke = message => {
|
|
572
480
|
// console.log('ConnectionAdaptor::adaptRevoke', message);
|
|
573
|
-
var data;
|
|
574
481
|
|
|
482
|
+
var data;
|
|
575
483
|
try {
|
|
576
484
|
data = JSON.parse(message.body[0]);
|
|
577
|
-
} catch (e) {
|
|
485
|
+
} catch (e) {
|
|
486
|
+
// console.error('ConnectionAdaptor: Unable to parse revoke data');
|
|
578
487
|
}
|
|
579
|
-
|
|
580
488
|
data.sent_at += Sync.getDelay();
|
|
581
489
|
data.sent_at_iso = new Date(data.sent_at * 1000).toISOString();
|
|
582
490
|
message.body[0] = JSON.stringify(data);
|
|
583
491
|
};
|
|
584
|
-
|
|
585
492
|
var adaptSubsCounter = message => {
|
|
586
493
|
try {
|
|
587
494
|
var data = JSON.parse(message.body[0]);
|
|
588
495
|
data.next_update_at += Sync.getDelay();
|
|
589
496
|
message.body[0] = JSON.stringify(data);
|
|
590
|
-
} catch (e) {
|
|
497
|
+
} catch (e) {
|
|
498
|
+
// why do we fail silently?
|
|
591
499
|
}
|
|
592
500
|
};
|
|
593
|
-
|
|
594
501
|
var adaptOther = () => 0;
|
|
595
|
-
|
|
596
502
|
var clearQueue = () => {
|
|
597
503
|
while (queue.length) {
|
|
598
504
|
queue.pop();
|
|
599
505
|
}
|
|
600
506
|
};
|
|
601
|
-
|
|
602
507
|
var clearEOCs = () => {
|
|
603
508
|
for (var eoc in EOCs) {
|
|
604
509
|
if ({}.hasOwnProperty.call(EOCs, eoc)) {
|
|
@@ -606,11 +511,9 @@ var ConnectionAdaptor = (() => {
|
|
|
606
511
|
}
|
|
607
512
|
}
|
|
608
513
|
};
|
|
609
|
-
|
|
610
514
|
self.subscribe = channel => {
|
|
611
515
|
Enmasse.subscribe(channel);
|
|
612
516
|
};
|
|
613
|
-
|
|
614
517
|
self.unsubscribe = channel => {
|
|
615
518
|
queue.forEach((message, idx) => {
|
|
616
519
|
if (message.channel === channel) {
|
|
@@ -620,11 +523,8 @@ var ConnectionAdaptor = (() => {
|
|
|
620
523
|
delete EOCs[channel];
|
|
621
524
|
Enmasse.unsubscribe(channel);
|
|
622
525
|
};
|
|
623
|
-
|
|
624
526
|
self.adaptSnapshotData = message => adaptSnapshotData(message);
|
|
625
|
-
|
|
626
527
|
self.adaptEvent = event => adaptEvent(event);
|
|
627
|
-
|
|
628
528
|
Enmasse.bind(Enmasse.ON_MESSAGE, handleMessage);
|
|
629
529
|
Enmasse.bind(Enmasse.ON_STATE, handleState);
|
|
630
530
|
Enmasse.bind(Enmasse.ON_EOC, handleEOC);
|
|
@@ -636,17 +536,13 @@ class Base extends Emitter {
|
|
|
636
536
|
get(id) {
|
|
637
537
|
return this.instances[id] || false;
|
|
638
538
|
}
|
|
639
|
-
|
|
640
539
|
create() {}
|
|
641
|
-
|
|
642
540
|
createSnapshot() {}
|
|
643
|
-
|
|
644
541
|
revoke(id) {
|
|
645
542
|
if ({}.hasOwnProperty.call(this.instances, id)) {
|
|
646
543
|
delete this.instances[id];
|
|
647
544
|
}
|
|
648
545
|
}
|
|
649
|
-
|
|
650
546
|
destroyInstances() {
|
|
651
547
|
// console.log("BaseFactory::destroyInstances", this.instances);
|
|
652
548
|
for (var id in this.instances) {
|
|
@@ -656,7 +552,6 @@ class Base extends Emitter {
|
|
|
656
552
|
}
|
|
657
553
|
}
|
|
658
554
|
}
|
|
659
|
-
|
|
660
555
|
constructor() {
|
|
661
556
|
super();
|
|
662
557
|
this.instances = {};
|
|
@@ -664,63 +559,50 @@ class Base extends Emitter {
|
|
|
664
559
|
this.bind = this.on;
|
|
665
560
|
this.unbind = this.off;
|
|
666
561
|
}
|
|
667
|
-
|
|
668
562
|
}
|
|
669
563
|
|
|
670
564
|
class FrameFactory extends Base {
|
|
671
565
|
getByEnmasseId(enmasseId) {
|
|
672
566
|
for (var _i = 0, _Object$values = Object.values(this.instances); _i < _Object$values.length; _i++) {
|
|
673
567
|
var instance = _Object$values[_i];
|
|
674
|
-
|
|
675
568
|
if (instance.getEnmasseId() === enmasseId) {
|
|
676
569
|
return instance;
|
|
677
570
|
}
|
|
678
571
|
}
|
|
679
|
-
|
|
680
572
|
return false;
|
|
681
573
|
}
|
|
682
|
-
|
|
683
574
|
setMessages() {}
|
|
684
|
-
|
|
685
575
|
update(instance, data) {
|
|
686
576
|
instance.update(data);
|
|
687
577
|
}
|
|
688
|
-
|
|
689
578
|
}
|
|
690
579
|
|
|
691
580
|
class Entity extends Emitter {
|
|
692
581
|
getId() {
|
|
693
582
|
return this.id;
|
|
694
583
|
}
|
|
695
|
-
|
|
696
584
|
getEnmasseId() {
|
|
697
585
|
return this.enmasseId;
|
|
698
586
|
}
|
|
699
|
-
|
|
700
587
|
getFullId() {
|
|
701
588
|
return "".concat(this.id, ".").concat(this.enmasseId);
|
|
702
589
|
}
|
|
703
|
-
|
|
704
590
|
getPublishedAt() {
|
|
705
591
|
return this.publishedAt;
|
|
706
592
|
}
|
|
707
|
-
|
|
708
593
|
getUpdatedAt() {
|
|
709
594
|
return this.updatedAt;
|
|
710
595
|
}
|
|
711
|
-
|
|
712
596
|
finalize() {
|
|
713
597
|
this.finalized.resolve();
|
|
714
598
|
}
|
|
715
|
-
|
|
716
599
|
update() {
|
|
717
600
|
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
718
601
|
this.updatedAt = config.updated_at - 0 || 0;
|
|
719
602
|
}
|
|
720
|
-
|
|
721
|
-
|
|
603
|
+
destroy() {
|
|
604
|
+
// console.log("Entity::destroy id=%s" + this.getId());
|
|
722
605
|
}
|
|
723
|
-
|
|
724
606
|
constructor() {
|
|
725
607
|
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
726
608
|
super(config);
|
|
@@ -733,14 +615,12 @@ class Entity extends Emitter {
|
|
|
733
615
|
this.bind = this.on;
|
|
734
616
|
this.unbind = this.off;
|
|
735
617
|
}
|
|
736
|
-
|
|
737
618
|
}
|
|
738
619
|
|
|
739
620
|
/* global QUOTA_EXCEEDED_ERR */
|
|
740
621
|
var globals = getGlobal();
|
|
741
622
|
var StorageLocalDriver = (() => {
|
|
742
623
|
var self = {};
|
|
743
|
-
|
|
744
624
|
self.hasSupport = () => {
|
|
745
625
|
try {
|
|
746
626
|
return 'localStorage' in global && globals.localStorage !== null;
|
|
@@ -748,7 +628,6 @@ var StorageLocalDriver = (() => {
|
|
|
748
628
|
return false;
|
|
749
629
|
}
|
|
750
630
|
};
|
|
751
|
-
|
|
752
631
|
self.set = (name, value) => {
|
|
753
632
|
try {
|
|
754
633
|
globals.localStorage.setItem(name, value);
|
|
@@ -758,19 +637,14 @@ var StorageLocalDriver = (() => {
|
|
|
758
637
|
}
|
|
759
638
|
}
|
|
760
639
|
};
|
|
761
|
-
|
|
762
640
|
self.get = name => globals.localStorage.getItem(name);
|
|
763
|
-
|
|
764
641
|
self.remove = name => globals.localStorage.removeItem(name);
|
|
765
|
-
|
|
766
642
|
return self;
|
|
767
643
|
})();
|
|
768
644
|
var StorageCookieDriver = (() => {
|
|
769
645
|
var self = {};
|
|
770
|
-
|
|
771
646
|
self.hasSupport = () => {
|
|
772
647
|
var probe = 'probe';
|
|
773
|
-
|
|
774
648
|
try {
|
|
775
649
|
self.set(probe, probe);
|
|
776
650
|
var stored = self.get(probe);
|
|
@@ -780,31 +654,23 @@ var StorageCookieDriver = (() => {
|
|
|
780
654
|
return false;
|
|
781
655
|
}
|
|
782
656
|
};
|
|
783
|
-
|
|
784
657
|
self.set = (name, value, expires) => {
|
|
785
658
|
var args = [name, value];
|
|
786
|
-
|
|
787
659
|
if (typeof expires !== 'undefined') {
|
|
788
660
|
args.push({
|
|
789
661
|
expires
|
|
790
662
|
});
|
|
791
663
|
}
|
|
792
|
-
|
|
793
664
|
return Cookie.set(...args);
|
|
794
665
|
};
|
|
795
|
-
|
|
796
666
|
self.get = name => {
|
|
797
667
|
var value = Cookie.get(name);
|
|
798
|
-
|
|
799
668
|
if (typeof value === 'undefined') {
|
|
800
669
|
return null;
|
|
801
670
|
}
|
|
802
|
-
|
|
803
671
|
return value;
|
|
804
672
|
};
|
|
805
|
-
|
|
806
673
|
self.remove = name => Cookie.remove(name);
|
|
807
|
-
|
|
808
674
|
return self;
|
|
809
675
|
})();
|
|
810
676
|
var Storage = (() => {
|
|
@@ -812,46 +678,35 @@ var Storage = (() => {
|
|
|
812
678
|
var self = {};
|
|
813
679
|
var driver = null;
|
|
814
680
|
var prefix = 'lvis';
|
|
815
|
-
|
|
816
681
|
for (var i = 0; i < DRIVERS.length; i++) {
|
|
817
682
|
if (DRIVERS[i].hasSupport()) {
|
|
818
683
|
driver = DRIVERS[i];
|
|
819
684
|
break;
|
|
820
685
|
}
|
|
821
686
|
}
|
|
822
|
-
|
|
823
687
|
var enabled = () => driver !== null;
|
|
824
|
-
|
|
825
688
|
var toStoredName = name => [prefix, name].join('-');
|
|
826
|
-
|
|
827
689
|
self.setPrefix = newPrefix => {
|
|
828
690
|
prefix = newPrefix;
|
|
829
691
|
};
|
|
830
|
-
|
|
831
692
|
self.set = (name, value, expires) => {
|
|
832
693
|
if (enabled()) {
|
|
833
694
|
return driver.set(toStoredName(name), value, expires);
|
|
834
695
|
}
|
|
835
|
-
|
|
836
696
|
return undefined;
|
|
837
697
|
};
|
|
838
|
-
|
|
839
698
|
self.get = name => {
|
|
840
699
|
if (enabled()) {
|
|
841
700
|
return driver.get(toStoredName(name));
|
|
842
701
|
}
|
|
843
|
-
|
|
844
702
|
return undefined;
|
|
845
703
|
};
|
|
846
|
-
|
|
847
704
|
self.remove = name => {
|
|
848
705
|
if (enabled()) {
|
|
849
706
|
return driver.remove(toStoredName(name));
|
|
850
707
|
}
|
|
851
|
-
|
|
852
708
|
return undefined;
|
|
853
709
|
};
|
|
854
|
-
|
|
855
710
|
return self;
|
|
856
711
|
})();
|
|
857
712
|
|
|
@@ -868,9 +723,7 @@ var Project = (() => {
|
|
|
868
723
|
self.unbind = self.off;
|
|
869
724
|
self.ON_SUBS_COUNT = 'subs_count';
|
|
870
725
|
self.ON_SUBS_COUNT_MISSING = 'subs_count_missing';
|
|
871
|
-
|
|
872
726
|
var getDefaultLanguage = () => data.locales.find(locale => !!locale.default);
|
|
873
|
-
|
|
874
727
|
var loadAppSettings = () => {
|
|
875
728
|
var url = "".concat(host, "/projects/").concat(uuid.substr(0, 2), "/").concat(uuid, "/settings.json");
|
|
876
729
|
var dfd = new Deferred();
|
|
@@ -880,7 +733,6 @@ var Project = (() => {
|
|
|
880
733
|
var settingsData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
881
734
|
var status = resp.statusCode;
|
|
882
735
|
var isSuccess = status >= 200 && status <= 300 || status === 0 || status === '';
|
|
883
|
-
|
|
884
736
|
if (isSuccess) {
|
|
885
737
|
settings = settingsData;
|
|
886
738
|
dfd.resolve();
|
|
@@ -890,21 +742,17 @@ var Project = (() => {
|
|
|
890
742
|
});
|
|
891
743
|
return dfd.promise();
|
|
892
744
|
};
|
|
893
|
-
|
|
894
745
|
var hasLanguage = language => data.locales.some(_ref => {
|
|
895
746
|
var key = _ref.key;
|
|
896
747
|
return key === language;
|
|
897
748
|
});
|
|
898
|
-
|
|
899
749
|
var handleSubsMissing = () => {
|
|
900
750
|
self.trigger(self.ON_SUBS_COUNT_MISSING);
|
|
901
751
|
};
|
|
902
|
-
|
|
903
752
|
var handleSubsCount = message => {
|
|
904
753
|
if (message.klass !== 'subscounter') {
|
|
905
754
|
return;
|
|
906
755
|
}
|
|
907
|
-
|
|
908
756
|
try {
|
|
909
757
|
var subsData = JSON.parse(message.body[0]);
|
|
910
758
|
var nextSubsUpdate = subsData.next_update_at;
|
|
@@ -915,22 +763,21 @@ var Project = (() => {
|
|
|
915
763
|
console.warn("Couldn't parse subscounter message.");
|
|
916
764
|
}
|
|
917
765
|
};
|
|
918
|
-
|
|
919
766
|
self.setData = d => {
|
|
920
767
|
data = d || {};
|
|
921
768
|
Storage.setPrefix("lvis-".concat(uuid));
|
|
922
|
-
var storedLanguage = Storage.get('lang');
|
|
769
|
+
var storedLanguage = Storage.get('lang');
|
|
923
770
|
|
|
771
|
+
// trying to set stored language
|
|
924
772
|
if (storedLanguage) {
|
|
925
773
|
self.setCurrentLanguage(storedLanguage);
|
|
926
|
-
}
|
|
927
|
-
|
|
774
|
+
}
|
|
928
775
|
|
|
776
|
+
// if current is not set yet using default language
|
|
929
777
|
if (currentLanguage === null) {
|
|
930
778
|
currentLanguage = getDefaultLanguage().key;
|
|
931
779
|
}
|
|
932
780
|
};
|
|
933
|
-
|
|
934
781
|
self.setCurrentLanguage = language => {
|
|
935
782
|
if (hasLanguage(language)) {
|
|
936
783
|
currentLanguage = language;
|
|
@@ -939,57 +786,41 @@ var Project = (() => {
|
|
|
939
786
|
console.warn("Attempt to set unknown language \"".concat(language, "\""));
|
|
940
787
|
}
|
|
941
788
|
};
|
|
942
|
-
|
|
943
789
|
self.get = name => {
|
|
944
790
|
if (typeof name === 'undefined') {
|
|
945
791
|
// return full dataset if parameter name is not set
|
|
946
792
|
return data;
|
|
947
793
|
}
|
|
948
|
-
|
|
949
794
|
if (typeof data[name] !== 'undefined') {
|
|
950
795
|
// return value that matches passed parameter name in dataset
|
|
951
796
|
return data[name];
|
|
952
797
|
}
|
|
953
|
-
|
|
954
798
|
return null;
|
|
955
799
|
};
|
|
956
|
-
|
|
957
800
|
self.getSettings = name => {
|
|
958
801
|
var values = self.localise(settings);
|
|
959
|
-
|
|
960
802
|
if (typeof name === 'undefined') {
|
|
961
803
|
return values;
|
|
962
804
|
}
|
|
963
|
-
|
|
964
805
|
if (typeof values[name] !== 'undefined') {
|
|
965
806
|
return values[name];
|
|
966
807
|
}
|
|
967
|
-
|
|
968
808
|
return null;
|
|
969
809
|
};
|
|
970
|
-
|
|
971
810
|
self.getUUID = () => uuid;
|
|
972
|
-
|
|
973
811
|
self.getLanguages = () => self.get('locales');
|
|
974
|
-
|
|
975
812
|
self.getCurrentLanguage = () => currentLanguage;
|
|
976
|
-
|
|
977
813
|
self.getEmbedUrl = () => self.get('embed');
|
|
978
|
-
|
|
979
814
|
self.isLocalisationSupported = () => self.get('is_localisation_supported');
|
|
980
|
-
|
|
981
815
|
self.localise = value => {
|
|
982
816
|
if ({}.hasOwnProperty.call(value, currentLanguage)) {
|
|
983
817
|
return value[currentLanguage];
|
|
984
818
|
}
|
|
985
|
-
|
|
986
819
|
if ({}.hasOwnProperty.call(value, 'all')) {
|
|
987
820
|
return value.all;
|
|
988
821
|
}
|
|
989
|
-
|
|
990
822
|
return value;
|
|
991
823
|
};
|
|
992
|
-
|
|
993
824
|
self.init = function () {
|
|
994
825
|
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
995
826
|
uuid = config.uuid;
|
|
@@ -997,7 +828,6 @@ var Project = (() => {
|
|
|
997
828
|
ConnectionAdaptor.bind(ConnectionAdaptor.ON_MESSAGE, handleSubsCount);
|
|
998
829
|
return loadAppSettings();
|
|
999
830
|
};
|
|
1000
|
-
|
|
1001
831
|
return self;
|
|
1002
832
|
})();
|
|
1003
833
|
|
|
@@ -1005,85 +835,70 @@ class Frame extends Entity {
|
|
|
1005
835
|
getEnmasseId() {
|
|
1006
836
|
return this.enmasseId;
|
|
1007
837
|
}
|
|
1008
|
-
|
|
1009
838
|
getDuration() {
|
|
1010
839
|
return this.duration;
|
|
1011
840
|
}
|
|
1012
|
-
|
|
1013
841
|
getDurationLeft() {
|
|
1014
842
|
return this.durationLeft;
|
|
1015
843
|
}
|
|
1016
|
-
|
|
1017
844
|
getType() {
|
|
1018
845
|
return this.type;
|
|
1019
846
|
}
|
|
1020
|
-
|
|
1021
847
|
getContentType() {
|
|
1022
848
|
// should return basic type if custom type is null
|
|
1023
849
|
return this.contentType === null ? this.type : this.contentType;
|
|
1024
850
|
}
|
|
1025
|
-
|
|
1026
851
|
getCustomFields(field) {
|
|
1027
852
|
var values = Project.localise(this.customFields);
|
|
1028
|
-
|
|
1029
853
|
if (typeof field === 'undefined') {
|
|
1030
854
|
// return full set of custom fields if field name wasn't passed
|
|
1031
855
|
return values;
|
|
1032
|
-
}
|
|
1033
|
-
|
|
856
|
+
}
|
|
1034
857
|
|
|
858
|
+
// custom field was passed
|
|
1035
859
|
if (typeof values[field] !== 'undefined') {
|
|
1036
860
|
// return specific field if field exists in object
|
|
1037
861
|
return values[field];
|
|
1038
|
-
}
|
|
1039
|
-
|
|
862
|
+
}
|
|
1040
863
|
|
|
864
|
+
// otherwise return null
|
|
1041
865
|
return null;
|
|
1042
866
|
}
|
|
1043
|
-
|
|
1044
867
|
hasFixedDuration() {
|
|
1045
868
|
return this.fixed;
|
|
1046
869
|
}
|
|
1047
|
-
|
|
1048
870
|
setDuration(duration) {
|
|
1049
871
|
this.duration = parseInt(duration, 10);
|
|
1050
872
|
}
|
|
1051
|
-
|
|
1052
873
|
setDurationLeft(duration) {
|
|
1053
874
|
this.durationLeft = parseInt(duration, 10);
|
|
1054
875
|
}
|
|
1055
|
-
|
|
1056
876
|
abort(time) {
|
|
1057
877
|
this.aborted = true;
|
|
1058
878
|
this.setDuration(time - this.getPublishedAt());
|
|
1059
879
|
this.setDurationLeft(0);
|
|
1060
880
|
}
|
|
1061
|
-
|
|
1062
881
|
updateDurationLeft() {
|
|
1063
882
|
if (this.aborted) {
|
|
1064
883
|
return;
|
|
1065
884
|
}
|
|
1066
|
-
|
|
1067
885
|
var self = this;
|
|
1068
886
|
var endAt = this.publishedAt + this.duration;
|
|
1069
887
|
var now = LViSDate.now();
|
|
1070
888
|
var left = endAt - now;
|
|
1071
889
|
this.setDurationLeft(left);
|
|
1072
|
-
|
|
1073
890
|
if (this.durationLeft > 0) {
|
|
1074
891
|
Run.nextPriority(() => self.updateDurationLeft());
|
|
1075
892
|
} else {
|
|
1076
893
|
this.durationLeft = 0;
|
|
1077
894
|
}
|
|
1078
895
|
}
|
|
1079
|
-
|
|
1080
896
|
update() {
|
|
1081
897
|
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1082
898
|
super.update(config);
|
|
1083
899
|
this.duration = config.duration - 0 || 0;
|
|
1084
900
|
this.customFields = config.custom_fields || {};
|
|
1085
901
|
}
|
|
1086
|
-
|
|
1087
902
|
constructor() {
|
|
1088
903
|
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1089
904
|
super(config);
|
|
@@ -1095,35 +910,30 @@ class Frame extends Entity {
|
|
|
1095
910
|
this.type = config.type;
|
|
1096
911
|
this.fixed = config.fixed;
|
|
1097
912
|
this.contentType = config.content_type || null;
|
|
1098
|
-
this.customFields = config.custom_fields || {};
|
|
913
|
+
this.customFields = config.custom_fields || {};
|
|
1099
914
|
|
|
915
|
+
// calculate real duration left only for fixed frames
|
|
1100
916
|
if (this.fixed) {
|
|
1101
917
|
this.updateDurationLeft();
|
|
1102
918
|
}
|
|
1103
919
|
}
|
|
1104
|
-
|
|
1105
920
|
}
|
|
1106
921
|
|
|
1107
922
|
class Poll extends Frame {
|
|
1108
923
|
getQuestion() {
|
|
1109
924
|
return Project.localise(this.question);
|
|
1110
925
|
}
|
|
1111
|
-
|
|
1112
926
|
getOptions() {
|
|
1113
927
|
return Project.localise(this.options);
|
|
1114
928
|
}
|
|
1115
|
-
|
|
1116
929
|
getResults() {
|
|
1117
930
|
if (!this.canReveal()) {
|
|
1118
931
|
return [];
|
|
1119
932
|
}
|
|
1120
|
-
|
|
1121
933
|
return this.results;
|
|
1122
934
|
}
|
|
1123
|
-
|
|
1124
935
|
getResultsPerSource(source) {
|
|
1125
936
|
var results = null;
|
|
1126
|
-
|
|
1127
937
|
if (typeof source === 'undefined') {
|
|
1128
938
|
results = this.resultsPerSource;
|
|
1129
939
|
} else {
|
|
@@ -1133,104 +943,86 @@ class Poll extends Frame {
|
|
|
1133
943
|
}
|
|
1134
944
|
}
|
|
1135
945
|
}
|
|
1136
|
-
|
|
1137
946
|
return results;
|
|
1138
947
|
}
|
|
1139
|
-
|
|
1140
948
|
getState() {
|
|
1141
949
|
return this.state;
|
|
1142
950
|
}
|
|
1143
|
-
|
|
1144
951
|
getUserVote() {
|
|
1145
952
|
return this.votedFor;
|
|
1146
953
|
}
|
|
1147
|
-
|
|
1148
954
|
hasUserVoted() {
|
|
1149
955
|
return this.getUserVote() !== null;
|
|
1150
956
|
}
|
|
1151
|
-
|
|
1152
957
|
hasResults() {
|
|
1153
958
|
return this.results !== null && this.canReveal();
|
|
1154
959
|
}
|
|
1155
|
-
|
|
1156
960
|
canReveal() {
|
|
1157
961
|
return true;
|
|
1158
962
|
}
|
|
1159
|
-
|
|
1160
963
|
isValidatedUserRequired() {
|
|
1161
964
|
return this.requiresValidatedUser;
|
|
1162
965
|
}
|
|
1163
|
-
|
|
1164
966
|
vote() {
|
|
1165
967
|
var vote = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1166
968
|
var indices = Object.keys(vote);
|
|
1167
969
|
var options = this.getOptions();
|
|
1168
970
|
var nonexistantVotes = indices.filter(idx => typeof options[idx] === 'undefined');
|
|
1169
|
-
|
|
1170
971
|
if (nonexistantVotes.length > 0) {
|
|
1171
972
|
console.warn("Can't vote for nonexistant %s (%s)", nonexistantVotes.length === 1 ? 'option' : 'options', nonexistantVotes.join(', '));
|
|
1172
973
|
return false;
|
|
1173
974
|
}
|
|
1174
|
-
|
|
1175
975
|
this.storeVote(vote);
|
|
1176
976
|
this.trigger(Poll.ON_VOTE, vote);
|
|
1177
977
|
return true;
|
|
1178
978
|
}
|
|
1179
|
-
|
|
1180
979
|
setState(state) {
|
|
1181
980
|
// do not fire state change if passed state is the same as it was
|
|
1182
981
|
if (state === undefined || state === this.state) {
|
|
1183
982
|
return;
|
|
1184
983
|
}
|
|
1185
|
-
|
|
1186
984
|
this.state = state;
|
|
1187
|
-
this.trigger(Poll.ON_STATE_CHANGE, state);
|
|
985
|
+
this.trigger(Poll.ON_STATE_CHANGE, state);
|
|
986
|
+
|
|
987
|
+
// Order of messages from enmasse is not guaranteed.
|
|
1188
988
|
// Stop or reveal messages can be after feedback message.
|
|
1189
989
|
// If feedback message is received before user is able to see results are saved
|
|
1190
990
|
// and set resultsTriggerPostponed true.
|
|
1191
991
|
// When state(stop, reveal) allows reveal results and reveal results was postponed
|
|
1192
992
|
// action ON_RESULTS triggered.
|
|
1193
|
-
|
|
1194
993
|
if (this.canReveal() && this.resultsTriggerPostponed) {
|
|
1195
994
|
this.resultsTriggerPostponed = false;
|
|
1196
995
|
this.trigger(Poll.ON_RESULTS);
|
|
1197
996
|
}
|
|
1198
997
|
}
|
|
1199
|
-
|
|
1200
998
|
setResults(results) {
|
|
1201
999
|
// skip setting results if they weren't changed
|
|
1202
1000
|
if (JSON.stringify(results) === JSON.stringify(this.rawResults)) {
|
|
1203
1001
|
return;
|
|
1204
1002
|
}
|
|
1205
|
-
|
|
1206
1003
|
this.rawResults = results;
|
|
1207
1004
|
this.populateResults(results);
|
|
1208
|
-
|
|
1209
1005
|
if (this.hasResults()) {
|
|
1210
1006
|
this.trigger(Poll.ON_RESULTS);
|
|
1211
1007
|
} else {
|
|
1212
1008
|
this.resultsTriggerPostponed = true;
|
|
1213
1009
|
}
|
|
1214
1010
|
}
|
|
1215
|
-
|
|
1216
1011
|
setResultsPerSource(results) {
|
|
1217
1012
|
this.populateResultsPerSource(results);
|
|
1218
1013
|
}
|
|
1219
|
-
|
|
1220
1014
|
isStarted() {
|
|
1221
1015
|
return this.state === Poll.STATE_STARTED;
|
|
1222
1016
|
}
|
|
1223
|
-
|
|
1224
1017
|
isClosed() {
|
|
1225
1018
|
return this.state === Poll.STATE_CLOSED;
|
|
1226
1019
|
}
|
|
1227
|
-
|
|
1228
1020
|
stop(time) {
|
|
1229
1021
|
this.abort(time);
|
|
1230
1022
|
this.setState(Poll.STATE_CLOSED);
|
|
1231
|
-
}
|
|
1232
|
-
|
|
1023
|
+
}
|
|
1233
1024
|
|
|
1025
|
+
// TODO: Combine populateResults() and populateResultsFromSnapshot() methods
|
|
1234
1026
|
populateResults(results) {
|
|
1235
1027
|
var percentage = calculatePercentage(results);
|
|
1236
1028
|
this.results = results.map((votes, idx) => ({
|
|
@@ -1238,7 +1030,6 @@ class Poll extends Frame {
|
|
|
1238
1030
|
percentage: percentage[idx]
|
|
1239
1031
|
}));
|
|
1240
1032
|
}
|
|
1241
|
-
|
|
1242
1033
|
populateResultsPerSource(results) {
|
|
1243
1034
|
this.resultsPerSource = results;
|
|
1244
1035
|
this.resultsPerSource.forEach(source => {
|
|
@@ -1249,7 +1040,6 @@ class Poll extends Frame {
|
|
|
1249
1040
|
}));
|
|
1250
1041
|
});
|
|
1251
1042
|
}
|
|
1252
|
-
|
|
1253
1043
|
storeVote(vote) {
|
|
1254
1044
|
var name = "frame-".concat(this.getId());
|
|
1255
1045
|
var value = JSON.stringify(vote);
|
|
@@ -1257,24 +1047,20 @@ class Poll extends Frame {
|
|
|
1257
1047
|
this.votedFor = vote;
|
|
1258
1048
|
Storage.set(name, value, expire);
|
|
1259
1049
|
}
|
|
1260
|
-
|
|
1261
1050
|
restoreVote() {
|
|
1262
1051
|
var name = "frame-".concat(this.getId());
|
|
1263
|
-
|
|
1264
1052
|
try {
|
|
1265
1053
|
this.votedFor = JSON.parse(Storage.get(name));
|
|
1266
1054
|
} catch (exception) {
|
|
1267
1055
|
console.error('Unable to restore option user voted for', exception);
|
|
1268
1056
|
}
|
|
1269
1057
|
}
|
|
1270
|
-
|
|
1271
1058
|
update() {
|
|
1272
1059
|
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1273
1060
|
super.update(config);
|
|
1274
1061
|
this.question = config.data.question;
|
|
1275
1062
|
this.options = config.data.options;
|
|
1276
1063
|
}
|
|
1277
|
-
|
|
1278
1064
|
constructor(config) {
|
|
1279
1065
|
super(config);
|
|
1280
1066
|
this.question = config.data.question;
|
|
@@ -1288,92 +1074,74 @@ class Poll extends Frame {
|
|
|
1288
1074
|
this.resultsTriggerPostponed = false;
|
|
1289
1075
|
this.restoreVote();
|
|
1290
1076
|
}
|
|
1291
|
-
|
|
1292
1077
|
}
|
|
1293
|
-
|
|
1294
1078
|
_defineProperty(Poll, "EXPIRE", 7 * 24 * 60 * 60);
|
|
1295
|
-
|
|
1296
1079
|
_defineProperty(Poll, "STATE_STARTED", 'started');
|
|
1297
|
-
|
|
1298
1080
|
_defineProperty(Poll, "STATE_CLOSED", 'stopped');
|
|
1299
|
-
|
|
1300
1081
|
_defineProperty(Poll, "ON_VOTE", 'voted');
|
|
1301
|
-
|
|
1302
1082
|
_defineProperty(Poll, "ON_RESULTS", 'results');
|
|
1303
|
-
|
|
1304
1083
|
_defineProperty(Poll, "ON_STATE_CHANGE", 'state');
|
|
1305
1084
|
|
|
1306
1085
|
var Fadeable = superclass => class extends superclass {
|
|
1307
1086
|
getFade() {
|
|
1308
1087
|
return this.fade;
|
|
1309
1088
|
}
|
|
1310
|
-
|
|
1311
1089
|
constructor(config) {
|
|
1312
1090
|
super(config);
|
|
1313
1091
|
this.fade = config.data.fade;
|
|
1314
1092
|
}
|
|
1315
|
-
|
|
1316
1093
|
};
|
|
1317
1094
|
|
|
1318
1095
|
class Powerbar extends Fadeable(Poll) {
|
|
1319
1096
|
getResultsPerSource(source) {
|
|
1320
1097
|
var results = null;
|
|
1321
|
-
|
|
1322
1098
|
if (typeof source === 'undefined') {
|
|
1323
1099
|
results = this.resultsPerSource;
|
|
1324
1100
|
} else if (typeof this.resultsPerSource[source] !== 'undefined') {
|
|
1325
1101
|
results = this.resultsPerSource[source];
|
|
1326
1102
|
}
|
|
1327
|
-
|
|
1328
1103
|
return results;
|
|
1329
1104
|
}
|
|
1330
|
-
|
|
1331
1105
|
setResults(results) {
|
|
1332
1106
|
var item = this.resultsToHistoryItem(results);
|
|
1333
1107
|
this.results.push(item);
|
|
1334
1108
|
this.trigger(Powerbar.ON_RESULTS, item);
|
|
1335
1109
|
}
|
|
1336
|
-
|
|
1337
1110
|
setResultsPerSource(results) {
|
|
1338
1111
|
results.forEach(result => {
|
|
1339
1112
|
var item = this.resultsToHistoryItem(result.results);
|
|
1340
|
-
|
|
1341
1113
|
if (!this.resultsPerSource[result.source]) {
|
|
1342
1114
|
this.resultsPerSource[result.source] = [];
|
|
1343
1115
|
}
|
|
1344
|
-
|
|
1345
1116
|
this.resultsPerSource[result.source].push(item);
|
|
1346
1117
|
}, this);
|
|
1347
1118
|
}
|
|
1348
|
-
|
|
1349
1119
|
resultsToHistoryItem(results) {
|
|
1350
1120
|
var item = {
|
|
1351
1121
|
time: LViSDate.now(),
|
|
1352
1122
|
volume: 0,
|
|
1353
1123
|
average: 0,
|
|
1354
1124
|
responses: 0
|
|
1355
|
-
};
|
|
1125
|
+
};
|
|
1356
1126
|
|
|
1127
|
+
// option's index starts with 1
|
|
1357
1128
|
for (var i = 0, l = 9; i <= l; i++) {
|
|
1358
1129
|
if (typeof results[i] !== 'undefined') {
|
|
1359
1130
|
item.volume += results[i] * (i + 1);
|
|
1360
1131
|
item.responses += results[i];
|
|
1361
1132
|
}
|
|
1362
1133
|
}
|
|
1363
|
-
|
|
1364
1134
|
if (item.responses !== 0) {
|
|
1365
1135
|
item.average = Math.round(item.volume / item.responses);
|
|
1366
1136
|
}
|
|
1367
|
-
|
|
1368
1137
|
return item;
|
|
1369
1138
|
}
|
|
1370
|
-
|
|
1371
1139
|
hasResults() {
|
|
1372
1140
|
return this.results.length > 0;
|
|
1373
1141
|
}
|
|
1374
|
-
|
|
1375
1142
|
constructor(config) {
|
|
1376
1143
|
super(config);
|
|
1144
|
+
|
|
1377
1145
|
/**
|
|
1378
1146
|
* Array of plain objects which represent result history for Powerbar element
|
|
1379
1147
|
*
|
|
@@ -1386,25 +1154,16 @@ class Powerbar extends Fadeable(Poll) {
|
|
|
1386
1154
|
* @property history
|
|
1387
1155
|
* @type {Array}
|
|
1388
1156
|
*/
|
|
1389
|
-
|
|
1390
1157
|
this.results = [];
|
|
1391
1158
|
this.resultsPerSource = {};
|
|
1392
1159
|
}
|
|
1393
|
-
|
|
1394
1160
|
}
|
|
1395
|
-
|
|
1396
1161
|
_defineProperty(Powerbar, "TYPE", 'powerbar');
|
|
1397
|
-
|
|
1398
1162
|
_defineProperty(Powerbar, "STATE_STARTED", Poll.STATE_STARTED);
|
|
1399
|
-
|
|
1400
1163
|
_defineProperty(Powerbar, "STATE_CLOSED", Poll.STATE_CLOSED);
|
|
1401
|
-
|
|
1402
1164
|
_defineProperty(Powerbar, "ON_VOLUME_UPDATE", 'volume');
|
|
1403
|
-
|
|
1404
1165
|
_defineProperty(Powerbar, "ON_VOTE", Poll.ON_VOTE);
|
|
1405
|
-
|
|
1406
1166
|
_defineProperty(Powerbar, "ON_RESULTS", Poll.ON_RESULTS);
|
|
1407
|
-
|
|
1408
1167
|
_defineProperty(Powerbar, "ON_STATE_CHANGE", Poll.ON_STATE_CHANGE);
|
|
1409
1168
|
|
|
1410
1169
|
var REVEAL_RESULTS_ON_VOTE = 'vote';
|
|
@@ -1413,56 +1172,45 @@ var REVEAL_RESULTS_ON_EVENT_END = 'event_end';
|
|
|
1413
1172
|
var REVEAL_RESULTS_MANUALLY = 'manual';
|
|
1414
1173
|
var REVEAL_RESULTS_NEVER = 'never';
|
|
1415
1174
|
var REVEAL_RESULTS_ALWAYS = 'always';
|
|
1416
|
-
|
|
1417
1175
|
var Revealable = superclass => class extends superclass {
|
|
1418
1176
|
setResults() {
|
|
1419
1177
|
super.setResults(...arguments);
|
|
1420
1178
|
}
|
|
1421
|
-
|
|
1422
1179
|
setResultsPerSource() {
|
|
1423
1180
|
if (this.canReveal()) {
|
|
1424
1181
|
super.setResultsPerSource(...arguments);
|
|
1425
1182
|
}
|
|
1426
1183
|
}
|
|
1427
|
-
|
|
1428
1184
|
canReveal() {
|
|
1429
1185
|
switch (this.revealResultsMode) {
|
|
1430
1186
|
case REVEAL_RESULTS_ON_VOTE:
|
|
1431
1187
|
return this.hasUserVoted() || this.isClosed();
|
|
1432
|
-
|
|
1433
1188
|
case REVEAL_RESULTS_ON_CLOSE:
|
|
1434
1189
|
return this.isClosed();
|
|
1435
|
-
|
|
1436
1190
|
case REVEAL_RESULTS_ON_EVENT_END:
|
|
1437
1191
|
case REVEAL_RESULTS_MANUALLY:
|
|
1438
1192
|
case REVEAL_RESULTS_ALWAYS:
|
|
1439
1193
|
// assume that method is called upon setting results
|
|
1440
1194
|
return true;
|
|
1441
|
-
|
|
1442
1195
|
case REVEAL_RESULTS_NEVER:
|
|
1443
1196
|
return false;
|
|
1444
|
-
|
|
1445
1197
|
default:
|
|
1446
1198
|
return false;
|
|
1447
1199
|
}
|
|
1448
1200
|
}
|
|
1449
|
-
|
|
1450
1201
|
constructor(config) {
|
|
1451
1202
|
super(config);
|
|
1452
1203
|
this.revealResultsMode = config.data.reveal_results_mode || REVEAL_RESULTS_ON_VOTE;
|
|
1453
1204
|
}
|
|
1454
|
-
|
|
1455
1205
|
};
|
|
1456
1206
|
|
|
1457
1207
|
var MultiVotable = superclass => class extends superclass {
|
|
1458
1208
|
getMaxVotesPerUser() {
|
|
1459
1209
|
return this.maxVotesPerUser;
|
|
1460
1210
|
}
|
|
1461
|
-
|
|
1462
1211
|
getMaxVotesPerOption() {
|
|
1463
1212
|
return this.maxVotesPerOption;
|
|
1464
1213
|
}
|
|
1465
|
-
|
|
1466
1214
|
vote(votes) {
|
|
1467
1215
|
var indices = Object.keys(votes);
|
|
1468
1216
|
var maxPerUser = this.getMaxVotesPerUser();
|
|
@@ -1472,61 +1220,49 @@ var MultiVotable = superclass => class extends superclass {
|
|
|
1472
1220
|
var hasNonIntVote = indices.some(idx => parseInt(votes[idx], 10) !== votes[idx]);
|
|
1473
1221
|
var exceedsMaxPerOption = indices.find(idx => votes[idx] > maxPerOption);
|
|
1474
1222
|
var exceedsMaxPerUser = total > maxPerUser;
|
|
1475
|
-
|
|
1476
1223
|
if (hasEmptyVote) {
|
|
1477
1224
|
console.warn("Can't vote because one of the vote is equal or less than 0");
|
|
1478
1225
|
return false;
|
|
1479
1226
|
}
|
|
1480
|
-
|
|
1481
1227
|
if (hasNonIntVote) {
|
|
1482
1228
|
console.warn("Can't vote because all votes must be integers");
|
|
1483
1229
|
return false;
|
|
1484
1230
|
}
|
|
1485
|
-
|
|
1486
1231
|
if (exceedsMaxPerOption) {
|
|
1487
1232
|
console.warn('poll:%s option:%s exceeds allowed maximum:%s', this.getFullId(), +exceedsMaxPerOption + 1, maxPerOption);
|
|
1488
1233
|
return false;
|
|
1489
1234
|
}
|
|
1490
|
-
|
|
1491
1235
|
if (exceedsMaxPerUser) {
|
|
1492
1236
|
console.warn('poll:%s votes:%s exceeds allowed maximum:%s', this.getFullId(), total, maxPerUser);
|
|
1493
1237
|
return false;
|
|
1494
1238
|
}
|
|
1495
|
-
|
|
1496
1239
|
if (total === 0) {
|
|
1497
1240
|
console.warn("Votes can't be empty");
|
|
1498
1241
|
return false;
|
|
1499
1242
|
}
|
|
1500
|
-
|
|
1501
1243
|
return super.vote(votes);
|
|
1502
1244
|
}
|
|
1503
|
-
|
|
1504
1245
|
constructor(config) {
|
|
1505
1246
|
super(config);
|
|
1506
1247
|
this.maxVotesPerUser = config.data.max_votes_per_user;
|
|
1507
1248
|
this.maxVotesPerOption = config.data.max_votes_per_option;
|
|
1508
1249
|
}
|
|
1509
|
-
|
|
1510
1250
|
};
|
|
1511
1251
|
|
|
1512
1252
|
class Quiz extends Revealable(MultiVotable(Poll)) {
|
|
1513
1253
|
isClosed() {
|
|
1514
1254
|
return this.isStopped() || this.isRevealed();
|
|
1515
1255
|
}
|
|
1516
|
-
|
|
1517
1256
|
isStopped() {
|
|
1518
1257
|
return this.state === Quiz.STATE_STOPPED;
|
|
1519
1258
|
}
|
|
1520
|
-
|
|
1521
1259
|
isRevealed() {
|
|
1522
1260
|
return this.state === Quiz.STATE_REVEALED;
|
|
1523
1261
|
}
|
|
1524
|
-
|
|
1525
1262
|
reveal(idx) {
|
|
1526
1263
|
this.correctOption = idx;
|
|
1527
1264
|
this.setState(Quiz.STATE_REVEALED);
|
|
1528
1265
|
}
|
|
1529
|
-
|
|
1530
1266
|
stop(time) {
|
|
1531
1267
|
// we have to force duration calculation stop
|
|
1532
1268
|
// and force duration to 0 set because remaining
|
|
@@ -1535,104 +1271,71 @@ class Quiz extends Revealable(MultiVotable(Poll)) {
|
|
|
1535
1271
|
this.abort(time);
|
|
1536
1272
|
this.setState(Quiz.STATE_STOPPED);
|
|
1537
1273
|
}
|
|
1538
|
-
|
|
1539
1274
|
getCorrectOption() {
|
|
1540
1275
|
return this.correctOption;
|
|
1541
1276
|
}
|
|
1542
|
-
|
|
1543
1277
|
vote() {
|
|
1544
1278
|
var votes = {};
|
|
1545
|
-
|
|
1546
1279
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
1547
1280
|
args[_key] = arguments[_key];
|
|
1548
1281
|
}
|
|
1549
|
-
|
|
1550
1282
|
switch (args[0].constructor) {
|
|
1551
1283
|
case Number:
|
|
1552
1284
|
votes[args[0]] = 1;
|
|
1553
1285
|
break;
|
|
1554
|
-
|
|
1555
1286
|
case Object:
|
|
1556
1287
|
// keep as it is
|
|
1557
1288
|
votes = args[0];
|
|
1558
1289
|
break;
|
|
1559
|
-
|
|
1560
1290
|
default:
|
|
1561
1291
|
console.warn('Incorrect votes format');
|
|
1562
1292
|
return false;
|
|
1563
1293
|
}
|
|
1564
|
-
|
|
1565
1294
|
var indices = Object.keys(votes);
|
|
1566
1295
|
var hasEmptyVote = indices.some(idx => votes[idx] <= 0);
|
|
1567
1296
|
var hasNonIntVote = indices.some(idx => !(typeof votes[idx] === 'number' && Math.floor(votes[idx]) === votes[idx]));
|
|
1568
|
-
|
|
1569
1297
|
if (hasEmptyVote) {
|
|
1570
1298
|
console.warn("Can't vote because one of the vote is equal or less than 0");
|
|
1571
1299
|
return false;
|
|
1572
1300
|
}
|
|
1573
|
-
|
|
1574
1301
|
if (hasNonIntVote) {
|
|
1575
1302
|
console.warn("Can't vote because all votes must be integers");
|
|
1576
1303
|
return false;
|
|
1577
1304
|
}
|
|
1578
|
-
|
|
1579
1305
|
if (indices.length > 1) {
|
|
1580
1306
|
console.warn('Can cast vote only for one (1) option');
|
|
1581
1307
|
return false;
|
|
1582
1308
|
}
|
|
1583
|
-
|
|
1584
1309
|
return super.vote(votes);
|
|
1585
1310
|
}
|
|
1586
|
-
|
|
1587
1311
|
constructor(config) {
|
|
1588
1312
|
super(config);
|
|
1589
1313
|
this.correctOption = {}.hasOwnProperty.call(config.data, 'correct_option') ? config.data.correct_option - 1 : null;
|
|
1590
1314
|
}
|
|
1591
|
-
|
|
1592
1315
|
}
|
|
1593
|
-
|
|
1594
1316
|
_defineProperty(Quiz, "ON_VOTE", Poll.ON_VOTE);
|
|
1595
|
-
|
|
1596
1317
|
_defineProperty(Quiz, "ON_STATE_CHANGE", Poll.ON_STATE_CHANGE);
|
|
1597
|
-
|
|
1598
1318
|
_defineProperty(Quiz, "ON_RESULTS", Poll.ON_RESULTS);
|
|
1599
|
-
|
|
1600
1319
|
_defineProperty(Quiz, "STATE_STARTED", Poll.STATE_STARTED);
|
|
1601
|
-
|
|
1602
1320
|
_defineProperty(Quiz, "STATE_STOPPED", Poll.STATE_CLOSED);
|
|
1603
|
-
|
|
1604
1321
|
_defineProperty(Quiz, "STATE_REVEALED", 'revealed');
|
|
1605
1322
|
|
|
1606
1323
|
class Prediction extends Quiz {}
|
|
1607
|
-
|
|
1608
1324
|
_defineProperty(Prediction, "TYPE", 'prediction');
|
|
1609
|
-
|
|
1610
1325
|
_defineProperty(Prediction, "STATE_STARTED", Quiz.STATE_STARTED);
|
|
1611
|
-
|
|
1612
1326
|
_defineProperty(Prediction, "STATE_STOPPED", Quiz.STATE_STOPPED);
|
|
1613
|
-
|
|
1614
1327
|
_defineProperty(Prediction, "STATE_REVEALED", Quiz.STATE_REVEALED);
|
|
1615
|
-
|
|
1616
1328
|
_defineProperty(Prediction, "ON_VOTE", Quiz.ON_VOTE);
|
|
1617
|
-
|
|
1618
1329
|
_defineProperty(Prediction, "ON_STATE_CHANGE", Quiz.ON_STATE_CHANGE);
|
|
1619
|
-
|
|
1620
1330
|
_defineProperty(Prediction, "ON_RESULTS", Quiz.ON_RESULTS);
|
|
1621
1331
|
|
|
1622
1332
|
class Trivia extends Quiz {}
|
|
1623
|
-
|
|
1624
1333
|
_defineProperty(Trivia, "TYPE", 'trivia');
|
|
1625
|
-
|
|
1626
1334
|
_defineProperty(Trivia, "STATE_STARTED", Quiz.STATE_STARTED);
|
|
1627
|
-
|
|
1628
1335
|
_defineProperty(Trivia, "STATE_STOPPED", Quiz.STATE_STOPPED);
|
|
1629
|
-
|
|
1630
1336
|
_defineProperty(Trivia, "STATE_REVEALED", Quiz.STATE_REVEALED);
|
|
1631
|
-
|
|
1632
1337
|
_defineProperty(Trivia, "ON_VOTE", Quiz.ON_VOTE);
|
|
1633
|
-
|
|
1634
1338
|
_defineProperty(Trivia, "ON_STATE_CHANGE", Quiz.ON_STATE_CHANGE);
|
|
1635
|
-
|
|
1636
1339
|
_defineProperty(Trivia, "ON_RESULTS", Quiz.ON_RESULTS);
|
|
1637
1340
|
|
|
1638
1341
|
class Diametric extends Poll {
|
|
@@ -1640,235 +1343,183 @@ class Diametric extends Poll {
|
|
|
1640
1343
|
if (this.votedFor === null) {
|
|
1641
1344
|
return null;
|
|
1642
1345
|
}
|
|
1643
|
-
|
|
1644
1346
|
return Math.floor(this.votedFor / Diametric.MAX_STRENGTH);
|
|
1645
1347
|
}
|
|
1646
|
-
|
|
1647
1348
|
getUserVoteStrength() {
|
|
1648
1349
|
if (this.votedFor === null) {
|
|
1649
1350
|
return null;
|
|
1650
1351
|
}
|
|
1651
|
-
|
|
1652
1352
|
return this.votedFor % Diametric.MAX_STRENGTH + 1;
|
|
1653
1353
|
}
|
|
1654
|
-
|
|
1655
1354
|
setResults(results) {
|
|
1656
1355
|
results = this.calculateWeightedResults(results);
|
|
1657
1356
|
super.setResults(results);
|
|
1658
1357
|
}
|
|
1659
|
-
|
|
1660
1358
|
setResultsPerSource(results) {
|
|
1661
1359
|
results.forEach(source => {
|
|
1662
1360
|
source.results = this.calculateWeightedResults(source.results);
|
|
1663
1361
|
}, this);
|
|
1664
1362
|
super.setResultsPerSource(results);
|
|
1665
1363
|
}
|
|
1666
|
-
|
|
1667
1364
|
calculateWeightedResults(results) {
|
|
1668
|
-
var max = Diametric.MAX_STRENGTH;
|
|
1365
|
+
var max = Diametric.MAX_STRENGTH;
|
|
1669
1366
|
|
|
1367
|
+
// calculate weighted results
|
|
1670
1368
|
var weighted = [0, 0];
|
|
1671
|
-
|
|
1672
1369
|
for (var i = 0; i < max; i++) {
|
|
1673
1370
|
if (results[i]) {
|
|
1674
1371
|
weighted[0] += (i + 1) * results[i];
|
|
1675
1372
|
}
|
|
1676
|
-
|
|
1677
1373
|
if (results[i + max]) {
|
|
1678
1374
|
weighted[1] += (i + 1) * results[i + max];
|
|
1679
1375
|
}
|
|
1680
1376
|
}
|
|
1681
|
-
|
|
1682
1377
|
return weighted;
|
|
1683
1378
|
}
|
|
1684
|
-
|
|
1685
1379
|
vote(optionIdx, strength) {
|
|
1686
1380
|
var min = Diametric.MIN_STRENGTH;
|
|
1687
1381
|
var max = Diametric.MAX_STRENGTH;
|
|
1688
1382
|
var options = this.getOptions();
|
|
1689
|
-
|
|
1690
1383
|
if (typeof optionIdx === 'undefined') {
|
|
1691
1384
|
console.warn('Vote option is not set');
|
|
1692
1385
|
return;
|
|
1693
1386
|
}
|
|
1694
|
-
|
|
1695
1387
|
if (typeof strength === 'undefined') {
|
|
1696
1388
|
console.warn('Vote strength is not set');
|
|
1697
1389
|
return;
|
|
1698
1390
|
}
|
|
1699
|
-
|
|
1700
1391
|
if (strength < min) {
|
|
1701
1392
|
console.warn("Can't vote for the option %s with strength %s that is " + 'less than minimum allowed strength %s', optionIdx, strength, min);
|
|
1702
1393
|
return;
|
|
1703
1394
|
}
|
|
1704
|
-
|
|
1705
1395
|
if (strength > max) {
|
|
1706
1396
|
console.warn("Can't vote for the option %s with strength %s that is " + 'more than maximum allowed strength %s', optionIdx, strength, max);
|
|
1707
1397
|
return;
|
|
1708
1398
|
}
|
|
1709
|
-
|
|
1710
1399
|
if (optionIdx < 0 || optionIdx > options.length - 1) {
|
|
1711
1400
|
console.warn("Can't vote for inexistent option with idx %s", optionIdx);
|
|
1712
1401
|
return;
|
|
1713
1402
|
}
|
|
1714
|
-
|
|
1715
1403
|
var vote = optionIdx * max + strength - 1;
|
|
1716
1404
|
super.vote(vote);
|
|
1717
1405
|
}
|
|
1718
|
-
|
|
1719
1406
|
isResultsRevealed() {
|
|
1720
1407
|
return true;
|
|
1721
1408
|
}
|
|
1722
|
-
|
|
1723
1409
|
}
|
|
1724
|
-
|
|
1725
1410
|
_defineProperty(Diametric, "MIN_STRENGTH", 1);
|
|
1726
|
-
|
|
1727
1411
|
_defineProperty(Diametric, "MAX_STRENGTH", 5);
|
|
1728
|
-
|
|
1729
1412
|
_defineProperty(Diametric, "STATE_STARTED", Poll.STATE_STARTED);
|
|
1730
|
-
|
|
1731
1413
|
_defineProperty(Diametric, "STATE_CLOSED", Poll.STATE_CLOSED);
|
|
1732
1414
|
|
|
1733
1415
|
class Swing extends Diametric {}
|
|
1734
|
-
|
|
1735
1416
|
_defineProperty(Swing, "TYPE", 'dpoll');
|
|
1736
|
-
|
|
1737
1417
|
_defineProperty(Swing, "STATE_STARTED", Diametric.STATE_STARTED);
|
|
1738
|
-
|
|
1739
1418
|
_defineProperty(Swing, "STATE_CLOSED", Diametric.STATE_CLOSED);
|
|
1740
1419
|
|
|
1741
1420
|
class Emoting extends Fadeable(Diametric) {}
|
|
1742
|
-
|
|
1743
1421
|
_defineProperty(Emoting, "TYPE", 'emo');
|
|
1744
|
-
|
|
1745
1422
|
_defineProperty(Emoting, "STATE_STARTED", Diametric.STATE_STARTED);
|
|
1746
|
-
|
|
1747
1423
|
_defineProperty(Emoting, "STATE_CLOSED", Diametric.STATE_CLOSED);
|
|
1748
1424
|
|
|
1749
1425
|
class Regular extends Revealable(MultiVotable(Poll)) {
|
|
1750
1426
|
getQualifyingHashtags() {
|
|
1751
1427
|
return this.qualifyingHashtags;
|
|
1752
1428
|
}
|
|
1753
|
-
|
|
1754
1429
|
getMinOptionsPerVote() {
|
|
1755
1430
|
return this.minOptionsPerVote;
|
|
1756
1431
|
}
|
|
1757
|
-
|
|
1758
1432
|
getMaxOptionsPerVote() {
|
|
1759
1433
|
return this.maxOptionsPerVote;
|
|
1760
1434
|
}
|
|
1761
|
-
|
|
1762
1435
|
vote() {
|
|
1763
1436
|
var votes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1764
1437
|
var min = this.getMinOptionsPerVote();
|
|
1765
1438
|
var max = this.getMaxOptionsPerVote();
|
|
1766
1439
|
var indices = Object.keys(votes);
|
|
1767
|
-
|
|
1768
1440
|
if (indices.length < min) {
|
|
1769
1441
|
console.warn("Count of options (%s) can't be less than minimum options per vote (%s)", indices.length, min);
|
|
1770
1442
|
return false;
|
|
1771
1443
|
}
|
|
1772
|
-
|
|
1773
1444
|
if (indices.length > max) {
|
|
1774
1445
|
console.warn("Count of options (%s) can't be more than maximum options per vote (%s)", indices.length, max);
|
|
1775
1446
|
return false;
|
|
1776
1447
|
}
|
|
1777
|
-
|
|
1778
1448
|
return super.vote(votes);
|
|
1779
1449
|
}
|
|
1780
|
-
|
|
1781
1450
|
constructor(config) {
|
|
1782
1451
|
super(config);
|
|
1783
1452
|
this.qualifyingHashtags = config.data.qualifying_hashtags;
|
|
1784
1453
|
this.minOptionsPerVote = config.data.min_options_per_vote;
|
|
1785
1454
|
this.maxOptionsPerVote = config.data.max_options_per_vote;
|
|
1786
1455
|
}
|
|
1787
|
-
|
|
1788
1456
|
}
|
|
1789
|
-
|
|
1790
1457
|
_defineProperty(Regular, "TYPE", 'rpoll');
|
|
1791
|
-
|
|
1792
1458
|
_defineProperty(Regular, "STATE_STARTED", Poll.STATE_STARTED);
|
|
1793
|
-
|
|
1794
1459
|
_defineProperty(Regular, "STATE_CLOSED", Poll.STATE_CLOSED);
|
|
1795
|
-
|
|
1796
1460
|
_defineProperty(Regular, "ON_VOTE", Poll.ON_VOTE);
|
|
1797
|
-
|
|
1798
1461
|
_defineProperty(Regular, "ON_RESULTS", Poll.ON_RESULTS);
|
|
1799
|
-
|
|
1800
1462
|
_defineProperty(Regular, "ON_STATE_CHANGE", Poll.ON_STATE_CHANGE);
|
|
1801
1463
|
|
|
1802
1464
|
class FlexiPoll extends Regular {}
|
|
1803
|
-
|
|
1804
1465
|
_defineProperty(FlexiPoll, "TYPE", 'poll');
|
|
1805
|
-
|
|
1806
1466
|
_defineProperty(FlexiPoll, "STATE_STARTED", Regular.STATE_STARTED);
|
|
1807
|
-
|
|
1808
1467
|
_defineProperty(FlexiPoll, "STATE_CLOSED", Regular.STATE_CLOSED);
|
|
1809
|
-
|
|
1810
1468
|
_defineProperty(FlexiPoll, "ON_VOTE", Regular.ON_VOTE);
|
|
1811
|
-
|
|
1812
1469
|
_defineProperty(FlexiPoll, "ON_RESULTS", Regular.ON_RESULTS);
|
|
1813
|
-
|
|
1814
1470
|
_defineProperty(FlexiPoll, "ON_STATE_CHANGE", Regular.ON_STATE_CHANGE);
|
|
1815
1471
|
|
|
1472
|
+
var _PollFactory;
|
|
1816
1473
|
class PollFactory extends FrameFactory {
|
|
1817
1474
|
vote(enmasseId, vote) {
|
|
1818
1475
|
var poll = this.getByEnmasseId(enmasseId);
|
|
1819
1476
|
var args = [enmasseId, vote, ''];
|
|
1820
1477
|
Enmasse.send(poll._channel, 'v', args);
|
|
1821
1478
|
}
|
|
1822
|
-
|
|
1823
1479
|
processMessages() {
|
|
1824
1480
|
var i = 0;
|
|
1825
|
-
var message;
|
|
1481
|
+
var message;
|
|
1826
1482
|
|
|
1483
|
+
// loop through the loop and process each item
|
|
1827
1484
|
while (i < this.messages.length) {
|
|
1828
|
-
message = this.messages[i];
|
|
1485
|
+
message = this.messages[i];
|
|
1829
1486
|
|
|
1487
|
+
// trying to find existent instance
|
|
1830
1488
|
var enmasseId = parseInt(message.body[0], 10);
|
|
1831
|
-
var poll = this.getByEnmasseId(enmasseId);
|
|
1489
|
+
var poll = this.getByEnmasseId(enmasseId);
|
|
1832
1490
|
|
|
1491
|
+
// if poll doesn't exist
|
|
1833
1492
|
if (!poll) {
|
|
1834
1493
|
i++;
|
|
1835
1494
|
continue;
|
|
1836
1495
|
}
|
|
1496
|
+
this.instances[poll.getId()]._channel = message.channel;
|
|
1837
1497
|
|
|
1838
|
-
|
|
1839
|
-
|
|
1498
|
+
// remove processed item from the queue
|
|
1840
1499
|
this.messages.splice(i, 1);
|
|
1841
|
-
|
|
1842
1500
|
switch (message.klass) {
|
|
1843
1501
|
case PollFactory.MSG_CLASS_POLL:
|
|
1844
1502
|
this.processPollMessage(poll, message);
|
|
1845
1503
|
break;
|
|
1846
|
-
|
|
1847
1504
|
case PollFactory.MSG_CLASS_FB:
|
|
1848
1505
|
this.processFeedbackMessage(poll, message);
|
|
1849
1506
|
break;
|
|
1850
|
-
|
|
1851
1507
|
case PollFactory.MSG_CLASS_STOP:
|
|
1852
1508
|
this.processStopMessage(poll, message);
|
|
1853
1509
|
break;
|
|
1854
|
-
|
|
1855
1510
|
case PollFactory.MSG_CLASS_REVEAL:
|
|
1856
1511
|
this.processRevealMessage(poll, message);
|
|
1857
1512
|
break;
|
|
1858
1513
|
}
|
|
1859
1514
|
}
|
|
1860
1515
|
}
|
|
1861
|
-
/* eslint-disable no-unused-vars */
|
|
1862
|
-
|
|
1863
1516
|
|
|
1864
|
-
|
|
1865
|
-
/* , message */
|
|
1866
|
-
) {
|
|
1517
|
+
/* eslint-disable no-unused-vars */
|
|
1518
|
+
processPollMessage(poll /* , message */) {
|
|
1867
1519
|
poll.finalize();
|
|
1868
1520
|
}
|
|
1869
1521
|
/* eslint-enable no-unused-vars */
|
|
1870
1522
|
|
|
1871
|
-
|
|
1872
1523
|
processFeedbackMessage(poll, message) {
|
|
1873
1524
|
var hasSource = !!message.body[2];
|
|
1874
1525
|
var hasCounters = !!message.body[3];
|
|
@@ -1876,15 +1527,15 @@ class PollFactory extends FrameFactory {
|
|
|
1876
1527
|
var sources = hasSource ? message.body[2].split(':') : [];
|
|
1877
1528
|
var counters = hasCounters ? message.body[3].split(':') : [];
|
|
1878
1529
|
var results = [];
|
|
1879
|
-
var resultsPerSource = [];
|
|
1530
|
+
var resultsPerSource = [];
|
|
1880
1531
|
|
|
1532
|
+
// converting counters to integer
|
|
1881
1533
|
counters = counters.map(counter => +counter);
|
|
1882
1534
|
counters.forEach((counter, i) => {
|
|
1883
1535
|
var total = counters.length / (sources.length / 2);
|
|
1884
1536
|
var idx = i % total;
|
|
1885
1537
|
results[idx] = +counter + (results[idx] || 0);
|
|
1886
1538
|
});
|
|
1887
|
-
|
|
1888
1539
|
for (var i = 0, l = sources.length / 2; i < l; i++) {
|
|
1889
1540
|
var total = counters.length / (sources.length / 2);
|
|
1890
1541
|
resultsPerSource.push({
|
|
@@ -1893,22 +1544,19 @@ class PollFactory extends FrameFactory {
|
|
|
1893
1544
|
results: counters.slice(total * i, total * i + total)
|
|
1894
1545
|
});
|
|
1895
1546
|
}
|
|
1896
|
-
|
|
1897
1547
|
if (results.length > 0 || isFinal) {
|
|
1898
1548
|
poll.setResultsPerSource(resultsPerSource);
|
|
1899
1549
|
poll.setResults(results);
|
|
1900
1550
|
}
|
|
1901
1551
|
}
|
|
1902
|
-
|
|
1903
1552
|
processStopMessage(poll, message) {
|
|
1904
1553
|
poll.stop(message.body[1]);
|
|
1905
1554
|
}
|
|
1906
|
-
|
|
1907
1555
|
processRevealMessage(poll, message) {
|
|
1908
1556
|
poll.reveal(message.body[1] - 1);
|
|
1909
|
-
}
|
|
1910
|
-
|
|
1557
|
+
}
|
|
1911
1558
|
|
|
1559
|
+
// TODO: combine create() and createSnapshot() methods
|
|
1912
1560
|
create(data) {
|
|
1913
1561
|
super.create(data);
|
|
1914
1562
|
var Constructor = this.getConstructorByType(data.type);
|
|
@@ -1918,7 +1566,6 @@ class PollFactory extends FrameFactory {
|
|
|
1918
1566
|
poll.bind(Poll.ON_VOTE, this.handleVote.bind(this, poll));
|
|
1919
1567
|
return poll;
|
|
1920
1568
|
}
|
|
1921
|
-
|
|
1922
1569
|
createSnapshot(data) {
|
|
1923
1570
|
super.createSnapshot(data);
|
|
1924
1571
|
var Constructor = this.getConstructorByType(data.type);
|
|
@@ -1927,132 +1574,101 @@ class PollFactory extends FrameFactory {
|
|
|
1927
1574
|
poll.finalize();
|
|
1928
1575
|
return poll;
|
|
1929
1576
|
}
|
|
1930
|
-
|
|
1931
1577
|
setMessage(message) {
|
|
1932
1578
|
if (PollFactory.MSG_CLASSES.indexOf(message.klass) === -1) {
|
|
1933
1579
|
return;
|
|
1934
1580
|
}
|
|
1935
|
-
|
|
1936
1581
|
this.messages.push(message);
|
|
1937
1582
|
this.processMessages();
|
|
1938
1583
|
}
|
|
1939
|
-
|
|
1940
1584
|
getConstructorByType(type) {
|
|
1941
1585
|
switch (type) {
|
|
1942
1586
|
case Powerbar.TYPE:
|
|
1943
1587
|
return Powerbar;
|
|
1944
|
-
|
|
1945
1588
|
case Prediction.TYPE:
|
|
1946
1589
|
return Prediction;
|
|
1947
|
-
|
|
1948
1590
|
case Trivia.TYPE:
|
|
1949
1591
|
return Trivia;
|
|
1950
|
-
|
|
1951
1592
|
case Swing.TYPE:
|
|
1952
1593
|
return Swing;
|
|
1953
|
-
|
|
1954
1594
|
case Emoting.TYPE:
|
|
1955
1595
|
return Emoting;
|
|
1956
|
-
|
|
1957
1596
|
case Regular.TYPE:
|
|
1958
1597
|
return Regular;
|
|
1959
|
-
|
|
1960
1598
|
case FlexiPoll.TYPE:
|
|
1961
1599
|
return FlexiPoll;
|
|
1962
|
-
|
|
1963
1600
|
default:
|
|
1964
1601
|
return undefined;
|
|
1965
1602
|
}
|
|
1966
1603
|
}
|
|
1967
|
-
|
|
1968
1604
|
handleVote(instance, vote) {
|
|
1969
1605
|
var idx;
|
|
1970
1606
|
var cast = [];
|
|
1971
|
-
|
|
1972
1607
|
switch (instance.getType()) {
|
|
1973
1608
|
case Regular.TYPE:
|
|
1974
1609
|
case FlexiPoll.TYPE:
|
|
1975
1610
|
case Prediction.TYPE:
|
|
1976
1611
|
case Trivia.TYPE:
|
|
1977
1612
|
break;
|
|
1978
|
-
|
|
1979
1613
|
default:
|
|
1980
1614
|
idx = vote;
|
|
1981
1615
|
vote = {};
|
|
1982
1616
|
vote[idx] = 1;
|
|
1983
1617
|
break;
|
|
1984
1618
|
}
|
|
1985
|
-
|
|
1986
1619
|
for (idx in vote) {
|
|
1987
1620
|
if ({}.hasOwnProperty.call(vote, idx)) {
|
|
1988
1621
|
cast = cast.concat([+idx + 1, vote[idx]]);
|
|
1989
1622
|
}
|
|
1990
1623
|
}
|
|
1991
|
-
|
|
1992
1624
|
this.vote(instance.getEnmasseId(), cast.join(':'));
|
|
1993
1625
|
}
|
|
1994
|
-
|
|
1995
1626
|
constructor() {
|
|
1996
|
-
super();
|
|
1627
|
+
super();
|
|
1997
1628
|
|
|
1629
|
+
// a queue of messages on poll's channel
|
|
1998
1630
|
this.messages = [];
|
|
1999
1631
|
}
|
|
2000
|
-
|
|
2001
1632
|
}
|
|
2002
|
-
|
|
1633
|
+
_PollFactory = PollFactory;
|
|
2003
1634
|
_defineProperty(PollFactory, "MSG_CLASS_POLL", 'p');
|
|
2004
|
-
|
|
2005
1635
|
_defineProperty(PollFactory, "MSG_CLASS_FB", 'fb');
|
|
2006
|
-
|
|
2007
1636
|
_defineProperty(PollFactory, "MSG_CLASS_STOP", 'stop');
|
|
2008
|
-
|
|
2009
1637
|
_defineProperty(PollFactory, "MSG_CLASS_REVEAL", 'reveal');
|
|
2010
|
-
|
|
2011
|
-
_defineProperty(PollFactory, "MSG_CLASSES", [PollFactory.MSG_CLASS_POLL, PollFactory.MSG_CLASS_FB, PollFactory.MSG_CLASS_STOP, PollFactory.MSG_CLASS_REVEAL]);
|
|
1638
|
+
_defineProperty(PollFactory, "MSG_CLASSES", [_PollFactory.MSG_CLASS_POLL, _PollFactory.MSG_CLASS_FB, _PollFactory.MSG_CLASS_STOP, _PollFactory.MSG_CLASS_REVEAL]);
|
|
2012
1639
|
|
|
2013
1640
|
class Data extends Frame {
|
|
2014
1641
|
getState() {
|
|
2015
1642
|
return this.state;
|
|
2016
1643
|
}
|
|
2017
|
-
|
|
2018
1644
|
setState(state) {
|
|
2019
1645
|
// do not fire state change if passed state is the same as it was
|
|
2020
1646
|
if (state === this.state) {
|
|
2021
1647
|
return;
|
|
2022
1648
|
}
|
|
2023
|
-
|
|
2024
1649
|
this.state = state;
|
|
2025
1650
|
this.trigger(Data.ON_STATE_CHANGE, state);
|
|
2026
1651
|
}
|
|
2027
|
-
|
|
2028
1652
|
updateDurationLeft() {
|
|
2029
1653
|
super.updateDurationLeft();
|
|
2030
|
-
|
|
2031
1654
|
if (this.durationLeft > 0) {
|
|
2032
1655
|
this.setState(Data.STATE_STARTED);
|
|
2033
1656
|
} else {
|
|
2034
1657
|
this.setState(Data.STATE_CLOSED);
|
|
2035
1658
|
}
|
|
2036
1659
|
}
|
|
2037
|
-
|
|
2038
1660
|
update() {
|
|
2039
1661
|
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
2040
1662
|
super.update(config);
|
|
2041
1663
|
this.publishedAt = config.published_at - 0 || 0;
|
|
2042
|
-
|
|
2043
1664
|
if (this.fixed) {
|
|
2044
1665
|
this.updateDurationLeft();
|
|
2045
1666
|
}
|
|
2046
1667
|
}
|
|
2047
|
-
|
|
2048
1668
|
}
|
|
2049
|
-
|
|
2050
1669
|
_defineProperty(Data, "TYPE", 'data');
|
|
2051
|
-
|
|
2052
1670
|
_defineProperty(Data, "STATE_STARTED", 'started');
|
|
2053
|
-
|
|
2054
1671
|
_defineProperty(Data, "STATE_CLOSED", 'closed');
|
|
2055
|
-
|
|
2056
1672
|
_defineProperty(Data, "ON_STATE_CHANGE", 'state');
|
|
2057
1673
|
|
|
2058
1674
|
class DataFactory extends FrameFactory {
|
|
@@ -2063,35 +1679,28 @@ class DataFactory extends FrameFactory {
|
|
|
2063
1679
|
this.instances[data.id] = element;
|
|
2064
1680
|
return element;
|
|
2065
1681
|
}
|
|
2066
|
-
|
|
2067
1682
|
createSnapshot(data) {
|
|
2068
1683
|
super.createSnapshot(data);
|
|
2069
1684
|
return this.create(data);
|
|
2070
1685
|
}
|
|
2071
|
-
|
|
2072
1686
|
}
|
|
2073
1687
|
|
|
2074
1688
|
class Curation extends Entity {
|
|
2075
1689
|
getText() {
|
|
2076
1690
|
return this.text;
|
|
2077
1691
|
}
|
|
2078
|
-
|
|
2079
1692
|
getSender() {
|
|
2080
1693
|
return this.sender;
|
|
2081
1694
|
}
|
|
2082
|
-
|
|
2083
1695
|
getSenderName() {
|
|
2084
1696
|
return this.senderName;
|
|
2085
1697
|
}
|
|
2086
|
-
|
|
2087
1698
|
getSenderPicure() {
|
|
2088
1699
|
return this.senderPicture;
|
|
2089
1700
|
}
|
|
2090
|
-
|
|
2091
1701
|
getSource() {
|
|
2092
1702
|
return this.source;
|
|
2093
1703
|
}
|
|
2094
|
-
|
|
2095
1704
|
constructor(config) {
|
|
2096
1705
|
super(config);
|
|
2097
1706
|
this.text = config.data.text;
|
|
@@ -2100,11 +1709,8 @@ class Curation extends Entity {
|
|
|
2100
1709
|
this.senderPicture = config.data.sender_picture;
|
|
2101
1710
|
this.source = config.data.source;
|
|
2102
1711
|
}
|
|
2103
|
-
|
|
2104
1712
|
}
|
|
2105
|
-
|
|
2106
1713
|
_defineProperty(Curation, "TYPE", 'curation');
|
|
2107
|
-
|
|
2108
1714
|
_defineProperty(Curation, "SOURCE_TWITTER", 'twitter');
|
|
2109
1715
|
|
|
2110
1716
|
class CurationFactory extends Base {
|
|
@@ -2114,71 +1720,48 @@ class CurationFactory extends Base {
|
|
|
2114
1720
|
this.instances[data.id] = curation;
|
|
2115
1721
|
return curation;
|
|
2116
1722
|
}
|
|
2117
|
-
|
|
2118
1723
|
createSnapshot(data) {
|
|
2119
1724
|
super.createSnapshot(data);
|
|
2120
1725
|
return this.create(data);
|
|
2121
1726
|
}
|
|
2122
|
-
|
|
2123
1727
|
}
|
|
2124
1728
|
|
|
2125
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
2126
|
-
|
|
2127
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
2128
|
-
|
|
2129
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
2130
1729
|
var Factories = (() => {
|
|
2131
1730
|
var self = {};
|
|
2132
1731
|
var channels = {};
|
|
2133
1732
|
var factories = [];
|
|
2134
|
-
var factoriesByChannel = {};
|
|
1733
|
+
var factoriesByChannel = {};
|
|
2135
1734
|
|
|
1735
|
+
// Hash of factories instances keyed on frame type.
|
|
2136
1736
|
self.items = {};
|
|
2137
|
-
|
|
2138
1737
|
var handleMessage = msg => {
|
|
2139
1738
|
// console.log("Factories::handleMessage", msg);
|
|
1739
|
+
|
|
2140
1740
|
// get factory by channel id
|
|
2141
1741
|
var factory = getFactoryByChannel(msg.channel);
|
|
2142
|
-
|
|
2143
1742
|
if (factory !== null) {
|
|
2144
1743
|
factory.setMessage(msg);
|
|
2145
1744
|
}
|
|
2146
|
-
|
|
2147
1745
|
return null;
|
|
2148
1746
|
};
|
|
2149
|
-
|
|
2150
1747
|
var getFactoryByChannel = channel => {
|
|
2151
1748
|
for (var key in channels) {
|
|
2152
1749
|
if ({}.hasOwnProperty.call(channels, key) && channels[key] === channel) {
|
|
2153
1750
|
return factoriesByChannel[key] || null;
|
|
2154
1751
|
}
|
|
2155
1752
|
}
|
|
2156
|
-
|
|
2157
1753
|
return null;
|
|
2158
1754
|
};
|
|
2159
|
-
|
|
2160
1755
|
self.destroyInstances = () => {
|
|
2161
|
-
var
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
try {
|
|
2165
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
2166
|
-
var factory = _step.value;
|
|
2167
|
-
factory.destroyInstances();
|
|
2168
|
-
}
|
|
2169
|
-
} catch (err) {
|
|
2170
|
-
_iterator.e(err);
|
|
2171
|
-
} finally {
|
|
2172
|
-
_iterator.f();
|
|
1756
|
+
for (var _i = 0, _factories = factories; _i < _factories.length; _i++) {
|
|
1757
|
+
var factory = _factories[_i];
|
|
1758
|
+
factory.destroyInstances();
|
|
2173
1759
|
}
|
|
2174
1760
|
};
|
|
2175
|
-
|
|
2176
1761
|
self.setChannels = ch => {
|
|
2177
1762
|
channels = ch;
|
|
2178
1763
|
};
|
|
2179
|
-
|
|
2180
1764
|
self.get = type => self.items[type];
|
|
2181
|
-
|
|
2182
1765
|
self.init = () => {
|
|
2183
1766
|
var data = [{
|
|
2184
1767
|
Constructor: PollFactory,
|
|
@@ -2196,68 +1779,58 @@ var Factories = (() => {
|
|
|
2196
1779
|
data.forEach(item => {
|
|
2197
1780
|
var factory = new item.Constructor();
|
|
2198
1781
|
factories.push(factory);
|
|
2199
|
-
|
|
2200
1782
|
if (item.channel !== null) {
|
|
2201
1783
|
factoriesByChannel[item.channel] = factory;
|
|
2202
1784
|
}
|
|
2203
|
-
|
|
2204
1785
|
item.types.forEach(type => {
|
|
2205
1786
|
self.items[type] = factory;
|
|
2206
1787
|
});
|
|
2207
1788
|
});
|
|
2208
1789
|
ConnectionAdaptor.bind(ConnectionAdaptor.ON_MESSAGE, handleMessage);
|
|
2209
1790
|
};
|
|
2210
|
-
|
|
2211
1791
|
return self;
|
|
2212
1792
|
})();
|
|
2213
1793
|
|
|
1794
|
+
// Listens on control channel for create and delete messages.
|
|
2214
1795
|
// Constructor takes main control channel id. No methods.
|
|
2215
|
-
|
|
2216
1796
|
function Control(config) {
|
|
2217
1797
|
config = config || {};
|
|
2218
1798
|
var self = this;
|
|
2219
1799
|
var _config = config,
|
|
2220
|
-
|
|
1800
|
+
channel = _config.channel;
|
|
2221
1801
|
this.trigger = this.emit;
|
|
2222
1802
|
this.bind = this.on;
|
|
2223
1803
|
this.unbind = this.off;
|
|
2224
|
-
|
|
2225
1804
|
var handleMessage = message => {
|
|
2226
1805
|
// channel and type should match settings
|
|
2227
1806
|
if (message.channel !== channel) {
|
|
2228
1807
|
return;
|
|
2229
1808
|
}
|
|
2230
|
-
|
|
2231
1809
|
switch (message.klass) {
|
|
2232
1810
|
case Control.MSG_TYPE_CREATE:
|
|
2233
1811
|
handleMessageCreate(message);
|
|
2234
1812
|
break;
|
|
2235
|
-
|
|
2236
1813
|
case Control.MSG_TYPE_REVOKE:
|
|
2237
1814
|
handleMessageRevoke(message);
|
|
2238
1815
|
break;
|
|
2239
1816
|
}
|
|
2240
1817
|
};
|
|
2241
|
-
|
|
2242
1818
|
var handleEOC = _channel => {
|
|
2243
1819
|
// channel and type should match settings
|
|
2244
1820
|
if (_channel !== channel) {
|
|
2245
1821
|
return;
|
|
2246
1822
|
}
|
|
2247
|
-
|
|
2248
1823
|
self.trigger(Control.MSG_TYPE_EOC);
|
|
2249
1824
|
};
|
|
2250
|
-
|
|
2251
1825
|
var handleMessageCreate = message => {
|
|
2252
1826
|
var data = JSON.parse(message.body[0]);
|
|
2253
1827
|
var factory = Factories.get(data.type);
|
|
2254
|
-
|
|
2255
1828
|
if (typeof factory === 'undefined') {
|
|
2256
1829
|
return;
|
|
2257
1830
|
}
|
|
1831
|
+
var instance = factory.get(data.id);
|
|
2258
1832
|
|
|
2259
|
-
|
|
2260
|
-
|
|
1833
|
+
// secure runtime against broken data
|
|
2261
1834
|
try {
|
|
2262
1835
|
if (instance) {
|
|
2263
1836
|
self.update(data);
|
|
@@ -2268,55 +1841,45 @@ function Control(config) {
|
|
|
2268
1841
|
console.error(e);
|
|
2269
1842
|
}
|
|
2270
1843
|
};
|
|
2271
|
-
|
|
2272
1844
|
var handleMessageRevoke = message => {
|
|
2273
1845
|
var data = JSON.parse(message.body[0]);
|
|
2274
1846
|
self.revoke(data);
|
|
2275
1847
|
};
|
|
2276
|
-
|
|
2277
1848
|
self.create = data => {
|
|
2278
1849
|
var factory = Factories.get(data.type);
|
|
2279
|
-
var instance = factory.create(data);
|
|
1850
|
+
var instance = factory.create(data);
|
|
2280
1851
|
|
|
1852
|
+
// trigger MSG_TYPE_CREATE only if instance is finalized
|
|
2281
1853
|
Deferred.when(instance.finalized).done(() => {
|
|
2282
1854
|
self.trigger(Control.MSG_TYPE_CREATE, instance);
|
|
2283
1855
|
});
|
|
2284
1856
|
};
|
|
2285
|
-
|
|
2286
1857
|
self.update = data => {
|
|
2287
1858
|
var factory = Factories.get(data.type);
|
|
2288
1859
|
var instance = factory.get(data.id);
|
|
2289
1860
|
factory.update(instance, data);
|
|
2290
1861
|
self.trigger(Control.MSG_TYPE_UPDATE, instance);
|
|
2291
1862
|
};
|
|
2292
|
-
|
|
2293
1863
|
self.revoke = data => {
|
|
2294
1864
|
var factory = Factories.get(data.type);
|
|
2295
|
-
|
|
2296
1865
|
if (typeof factory === 'undefined') {
|
|
2297
1866
|
return;
|
|
2298
1867
|
}
|
|
2299
|
-
|
|
2300
1868
|
var instance = factory.get(data.id);
|
|
2301
|
-
|
|
2302
1869
|
if (!instance) {
|
|
2303
1870
|
return;
|
|
2304
1871
|
}
|
|
2305
|
-
|
|
2306
1872
|
factory.revoke(data.id);
|
|
2307
1873
|
self.trigger(Control.MSG_TYPE_REVOKE, instance);
|
|
2308
1874
|
};
|
|
2309
|
-
|
|
2310
1875
|
self.destroy = () => {
|
|
2311
1876
|
// destroy all elements instances
|
|
2312
1877
|
Factories.destroyInstances();
|
|
2313
1878
|
ConnectionAdaptor.unbind(ConnectionAdaptor.ON_MESSAGE, handleMessage);
|
|
2314
1879
|
};
|
|
2315
|
-
|
|
2316
1880
|
ConnectionAdaptor.bind(ConnectionAdaptor.ON_MESSAGE, handleMessage);
|
|
2317
1881
|
ConnectionAdaptor.bind(ConnectionAdaptor.ON_EOC, handleEOC);
|
|
2318
1882
|
}
|
|
2319
|
-
|
|
2320
1883
|
Control.prototype = assignIn(Control.prototype, new Emitter());
|
|
2321
1884
|
Control.MSG_TYPE_CREATE = 'create';
|
|
2322
1885
|
Control.MSG_TYPE_UPDATE = 'update';
|
|
@@ -2336,24 +1899,24 @@ var Event = function Event(uuid) {
|
|
|
2336
1899
|
* Settings
|
|
2337
1900
|
*/
|
|
2338
1901
|
uuid = uuid || null;
|
|
1902
|
+
|
|
2339
1903
|
/*
|
|
2340
1904
|
* Private properties
|
|
2341
1905
|
*/
|
|
2342
|
-
|
|
2343
1906
|
var self = this;
|
|
2344
1907
|
var state = Event.STATE_PENDING;
|
|
2345
1908
|
var data = {};
|
|
2346
1909
|
var history = []; // list of all past and current elements in this episode
|
|
2347
|
-
|
|
2348
1910
|
var control = null;
|
|
2349
1911
|
this.trigger = this.emit;
|
|
2350
1912
|
this.bind = this.on;
|
|
2351
1913
|
this.unbind = this.off;
|
|
1914
|
+
|
|
2352
1915
|
/*
|
|
2353
1916
|
* Public properties
|
|
2354
1917
|
*/
|
|
2355
|
-
|
|
2356
1918
|
self.ready = new Deferred();
|
|
1919
|
+
|
|
2357
1920
|
/*
|
|
2358
1921
|
* Private methods
|
|
2359
1922
|
*/
|
|
@@ -2364,40 +1927,32 @@ var Event = function Event(uuid) {
|
|
|
2364
1927
|
var startAt = self.get('start_at');
|
|
2365
1928
|
var delay = self.get('__delay');
|
|
2366
1929
|
var extraTime = self.get('extra_time');
|
|
2367
|
-
|
|
2368
1930
|
var newState = (() => {
|
|
2369
1931
|
if (isDataEmpty()) {
|
|
2370
|
-
return Event.STATE_PENDING;
|
|
1932
|
+
return Event.STATE_PENDING;
|
|
1933
|
+
// flag `started` is used to determine if event is manual,
|
|
2371
1934
|
// in this case start time is ahead of current timestamp
|
|
2372
1935
|
}
|
|
2373
|
-
|
|
2374
1936
|
if (!self.get('started') || now < startAt) {
|
|
2375
1937
|
return Event.STATE_UPCOMING;
|
|
2376
1938
|
}
|
|
2377
|
-
|
|
2378
1939
|
if (now < endAt) {
|
|
2379
1940
|
return Event.STATE_ACTIVE;
|
|
2380
1941
|
}
|
|
2381
|
-
|
|
2382
1942
|
if (now < endAt - delay + extraTime) {
|
|
2383
1943
|
return Event.STATE_PROLONGED;
|
|
2384
1944
|
}
|
|
2385
|
-
|
|
2386
1945
|
return Event.STATE_FINISHED;
|
|
2387
1946
|
})();
|
|
2388
|
-
|
|
2389
1947
|
if (newState !== state) {
|
|
2390
1948
|
setState(newState);
|
|
2391
1949
|
}
|
|
2392
|
-
|
|
2393
1950
|
Run.nextPriority(() => calculateState());
|
|
2394
1951
|
};
|
|
2395
|
-
|
|
2396
1952
|
var initControl = () => {
|
|
2397
1953
|
if (control !== null) {
|
|
2398
1954
|
return;
|
|
2399
1955
|
}
|
|
2400
|
-
|
|
2401
1956
|
control = new Control({
|
|
2402
1957
|
channel: self.getChannels(CHANNEL_CONTROL)
|
|
2403
1958
|
});
|
|
@@ -2406,28 +1961,26 @@ var Event = function Event(uuid) {
|
|
|
2406
1961
|
control.bind(Control.MSG_TYPE_REVOKE, handleControlRevoke);
|
|
2407
1962
|
control.bind(Control.MSG_TYPE_EOC, handleControlEOC);
|
|
2408
1963
|
};
|
|
2409
|
-
|
|
2410
1964
|
var setState = newState => {
|
|
2411
1965
|
var oldState = self.getState();
|
|
2412
1966
|
state = newState;
|
|
2413
|
-
|
|
2414
1967
|
if (oldState !== self.getState()) {
|
|
2415
1968
|
self.trigger(Event.ON_STATE, self.getState());
|
|
2416
1969
|
}
|
|
2417
|
-
|
|
2418
1970
|
self.trigger(Event.ON_SUBSTATE, self.getSubstate());
|
|
2419
1971
|
};
|
|
2420
|
-
|
|
2421
1972
|
var processHistory = _ref => {
|
|
2422
1973
|
var timeline = _ref.timeline,
|
|
2423
|
-
|
|
1974
|
+
config = _ref.config;
|
|
2424
1975
|
var snapshots = timeline.map(item => item);
|
|
2425
|
-
snapshots.forEach(ConnectionAdaptor.adaptSnapshotData);
|
|
1976
|
+
snapshots.forEach(ConnectionAdaptor.adaptSnapshotData);
|
|
1977
|
+
|
|
1978
|
+
// elements to revoke
|
|
2426
1979
|
//
|
|
2427
1980
|
// skipping this phase as `/revoke` message is preserved on enmasse
|
|
2428
1981
|
// channels until the end of an event
|
|
2429
|
-
// elements to create
|
|
2430
1982
|
|
|
1983
|
+
// elements to create
|
|
2431
1984
|
snapshots.filter(snapshot => !getElementFromHistory(snapshot.id)).map(snapshot => {
|
|
2432
1985
|
var factory = Factories.get(snapshot.type);
|
|
2433
1986
|
return factory.createSnapshot(snapshot);
|
|
@@ -2441,49 +1994,44 @@ var Event = function Event(uuid) {
|
|
|
2441
1994
|
factory.update(element, snapshot);
|
|
2442
1995
|
return element;
|
|
2443
1996
|
}).forEach(handleControlUpdate);
|
|
2444
|
-
|
|
2445
1997
|
if (isDataEmpty()) {
|
|
2446
1998
|
ConnectionAdaptor.adaptEvent(config);
|
|
2447
1999
|
self.setData(config);
|
|
2448
2000
|
}
|
|
2449
2001
|
};
|
|
2450
|
-
|
|
2451
2002
|
var isDataEmpty = () => {
|
|
2452
2003
|
if (!data || typeof data !== 'object' || Array.isArray(data)) {
|
|
2453
2004
|
return false;
|
|
2454
2005
|
}
|
|
2455
|
-
|
|
2456
2006
|
return !Object.keys(data).length;
|
|
2457
2007
|
};
|
|
2458
|
-
|
|
2459
2008
|
var isReady = () => self.ready.state() === 'resolved';
|
|
2460
|
-
|
|
2461
2009
|
var isElementInHistory = element => history.some(historyElement => historyElement.getId() === element.getId());
|
|
2462
|
-
|
|
2463
2010
|
var canLoadHistory = () => {
|
|
2464
2011
|
// time to ignore history loading
|
|
2465
|
-
var ignore = parseInt(Project.get('history_ignore'), 10) || 60;
|
|
2012
|
+
var ignore = parseInt(Project.get('history_ignore'), 10) || 60;
|
|
2466
2013
|
|
|
2467
|
-
|
|
2014
|
+
// delay at the moment of time when event's data were adapted
|
|
2015
|
+
var delay = self.get('__delay');
|
|
2468
2016
|
|
|
2469
|
-
|
|
2017
|
+
// even'ts start time (including delay)
|
|
2018
|
+
var start = self.get('start_at');
|
|
2470
2019
|
|
|
2020
|
+
// do not load history if now before this time
|
|
2471
2021
|
var threshold = start - delay + ignore;
|
|
2472
2022
|
return self.isPending() || LViSDate.now() > threshold;
|
|
2473
2023
|
};
|
|
2474
|
-
|
|
2475
2024
|
var addElementToHistory = element => {
|
|
2476
2025
|
if (isElementInHistory(element)) {
|
|
2477
2026
|
return;
|
|
2478
|
-
}
|
|
2479
|
-
|
|
2027
|
+
}
|
|
2480
2028
|
|
|
2029
|
+
// sort by published at and id
|
|
2481
2030
|
for (var i = history.length - 1; i >= 0; i--) {
|
|
2482
2031
|
if (history[i].publishedAt < element.publishedAt) {
|
|
2483
2032
|
history.splice(i + 1, 0, element);
|
|
2484
2033
|
return;
|
|
2485
2034
|
}
|
|
2486
|
-
|
|
2487
2035
|
if (history[i].publishedAt === element.publishedAt) {
|
|
2488
2036
|
if (history[i].id < element.id) {
|
|
2489
2037
|
history.splice(i + 1, 0, element);
|
|
@@ -2491,144 +2039,112 @@ var Event = function Event(uuid) {
|
|
|
2491
2039
|
}
|
|
2492
2040
|
}
|
|
2493
2041
|
}
|
|
2494
|
-
|
|
2495
2042
|
history.unshift(element);
|
|
2496
2043
|
};
|
|
2497
|
-
|
|
2498
2044
|
var getElementFromHistory = id => history.find(element => element.getId() === id);
|
|
2499
|
-
|
|
2500
2045
|
var removeElementFromHistory = element => {
|
|
2501
2046
|
var index = history.indexOf(element);
|
|
2502
|
-
|
|
2503
2047
|
if (index > -1) {
|
|
2504
2048
|
history.splice(index, 1);
|
|
2505
2049
|
}
|
|
2506
2050
|
};
|
|
2507
|
-
|
|
2508
2051
|
var sortElementsInHistory = () => {
|
|
2509
2052
|
history.sort((a, b) => a.getPublishedAt() - b.getPublishedAt());
|
|
2510
2053
|
};
|
|
2511
|
-
|
|
2512
2054
|
var handleControlCreate = instance => {
|
|
2513
2055
|
addElementToHistory(instance);
|
|
2514
|
-
|
|
2515
2056
|
if (isReady()) {
|
|
2516
2057
|
self.trigger(Event.ON_ELEMENT_PUBLISH, instance);
|
|
2517
2058
|
}
|
|
2518
2059
|
};
|
|
2519
|
-
|
|
2520
2060
|
var handleControlUpdate = instance => {
|
|
2521
2061
|
sortElementsInHistory();
|
|
2522
|
-
|
|
2523
2062
|
if (isReady()) {
|
|
2524
2063
|
self.trigger(Event.ON_ELEMENT_UPDATE, instance);
|
|
2525
2064
|
}
|
|
2526
2065
|
};
|
|
2527
|
-
|
|
2528
2066
|
var handleControlRevoke = instance => {
|
|
2529
2067
|
removeElementFromHistory(instance);
|
|
2530
|
-
|
|
2531
2068
|
if (isReady()) {
|
|
2532
2069
|
self.trigger(Event.ON_ELEMENT_REVOKE, instance);
|
|
2533
2070
|
}
|
|
2534
2071
|
};
|
|
2535
|
-
|
|
2536
2072
|
var handleControlEOC = () => {
|
|
2537
2073
|
self.trigger(Event.ON_EOC);
|
|
2538
2074
|
};
|
|
2075
|
+
|
|
2539
2076
|
/*
|
|
2540
2077
|
* Getters
|
|
2541
2078
|
*/
|
|
2542
2079
|
|
|
2543
|
-
|
|
2544
2080
|
this.get = param => {
|
|
2545
2081
|
if (typeof param === 'undefined') {
|
|
2546
2082
|
// return full dataset if parameter is not set
|
|
2547
2083
|
return data;
|
|
2548
2084
|
}
|
|
2549
|
-
|
|
2550
2085
|
if (typeof data[param] !== 'undefined') {
|
|
2551
2086
|
// return value that matches passed parameter in dataset
|
|
2552
2087
|
return data[param];
|
|
2553
2088
|
}
|
|
2554
|
-
|
|
2555
2089
|
return null;
|
|
2556
2090
|
};
|
|
2557
|
-
|
|
2558
2091
|
this.getUUID = () => uuid;
|
|
2559
|
-
|
|
2560
2092
|
this.getChannels = type => {
|
|
2561
2093
|
var channelId = t => "".concat(t, "-").concat(uuid);
|
|
2562
|
-
|
|
2563
2094
|
if (typeof type === 'undefined') {
|
|
2564
2095
|
return {
|
|
2565
2096
|
poll: channelId(CHANNEL_POLL),
|
|
2566
2097
|
control: channelId(CHANNEL_CONTROL)
|
|
2567
2098
|
};
|
|
2568
2099
|
}
|
|
2569
|
-
|
|
2570
2100
|
if (type === CHANNEL_POLL || type === CHANNEL_CONTROL) {
|
|
2571
2101
|
return channelId(type);
|
|
2572
2102
|
}
|
|
2573
|
-
|
|
2574
2103
|
throw new Error("Unknown channel type ".concat(type));
|
|
2575
2104
|
};
|
|
2576
|
-
|
|
2577
2105
|
this.getName = () => this.get('name');
|
|
2578
|
-
|
|
2579
2106
|
this.getStartAt = () => this.get('start_at');
|
|
2580
|
-
|
|
2581
2107
|
this.getOriginalStartAt = () => {
|
|
2582
2108
|
var startAt = this.getStartAt();
|
|
2583
|
-
|
|
2584
2109
|
if (startAt === null) {
|
|
2585
2110
|
return null;
|
|
2586
2111
|
}
|
|
2587
|
-
|
|
2588
2112
|
return startAt - data.__delay;
|
|
2589
2113
|
};
|
|
2590
|
-
|
|
2591
2114
|
this.getEndAt = () => this.get('end_at');
|
|
2592
|
-
|
|
2593
2115
|
this.getState = () => {
|
|
2594
2116
|
switch (state) {
|
|
2595
2117
|
case Event.STATE_PROLONGED:
|
|
2596
2118
|
return Event.STATE_FINISHED;
|
|
2597
|
-
|
|
2598
2119
|
default:
|
|
2599
2120
|
return state;
|
|
2600
2121
|
}
|
|
2601
2122
|
};
|
|
2602
|
-
|
|
2603
2123
|
this.getSubstate = () => state;
|
|
2604
|
-
|
|
2605
2124
|
this.getCustomFields = field => {
|
|
2606
2125
|
var fields = this.get('custom_fields');
|
|
2607
|
-
|
|
2608
2126
|
if (fields === null) {
|
|
2609
2127
|
return null;
|
|
2610
2128
|
}
|
|
2611
|
-
|
|
2612
2129
|
var values = Project.localise(fields);
|
|
2613
|
-
|
|
2614
2130
|
if (typeof field === 'undefined') {
|
|
2615
2131
|
// return full set of custom fields if field name wasn't passed
|
|
2616
2132
|
return values;
|
|
2617
|
-
}
|
|
2618
|
-
|
|
2133
|
+
}
|
|
2619
2134
|
|
|
2135
|
+
// custom field was passed
|
|
2620
2136
|
if (typeof values[field] !== 'undefined') {
|
|
2621
2137
|
// return specific field if field exists in object
|
|
2622
2138
|
return values[field];
|
|
2623
|
-
}
|
|
2624
|
-
|
|
2139
|
+
}
|
|
2625
2140
|
|
|
2141
|
+
// otherwise return null
|
|
2626
2142
|
return null;
|
|
2627
2143
|
};
|
|
2628
|
-
|
|
2629
2144
|
this.getCountdown = format => {
|
|
2630
|
-
format = format || TIME_FORMAT_SECONDS;
|
|
2145
|
+
format = format || TIME_FORMAT_SECONDS;
|
|
2631
2146
|
|
|
2147
|
+
// countdown values
|
|
2632
2148
|
var countdown = {
|
|
2633
2149
|
years: 0,
|
|
2634
2150
|
months: 0,
|
|
@@ -2638,18 +2154,17 @@ var Event = function Event(uuid) {
|
|
|
2638
2154
|
seconds: 0
|
|
2639
2155
|
};
|
|
2640
2156
|
var diffSeconds = this.get('start_at') - LViSDate.now();
|
|
2641
|
-
|
|
2642
2157
|
if (diffSeconds < 0) {
|
|
2643
2158
|
diffSeconds = 0;
|
|
2644
2159
|
}
|
|
2645
|
-
|
|
2646
2160
|
if (format === TIME_FORMAT_SECONDS) {
|
|
2647
2161
|
return diffSeconds;
|
|
2648
|
-
}
|
|
2649
|
-
|
|
2162
|
+
}
|
|
2650
2163
|
|
|
2651
|
-
|
|
2164
|
+
// calculate difference between event start at and now dates relatively to the Unix Epoch time
|
|
2165
|
+
var diff = new Date(diffSeconds * 1000);
|
|
2652
2166
|
|
|
2167
|
+
// methods to be casted on diff date
|
|
2653
2168
|
var methods = {
|
|
2654
2169
|
years: 'getUTCFullYear',
|
|
2655
2170
|
months: 'getUTCMonth',
|
|
@@ -2659,97 +2174,74 @@ var Event = function Event(uuid) {
|
|
|
2659
2174
|
seconds: 'getUTCSeconds'
|
|
2660
2175
|
};
|
|
2661
2176
|
var value;
|
|
2662
|
-
|
|
2663
2177
|
for (var _i = 0, _Object$entries = Object.entries(methods); _i < _Object$entries.length; _i++) {
|
|
2664
2178
|
var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2179
|
+
key = _Object$entries$_i[0],
|
|
2180
|
+
method = _Object$entries$_i[1];
|
|
2668
2181
|
value = diff[method]();
|
|
2669
|
-
|
|
2670
2182
|
switch (method) {
|
|
2671
2183
|
case 'getUTCDate':
|
|
2672
2184
|
value--; // date starts with 1 not 0
|
|
2673
|
-
|
|
2674
2185
|
break;
|
|
2675
|
-
|
|
2676
2186
|
case 'getUTCFullYear':
|
|
2677
2187
|
value -= 1970; // year when Unix Epoch started
|
|
2678
|
-
|
|
2679
2188
|
break;
|
|
2680
2189
|
}
|
|
2681
|
-
|
|
2682
2190
|
countdown[key] = value;
|
|
2683
2191
|
}
|
|
2684
|
-
|
|
2685
2192
|
switch (format) {
|
|
2686
2193
|
case TIME_FORMAT_OBJECT:
|
|
2687
2194
|
return countdown;
|
|
2688
|
-
|
|
2689
2195
|
case TIME_FORMAT_ARRAY:
|
|
2690
2196
|
return [countdown.seconds, countdown.minutes, countdown.hours, countdown.days, countdown.months, countdown.years];
|
|
2691
|
-
|
|
2692
2197
|
default:
|
|
2693
2198
|
// undefined format?
|
|
2694
2199
|
return null;
|
|
2695
2200
|
}
|
|
2696
2201
|
};
|
|
2697
|
-
|
|
2698
2202
|
this.getHistory = () => history;
|
|
2699
|
-
|
|
2700
2203
|
this.getLastFromHistory = () => {
|
|
2701
2204
|
if (history.length > 0) {
|
|
2702
2205
|
return history[history.length - 1];
|
|
2703
2206
|
}
|
|
2704
|
-
|
|
2705
2207
|
return null;
|
|
2706
2208
|
};
|
|
2209
|
+
|
|
2707
2210
|
/*
|
|
2708
2211
|
* Public methods
|
|
2709
2212
|
*/
|
|
2710
2213
|
|
|
2711
|
-
|
|
2712
2214
|
this.setData = newData => {
|
|
2713
2215
|
var oldDigest = data.digest;
|
|
2714
2216
|
var oldDelay = data.__delay;
|
|
2715
2217
|
data = newData || {};
|
|
2716
|
-
|
|
2717
2218
|
if (oldDigest !== newData.digest || oldDelay !== newData.__delay) {
|
|
2718
2219
|
self.trigger(Event.ON_UPDATE);
|
|
2719
2220
|
}
|
|
2720
|
-
|
|
2721
2221
|
calculateState();
|
|
2722
2222
|
};
|
|
2723
|
-
|
|
2724
2223
|
this.isPending = () => state === Event.STATE_PENDING;
|
|
2725
|
-
|
|
2726
2224
|
this.isReady = () => isReady();
|
|
2727
|
-
|
|
2728
2225
|
this.addDemographicsCounter = (segmentName, segmentValue, counter, round, min, max) => {
|
|
2729
2226
|
if (this.isPending()) {
|
|
2730
2227
|
console.error("Can't add demographics counter while event is in the pending state.");
|
|
2731
2228
|
return;
|
|
2732
2229
|
}
|
|
2733
|
-
|
|
2734
2230
|
var channel = this.getChannels(CHANNEL_CONTROL);
|
|
2735
2231
|
var segment = [segmentName, segmentValue];
|
|
2736
2232
|
Enmasse.Demographics.addCounter(channel, uuid, segment, counter, round, min, max);
|
|
2737
2233
|
};
|
|
2738
|
-
|
|
2739
2234
|
this.markAsReady = () => {
|
|
2740
2235
|
if (isReady()) {
|
|
2741
2236
|
return;
|
|
2742
2237
|
}
|
|
2743
|
-
|
|
2744
2238
|
self.ready.resolve();
|
|
2745
2239
|
self.trigger(Event.ON_READY);
|
|
2746
2240
|
};
|
|
2747
|
-
|
|
2748
2241
|
this.markAsNotReady = () => {
|
|
2749
2242
|
if (!isReady()) {
|
|
2750
2243
|
return;
|
|
2751
2244
|
}
|
|
2752
|
-
|
|
2753
2245
|
history.map(element => ({
|
|
2754
2246
|
id: element.getId(),
|
|
2755
2247
|
type: element.getType()
|
|
@@ -2759,6 +2251,7 @@ var Event = function Event(uuid) {
|
|
|
2759
2251
|
self.ready = new Deferred();
|
|
2760
2252
|
self.trigger(Event.ON_NOT_READY);
|
|
2761
2253
|
};
|
|
2254
|
+
|
|
2762
2255
|
/**
|
|
2763
2256
|
* Loads event's history from CDN
|
|
2764
2257
|
*
|
|
@@ -2768,11 +2261,8 @@ var Event = function Event(uuid) {
|
|
|
2768
2261
|
* @param {boolean} [reconnect=false] Indicates that history is loading on reconnect
|
|
2769
2262
|
* @return {deferred} of ajax request
|
|
2770
2263
|
*/
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
2264
|
this.loadHistory = (host, reconnect) => {
|
|
2774
2265
|
var deferred = new Deferred();
|
|
2775
|
-
|
|
2776
2266
|
var success = historyData => {
|
|
2777
2267
|
try {
|
|
2778
2268
|
// secure code against the bad data
|
|
@@ -2780,18 +2270,14 @@ var Event = function Event(uuid) {
|
|
|
2780
2270
|
} catch (exception) {
|
|
2781
2271
|
console.error(exception);
|
|
2782
2272
|
}
|
|
2783
|
-
|
|
2784
2273
|
deferred.resolve();
|
|
2785
2274
|
};
|
|
2786
|
-
|
|
2787
2275
|
var error = () => {
|
|
2788
2276
|
if (self.isPending()) {
|
|
2789
2277
|
setState(Event.STATE_FAILURE);
|
|
2790
2278
|
}
|
|
2791
|
-
|
|
2792
2279
|
deferred.reject();
|
|
2793
2280
|
};
|
|
2794
|
-
|
|
2795
2281
|
if (canLoadHistory()) {
|
|
2796
2282
|
var url = "".concat(host, "/events/").concat(uuid.substr(0, 2), "/").concat(uuid, "/history.json");
|
|
2797
2283
|
xhr.get(url, {
|
|
@@ -2801,13 +2287,13 @@ var Event = function Event(uuid) {
|
|
|
2801
2287
|
var status = resp.statusCode;
|
|
2802
2288
|
var isSuccess = status >= 200 && status <= 300 || status === 0 || status === '';
|
|
2803
2289
|
var hasTimeline = {}.hasOwnProperty.call(historyData, 'timeline');
|
|
2804
|
-
var hasConfig = {}.hasOwnProperty.call(historyData, 'config');
|
|
2805
|
-
// history is loaded. Not applicable on reconnect.
|
|
2290
|
+
var hasConfig = {}.hasOwnProperty.call(historyData, 'config');
|
|
2806
2291
|
|
|
2292
|
+
// Assert on race condition when the event becomes ready before
|
|
2293
|
+
// history is loaded. Not applicable on reconnect.
|
|
2807
2294
|
if (isReady() && !reconnect) {
|
|
2808
2295
|
console.warn('Event is ready before history is loaded');
|
|
2809
2296
|
}
|
|
2810
|
-
|
|
2811
2297
|
if (isSuccess && hasTimeline && hasConfig) {
|
|
2812
2298
|
success(historyData);
|
|
2813
2299
|
} else {
|
|
@@ -2817,14 +2303,11 @@ var Event = function Event(uuid) {
|
|
|
2817
2303
|
} else {
|
|
2818
2304
|
deferred.resolve();
|
|
2819
2305
|
}
|
|
2820
|
-
|
|
2821
2306
|
return deferred;
|
|
2822
2307
|
};
|
|
2823
|
-
|
|
2824
2308
|
calculateState();
|
|
2825
2309
|
initControl();
|
|
2826
2310
|
};
|
|
2827
|
-
|
|
2828
2311
|
Event.prototype = assignIn(Event.prototype, new Emitter());
|
|
2829
2312
|
Event.ON_READY = 'ready';
|
|
2830
2313
|
Event.ON_NOT_READY = 'not-ready';
|
|
@@ -2840,27 +2323,28 @@ Event.STATE_PENDING = 'pending';
|
|
|
2840
2323
|
Event.STATE_UPCOMING = 'upcoming';
|
|
2841
2324
|
Event.STATE_ACTIVE = 'active';
|
|
2842
2325
|
Event.STATE_PROLONGED = 'prolonged'; // substate of STATE_FINISHED
|
|
2843
|
-
|
|
2844
2326
|
Event.STATE_FINISHED = 'finished';
|
|
2845
2327
|
Event.HISTORY_LOCALISATION = 1;
|
|
2846
2328
|
Event.HISTORY_VERSIONS = {
|
|
2847
2329
|
2: Event.HISTORY_LOCALISATION
|
|
2848
2330
|
};
|
|
2849
2331
|
|
|
2332
|
+
// properties
|
|
2850
2333
|
var channel$1 = null;
|
|
2851
2334
|
var events = [];
|
|
2852
2335
|
var assets = {};
|
|
2853
2336
|
var instances = {}; // cache of instances
|
|
2854
|
-
|
|
2855
2337
|
var ready = false;
|
|
2856
2338
|
var Listings = new Emitter();
|
|
2857
2339
|
Listings.trigger = Listings.emit;
|
|
2858
2340
|
Listings.bind = Listings.on;
|
|
2859
|
-
Listings.unbind = Listings.off;
|
|
2341
|
+
Listings.unbind = Listings.off;
|
|
2860
2342
|
|
|
2343
|
+
// constants
|
|
2861
2344
|
Listings.ON_READY = 'ready';
|
|
2862
2345
|
Listings.ON_UPDATE = 'update';
|
|
2863
2346
|
Listings.MSG_CLASS = 'listings';
|
|
2347
|
+
|
|
2864
2348
|
/*
|
|
2865
2349
|
* Private methods
|
|
2866
2350
|
*/
|
|
@@ -2870,7 +2354,6 @@ var handleMessage = msg => {
|
|
|
2870
2354
|
if (msg.channel !== channel$1) {
|
|
2871
2355
|
return;
|
|
2872
2356
|
}
|
|
2873
|
-
|
|
2874
2357
|
switch (msg.klass) {
|
|
2875
2358
|
case Listings.MSG_CLASS:
|
|
2876
2359
|
{
|
|
@@ -2880,53 +2363,50 @@ var handleMessage = msg => {
|
|
|
2880
2363
|
}
|
|
2881
2364
|
}
|
|
2882
2365
|
};
|
|
2883
|
-
|
|
2884
2366
|
var handleEOC = _channel => {
|
|
2885
2367
|
if (_channel !== channel$1) {
|
|
2886
2368
|
return;
|
|
2887
|
-
}
|
|
2888
|
-
|
|
2369
|
+
}
|
|
2889
2370
|
|
|
2371
|
+
// do not expose ON_READY event if listings were initialised already
|
|
2890
2372
|
if (!ready) {
|
|
2891
2373
|
ready = true;
|
|
2892
2374
|
Listings.trigger(Listings.ON_READY);
|
|
2893
2375
|
}
|
|
2894
2376
|
};
|
|
2895
|
-
|
|
2896
2377
|
var findById = (collection, id) => {
|
|
2897
2378
|
for (var i = 0, l = collection.length; i < l; i++) {
|
|
2898
2379
|
if (collection[i].id === id) {
|
|
2899
2380
|
return collection[i];
|
|
2900
2381
|
}
|
|
2901
2382
|
}
|
|
2902
|
-
|
|
2903
2383
|
return null;
|
|
2904
|
-
};
|
|
2905
|
-
|
|
2384
|
+
};
|
|
2906
2385
|
|
|
2386
|
+
// check if there are any changes in listings data
|
|
2907
2387
|
var haveChanged = data => {
|
|
2908
2388
|
var i;
|
|
2909
2389
|
var l;
|
|
2910
|
-
var event;
|
|
2390
|
+
var event;
|
|
2911
2391
|
|
|
2392
|
+
// iterate over came events data
|
|
2912
2393
|
for (i = 0, l = data.events.length; i < l; i++) {
|
|
2913
|
-
event = findById(events, data.events[i].id);
|
|
2394
|
+
event = findById(events, data.events[i].id);
|
|
2914
2395
|
|
|
2396
|
+
// new episode OR digest of the existant event has changed
|
|
2915
2397
|
if (event === null || event.digest !== data.events[i].digest) {
|
|
2916
2398
|
return true;
|
|
2917
2399
|
}
|
|
2918
|
-
}
|
|
2919
|
-
|
|
2400
|
+
}
|
|
2920
2401
|
|
|
2402
|
+
// check if event was removed
|
|
2921
2403
|
for (i = 0, l = events.length; i < l; i++) {
|
|
2922
2404
|
if (findById(data.events, events[i].id) === null) {
|
|
2923
2405
|
return true;
|
|
2924
2406
|
}
|
|
2925
2407
|
}
|
|
2926
|
-
|
|
2927
2408
|
return false;
|
|
2928
2409
|
};
|
|
2929
|
-
|
|
2930
2410
|
var handleData = data => {
|
|
2931
2411
|
var isChanges = ready && haveChanged(data);
|
|
2932
2412
|
events = data.events;
|
|
@@ -2934,170 +2414,153 @@ var handleData = data => {
|
|
|
2934
2414
|
if (a.start_at < b.start_at) {
|
|
2935
2415
|
return -1;
|
|
2936
2416
|
}
|
|
2937
|
-
|
|
2938
2417
|
if (a.start_at > b.start_at) {
|
|
2939
2418
|
return 1;
|
|
2940
2419
|
}
|
|
2941
|
-
|
|
2942
2420
|
return 0;
|
|
2943
|
-
});
|
|
2421
|
+
});
|
|
2944
2422
|
|
|
2423
|
+
// populate project object with the data
|
|
2945
2424
|
Project.setData(data.project);
|
|
2946
|
-
|
|
2947
2425
|
if (!ready) {
|
|
2948
2426
|
// load assets only once
|
|
2949
2427
|
// and cache them permanently
|
|
2950
2428
|
assets = data.assets;
|
|
2951
|
-
}
|
|
2952
|
-
|
|
2429
|
+
}
|
|
2953
2430
|
|
|
2431
|
+
// update instances
|
|
2954
2432
|
for (var i = 0, l = events.length; i < l; i++) {
|
|
2955
2433
|
var event = events[i];
|
|
2956
|
-
|
|
2957
2434
|
if (instances[event.id]) {
|
|
2958
2435
|
instances[event.id].setData(event);
|
|
2959
2436
|
}
|
|
2960
2437
|
}
|
|
2961
|
-
|
|
2962
2438
|
if (isChanges) {
|
|
2963
2439
|
Listings.trigger(Listings.ON_UPDATE);
|
|
2964
2440
|
}
|
|
2965
2441
|
};
|
|
2442
|
+
|
|
2966
2443
|
/*
|
|
2967
2444
|
* Public methods
|
|
2968
2445
|
*/
|
|
2969
|
-
// returns object of the LViS event by Id
|
|
2970
|
-
|
|
2971
2446
|
|
|
2447
|
+
// returns object of the LViS event by Id
|
|
2972
2448
|
Listings.get = id => {
|
|
2973
2449
|
// lazy return if instance already exists
|
|
2974
2450
|
if (typeof instances[id] !== 'undefined') {
|
|
2975
2451
|
return instances[id];
|
|
2976
2452
|
}
|
|
2977
|
-
|
|
2978
2453
|
var data = findById(events, id);
|
|
2979
|
-
var event = new Event(id);
|
|
2980
|
-
// Setting data from listings if data exists
|
|
2454
|
+
var event = new Event(id);
|
|
2981
2455
|
|
|
2456
|
+
// Data from Enmasse has priority over data from CDN
|
|
2457
|
+
// Setting data from listings if data exists
|
|
2982
2458
|
if (data) {
|
|
2983
2459
|
event.setData(data);
|
|
2984
2460
|
}
|
|
2985
|
-
|
|
2986
2461
|
instances[id] = event;
|
|
2987
2462
|
return event;
|
|
2988
|
-
};
|
|
2463
|
+
};
|
|
2464
|
+
|
|
2465
|
+
// Current episode is the episode start time
|
|
2989
2466
|
// of which in the past and end time in future.
|
|
2990
2467
|
// Returns:
|
|
2991
2468
|
// 1) array of the currently active LViS Events
|
|
2992
2469
|
// 2) NULL if there are no any LViS Event
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
2470
|
Listings.getCurrent = () => {
|
|
2996
2471
|
var list = [];
|
|
2997
|
-
var now = LViSDate.now();
|
|
2472
|
+
var now = LViSDate.now();
|
|
2998
2473
|
|
|
2474
|
+
// loop through the raw data
|
|
2999
2475
|
for (var i = 0, l = events.length; i < l; i++) {
|
|
3000
2476
|
if (events[i].start_at <= now && now < events[i].end_at) {
|
|
3001
2477
|
list.push(Listings.get(events[i].id));
|
|
3002
2478
|
}
|
|
3003
|
-
}
|
|
3004
|
-
|
|
2479
|
+
}
|
|
3005
2480
|
|
|
2481
|
+
// return NULL if nothing found
|
|
3006
2482
|
return list.length ? list : null;
|
|
3007
|
-
};
|
|
2483
|
+
};
|
|
2484
|
+
|
|
2485
|
+
// Returns:
|
|
3008
2486
|
// 1) array of the LViS Events that are
|
|
3009
2487
|
// scheduled to start next
|
|
3010
2488
|
// 2) NULL if there are no any LViS Event
|
|
3011
|
-
|
|
3012
|
-
|
|
3013
2489
|
Listings.getNext = () => {
|
|
3014
2490
|
// time till the next event
|
|
3015
2491
|
var nextStartAt = Number.POSITIVE_INFINITY;
|
|
3016
|
-
var list = [];
|
|
3017
|
-
// the minimal time till the upcoming event
|
|
2492
|
+
var list = [];
|
|
3018
2493
|
|
|
2494
|
+
// loop through the raw data and find
|
|
2495
|
+
// the minimal time till the upcoming event
|
|
3019
2496
|
var i;
|
|
3020
2497
|
var l;
|
|
3021
2498
|
var now = LViSDate.now();
|
|
3022
|
-
|
|
3023
2499
|
for (i = 0, l = events.length; i < l; i++) {
|
|
3024
2500
|
if (now < events[i].start_at && events[i].start_at < nextStartAt) {
|
|
3025
2501
|
nextStartAt = events[i].start_at;
|
|
3026
2502
|
}
|
|
3027
2503
|
}
|
|
3028
|
-
|
|
3029
2504
|
if (nextStartAt < Number.POSITIVE_INFINITY) {
|
|
3030
2505
|
for (i = 0, l = events.length; i < l; i++) {
|
|
3031
2506
|
if (events[i].start_at === nextStartAt) {
|
|
3032
2507
|
list.push(Listings.get(events[i].id));
|
|
3033
2508
|
}
|
|
3034
2509
|
}
|
|
3035
|
-
}
|
|
3036
|
-
|
|
2510
|
+
}
|
|
3037
2511
|
|
|
2512
|
+
// return NULL if nothing found
|
|
3038
2513
|
return list.length ? list : null;
|
|
3039
|
-
};
|
|
2514
|
+
};
|
|
2515
|
+
|
|
2516
|
+
// can't be realized now due to absence of
|
|
3040
2517
|
// the ended events in the list
|
|
3041
2518
|
// Listings.getPrevious = function () {};
|
|
2519
|
+
|
|
3042
2520
|
// returns the list of all events sorted by start time
|
|
3043
2521
|
// eslint-disable-next-line
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
2522
|
Listings.getList = function () {
|
|
3047
2523
|
var event;
|
|
3048
2524
|
var list = [];
|
|
3049
|
-
|
|
3050
2525
|
for (var i = 0, l = events.length; i < l; i++) {
|
|
3051
2526
|
event = this.get(events[i].id);
|
|
3052
|
-
|
|
3053
2527
|
if (event !== null) {
|
|
3054
2528
|
list.push(event);
|
|
3055
2529
|
}
|
|
3056
2530
|
}
|
|
3057
|
-
|
|
3058
2531
|
return list;
|
|
3059
2532
|
};
|
|
3060
|
-
|
|
3061
2533
|
Listings.getAssets = id => {
|
|
3062
2534
|
if (typeof id === 'undefined') {
|
|
3063
2535
|
return assets;
|
|
3064
2536
|
}
|
|
3065
|
-
|
|
3066
2537
|
return assets[id] || null;
|
|
3067
2538
|
};
|
|
3068
|
-
|
|
3069
2539
|
Listings.fetchListings = /*#__PURE__*/function () {
|
|
3070
|
-
var _ref = _asyncToGenerator(
|
|
2540
|
+
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(host, project) {
|
|
3071
2541
|
var response, data;
|
|
3072
|
-
return _regeneratorRuntime.wrap(function
|
|
3073
|
-
while (1) {
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
|
|
3082
|
-
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3086
|
-
|
|
3087
|
-
|
|
3088
|
-
case 7:
|
|
3089
|
-
case "end":
|
|
3090
|
-
return _context.stop();
|
|
3091
|
-
}
|
|
2542
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
2543
|
+
while (1) switch (_context.prev = _context.next) {
|
|
2544
|
+
case 0:
|
|
2545
|
+
_context.next = 1;
|
|
2546
|
+
return fetch("https://".concat(host, "/projects/").concat(project.substr(0, 2), "/").concat(project, "/listings.json"));
|
|
2547
|
+
case 1:
|
|
2548
|
+
response = _context.sent;
|
|
2549
|
+
_context.next = 2;
|
|
2550
|
+
return response.json();
|
|
2551
|
+
case 2:
|
|
2552
|
+
data = _context.sent;
|
|
2553
|
+
handleData(data);
|
|
2554
|
+
case 3:
|
|
2555
|
+
case "end":
|
|
2556
|
+
return _context.stop();
|
|
3092
2557
|
}
|
|
3093
2558
|
}, _callee);
|
|
3094
2559
|
}));
|
|
3095
|
-
|
|
3096
2560
|
return function (_x, _x2) {
|
|
3097
2561
|
return _ref.apply(this, arguments);
|
|
3098
2562
|
};
|
|
3099
2563
|
}();
|
|
3100
|
-
|
|
3101
2564
|
Listings.init = config => {
|
|
3102
2565
|
config = config || {};
|
|
3103
2566
|
channel$1 = config.channel || null;
|
|
@@ -3108,20 +2571,17 @@ Listings.init = config => {
|
|
|
3108
2571
|
var User = (() => {
|
|
3109
2572
|
// pointer to `this` object
|
|
3110
2573
|
var self = {};
|
|
3111
|
-
|
|
3112
2574
|
self.getSessionId = () => Enmasse.getSessionId();
|
|
3113
|
-
|
|
3114
2575
|
self.signIn = function () {
|
|
3115
2576
|
return Enmasse.signIn(...arguments);
|
|
3116
2577
|
};
|
|
3117
|
-
|
|
3118
2578
|
self.login = function () {
|
|
3119
2579
|
return Enmasse.login(...arguments);
|
|
3120
2580
|
};
|
|
3121
|
-
|
|
3122
2581
|
return self;
|
|
3123
2582
|
})();
|
|
3124
2583
|
|
|
2584
|
+
// properties
|
|
3125
2585
|
var host = null;
|
|
3126
2586
|
var channel = null;
|
|
3127
2587
|
var lvisEvent = null;
|
|
@@ -3141,8 +2601,9 @@ var ON_READY = 'ready';
|
|
|
3141
2601
|
var ON_ERROR = 'error';
|
|
3142
2602
|
LViS.trigger = trigger;
|
|
3143
2603
|
LViS.bind = bind;
|
|
3144
|
-
LViS.unbind = unbind;
|
|
2604
|
+
LViS.unbind = unbind;
|
|
3145
2605
|
|
|
2606
|
+
// attach xhr library to make it possible to mock it in unit tests
|
|
3146
2607
|
LViS._xhr = xhr;
|
|
3147
2608
|
LViS.VERSION = version;
|
|
3148
2609
|
LViS.ON_READY = ON_READY;
|
|
@@ -3186,6 +2647,7 @@ LViS.Trivia = Trivia;
|
|
|
3186
2647
|
LViS.Diametric = Diametric;
|
|
3187
2648
|
LViS.Swing = Swing;
|
|
3188
2649
|
LViS.Emoting = Emoting;
|
|
2650
|
+
|
|
3189
2651
|
/*
|
|
3190
2652
|
* Private methods
|
|
3191
2653
|
*/
|
|
@@ -3194,34 +2656,27 @@ var embedAssets = () => {
|
|
|
3194
2656
|
var jsLoaded = new Deferred();
|
|
3195
2657
|
var i;
|
|
3196
2658
|
var files = {}; // list of files grouped by type
|
|
3197
|
-
|
|
3198
2659
|
var assets = getAssets();
|
|
3199
|
-
|
|
3200
2660
|
for (var key in assets) {
|
|
3201
2661
|
if ({}.hasOwnProperty.call(assets, key)) {
|
|
3202
2662
|
for (i = 0; i < assets[key].length; i++) {
|
|
3203
2663
|
var asset = assets[key][i];
|
|
3204
2664
|
var type = asset.autoload;
|
|
3205
|
-
|
|
3206
2665
|
if (typeof type === 'undefined') {
|
|
3207
2666
|
continue;
|
|
3208
2667
|
}
|
|
3209
|
-
|
|
3210
2668
|
if (typeof files[type] === 'undefined') {
|
|
3211
2669
|
files[type] = [];
|
|
3212
2670
|
}
|
|
3213
|
-
|
|
3214
2671
|
files[type].push(asset.data);
|
|
3215
2672
|
}
|
|
3216
2673
|
}
|
|
3217
2674
|
}
|
|
3218
|
-
|
|
3219
2675
|
if (typeof files.js !== 'undefined' && files.js.length > 0) {
|
|
3220
2676
|
$script(files.js, jsLoaded.resolve());
|
|
3221
2677
|
} else {
|
|
3222
2678
|
jsLoaded.resolve();
|
|
3223
2679
|
}
|
|
3224
|
-
|
|
3225
2680
|
if (typeof files.css !== 'undefined' && files.css.length > 0) {
|
|
3226
2681
|
for (i = 0; i < files.css.length; i++) {
|
|
3227
2682
|
if (document.createStyleSheet) {
|
|
@@ -3236,23 +2691,20 @@ var embedAssets = () => {
|
|
|
3236
2691
|
}
|
|
3237
2692
|
}
|
|
3238
2693
|
}
|
|
3239
|
-
|
|
3240
2694
|
return Deferred.when(jsLoaded);
|
|
3241
2695
|
};
|
|
3242
|
-
|
|
3243
2696
|
var handleEventState = () => {
|
|
3244
2697
|
if (lvisEvent === null) {
|
|
3245
2698
|
return;
|
|
3246
|
-
}
|
|
2699
|
+
}
|
|
3247
2700
|
|
|
2701
|
+
// console.log("LViS::handleEventState", lvisEvent.getSubstate());
|
|
3248
2702
|
|
|
3249
2703
|
var state = lvisEvent.getSubstate();
|
|
3250
|
-
|
|
3251
2704
|
if ([Event.STATE_FAILURE, Event.STATE_UPCOMING, Event.STATE_FINISHED].indexOf(state) >= 0) {
|
|
3252
2705
|
// no more data to load
|
|
3253
2706
|
lvisEvent.markAsReady();
|
|
3254
2707
|
}
|
|
3255
|
-
|
|
3256
2708
|
switch (state) {
|
|
3257
2709
|
// case Event.STATE_PENDING: break;
|
|
3258
2710
|
// case Event.STATE_FAILURE:
|
|
@@ -3261,136 +2713,118 @@ var handleEventState = () => {
|
|
|
3261
2713
|
case Event.STATE_ACTIVE:
|
|
3262
2714
|
handleEventActiveState();
|
|
3263
2715
|
break;
|
|
3264
|
-
|
|
3265
2716
|
case Event.STATE_PROLONGED:
|
|
3266
2717
|
handleEventProlongedState();
|
|
3267
2718
|
break;
|
|
3268
|
-
|
|
3269
2719
|
case Event.STATE_FINISHED:
|
|
3270
2720
|
handleEventFinishedState();
|
|
3271
2721
|
break;
|
|
3272
2722
|
}
|
|
3273
2723
|
};
|
|
3274
|
-
|
|
3275
2724
|
var handleEventEOC = () => {
|
|
3276
2725
|
lvisEvent.markAsReady();
|
|
3277
2726
|
};
|
|
3278
|
-
|
|
3279
2727
|
var handleEventActiveState = () => {
|
|
3280
2728
|
// console.log("LViS::handleEventActiveState");
|
|
3281
2729
|
var channels = lvisEvent.getChannels();
|
|
3282
|
-
Factories.setChannels(channels);
|
|
2730
|
+
Factories.setChannels(channels);
|
|
3283
2731
|
|
|
2732
|
+
// subscribe to all channels and kick the things off
|
|
3284
2733
|
for (var key in channels) {
|
|
3285
2734
|
if ({}.hasOwnProperty.call(channels, key)) {
|
|
3286
2735
|
ConnectionAdaptor.subscribe(channels[key]);
|
|
3287
2736
|
}
|
|
3288
2737
|
}
|
|
3289
2738
|
};
|
|
3290
|
-
|
|
3291
2739
|
var handleEventProlongedState = () => {
|
|
3292
2740
|
// console.log("LViS::handleEventProlongedState");
|
|
3293
2741
|
var channels = lvisEvent.getChannels();
|
|
3294
|
-
Factories.setChannels(channels);
|
|
2742
|
+
Factories.setChannels(channels);
|
|
3295
2743
|
|
|
2744
|
+
// subscribe to all channels
|
|
3296
2745
|
for (var key in channels) {
|
|
3297
2746
|
if ({}.hasOwnProperty.call(channels, key)) {
|
|
3298
2747
|
ConnectionAdaptor.subscribe(channels[key]);
|
|
3299
2748
|
}
|
|
3300
2749
|
}
|
|
3301
2750
|
};
|
|
3302
|
-
|
|
3303
2751
|
var handleEventFinishedState = () => {
|
|
3304
2752
|
// console.log("LViS::handleEventFinishedState");
|
|
3305
|
-
var channels = lvisEvent.getChannels();
|
|
2753
|
+
var channels = lvisEvent.getChannels();
|
|
3306
2754
|
|
|
2755
|
+
// unsubscribe from all channels
|
|
3307
2756
|
for (var key in channels) {
|
|
3308
2757
|
if ({}.hasOwnProperty.call(channels, key)) {
|
|
3309
2758
|
ConnectionAdaptor.unsubscribe(channels[key]);
|
|
3310
2759
|
}
|
|
3311
2760
|
}
|
|
3312
2761
|
};
|
|
3313
|
-
|
|
3314
2762
|
var handleEnmasseState = function handleEnmasseState() {
|
|
3315
2763
|
var state = arguments.length <= 0 ? undefined : arguments[0];
|
|
3316
|
-
|
|
3317
2764
|
switch (state) {
|
|
3318
2765
|
case Enmasse.STATE_CONNECTED:
|
|
3319
2766
|
{
|
|
3320
2767
|
var time = arguments.length <= 1 ? undefined : arguments[1];
|
|
3321
2768
|
LViSDate.setTime(time);
|
|
3322
2769
|
ConnectionAdaptor.subscribe(channel);
|
|
3323
|
-
|
|
3324
2770
|
if (lvisEvent && lvisEvent.isReady()) {
|
|
3325
2771
|
lvisEvent.loadHistory(getHost(), true).always(handleEventState);
|
|
3326
2772
|
} else {
|
|
3327
2773
|
handleEventState();
|
|
3328
2774
|
}
|
|
3329
|
-
|
|
3330
2775
|
break;
|
|
3331
2776
|
}
|
|
3332
2777
|
}
|
|
3333
2778
|
};
|
|
3334
|
-
|
|
3335
2779
|
var handleEnmasseReady = () => {
|
|
3336
2780
|
// console.log("API::handleEnmasseReady");
|
|
3337
2781
|
enmasseReady.resolve();
|
|
3338
2782
|
Enmasse.connect();
|
|
3339
2783
|
};
|
|
3340
|
-
|
|
3341
2784
|
var handleEnmasseError = () => {
|
|
3342
2785
|
// console.log("API::handleEnmasseError");
|
|
3343
2786
|
enmasseReady.reject();
|
|
3344
2787
|
};
|
|
3345
|
-
|
|
3346
2788
|
var handleListingsReady = () => {
|
|
3347
2789
|
embedAssets().done(() => assetsReady.resolve()).fail(() => assetsReady.reject());
|
|
3348
2790
|
};
|
|
3349
|
-
|
|
3350
2791
|
var handleSyncDelayChange = () => {
|
|
3351
2792
|
LViS.resetEvent();
|
|
3352
2793
|
};
|
|
3353
|
-
|
|
3354
2794
|
var initWithConfig = function initWithConfig() {
|
|
3355
2795
|
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
3356
2796
|
var UUIDSchema = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
3357
2797
|
var hostSchema = /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$/i;
|
|
3358
|
-
|
|
3359
2798
|
if (typeof config.host === 'undefined' || config.host === null) {
|
|
3360
2799
|
LViS.trigger(LViS.ON_ERROR);
|
|
3361
2800
|
console.error('Host is not set');
|
|
3362
2801
|
return;
|
|
3363
2802
|
}
|
|
3364
|
-
|
|
3365
2803
|
if (typeof config.project === 'undefined' || config.project === null) {
|
|
3366
2804
|
LViS.trigger(LViS.ON_ERROR);
|
|
3367
2805
|
console.error('Project UUID is not set');
|
|
3368
2806
|
return;
|
|
3369
2807
|
}
|
|
3370
|
-
|
|
3371
2808
|
if (!UUIDSchema.test(config.project)) {
|
|
3372
2809
|
LViS.trigger(LViS.ON_ERROR);
|
|
3373
2810
|
console.error('Project UUID has incorrect format');
|
|
3374
2811
|
return;
|
|
3375
2812
|
}
|
|
3376
|
-
|
|
3377
2813
|
if (!hostSchema.test(config.host)) {
|
|
3378
2814
|
LViS.trigger(LViS.ON_ERROR);
|
|
3379
2815
|
console.error('Host has incorrect format');
|
|
3380
2816
|
return;
|
|
3381
2817
|
}
|
|
3382
|
-
|
|
3383
2818
|
if (initialised) {
|
|
3384
2819
|
console.warn('Attempt to initialise library when it was already initialised');
|
|
3385
2820
|
return;
|
|
3386
2821
|
}
|
|
3387
|
-
|
|
3388
2822
|
if (typeof config.forceSecure === 'boolean') {
|
|
3389
2823
|
forceSecure = config.forceSecure;
|
|
3390
2824
|
}
|
|
2825
|
+
channel = "".concat(CHANNEL_CONTROL, "-").concat(config.project);
|
|
3391
2826
|
|
|
3392
|
-
|
|
3393
|
-
|
|
2827
|
+
// remove leading //, http:// or https://
|
|
3394
2828
|
host = config.host.replace(/^(.*:)?(\/+)?/gi, '');
|
|
3395
2829
|
Enmasse.bind(Enmasse.ON_READY, handleEnmasseReady);
|
|
3396
2830
|
Enmasse.bind(Enmasse.ON_ERROR, handleEnmasseError);
|
|
@@ -3419,29 +2853,26 @@ var initWithConfig = function initWithConfig() {
|
|
|
3419
2853
|
});
|
|
3420
2854
|
initialised = true;
|
|
3421
2855
|
};
|
|
2856
|
+
|
|
3422
2857
|
/*
|
|
3423
2858
|
* Public methods
|
|
3424
2859
|
*/
|
|
3425
2860
|
|
|
3426
|
-
|
|
3427
2861
|
var getHost = () => {
|
|
3428
2862
|
var protocol = forceSecure || document.location.protocol.indexOf('https') === 0 ? 'https' : 'http';
|
|
3429
2863
|
return "".concat(protocol, "://").concat(host);
|
|
3430
2864
|
};
|
|
3431
|
-
|
|
3432
2865
|
var getAssets = function getAssets() {
|
|
3433
2866
|
return Listings.getAssets(...arguments);
|
|
3434
2867
|
};
|
|
3435
|
-
|
|
3436
2868
|
var getEvent = () => lvisEvent;
|
|
3437
|
-
|
|
3438
2869
|
var setEvent = newEvent => {
|
|
3439
2870
|
// console.log("LVIS::setEvent", newEvent);
|
|
2871
|
+
|
|
3440
2872
|
// new event mustn't be set if it was already
|
|
3441
2873
|
if (lvisEvent === newEvent) {
|
|
3442
2874
|
return;
|
|
3443
2875
|
}
|
|
3444
|
-
|
|
3445
2876
|
unsetEvent();
|
|
3446
2877
|
lvisEvent = newEvent;
|
|
3447
2878
|
newEvent.loadHistory(getHost()).always(() => {
|
|
@@ -3453,72 +2884,64 @@ var setEvent = newEvent => {
|
|
|
3453
2884
|
handleEventState();
|
|
3454
2885
|
});
|
|
3455
2886
|
};
|
|
3456
|
-
|
|
3457
2887
|
var unsetEvent = () => {
|
|
3458
2888
|
if (lvisEvent === null) {
|
|
3459
2889
|
return;
|
|
3460
2890
|
}
|
|
2891
|
+
var channels = lvisEvent.getChannels();
|
|
3461
2892
|
|
|
3462
|
-
|
|
3463
|
-
|
|
2893
|
+
// unsubscribe from all channels
|
|
3464
2894
|
for (var key in channels) {
|
|
3465
2895
|
if ({}.hasOwnProperty.call(channels, key)) {
|
|
3466
2896
|
ConnectionAdaptor.unsubscribe(channels[key]);
|
|
3467
2897
|
}
|
|
3468
2898
|
}
|
|
3469
|
-
|
|
3470
2899
|
lvisEvent.unbind(Event.ON_SUBSTATE, handleEventState);
|
|
3471
2900
|
lvisEvent.unbind(Event.ON_EOC, handleEventEOC);
|
|
3472
2901
|
lvisEvent.markAsNotReady();
|
|
3473
2902
|
lvisEvent = null;
|
|
3474
2903
|
};
|
|
3475
|
-
|
|
3476
2904
|
var resetEvent = () => {
|
|
3477
2905
|
ConnectionAdaptor.unsubscribe(channel);
|
|
3478
2906
|
ConnectionAdaptor.subscribe(channel);
|
|
3479
|
-
|
|
3480
2907
|
if (lvisEvent === null) {
|
|
3481
2908
|
return;
|
|
3482
2909
|
}
|
|
2910
|
+
var channels = lvisEvent.getChannels();
|
|
3483
2911
|
|
|
3484
|
-
|
|
3485
|
-
|
|
2912
|
+
// unsubscribe from events channels
|
|
3486
2913
|
for (var key in channels) {
|
|
3487
2914
|
if ({}.hasOwnProperty.call(channels, key)) {
|
|
3488
2915
|
ConnectionAdaptor.unsubscribe(channels[key]);
|
|
3489
2916
|
ConnectionAdaptor.subscribe(channels[key]);
|
|
3490
2917
|
}
|
|
3491
2918
|
}
|
|
3492
|
-
|
|
3493
2919
|
lvisEvent.markAsNotReady();
|
|
3494
2920
|
};
|
|
3495
|
-
|
|
3496
2921
|
var init = function init() {
|
|
3497
2922
|
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
3498
2923
|
var initDone = new Deferred();
|
|
3499
|
-
|
|
3500
2924
|
if (config.host && config.project) {
|
|
3501
2925
|
initWithConfig(config);
|
|
3502
2926
|
return initDone.resolve();
|
|
3503
|
-
}
|
|
3504
|
-
|
|
2927
|
+
}
|
|
3505
2928
|
|
|
2929
|
+
// Load miccfg.json file for initialisation config.
|
|
3506
2930
|
fetch(MIC_CONFIG_FILE).then(response => response.json()).then(data => {
|
|
3507
2931
|
if (data.project) {
|
|
3508
2932
|
config.project = data.project;
|
|
3509
2933
|
}
|
|
3510
|
-
|
|
3511
2934
|
if (data.static_host) {
|
|
3512
2935
|
config.host = data.static_host;
|
|
3513
2936
|
}
|
|
3514
|
-
}).catch(() => {
|
|
2937
|
+
}).catch(() => {
|
|
2938
|
+
// Ignore loading error, as the file only available when custom URL is set.
|
|
3515
2939
|
}).finally(() => {
|
|
3516
2940
|
initWithConfig(config);
|
|
3517
2941
|
initDone.resolve();
|
|
3518
2942
|
});
|
|
3519
2943
|
return initDone;
|
|
3520
2944
|
};
|
|
3521
|
-
|
|
3522
2945
|
LViS.getHost = getHost;
|
|
3523
2946
|
LViS.getAssets = getAssets;
|
|
3524
2947
|
LViS.getEvent = getEvent;
|