@xibosignage/xibo-communication-framework 0.0.1

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.
@@ -0,0 +1,592 @@
1
+ import { DateTime } from 'luxon';
2
+
3
+ function asyncGeneratorStep(n, t, e, r, o, a, c) {
4
+ try {
5
+ var i = n[a](c),
6
+ u = i.value;
7
+ } catch (n) {
8
+ return void e(n);
9
+ }
10
+ i.done ? t(u) : Promise.resolve(u).then(r, o);
11
+ }
12
+ function _asyncToGenerator(n) {
13
+ return function () {
14
+ var t = this,
15
+ e = arguments;
16
+ return new Promise(function (r, o) {
17
+ var a = n.apply(t, e);
18
+ function _next(n) {
19
+ asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
20
+ }
21
+ function _throw(n) {
22
+ asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
23
+ }
24
+ _next(void 0);
25
+ });
26
+ };
27
+ }
28
+ function _classCallCheck(a, n) {
29
+ if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
30
+ }
31
+ function _defineProperties(e, r) {
32
+ for (var t = 0; t < r.length; t++) {
33
+ var o = r[t];
34
+ o.enumerable = o.enumerable || false, o.configurable = true, "value" in o && (o.writable = true), Object.defineProperty(e, _toPropertyKey(o.key), o);
35
+ }
36
+ }
37
+ function _createClass(e, r, t) {
38
+ return r && _defineProperties(e.prototype, r), Object.defineProperty(e, "prototype", {
39
+ writable: false
40
+ }), e;
41
+ }
42
+ function _defineProperty(e, r, t) {
43
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
44
+ value: t,
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true
48
+ }) : e[r] = t, e;
49
+ }
50
+ function _regeneratorRuntime() {
51
+ _regeneratorRuntime = function () {
52
+ return r;
53
+ };
54
+ var t,
55
+ r = {},
56
+ e = Object.prototype,
57
+ n = e.hasOwnProperty,
58
+ o = "function" == typeof Symbol ? Symbol : {},
59
+ i = o.iterator || "@@iterator",
60
+ a = o.asyncIterator || "@@asyncIterator",
61
+ u = o.toStringTag || "@@toStringTag";
62
+ function c(t, r, e, n) {
63
+ return Object.defineProperty(t, r, {
64
+ value: e,
65
+ enumerable: !n,
66
+ configurable: !n,
67
+ writable: !n
68
+ });
69
+ }
70
+ try {
71
+ c({}, "");
72
+ } catch (t) {
73
+ c = function (t, r, e) {
74
+ return t[r] = e;
75
+ };
76
+ }
77
+ function h(r, e, n, o) {
78
+ var i = e && e.prototype instanceof Generator ? e : Generator,
79
+ a = Object.create(i.prototype);
80
+ return c(a, "_invoke", function (r, e, n) {
81
+ var o = 1;
82
+ return function (i, a) {
83
+ if (3 === o) throw Error("Generator is already running");
84
+ if (4 === o) {
85
+ if ("throw" === i) throw a;
86
+ return {
87
+ value: t,
88
+ done: true
89
+ };
90
+ }
91
+ for (n.method = i, n.arg = a;;) {
92
+ var u = n.delegate;
93
+ if (u) {
94
+ var c = d(u, n);
95
+ if (c) {
96
+ if (c === f) continue;
97
+ return c;
98
+ }
99
+ }
100
+ if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) {
101
+ if (1 === o) throw o = 4, n.arg;
102
+ n.dispatchException(n.arg);
103
+ } else "return" === n.method && n.abrupt("return", n.arg);
104
+ o = 3;
105
+ var h = s(r, e, n);
106
+ if ("normal" === h.type) {
107
+ if (o = n.done ? 4 : 2, h.arg === f) continue;
108
+ return {
109
+ value: h.arg,
110
+ done: n.done
111
+ };
112
+ }
113
+ "throw" === h.type && (o = 4, n.method = "throw", n.arg = h.arg);
114
+ }
115
+ };
116
+ }(r, n, new Context(o || [])), true), a;
117
+ }
118
+ function s(t, r, e) {
119
+ try {
120
+ return {
121
+ type: "normal",
122
+ arg: t.call(r, e)
123
+ };
124
+ } catch (t) {
125
+ return {
126
+ type: "throw",
127
+ arg: t
128
+ };
129
+ }
130
+ }
131
+ r.wrap = h;
132
+ var f = {};
133
+ function Generator() {}
134
+ function GeneratorFunction() {}
135
+ function GeneratorFunctionPrototype() {}
136
+ var l = {};
137
+ c(l, i, function () {
138
+ return this;
139
+ });
140
+ var p = Object.getPrototypeOf,
141
+ y = p && p(p(x([])));
142
+ y && y !== e && n.call(y, i) && (l = y);
143
+ var v = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(l);
144
+ function g(t) {
145
+ ["next", "throw", "return"].forEach(function (r) {
146
+ c(t, r, function (t) {
147
+ return this._invoke(r, t);
148
+ });
149
+ });
150
+ }
151
+ function AsyncIterator(t, r) {
152
+ function e(o, i, a, u) {
153
+ var c = s(t[o], t, i);
154
+ if ("throw" !== c.type) {
155
+ var h = c.arg,
156
+ f = h.value;
157
+ return f && "object" == typeof f && n.call(f, "__await") ? r.resolve(f.__await).then(function (t) {
158
+ e("next", t, a, u);
159
+ }, function (t) {
160
+ e("throw", t, a, u);
161
+ }) : r.resolve(f).then(function (t) {
162
+ h.value = t, a(h);
163
+ }, function (t) {
164
+ return e("throw", t, a, u);
165
+ });
166
+ }
167
+ u(c.arg);
168
+ }
169
+ var o;
170
+ c(this, "_invoke", function (t, n) {
171
+ function i() {
172
+ return new r(function (r, o) {
173
+ e(t, n, r, o);
174
+ });
175
+ }
176
+ return o = o ? o.then(i, i) : i();
177
+ }, true);
178
+ }
179
+ function d(r, e) {
180
+ var n = e.method,
181
+ o = r.i[n];
182
+ if (o === t) return e.delegate = null, "throw" === n && r.i.return && (e.method = "return", e.arg = t, d(r, e), "throw" === e.method) || "return" !== n && (e.method = "throw", e.arg = new TypeError("The iterator does not provide a '" + n + "' method")), f;
183
+ var i = s(o, r.i, e.arg);
184
+ if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, f;
185
+ var a = i.arg;
186
+ return a ? a.done ? (e[r.r] = a.value, e.next = r.n, "return" !== e.method && (e.method = "next", e.arg = t), e.delegate = null, f) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, f);
187
+ }
188
+ function w(t) {
189
+ this.tryEntries.push(t);
190
+ }
191
+ function m(r) {
192
+ var e = r[4] || {};
193
+ e.type = "normal", e.arg = t, r[4] = e;
194
+ }
195
+ function Context(t) {
196
+ this.tryEntries = [[-1]], t.forEach(w, this), this.reset(true);
197
+ }
198
+ function x(r) {
199
+ if (null != r) {
200
+ var e = r[i];
201
+ if (e) return e.call(r);
202
+ if ("function" == typeof r.next) return r;
203
+ if (!isNaN(r.length)) {
204
+ var o = -1,
205
+ a = function e() {
206
+ for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = false, e;
207
+ return e.value = t, e.done = true, e;
208
+ };
209
+ return a.next = a;
210
+ }
211
+ }
212
+ throw new TypeError(typeof r + " is not iterable");
213
+ }
214
+ return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = c(GeneratorFunctionPrototype, u, "GeneratorFunction"), r.isGeneratorFunction = function (t) {
215
+ var r = "function" == typeof t && t.constructor;
216
+ return !!r && (r === GeneratorFunction || "GeneratorFunction" === (r.displayName || r.name));
217
+ }, r.mark = function (t) {
218
+ return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, "GeneratorFunction")), t.prototype = Object.create(v), t;
219
+ }, r.awrap = function (t) {
220
+ return {
221
+ __await: t
222
+ };
223
+ }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () {
224
+ return this;
225
+ }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) {
226
+ void 0 === i && (i = Promise);
227
+ var a = new AsyncIterator(h(t, e, n, o), i);
228
+ return r.isGeneratorFunction(e) ? a : a.next().then(function (t) {
229
+ return t.done ? t.value : a.next();
230
+ });
231
+ }, g(v), c(v, u, "Generator"), c(v, i, function () {
232
+ return this;
233
+ }), c(v, "toString", function () {
234
+ return "[object Generator]";
235
+ }), r.keys = function (t) {
236
+ var r = Object(t),
237
+ e = [];
238
+ for (var n in r) e.unshift(n);
239
+ return function t() {
240
+ for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = false, t;
241
+ return t.done = true, t;
242
+ };
243
+ }, r.values = x, Context.prototype = {
244
+ constructor: Context,
245
+ reset: function (r) {
246
+ if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = false, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(m), !r) for (var e in this) "t" === e.charAt(0) && n.call(this, e) && !isNaN(+e.slice(1)) && (this[e] = t);
247
+ },
248
+ stop: function () {
249
+ this.done = true;
250
+ var t = this.tryEntries[0][4];
251
+ if ("throw" === t.type) throw t.arg;
252
+ return this.rval;
253
+ },
254
+ dispatchException: function (r) {
255
+ if (this.done) throw r;
256
+ var e = this;
257
+ function n(t) {
258
+ a.type = "throw", a.arg = r, e.next = t;
259
+ }
260
+ for (var o = e.tryEntries.length - 1; o >= 0; --o) {
261
+ var i = this.tryEntries[o],
262
+ a = i[4],
263
+ u = this.prev,
264
+ c = i[1],
265
+ h = i[2];
266
+ if (-1 === i[0]) return n("end"), false;
267
+ if (!c && !h) throw Error("try statement without catch or finally");
268
+ if (null != i[0] && i[0] <= u) {
269
+ if (u < c) return this.method = "next", this.arg = t, n(c), true;
270
+ if (u < h) return n(h), false;
271
+ }
272
+ }
273
+ },
274
+ abrupt: function (t, r) {
275
+ for (var e = this.tryEntries.length - 1; e >= 0; --e) {
276
+ var n = this.tryEntries[e];
277
+ if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) {
278
+ var o = n;
279
+ break;
280
+ }
281
+ }
282
+ o && ("break" === t || "continue" === t) && o[0] <= r && r <= o[2] && (o = null);
283
+ var i = o ? o[4] : {};
284
+ return i.type = t, i.arg = r, o ? (this.method = "next", this.next = o[2], f) : this.complete(i);
285
+ },
286
+ complete: function (t, r) {
287
+ if ("throw" === t.type) throw t.arg;
288
+ return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && r && (this.next = r), f;
289
+ },
290
+ finish: function (t) {
291
+ for (var r = this.tryEntries.length - 1; r >= 0; --r) {
292
+ var e = this.tryEntries[r];
293
+ if (e[2] === t) return this.complete(e[4], e[3]), m(e), f;
294
+ }
295
+ },
296
+ catch: function (t) {
297
+ for (var r = this.tryEntries.length - 1; r >= 0; --r) {
298
+ var e = this.tryEntries[r];
299
+ if (e[0] === t) {
300
+ var n = e[4];
301
+ if ("throw" === n.type) {
302
+ var o = n.arg;
303
+ m(e);
304
+ }
305
+ return o;
306
+ }
307
+ }
308
+ throw Error("illegal catch attempt");
309
+ },
310
+ delegateYield: function (r, e, n) {
311
+ return this.delegate = {
312
+ i: x(r),
313
+ r: e,
314
+ n: n
315
+ }, "next" === this.method && (this.arg = t), f;
316
+ }
317
+ }, r;
318
+ }
319
+ function _toPrimitive(t, r) {
320
+ if ("object" != typeof t || !t) return t;
321
+ var e = t[Symbol.toPrimitive];
322
+ if (void 0 !== e) {
323
+ var i = e.call(t, r);
324
+ if ("object" != typeof i) return i;
325
+ throw new TypeError("@@toPrimitive must return a primitive value.");
326
+ }
327
+ return (String )(t);
328
+ }
329
+ function _toPropertyKey(t) {
330
+ var i = _toPrimitive(t, "string");
331
+ return "symbol" == typeof i ? i : i + "";
332
+ }
333
+
334
+ var createNanoEvents = function createNanoEvents() {
335
+ return {
336
+ emit: function emit(event) {
337
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
338
+ args[_key - 1] = arguments[_key];
339
+ }
340
+ for (var callbacks = this.events[event] || [], i = 0, length = callbacks.length; i < length; i++) {
341
+ callbacks[i].apply(callbacks, args);
342
+ }
343
+ },
344
+ events: {},
345
+ on: function on(event, cb) {
346
+ var _this$events,
347
+ _this = this;
348
+ ((_this$events = this.events)[event] || (_this$events[event] = [])).push(cb);
349
+ return function () {
350
+ var _this$events$event;
351
+ _this.events[event] = (_this$events$event = _this.events[event]) === null || _this$events$event === void 0 ? void 0 : _this$events$event.filter(function (i) {
352
+ return cb !== i;
353
+ });
354
+ };
355
+ }
356
+ };
357
+ };
358
+
359
+ var Xmr = /*#__PURE__*/function () {
360
+ function Xmr(channel) {
361
+ _classCallCheck(this, Xmr);
362
+ _defineProperty(this, "emitter", void 0);
363
+ _defineProperty(this, "url", void 0);
364
+ _defineProperty(this, "cmsKey", void 0);
365
+ _defineProperty(this, "channel", void 0);
366
+ _defineProperty(this, "socket", void 0);
367
+ // State
368
+ _defineProperty(this, "isConnectionWanted", void 0);
369
+ _defineProperty(this, "isConnected", void 0);
370
+ _defineProperty(this, "lastMessageAt", void 0);
371
+ _defineProperty(this, "interval", void 0);
372
+ // Emitter
373
+ this.emitter = createNanoEvents();
374
+ this.url = null;
375
+ this.cmsKey = null;
376
+ this.channel = channel;
377
+ this.isConnected = false;
378
+ this.isConnectionWanted = false;
379
+ this.lastMessageAt = DateTime.now().minus({
380
+ year: 1
381
+ });
382
+ }
383
+ return _createClass(Xmr, [{
384
+ key: "on",
385
+ value: function on(event, callback) {
386
+ return this.emitter.on(event, callback);
387
+ }
388
+ }, {
389
+ key: "init",
390
+ value: function () {
391
+ var _init = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
392
+ var _this = this;
393
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
394
+ while (1) switch (_context.prev = _context.next) {
395
+ case 0:
396
+ this.interval = setInterval(function () {
397
+ if (_this.isConnectionWanted && !_this.isActive()) {
398
+ console.debug('Xmr::setInterval: should be active');
399
+ // Call start again
400
+ _this.start(_this.url || 'DISABLED', _this.cmsKey || 'n/a');
401
+ }
402
+ }, 60000);
403
+ case 1:
404
+ case "end":
405
+ return _context.stop();
406
+ }
407
+ }, _callee, this);
408
+ }));
409
+ function init() {
410
+ return _init.apply(this, arguments);
411
+ }
412
+ return init;
413
+ }()
414
+ }, {
415
+ key: "start",
416
+ value: function () {
417
+ var _start = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(url, cmsKey) {
418
+ var _this2 = this;
419
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
420
+ while (1) switch (_context2.prev = _context2.next) {
421
+ case 0:
422
+ if (!(!this.channel || this.channel === 'unknown')) {
423
+ _context2.next = 3;
424
+ break;
425
+ }
426
+ console.error('Xmr::start: channel unknown, XMR will be disabled');
427
+ return _context2.abrupt("return");
428
+ case 3:
429
+ if (!(this.url === 'DISABLED')) {
430
+ _context2.next = 8;
431
+ break;
432
+ }
433
+ console.info('Xmr::start: XMR disabled');
434
+ this.isConnectionWanted = false;
435
+ if (this.isActive()) {
436
+ stop();
437
+ }
438
+ return _context2.abrupt("return");
439
+ case 8:
440
+ this.isConnectionWanted = true;
441
+ // Are we already connected?
442
+ if (!(this.isActive() && this.url === url)) {
443
+ _context2.next = 15;
444
+ break;
445
+ }
446
+ console.debug('Xmr::start: already connected to this URL');
447
+ this.cmsKey = cmsKey;
448
+ return _context2.abrupt("return");
449
+ case 15:
450
+ if (!this.isConnected) {
451
+ _context2.next = 21;
452
+ break;
453
+ }
454
+ console.debug('Xmr::start: already connected but not active, or a different URL');
455
+ _context2.next = 19;
456
+ return this.stop();
457
+ case 19:
458
+ _context2.next = 22;
459
+ break;
460
+ case 21:
461
+ console.debug('Xmr::start: not connected yet');
462
+ case 22:
463
+ // Set the URL and cmsKey.
464
+ this.url = url;
465
+ this.cmsKey = cmsKey;
466
+ console.debug('Xmr::start: connecting to ' + this.url);
467
+ _context2.prev = 25;
468
+ this.socket = new WebSocket(this.url);
469
+ _context2.next = 34;
470
+ break;
471
+ case 29:
472
+ _context2.prev = 29;
473
+ _context2.t0 = _context2["catch"](25);
474
+ console.debug('Xmr::start: failed connecting to ' + this.url + ', e = ' + _context2.t0);
475
+ this.emitter.emit('error', 'Failed to connect');
476
+ return _context2.abrupt("return");
477
+ case 34:
478
+ /**
479
+ * Listener for socket open
480
+ */
481
+ this.socket.addEventListener('open', function (event) {
482
+ console.debug('Xmr::' + event.type);
483
+ if (_this2.socket.readyState !== WebSocket.OPEN) {
484
+ console.info('Xmr::' + event.type + ': not open yet');
485
+ return;
486
+ }
487
+ // Create and send an initialisation message.
488
+ _this2.socket.send(JSON.stringify({
489
+ 'type': 'init',
490
+ 'key': _this2.cmsKey,
491
+ 'channel': _this2.channel
492
+ }));
493
+ _this2.isConnected = true;
494
+ _this2.emitter.emit('connected');
495
+ });
496
+ /**
497
+ * Listener for socket close
498
+ */
499
+ this.socket.addEventListener('close', function (event) {
500
+ console.debug('Xmr::' + event.type);
501
+ _this2.isConnected = false;
502
+ _this2.emitter.emit('disconnected');
503
+ });
504
+ /**
505
+ * Listener for socket error
506
+ */
507
+ this.socket.addEventListener('error', function (event) {
508
+ console.debug('Xmr::' + event.type);
509
+ _this2.emitter.emit('error', 'error');
510
+ });
511
+ /**
512
+ * Listener for socket message
513
+ */
514
+ this.socket.addEventListener('message', function (event) {
515
+ console.debug(event);
516
+ _this2.lastMessageAt = DateTime.now();
517
+ _this2.emitter.emit('statusChange', _this2.lastMessageAt.toISO() || '');
518
+ // Expect a JSON message or a H
519
+ if (event.data === 'H') {
520
+ console.debug('Xmr::message: Heartbeat...');
521
+ } else {
522
+ // JSON message.
523
+ var message = JSON.parse(event.data);
524
+ console.debug('Xmr::message: action is ' + message.action);
525
+ // Check the createdDt and TTL against the current date time.
526
+ var expiresAt = DateTime.fromISO(message.createdDt).plus({
527
+ seconds: parseInt(message.ttl)
528
+ });
529
+ if (expiresAt < DateTime.now()) {
530
+ console.debug('Xmr::message: message expired at ' + expiresAt.toString());
531
+ } else if (message.action === 'collectNow') {
532
+ _this2.emitter.emit('collectNow');
533
+ } else if (message.action === 'screenShot') {
534
+ _this2.emitter.emit('screenShot');
535
+ } else if (message.action === 'licenceCheck') {
536
+ _this2.emitter.emit('licenceCheck');
537
+ } else if (message.action == 'commandAction' && message.commandCode.startsWith('showStatusWindow')) {
538
+ var split = message.commandCode.split('|');
539
+ _this2.emitter.emit('showStatusWindow', parseInt(split[1]) || 60);
540
+ } else {
541
+ console.error('Xmr::message: unknown action: ' + message.action);
542
+ }
543
+ }
544
+ });
545
+ case 38:
546
+ case "end":
547
+ return _context2.stop();
548
+ }
549
+ }, _callee2, this, [[25, 29]]);
550
+ }));
551
+ function start(_x, _x2) {
552
+ return _start.apply(this, arguments);
553
+ }
554
+ return start;
555
+ }()
556
+ }, {
557
+ key: "stop",
558
+ value: function () {
559
+ var _stop = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
560
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
561
+ while (1) switch (_context3.prev = _context3.next) {
562
+ case 0:
563
+ console.debug('Xmr::stop');
564
+ if (this.socket) {
565
+ console.debug('Xmr::stop: closing active socket');
566
+ this.socket.close();
567
+ this.isConnected = false;
568
+ }
569
+ case 2:
570
+ case "end":
571
+ return _context3.stop();
572
+ }
573
+ }, _callee3, this);
574
+ }));
575
+ function stop() {
576
+ return _stop.apply(this, arguments);
577
+ }
578
+ return stop;
579
+ }()
580
+ }, {
581
+ key: "isActive",
582
+ value: function isActive() {
583
+ console.debug('Xmr::isActive: lastMessageAt: ' + this.lastMessageAt.toString());
584
+ return this.isConnected && this.lastMessageAt > DateTime.now().minus({
585
+ minute: 15
586
+ });
587
+ }
588
+ }]);
589
+ }();
590
+
591
+ export { Xmr };
592
+ //# sourceMappingURL=xibo-communication-framework.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xibo-communication-framework.esm.js","sources":["../node_modules/nanoevents/index.js","../../src/modules/xmr/xmr.ts"],"sourcesContent":["export let createNanoEvents = () => ({\n emit(event, ...args) {\n for (\n let callbacks = this.events[event] || [],\n i = 0,\n length = callbacks.length;\n i < length;\n i++\n ) {\n callbacks[i](...args)\n }\n },\n events: {},\n on(event, cb) {\n ;(this.events[event] ||= []).push(cb)\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i)\n }\n }\n})\n","/*\n * Copyright (C) 2025 Xibo Signage Ltd\n *\n * Xibo - Digital Signage - https://www.xibosignage.com\n *\n * This file is part of Xibo.\n *\n * Xibo is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * any later version.\n *\n * Xibo is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with Xibo. If not, see <http://www.gnu.org/licenses/>.\n */\nimport {createNanoEvents, type Emitter} from 'nanoevents';\nimport {DateTime} from 'luxon';\n\nexport interface XmrEvents {\n connected: () => void;\n disconnected: () => void;\n error: (e: string) => void;\n statusChange: (status: string) => void;\n\n collectNow: () => void;\n screenShot: () => void;\n licenceCheck: () => void;\n showStatusWindow: (timeout: number) => void;\n}\n\nexport default class Xmr {\n emitter: Emitter<XmrEvents>;\n\n url: string | null;\n cmsKey: string | null;\n channel: string;\n socket!: WebSocket;\n\n // State\n isConnectionWanted: boolean;\n isConnected: boolean;\n lastMessageAt: DateTime;\n\n interval: NodeJS.Timeout | undefined;\n\n constructor (channel: string) {\n // Emitter\n this.emitter = createNanoEvents<XmrEvents>();\n this.url = null;\n this.cmsKey = null;\n this.channel = channel;\n this.isConnected = false;\n this.isConnectionWanted = false;\n this.lastMessageAt = DateTime.now().minus({year: 1});\n }\n\n on<E extends keyof XmrEvents>(event: E, callback: XmrEvents[E]) {\n return this.emitter.on(event, callback);\n }\n\n async init() {\n this.interval = setInterval(() => {\n if (this.isConnectionWanted && !this.isActive()) {\n console.debug('Xmr::setInterval: should be active');\n\n // Call start again\n this.start(this.url || 'DISABLED', this.cmsKey || 'n/a');\n }\n }, 60000);\n }\n\n async start(url: string, cmsKey: string){\n if (!this.channel || this.channel === 'unknown') {\n console.error('Xmr::start: channel unknown, XMR will be disabled');\n return;\n }\n\n // Disable XMR if we've been told to.\n if (this.url === 'DISABLED') {\n console.info('Xmr::start: XMR disabled');\n this.isConnectionWanted = false;\n if (this.isActive()) {\n stop();\n }\n return;\n }\n\n this.isConnectionWanted = true;\n\n // Are we already connected?\n if (this.isActive() && this.url === url) {\n console.debug('Xmr::start: already connected to this URL');\n this.cmsKey = cmsKey;\n return;\n } else if (this.isConnected) {\n console.debug('Xmr::start: already connected but not active, or a different URL');\n await this.stop();\n } else {\n console.debug('Xmr::start: not connected yet');\n }\n\n // Set the URL and cmsKey.\n this.url = url;\n this.cmsKey = cmsKey;\n\n console.debug('Xmr::start: connecting to ' + this.url);\n\n try {\n this.socket = new WebSocket(this.url);\n } catch (e) {\n console.debug('Xmr::start: failed connecting to ' + this.url + ', e = ' + e);\n this.emitter.emit('error', 'Failed to connect');\n return;\n }\n\n /**\n * Listener for socket open\n */\n this.socket.addEventListener('open', (event) => {\n console.debug('Xmr::' + event.type);\n\n if (this.socket.readyState !== WebSocket.OPEN) {\n console.info('Xmr::' + event.type + ': not open yet');\n return;\n }\n\n // Create and send an initialisation message.\n this.socket.send(JSON.stringify({\n 'type': 'init',\n 'key': this.cmsKey,\n 'channel': this.channel,\n }));\n\n this.isConnected = true;\n\n this.emitter.emit('connected');\n });\n\n /**\n * Listener for socket close\n */\n this.socket.addEventListener('close', (event) => {\n console.debug('Xmr::' + event.type);\n\n this.isConnected = false;\n\n this.emitter.emit('disconnected');\n });\n\n /**\n * Listener for socket error\n */\n this.socket.addEventListener('error', (event) => {\n console.debug('Xmr::' + event.type);\n\n this.emitter.emit('error', 'error');\n });\n\n /**\n * Listener for socket message\n */\n this.socket.addEventListener('message', (event) => {\n console.debug(event);\n\n this.lastMessageAt = DateTime.now();\n this.emitter.emit('statusChange', this.lastMessageAt.toISO() || '');\n\n // Expect a JSON message or a H\n if (event.data === 'H') {\n console.debug('Xmr::message: Heartbeat...');\n } else {\n // JSON message.\n const message = JSON.parse(event.data);\n\n console.debug('Xmr::message: action is ' + message.action);\n\n // Check the createdDt and TTL against the current date time.\n const expiresAt = DateTime.fromISO(message.createdDt).plus({seconds: parseInt(message.ttl)});\n if (expiresAt < DateTime.now()) {\n console.debug('Xmr::message: message expired at ' + expiresAt.toString());\n } else if (message.action === 'collectNow') {\n this.emitter.emit('collectNow');\n } else if (message.action === 'screenShot') {\n this.emitter.emit('screenShot');\n } else if (message.action === 'licenceCheck') {\n this.emitter.emit('licenceCheck');\n } else if (message.action == 'commandAction' && message.commandCode.startsWith('showStatusWindow')) {\n const split = message.commandCode.split('|');\n this.emitter.emit('showStatusWindow', parseInt(split[1]) || 60);\n } else {\n console.error('Xmr::message: unknown action: ' + message.action);\n }\n }\n });\n }\n\n async stop() {\n console.debug('Xmr::stop');\n if (this.socket) {\n console.debug('Xmr::stop: closing active socket');\n this.socket.close();\n this.isConnected = false;\n }\n }\n\n isActive(): boolean {\n console.debug('Xmr::isActive: lastMessageAt: ' + this.lastMessageAt.toString());\n return this.isConnected && this.lastMessageAt > DateTime.now().minus({minute: 15});\n }\n}\n"],"names":["createNanoEvents","emit","event","_len","arguments","length","args","Array","_key","callbacks","events","i","apply","on","cb","_this$events","_this","push","_this$events$event","filter","Xmr","channel","_classCallCheck","_defineProperty","emitter","url","cmsKey","isConnected","isConnectionWanted","lastMessageAt","DateTime","now","minus","year","_createClass","key","value","callback","_init","_asyncToGenerator","_regeneratorRuntime","mark","_callee","wrap","_callee$","_context","prev","next","interval","setInterval","isActive","console","debug","start","stop","init","_start","_callee2","_this2","_callee2$","_context2","error","abrupt","info","socket","WebSocket","t0","addEventListener","type","readyState","OPEN","send","JSON","stringify","toISO","data","message","parse","action","expiresAt","fromISO","createdDt","plus","seconds","parseInt","ttl","toString","commandCode","startsWith","split","_x","_x2","_stop","_callee3","_callee3$","_context3","close","minute"],"mappings":"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","x_google_ignoreList":[0]}