Showing
10 changed files
with
66 additions
and
498 deletions
| ... | @@ -2,472 +2,7 @@ | ... | @@ -2,472 +2,7 @@ |
| 2 | 2 | ||
| 3 | Object.defineProperty(exports, '__esModule', { value: true }); | 3 | Object.defineProperty(exports, '__esModule', { value: true }); |
| 4 | 4 | ||
| 5 | -var domain; | 5 | +var events = require('events'); |
| 6 | - | ||
| 7 | -// This constructor is used to store event handlers. Instantiating this is | ||
| 8 | -// faster than explicitly calling `Object.create(null)` to get a "clean" empty | ||
| 9 | -// object (tested with v8 v4.9). | ||
| 10 | -function EventHandlers() {} | ||
| 11 | -EventHandlers.prototype = Object.create(null); | ||
| 12 | - | ||
| 13 | -function EventEmitter() { | ||
| 14 | - EventEmitter.init.call(this); | ||
| 15 | -} | ||
| 16 | -EventEmitter.usingDomains = false; | ||
| 17 | - | ||
| 18 | -EventEmitter.prototype.domain = undefined; | ||
| 19 | -EventEmitter.prototype._events = undefined; | ||
| 20 | -EventEmitter.prototype._maxListeners = undefined; | ||
| 21 | - | ||
| 22 | -// By default EventEmitters will print a warning if more than 10 listeners are | ||
| 23 | -// added to it. This is a useful default which helps finding memory leaks. | ||
| 24 | -EventEmitter.defaultMaxListeners = 10; | ||
| 25 | - | ||
| 26 | -EventEmitter.init = function() { | ||
| 27 | - this.domain = null; | ||
| 28 | - if (EventEmitter.usingDomains) { | ||
| 29 | - // if there is an active domain, then attach to it. | ||
| 30 | - if (domain.active && !(this instanceof domain.Domain)) { | ||
| 31 | - this.domain = domain.active; | ||
| 32 | - } | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | - if (!this._events || this._events === Object.getPrototypeOf(this)._events) { | ||
| 36 | - this._events = new EventHandlers(); | ||
| 37 | - this._eventsCount = 0; | ||
| 38 | - } | ||
| 39 | - | ||
| 40 | - this._maxListeners = this._maxListeners || undefined; | ||
| 41 | -}; | ||
| 42 | - | ||
| 43 | -// Obviously not all Emitters should be limited to 10. This function allows | ||
| 44 | -// that to be increased. Set to zero for unlimited. | ||
| 45 | -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { | ||
| 46 | - if (typeof n !== 'number' || n < 0 || isNaN(n)) | ||
| 47 | - throw new TypeError('"n" argument must be a positive number'); | ||
| 48 | - this._maxListeners = n; | ||
| 49 | - return this; | ||
| 50 | -}; | ||
| 51 | - | ||
| 52 | -function $getMaxListeners(that) { | ||
| 53 | - if (that._maxListeners === undefined) | ||
| 54 | - return EventEmitter.defaultMaxListeners; | ||
| 55 | - return that._maxListeners; | ||
| 56 | -} | ||
| 57 | - | ||
| 58 | -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { | ||
| 59 | - return $getMaxListeners(this); | ||
| 60 | -}; | ||
| 61 | - | ||
| 62 | -// These standalone emit* functions are used to optimize calling of event | ||
| 63 | -// handlers for fast cases because emit() itself often has a variable number of | ||
| 64 | -// arguments and can be deoptimized because of that. These functions always have | ||
| 65 | -// the same number of arguments and thus do not get deoptimized, so the code | ||
| 66 | -// inside them can execute faster. | ||
| 67 | -function emitNone(handler, isFn, self) { | ||
| 68 | - if (isFn) | ||
| 69 | - handler.call(self); | ||
| 70 | - else { | ||
| 71 | - var len = handler.length; | ||
| 72 | - var listeners = arrayClone(handler, len); | ||
| 73 | - for (var i = 0; i < len; ++i) | ||
| 74 | - listeners[i].call(self); | ||
| 75 | - } | ||
| 76 | -} | ||
| 77 | -function emitOne(handler, isFn, self, arg1) { | ||
| 78 | - if (isFn) | ||
| 79 | - handler.call(self, arg1); | ||
| 80 | - else { | ||
| 81 | - var len = handler.length; | ||
| 82 | - var listeners = arrayClone(handler, len); | ||
| 83 | - for (var i = 0; i < len; ++i) | ||
| 84 | - listeners[i].call(self, arg1); | ||
| 85 | - } | ||
| 86 | -} | ||
| 87 | -function emitTwo(handler, isFn, self, arg1, arg2) { | ||
| 88 | - if (isFn) | ||
| 89 | - handler.call(self, arg1, arg2); | ||
| 90 | - else { | ||
| 91 | - var len = handler.length; | ||
| 92 | - var listeners = arrayClone(handler, len); | ||
| 93 | - for (var i = 0; i < len; ++i) | ||
| 94 | - listeners[i].call(self, arg1, arg2); | ||
| 95 | - } | ||
| 96 | -} | ||
| 97 | -function emitThree(handler, isFn, self, arg1, arg2, arg3) { | ||
| 98 | - if (isFn) | ||
| 99 | - handler.call(self, arg1, arg2, arg3); | ||
| 100 | - else { | ||
| 101 | - var len = handler.length; | ||
| 102 | - var listeners = arrayClone(handler, len); | ||
| 103 | - for (var i = 0; i < len; ++i) | ||
| 104 | - listeners[i].call(self, arg1, arg2, arg3); | ||
| 105 | - } | ||
| 106 | -} | ||
| 107 | - | ||
| 108 | -function emitMany(handler, isFn, self, args) { | ||
| 109 | - if (isFn) | ||
| 110 | - handler.apply(self, args); | ||
| 111 | - else { | ||
| 112 | - var len = handler.length; | ||
| 113 | - var listeners = arrayClone(handler, len); | ||
| 114 | - for (var i = 0; i < len; ++i) | ||
| 115 | - listeners[i].apply(self, args); | ||
| 116 | - } | ||
| 117 | -} | ||
| 118 | - | ||
| 119 | -EventEmitter.prototype.emit = function emit(type) { | ||
| 120 | - var er, handler, len, args, i, events, domain; | ||
| 121 | - var needDomainExit = false; | ||
| 122 | - var doError = (type === 'error'); | ||
| 123 | - | ||
| 124 | - events = this._events; | ||
| 125 | - if (events) | ||
| 126 | - doError = (doError && events.error == null); | ||
| 127 | - else if (!doError) | ||
| 128 | - return false; | ||
| 129 | - | ||
| 130 | - domain = this.domain; | ||
| 131 | - | ||
| 132 | - // If there is no 'error' event listener then throw. | ||
| 133 | - if (doError) { | ||
| 134 | - er = arguments[1]; | ||
| 135 | - if (domain) { | ||
| 136 | - if (!er) | ||
| 137 | - er = new Error('Uncaught, unspecified "error" event'); | ||
| 138 | - er.domainEmitter = this; | ||
| 139 | - er.domain = domain; | ||
| 140 | - er.domainThrown = false; | ||
| 141 | - domain.emit('error', er); | ||
| 142 | - } else if (er instanceof Error) { | ||
| 143 | - throw er; // Unhandled 'error' event | ||
| 144 | - } else { | ||
| 145 | - // At least give some kind of context to the user | ||
| 146 | - var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); | ||
| 147 | - err.context = er; | ||
| 148 | - throw err; | ||
| 149 | - } | ||
| 150 | - return false; | ||
| 151 | - } | ||
| 152 | - | ||
| 153 | - handler = events[type]; | ||
| 154 | - | ||
| 155 | - if (!handler) | ||
| 156 | - return false; | ||
| 157 | - | ||
| 158 | - var isFn = typeof handler === 'function'; | ||
| 159 | - len = arguments.length; | ||
| 160 | - switch (len) { | ||
| 161 | - // fast cases | ||
| 162 | - case 1: | ||
| 163 | - emitNone(handler, isFn, this); | ||
| 164 | - break; | ||
| 165 | - case 2: | ||
| 166 | - emitOne(handler, isFn, this, arguments[1]); | ||
| 167 | - break; | ||
| 168 | - case 3: | ||
| 169 | - emitTwo(handler, isFn, this, arguments[1], arguments[2]); | ||
| 170 | - break; | ||
| 171 | - case 4: | ||
| 172 | - emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); | ||
| 173 | - break; | ||
| 174 | - // slower | ||
| 175 | - default: | ||
| 176 | - args = new Array(len - 1); | ||
| 177 | - for (i = 1; i < len; i++) | ||
| 178 | - args[i - 1] = arguments[i]; | ||
| 179 | - emitMany(handler, isFn, this, args); | ||
| 180 | - } | ||
| 181 | - | ||
| 182 | - if (needDomainExit) | ||
| 183 | - domain.exit(); | ||
| 184 | - | ||
| 185 | - return true; | ||
| 186 | -}; | ||
| 187 | - | ||
| 188 | -function _addListener(target, type, listener, prepend) { | ||
| 189 | - var m; | ||
| 190 | - var events; | ||
| 191 | - var existing; | ||
| 192 | - | ||
| 193 | - if (typeof listener !== 'function') | ||
| 194 | - throw new TypeError('"listener" argument must be a function'); | ||
| 195 | - | ||
| 196 | - events = target._events; | ||
| 197 | - if (!events) { | ||
| 198 | - events = target._events = new EventHandlers(); | ||
| 199 | - target._eventsCount = 0; | ||
| 200 | - } else { | ||
| 201 | - // To avoid recursion in the case that type === "newListener"! Before | ||
| 202 | - // adding it to the listeners, first emit "newListener". | ||
| 203 | - if (events.newListener) { | ||
| 204 | - target.emit('newListener', type, | ||
| 205 | - listener.listener ? listener.listener : listener); | ||
| 206 | - | ||
| 207 | - // Re-assign `events` because a newListener handler could have caused the | ||
| 208 | - // this._events to be assigned to a new object | ||
| 209 | - events = target._events; | ||
| 210 | - } | ||
| 211 | - existing = events[type]; | ||
| 212 | - } | ||
| 213 | - | ||
| 214 | - if (!existing) { | ||
| 215 | - // Optimize the case of one listener. Don't need the extra array object. | ||
| 216 | - existing = events[type] = listener; | ||
| 217 | - ++target._eventsCount; | ||
| 218 | - } else { | ||
| 219 | - if (typeof existing === 'function') { | ||
| 220 | - // Adding the second element, need to change to array. | ||
| 221 | - existing = events[type] = prepend ? [listener, existing] : | ||
| 222 | - [existing, listener]; | ||
| 223 | - } else { | ||
| 224 | - // If we've already got an array, just append. | ||
| 225 | - if (prepend) { | ||
| 226 | - existing.unshift(listener); | ||
| 227 | - } else { | ||
| 228 | - existing.push(listener); | ||
| 229 | - } | ||
| 230 | - } | ||
| 231 | - | ||
| 232 | - // Check for listener leak | ||
| 233 | - if (!existing.warned) { | ||
| 234 | - m = $getMaxListeners(target); | ||
| 235 | - if (m && m > 0 && existing.length > m) { | ||
| 236 | - existing.warned = true; | ||
| 237 | - var w = new Error('Possible EventEmitter memory leak detected. ' + | ||
| 238 | - existing.length + ' ' + type + ' listeners added. ' + | ||
| 239 | - 'Use emitter.setMaxListeners() to increase limit'); | ||
| 240 | - w.name = 'MaxListenersExceededWarning'; | ||
| 241 | - w.emitter = target; | ||
| 242 | - w.type = type; | ||
| 243 | - w.count = existing.length; | ||
| 244 | - emitWarning(w); | ||
| 245 | - } | ||
| 246 | - } | ||
| 247 | - } | ||
| 248 | - | ||
| 249 | - return target; | ||
| 250 | -} | ||
| 251 | -function emitWarning(e) { | ||
| 252 | - typeof console.warn === 'function' ? console.warn(e) : console.log(e); | ||
| 253 | -} | ||
| 254 | -EventEmitter.prototype.addListener = function addListener(type, listener) { | ||
| 255 | - return _addListener(this, type, listener, false); | ||
| 256 | -}; | ||
| 257 | - | ||
| 258 | -EventEmitter.prototype.on = EventEmitter.prototype.addListener; | ||
| 259 | - | ||
| 260 | -EventEmitter.prototype.prependListener = | ||
| 261 | - function prependListener(type, listener) { | ||
| 262 | - return _addListener(this, type, listener, true); | ||
| 263 | - }; | ||
| 264 | - | ||
| 265 | -function _onceWrap(target, type, listener) { | ||
| 266 | - var fired = false; | ||
| 267 | - function g() { | ||
| 268 | - target.removeListener(type, g); | ||
| 269 | - if (!fired) { | ||
| 270 | - fired = true; | ||
| 271 | - listener.apply(target, arguments); | ||
| 272 | - } | ||
| 273 | - } | ||
| 274 | - g.listener = listener; | ||
| 275 | - return g; | ||
| 276 | -} | ||
| 277 | - | ||
| 278 | -EventEmitter.prototype.once = function once(type, listener) { | ||
| 279 | - if (typeof listener !== 'function') | ||
| 280 | - throw new TypeError('"listener" argument must be a function'); | ||
| 281 | - this.on(type, _onceWrap(this, type, listener)); | ||
| 282 | - return this; | ||
| 283 | -}; | ||
| 284 | - | ||
| 285 | -EventEmitter.prototype.prependOnceListener = | ||
| 286 | - function prependOnceListener(type, listener) { | ||
| 287 | - if (typeof listener !== 'function') | ||
| 288 | - throw new TypeError('"listener" argument must be a function'); | ||
| 289 | - this.prependListener(type, _onceWrap(this, type, listener)); | ||
| 290 | - return this; | ||
| 291 | - }; | ||
| 292 | - | ||
| 293 | -// emits a 'removeListener' event iff the listener was removed | ||
| 294 | -EventEmitter.prototype.removeListener = | ||
| 295 | - function removeListener(type, listener) { | ||
| 296 | - var list, events, position, i, originalListener; | ||
| 297 | - | ||
| 298 | - if (typeof listener !== 'function') | ||
| 299 | - throw new TypeError('"listener" argument must be a function'); | ||
| 300 | - | ||
| 301 | - events = this._events; | ||
| 302 | - if (!events) | ||
| 303 | - return this; | ||
| 304 | - | ||
| 305 | - list = events[type]; | ||
| 306 | - if (!list) | ||
| 307 | - return this; | ||
| 308 | - | ||
| 309 | - if (list === listener || (list.listener && list.listener === listener)) { | ||
| 310 | - if (--this._eventsCount === 0) | ||
| 311 | - this._events = new EventHandlers(); | ||
| 312 | - else { | ||
| 313 | - delete events[type]; | ||
| 314 | - if (events.removeListener) | ||
| 315 | - this.emit('removeListener', type, list.listener || listener); | ||
| 316 | - } | ||
| 317 | - } else if (typeof list !== 'function') { | ||
| 318 | - position = -1; | ||
| 319 | - | ||
| 320 | - for (i = list.length; i-- > 0;) { | ||
| 321 | - if (list[i] === listener || | ||
| 322 | - (list[i].listener && list[i].listener === listener)) { | ||
| 323 | - originalListener = list[i].listener; | ||
| 324 | - position = i; | ||
| 325 | - break; | ||
| 326 | - } | ||
| 327 | - } | ||
| 328 | - | ||
| 329 | - if (position < 0) | ||
| 330 | - return this; | ||
| 331 | - | ||
| 332 | - if (list.length === 1) { | ||
| 333 | - list[0] = undefined; | ||
| 334 | - if (--this._eventsCount === 0) { | ||
| 335 | - this._events = new EventHandlers(); | ||
| 336 | - return this; | ||
| 337 | - } else { | ||
| 338 | - delete events[type]; | ||
| 339 | - } | ||
| 340 | - } else { | ||
| 341 | - spliceOne(list, position); | ||
| 342 | - } | ||
| 343 | - | ||
| 344 | - if (events.removeListener) | ||
| 345 | - this.emit('removeListener', type, originalListener || listener); | ||
| 346 | - } | ||
| 347 | - | ||
| 348 | - return this; | ||
| 349 | - }; | ||
| 350 | - | ||
| 351 | -EventEmitter.prototype.removeAllListeners = | ||
| 352 | - function removeAllListeners(type) { | ||
| 353 | - var listeners, events; | ||
| 354 | - | ||
| 355 | - events = this._events; | ||
| 356 | - if (!events) | ||
| 357 | - return this; | ||
| 358 | - | ||
| 359 | - // not listening for removeListener, no need to emit | ||
| 360 | - if (!events.removeListener) { | ||
| 361 | - if (arguments.length === 0) { | ||
| 362 | - this._events = new EventHandlers(); | ||
| 363 | - this._eventsCount = 0; | ||
| 364 | - } else if (events[type]) { | ||
| 365 | - if (--this._eventsCount === 0) | ||
| 366 | - this._events = new EventHandlers(); | ||
| 367 | - else | ||
| 368 | - delete events[type]; | ||
| 369 | - } | ||
| 370 | - return this; | ||
| 371 | - } | ||
| 372 | - | ||
| 373 | - // emit removeListener for all listeners on all events | ||
| 374 | - if (arguments.length === 0) { | ||
| 375 | - var keys = Object.keys(events); | ||
| 376 | - for (var i = 0, key; i < keys.length; ++i) { | ||
| 377 | - key = keys[i]; | ||
| 378 | - if (key === 'removeListener') continue; | ||
| 379 | - this.removeAllListeners(key); | ||
| 380 | - } | ||
| 381 | - this.removeAllListeners('removeListener'); | ||
| 382 | - this._events = new EventHandlers(); | ||
| 383 | - this._eventsCount = 0; | ||
| 384 | - return this; | ||
| 385 | - } | ||
| 386 | - | ||
| 387 | - listeners = events[type]; | ||
| 388 | - | ||
| 389 | - if (typeof listeners === 'function') { | ||
| 390 | - this.removeListener(type, listeners); | ||
| 391 | - } else if (listeners) { | ||
| 392 | - // LIFO order | ||
| 393 | - do { | ||
| 394 | - this.removeListener(type, listeners[listeners.length - 1]); | ||
| 395 | - } while (listeners[0]); | ||
| 396 | - } | ||
| 397 | - | ||
| 398 | - return this; | ||
| 399 | - }; | ||
| 400 | - | ||
| 401 | -EventEmitter.prototype.listeners = function listeners(type) { | ||
| 402 | - var evlistener; | ||
| 403 | - var ret; | ||
| 404 | - var events = this._events; | ||
| 405 | - | ||
| 406 | - if (!events) | ||
| 407 | - ret = []; | ||
| 408 | - else { | ||
| 409 | - evlistener = events[type]; | ||
| 410 | - if (!evlistener) | ||
| 411 | - ret = []; | ||
| 412 | - else if (typeof evlistener === 'function') | ||
| 413 | - ret = [evlistener.listener || evlistener]; | ||
| 414 | - else | ||
| 415 | - ret = unwrapListeners(evlistener); | ||
| 416 | - } | ||
| 417 | - | ||
| 418 | - return ret; | ||
| 419 | -}; | ||
| 420 | - | ||
| 421 | -EventEmitter.listenerCount = function(emitter, type) { | ||
| 422 | - if (typeof emitter.listenerCount === 'function') { | ||
| 423 | - return emitter.listenerCount(type); | ||
| 424 | - } else { | ||
| 425 | - return listenerCount.call(emitter, type); | ||
| 426 | - } | ||
| 427 | -}; | ||
| 428 | - | ||
| 429 | -EventEmitter.prototype.listenerCount = listenerCount; | ||
| 430 | -function listenerCount(type) { | ||
| 431 | - var events = this._events; | ||
| 432 | - | ||
| 433 | - if (events) { | ||
| 434 | - var evlistener = events[type]; | ||
| 435 | - | ||
| 436 | - if (typeof evlistener === 'function') { | ||
| 437 | - return 1; | ||
| 438 | - } else if (evlistener) { | ||
| 439 | - return evlistener.length; | ||
| 440 | - } | ||
| 441 | - } | ||
| 442 | - | ||
| 443 | - return 0; | ||
| 444 | -} | ||
| 445 | - | ||
| 446 | -EventEmitter.prototype.eventNames = function eventNames() { | ||
| 447 | - return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; | ||
| 448 | -}; | ||
| 449 | - | ||
| 450 | -// About 1.5x faster than the two-arg version of Array#splice(). | ||
| 451 | -function spliceOne(list, index) { | ||
| 452 | - for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) | ||
| 453 | - list[i] = list[k]; | ||
| 454 | - list.pop(); | ||
| 455 | -} | ||
| 456 | - | ||
| 457 | -function arrayClone(arr, i) { | ||
| 458 | - var copy = new Array(i); | ||
| 459 | - while (i--) | ||
| 460 | - copy[i] = arr[i]; | ||
| 461 | - return copy; | ||
| 462 | -} | ||
| 463 | - | ||
| 464 | -function unwrapListeners(arr) { | ||
| 465 | - var ret = new Array(arr.length); | ||
| 466 | - for (var i = 0; i < ret.length; ++i) { | ||
| 467 | - ret[i] = arr[i].listener || arr[i]; | ||
| 468 | - } | ||
| 469 | - return ret; | ||
| 470 | -} | ||
| 471 | 6 | ||
| 472 | function __extends(d, b) { | 7 | function __extends(d, b) { |
| 473 | for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; | 8 | for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; |
| ... | @@ -505,8 +40,8 @@ var STATE_STOP = "stop"; | ... | @@ -505,8 +40,8 @@ var STATE_STOP = "stop"; |
| 505 | var Player = (function (_super) { | 40 | var Player = (function (_super) { |
| 506 | __extends(Player, _super); | 41 | __extends(Player, _super); |
| 507 | function Player() { | 42 | function Player() { |
| 508 | - _super.apply(this, arguments); | 43 | + _super.call(this); |
| 509 | - this._minutesReplication = 5; | 44 | + this._minutesReplication = 3; |
| 510 | this._replicationRetry = 10000; | 45 | this._replicationRetry = 10000; |
| 511 | this._currentProgramItemId = ''; | 46 | this._currentProgramItemId = ''; |
| 512 | this._currentReplicationCounter = 0; | 47 | this._currentReplicationCounter = 0; |
| ... | @@ -561,36 +96,41 @@ var Player = (function (_super) { | ... | @@ -561,36 +96,41 @@ var Player = (function (_super) { |
| 561 | }); | 96 | }); |
| 562 | Player.prototype.triggerReplication = function () { | 97 | Player.prototype.triggerReplication = function () { |
| 563 | var _this = this; | 98 | var _this = this; |
| 99 | + console.info("digsig-player-service: trigger replication"); | ||
| 564 | return this.programRepository.replicate() | 100 | return this.programRepository.replicate() |
| 565 | - .then(function () { | 101 | + .then(function (changes) { |
| 566 | _this._currentReplicationCounter = 0; | 102 | _this._currentReplicationCounter = 0; |
| 567 | - _this.trigger(_this.triggerProgramItemId, Util.calculateNextMinute()); | 103 | + _this.trigger(function () { _this.triggerProgramItemId(changes); }); |
| 568 | }) | 104 | }) |
| 569 | - .catch(function () { | 105 | + .catch(function (error) { |
| 570 | - _this.trigger(_this.triggerReplication, _this.replicationRetry); | 106 | + _this.trigger(function () { _this.triggerReplication(); }, _this.replicationRetry); |
| 107 | + _this.emit('error', error); | ||
| 571 | }); | 108 | }); |
| 572 | }; | 109 | }; |
| 573 | - Player.prototype.triggerProgramItemId = function () { | 110 | + Player.prototype.triggerProgramItemId = function (changes) { |
| 574 | var _this = this; | 111 | var _this = this; |
| 112 | + if (changes === void 0) { changes = false; } | ||
| 113 | + console.info("digsig-player-service: trigger program item id"); | ||
| 575 | this.programManager.getCurrentProgramItemId() | 114 | this.programManager.getCurrentProgramItemId() |
| 576 | .then(function (programItemId) { | 115 | .then(function (programItemId) { |
| 577 | _this._currentReplicationCounter++; | 116 | _this._currentReplicationCounter++; |
| 578 | // if there is a new program item id trigger play | 117 | // if there is a new program item id trigger play |
| 579 | // else (1) calculate next potential program change point | 118 | // else (1) calculate next potential program change point |
| 580 | // or (2) trigger replication | 119 | // or (2) trigger replication |
| 581 | - if (programItemId != _this._currentProgramItemId) { | 120 | + if (programItemId && (programItemId != _this._currentProgramItemId || changes)) { |
| 582 | _this._currentProgramItemId = programItemId; | 121 | _this._currentProgramItemId = programItemId; |
| 583 | _this.emit('play', programItemId); | 122 | _this.emit('play', programItemId); |
| 584 | } | 123 | } |
| 585 | - else if (_this._currentReplicationCounter >= _this._minutesReplication) { | 124 | + if (_this._currentReplicationCounter >= _this._minutesReplication) { |
| 586 | _this.triggerReplication(); | 125 | _this.triggerReplication(); |
| 587 | } | 126 | } |
| 588 | else { | 127 | else { |
| 589 | - _this.trigger(_this.triggerProgramItemId, Util.calculateNextMinute()); | 128 | + _this.trigger(function () { _this.triggerProgramItemId(); }, Util.calculateNextMinute()); |
| 590 | } | 129 | } |
| 591 | }); | 130 | }); |
| 592 | }; | 131 | }; |
| 593 | Player.prototype.trigger = function (func, milliseconds) { | 132 | Player.prototype.trigger = function (func, milliseconds) { |
| 133 | + if (milliseconds === void 0) { milliseconds = 0; } | ||
| 594 | if (this._state === STATE_START) { | 134 | if (this._state === STATE_START) { |
| 595 | setTimeout(function () { func(); }, milliseconds); | 135 | setTimeout(function () { func(); }, milliseconds); |
| 596 | } | 136 | } |
| ... | @@ -605,7 +145,7 @@ var Player = (function (_super) { | ... | @@ -605,7 +145,7 @@ var Player = (function (_super) { |
| 605 | this._state = STATE_STOP; | 145 | this._state = STATE_STOP; |
| 606 | }; | 146 | }; |
| 607 | return Player; | 147 | return Player; |
| 608 | -}(EventEmitter)); | 148 | +}(events.EventEmitter)); |
| 609 | 149 | ||
| 610 | var ProgramManager = (function () { | 150 | var ProgramManager = (function () { |
| 611 | function ProgramManager() { | 151 | function ProgramManager() { | ... | ... |
| 1 | -{"version":3,"file":"bundle.js","sources":["../node_modules/rollup-plugin-node-builtins/src/es6/events.js","../src/util.ts","../src/player.ts","../src/program-manager.ts","../src/program-item/program-item.ts","../src/program-item/program-item-factory.ts"],"sourcesContent":["'use strict';\n\nvar domain;\n\n// This constructor is used to store event handlers. Instantiating this is\n// faster than explicitly calling `Object.create(null)` to get a \"clean\" empty\n// object (tested with v8 v4.9).\nfunction EventHandlers() {}\nEventHandlers.prototype = Object.create(null);\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nexport default EventEmitter;\nexport {EventEmitter};\n\nEventEmitter.usingDomains = false;\n\nEventEmitter.prototype.domain = undefined;\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\nEventEmitter.init = function() {\n this.domain = null;\n if (EventEmitter.usingDomains) {\n // if there is an active domain, then attach to it.\n if (domain.active && !(this instanceof domain.Domain)) {\n this.domain = domain.active;\n }\n }\n\n if (!this._events || this._events === Object.getPrototypeOf(this)._events) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || isNaN(n))\n throw new TypeError('\"n\" argument must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nfunction $getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return $getMaxListeners(this);\n};\n\n// These standalone emit* functions are used to optimize calling of event\n// handlers for fast cases because emit() itself often has a variable number of\n// arguments and can be deoptimized because of that. These functions always have\n// the same number of arguments and thus do not get deoptimized, so the code\n// inside them can execute faster.\nfunction emitNone(handler, isFn, self) {\n if (isFn)\n handler.call(self);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self);\n }\n}\nfunction emitOne(handler, isFn, self, arg1) {\n if (isFn)\n handler.call(self, arg1);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1);\n }\n}\nfunction emitTwo(handler, isFn, self, arg1, arg2) {\n if (isFn)\n handler.call(self, arg1, arg2);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2);\n }\n}\nfunction emitThree(handler, isFn, self, arg1, arg2, arg3) {\n if (isFn)\n handler.call(self, arg1, arg2, arg3);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].call(self, arg1, arg2, arg3);\n }\n}\n\nfunction emitMany(handler, isFn, self, args) {\n if (isFn)\n handler.apply(self, args);\n else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n listeners[i].apply(self, args);\n }\n}\n\nEventEmitter.prototype.emit = function emit(type) {\n var er, handler, len, args, i, events, domain;\n var needDomainExit = false;\n var doError = (type === 'error');\n\n events = this._events;\n if (events)\n doError = (doError && events.error == null);\n else if (!doError)\n return false;\n\n domain = this.domain;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n er = arguments[1];\n if (domain) {\n if (!er)\n er = new Error('Uncaught, unspecified \"error\" event');\n er.domainEmitter = this;\n er.domain = domain;\n er.domainThrown = false;\n domain.emit('error', er);\n } else if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n return false;\n }\n\n handler = events[type];\n\n if (!handler)\n return false;\n\n var isFn = typeof handler === 'function';\n len = arguments.length;\n switch (len) {\n // fast cases\n case 1:\n emitNone(handler, isFn, this);\n break;\n case 2:\n emitOne(handler, isFn, this, arguments[1]);\n break;\n case 3:\n emitTwo(handler, isFn, this, arguments[1], arguments[2]);\n break;\n case 4:\n emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);\n break;\n // slower\n default:\n args = new Array(len - 1);\n for (i = 1; i < len; i++)\n args[i - 1] = arguments[i];\n emitMany(handler, isFn, this, args);\n }\n\n if (needDomainExit)\n domain.exit();\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = target._events;\n if (!events) {\n events = target._events = new EventHandlers();\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (!existing) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] :\n [existing, listener];\n } else {\n // If we've already got an array, just append.\n if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n }\n\n // Check for listener leak\n if (!existing.warned) {\n m = $getMaxListeners(target);\n if (m && m > 0 && existing.length > m) {\n existing.warned = true;\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + type + ' listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n emitWarning(w);\n }\n }\n }\n\n return target;\n}\nfunction emitWarning(e) {\n typeof console.warn === 'function' ? console.warn(e) : console.log(e);\n}\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction _onceWrap(target, type, listener) {\n var fired = false;\n function g() {\n target.removeListener(type, g);\n if (!fired) {\n fired = true;\n listener.apply(target, arguments);\n }\n }\n g.listener = listener;\n return g;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n if (typeof listener !== 'function')\n throw new TypeError('\"listener\" argument must be a function');\n\n events = this._events;\n if (!events)\n return this;\n\n list = events[type];\n if (!list)\n return this;\n\n if (list === listener || (list.listener && list.listener === listener)) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list[0] = undefined;\n if (--this._eventsCount === 0) {\n this._events = new EventHandlers();\n return this;\n } else {\n delete events[type];\n }\n } else {\n spliceOne(list, position);\n }\n\n if (events.removeListener)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events;\n\n events = this._events;\n if (!events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!events.removeListener) {\n if (arguments.length === 0) {\n this._events = new EventHandlers();\n this._eventsCount = 0;\n } else if (events[type]) {\n if (--this._eventsCount === 0)\n this._events = new EventHandlers();\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n for (var i = 0, key; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = new EventHandlers();\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n do {\n this.removeListener(type, listeners[listeners.length - 1]);\n } while (listeners[0]);\n }\n\n return this;\n };\n\nEventEmitter.prototype.listeners = function listeners(type) {\n var evlistener;\n var ret;\n var events = this._events;\n\n if (!events)\n ret = [];\n else {\n evlistener = events[type];\n if (!evlistener)\n ret = [];\n else if (typeof evlistener === 'function')\n ret = [evlistener.listener || evlistener];\n else\n ret = unwrapListeners(evlistener);\n }\n\n return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];\n};\n\n// About 1.5x faster than the two-arg version of Array#splice().\nfunction spliceOne(list, index) {\n for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)\n list[i] = list[k];\n list.pop();\n}\n\nfunction arrayClone(arr, i) {\n var copy = new Array(i);\n while (i--)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n","export class Util {\n\n static getISODate() : string {\n return (new Date()).toISOString().slice(0,10);\n }\n\n static getDateInMinutes() : number {\n let now = new Date();\n return (now.getHours() * 60) + now.getMinutes();\n }\n\n /**\n * convert a time input to minutes\n * e.g. 23:59 = 1439\n */\n static convertToMinutes(time:string) : number {\n let times = time.split(\":\");\n let convered = (parseInt(times[0]) * 60) + parseInt(times[1]);\n return (convered >= 0 && convered <= 1439) ? convered : 0;\n }\n\n static calculateNextMinute() : number {\n return (60 - (Math.round((new Date()).getTime() / 1000) % 60)) * 1000;\n }\n\n}","import { EventEmitter } from 'events';\nimport {ProgramRepository} from './program-repository';\nimport {ProgramManager} from './program-manager';\nimport {Util} from './util';\n\nconst STATE_START = \"start\";\nconst STATE_STOP = \"stop\";\n\nexport class Player extends EventEmitter {\n\n protected _programRepository:ProgramRepository;\n protected _programManager:ProgramManager;\n protected _minutesReplication:number = 5;\n protected _replicationRetry:number = 10000;\n\n protected _currentProgramItemId:string = '';\n protected _currentReplicationCounter:number = 0;\n protected _state = STATE_STOP;\n\n set state(st:string) {\n this._state = st;\n }\n\n set programManager(pm:ProgramManager) {\n this._programManager = pm;\n }\n\n get programManager() : ProgramManager {\n return this._programManager;\n }\n\n set programRepository(pr:ProgramRepository) {\n this._programRepository = pr;\n }\n\n get programRepository() : ProgramRepository {\n return this._programRepository;\n }\n\n set minutesReplication(mr:number) {\n this._minutesReplication = mr;\n }\n\n get minutesReplication() : number {\n return this._minutesReplication;\n }\n\n set replicationRetry(rr:number) {\n this._replicationRetry = rr;\n }\n\n get replicationRetry() : number {\n return this._replicationRetry;\n }\n\n triggerReplication() : Promise<void> {\n return this.programRepository.replicate()\n .then(() => { \n this._currentReplicationCounter = 0;\n this.trigger(this.triggerProgramItemId, Util.calculateNextMinute());\n })\n .catch(() => {\n this.trigger(this.triggerReplication, this.replicationRetry);\n });\n }\n\n triggerProgramItemId() {\n this.programManager.getCurrentProgramItemId()\n .then(programItemId => {\n this._currentReplicationCounter++;\n\n // if there is a new program item id trigger play\n // else (1) calculate next potential program change point\n // or (2) trigger replication\n\n if (programItemId != this._currentProgramItemId) {\n this._currentProgramItemId = programItemId;\n this.emit('play', programItemId);\n } else if (this._currentReplicationCounter >= this._minutesReplication) {\n this.triggerReplication();\n } else {\n this.trigger(this.triggerProgramItemId, Util.calculateNextMinute());\n }\n });\n }\n\n trigger(func:Function, milliseconds:number) {\n if (this._state === STATE_START) { \n setTimeout(() => { func(); }, milliseconds);\n } \n }\n\n start() {\n if (this._state === STATE_STOP) {\n this.triggerReplication();\n this._state = STATE_START;\n }\n }\n\n stop() {\n this._state = STATE_STOP;\n }\n\n}","import {ProgramRepository} from './program-repository';\nimport {Util} from './util';\nimport {ProgramItem, PROGRAM_ITEM_TYPE_SLIDESHOW, PROGRAM_ITEM_TYPE_VIDEO } from './program-item/program-item'\n\nexport class ProgramManager {\n\n protected _programRepository:ProgramRepository;\n\n set programRepository(pr:ProgramRepository) {\n this._programRepository = pr;\n }\n\n get programRepository() : ProgramRepository {\n return this._programRepository;\n }\n\n getCurrentProgramItemId() : Promise<string> {\n return new Promise<string> ((resolve, reject) => {\n this.findCurrentProgramSegment().then(programSegment => {\n let currentProgramItemId = programSegment.default;\n if (programSegment.schedule) {\n currentProgramItemId = this.findCurrentProgramItem(programSegment.schedule, Util.getDateInMinutes());\n }\n resolve(currentProgramItemId);\n });\n }); \n }\n\n /**\n * find program item in schedule, which fits\n * according to current hh:mm\n */\n findCurrentProgramItem(schedule:any, dateInMinutes:number) : string {\n let timeList:any = [];\n let tmpSchedule:any = {};\n\n for (let startTime in schedule) {\n if (schedule.hasOwnProperty(startTime)) {\n let minutes = Util.convertToMinutes(startTime);\n timeList.push(minutes);\n tmpSchedule[minutes] = schedule[startTime];\n }\n }\n\n // sort ascending (-)\n timeList.sort((a,b) => { return a-b; });\n\n let last = 0;\n for (let i = 0; i < timeList.length; i++) {\n if (timeList[i] <= dateInMinutes) {\n last = timeList[i];\n } else {\n break;\n }\n }\n\n return tmpSchedule[last];\n }\n\n /**\n * Find the program segment\n * This is dependent on the date set on the device\n */\n findCurrentProgramSegment() : Promise<any> {\n return new Promise<any>((resolve, reject) => {\n let today = Util.getISODate();\n \n this.programRepository.findByType('program')\n .then(programs => {\n \n if (programs.length > 0) {\n let program:any = programs[0];\n let programSegmentId;\n\n // if there is a program_segment for today else default\n if (program.schedule && program.schedule[today]) {\n programSegmentId = program.schedule[today];\n } else {\n programSegmentId = program.default;\n }\n \n this.programRepository\n .findById(programSegmentId)\n .then(programSegment => { \n resolve(programSegment);\n }).catch(error => { \n reject(\"program segment not found\");\n });\n } else {\n reject('No Program found');\n }\n\n }).catch(error => {\n reject(error);\n });\n });\n }\n\n}","export const PROGRAM_ITEM_TYPE_SLIDESHOW = \"slideshow\";\nexport const PROGRAM_ITEM_TYPE_VIDEO = \"video\";\n\nexport class ProgramItem {\n\n protected _type:string;\n protected _data:any;\n\n set type(t:string) {\n this._type = t;\n }\n\n get type():string {\n return this._type;\n }\n\n set data(d:any) {\n this._data = d;\n }\n\n get data():any {\n return this._data;\n }\n\n}","import {ProgramItem, PROGRAM_ITEM_TYPE_SLIDESHOW, PROGRAM_ITEM_TYPE_VIDEO } from './program-item';\nimport { ProgramRepository } from './../program-repository';\n\nexport class ProgramItemFactory {\n\n protected _programRepository:ProgramRepository;\n protected _basePath:string;\n\n set basePath(bp:string) {\n this._basePath = bp;\n }\n \n get basePath() : string {\n return this._basePath;\n }\n\n set programRepository(pr:ProgramRepository) {\n this._programRepository = pr;\n }\n\n get programRepository() : ProgramRepository {\n return this._programRepository;\n }\n\n getProgramItem(programItemId:string) : Promise<ProgramItem> {\n return this.programRepository\n .findById(programItemId)\n .then((programItem) => {\n return this.prepareProgramItem(programItem.program_item_type, programItem);\n });\n }\n\n prepareProgramItem(type:string, data:any) : Promise<ProgramItem> {\n let programItem = new ProgramItem();\n programItem.type = type;\n\n if (type === PROGRAM_ITEM_TYPE_VIDEO) {\n return this.prepareVideoItem(programItem, data);\n } else if (type === PROGRAM_ITEM_TYPE_SLIDESHOW) {\n return this.prepareSlideshowItem(programItem, data);\n } else {\n return null;\n }\n } \n\n prepareSlideshowItem(programItem:ProgramItem, data:any) : Promise<ProgramItem> {\n return this._programRepository.findByIds(data.images)\n .then(images => { \n programItem.data = {\n speed : data.settings.speed ,\n effect : data.settings.effect ,\n images : []\n }; \n\n for (let image of images) {\n programItem.data.images.push(this.basePath + image.filename);\n }\n\n return programItem;\n });\n }\n\n prepareVideoItem(programItem:ProgramItem, data:any) : Promise<ProgramItem> {\n return this._programRepository.findById(data.video)\n .then((data) => { \n programItem.data = {\n video : this.basePath + data['filename']\n }; \n return programItem;\n });\n }\n\n}"],"names":[],"mappings":";;;;AAEA,IAAI,MAAM,CAAC;;;;;AAKX,SAAS,aAAa,GAAG,EAAE;AAC3B,aAAa,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;;AAE9C,SAAS,YAAY,GAAG;EACtB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;CAC9B;AACD,AACA,AAEA,YAAY,CAAC,YAAY,GAAG,KAAK,CAAC;;AAElC,YAAY,CAAC,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC;AAC1C,YAAY,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC;AAC3C,YAAY,CAAC,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC;;;;AAIjD,YAAY,CAAC,mBAAmB,GAAG,EAAE,CAAC;;AAEtC,YAAY,CAAC,IAAI,GAAG,WAAW;EAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;EACnB,IAAI,YAAY,CAAC,YAAY,EAAE;;IAE7B,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,YAAY,MAAM,CAAC,MAAM,CAAC,EAAE;MACrD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;KAC7B;GACF;;EAED,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE;IACzE,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;GACvB;;EAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,SAAS,CAAC;CACtD,CAAC;;;;AAIF,YAAY,CAAC,SAAS,CAAC,eAAe,GAAG,SAAS,eAAe,CAAC,CAAC,EAAE;EACnE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;IAC5C,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;EAChE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;EACvB,OAAO,IAAI,CAAC;CACb,CAAC;;AAEF,SAAS,gBAAgB,CAAC,IAAI,EAAE;EAC9B,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;IAClC,OAAO,YAAY,CAAC,mBAAmB,CAAC;EAC1C,OAAO,IAAI,CAAC,aAAa,CAAC;CAC3B;;AAED,YAAY,CAAC,SAAS,CAAC,eAAe,GAAG,SAAS,eAAe,GAAG;EAClE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;CAC/B,CAAC;;;;;;;AAOF,SAAS,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;EACrC,IAAI,IAAI;IACN,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;OAChB;IACH,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,IAAI,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;MAC1B,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;GAC3B;CACF;AACD,SAAS,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;EAC1C,IAAI,IAAI;IACN,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;OACtB;IACH,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,IAAI,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;MAC1B,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;GACjC;CACF;AACD,SAAS,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;EAChD,IAAI,IAAI;IACN,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;OAC5B;IACH,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,IAAI,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;MAC1B,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;GACvC;CACF;AACD,SAAS,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;EACxD,IAAI,IAAI;IACN,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;OAClC;IACH,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,IAAI,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;MAC1B,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;GAC7C;CACF;;AAED,SAAS,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;EAC3C,IAAI,IAAI;IACN,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;OACvB;IACH,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,IAAI,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;MAC1B,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;GAClC;CACF;;AAED,YAAY,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,IAAI,CAAC,IAAI,EAAE;EAChD,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC;EAC9C,IAAI,cAAc,GAAG,KAAK,CAAC;EAC3B,IAAI,OAAO,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC;;EAEjC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;EACtB,IAAI,MAAM;IACR,OAAO,IAAI,OAAO,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;OACzC,IAAI,CAAC,OAAO;IACf,OAAO,KAAK,CAAC;;EAEf,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;;EAGrB,IAAI,OAAO,EAAE;IACX,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,MAAM,EAAE;MACV,IAAI,CAAC,EAAE;QACL,EAAE,GAAG,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;MACxD,EAAE,CAAC,aAAa,GAAG,IAAI,CAAC;MACxB,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;MACnB,EAAE,CAAC,YAAY,GAAG,KAAK,CAAC;MACxB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;KAC1B,MAAM,IAAI,EAAE,YAAY,KAAK,EAAE;MAC9B,MAAM,EAAE,CAAC;KACV,MAAM;;MAEL,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,wCAAwC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;MACzE,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC;MACjB,MAAM,GAAG,CAAC;KACX;IACD,OAAO,KAAK,CAAC;GACd;;EAED,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;;EAEvB,IAAI,CAAC,OAAO;IACV,OAAO,KAAK,CAAC;;EAEf,IAAI,IAAI,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC;EACzC,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;EACvB,QAAQ,GAAG;;IAET,KAAK,CAAC;MACJ,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;MAC9B,MAAM;IACR,KAAK,CAAC;MACJ,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;MAC3C,MAAM;IACR,KAAK,CAAC;MACJ,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;MACzD,MAAM;IACR,KAAK,CAAC;MACJ,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;MACzE,MAAM;;IAER;MACE,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;MAC1B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QACtB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;MAC7B,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;GACvC;;EAED,IAAI,cAAc;IAChB,MAAM,CAAC,IAAI,EAAE,CAAC;;EAEhB,OAAO,IAAI,CAAC;CACb,CAAC;;AAEF,SAAS,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE;EACrD,IAAI,CAAC,CAAC;EACN,IAAI,MAAM,CAAC;EACX,IAAI,QAAQ,CAAC;;EAEb,IAAI,OAAO,QAAQ,KAAK,UAAU;IAChC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;;EAEhE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;EACxB,IAAI,CAAC,MAAM,EAAE;IACX,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IAC9C,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;GACzB,MAAM;;;IAGL,IAAI,MAAM,CAAC,WAAW,EAAE;MACtB,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI;kBACnB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;;;;MAI9D,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;KACzB;IACD,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;GACzB;;EAED,IAAI,CAAC,QAAQ,EAAE;;IAEb,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;IACnC,EAAE,MAAM,CAAC,YAAY,CAAC;GACvB,MAAM;IACL,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;;MAElC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;0CACpB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;KAC1D,MAAM;;MAEL,IAAI,OAAO,EAAE;QACX,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;OAC5B,MAAM;QACL,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;OACzB;KACF;;;IAGD,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;MACpB,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;MAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;QACrC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,8CAA8C;4BAC5C,QAAQ,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,oBAAoB;4BACnD,iDAAiD,CAAC,CAAC;QACvE,CAAC,CAAC,IAAI,GAAG,6BAA6B,CAAC;QACvC,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QACd,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC1B,WAAW,CAAC,CAAC,CAAC,CAAC;OAChB;KACF;GACF;;EAED,OAAO,MAAM,CAAC;CACf;AACD,SAAS,WAAW,CAAC,CAAC,EAAE;EACtB,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACvE;AACD,YAAY,CAAC,SAAS,CAAC,WAAW,GAAG,SAAS,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE;EACxE,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;CAClD,CAAC;;AAEF,YAAY,CAAC,SAAS,CAAC,EAAE,GAAG,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC;;AAE/D,YAAY,CAAC,SAAS,CAAC,eAAe;IAClC,SAAS,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE;MACvC,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;KACjD,CAAC;;AAEN,SAAS,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;EACzC,IAAI,KAAK,GAAG,KAAK,CAAC;EAClB,SAAS,CAAC,GAAG;IACX,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE;MACV,KAAK,GAAG,IAAI,CAAC;MACb,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;KACnC;GACF;EACD,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;EACtB,OAAO,CAAC,CAAC;CACV;;AAED,YAAY,CAAC,SAAS,CAAC,IAAI,GAAG,SAAS,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE;EAC1D,IAAI,OAAO,QAAQ,KAAK,UAAU;IAChC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;EAChE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;EAC/C,OAAO,IAAI,CAAC;CACb,CAAC;;AAEF,YAAY,CAAC,SAAS,CAAC,mBAAmB;IACtC,SAAS,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE;MAC3C,IAAI,OAAO,QAAQ,KAAK,UAAU;QAChC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;MAChE,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;MAC5D,OAAO,IAAI,CAAC;KACb,CAAC;;;AAGN,YAAY,CAAC,SAAS,CAAC,cAAc;IACjC,SAAS,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;MACtC,IAAI,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,gBAAgB,CAAC;;MAEhD,IAAI,OAAO,QAAQ,KAAK,UAAU;QAChC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;;MAEhE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;MACtB,IAAI,CAAC,MAAM;QACT,OAAO,IAAI,CAAC;;MAEd,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;MACpB,IAAI,CAAC,IAAI;QACP,OAAO,IAAI,CAAC;;MAEd,IAAI,IAAI,KAAK,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE;QACtE,IAAI,EAAE,IAAI,CAAC,YAAY,KAAK,CAAC;UAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;aAChC;UACH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;UACpB,IAAI,MAAM,CAAC,cAAc;YACvB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;SAChE;OACF,MAAM,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;QACrC,QAAQ,GAAG,CAAC,CAAC,CAAC;;QAEd,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG;UAC9B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;eACnB,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE;YACvD,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YACpC,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;WACP;SACF;;QAED,IAAI,QAAQ,GAAG,CAAC;UACd,OAAO,IAAI,CAAC;;QAEd,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;UACrB,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;UACpB,IAAI,EAAE,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;WACb,MAAM;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;WACrB;SACF,MAAM;UACL,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;SAC3B;;QAED,IAAI,MAAM,CAAC,cAAc;UACvB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,IAAI,QAAQ,CAAC,CAAC;OACnE;;MAED,OAAO,IAAI,CAAC;KACb,CAAC;;AAEN,YAAY,CAAC,SAAS,CAAC,kBAAkB;IACrC,SAAS,kBAAkB,CAAC,IAAI,EAAE;MAChC,IAAI,SAAS,EAAE,MAAM,CAAC;;MAEtB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;MACtB,IAAI,CAAC,MAAM;QACT,OAAO,IAAI,CAAC;;;MAGd,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;QAC1B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;UAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;UACnC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;SACvB,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE;UACvB,IAAI,EAAE,IAAI,CAAC,YAAY,KAAK,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;;YAEnC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;SACvB;QACD,OAAO,IAAI,CAAC;OACb;;;MAGD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;QAC1B,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;UACzC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;UACd,IAAI,GAAG,KAAK,gBAAgB,EAAE,SAAS;UACvC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;SAC9B;QACD,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;OACb;;MAED,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;;MAEzB,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;QACnC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;OACtC,MAAM,IAAI,SAAS,EAAE;;QAEpB,GAAG;UACD,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;SAC5D,QAAQ,SAAS,CAAC,CAAC,CAAC,EAAE;OACxB;;MAED,OAAO,IAAI,CAAC;KACb,CAAC;;AAEN,YAAY,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,SAAS,CAAC,IAAI,EAAE;EAC1D,IAAI,UAAU,CAAC;EACf,IAAI,GAAG,CAAC;EACR,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;;EAE1B,IAAI,CAAC,MAAM;IACT,GAAG,GAAG,EAAE,CAAC;OACN;IACH,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,UAAU;MACb,GAAG,GAAG,EAAE,CAAC;SACN,IAAI,OAAO,UAAU,KAAK,UAAU;MACvC,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,CAAC;;MAE1C,GAAG,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;GACrC;;EAED,OAAO,GAAG,CAAC;CACZ,CAAC;;AAEF,YAAY,CAAC,aAAa,GAAG,SAAS,OAAO,EAAE,IAAI,EAAE;EACnD,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,UAAU,EAAE;IAC/C,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;GACpC,MAAM;IACL,OAAO,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;GAC1C;CACF,CAAC;;AAEF,YAAY,CAAC,SAAS,CAAC,aAAa,GAAG,aAAa,CAAC;AACrD,SAAS,aAAa,CAAC,IAAI,EAAE;EAC3B,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;;EAE1B,IAAI,MAAM,EAAE;IACV,IAAI,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;;IAE9B,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE;MACpC,OAAO,CAAC,CAAC;KACV,MAAM,IAAI,UAAU,EAAE;MACrB,OAAO,UAAU,CAAC,MAAM,CAAC;KAC1B;GACF;;EAED,OAAO,CAAC,CAAC;CACV;;AAED,YAAY,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,GAAG;EACxD,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;CACnE,CAAC;;;AAGF,SAAS,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;EAC9B,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;IACnE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;EACpB,IAAI,CAAC,GAAG,EAAE,CAAC;CACZ;;AAED,SAAS,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE;EAC1B,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;EACxB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;EACnB,OAAO,IAAI,CAAC;CACb;;AAED,SAAS,eAAe,CAAC,GAAG,EAAE;EAC5B,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;EAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;IACnC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;GACpC;EACD,OAAO,GAAG,CAAC;CACZ;;;;;;;;ACtdM;IAAA;KAyBN;IAvBU,eAAU,GAAjB;QACI,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAC,EAAE,CAAC,CAAC;KACjD;IAEM,qBAAgB,GAAvB;QACI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;KACnD;;;;;IAMM,qBAAgB,GAAvB,UAAwB,IAAW;QAC/B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,QAAQ,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;KAC7D;IAEM,wBAAmB,GAA1B;QACI,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC;KACzE;IAEL,WAAC;CAAA,IAAA,AACD;;ACrBA,IAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,IAAM,UAAU,GAAI,MAAM,CAAC;AAEpB;IAAqB,0BAAY;IAAjC;QAAqB,8BAAY;QAI1B,wBAAmB,GAAU,CAAC,CAAC;QAC/B,sBAAiB,GAAU,KAAK,CAAC;QAEjC,0BAAqB,GAAU,EAAE,CAAC;QAClC,+BAA0B,GAAU,CAAC,CAAC;QACtC,WAAM,GAAG,UAAU,CAAC;KAsFjC;IApFG,sBAAI,yBAAK;aAAT,UAAU,EAAS;YACf,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;SACpB;;;OAAA;IAED,sBAAI,kCAAc;aAIlB;YACI,OAAO,IAAI,CAAC,eAAe,CAAC;SAC/B;aAND,UAAmB,EAAiB;YAChC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;SAC7B;;;OAAA;IAMD,sBAAI,qCAAiB;aAIrB;YACI,OAAO,IAAI,CAAC,kBAAkB,CAAC;SAClC;aAND,UAAsB,EAAoB;YACtC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;SAChC;;;OAAA;IAMD,sBAAI,sCAAkB;aAItB;YACI,OAAO,IAAI,CAAC,mBAAmB,CAAC;SACnC;aAND,UAAuB,EAAS;YAC5B,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;SACjC;;;OAAA;IAMD,sBAAI,oCAAgB;aAIpB;YACI,OAAO,IAAI,CAAC,iBAAiB,CAAC;SACjC;aAND,UAAqB,EAAS;YAC1B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;SAC/B;;;OAAA;IAMD,mCAAkB,GAAlB;QAAA,iBASC;QARG,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE;aACpC,IAAI,CAAC;YACF,KAAI,CAAC,0BAA0B,GAAG,CAAC,CAAC;YACpC,KAAI,CAAC,OAAO,CAAC,KAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;SACvE,CAAC;aACD,KAAK,CAAC;YACH,KAAI,CAAC,OAAO,CAAC,KAAI,CAAC,kBAAkB,EAAE,KAAI,CAAC,gBAAgB,CAAC,CAAC;SAChE,CAAC,CAAC;KACV;IAED,qCAAoB,GAApB;QAAA,iBAkBC;QAjBG,IAAI,CAAC,cAAc,CAAC,uBAAuB,EAAE;aACxC,IAAI,CAAC,UAAA,aAAa;YACf,KAAI,CAAC,0BAA0B,EAAE,CAAC;;;;YAMlC,IAAI,aAAa,IAAI,KAAI,CAAC,qBAAqB,EAAE;gBAC7C,KAAI,CAAC,qBAAqB,GAAG,aAAa,CAAC;gBAC3C,KAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;aACpC;iBAAM,IAAI,KAAI,CAAC,0BAA0B,IAAI,KAAI,CAAC,mBAAmB,EAAE;gBACpE,KAAI,CAAC,kBAAkB,EAAE,CAAC;aAC7B;iBAAM;gBACH,KAAI,CAAC,OAAO,CAAC,KAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;aACvE;SACJ,CAAC,CAAC;KACV;IAED,wBAAO,GAAP,UAAQ,IAAa,EAAE,YAAmB;QACtC,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE;YAC7B,UAAU,CAAC,cAAQ,IAAI,EAAE,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;SAC/C;KACJ;IAED,sBAAK,GAAL;QACI,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE;YAC5B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;SAC7B;KACJ;IAED,qBAAI,GAAJ;QACI,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;KAC5B;IAEL,aAAC;CAAA,CA/F2B,YAAY,GA+FvC,AACD;;ACpGO;IAAA;KA8FN;IA1FG,sBAAI,6CAAiB;aAIrB;YACI,OAAO,IAAI,CAAC,kBAAkB,CAAC;SAClC;aAND,UAAsB,EAAoB;YACtC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;SAChC;;;OAAA;IAMD,gDAAuB,GAAvB;QAAA,iBAUC;QATG,OAAO,IAAI,OAAO,CAAU,UAAC,OAAO,EAAE,MAAM;YACxC,KAAI,CAAC,yBAAyB,EAAE,CAAC,IAAI,CAAC,UAAA,cAAc;gBAChD,IAAI,oBAAoB,GAAG,cAAc,CAAC,OAAO,CAAC;gBAClD,IAAI,cAAc,CAAC,QAAQ,EAAE;oBACzB,oBAAoB,GAAG,KAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;iBACxG;gBACD,OAAO,CAAC,oBAAoB,CAAC,CAAC;aACjC,CAAC,CAAC;SACN,CAAC,CAAC;KACN;;;;;IAMD,+CAAsB,GAAtB,UAAuB,QAAY,EAAE,aAAoB;QACrD,IAAI,QAAQ,GAAO,EAAE,CAAC;QACtB,IAAI,WAAW,GAAO,EAAE,CAAC;QAEzB,KAAK,IAAI,SAAS,IAAI,QAAQ,EAAE;YAC5B,IAAI,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;gBACpC,IAAI,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBAC/C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,WAAW,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;aAC9C;SACJ;;QAGD,QAAQ,CAAC,IAAI,CAAC,UAAC,CAAC,EAAC,CAAC,IAAO,OAAO,CAAC,GAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAExC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE;gBAC9B,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;aACtB;iBAAM;gBACH,MAAM;aACT;SACJ;QAED,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;KAC5B;;;;;IAMD,kDAAyB,GAAzB;QAAA,iBAiCC;QAhCG,OAAO,IAAI,OAAO,CAAM,UAAC,OAAO,EAAE,MAAM;YACpC,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAE9B,KAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC;iBACvC,IAAI,CAAC,UAAA,QAAQ;gBAEV,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBACrB,IAAI,OAAO,GAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,gBAAgB,SAAA,CAAC;;oBAGrB,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;wBAC7C,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;qBAC9C;yBAAM;wBACH,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;qBACtC;oBAED,KAAI,CAAC,iBAAiB;yBACjB,QAAQ,CAAC,gBAAgB,CAAC;yBAC1B,IAAI,CAAC,UAAA,cAAc;wBAChB,OAAO,CAAC,cAAc,CAAC,CAAC;qBAC3B,CAAC,CAAC,KAAK,CAAC,UAAA,KAAK;wBACV,MAAM,CAAC,2BAA2B,CAAC,CAAC;qBACvC,CAAC,CAAC;iBACV;qBAAM;oBACH,MAAM,CAAC,kBAAkB,CAAC,CAAC;iBAC9B;aAEJ,CAAC,CAAC,KAAK,CAAC,UAAA,KAAK;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;aACjB,CAAC,CAAC;SACV,CAAC,CAAC;KACN;IAEL,qBAAC;CAAA,IAAA,AACD;;ACnGO,IAAM,2BAA2B,GAAG,WAAW,CAAC;AACvD,AAAO,IAAM,uBAAuB,GAAG,OAAO,CAAC;AAExC;IAAA;KAqBN;IAhBG,sBAAI,6BAAI;aAIR;YACI,OAAO,IAAI,CAAC,KAAK,CAAC;SACrB;aAND,UAAS,CAAQ;YACb,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;SAClB;;;OAAA;IAMD,sBAAI,6BAAI;aAIR;YACI,OAAO,IAAI,CAAC,KAAK,CAAC;SACrB;aAND,UAAS,CAAK;YACV,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;SAClB;;;OAAA;IAML,kBAAC;CAAA,IAAA,AACD;;ACtBO;IAAA;KAqEN;IAhEG,sBAAI,wCAAQ;aAIZ;YACI,OAAO,IAAI,CAAC,SAAS,CAAC;SACzB;aAND,UAAa,EAAS;YAClB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;SACvB;;;OAAA;IAMD,sBAAI,iDAAiB;aAIrB;YACI,OAAO,IAAI,CAAC,kBAAkB,CAAC;SAClC;aAND,UAAsB,EAAoB;YACtC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;SAChC;;;OAAA;IAMD,2CAAc,GAAd,UAAe,aAAoB;QAAnC,iBAMC;QALI,OAAO,IAAI,CAAC,iBAAiB;aACzB,QAAQ,CAAC,aAAa,CAAC;aACvB,IAAI,CAAC,UAAC,WAAW;YACd,OAAO,KAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;SAC9E,CAAC,CAAC;KACV;IAED,+CAAkB,GAAlB,UAAmB,IAAW,EAAE,IAAQ;QACpC,IAAI,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QACpC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;QAExB,IAAI,IAAI,KAAK,uBAAuB,EAAE;YAClC,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;SACnD;aAAM,IAAI,IAAI,KAAK,2BAA2B,EAAE;YAC7C,OAAO,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;SACvD;aAAM;YACH,OAAO,IAAI,CAAC;SACf;KACJ;IAED,iDAAoB,GAApB,UAAqB,WAAuB,EAAE,IAAQ;QAAtD,iBAeC;QAdG,OAAO,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;aAChD,IAAI,CAAC,UAAA,MAAM;YACR,WAAW,CAAC,IAAI,GAAG;gBACf,KAAK,EAAI,IAAI,CAAC,QAAQ,CAAC,KAAK;gBAC5B,MAAM,EAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;gBAC7B,MAAM,EAAG,EAAE;aACd,CAAC;YAEF,KAAkB,UAAM,EAAN,iBAAM,EAAN,oBAAM,EAAN,IAAM;gBAAnB,IAAI,KAAK,eAAA;gBACV,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;aAChE;YAED,OAAO,WAAW,CAAC;SACtB,CAAC,CAAC;KACV;IAED,6CAAgB,GAAhB,UAAiB,WAAuB,EAAE,IAAQ;QAAlD,iBAQC;QAPG,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;aAC9C,IAAI,CAAC,UAAC,IAAI;YACP,WAAW,CAAC,IAAI,GAAG;gBACf,KAAK,EAAG,KAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;aAC3C,CAAC;YACF,OAAO,WAAW,CAAC;SACtB,CAAC,CAAC;KACV;IAEL,yBAAC;CAAA,IAAA,AACD;;;;;;;"} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | +{"version":3,"file":"bundle.js","sources":["../src/util.ts","../src/player.ts","../src/program-manager.ts","../src/program-item/program-item.ts","../src/program-item/program-item-factory.ts"],"sourcesContent":["export class Util {\n\n static getISODate() : string {\n return (new Date()).toISOString().slice(0,10);\n }\n\n static getDateInMinutes() : number {\n let now = new Date();\n return (now.getHours() * 60) + now.getMinutes();\n }\n\n /**\n * convert a time input to minutes\n * e.g. 23:59 = 1439\n */\n static convertToMinutes(time:string) : number {\n let times = time.split(\":\");\n let convered = (parseInt(times[0]) * 60) + parseInt(times[1]);\n return (convered >= 0 && convered <= 1439) ? convered : 0;\n }\n\n static calculateNextMinute() : number {\n return (60 - (Math.round((new Date()).getTime() / 1000) % 60)) * 1000;\n }\n\n}","import { EventEmitter } from 'events';\nimport {ProgramRepository} from './program-repository';\nimport {ProgramManager} from './program-manager';\nimport {Util} from './util';\n\nconst STATE_START = \"start\";\nconst STATE_STOP = \"stop\";\n\nexport class Player extends EventEmitter {\n\n constructor() {\n super();\n }\n\n protected _programRepository:ProgramRepository;\n protected _programManager:ProgramManager;\n protected _minutesReplication:number = 3;\n protected _replicationRetry:number = 10000;\n\n protected _currentProgramItemId:string = '';\n protected _currentReplicationCounter:number = 0;\n protected _state = STATE_STOP;\n\n set state(st:string) {\n this._state = st;\n }\n\n set programManager(pm:ProgramManager) {\n this._programManager = pm;\n }\n\n get programManager() : ProgramManager {\n return this._programManager;\n }\n\n set programRepository(pr:ProgramRepository) {\n this._programRepository = pr;\n }\n\n get programRepository() : ProgramRepository {\n return this._programRepository;\n }\n\n set minutesReplication(mr:number) {\n this._minutesReplication = mr;\n }\n\n get minutesReplication() : number {\n return this._minutesReplication;\n }\n\n set replicationRetry(rr:number) {\n this._replicationRetry = rr;\n }\n\n get replicationRetry() : number {\n return this._replicationRetry;\n }\n\n triggerReplication() : Promise<void> {\n console.info(\"digsig-player-service: trigger replication\");\n\n return this.programRepository.replicate()\n .then(changes => { \n this._currentReplicationCounter = 0;\n this.trigger(() => { this.triggerProgramItemId(changes); });\n })\n .catch(error => { \n this.trigger(() => { this.triggerReplication(); }, this.replicationRetry);\n this.emit('error', error);\n });\n }\n\n triggerProgramItemId(changes:boolean = false) {\n console.info(\"digsig-player-service: trigger program item id\");\n\n this.programManager.getCurrentProgramItemId()\n .then(programItemId => {\n this._currentReplicationCounter++;\n\n // if there is a new program item id trigger play\n // else (1) calculate next potential program change point\n // or (2) trigger replication\n\n if (programItemId && (programItemId != this._currentProgramItemId || changes)) {\n this._currentProgramItemId = programItemId;\n this.emit('play', programItemId);\n }\n \n if (this._currentReplicationCounter >= this._minutesReplication) {\n this.triggerReplication();\n } else {\n this.trigger(() => { this.triggerProgramItemId(); }, Util.calculateNextMinute());\n }\n });\n }\n\n trigger(func:Function, milliseconds:number = 0) {\n if (this._state === STATE_START) { \n setTimeout(() => { func(); }, milliseconds);\n } \n }\n\n start() {\n if (this._state === STATE_STOP) {\n this.triggerReplication();\n this._state = STATE_START;\n }\n }\n\n stop() {\n this._state = STATE_STOP;\n }\n\n}","import {ProgramRepository} from './program-repository';\nimport {Util} from './util';\nimport {ProgramItem, PROGRAM_ITEM_TYPE_SLIDESHOW, PROGRAM_ITEM_TYPE_VIDEO } from './program-item/program-item'\n\nexport class ProgramManager {\n\n protected _programRepository:ProgramRepository;\n\n set programRepository(pr:ProgramRepository) {\n this._programRepository = pr;\n }\n\n get programRepository() : ProgramRepository {\n return this._programRepository;\n }\n\n getCurrentProgramItemId() : Promise<string> {\n return new Promise<string> ((resolve, reject) => {\n this.findCurrentProgramSegment().then(programSegment => {\n let currentProgramItemId = programSegment.default;\n if (programSegment.schedule) {\n currentProgramItemId = this.findCurrentProgramItem(programSegment.schedule, Util.getDateInMinutes());\n }\n resolve(currentProgramItemId);\n });\n }); \n }\n\n /**\n * find program item in schedule, which fits\n * according to current hh:mm\n */\n findCurrentProgramItem(schedule:any, dateInMinutes:number) : string {\n let timeList:any = [];\n let tmpSchedule:any = {};\n\n for (let startTime in schedule) {\n if (schedule.hasOwnProperty(startTime)) {\n let minutes = Util.convertToMinutes(startTime);\n timeList.push(minutes);\n tmpSchedule[minutes] = schedule[startTime];\n }\n }\n\n // sort ascending (-)\n timeList.sort((a,b) => { return a-b; });\n\n let last = 0;\n for (let i = 0; i < timeList.length; i++) {\n if (timeList[i] <= dateInMinutes) {\n last = timeList[i];\n } else {\n break;\n }\n }\n\n return tmpSchedule[last];\n }\n\n /**\n * Find the program segment\n * This is dependent on the date set on the device\n */\n findCurrentProgramSegment() : Promise<any> {\n return new Promise<any>((resolve, reject) => {\n let today = Util.getISODate();\n \n this.programRepository.findByType('program')\n .then(programs => {\n \n if (programs.length > 0) {\n let program:any = programs[0];\n let programSegmentId;\n\n // if there is a program_segment for today else default\n if (program.schedule && program.schedule[today]) {\n programSegmentId = program.schedule[today];\n } else {\n programSegmentId = program.default;\n }\n \n this.programRepository\n .findById(programSegmentId)\n .then(programSegment => { \n resolve(programSegment);\n }).catch(error => { \n reject(\"program segment not found\");\n });\n } else {\n reject('No Program found');\n }\n\n }).catch(error => {\n reject(error);\n });\n });\n }\n\n}","export const PROGRAM_ITEM_TYPE_SLIDESHOW = \"slideshow\";\nexport const PROGRAM_ITEM_TYPE_VIDEO = \"video\";\n\nexport class ProgramItem {\n\n protected _type:string;\n protected _data:any;\n\n set type(t:string) {\n this._type = t;\n }\n\n get type():string {\n return this._type;\n }\n\n set data(d:any) {\n this._data = d;\n }\n\n get data():any {\n return this._data;\n }\n\n}","import {ProgramItem, PROGRAM_ITEM_TYPE_SLIDESHOW, PROGRAM_ITEM_TYPE_VIDEO } from './program-item';\nimport { ProgramRepository } from './../program-repository';\n\nexport class ProgramItemFactory {\n\n protected _programRepository:ProgramRepository;\n protected _basePath:string;\n\n set basePath(bp:string) {\n this._basePath = bp;\n }\n \n get basePath() : string {\n return this._basePath;\n }\n\n set programRepository(pr:ProgramRepository) {\n this._programRepository = pr;\n }\n\n get programRepository() : ProgramRepository {\n return this._programRepository;\n }\n\n getProgramItem(programItemId:string) : Promise<ProgramItem> {\n return this.programRepository\n .findById(programItemId)\n .then((programItem) => {\n return this.prepareProgramItem(programItem.program_item_type, programItem);\n });\n }\n\n prepareProgramItem(type:string, data:any) : Promise<ProgramItem> {\n let programItem = new ProgramItem();\n programItem.type = type;\n\n if (type === PROGRAM_ITEM_TYPE_VIDEO) {\n return this.prepareVideoItem(programItem, data);\n } else if (type === PROGRAM_ITEM_TYPE_SLIDESHOW) {\n return this.prepareSlideshowItem(programItem, data);\n } else {\n return null;\n }\n } \n\n prepareSlideshowItem(programItem:ProgramItem, data:any) : Promise<ProgramItem> {\n return this._programRepository.findByIds(data.images)\n .then(images => { \n programItem.data = {\n speed : data.settings.speed ,\n effect : data.settings.effect ,\n images : []\n }; \n\n for (let image of images) {\n programItem.data.images.push(this.basePath + image.filename);\n }\n\n return programItem;\n });\n }\n\n prepareVideoItem(programItem:ProgramItem, data:any) : Promise<ProgramItem> {\n return this._programRepository.findById(data.video)\n .then((data) => { \n programItem.data = {\n video : this.basePath + data['filename']\n }; \n return programItem;\n });\n }\n\n}"],"names":["EventEmitter"],"mappings":"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"} | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -6,19 +6,30 @@ interface ProgramRepository { | ... | @@ -6,19 +6,30 @@ interface ProgramRepository { |
| 6 | } | 6 | } |
| 7 | 7 | ||
| 8 | interface Player { | 8 | interface Player { |
| 9 | + new() : Player; | ||
| 10 | + | ||
| 9 | on(name:string, any); | 11 | on(name:string, any); |
| 12 | + once(name:string, any); | ||
| 13 | + | ||
| 10 | start() : void; | 14 | start() : void; |
| 11 | stop() : void; | 15 | stop() : void; |
| 16 | + | ||
| 17 | + programRepository: ProgramRepository; | ||
| 18 | + programManager: ProgramManager; | ||
| 12 | } | 19 | } |
| 13 | 20 | ||
| 14 | interface ProgramManager { | 21 | interface ProgramManager { |
| 22 | + new() : ProgramManager; | ||
| 23 | + | ||
| 15 | programRepository: ProgramRepository; | 24 | programRepository: ProgramRepository; |
| 16 | } | 25 | } |
| 17 | 26 | ||
| 18 | interface ProgramItemFactory { | 27 | interface ProgramItemFactory { |
| 28 | + new() : ProgramItemFactory; | ||
| 29 | + getProgramItem(programItemId:string) : Promise<any>; | ||
| 30 | + | ||
| 19 | basePath: string; | 31 | basePath: string; |
| 20 | programRepository: ProgramRepository; | 32 | programRepository: ProgramRepository; |
| 21 | - getProgramItem(programItemId:string) : Promise<any>; | ||
| 22 | } | 33 | } |
| 23 | 34 | ||
| 24 | declare var digsigPlayer: { | 35 | declare var digsigPlayer: { | ... | ... |
| ... | @@ -15,8 +15,8 @@ var rollupConfig = { | ... | @@ -15,8 +15,8 @@ var rollupConfig = { |
| 15 | dest: 'build/bundle.js', | 15 | dest: 'build/bundle.js', |
| 16 | 16 | ||
| 17 | plugins: [ | 17 | plugins: [ |
| 18 | - builtins(), | 18 | + // builtins(), |
| 19 | - globals(), | 19 | + // globals(), |
| 20 | typescript() | 20 | typescript() |
| 21 | ] | 21 | ] |
| 22 | 22 | ... | ... |
| ... | @@ -15,7 +15,7 @@ export class DummyProgramRepository implements ProgramRepository { | ... | @@ -15,7 +15,7 @@ export class DummyProgramRepository implements ProgramRepository { |
| 15 | return null; | 15 | return null; |
| 16 | } | 16 | } |
| 17 | 17 | ||
| 18 | - replicate() : Promise<void> { | 18 | + replicate() : Promise<boolean> { |
| 19 | return null; | 19 | return null; |
| 20 | } | 20 | } |
| 21 | 21 | ... | ... |
| ... | @@ -31,8 +31,7 @@ describe('Player repository triggers', () => { | ... | @@ -31,8 +31,7 @@ describe('Player repository triggers', () => { |
| 31 | }); | 31 | }); |
| 32 | 32 | ||
| 33 | player.triggerReplication().then(() => { | 33 | player.triggerReplication().then(() => { |
| 34 | - | 34 | + expect(player.trigger).toHaveBeenCalled(); |
| 35 | - expect(player.trigger).toHaveBeenCalledWith(player.triggerProgramItemId, Util.calculateNextMinute()); | ||
| 36 | done(); | 35 | done(); |
| 37 | }); | 36 | }); |
| 38 | }); | 37 | }); |
| ... | @@ -44,10 +43,12 @@ describe('Player repository triggers', () => { | ... | @@ -44,10 +43,12 @@ describe('Player repository triggers', () => { |
| 44 | }); | 43 | }); |
| 45 | }); | 44 | }); |
| 46 | 45 | ||
| 47 | - player.triggerReplication().then(() => { | 46 | + player.once('error', () => { |
| 48 | - expect(player.trigger).toHaveBeenCalledWith(player.triggerReplication, player.replicationRetry); | 47 | + expect(player.trigger).toHaveBeenCalled(); |
| 49 | done(); | 48 | done(); |
| 50 | }); | 49 | }); |
| 50 | + | ||
| 51 | + player.triggerReplication(); | ||
| 51 | }); | 52 | }); |
| 52 | 53 | ||
| 53 | }); | 54 | }); | ... | ... |
| ... | @@ -13,7 +13,8 @@ describe("Util", () => { | ... | @@ -13,7 +13,8 @@ describe("Util", () => { |
| 13 | }); | 13 | }); |
| 14 | 14 | ||
| 15 | it('should get the remaining seconds', () => { | 15 | it('should get the remaining seconds', () => { |
| 16 | - expect(Util.calculateNextMinute()).toEqual((60 - (new Date()).getSeconds()) * 1000); | 16 | + let now = (60 - (new Date()).getSeconds()); |
| 17 | + expect(Util.calculateNextMinute() / 1000).toBeCloseTo(now); | ||
| 17 | }); | 18 | }); |
| 18 | 19 | ||
| 19 | }); | 20 | }); |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -8,9 +8,13 @@ const STATE_STOP = "stop"; | ... | @@ -8,9 +8,13 @@ const STATE_STOP = "stop"; |
| 8 | 8 | ||
| 9 | export class Player extends EventEmitter { | 9 | export class Player extends EventEmitter { |
| 10 | 10 | ||
| 11 | + constructor() { | ||
| 12 | + super(); | ||
| 13 | + } | ||
| 14 | + | ||
| 11 | protected _programRepository:ProgramRepository; | 15 | protected _programRepository:ProgramRepository; |
| 12 | protected _programManager:ProgramManager; | 16 | protected _programManager:ProgramManager; |
| 13 | - protected _minutesReplication:number = 5; | 17 | + protected _minutesReplication:number = 3; |
| 14 | protected _replicationRetry:number = 10000; | 18 | protected _replicationRetry:number = 10000; |
| 15 | 19 | ||
| 16 | protected _currentProgramItemId:string = ''; | 20 | protected _currentProgramItemId:string = ''; |
| ... | @@ -54,17 +58,22 @@ export class Player extends EventEmitter { | ... | @@ -54,17 +58,22 @@ export class Player extends EventEmitter { |
| 54 | } | 58 | } |
| 55 | 59 | ||
| 56 | triggerReplication() : Promise<void> { | 60 | triggerReplication() : Promise<void> { |
| 61 | + console.info("digsig-player-service: trigger replication"); | ||
| 62 | + | ||
| 57 | return this.programRepository.replicate() | 63 | return this.programRepository.replicate() |
| 58 | - .then(() => { | 64 | + .then(changes => { |
| 59 | this._currentReplicationCounter = 0; | 65 | this._currentReplicationCounter = 0; |
| 60 | - this.trigger(this.triggerProgramItemId, Util.calculateNextMinute()); | 66 | + this.trigger(() => { this.triggerProgramItemId(changes); }); |
| 61 | }) | 67 | }) |
| 62 | - .catch(() => { | 68 | + .catch(error => { |
| 63 | - this.trigger(this.triggerReplication, this.replicationRetry); | 69 | + this.trigger(() => { this.triggerReplication(); }, this.replicationRetry); |
| 70 | + this.emit('error', error); | ||
| 64 | }); | 71 | }); |
| 65 | } | 72 | } |
| 66 | 73 | ||
| 67 | - triggerProgramItemId() { | 74 | + triggerProgramItemId(changes:boolean = false) { |
| 75 | + console.info("digsig-player-service: trigger program item id"); | ||
| 76 | + | ||
| 68 | this.programManager.getCurrentProgramItemId() | 77 | this.programManager.getCurrentProgramItemId() |
| 69 | .then(programItemId => { | 78 | .then(programItemId => { |
| 70 | this._currentReplicationCounter++; | 79 | this._currentReplicationCounter++; |
| ... | @@ -73,18 +82,20 @@ export class Player extends EventEmitter { | ... | @@ -73,18 +82,20 @@ export class Player extends EventEmitter { |
| 73 | // else (1) calculate next potential program change point | 82 | // else (1) calculate next potential program change point |
| 74 | // or (2) trigger replication | 83 | // or (2) trigger replication |
| 75 | 84 | ||
| 76 | - if (programItemId != this._currentProgramItemId) { | 85 | + if (programItemId && (programItemId != this._currentProgramItemId || changes)) { |
| 77 | this._currentProgramItemId = programItemId; | 86 | this._currentProgramItemId = programItemId; |
| 78 | this.emit('play', programItemId); | 87 | this.emit('play', programItemId); |
| 79 | - } else if (this._currentReplicationCounter >= this._minutesReplication) { | 88 | + } |
| 89 | + | ||
| 90 | + if (this._currentReplicationCounter >= this._minutesReplication) { | ||
| 80 | this.triggerReplication(); | 91 | this.triggerReplication(); |
| 81 | } else { | 92 | } else { |
| 82 | - this.trigger(this.triggerProgramItemId, Util.calculateNextMinute()); | 93 | + this.trigger(() => { this.triggerProgramItemId(); }, Util.calculateNextMinute()); |
| 83 | } | 94 | } |
| 84 | }); | 95 | }); |
| 85 | } | 96 | } |
| 86 | 97 | ||
| 87 | - trigger(func:Function, milliseconds:number) { | 98 | + trigger(func:Function, milliseconds:number = 0) { |
| 88 | if (this._state === STATE_START) { | 99 | if (this._state === STATE_START) { |
| 89 | setTimeout(() => { func(); }, milliseconds); | 100 | setTimeout(() => { func(); }, milliseconds); |
| 90 | } | 101 | } | ... | ... |
| ... | @@ -33,6 +33,7 @@ export class ProgramManager { | ... | @@ -33,6 +33,7 @@ export class ProgramManager { |
| 33 | findCurrentProgramItem(schedule:any, dateInMinutes:number) : string { | 33 | findCurrentProgramItem(schedule:any, dateInMinutes:number) : string { |
| 34 | let timeList:any = []; | 34 | let timeList:any = []; |
| 35 | let tmpSchedule:any = {}; | 35 | let tmpSchedule:any = {}; |
| 36 | + dateInMinutes--; // make it not so strict, which will start one minute earlier | ||
| 36 | 37 | ||
| 37 | for (let startTime in schedule) { | 38 | for (let startTime in schedule) { |
| 38 | if (schedule.hasOwnProperty(startTime)) { | 39 | if (schedule.hasOwnProperty(startTime)) { | ... | ... |
| ... | @@ -6,6 +6,9 @@ export interface ProgramRepository { | ... | @@ -6,6 +6,9 @@ export interface ProgramRepository { |
| 6 | 6 | ||
| 7 | findByType(type:string) : Promise<Array<any>>; | 7 | findByType(type:string) : Promise<Array<any>>; |
| 8 | 8 | ||
| 9 | - replicate() : Promise<void>; | 9 | + /** |
| 10 | + * returns true / false depending on if there where any changes to download | ||
| 11 | + */ | ||
| 12 | + replicate() : Promise<boolean>; | ||
| 10 | 13 | ||
| 11 | } | 14 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment