Registry.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { Server } from '../../server';
  2. import { HttpHandler, Middleware } from '../http';
  3. import { Guid } from '../util';
  4. abstract class Registry {
  5. private static httpHandlers: {[key: string]: HttpHandler} = {};
  6. private server: Server | null = null;
  7. protected abstract registerRoutes(): Promise<Registry>;
  8. protected abstract registerMiddlewares(): Promise<Registry>;
  9. public async registerHttpHandlers(): Promise<Registry> {
  10. await this.registerRoutes();
  11. await this.registerMiddlewares();
  12. return this;
  13. }
  14. protected registerHttpHandler(handler: HttpHandler): Registry {
  15. let id = Guid.new();
  16. while(Registry.httpHandlers[id] != null)
  17. id = Guid.new();
  18. Registry.httpHandlers[id] = handler;
  19. return this;
  20. }
  21. public setServer(server: Server): Registry {
  22. if(this.server != null)
  23. return this;
  24. return this.server = server, this;
  25. }
  26. public getServer(): Server | null {
  27. return this.server;
  28. }
  29. public static getHttpHandlers(): HttpHandler[] {
  30. const handlers: HttpHandler[] = [];
  31. const middlewareOrders: number[] = [];
  32. for(const key in Registry.httpHandlers) {
  33. const handler = Registry.httpHandlers[key];
  34. if(handler instanceof Middleware) {
  35. const order = handler.getOrder();
  36. if(middlewareOrders.includes(order))
  37. throw `Invalid middleware order number: ${handler.constructor.name}`;
  38. middlewareOrders.push(order);
  39. }
  40. handlers.push(Registry.httpHandlers[key]);
  41. }
  42. return handlers.sort((a, b) => a instanceof Middleware && b instanceof Middleware && (a.getOrder() - b.getOrder()) || (a instanceof Middleware && -1 || (b instanceof Middleware && 1 || 0)));
  43. }
  44. }
  45. export default Registry;