Просмотр исходного кода

refactor: renames hook services

e22m4u 2 недель назад
Родитель
Сommit
b2d8afbe69

+ 198 - 201
dist/cjs/index.cjs

@@ -37,8 +37,6 @@ __export(index_exports, {
   DataSender: () => DataSender,
   DataSender: () => DataSender,
   EXPOSED_ERROR_PROPERTIES: () => EXPOSED_ERROR_PROPERTIES,
   EXPOSED_ERROR_PROPERTIES: () => EXPOSED_ERROR_PROPERTIES,
   ErrorSender: () => ErrorSender,
   ErrorSender: () => ErrorSender,
-  HookInvoker: () => HookInvoker,
-  HookRegistry: () => HookRegistry,
   HttpMethod: () => HttpMethod,
   HttpMethod: () => HttpMethod,
   METHODS_WITH_BODY: () => METHODS_WITH_BODY,
   METHODS_WITH_BODY: () => METHODS_WITH_BODY,
   QueryParser: () => QueryParser,
   QueryParser: () => QueryParser,
@@ -48,6 +46,8 @@ __export(index_exports, {
   RequestParser: () => RequestParser,
   RequestParser: () => RequestParser,
   Route: () => Route,
   Route: () => Route,
   RouteRegistry: () => RouteRegistry,
   RouteRegistry: () => RouteRegistry,
+  RouterHookInvoker: () => RouterHookInvoker,
+  RouterHookRegistry: () => RouterHookRegistry,
   RouterHookType: () => RouterHookType,
   RouterHookType: () => RouterHookType,
   RouterOptions: () => RouterOptions,
   RouterOptions: () => RouterOptions,
   TrieRouter: () => TrieRouter,
   TrieRouter: () => TrieRouter,
@@ -81,9 +81,6 @@ var ROOT_PATH = "/";
 // src/route/route.js
 // src/route/route.js
 var import_js_debug = require("@e22m4u/js-debug");
 var import_js_debug = require("@e22m4u/js-debug");
 
 
-// src/hooks/hook-invoker.js
-var import_js_format11 = require("@e22m4u/js-format");
-
 // src/debuggable-service.js
 // src/debuggable-service.js
 var import_js_service = require("@e22m4u/js-service");
 var import_js_service = require("@e22m4u/js-service");
 var MODULE_DEBUG_NAMESPACE = "jsTrieRouter";
 var MODULE_DEBUG_NAMESPACE = "jsTrieRouter";
@@ -790,14 +787,17 @@ function getRequestPathname(request) {
 }
 }
 __name(getRequestPathname, "getRequestPathname");
 __name(getRequestPathname, "getRequestPathname");
 
 
-// src/hooks/hook-registry.js
+// src/hooks/router-hook-invoker.js
+var import_js_format11 = require("@e22m4u/js-format");
+
+// src/hooks/router-hook-registry.js
 var import_js_format10 = require("@e22m4u/js-format");
 var import_js_format10 = require("@e22m4u/js-format");
 var RouterHookType = {
 var RouterHookType = {
   PRE_HANDLER: "preHandler",
   PRE_HANDLER: "preHandler",
   POST_HANDLER: "postHandler"
   POST_HANDLER: "postHandler"
 };
 };
 var ROUTER_HOOK_TYPES = Object.values(RouterHookType);
 var ROUTER_HOOK_TYPES = Object.values(RouterHookType);
-var _HookRegistry = class _HookRegistry {
+var _RouterHookRegistry = class _RouterHookRegistry {
   /**
   /**
    * Hooks.
    * Hooks.
    *
    *
@@ -815,19 +815,16 @@ var _HookRegistry = class _HookRegistry {
   addHook(type, hook) {
   addHook(type, hook) {
     if (!type || typeof type !== "string") {
     if (!type || typeof type !== "string") {
       throw new import_js_format10.InvalidArgumentError(
       throw new import_js_format10.InvalidArgumentError(
-        "The hook type is required, but %v was given.",
+        "Hook type is required, but %v was given.",
         type
         type
       );
       );
     }
     }
     if (!Object.values(RouterHookType).includes(type)) {
     if (!Object.values(RouterHookType).includes(type)) {
-      throw new import_js_format10.InvalidArgumentError(
-        "The hook type %v is not supported.",
-        type
-      );
+      throw new import_js_format10.InvalidArgumentError("Hook type %v is not supported.", type);
     }
     }
     if (!hook || typeof hook !== "function") {
     if (!hook || typeof hook !== "function") {
       throw new import_js_format10.InvalidArgumentError(
       throw new import_js_format10.InvalidArgumentError(
-        "The hook %v must be a Function, but %v was given.",
+        "Router hook %v must be a Function, but %v was given.",
         type,
         type,
         hook
         hook
       );
       );
@@ -847,19 +844,16 @@ var _HookRegistry = class _HookRegistry {
   hasHook(type, hook) {
   hasHook(type, hook) {
     if (!type || typeof type !== "string") {
     if (!type || typeof type !== "string") {
       throw new import_js_format10.InvalidArgumentError(
       throw new import_js_format10.InvalidArgumentError(
-        "The hook type is required, but %v was given.",
+        "Hook type is required, but %v was given.",
         type
         type
       );
       );
     }
     }
     if (!Object.values(RouterHookType).includes(type)) {
     if (!Object.values(RouterHookType).includes(type)) {
-      throw new import_js_format10.InvalidArgumentError(
-        "The hook type %v is not supported.",
-        type
-      );
+      throw new import_js_format10.InvalidArgumentError("Hook type %v is not supported.", type);
     }
     }
     if (!hook || typeof hook !== "function") {
     if (!hook || typeof hook !== "function") {
       throw new import_js_format10.InvalidArgumentError(
       throw new import_js_format10.InvalidArgumentError(
-        "The hook %v must be a Function, but %v was given.",
+        "Router hook %v must be a Function, but %v was given.",
         type,
         type,
         hook
         hook
       );
       );
@@ -876,24 +870,21 @@ var _HookRegistry = class _HookRegistry {
   getHooks(type) {
   getHooks(type) {
     if (!type || typeof type !== "string") {
     if (!type || typeof type !== "string") {
       throw new import_js_format10.InvalidArgumentError(
       throw new import_js_format10.InvalidArgumentError(
-        "The hook type is required, but %v was given.",
+        "Hook type is required, but %v was given.",
         type
         type
       );
       );
     }
     }
     if (!Object.values(RouterHookType).includes(type)) {
     if (!Object.values(RouterHookType).includes(type)) {
-      throw new import_js_format10.InvalidArgumentError(
-        "The hook type %v is not supported.",
-        type
-      );
+      throw new import_js_format10.InvalidArgumentError("Hook type %v is not supported.", type);
     }
     }
     return this._hooks.get(type) || [];
     return this._hooks.get(type) || [];
   }
   }
 };
 };
-__name(_HookRegistry, "HookRegistry");
-var HookRegistry = _HookRegistry;
+__name(_RouterHookRegistry, "RouterHookRegistry");
+var RouterHookRegistry = _RouterHookRegistry;
 
 
-// src/hooks/hook-invoker.js
-var _HookInvoker = class _HookInvoker extends DebuggableService {
+// src/hooks/router-hook-invoker.js
+var _RouterHookInvoker = class _RouterHookInvoker extends DebuggableService {
   /**
   /**
    * Последовательно вызывает глобальные хуки и хуки маршрута указанного
    * Последовательно вызывает глобальные хуки и хуки маршрута указанного
    * типа, пока один из них не вернет отличное от undefined и null значение
    * типа, пока один из них не вернет отличное от undefined и null значение
@@ -910,25 +901,25 @@ var _HookInvoker = class _HookInvoker extends DebuggableService {
   invokeAndContinueUntilValueReceived(route, hookType, response, ...args) {
   invokeAndContinueUntilValueReceived(route, hookType, response, ...args) {
     if (!route || !(route instanceof Route)) {
     if (!route || !(route instanceof Route)) {
       throw new import_js_format11.InvalidArgumentError(
       throw new import_js_format11.InvalidArgumentError(
-        'The parameter "route" of the HookInvoker.invokeAndContinueUntilValueReceived must be a Route instance, but %v was given.',
+        'Parameter "route" must be a Route instance, but %v was given.',
         route
         route
       );
       );
     }
     }
     if (!hookType || typeof hookType !== "string") {
     if (!hookType || typeof hookType !== "string") {
       throw new import_js_format11.InvalidArgumentError(
       throw new import_js_format11.InvalidArgumentError(
-        'The parameter "hookType" of the HookInvoker.invokeAndContinueUntilValueReceived must be a non-empty String, but %v was given.',
+        'Parameter "hookType" must be a non-empty String, but %v was given.',
         hookType
         hookType
       );
       );
     }
     }
     if (!Object.values(RouterHookType).includes(hookType)) {
     if (!Object.values(RouterHookType).includes(hookType)) {
       throw new import_js_format11.InvalidArgumentError(
       throw new import_js_format11.InvalidArgumentError(
-        "The hook type %v is not supported.",
+        "Hook type %v is not supported.",
         hookType
         hookType
       );
       );
     }
     }
     if (!response || typeof response !== "object" || Array.isArray(response) || typeof response.headersSent !== "boolean") {
     if (!response || typeof response !== "object" || Array.isArray(response) || typeof response.headersSent !== "boolean") {
       throw new import_js_format11.InvalidArgumentError(
       throw new import_js_format11.InvalidArgumentError(
-        'The parameter "response" of the HookInvoker.invokeAndContinueUntilValueReceived must be a ServerResponse instance, but %v was given.',
+        'Parameter "response" must be a ServerResponse instance, but %v was given.',
         response
         response
       );
       );
     }
     }
@@ -936,7 +927,7 @@ var _HookInvoker = class _HookInvoker extends DebuggableService {
       return response;
       return response;
     }
     }
     const hooks = [
     const hooks = [
-      ...this.getService(HookRegistry).getHooks(hookType),
+      ...this.getService(RouterHookRegistry).getHooks(hookType),
       ...route.getHookRegistry().getHooks(hookType)
       ...route.getHookRegistry().getHooks(hookType)
     ];
     ];
     let result = void 0;
     let result = void 0;
@@ -996,8 +987,8 @@ var _HookInvoker = class _HookInvoker extends DebuggableService {
     return;
     return;
   }
   }
 };
 };
-__name(_HookInvoker, "HookInvoker");
-var HookInvoker = _HookInvoker;
+__name(_RouterHookInvoker, "RouterHookInvoker");
+var RouterHookInvoker = _RouterHookInvoker;
 
 
 // src/route/validate-route-definition.js
 // src/route/validate-route-definition.js
 var import_js_format12 = require("@e22m4u/js-format");
 var import_js_format12 = require("@e22m4u/js-format");
@@ -1098,13 +1089,13 @@ var _Route = class _Route extends import_js_debug.Debuggable {
   /**
   /**
    * Hook registry.
    * Hook registry.
    *
    *
-   * @type {HookRegistry}
+   * @type {RouterHookRegistry}
    */
    */
-  _hookRegistry = new HookRegistry();
+  _hookRegistry = new RouterHookRegistry();
   /**
   /**
    * Get hook registry.
    * Get hook registry.
    *
    *
-   * @returns {HookRegistry}
+   * @returns {RouterHookRegistry}
    */
    */
   getHookRegistry() {
   getHookRegistry() {
     return this._hookRegistry;
     return this._hookRegistry;
@@ -1744,175 +1735,32 @@ var RequestContext = _RequestContext;
 var import_js_service4 = require("@e22m4u/js-service");
 var import_js_service4 = require("@e22m4u/js-service");
 var import_http4 = require("http");
 var import_http4 = require("http");
 
 
-// src/senders/data-sender.js
-var import_js_format18 = require("@e22m4u/js-format");
-var _DataSender = class _DataSender extends DebuggableService {
-  /**
-   * Send.
-   *
-   * @param {import('http').ServerResponse} response
-   * @param {*} data
-   * @returns {undefined}
-   */
-  send(response, data) {
-    const debug = this.getDebuggerFor(this.send);
-    if (data === response || response.headersSent) {
-      debug("Skipping response because headers have already been sent.");
-      return;
-    }
-    if (data == null) {
-      response.statusCode = 204;
-      response.end();
-      debug("Empty response has been sent.");
-      return;
-    }
-    if (isReadableStream(data)) {
-      response.setHeader("Content-Type", "application/octet-stream");
-      data.pipe(response);
-      debug("Sending response with a Stream.");
-      return;
-    }
-    let debugMsg;
-    switch (typeof data) {
-      case "object":
-      case "boolean":
-      case "number":
-        if (Buffer.isBuffer(data)) {
-          response.setHeader("content-type", "application/octet-stream");
-          debugMsg = "Buffer has been sent as binary data.";
-        } else {
-          response.setHeader("content-type", "application/json");
-          debugMsg = (0, import_js_format18.format)(
-            "%v has been sent as JSON.",
-            toPascalCase(typeof data)
-          );
-          data = JSON.stringify(data);
-        }
-        break;
-      default:
-        response.setHeader("content-type", "text/plain");
-        debugMsg = "Response data has been sent as plain text.";
-        data = String(data);
-        break;
-    }
-    response.end(data);
-    debug(debugMsg);
-  }
-};
-__name(_DataSender, "DataSender");
-var DataSender = _DataSender;
-
-// src/senders/error-sender.js
-var import_util = require("util");
-var import_statuses = __toESM(require("statuses"), 1);
-var EXPOSED_ERROR_PROPERTIES = ["code", "details"];
-var _ErrorSender = class _ErrorSender extends DebuggableService {
-  /**
-   * Handle.
-   *
-   * @param {import('http').IncomingMessage} request
-   * @param {import('http').ServerResponse} response
-   * @param {Error} error
-   * @returns {undefined}
-   */
-  send(request, response, error) {
-    const debug = this.getDebuggerFor(this.send);
-    let safeError = {};
-    if (error) {
-      if (typeof error === "object") {
-        safeError = error;
-      } else {
-        safeError = { message: String(error) };
-      }
-    }
-    const statusCode = error.statusCode || error.status || 500;
-    const body = { error: {} };
-    if (safeError.message && typeof safeError.message === "string") {
-      body.error.message = safeError.message;
-    } else {
-      body.error.message = (0, import_statuses.default)(statusCode);
-    }
-    EXPOSED_ERROR_PROPERTIES.forEach((name) => {
-      if (name in safeError) {
-        body.error[name] = safeError[name];
-      }
-    });
-    const requestData = {
-      url: request.url,
-      method: request.method,
-      headers: request.headers
-    };
-    const inspectOptions = {
-      showHidden: false,
-      depth: null,
-      colors: true,
-      compact: false
-    };
-    console.warn((0, import_util.inspect)(requestData, inspectOptions));
-    console.warn((0, import_util.inspect)(body, inspectOptions));
-    if (error.stack) {
-      console.log(error.stack);
-    } else {
-      console.error(error);
-    }
-    response.statusCode = statusCode;
-    response.setHeader("content-type", "application/json; charset=utf-8");
-    response.end(JSON.stringify(body, null, 2), "utf-8");
-    debug(
-      "%s error has been sent for the request %s %v.",
-      statusCode,
-      request.method,
-      getRequestPathname(request)
-    );
-  }
-  /**
-   * Send 404.
-   *
-   * @param {import('http').IncomingMessage} request
-   * @param {import('http').ServerResponse} response
-   * @returns {undefined}
-   */
-  send404(request, response) {
-    const debug = this.getDebuggerFor(this.send404);
-    response.statusCode = 404;
-    response.setHeader("content-type", "text/plain; charset=utf-8");
-    response.end("404 Not Found", "utf-8");
-    debug(
-      "404 error has been sent for the request %s %v.",
-      request.method,
-      getRequestPathname(request)
-    );
-  }
-};
-__name(_ErrorSender, "ErrorSender");
-var ErrorSender = _ErrorSender;
-
 // src/branch/router-branch.js
 // src/branch/router-branch.js
-var import_js_format20 = require("@e22m4u/js-format");
+var import_js_format19 = require("@e22m4u/js-format");
 
 
 // src/branch/validate-router-branch-definition.js
 // src/branch/validate-router-branch-definition.js
-var import_js_format19 = require("@e22m4u/js-format");
+var import_js_format18 = require("@e22m4u/js-format");
 function validateRouterBranchDefinition(branchDef) {
 function validateRouterBranchDefinition(branchDef) {
   if (!branchDef || typeof branchDef !== "object" || Array.isArray(branchDef)) {
   if (!branchDef || typeof branchDef !== "object" || Array.isArray(branchDef)) {
-    throw new import_js_format19.InvalidArgumentError(
+    throw new import_js_format18.InvalidArgumentError(
       "Branch definition must be an Object, but %v was given.",
       "Branch definition must be an Object, but %v was given.",
       branchDef
       branchDef
     );
     );
   }
   }
   if (branchDef.method !== void 0) {
   if (branchDef.method !== void 0) {
-    throw new import_js_format19.InvalidArgumentError(
+    throw new import_js_format18.InvalidArgumentError(
       'Option "method" is not supported for the router branch, but %v was given.',
       'Option "method" is not supported for the router branch, but %v was given.',
       branchDef.method
       branchDef.method
     );
     );
   }
   }
   if (!branchDef.path || typeof branchDef.path !== "string") {
   if (!branchDef.path || typeof branchDef.path !== "string") {
-    throw new import_js_format19.InvalidArgumentError(
+    throw new import_js_format18.InvalidArgumentError(
       'Option "path" must be a non-empty String, but %v was given.',
       'Option "path" must be a non-empty String, but %v was given.',
       branchDef.path
       branchDef.path
     );
     );
   }
   }
   if (branchDef.handler !== void 0) {
   if (branchDef.handler !== void 0) {
-    throw new import_js_format19.InvalidArgumentError(
+    throw new import_js_format18.InvalidArgumentError(
       'Option "handler" is not supported for the router branch, but %v was given.',
       'Option "handler" is not supported for the router branch, but %v was given.',
       branchDef.handler
       branchDef.handler
     );
     );
@@ -1921,14 +1769,14 @@ function validateRouterBranchDefinition(branchDef) {
     if (Array.isArray(branchDef.preHandler)) {
     if (Array.isArray(branchDef.preHandler)) {
       branchDef.preHandler.forEach((preHandler) => {
       branchDef.preHandler.forEach((preHandler) => {
         if (typeof preHandler !== "function") {
         if (typeof preHandler !== "function") {
-          throw new import_js_format19.InvalidArgumentError(
+          throw new import_js_format18.InvalidArgumentError(
             "Route pre-handler must be a Function, but %v was given.",
             "Route pre-handler must be a Function, but %v was given.",
             preHandler
             preHandler
           );
           );
         }
         }
       });
       });
     } else if (typeof branchDef.preHandler !== "function") {
     } else if (typeof branchDef.preHandler !== "function") {
-      throw new import_js_format19.InvalidArgumentError(
+      throw new import_js_format18.InvalidArgumentError(
         'Option "preHandler" must be a Function or an Array, but %v was given.',
         'Option "preHandler" must be a Function or an Array, but %v was given.',
         branchDef.preHandler
         branchDef.preHandler
       );
       );
@@ -1938,14 +1786,14 @@ function validateRouterBranchDefinition(branchDef) {
     if (Array.isArray(branchDef.postHandler)) {
     if (Array.isArray(branchDef.postHandler)) {
       branchDef.postHandler.forEach((postHandler) => {
       branchDef.postHandler.forEach((postHandler) => {
         if (typeof postHandler !== "function") {
         if (typeof postHandler !== "function") {
-          throw new import_js_format19.InvalidArgumentError(
+          throw new import_js_format18.InvalidArgumentError(
             "Route post-handler must be a Function, but %v was given.",
             "Route post-handler must be a Function, but %v was given.",
             postHandler
             postHandler
           );
           );
         }
         }
       });
       });
     } else if (typeof branchDef.postHandler !== "function") {
     } else if (typeof branchDef.postHandler !== "function") {
-      throw new import_js_format19.InvalidArgumentError(
+      throw new import_js_format18.InvalidArgumentError(
         'Option "postHandler" must be a Function or an Array, but %v was given.',
         'Option "postHandler" must be a Function or an Array, but %v was given.',
         branchDef.postHandler
         branchDef.postHandler
       );
       );
@@ -1953,7 +1801,7 @@ function validateRouterBranchDefinition(branchDef) {
   }
   }
   if (branchDef.meta !== void 0) {
   if (branchDef.meta !== void 0) {
     if (!branchDef.meta || typeof branchDef.meta !== "object" || Array.isArray(branchDef.meta)) {
     if (!branchDef.meta || typeof branchDef.meta !== "object" || Array.isArray(branchDef.meta)) {
-      throw new import_js_format19.InvalidArgumentError(
+      throw new import_js_format18.InvalidArgumentError(
         'Option "meta" must be an Object, but %v was given.',
         'Option "meta" must be an Object, but %v was given.',
         branchDef.meta
         branchDef.meta
       );
       );
@@ -2037,7 +1885,7 @@ var _RouterBranch = class _RouterBranch extends DebuggableService {
    */
    */
   getParentBranch() {
   getParentBranch() {
     if (!this._parentBranch) {
     if (!this._parentBranch) {
-      throw new import_js_format20.InvalidArgumentError(
+      throw new import_js_format19.InvalidArgumentError(
         "Parent branch does not exist in the router branch."
         "Parent branch does not exist in the router branch."
       );
       );
     }
     }
@@ -2053,14 +1901,14 @@ var _RouterBranch = class _RouterBranch extends DebuggableService {
   constructor(router, branchDef, parentBranch) {
   constructor(router, branchDef, parentBranch) {
     super(router.container);
     super(router.container);
     if (!(router instanceof TrieRouter)) {
     if (!(router instanceof TrieRouter)) {
-      throw new import_js_format20.InvalidArgumentError(
+      throw new import_js_format19.InvalidArgumentError(
         'Parameter "router" must be a TrieRouter instance, but %v was given.',
         'Parameter "router" must be a TrieRouter instance, but %v was given.',
         router
         router
       );
       );
     }
     }
     this._router = router;
     this._router = router;
     if (parentBranch !== void 0 && !(parentBranch instanceof _RouterBranch)) {
     if (parentBranch !== void 0 && !(parentBranch instanceof _RouterBranch)) {
-      throw new import_js_format20.InvalidArgumentError(
+      throw new import_js_format19.InvalidArgumentError(
         'Parameter "parentBranch" must be a RouterBranch instance, but %v was given.',
         'Parameter "parentBranch" must be a RouterBranch instance, but %v was given.',
         parentBranch
         parentBranch
       );
       );
@@ -2109,6 +1957,149 @@ var _RouterBranch = class _RouterBranch extends DebuggableService {
 __name(_RouterBranch, "RouterBranch");
 __name(_RouterBranch, "RouterBranch");
 var RouterBranch = _RouterBranch;
 var RouterBranch = _RouterBranch;
 
 
+// src/senders/data-sender.js
+var import_js_format20 = require("@e22m4u/js-format");
+var _DataSender = class _DataSender extends DebuggableService {
+  /**
+   * Send.
+   *
+   * @param {import('http').ServerResponse} response
+   * @param {*} data
+   * @returns {undefined}
+   */
+  send(response, data) {
+    const debug = this.getDebuggerFor(this.send);
+    if (data === response || response.headersSent) {
+      debug("Skipping response because headers have already been sent.");
+      return;
+    }
+    if (data == null) {
+      response.statusCode = 204;
+      response.end();
+      debug("Empty response has been sent.");
+      return;
+    }
+    if (isReadableStream(data)) {
+      response.setHeader("Content-Type", "application/octet-stream");
+      data.pipe(response);
+      debug("Sending response with a Stream.");
+      return;
+    }
+    let debugMsg;
+    switch (typeof data) {
+      case "object":
+      case "boolean":
+      case "number":
+        if (Buffer.isBuffer(data)) {
+          response.setHeader("content-type", "application/octet-stream");
+          debugMsg = "Buffer has been sent as binary data.";
+        } else {
+          response.setHeader("content-type", "application/json");
+          debugMsg = (0, import_js_format20.format)(
+            "%v has been sent as JSON.",
+            toPascalCase(typeof data)
+          );
+          data = JSON.stringify(data);
+        }
+        break;
+      default:
+        response.setHeader("content-type", "text/plain");
+        debugMsg = "Response data has been sent as plain text.";
+        data = String(data);
+        break;
+    }
+    response.end(data);
+    debug(debugMsg);
+  }
+};
+__name(_DataSender, "DataSender");
+var DataSender = _DataSender;
+
+// src/senders/error-sender.js
+var import_util = require("util");
+var import_statuses = __toESM(require("statuses"), 1);
+var EXPOSED_ERROR_PROPERTIES = ["code", "details"];
+var _ErrorSender = class _ErrorSender extends DebuggableService {
+  /**
+   * Handle.
+   *
+   * @param {import('http').IncomingMessage} request
+   * @param {import('http').ServerResponse} response
+   * @param {Error} error
+   * @returns {undefined}
+   */
+  send(request, response, error) {
+    const debug = this.getDebuggerFor(this.send);
+    let safeError = {};
+    if (error) {
+      if (typeof error === "object") {
+        safeError = error;
+      } else {
+        safeError = { message: String(error) };
+      }
+    }
+    const statusCode = error.statusCode || error.status || 500;
+    const body = { error: {} };
+    if (safeError.message && typeof safeError.message === "string") {
+      body.error.message = safeError.message;
+    } else {
+      body.error.message = (0, import_statuses.default)(statusCode);
+    }
+    EXPOSED_ERROR_PROPERTIES.forEach((name) => {
+      if (name in safeError) {
+        body.error[name] = safeError[name];
+      }
+    });
+    const requestData = {
+      url: request.url,
+      method: request.method,
+      headers: request.headers
+    };
+    const inspectOptions = {
+      showHidden: false,
+      depth: null,
+      colors: true,
+      compact: false
+    };
+    console.warn((0, import_util.inspect)(requestData, inspectOptions));
+    console.warn((0, import_util.inspect)(body, inspectOptions));
+    if (error.stack) {
+      console.log(error.stack);
+    } else {
+      console.error(error);
+    }
+    response.statusCode = statusCode;
+    response.setHeader("content-type", "application/json; charset=utf-8");
+    response.end(JSON.stringify(body, null, 2), "utf-8");
+    debug(
+      "%s error has been sent for the request %s %v.",
+      statusCode,
+      request.method,
+      getRequestPathname(request)
+    );
+  }
+  /**
+   * Send 404.
+   *
+   * @param {import('http').IncomingMessage} request
+   * @param {import('http').ServerResponse} response
+   * @returns {undefined}
+   */
+  send404(request, response) {
+    const debug = this.getDebuggerFor(this.send404);
+    response.statusCode = 404;
+    response.setHeader("content-type", "text/plain; charset=utf-8");
+    response.end("404 Not Found", "utf-8");
+    debug(
+      "404 error has been sent for the request %s %v.",
+      request.method,
+      getRequestPathname(request)
+    );
+  }
+};
+__name(_ErrorSender, "ErrorSender");
+var ErrorSender = _ErrorSender;
+
 // src/trie-router.js
 // src/trie-router.js
 var _TrieRouter = class _TrieRouter extends DebuggableService {
 var _TrieRouter = class _TrieRouter extends DebuggableService {
   /**
   /**
@@ -2220,7 +2211,7 @@ var _TrieRouter = class _TrieRouter extends DebuggableService {
         } else {
         } else {
           Object.assign(context, reqDataOrPromise);
           Object.assign(context, reqDataOrPromise);
         }
         }
-        const hookInvoker = this.getService(HookInvoker);
+        const hookInvoker = this.getService(RouterHookInvoker);
         data = hookInvoker.invokeAndContinueUntilValueReceived(
         data = hookInvoker.invokeAndContinueUntilValueReceived(
           route,
           route,
           RouterHookType.PRE_HANDLER,
           RouterHookType.PRE_HANDLER,
@@ -2287,7 +2278,7 @@ var _TrieRouter = class _TrieRouter extends DebuggableService {
    * @returns {this}
    * @returns {this}
    */
    */
   addHook(type, hook) {
   addHook(type, hook) {
-    this.getService(HookRegistry).addHook(type, hook);
+    this.getService(RouterHookRegistry).addHook(type, hook);
     return this;
     return this;
   }
   }
   /**
   /**
@@ -2297,7 +2288,10 @@ var _TrieRouter = class _TrieRouter extends DebuggableService {
    * @returns {this}
    * @returns {this}
    */
    */
   addPreHandler(hook) {
   addPreHandler(hook) {
-    this.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, hook);
+    this.getService(RouterHookRegistry).addHook(
+      RouterHookType.PRE_HANDLER,
+      hook
+    );
     return this;
     return this;
   }
   }
   /**
   /**
@@ -2307,7 +2301,10 @@ var _TrieRouter = class _TrieRouter extends DebuggableService {
    * @returns {this}
    * @returns {this}
    */
    */
   addPostHandler(hook) {
   addPostHandler(hook) {
-    this.getService(HookRegistry).addHook(RouterHookType.POST_HANDLER, hook);
+    this.getService(RouterHookRegistry).addHook(
+      RouterHookType.POST_HANDLER,
+      hook
+    );
     return this;
     return this;
   }
   }
 };
 };
@@ -2321,8 +2318,6 @@ var TrieRouter = _TrieRouter;
   DataSender,
   DataSender,
   EXPOSED_ERROR_PROPERTIES,
   EXPOSED_ERROR_PROPERTIES,
   ErrorSender,
   ErrorSender,
-  HookInvoker,
-  HookRegistry,
   HttpMethod,
   HttpMethod,
   METHODS_WITH_BODY,
   METHODS_WITH_BODY,
   QueryParser,
   QueryParser,
@@ -2332,6 +2327,8 @@ var TrieRouter = _TrieRouter;
   RequestParser,
   RequestParser,
   Route,
   Route,
   RouteRegistry,
   RouteRegistry,
+  RouterHookInvoker,
+  RouterHookRegistry,
   RouterHookType,
   RouterHookType,
   RouterOptions,
   RouterOptions,
   TrieRouter,
   TrieRouter,

+ 2 - 2
src/hooks/index.d.ts

@@ -1,2 +1,2 @@
-export * from './hook-invoker.js';
-export * from './hook-registry.js';
+export * from './router-hook-invoker.js';
+export * from './router-hook-registry.js';

+ 2 - 2
src/hooks/index.js

@@ -1,2 +1,2 @@
-export * from './hook-invoker.js';
-export * from './hook-registry.js';
+export * from './router-hook-invoker.js';
+export * from './router-hook-registry.js';

+ 3 - 3
src/hooks/hook-invoker.d.ts → src/hooks/router-hook-invoker.d.ts

@@ -1,13 +1,13 @@
 import {ServerResponse} from 'http';
 import {ServerResponse} from 'http';
 import {Route} from '../route/index.js';
 import {Route} from '../route/index.js';
 import {ValueOrPromise} from '../types.js';
 import {ValueOrPromise} from '../types.js';
-import {RouterHookType} from './hook-registry.js';
+import {RouterHookType} from './router-hook-registry.js';
 import {DebuggableService} from '../debuggable-service.js';
 import {DebuggableService} from '../debuggable-service.js';
 
 
 /**
 /**
- * Hook invoker.
+ * Router hook invoker.
  */
  */
-export declare class HookInvoker extends DebuggableService {
+export declare class RouterHookInvoker extends DebuggableService {
   /**
   /**
    * Invoke and continue until value received.
    * Invoke and continue until value received.
    *
    *

+ 9 - 14
src/hooks/hook-invoker.js → src/hooks/router-hook-invoker.js

@@ -2,12 +2,12 @@ import {Route} from '../route/index.js';
 import {InvalidArgumentError} from '@e22m4u/js-format';
 import {InvalidArgumentError} from '@e22m4u/js-format';
 import {DebuggableService} from '../debuggable-service.js';
 import {DebuggableService} from '../debuggable-service.js';
 import {isPromise, isResponseSent} from '../utils/index.js';
 import {isPromise, isResponseSent} from '../utils/index.js';
-import {HookRegistry, RouterHookType} from './hook-registry.js';
+import {RouterHookRegistry, RouterHookType} from './router-hook-registry.js';
 
 
 /**
 /**
- * Hook invoker.
+ * Router hook invoker.
  */
  */
-export class HookInvoker extends DebuggableService {
+export class RouterHookInvoker extends DebuggableService {
   /**
   /**
    * Последовательно вызывает глобальные хуки и хуки маршрута указанного
    * Последовательно вызывает глобальные хуки и хуки маршрута указанного
    * типа, пока один из них не вернет отличное от undefined и null значение
    * типа, пока один из них не вернет отличное от undefined и null значение
@@ -24,23 +24,19 @@ export class HookInvoker extends DebuggableService {
   invokeAndContinueUntilValueReceived(route, hookType, response, ...args) {
   invokeAndContinueUntilValueReceived(route, hookType, response, ...args) {
     if (!route || !(route instanceof Route)) {
     if (!route || !(route instanceof Route)) {
       throw new InvalidArgumentError(
       throw new InvalidArgumentError(
-        'The parameter "route" of ' +
-          'the HookInvoker.invokeAndContinueUntilValueReceived ' +
-          'must be a Route instance, but %v was given.',
+        'Parameter "route" must be a Route instance, but %v was given.',
         route,
         route,
       );
       );
     }
     }
     if (!hookType || typeof hookType !== 'string') {
     if (!hookType || typeof hookType !== 'string') {
       throw new InvalidArgumentError(
       throw new InvalidArgumentError(
-        'The parameter "hookType" of ' +
-          'the HookInvoker.invokeAndContinueUntilValueReceived ' +
-          'must be a non-empty String, but %v was given.',
+        'Parameter "hookType" must be a non-empty String, but %v was given.',
         hookType,
         hookType,
       );
       );
     }
     }
     if (!Object.values(RouterHookType).includes(hookType)) {
     if (!Object.values(RouterHookType).includes(hookType)) {
       throw new InvalidArgumentError(
       throw new InvalidArgumentError(
-        'The hook type %v is not supported.',
+        'Hook type %v is not supported.',
         hookType,
         hookType,
       );
       );
     }
     }
@@ -51,9 +47,8 @@ export class HookInvoker extends DebuggableService {
       typeof response.headersSent !== 'boolean'
       typeof response.headersSent !== 'boolean'
     ) {
     ) {
       throw new InvalidArgumentError(
       throw new InvalidArgumentError(
-        'The parameter "response" of ' +
-          'the HookInvoker.invokeAndContinueUntilValueReceived ' +
-          'must be a ServerResponse instance, but %v was given.',
+        'Parameter "response" must be a ServerResponse instance, ' +
+          'but %v was given.',
         response,
         response,
       );
       );
     }
     }
@@ -66,7 +61,7 @@ export class HookInvoker extends DebuggableService {
     // после глобальных, то объединяем
     // после глобальных, то объединяем
     // их в данной последовательности
     // их в данной последовательности
     const hooks = [
     const hooks = [
-      ...this.getService(HookRegistry).getHooks(hookType),
+      ...this.getService(RouterHookRegistry).getHooks(hookType),
       ...route.getHookRegistry().getHooks(hookType),
       ...route.getHookRegistry().getHooks(hookType),
     ];
     ];
     let result = undefined;
     let result = undefined;

+ 141 - 89
src/hooks/hook-invoker.spec.js → src/hooks/router-hook-invoker.spec.js

@@ -1,15 +1,15 @@
 import {expect} from 'chai';
 import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {format} from '@e22m4u/js-format';
 import {ROOT_PATH} from '../constants.js';
 import {ROOT_PATH} from '../constants.js';
-import {HookInvoker} from './hook-invoker.js';
 import {Route, HttpMethod} from '../route/index.js';
 import {Route, HttpMethod} from '../route/index.js';
 import {createResponseMock} from '../utils/index.js';
 import {createResponseMock} from '../utils/index.js';
-import {HookRegistry, RouterHookType} from './hook-registry.js';
+import {RouterHookInvoker} from './router-hook-invoker.js';
+import {RouterHookRegistry, RouterHookType} from './router-hook-registry.js';
 
 
-describe('HookInvoker', function () {
+describe('RouterHookInvoker', function () {
   describe('invokeAndContinueUntilValueReceived', function () {
   describe('invokeAndContinueUntilValueReceived', function () {
     it('requires the parameter "route" to be a Route instance', function () {
     it('requires the parameter "route" to be a Route instance', function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const res = createResponseMock();
       const res = createResponseMock();
       const throwable = v => () =>
       const throwable = v => () =>
         s.invokeAndContinueUntilValueReceived(
         s.invokeAndContinueUntilValueReceived(
@@ -19,9 +19,7 @@ describe('HookInvoker', function () {
         );
         );
       const error = v =>
       const error = v =>
         format(
         format(
-          'The parameter "route" of ' +
-            'the HookInvoker.invokeAndContinueUntilValueReceived ' +
-            'must be a Route instance, but %s was given.',
+          'Parameter "route" must be a Route instance, but %s was given.',
           v,
           v,
         );
         );
       expect(throwable('str')).to.throw(error('"str"'));
       expect(throwable('str')).to.throw(error('"str"'));
@@ -44,7 +42,7 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('requires the parameter "hookType" to be a non-empty String', function () {
     it('requires the parameter "hookType" to be a non-empty String', function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,
@@ -55,9 +53,7 @@ describe('HookInvoker', function () {
         s.invokeAndContinueUntilValueReceived(route, v, res);
         s.invokeAndContinueUntilValueReceived(route, v, res);
       const error = v =>
       const error = v =>
         format(
         format(
-          'The parameter "hookType" of ' +
-            'the HookInvoker.invokeAndContinueUntilValueReceived ' +
-            'must be a non-empty String, but %s was given.',
+          'Parameter "hookType" must be a non-empty String, but %s was given.',
           v,
           v,
         );
         );
       expect(throwable('')).to.throw(error('""'));
       expect(throwable('')).to.throw(error('""'));
@@ -73,7 +69,7 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('requires the parameter "hookType" to be a supported hook', function () {
     it('requires the parameter "hookType" to be a supported hook', function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,
@@ -85,11 +81,11 @@ describe('HookInvoker', function () {
       );
       );
       const throwable = () =>
       const throwable = () =>
         s.invokeAndContinueUntilValueReceived(route, 'unknown', res);
         s.invokeAndContinueUntilValueReceived(route, 'unknown', res);
-      expect(throwable).to.throw('The hook type "unknown" is not supported.');
+      expect(throwable).to.throw('Hook type "unknown" is not supported.');
     });
     });
 
 
     it('requires the parameter "response" to be an instance of ServerResponse', function () {
     it('requires the parameter "response" to be an instance of ServerResponse', function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,
@@ -103,9 +99,8 @@ describe('HookInvoker', function () {
         );
         );
       const error = v =>
       const error = v =>
         format(
         format(
-          'The parameter "response" of ' +
-            'the HookInvoker.invokeAndContinueUntilValueReceived ' +
-            'must be a ServerResponse instance, but %s was given.',
+          'Parameter "response" must be a ServerResponse instance, ' +
+            'but %s was given.',
           v,
           v,
         );
         );
       expect(throwable('str')).to.throw(error('"str"'));
       expect(throwable('str')).to.throw(error('"str"'));
@@ -122,14 +117,20 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('invokes global hooks in priority', function () {
     it('invokes global hooks in priority', function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const order = [];
       const order = [];
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook1');
-      });
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook2');
-      });
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook1');
+        },
+      );
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook2');
+        },
+      );
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,
@@ -157,19 +158,28 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('stops global hooks invocation if any of them returns a value', function () {
     it('stops global hooks invocation if any of them returns a value', function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const order = [];
       const order = [];
       const ret = 'OK';
       const ret = 'OK';
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook1');
-      });
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook2');
-        return ret;
-      });
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook3');
-      });
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook1');
+        },
+      );
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook2');
+          return ret;
+        },
+      );
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook3');
+        },
+      );
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,
@@ -193,15 +203,21 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('stops route hooks invocation if any of them returns a value', function () {
     it('stops route hooks invocation if any of them returns a value', function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const order = [];
       const order = [];
       const ret = 'OK';
       const ret = 'OK';
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook1');
-      });
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook2');
-      });
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook1');
+        },
+      );
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook2');
+        },
+      );
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,
@@ -234,12 +250,15 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('returns the given response and should not call hooks if the response is already sent', function () {
     it('returns the given response and should not call hooks if the response is already sent', function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const res = createResponseMock();
       const res = createResponseMock();
       res._headersSent = true;
       res._headersSent = true;
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        throw new Error('Should not be called');
-      });
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          throw new Error('Should not be called');
+        },
+      );
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,
@@ -259,19 +278,28 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('stops global hooks invocation and returns the given response if it is already sent', function () {
     it('stops global hooks invocation and returns the given response if it is already sent', function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const order = [];
       const order = [];
       const res = createResponseMock();
       const res = createResponseMock();
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook1');
-      });
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook2');
-        res._headersSent = true;
-      });
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook3');
-      });
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook1');
+        },
+      );
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook2');
+          res._headersSent = true;
+        },
+      );
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook3');
+        },
+      );
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,
@@ -295,15 +323,21 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('stops route hooks invocation and returns the given response if it is already sent', function () {
     it('stops route hooks invocation and returns the given response if it is already sent', function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const order = [];
       const order = [];
       const res = createResponseMock();
       const res = createResponseMock();
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook1');
-      });
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook2');
-      });
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook1');
+        },
+      );
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook2');
+        },
+      );
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,
@@ -336,20 +370,26 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('returns a Promise if any global hook is asynchronous', async function () {
     it('returns a Promise if any global hook is asynchronous', async function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const order = [];
       const order = [];
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook1');
-      });
-      s.getService(HookRegistry).addHook(
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook1');
+        },
+      );
+      s.getService(RouterHookRegistry).addHook(
         RouterHookType.PRE_HANDLER,
         RouterHookType.PRE_HANDLER,
         async () => {
         async () => {
           order.push('globalHook2');
           order.push('globalHook2');
         },
         },
       );
       );
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook3');
-      });
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook3');
+        },
+      );
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,
@@ -380,15 +420,15 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('returns a Promise if entire global hooks are asynchronous', async function () {
     it('returns a Promise if entire global hooks are asynchronous', async function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const order = [];
       const order = [];
-      s.getService(HookRegistry).addHook(
+      s.getService(RouterHookRegistry).addHook(
         RouterHookType.PRE_HANDLER,
         RouterHookType.PRE_HANDLER,
         async () => {
         async () => {
           order.push('globalHook1');
           order.push('globalHook1');
         },
         },
       );
       );
-      s.getService(HookRegistry).addHook(
+      s.getService(RouterHookRegistry).addHook(
         RouterHookType.PRE_HANDLER,
         RouterHookType.PRE_HANDLER,
         async () => {
         async () => {
           order.push('globalHook2');
           order.push('globalHook2');
@@ -423,14 +463,20 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('returns a Promise if any route hook is asynchronous', async function () {
     it('returns a Promise if any route hook is asynchronous', async function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const order = [];
       const order = [];
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook1');
-      });
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook2');
-      });
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook1');
+        },
+      );
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook2');
+        },
+      );
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,
@@ -464,14 +510,20 @@ describe('HookInvoker', function () {
     });
     });
 
 
     it('returns a Promise if entire route hooks are asynchronous', async function () {
     it('returns a Promise if entire route hooks are asynchronous', async function () {
-      const s = new HookInvoker();
+      const s = new RouterHookInvoker();
       const order = [];
       const order = [];
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook1');
-      });
-      s.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, () => {
-        order.push('globalHook2');
-      });
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook1');
+        },
+      );
+      s.getService(RouterHookRegistry).addHook(
+        RouterHookType.PRE_HANDLER,
+        () => {
+          order.push('globalHook2');
+        },
+      );
       const route = new Route({
       const route = new Route({
         method: HttpMethod.GET,
         method: HttpMethod.GET,
         path: ROOT_PATH,
         path: ROOT_PATH,

+ 4 - 4
src/hooks/hook-registry.d.ts → src/hooks/router-hook-registry.d.ts

@@ -3,7 +3,7 @@ import {RequestContext} from '../request-context.js';
 import {DebuggableService} from '../debuggable-service.js';
 import {DebuggableService} from '../debuggable-service.js';
 
 
 /**
 /**
- * Hook type.
+ * Router hook type.
  */
  */
 export declare const RouterHookType: {
 export declare const RouterHookType: {
   PRE_HANDLER: 'preHandler';
   PRE_HANDLER: 'preHandler';
@@ -11,7 +11,7 @@ export declare const RouterHookType: {
 };
 };
 
 
 /**
 /**
- * Type of RouterHookType.
+ * Router hook type.
  */
  */
 export type RouterHookType =
 export type RouterHookType =
   (typeof RouterHookType)[keyof typeof RouterHookType];
   (typeof RouterHookType)[keyof typeof RouterHookType];
@@ -37,9 +37,9 @@ export type PreHandlerHook = (ctx: RequestContext) => unknown;
 export type PostHandlerHook = (ctx: RequestContext, data: unknown) => unknown;
 export type PostHandlerHook = (ctx: RequestContext, data: unknown) => unknown;
 
 
 /**
 /**
- * Hook registry.
+ * Router hook registry.
  */
  */
-export declare class HookRegistry extends DebuggableService {
+export declare class RouterHookRegistry extends DebuggableService {
   /**
   /**
    * Add hook.
    * Add hook.
    *
    *

+ 10 - 19
src/hooks/hook-registry.js → src/hooks/router-hook-registry.js

@@ -21,9 +21,9 @@ export const RouterHookType = {
 export const ROUTER_HOOK_TYPES = Object.values(RouterHookType);
 export const ROUTER_HOOK_TYPES = Object.values(RouterHookType);
 
 
 /**
 /**
- * Hook registry.
+ * Router hook registry.
  */
  */
-export class HookRegistry {
+export class RouterHookRegistry {
   /**
   /**
    * Hooks.
    * Hooks.
    *
    *
@@ -42,19 +42,16 @@ export class HookRegistry {
   addHook(type, hook) {
   addHook(type, hook) {
     if (!type || typeof type !== 'string') {
     if (!type || typeof type !== 'string') {
       throw new InvalidArgumentError(
       throw new InvalidArgumentError(
-        'The hook type is required, but %v was given.',
+        'Hook type is required, but %v was given.',
         type,
         type,
       );
       );
     }
     }
     if (!Object.values(RouterHookType).includes(type)) {
     if (!Object.values(RouterHookType).includes(type)) {
-      throw new InvalidArgumentError(
-        'The hook type %v is not supported.',
-        type,
-      );
+      throw new InvalidArgumentError('Hook type %v is not supported.', type);
     }
     }
     if (!hook || typeof hook !== 'function') {
     if (!hook || typeof hook !== 'function') {
       throw new InvalidArgumentError(
       throw new InvalidArgumentError(
-        'The hook %v must be a Function, but %v was given.',
+        'Router hook %v must be a Function, but %v was given.',
         type,
         type,
         hook,
         hook,
       );
       );
@@ -75,19 +72,16 @@ export class HookRegistry {
   hasHook(type, hook) {
   hasHook(type, hook) {
     if (!type || typeof type !== 'string') {
     if (!type || typeof type !== 'string') {
       throw new InvalidArgumentError(
       throw new InvalidArgumentError(
-        'The hook type is required, but %v was given.',
+        'Hook type is required, but %v was given.',
         type,
         type,
       );
       );
     }
     }
     if (!Object.values(RouterHookType).includes(type)) {
     if (!Object.values(RouterHookType).includes(type)) {
-      throw new InvalidArgumentError(
-        'The hook type %v is not supported.',
-        type,
-      );
+      throw new InvalidArgumentError('Hook type %v is not supported.', type);
     }
     }
     if (!hook || typeof hook !== 'function') {
     if (!hook || typeof hook !== 'function') {
       throw new InvalidArgumentError(
       throw new InvalidArgumentError(
-        'The hook %v must be a Function, but %v was given.',
+        'Router hook %v must be a Function, but %v was given.',
         type,
         type,
         hook,
         hook,
       );
       );
@@ -105,15 +99,12 @@ export class HookRegistry {
   getHooks(type) {
   getHooks(type) {
     if (!type || typeof type !== 'string') {
     if (!type || typeof type !== 'string') {
       throw new InvalidArgumentError(
       throw new InvalidArgumentError(
-        'The hook type is required, but %v was given.',
+        'Hook type is required, but %v was given.',
         type,
         type,
       );
       );
     }
     }
     if (!Object.values(RouterHookType).includes(type)) {
     if (!Object.values(RouterHookType).includes(type)) {
-      throw new InvalidArgumentError(
-        'The hook type %v is not supported.',
-        type,
-      );
+      throw new InvalidArgumentError('Hook type %v is not supported.', type);
     }
     }
     return this._hooks.get(type) || [];
     return this._hooks.get(type) || [];
   }
   }

+ 23 - 26
src/hooks/hook-registry.spec.js → src/hooks/router-hook-registry.spec.js

@@ -1,14 +1,13 @@
 import {expect} from 'chai';
 import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {format} from '@e22m4u/js-format';
-import {HookRegistry, RouterHookType} from './hook-registry.js';
+import {RouterHookRegistry, RouterHookType} from './router-hook-registry.js';
 
 
-describe('HookRegistry', function () {
+describe('RouterHookRegistry', function () {
   describe('addHook', function () {
   describe('addHook', function () {
     it('requires the parameter "type" to be a non-empty String', function () {
     it('requires the parameter "type" to be a non-empty String', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const throwable = v => () => s.addHook(v, () => undefined);
       const throwable = v => () => s.addHook(v, () => undefined);
-      const error = v =>
-        format('The hook type is required, but %s was given.', v);
+      const error = v => format('Hook type is required, but %s was given.', v);
       expect(throwable('')).to.throw(error('""'));
       expect(throwable('')).to.throw(error('""'));
       expect(throwable(10)).to.throw(error('10'));
       expect(throwable(10)).to.throw(error('10'));
       expect(throwable(0)).to.throw(error('0'));
       expect(throwable(0)).to.throw(error('0'));
@@ -23,11 +22,11 @@ describe('HookRegistry', function () {
     });
     });
 
 
     it('requires the parameter "hook" to be a Function', function () {
     it('requires the parameter "hook" to be a Function', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const throwable = v => () => s.addHook(RouterHookType.PRE_HANDLER, v);
       const throwable = v => () => s.addHook(RouterHookType.PRE_HANDLER, v);
       const error = v =>
       const error = v =>
         format(
         format(
-          'The hook "preHandler" must be a Function, but %s was given.',
+          'Router hook "preHandler" must be a Function, but %s was given.',
           v,
           v,
         );
         );
       expect(throwable('str')).to.throw(error('"str"'));
       expect(throwable('str')).to.throw(error('"str"'));
@@ -44,15 +43,15 @@ describe('HookRegistry', function () {
     });
     });
 
 
     it('requires the parameter "type" to be a supported hook', function () {
     it('requires the parameter "type" to be a supported hook', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const hook = () => undefined;
       const hook = () => undefined;
       Object.values(RouterHookType).forEach(type => s.addHook(type, hook));
       Object.values(RouterHookType).forEach(type => s.addHook(type, hook));
       const throwable = () => s.addHook('unknown', hook);
       const throwable = () => s.addHook('unknown', hook);
-      expect(throwable).to.throw('The hook type "unknown" is not supported.');
+      expect(throwable).to.throw('Hook type "unknown" is not supported.');
     });
     });
 
 
     it('sets the given function to the map array by the hook type', function () {
     it('sets the given function to the map array by the hook type', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const type = RouterHookType.PRE_HANDLER;
       const type = RouterHookType.PRE_HANDLER;
       const hook = () => undefined;
       const hook = () => undefined;
       s.addHook(type, hook);
       s.addHook(type, hook);
@@ -60,7 +59,7 @@ describe('HookRegistry', function () {
     });
     });
 
 
     it('returns this', function () {
     it('returns this', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const hook = () => undefined;
       const hook = () => undefined;
       const type = RouterHookType.PRE_HANDLER;
       const type = RouterHookType.PRE_HANDLER;
       const res = s.addHook(type, hook);
       const res = s.addHook(type, hook);
@@ -70,10 +69,9 @@ describe('HookRegistry', function () {
 
 
   describe('hasHook', function () {
   describe('hasHook', function () {
     it('requires the parameter "type" to be a non-empty String', function () {
     it('requires the parameter "type" to be a non-empty String', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const throwable = v => () => s.hasHook(v, () => undefined);
       const throwable = v => () => s.hasHook(v, () => undefined);
-      const error = v =>
-        format('The hook type is required, but %s was given.', v);
+      const error = v => format('Hook type is required, but %s was given.', v);
       expect(throwable('')).to.throw(error('""'));
       expect(throwable('')).to.throw(error('""'));
       expect(throwable(10)).to.throw(error('10'));
       expect(throwable(10)).to.throw(error('10'));
       expect(throwable(0)).to.throw(error('0'));
       expect(throwable(0)).to.throw(error('0'));
@@ -88,11 +86,11 @@ describe('HookRegistry', function () {
     });
     });
 
 
     it('requires the parameter "hook" to be a Function', function () {
     it('requires the parameter "hook" to be a Function', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const throwable = v => () => s.hasHook(RouterHookType.PRE_HANDLER, v);
       const throwable = v => () => s.hasHook(RouterHookType.PRE_HANDLER, v);
       const error = v =>
       const error = v =>
         format(
         format(
-          'The hook "preHandler" must be a Function, but %s was given.',
+          'Router hook "preHandler" must be a Function, but %s was given.',
           v,
           v,
         );
         );
       expect(throwable('str')).to.throw(error('"str"'));
       expect(throwable('str')).to.throw(error('"str"'));
@@ -109,15 +107,15 @@ describe('HookRegistry', function () {
     });
     });
 
 
     it('requires the parameter "type" to be a supported hook', function () {
     it('requires the parameter "type" to be a supported hook', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const hook = () => undefined;
       const hook = () => undefined;
       Object.values(RouterHookType).forEach(type => s.hasHook(type, hook));
       Object.values(RouterHookType).forEach(type => s.hasHook(type, hook));
       const throwable = () => s.hasHook('unknown', hook);
       const throwable = () => s.hasHook('unknown', hook);
-      expect(throwable).to.throw('The hook type "unknown" is not supported.');
+      expect(throwable).to.throw('Hook type "unknown" is not supported.');
     });
     });
 
 
     it('returns true if the given hook is set or false', function () {
     it('returns true if the given hook is set or false', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const type = RouterHookType.PRE_HANDLER;
       const type = RouterHookType.PRE_HANDLER;
       const hook = () => undefined;
       const hook = () => undefined;
       expect(s.hasHook(type, hook)).to.be.false;
       expect(s.hasHook(type, hook)).to.be.false;
@@ -128,10 +126,9 @@ describe('HookRegistry', function () {
 
 
   describe('getHooks', function () {
   describe('getHooks', function () {
     it('requires the parameter "type" to be a non-empty String', function () {
     it('requires the parameter "type" to be a non-empty String', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const throwable = v => () => s.getHooks(v);
       const throwable = v => () => s.getHooks(v);
-      const error = v =>
-        format('The hook type is required, but %s was given.', v);
+      const error = v => format('Hook type is required, but %s was given.', v);
       expect(throwable('')).to.throw(error('""'));
       expect(throwable('')).to.throw(error('""'));
       expect(throwable(10)).to.throw(error('10'));
       expect(throwable(10)).to.throw(error('10'));
       expect(throwable(0)).to.throw(error('0'));
       expect(throwable(0)).to.throw(error('0'));
@@ -146,14 +143,14 @@ describe('HookRegistry', function () {
     });
     });
 
 
     it('requires the parameter "type" to be a supported hook', function () {
     it('requires the parameter "type" to be a supported hook', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       Object.values(RouterHookType).forEach(type => s.getHooks(type));
       Object.values(RouterHookType).forEach(type => s.getHooks(type));
       const throwable = () => s.getHooks('unknown');
       const throwable = () => s.getHooks('unknown');
-      expect(throwable).to.throw('The hook type "unknown" is not supported.');
+      expect(throwable).to.throw('Hook type "unknown" is not supported.');
     });
     });
 
 
     it('returns existing hooks', function () {
     it('returns existing hooks', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const hook = () => undefined;
       const hook = () => undefined;
       const type = RouterHookType.PRE_HANDLER;
       const type = RouterHookType.PRE_HANDLER;
       const res1 = s.getHooks(type);
       const res1 = s.getHooks(type);
@@ -165,7 +162,7 @@ describe('HookRegistry', function () {
     });
     });
 
 
     it('returns an empty array if no hook exists', function () {
     it('returns an empty array if no hook exists', function () {
-      const s = new HookRegistry();
+      const s = new RouterHookRegistry();
       const res = s.getHooks(RouterHookType.PRE_HANDLER);
       const res = s.getHooks(RouterHookType.PRE_HANDLER);
       expect(res).to.be.eql([]);
       expect(res).to.be.eql([]);
     });
     });

+ 2 - 2
src/route/route.d.ts

@@ -1,6 +1,6 @@
 import {ValueOrPromise} from '../types.js';
 import {ValueOrPromise} from '../types.js';
-import {HookRegistry} from '../hooks/index.js';
 import {RequestContext} from '../request-context.js';
 import {RequestContext} from '../request-context.js';
+import {RouterHookRegistry} from '../hooks/index.js';
 
 
 /**
 /**
  * Http method.
  * Http method.
@@ -67,7 +67,7 @@ export declare class Route {
   /**
   /**
    * Get hook registry.
    * Get hook registry.
    */
    */
-  getHookRegistry(): HookRegistry;
+  getHookRegistry(): RouterHookRegistry;
 
 
   /**
   /**
    * Method.
    * Method.

+ 4 - 4
src/route/route.js

@@ -1,7 +1,7 @@
 import {Debuggable} from '@e22m4u/js-debug';
 import {Debuggable} from '@e22m4u/js-debug';
-import {HookRegistry, RouterHookType} from '../hooks/index.js';
 import {MODULE_DEBUG_NAMESPACE} from '../debuggable-service.js';
 import {MODULE_DEBUG_NAMESPACE} from '../debuggable-service.js';
 import {cloneDeep, getRequestPathname} from '../utils/index.js';
 import {cloneDeep, getRequestPathname} from '../utils/index.js';
+import {RouterHookRegistry, RouterHookType} from '../hooks/index.js';
 import {validateRouteDefinition} from './validate-route-definition.js';
 import {validateRouteDefinition} from './validate-route-definition.js';
 
 
 /**
 /**
@@ -66,14 +66,14 @@ export class Route extends Debuggable {
   /**
   /**
    * Hook registry.
    * Hook registry.
    *
    *
-   * @type {HookRegistry}
+   * @type {RouterHookRegistry}
    */
    */
-  _hookRegistry = new HookRegistry();
+  _hookRegistry = new RouterHookRegistry();
 
 
   /**
   /**
    * Get hook registry.
    * Get hook registry.
    *
    *
-   * @returns {HookRegistry}
+   * @returns {RouterHookRegistry}
    */
    */
   getHookRegistry() {
   getHookRegistry() {
     return this._hookRegistry;
     return this._hookRegistry;

+ 2 - 2
src/route/route.spec.js

@@ -4,7 +4,7 @@ import {ROOT_PATH} from '../constants.js';
 import {Route, HttpMethod} from './route.js';
 import {Route, HttpMethod} from './route.js';
 import {ServiceContainer} from '@e22m4u/js-service';
 import {ServiceContainer} from '@e22m4u/js-service';
 import {RequestContext} from '../request-context.js';
 import {RequestContext} from '../request-context.js';
-import {HookRegistry, RouterHookType} from '../hooks/index.js';
+import {RouterHookRegistry, RouterHookType} from '../hooks/index.js';
 import {createRequestMock, createResponseMock} from '../utils/index.js';
 import {createRequestMock, createResponseMock} from '../utils/index.js';
 
 
 describe('Route', function () {
 describe('Route', function () {
@@ -333,7 +333,7 @@ describe('Route', function () {
       });
       });
       const res1 = route.getHookRegistry();
       const res1 = route.getHookRegistry();
       const res2 = route.getHookRegistry();
       const res2 = route.getHookRegistry();
-      expect(res1).to.be.instanceOf(HookRegistry);
+      expect(res1).to.be.instanceOf(RouterHookRegistry);
       expect(res2).to.be.eq(res1);
       expect(res2).to.be.eq(res1);
     });
     });
   });
   });

+ 17 - 6
src/trie-router.js

@@ -3,11 +3,16 @@ import {RouteRegistry} from './route-registry.js';
 import {RequestContext} from './request-context.js';
 import {RequestContext} from './request-context.js';
 import {ServiceContainer} from '@e22m4u/js-service';
 import {ServiceContainer} from '@e22m4u/js-service';
 import {ServerResponse, IncomingMessage} from 'http';
 import {ServerResponse, IncomingMessage} from 'http';
+import {RouterBranch} from './branch/router-branch.js';
 import {DebuggableService} from './debuggable-service.js';
 import {DebuggableService} from './debuggable-service.js';
 import {DataSender, ErrorSender} from './senders/index.js';
 import {DataSender, ErrorSender} from './senders/index.js';
-import {HookInvoker, HookRegistry, RouterHookType} from './hooks/index.js';
 import {isPromise, isResponseSent, getRequestPathname} from './utils/index.js';
 import {isPromise, isResponseSent, getRequestPathname} from './utils/index.js';
-import {RouterBranch} from './branch/router-branch.js';
+
+import {
+  RouterHookType,
+  RouterHookInvoker,
+  RouterHookRegistry,
+} from './hooks/index.js';
 
 
 /**
 /**
  * Trie router.
  * Trie router.
@@ -148,7 +153,7 @@ export class TrieRouter extends DebuggableService {
         // получение данных от обработчика, который находится
         // получение данных от обработчика, который находится
         // в найденном маршруте, и отправка результата в качестве
         // в найденном маршруте, и отправка результата в качестве
         // ответа сервера
         // ответа сервера
-        const hookInvoker = this.getService(HookInvoker);
+        const hookInvoker = this.getService(RouterHookInvoker);
         // если результатом вызова хуков "preHandler" является
         // если результатом вызова хуков "preHandler" является
         // значение (или Promise) отличное от "undefined" и "null",
         // значение (или Promise) отличное от "undefined" и "null",
         // то такое значение используется в качестве ответа
         // то такое значение используется в качестве ответа
@@ -228,7 +233,7 @@ export class TrieRouter extends DebuggableService {
    * @returns {this}
    * @returns {this}
    */
    */
   addHook(type, hook) {
   addHook(type, hook) {
-    this.getService(HookRegistry).addHook(type, hook);
+    this.getService(RouterHookRegistry).addHook(type, hook);
     return this;
     return this;
   }
   }
 
 
@@ -239,7 +244,10 @@ export class TrieRouter extends DebuggableService {
    * @returns {this}
    * @returns {this}
    */
    */
   addPreHandler(hook) {
   addPreHandler(hook) {
-    this.getService(HookRegistry).addHook(RouterHookType.PRE_HANDLER, hook);
+    this.getService(RouterHookRegistry).addHook(
+      RouterHookType.PRE_HANDLER,
+      hook,
+    );
     return this;
     return this;
   }
   }
 
 
@@ -250,7 +258,10 @@ export class TrieRouter extends DebuggableService {
    * @returns {this}
    * @returns {this}
    */
    */
   addPostHandler(hook) {
   addPostHandler(hook) {
-    this.getService(HookRegistry).addHook(RouterHookType.POST_HANDLER, hook);
+    this.getService(RouterHookRegistry).addHook(
+      RouterHookType.POST_HANDLER,
+      hook,
+    );
     return this;
     return this;
   }
   }
 }
 }

+ 7 - 7
src/trie-router.spec.js

@@ -6,7 +6,7 @@ import {RequestContext} from './request-context.js';
 import {ServerResponse, IncomingMessage} from 'http';
 import {ServerResponse, IncomingMessage} from 'http';
 import {RouterBranch} from './branch/router-branch.js';
 import {RouterBranch} from './branch/router-branch.js';
 import {DataSender, ErrorSender} from './senders/index.js';
 import {DataSender, ErrorSender} from './senders/index.js';
-import {HookRegistry, RouterHookType} from './hooks/index.js';
+import {RouterHookRegistry, RouterHookType} from './hooks/index.js';
 import {createRequestMock, createResponseMock} from './utils/index.js';
 import {createRequestMock, createResponseMock} from './utils/index.js';
 
 
 describe('TrieRouter', function () {
 describe('TrieRouter', function () {
@@ -606,9 +606,9 @@ describe('TrieRouter', function () {
   });
   });
 
 
   describe('addHook', function () {
   describe('addHook', function () {
-    it('should add the given hook to the HookRegistry and returns itself', function () {
+    it('should add the given hook to the RouterHookRegistry and returns itself', function () {
       const router = new TrieRouter();
       const router = new TrieRouter();
-      const reg = router.getService(HookRegistry);
+      const reg = router.getService(RouterHookRegistry);
       const type = RouterHookType.PRE_HANDLER;
       const type = RouterHookType.PRE_HANDLER;
       const hook = () => undefined;
       const hook = () => undefined;
       expect(reg.hasHook(type, hook)).to.be.false;
       expect(reg.hasHook(type, hook)).to.be.false;
@@ -619,9 +619,9 @@ describe('TrieRouter', function () {
   });
   });
 
 
   describe('addPreHandler', function () {
   describe('addPreHandler', function () {
-    it('should add the given pre-handler hook to the HookRegistry and returns itself', function () {
+    it('should add the given pre-handler hook to the RouterHookRegistry and returns itself', function () {
       const router = new TrieRouter();
       const router = new TrieRouter();
-      const reg = router.getService(HookRegistry);
+      const reg = router.getService(RouterHookRegistry);
       const hook = () => undefined;
       const hook = () => undefined;
       expect(reg.hasHook(RouterHookType.PRE_HANDLER, hook)).to.be.false;
       expect(reg.hasHook(RouterHookType.PRE_HANDLER, hook)).to.be.false;
       const res = router.addPreHandler(hook);
       const res = router.addPreHandler(hook);
@@ -631,9 +631,9 @@ describe('TrieRouter', function () {
   });
   });
 
 
   describe('addPostHandler', function () {
   describe('addPostHandler', function () {
-    it('should add the given post-handler hook to the HookRegistry and returns itself', function () {
+    it('should add the given post-handler hook to the RouterHookRegistry and returns itself', function () {
       const router = new TrieRouter();
       const router = new TrieRouter();
-      const reg = router.getService(HookRegistry);
+      const reg = router.getService(RouterHookRegistry);
       const hook = () => undefined;
       const hook = () => undefined;
       expect(reg.hasHook(RouterHookType.POST_HANDLER, hook)).to.be.false;
       expect(reg.hasHook(RouterHookType.POST_HANDLER, hook)).to.be.false;
       const res = router.addPostHandler(hook);
       const res = router.addPostHandler(hook);