@monterosa/sdk-lvis 0.18.9 → 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.
@@ -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.9";
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
- timecode = args[1];
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
- } // if there are still left message in queue
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(); // Can publish whether:
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) {// console.error('ConnectionAdaptor: Unable to parse listings data');
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
- var adaptOtherSnapshot = () => {// console.log('ConnectionAdaptor::adaptOtherSnapshot', snapshot);
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) {// console.error('ConnectionAdaptor: Unable to parse listings data');
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(); // store delay
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) {// console.error('ConnectionAdaptor: Unable to parse create data');
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) {// console.error('ConnectionAdaptor: Unable to parse revoke data');
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) {// why do we fail silently?
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
- destroy() {// console.log("Entity::destroy id=%s" + this.getId());
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'); // trying to set stored language
769
+ var storedLanguage = Storage.get('lang');
923
770
 
771
+ // trying to set stored language
924
772
  if (storedLanguage) {
925
773
  self.setCurrentLanguage(storedLanguage);
926
- } // if current is not set yet using default language
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
- } // custom field was passed
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
- } // otherwise return null
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 || {}; // calculate real duration left only for fixed frames
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); // Order of messages from enmasse is not guaranteed.
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
- } // TODO: Combine populateResults() and populateResultsFromSnapshot() methods
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
- }; // option's index starts with 1
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; // calculate weighted results
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; // loop through the loop and process each item
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]; // trying to find existent instance
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); // if poll doesn't exist
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
- this.instances[poll.getId()]._channel = message.channel; // remove processed item from the queue
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
- processPollMessage(poll
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 = []; // converting counters to integer
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
- } // TODO: combine create() and createSnapshot() methods
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(); // a queue of messages on poll's channel
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 = {}; // Hash of factories instances keyed on frame type.
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 _iterator = _createForOfIteratorHelper(factories),
2162
- _step;
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
- channel = _config.channel;
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
- var instance = factory.get(data.id); // secure runtime against broken data
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); // trigger MSG_TYPE_CREATE only if instance is finalized
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; // flag `started` is used to determine if event is manual,
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
- config = _ref.config;
1974
+ config = _ref.config;
2424
1975
  var snapshots = timeline.map(item => item);
2425
- snapshots.forEach(ConnectionAdaptor.adaptSnapshotData); // elements to revoke
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; // delay at the moment of time when event's data were adapted
2012
+ var ignore = parseInt(Project.get('history_ignore'), 10) || 60;
2466
2013
 
2467
- var delay = self.get('__delay'); // even'ts start time (including delay)
2014
+ // delay at the moment of time when event's data were adapted
2015
+ var delay = self.get('__delay');
2468
2016
 
2469
- var start = self.get('start_at'); // do not load history if now before this time
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
- } // sort by published at and id
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
- } // custom field was passed
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
- } // otherwise return null
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; // countdown values
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
- } // calculate difference between event start at and now dates relatively to the Unix Epoch time
2649
-
2162
+ }
2650
2163
 
2651
- var diff = new Date(diffSeconds * 1000); // methods to be casted on diff date
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
- key = _Object$entries$_i[0],
2666
- method = _Object$entries$_i[1];
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'); // Assert on race condition when the event becomes ready before
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; // constants
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
- } // do not expose ON_READY event if listings were initialised already
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
- }; // check if there are any changes in listings data
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; // iterate over came events data
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); // new episode OR digest of the existant event has changed
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
- } // check if event was removed
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
- }); // populate project object with the data
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
- } // update instances
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); // Data from Enmasse has priority over data from CDN
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
- }; // Current episode is the episode start time
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(); // loop through the raw data
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
- } // return NULL if nothing found
3004
-
2479
+ }
3005
2480
 
2481
+ // return NULL if nothing found
3006
2482
  return list.length ? list : null;
3007
- }; // Returns:
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 = []; // loop through the raw data and find
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
- } // return NULL if nothing found
3036
-
2510
+ }
3037
2511
 
2512
+ // return NULL if nothing found
3038
2513
  return list.length ? list : null;
3039
- }; // can't be realized now due to absence of
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( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(host, project) {
2540
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(host, project) {
3071
2541
  var response, data;
3072
- return _regeneratorRuntime.wrap(function _callee$(_context) {
3073
- while (1) {
3074
- switch (_context.prev = _context.next) {
3075
- case 0:
3076
- _context.next = 2;
3077
- return fetch("https://".concat(host, "/projects/").concat(project.substr(0, 2), "/").concat(project, "/listings.json"));
3078
-
3079
- case 2:
3080
- response = _context.sent;
3081
- _context.next = 5;
3082
- return response.json();
3083
-
3084
- case 5:
3085
- data = _context.sent;
3086
- handleData(data);
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; // attach xhr library to make it possible to mock it in unit tests
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
- } // console.log("LViS::handleEventState", lvisEvent.getSubstate());
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); // subscribe to all channels and kick the things off
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); // subscribe to all 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(); // unsubscribe from all channels
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
- channel = "".concat(CHANNEL_CONTROL, "-").concat(config.project); // remove leading //, http:// or https://
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
- var channels = lvisEvent.getChannels(); // unsubscribe from all channels
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
- var channels = lvisEvent.getChannels(); // unsubscribe from events channels
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
- } // Load miccfg.json file for initialisation config.
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(() => {// Ignore loading error, as the file only available when custom URL is set.
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;