hook-registry.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import {Service} from '../service.js';
  2. import {Errorf} from '@e22m4u/js-format';
  3. /**
  4. * Router hook.
  5. *
  6. * @type {{
  7. * PRE_HANDLER: 'preHandler',
  8. * POST_HANDLER: 'postHandler',
  9. * }}
  10. */
  11. export const HOOK_NAME = {
  12. PRE_HANDLER: 'preHandler',
  13. POST_HANDLER: 'postHandler',
  14. };
  15. /**
  16. * Hook registry.
  17. */
  18. export class HookRegistry extends Service {
  19. /**
  20. * Hooks.
  21. *
  22. * @type {Map<string, Function[]>}
  23. * @private
  24. */
  25. _hooks = new Map();
  26. /**
  27. * Add hook.
  28. *
  29. * @param {string} name
  30. * @param {Function} hook
  31. * @returns {this}
  32. */
  33. addHook(name, hook) {
  34. if (!name || typeof name !== 'string')
  35. throw new Errorf('The hook name is required, but %v given.', name);
  36. if (!Object.values(HOOK_NAME).includes(name))
  37. throw new Errorf('The hook name %v is not supported.', name);
  38. if (!hook || typeof hook !== 'function')
  39. throw new Errorf(
  40. 'The hook %v should be a Function, but %v given.',
  41. name,
  42. hook,
  43. );
  44. const hooks = this._hooks.get(name) || [];
  45. hooks.push(hook);
  46. this._hooks.set(name, hooks);
  47. return this;
  48. }
  49. /**
  50. * Has hook.
  51. *
  52. * @param {string} name
  53. * @param {Function} hook
  54. * @returns {boolean}
  55. */
  56. hasHook(name, hook) {
  57. if (!name || typeof name !== 'string')
  58. throw new Errorf('The hook name is required, but %v given.', name);
  59. if (!Object.values(HOOK_NAME).includes(name))
  60. throw new Errorf('The hook name %v is not supported.', name);
  61. if (!hook || typeof hook !== 'function')
  62. throw new Errorf(
  63. 'The hook %v should be a Function, but %v given.',
  64. name,
  65. hook,
  66. );
  67. const hooks = this._hooks.get(name) || [];
  68. return hooks.indexOf(hook) > -1;
  69. }
  70. /**
  71. * Get hooks.
  72. *
  73. * @param {string} name
  74. * @returns {Function[]}
  75. */
  76. getHooks(name) {
  77. if (!name || typeof name !== 'string')
  78. throw new Errorf('The hook name is required, but %v given.', name);
  79. if (!Object.values(HOOK_NAME).includes(name))
  80. throw new Errorf('The hook name %v is not supported.', name);
  81. return this._hooks.get(name) || [];
  82. }
  83. }