BaseModule.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import JobQueue from "./JobQueue";
  2. import LogBook, { Log } from "./LogBook";
  3. import ModuleManager from "./ModuleManager";
  4. import { Modules } from "./types/Modules";
  5. export enum ModuleStatus {
  6. LOADED = "LOADED",
  7. STARTING = "STARTING",
  8. STARTED = "STARTED",
  9. STOPPED = "STOPPED",
  10. STOPPING = "STOPPING",
  11. ERROR = "ERROR",
  12. DISABLED = "DISABLED"
  13. }
  14. export default abstract class BaseModule {
  15. protected moduleManager: ModuleManager;
  16. protected logBook: LogBook;
  17. protected jobQueue: JobQueue;
  18. protected name: string;
  19. protected status: ModuleStatus;
  20. protected dependentModules: (keyof Modules)[];
  21. /**
  22. * Base Module
  23. *
  24. * @param name - Module name
  25. */
  26. public constructor(name: string) {
  27. this.moduleManager = ModuleManager.getPrimaryInstance();
  28. this.logBook = LogBook.getPrimaryInstance();
  29. this.jobQueue = JobQueue.getPrimaryInstance();
  30. this.name = name;
  31. this.status = ModuleStatus.LOADED;
  32. this.dependentModules = [];
  33. this.log(`Module (${this.name}) loaded`);
  34. }
  35. /**
  36. * getName - Get module name
  37. *
  38. * @returns name
  39. */
  40. public getName() {
  41. return this.name;
  42. }
  43. /**
  44. * getStatus - Get module status
  45. *
  46. * @returns status
  47. */
  48. public getStatus() {
  49. return this.status;
  50. }
  51. /**
  52. * setStatus - Set module status
  53. *
  54. * @param status - Module status
  55. */
  56. public setStatus(status: ModuleStatus) {
  57. this.status = status;
  58. }
  59. /**
  60. * getDependentModules - Get module dependencies
  61. */
  62. public getDependentModules() {
  63. return this.dependentModules;
  64. }
  65. /**
  66. * startup - Startup module
  67. */
  68. public async startup() {
  69. this.log(`Module (${this.name}) starting`);
  70. this.setStatus(ModuleStatus.STARTING);
  71. }
  72. /**
  73. * started - called with the module has started
  74. */
  75. protected async started() {
  76. this.log(`Module (${this.name}) started`);
  77. this.setStatus(ModuleStatus.STARTED);
  78. }
  79. /**
  80. * shutdown - Shutdown module
  81. */
  82. public async shutdown() {
  83. this.log(`Module (${this.name}) stopping`);
  84. this.setStatus(ModuleStatus.STOPPING);
  85. await this.stopped();
  86. }
  87. /**
  88. * stopped - called when the module has stopped
  89. */
  90. protected async stopped() {
  91. this.log(`Module (${this.name}) stopped`);
  92. this.setStatus(ModuleStatus.STOPPED);
  93. }
  94. /**
  95. * log - Add log to logbook
  96. *
  97. * @param log - Log message or object
  98. */
  99. protected log(log: string | Omit<Log, "timestamp" | "category">) {
  100. const {
  101. message,
  102. type = undefined,
  103. data = {}
  104. } = {
  105. ...(typeof log === "string" ? { message: log } : log)
  106. };
  107. this.logBook.log({
  108. message,
  109. type,
  110. category: `modules.${this.getName()}`,
  111. data: {
  112. moduleName: this.name,
  113. ...data
  114. }
  115. });
  116. }
  117. }