Source: Scheduler.js

  1. const EventEmitter = require('events').EventEmitter
  2. , absMethod = 'Abstract method'
  3. , { Observable, fromEvent } = require('rxjs')
  4. , { filter } = require('rxjs/operators')
  5. , { Schedule, ScheduleEvent, PreliminaryScheduleEvent } = require('./Schedule');
  6. /**
  7. * Generic scheduler class that can emit events of type T. The purpose
  8. * of this scheduler is to notify when an event occurs or something should
  9. * be executed. It shall be used as base-class to other schedulers. It is
  10. * not to be used for executing jobs, use an appropriate queue for that.
  11. * Although providing Observables, Schedulers never error or complete.
  12. *
  13. * @author Sebastian Hönel <development@hoenel.net>
  14. * @extends {EventEmitter}
  15. * @template T
  16. */
  17. class Scheduler extends EventEmitter {
  18. /**
  19. * @param {Symbol} schedulerSymbol The symbol that is used for emitting
  20. * events from this Scheduler.
  21. */
  22. constructor(schedulerSymbol) {
  23. super();
  24. /** @protected */
  25. this._symbol = schedulerSymbol;
  26. /**
  27. * @protected
  28. * @type {Observable<T>}
  29. */
  30. this._observable = fromEvent(this, schedulerSymbol);
  31. };
  32. /**
  33. * Returns the same Observable<T> to every subscriber. Note that this Observable
  34. * never errors or drains. You will need to observe a particular Schedule to get
  35. * its errors or completion. The Observable never errors or completes.
  36. *
  37. * @template T Must be of type ScheduleEvent or more derived.
  38. * @type {Observable<T|ScheduleEvent>}
  39. */
  40. get observable() {
  41. return this._observable;
  42. };
  43. /**
  44. * @template T Must be of type ScheduleEvent or more derived.
  45. * @param {T|Schedule} schedule
  46. * @returns {Observable<T|ScheduleEvent>} An Observable for the designated schedule.
  47. */
  48. getObservableForSchedule(schedule) {
  49. return this.observable.pipe(filter(evt => evt.schedule === schedule));
  50. };
  51. /**
  52. * Add a Schedule to this scheduler. This is an abstract method.
  53. *
  54. * @param {Schedule} schedule
  55. * @returns {this}
  56. */
  57. addSchedule(schedule) {
  58. throw new Error(absMethod);
  59. };
  60. /**
  61. * Remove a Schedule from this scheduler. This is an abstract method.
  62. *
  63. * @param {Schedule} schedule
  64. * @returns {this}
  65. */
  66. removeSchedule(schedule) {
  67. throw new Error(absMethod);
  68. };
  69. /**
  70. * Removes all Schedules from this scheduler. This is an abstract methdod.
  71. *
  72. * @returns {Array<Schedule>} All Schedules as array.
  73. */
  74. removeAllSchedules() {
  75. throw new Error(absMethod);
  76. };
  77. /**
  78. * Returns a value indicating whether this Scheduler has the given
  79. * Schedule. This is an abstract method.
  80. *
  81. * @param {Schedule} schedule
  82. * @returns {this}
  83. */
  84. hasSchedule(schedule) {
  85. throw new Error(absMethod);
  86. };
  87. /**
  88. * A generator that supposedly yields all schedules' preliminary events.
  89. *
  90. * @template T Must be of type PreliminaryScheduleEvent or more derived.
  91. * @param {Date} [after] Optional. Defaults to undefined.
  92. * @param {Date} [before] Optional. Defaults to undefined.
  93. * @returns {IterableIterator<PreliminaryScheduleEvent<T|Schedule, any>>}
  94. */
  95. *preliminaryEvents(after, before) {
  96. };
  97. };
  98. module.exports = Object.freeze({
  99. Scheduler
  100. });