Browse Source

refactor: replaces req and res to request and response

e22m4u 3 weeks ago
parent
commit
7756da6c84
62 changed files with 422 additions and 408 deletions
  1. 1 0
      .mocharc.cjs
  2. 27 27
      README.md
  3. 149 146
      dist/cjs/index.cjs
  4. 4 0
      mocha-setup.js
  5. 0 7
      src/chai.js
  6. 1 1
      src/debuggable-service.spec.js
  7. 1 1
      src/hooks/hook-invoker.spec.js
  8. 1 1
      src/hooks/hook-registry.spec.js
  9. 2 2
      src/parsers/body-parser.d.ts
  10. 6 6
      src/parsers/body-parser.js
  11. 2 2
      src/parsers/body-parser.spec.js
  12. 2 2
      src/parsers/cookies-parser.d.ts
  13. 5 5
      src/parsers/cookies-parser.js
  14. 1 1
      src/parsers/cookies-parser.spec.js
  15. 2 2
      src/parsers/query-parser.d.ts
  16. 5 5
      src/parsers/query-parser.js
  17. 1 1
      src/parsers/query-parser.spec.js
  18. 2 2
      src/parsers/request-parser.d.ts
  19. 8 8
      src/parsers/request-parser.js
  20. 1 1
      src/parsers/request-parser.spec.js
  21. 3 3
      src/request-context.d.ts
  22. 9 9
      src/request-context.js
  23. 4 4
      src/request-context.spec.js
  24. 2 2
      src/route-registry.d.ts
  25. 7 7
      src/route-registry.js
  26. 1 1
      src/route-registry.spec.js
  27. 1 1
      src/route.js
  28. 1 1
      src/route.spec.js
  29. 1 1
      src/router-options.spec.js
  30. 2 2
      src/senders/data-sender.d.ts
  31. 11 11
      src/senders/data-sender.js
  32. 1 1
      src/senders/data-sender.spec.js
  33. 11 6
      src/senders/error-sender.d.ts
  34. 19 19
      src/senders/error-sender.js
  35. 6 3
      src/senders/error-sender.spec.js
  36. 19 18
      src/trie-router.js
  37. 6 6
      src/trie-router.spec.js
  38. 1 1
      src/utils/clone-deep.js
  39. 1 1
      src/utils/clone-deep.spec.js
  40. 1 1
      src/utils/create-cookies-string.spec.js
  41. 1 1
      src/utils/create-debugger.spec.js
  42. 1 1
      src/utils/create-error.spec.js
  43. 11 11
      src/utils/create-request-mock.js
  44. 1 1
      src/utils/create-request-mock.spec.js
  45. 2 1
      src/utils/create-response-mock.d.ts
  46. 30 30
      src/utils/create-response-mock.js
  47. 1 1
      src/utils/create-response-mock.spec.js
  48. 2 2
      src/utils/fetch-request-body.d.ts
  49. 16 13
      src/utils/fetch-request-body.js
  50. 1 1
      src/utils/fetch-request-body.spec.js
  51. 2 2
      src/utils/get-request-pathname.d.ts
  52. 8 8
      src/utils/get-request-pathname.js
  53. 1 1
      src/utils/get-request-pathname.spec.js
  54. 1 1
      src/utils/is-promise.spec.js
  55. 1 1
      src/utils/is-readable-stream.spec.js
  56. 2 2
      src/utils/is-response-sent.d.ts
  57. 8 8
      src/utils/is-response-sent.js
  58. 1 1
      src/utils/is-response-sent.spec.js
  59. 1 1
      src/utils/is-writable-stream.spec.js
  60. 1 1
      src/utils/parse-content-type.spec.js
  61. 1 1
      src/utils/parse-cookies.spec.js
  62. 1 1
      src/utils/to-camel-case.spec.js

+ 1 - 0
.mocharc.cjs

@@ -1,4 +1,5 @@
 module.exports = {
   extension: ['js'],
   spec: 'src/**/*.spec.js',
+  require: ['./mocha-setup.js'],
 }

+ 27 - 27
README.md

@@ -78,18 +78,18 @@ server.listen(3000, 'localhost');             // прослушивание за
 `RequestContext` с набором свойств, содержащих разобранные
 данные входящего запроса.
 
-- `cont: ServiceContainer` экземпляр [сервис-контейнера](https://npmjs.com/package/@e22m4u/js-service)
-- `req: IncomingMessage` нативный поток входящего запроса
-- `res: ServerResponse` нативный поток ответа сервера
-- `params: ParsedParams` объект ключ-значение с параметрами пути
-- `query: ParsedQuery` объект ключ-значение с параметрами строки запроса
-- `headers: ParsedHeaders` объект ключ-значение с заголовками запроса 
-- `cookies: ParsedCookies` объект ключ-значение разобранного заголовка `Cookie`
-- `method: string` метод запроса в верхнем регистре, например `GET`, `POST` и т.д.
-- `path: string` путь включающий строку запроса, например `/myPath?foo=bar`
-- `pathname: string` путь запроса, например `/myPath`
-- `body: unknown` тело запроса
-- `meta: object` мета-данные из определения маршрута
+- `container: ServiceContainer` экземпляр [сервис-контейнера](https://npmjs.com/package/@e22m4u/js-service);
+- `request: IncomingMessage` нативный поток входящего запроса;
+- `response: ServerResponse` нативный поток ответа сервера;
+- `params: ParsedParams` объект ключ-значение с параметрами пути;
+- `query: ParsedQuery` объект ключ-значение с параметрами строки запроса;
+- `headers: ParsedHeaders` объект ключ-значение с заголовками запроса;
+- `cookies: ParsedCookies` объект ключ-значение разобранного заголовка `Cookie`;
+- `method: string` метод запроса в верхнем регистре, например `GET`, `POST` и т.д.;
+- `path: string` путь включающий строку запроса, например `/myPath?foo=bar`;
+- `pathname: string` путь запроса, например `/myPath`;
+- `body: unknown` тело запроса;
+- `meta: object` мета-данные из определения маршрута;
 
 Пример доступа к контексту из обработчика маршрута.
 
@@ -101,17 +101,17 @@ router.defineRoute({
   handler(ctx) {
     // GET /users/10?include=city
     // Cookie: foo=bar; baz=qux;
-    console.log(ctx.req);      // IncomingMessage
-    console.log(ctx.res);      // ServerResponse
-    console.log(ctx.params);   // {id: 10}
-    console.log(ctx.query);    // {include: 'city'}
-    console.log(ctx.headers);  // {cookie: 'foo=bar; baz=qux;'}
-    console.log(ctx.cookies);  // {foo: 'bar', baz: 'qux'}
-    console.log(ctx.method);   // "GET"
-    console.log(ctx.path);     // "/users/10?include=city"
-    console.log(ctx.pathname); // "/users/10"
-    console.log(ctx.meta);     // {prop: 'value'}
-    console.log(ctx.cont);     // ServiceContainer
+    console.log(ctx.container); // ServiceContainer
+    console.log(ctx.request);   // IncomingMessage
+    console.log(ctx.response);  // ServerResponse
+    console.log(ctx.params);    // {id: 10}
+    console.log(ctx.query);     // {include: 'city'}
+    console.log(ctx.headers);   // {cookie: 'foo=bar; baz=qux;'}
+    console.log(ctx.cookies);   // {foo: 'bar', baz: 'qux'}
+    console.log(ctx.method);    // "GET"
+    console.log(ctx.path);      // "/users/10?include=city"
+    console.log(ctx.pathname);  // "/users/10"
+    console.log(ctx.meta);      // {prop: 'value'}
     // ...
   },
 });
@@ -150,10 +150,10 @@ router.defineRoute({     // регистрация маршрута
 ```js
 router.defineRoute({
   // ...
-  handler(ctx) {
-    ctx.res.statusCode = 404;
-    ctx.res.setHeader('content-type', 'text/plain; charset=utf-8');
-    ctx.res.end('404 Not Found', 'utf-8');
+  handler({response}) {
+    response.statusCode = 404;
+    response.setHeader('content-type', 'text/plain; charset=utf-8');
+    response.end('404 Not Found', 'utf-8');
   },
 });
 ```

+ 149 - 146
dist/cjs/index.cjs

@@ -108,7 +108,7 @@ function cloneDeep(value) {
   }
   const proto = Object.getPrototypeOf(value);
   if (proto === Object.prototype || proto === null) {
-    const newObj = {};
+    const newObj = proto === null ? /* @__PURE__ */ Object.create(null) : {};
     for (const key in value) {
       if (Object.prototype.hasOwnProperty.call(value, key)) {
         newObj[key] = cloneDeep(value[key]);
@@ -196,14 +196,14 @@ __name(createDebugger, "createDebugger");
 
 // src/utils/is-response-sent.js
 var import_js_format6 = require("@e22m4u/js-format");
-function isResponseSent(res) {
-  if (!res || typeof res !== "object" || Array.isArray(res) || typeof res.headersSent !== "boolean") {
+function isResponseSent(response) {
+  if (!response || typeof response !== "object" || Array.isArray(response) || typeof response.headersSent !== "boolean") {
     throw new import_js_format6.Errorf(
       'The first argument of "isResponseSent" should be an instance of ServerResponse, but %v was given.',
-      res
+      response
     );
   }
-  return res.headersSent;
+  return response.headersSent;
 }
 __name(isResponseSent, "isResponseSent");
 
@@ -255,11 +255,11 @@ var CHARACTER_ENCODING_LIST = [
   "ucs-2",
   "latin1"
 ];
-function fetchRequestBody(req, bodyBytesLimit = 0) {
-  if (!(req instanceof import_http.IncomingMessage))
+function fetchRequestBody(request, bodyBytesLimit = 0) {
+  if (!(request instanceof import_http.IncomingMessage))
     throw new import_js_format8.Errorf(
       'The first parameter of "fetchRequestBody" should be an IncomingMessage instance, but %v was given.',
-      req
+      request
     );
   if (typeof bodyBytesLimit !== "number")
     throw new import_js_format8.Errorf(
@@ -267,7 +267,10 @@ function fetchRequestBody(req, bodyBytesLimit = 0) {
       bodyBytesLimit
     );
   return new Promise((resolve, reject) => {
-    const contentLength = parseInt(req.headers["content-length"] || "0", 10);
+    const contentLength = parseInt(
+      request.headers["content-length"] || "0",
+      10
+    );
     if (bodyBytesLimit && contentLength && contentLength > bodyBytesLimit)
       throw createError(
         import_http_errors.default.PayloadTooLarge,
@@ -276,7 +279,7 @@ function fetchRequestBody(req, bodyBytesLimit = 0) {
         contentLength
       );
     let encoding = "utf-8";
-    const contentType = req.headers["content-type"] || "";
+    const contentType = request.headers["content-type"] || "";
     if (contentType) {
       const parsedContentType = parseContentType(contentType);
       if (parsedContentType && parsedContentType.charset) {
@@ -294,7 +297,7 @@ function fetchRequestBody(req, bodyBytesLimit = 0) {
     const onData = /* @__PURE__ */ __name((chunk) => {
       receivedLength += chunk.length;
       if (bodyBytesLimit && receivedLength > bodyBytesLimit) {
-        req.removeAllListeners();
+        request.removeAllListeners();
         const error = createError(
           import_http_errors.default.PayloadTooLarge,
           "Request body limit is %v bytes, but %v bytes given.",
@@ -307,7 +310,7 @@ function fetchRequestBody(req, bodyBytesLimit = 0) {
       data.push(chunk);
     }, "onData");
     const onEnd = /* @__PURE__ */ __name(() => {
-      req.removeAllListeners();
+      request.removeAllListeners();
       if (contentLength && contentLength !== receivedLength) {
         const error = createError(
           import_http_errors.default.BadRequest,
@@ -321,13 +324,13 @@ function fetchRequestBody(req, bodyBytesLimit = 0) {
       resolve(body || void 0);
     }, "onEnd");
     const onError = /* @__PURE__ */ __name((error) => {
-      req.removeAllListeners();
+      request.removeAllListeners();
       reject((0, import_http_errors.default)(400, error));
     }, "onError");
-    req.on("data", onData);
-    req.on("end", onEnd);
-    req.on("error", onError);
-    req.resume();
+    request.on("data", onData);
+    request.on("end", onEnd);
+    request.on("error", onError);
+    request.resume();
   });
 }
 __name(fetchRequestBody, "fetchRequestBody");
@@ -436,9 +439,9 @@ function createRequestMock(patch) {
         'The "createRequestMock" does not allow specifying the "stream" and "encoding" options simultaneously.'
       );
   }
-  const req = patch.stream || createRequestStream(patch.secure, patch.body, patch.encoding);
-  req.url = createRequestUrl(patch.path || "/", patch.query);
-  req.headers = createRequestHeaders(
+  const request = patch.stream || createRequestStream(patch.secure, patch.body, patch.encoding);
+  request.url = createRequestUrl(patch.path || "/", patch.query);
+  request.headers = createRequestHeaders(
     patch.host,
     patch.secure,
     patch.body,
@@ -446,8 +449,8 @@ function createRequestMock(patch) {
     patch.encoding,
     patch.headers
   );
-  req.method = (patch.method || "get").toUpperCase();
-  return req;
+  request.method = (patch.method || "get").toUpperCase();
+  return request;
 }
 __name(createRequestMock, "createRequestMock");
 function createRequestStream(secure, body, encoding) {
@@ -459,18 +462,18 @@ function createRequestStream(secure, body, encoding) {
   encoding = encoding || "utf-8";
   let socket = new import_net.Socket();
   if (secure) socket = new import_tls.TLSSocket(socket);
-  const req = new import_http2.IncomingMessage(socket);
+  const request = new import_http2.IncomingMessage(socket);
   if (body != null) {
     if (typeof body === "string") {
-      req.push(body, encoding);
+      request.push(body, encoding);
     } else if (Buffer.isBuffer(body)) {
-      req.push(body);
+      request.push(body);
     } else {
-      req.push(JSON.stringify(body));
+      request.push(JSON.stringify(body));
     }
   }
-  req.push(null);
-  return req;
+  request.push(null);
+  return request;
 }
 __name(createRequestStream, "createRequestStream");
 function createRequestUrl(path, query) {
@@ -569,27 +572,27 @@ __name(createRequestHeaders, "createRequestHeaders");
 // src/utils/create-response-mock.js
 var import_stream = require("stream");
 function createResponseMock() {
-  const res = new import_stream.PassThrough();
-  patchEncoding(res);
-  patchHeaders(res);
-  patchBody(res);
-  return res;
+  const response = new import_stream.PassThrough();
+  patchEncoding(response);
+  patchHeaders(response);
+  patchBody(response);
+  return response;
 }
 __name(createResponseMock, "createResponseMock");
-function patchEncoding(res) {
-  Object.defineProperty(res, "_encoding", {
+function patchEncoding(response) {
+  Object.defineProperty(response, "_encoding", {
     configurable: true,
     writable: true,
     value: void 0
   });
-  Object.defineProperty(res, "setEncoding", {
+  Object.defineProperty(response, "setEncoding", {
     configurable: true,
     value: /* @__PURE__ */ __name(function(enc) {
       this._encoding = enc;
       return this;
     }, "value")
   });
-  Object.defineProperty(res, "getEncoding", {
+  Object.defineProperty(response, "getEncoding", {
     configurable: true,
     value: /* @__PURE__ */ __name(function() {
       return this._encoding;
@@ -597,24 +600,24 @@ function patchEncoding(res) {
   });
 }
 __name(patchEncoding, "patchEncoding");
-function patchHeaders(res) {
-  Object.defineProperty(res, "_headersSent", {
+function patchHeaders(response) {
+  Object.defineProperty(response, "_headersSent", {
     configurable: true,
     writable: true,
     value: false
   });
-  Object.defineProperty(res, "headersSent", {
+  Object.defineProperty(response, "headersSent", {
     configurable: true,
     get() {
       return this._headersSent;
     }
   });
-  Object.defineProperty(res, "_headers", {
+  Object.defineProperty(response, "_headers", {
     configurable: true,
     writable: true,
     value: {}
   });
-  Object.defineProperty(res, "setHeader", {
+  Object.defineProperty(response, "setHeader", {
     configurable: true,
     value: /* @__PURE__ */ __name(function(name, value) {
       if (this.headersSent)
@@ -626,13 +629,13 @@ function patchHeaders(res) {
       return this;
     }, "value")
   });
-  Object.defineProperty(res, "getHeader", {
+  Object.defineProperty(response, "getHeader", {
     configurable: true,
     value: /* @__PURE__ */ __name(function(name) {
       return this._headers[name.toLowerCase()];
     }, "value")
   });
-  Object.defineProperty(res, "getHeaders", {
+  Object.defineProperty(response, "getHeaders", {
     configurable: true,
     value: /* @__PURE__ */ __name(function() {
       return JSON.parse(JSON.stringify(this._headers));
@@ -640,24 +643,24 @@ function patchHeaders(res) {
   });
 }
 __name(patchHeaders, "patchHeaders");
-function patchBody(res) {
+function patchBody(response) {
   let resolve, reject;
-  const promise = new Promise((res2, rej) => {
-    resolve = res2;
+  const promise = new Promise((rsv, rej) => {
+    resolve = rsv;
     reject = rej;
   });
   const data = [];
-  res.on("data", (c) => data.push(c));
-  res.on("error", (e) => reject(e));
-  res.on("end", () => {
+  response.on("data", (c) => data.push(c));
+  response.on("error", (e) => reject(e));
+  response.on("end", () => {
     resolve(Buffer.concat(data));
   });
-  const originalEnd = res.end.bind(res);
-  res.end = function(...args) {
+  const originalEnd = response.end.bind(response);
+  response.end = function(...args) {
     this._headersSent = true;
     return originalEnd(...args);
   };
-  Object.defineProperty(res, "getBody", {
+  Object.defineProperty(response, "getBody", {
     configurable: true,
     value: /* @__PURE__ */ __name(function() {
       return promise.then((buffer) => {
@@ -672,14 +675,14 @@ __name(patchBody, "patchBody");
 
 // src/utils/get-request-pathname.js
 var import_js_format11 = require("@e22m4u/js-format");
-function getRequestPathname(req) {
-  if (!req || typeof req !== "object" || Array.isArray(req) || typeof req.url !== "string") {
+function getRequestPathname(request) {
+  if (!request || typeof request !== "object" || Array.isArray(request) || typeof request.url !== "string") {
     throw new import_js_format11.Errorf(
       'The first argument of "getRequestPathname" should be an instance of IncomingMessage, but %v was given.',
-      req
+      request
     );
   }
-  return (req.url || "/").replace(/\?.*$/, "");
+  return (request.url || "/").replace(/\?.*$/, "");
 }
 __name(getRequestPathname, "getRequestPathname");
 
@@ -980,7 +983,7 @@ var _Route = class _Route extends import_js_debug.Debuggable {
    */
   handle(context) {
     const debug = this.getDebuggerFor(this.handle);
-    const requestPath = getRequestPathname(context.req);
+    const requestPath = getRequestPathname(context.request);
     debug(
       "Invoking the Route handler for the request %s %v.",
       this.method.toUpperCase(),
@@ -1102,19 +1105,19 @@ var _BodyParser = class _BodyParser extends DebuggableService {
   /**
    * Parse.
    *
-   * @param {import('http').IncomingMessage} req
+   * @param {import('http').IncomingMessage} request
    * @returns {Promise<*>|undefined}
    */
-  parse(req) {
+  parse(request) {
     const debug = this.getDebuggerFor(this.parse);
-    if (!METHODS_WITH_BODY.includes(req.method.toUpperCase())) {
+    if (!METHODS_WITH_BODY.includes(request.method.toUpperCase())) {
       debug(
         "Body parsing was skipped for the %s request.",
-        req.method.toUpperCase()
+        request.method.toUpperCase()
       );
       return;
     }
-    const contentType = (req.headers["content-type"] || "").replace(
+    const contentType = (request.headers["content-type"] || "").replace(
       /^([^;]+);.*$/,
       "$1"
     );
@@ -1143,7 +1146,7 @@ var _BodyParser = class _BodyParser extends DebuggableService {
       );
     }
     const bodyBytesLimit = this.getService(RouterOptions).requestBodyBytesLimit;
-    return fetchRequestBody(req, bodyBytesLimit).then((rawBody) => {
+    return fetchRequestBody(request, bodyBytesLimit).then((rawBody) => {
       if (rawBody != null) return parser(rawBody);
       return rawBody;
     });
@@ -1167,12 +1170,12 @@ var _QueryParser = class _QueryParser extends DebuggableService {
   /**
    * Parse
    *
-   * @param {import('http').IncomingMessage} req
+   * @param {import('http').IncomingMessage} request
    * @returns {object}
    */
-  parse(req) {
+  parse(request) {
     const debug = this.getDebuggerFor(this.parse);
-    const queryStr = req.url.replace(/^[^?]*\??/, "");
+    const queryStr = request.url.replace(/^[^?]*\??/, "");
     const query = queryStr ? import_querystring2.default.parse(queryStr) : {};
     const queryKeys = Object.keys(query);
     if (queryKeys.length) {
@@ -1182,8 +1185,8 @@ var _QueryParser = class _QueryParser extends DebuggableService {
     } else {
       debug(
         "The request %s %v had no query parameters.",
-        req.method,
-        getRequestPathname(req)
+        request.method,
+        getRequestPathname(request)
       );
     }
     return query;
@@ -1197,12 +1200,12 @@ var _CookiesParser = class _CookiesParser extends DebuggableService {
   /**
    * Parse
    *
-   * @param {import('http').IncomingMessage} req
+   * @param {import('http').IncomingMessage} request
    * @returns {object}
    */
-  parse(req) {
+  parse(request) {
     const debug = this.getDebuggerFor(this.parse);
-    const cookiesString = req.headers["cookie"] || "";
+    const cookiesString = request.headers["cookie"] || "";
     const cookies = parseCookies(cookiesString);
     const cookiesKeys = Object.keys(cookies);
     if (cookiesKeys.length) {
@@ -1212,8 +1215,8 @@ var _CookiesParser = class _CookiesParser extends DebuggableService {
     } else {
       debug(
         "The request %s %v had no cookies.",
-        req.method,
-        getRequestPathname(req)
+        request.method,
+        getRequestPathname(request)
       );
     }
     return cookies;
@@ -1229,36 +1232,36 @@ var _RequestParser = class _RequestParser extends DebuggableService {
   /**
    * Parse.
    *
-   * @param {IncomingMessage} req
+   * @param {IncomingMessage} request
    * @returns {Promise<object>|object}
    */
-  parse(req) {
-    if (!(req instanceof import_http3.IncomingMessage))
+  parse(request) {
+    if (!(request instanceof import_http3.IncomingMessage))
       throw new import_js_format17.Errorf(
         "The first argument of RequestParser.parse should be an instance of IncomingMessage, but %v was given.",
-        req
+        request
       );
     const data = {};
     const promises = [];
-    const parsedQuery = this.getService(QueryParser).parse(req);
+    const parsedQuery = this.getService(QueryParser).parse(request);
     if (isPromise(parsedQuery)) {
       promises.push(parsedQuery.then((v) => data.query = v));
     } else {
       data.query = parsedQuery;
     }
-    const parsedCookies = this.getService(CookiesParser).parse(req);
+    const parsedCookies = this.getService(CookiesParser).parse(request);
     if (isPromise(parsedCookies)) {
       promises.push(parsedCookies.then((v) => data.cookies = v));
     } else {
       data.cookies = parsedCookies;
     }
-    const parsedBody = this.getService(BodyParser).parse(req);
+    const parsedBody = this.getService(BodyParser).parse(request);
     if (isPromise(parsedBody)) {
       promises.push(parsedBody.then((v) => data.body = v));
     } else {
       data.body = parsedBody;
     }
-    data.headers = Object.assign({}, req.headers);
+    data.headers = Object.assign({}, request.headers);
     return promises.length ? Promise.all(promises).then(() => data) : data;
   }
 };
@@ -1305,19 +1308,19 @@ var _RouteRegistry = class _RouteRegistry extends DebuggableService {
   /**
    * Match route by request.
    *
-   * @param {import('http').IncomingRequest} req
+   * @param {import('http').IncomingRequest} request
    * @returns {ResolvedRoute|undefined}
    */
-  matchRouteByRequest(req) {
+  matchRouteByRequest(request) {
     const debug = this.getDebuggerFor(this.matchRouteByRequest);
-    const requestPath = (req.url || "/").replace(/\?.*$/, "");
+    const requestPath = (request.url || "/").replace(/\?.*$/, "");
     debug(
       "Matching routes with the request %s %v.",
-      req.method.toUpperCase(),
+      request.method.toUpperCase(),
       requestPath
     );
-    const rawTriePath = `${req.method.toUpperCase()}/${requestPath}`;
-    const triePath = rawTriePath.replace(/\/+/, "/");
+    const rawTriePath = `${request.method.toUpperCase()}/${requestPath}`;
+    const triePath = rawTriePath.replace(/\/+/g, "/");
     const resolved = this._trie.match(triePath);
     if (resolved) {
       const route = resolved.value;
@@ -1342,7 +1345,7 @@ var _RouteRegistry = class _RouteRegistry extends DebuggableService {
     }
     debug(
       "No matched route for the request %s %v.",
-      req.method.toUpperCase(),
+      request.method.toUpperCase(),
       requestPath
     );
   }
@@ -1360,19 +1363,19 @@ var _RequestContext = class _RequestContext {
    *
    * @type {import('@e22m4u/js-service').ServiceContainer}
    */
-  cont;
+  container;
   /**
    * Request.
    *
    * @type {import('http').IncomingMessage}
    */
-  req;
+  request;
   /**
    * Response.
    *
    * @type {import('http').ServerResponse}
    */
-  res;
+  response;
   /**
    * Query.
    *
@@ -1415,7 +1418,7 @@ var _RequestContext = class _RequestContext {
    * @returns {string}
    */
   get method() {
-    return this.req.method.toUpperCase();
+    return this.request.method.toUpperCase();
   }
   /**
    * Path.
@@ -1423,7 +1426,7 @@ var _RequestContext = class _RequestContext {
    * @returns {string}
    */
   get path() {
-    return this.req.url;
+    return this.request.url;
   }
   /**
    * Pathname.
@@ -1439,7 +1442,7 @@ var _RequestContext = class _RequestContext {
    */
   get pathname() {
     if (this._pathname != null) return this._pathname;
-    this._pathname = getRequestPathname(this.req);
+    this._pathname = getRequestPathname(this.request);
     return this._pathname;
   }
   /**
@@ -1455,21 +1458,21 @@ var _RequestContext = class _RequestContext {
         'The parameter "container" of RequestContext.constructor should be an instance of ServiceContainer, but %v was given.',
         container
       );
-    this.cont = container;
+    this.container = container;
     if (!request || typeof request !== "object" || Array.isArray(request) || !isReadableStream(request)) {
       throw new import_js_format19.Errorf(
         'The parameter "request" of RequestContext.constructor should be an instance of IncomingMessage, but %v was given.',
         request
       );
     }
-    this.req = request;
+    this.request = request;
     if (!response || typeof response !== "object" || Array.isArray(response) || !isWritableStream(response)) {
       throw new import_js_format19.Errorf(
         'The parameter "response" of RequestContext.constructor should be an instance of ServerResponse, but %v was given.',
         response
       );
     }
-    this.res = response;
+    this.response = response;
   }
 };
 __name(_RequestContext, "RequestContext");
@@ -1485,27 +1488,27 @@ var _DataSender = class _DataSender extends DebuggableService {
   /**
    * Send.
    *
-   * @param {import('http').ServerResponse} res
+   * @param {import('http').ServerResponse} response
    * @param {*} data
    * @returns {undefined}
    */
-  send(res, data) {
+  send(response, data) {
     const debug = this.getDebuggerFor(this.send);
-    if (data === res || res.headersSent) {
+    if (data === response || response.headersSent) {
       debug(
         "Response sending was skipped because its headers where sent already."
       );
       return;
     }
     if (data == null) {
-      res.statusCode = 204;
-      res.end();
+      response.statusCode = 204;
+      response.end();
       debug("The empty response was sent.");
       return;
     }
     if (isReadableStream(data)) {
-      res.setHeader("Content-Type", "application/octet-stream");
-      data.pipe(res);
+      response.setHeader("Content-Type", "application/octet-stream");
+      data.pipe(response);
       debug("The stream response was sent.");
       return;
     }
@@ -1515,21 +1518,21 @@ var _DataSender = class _DataSender extends DebuggableService {
       case "boolean":
       case "number":
         if (Buffer.isBuffer(data)) {
-          res.setHeader("content-type", "application/octet-stream");
+          response.setHeader("content-type", "application/octet-stream");
           debugMsg = "The Buffer was sent as binary data.";
         } else {
-          res.setHeader("content-type", "application/json");
+          response.setHeader("content-type", "application/json");
           debugMsg = (0, import_js_format20.format)("The %v was sent as JSON.", typeof data);
           data = JSON.stringify(data);
         }
         break;
       default:
-        res.setHeader("content-type", "text/plain");
+        response.setHeader("content-type", "text/plain");
         debugMsg = "The response data was sent as plain text.";
         data = String(data);
         break;
     }
-    res.end(data);
+    response.end(data);
     debug(debugMsg);
   }
 };
@@ -1544,12 +1547,12 @@ var _ErrorSender = class _ErrorSender extends DebuggableService {
   /**
    * Handle.
    *
-   * @param {import('http').IncomingMessage} req
-   * @param {import('http').ServerResponse} res
+   * @param {import('http').IncomingMessage} request
+   * @param {import('http').ServerResponse} response
    * @param {Error} error
    * @returns {undefined}
    */
-  send(req, res, error) {
+  send(request, response, error) {
     const debug = this.getDebuggerFor(this.send);
     let safeError = {};
     if (error) {
@@ -1570,9 +1573,9 @@ var _ErrorSender = class _ErrorSender extends DebuggableService {
       if (name in safeError) body.error[name] = safeError[name];
     });
     const requestData = {
-      url: req.url,
-      method: req.method,
-      headers: req.headers
+      url: request.url,
+      method: request.method,
+      headers: request.headers
     };
     const inspectOptions = {
       showHidden: false,
@@ -1587,32 +1590,32 @@ var _ErrorSender = class _ErrorSender extends DebuggableService {
     } else {
       console.error(error);
     }
-    res.statusCode = statusCode;
-    res.setHeader("content-type", "application/json; charset=utf-8");
-    res.end(JSON.stringify(body, null, 2), "utf-8");
+    response.statusCode = statusCode;
+    response.setHeader("content-type", "application/json; charset=utf-8");
+    response.end(JSON.stringify(body, null, 2), "utf-8");
     debug(
       "The %s error was sent for the request %s %v.",
       statusCode,
-      req.method,
-      getRequestPathname(req)
+      request.method,
+      getRequestPathname(request)
     );
   }
   /**
    * Send 404.
    *
-   * @param {import('http').IncomingMessage} req
-   * @param {import('http').ServerResponse} res
+   * @param {import('http').IncomingMessage} request
+   * @param {import('http').ServerResponse} response
    * @returns {undefined}
    */
-  send404(req, res) {
+  send404(request, response) {
     const debug = this.getDebuggerFor(this.send404);
-    res.statusCode = 404;
-    res.setHeader("content-type", "text/plain; charset=utf-8");
-    res.end("404 Not Found", "utf-8");
+    response.statusCode = 404;
+    response.setHeader("content-type", "text/plain; charset=utf-8");
+    response.end("404 Not Found", "utf-8");
     debug(
       "The 404 error was sent for the request %s %v.",
-      req.method,
-      getRequestPathname(req)
+      request.method,
+      getRequestPathname(request)
     );
   }
 };
@@ -1674,37 +1677,37 @@ var _TrieRouter = class _TrieRouter extends DebuggableService {
   /**
    * Handle incoming request.
    *
-   * @param {import('http').IncomingMessage} req
-   * @param {import('http').ServerResponse} res
+   * @param {import('http').IncomingMessage} request
+   * @param {import('http').ServerResponse} response
    * @returns {Promise<undefined>}
    * @private
    */
-  async _handleRequest(req, res) {
+  async _handleRequest(request, response) {
     const debug = this.getDebuggerFor(this._handleRequest);
-    const requestPath = (req.url || "/").replace(/\?.*$/, "");
+    const requestPath = (request.url || "/").replace(/\?.*$/, "");
     debug(
       "Preparing to handle an incoming request %s %v.",
-      req.method,
+      request.method,
       requestPath
     );
-    const resolved = this.getService(RouteRegistry).matchRouteByRequest(req);
+    const resolved = this.getService(RouteRegistry).matchRouteByRequest(request);
     if (!resolved) {
-      debug("No route for the request %s %v.", req.method, requestPath);
-      this.getService(ErrorSender).send404(req, res);
+      debug("No route for the request %s %v.", request.method, requestPath);
+      this.getService(ErrorSender).send404(request, response);
     } else {
       const { route, params } = resolved;
       const container = new import_js_service5.ServiceContainer(this.container);
-      const context = new RequestContext(container, req, res);
+      const context = new RequestContext(container, request, response);
       if (route.meta != null) {
         context.meta = cloneDeep(route.meta);
       }
       container.set(RequestContext, context);
-      container.set(import_http4.IncomingMessage, req);
-      container.set(import_http4.ServerResponse, res);
+      container.set(import_http4.IncomingMessage, request);
+      container.set(import_http4.ServerResponse, response);
       context.params = params;
       let data;
       try {
-        const reqDataOrPromise = this.getService(RequestParser).parse(req);
+        const reqDataOrPromise = this.getService(RequestParser).parse(request);
         if (isPromise(reqDataOrPromise)) {
           const reqData = await reqDataOrPromise;
           Object.assign(context, reqData);
@@ -1715,17 +1718,17 @@ var _TrieRouter = class _TrieRouter extends DebuggableService {
         data = hookInvoker.invokeAndContinueUntilValueReceived(
           route,
           RouterHookType.PRE_HANDLER,
-          res,
+          response,
           context
         );
         if (isPromise(data)) data = await data;
-        if (!isResponseSent(res) && data == null) {
+        if (!isResponseSent(response) && data == null) {
           data = route.handle(context);
           if (isPromise(data)) data = await data;
           let postHandlerData = hookInvoker.invokeAndContinueUntilValueReceived(
             route,
             RouterHookType.POST_HANDLER,
-            res,
+            response,
             context,
             data
           );
@@ -1734,11 +1737,11 @@ var _TrieRouter = class _TrieRouter extends DebuggableService {
           if (postHandlerData != null) data = postHandlerData;
         }
       } catch (error) {
-        this.getService(ErrorSender).send(req, res, error);
+        this.getService(ErrorSender).send(request, response, error);
         return;
       }
-      if (!isResponseSent(res)) {
-        this.getService(DataSender).send(res, data);
+      if (!isResponseSent(response)) {
+        this.getService(DataSender).send(response, data);
       }
     }
   }

+ 4 - 0
mocha-setup.js

@@ -0,0 +1,4 @@
+import * as chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+
+chai.use(chaiAsPromised);

+ 0 - 7
src/chai.js

@@ -1,7 +0,0 @@
-import * as chaiModule from 'chai';
-import chaiAsPromised from 'chai-as-promised';
-const chai = {...chaiModule};
-
-chaiAsPromised(chai, chai.util);
-
-export const expect = chai.expect;

+ 1 - 1
src/debuggable-service.spec.js

@@ -1,4 +1,4 @@
-import {expect} from './chai.js';
+import {expect} from 'chai';
 import {DebuggableService} from './debuggable-service.js';
 
 describe('DebuggableService', function () {

+ 1 - 1
src/hooks/hook-invoker.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {Route} from '../route.js';
 import {HttpMethod} from '../route.js';
 import {format} from '@e22m4u/js-format';

+ 1 - 1
src/hooks/hook-registry.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {HookRegistry} from './hook-registry.js';
 import {RouterHookType} from './hook-registry.js';

+ 2 - 2
src/parsers/body-parser.d.ts

@@ -46,7 +46,7 @@ export declare class BodyParser extends DebuggableService {
   /**
    * Parse.
    *
-   * @param req
+   * @param request
    */
-  parse<T = unknown>(req: IncomingMessage): ValueOrPromise<T>;
+  parse<T = unknown>(request: IncomingMessage): ValueOrPromise<T>;
 }

+ 6 - 6
src/parsers/body-parser.js

@@ -96,19 +96,19 @@ export class BodyParser extends DebuggableService {
   /**
    * Parse.
    *
-   * @param {import('http').IncomingMessage} req
+   * @param {import('http').IncomingMessage} request
    * @returns {Promise<*>|undefined}
    */
-  parse(req) {
+  parse(request) {
     const debug = this.getDebuggerFor(this.parse);
-    if (!METHODS_WITH_BODY.includes(req.method.toUpperCase())) {
+    if (!METHODS_WITH_BODY.includes(request.method.toUpperCase())) {
       debug(
         'Body parsing was skipped for the %s request.',
-        req.method.toUpperCase(),
+        request.method.toUpperCase(),
       );
       return;
     }
-    const contentType = (req.headers['content-type'] || '').replace(
+    const contentType = (request.headers['content-type'] || '').replace(
       /^([^;]+);.*$/,
       '$1',
     );
@@ -137,7 +137,7 @@ export class BodyParser extends DebuggableService {
       );
     }
     const bodyBytesLimit = this.getService(RouterOptions).requestBodyBytesLimit;
-    return fetchRequestBody(req, bodyBytesLimit).then(rawBody => {
+    return fetchRequestBody(request, bodyBytesLimit).then(rawBody => {
       if (rawBody != null) return parser(rawBody);
       return rawBody;
     });

+ 2 - 2
src/parsers/body-parser.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import HttpErrors from 'http-errors';
 import {HttpMethod} from '../route.js';
 import {format} from '@e22m4u/js-format';
@@ -104,7 +104,7 @@ describe('BodyParser', function () {
     });
   });
 
-  describe('removesParser', function () {
+  describe('deleteParser', function () {
     it('requires the parameter "mediaType" to be a non-empty String', function () {
       const parser = new BodyParser();
       const throwable = v => () => parser.deleteParser(v);

+ 2 - 2
src/parsers/cookies-parser.d.ts

@@ -9,7 +9,7 @@ export declare class CookiesParser extends DebuggableService {
   /**
    * Parse.
    *
-   * @param req
+   * @param request
    */
-  parse(req: IncomingMessage): ParsedCookies;
+  parse(request: IncomingMessage): ParsedCookies;
 }

+ 5 - 5
src/parsers/cookies-parser.js

@@ -9,12 +9,12 @@ export class CookiesParser extends DebuggableService {
   /**
    * Parse
    *
-   * @param {import('http').IncomingMessage} req
+   * @param {import('http').IncomingMessage} request
    * @returns {object}
    */
-  parse(req) {
+  parse(request) {
     const debug = this.getDebuggerFor(this.parse);
-    const cookiesString = req.headers['cookie'] || '';
+    const cookiesString = request.headers['cookie'] || '';
     const cookies = parseCookies(cookiesString);
     const cookiesKeys = Object.keys(cookies);
     if (cookiesKeys.length) {
@@ -24,8 +24,8 @@ export class CookiesParser extends DebuggableService {
     } else {
       debug(
         'The request %s %v had no cookies.',
-        req.method,
-        getRequestPathname(req),
+        request.method,
+        getRequestPathname(request),
       );
     }
     return cookies;

+ 1 - 1
src/parsers/cookies-parser.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {CookiesParser} from './cookies-parser.js';
 
 describe('CookiesParser', function () {

+ 2 - 2
src/parsers/query-parser.d.ts

@@ -15,7 +15,7 @@ export declare class QueryParser extends DebuggableService {
   /**
    * Parse.
    *
-   * @param req
+   * @param request
    */
-  parse(req: IncomingMessage): ParsedQuery;
+  parse(request: IncomingMessage): ParsedQuery;
 }

+ 5 - 5
src/parsers/query-parser.js

@@ -9,12 +9,12 @@ export class QueryParser extends DebuggableService {
   /**
    * Parse
    *
-   * @param {import('http').IncomingMessage} req
+   * @param {import('http').IncomingMessage} request
    * @returns {object}
    */
-  parse(req) {
+  parse(request) {
     const debug = this.getDebuggerFor(this.parse);
-    const queryStr = req.url.replace(/^[^?]*\??/, '');
+    const queryStr = request.url.replace(/^[^?]*\??/, '');
     const query = queryStr ? querystring.parse(queryStr) : {};
     const queryKeys = Object.keys(query);
     if (queryKeys.length) {
@@ -24,8 +24,8 @@ export class QueryParser extends DebuggableService {
     } else {
       debug(
         'The request %s %v had no query parameters.',
-        req.method,
-        getRequestPathname(req),
+        request.method,
+        getRequestPathname(request),
       );
     }
     return query;

+ 1 - 1
src/parsers/query-parser.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {QueryParser} from './query-parser.js';
 
 describe('QueryParser', function () {

+ 2 - 2
src/parsers/request-parser.d.ts

@@ -28,7 +28,7 @@ export declare class RequestParser extends DebuggableService {
   /**
    * Parse.
    *
-   * @param req
+   * @param request
    */
-  parse(req: IncomingMessage): ValueOrPromise<ParsedRequestData>;
+  parse(request: IncomingMessage): ValueOrPromise<ParsedRequestData>;
 }

+ 8 - 8
src/parsers/request-parser.js

@@ -13,15 +13,15 @@ export class RequestParser extends DebuggableService {
   /**
    * Parse.
    *
-   * @param {IncomingMessage} req
+   * @param {IncomingMessage} request
    * @returns {Promise<object>|object}
    */
-  parse(req) {
-    if (!(req instanceof IncomingMessage))
+  parse(request) {
+    if (!(request instanceof IncomingMessage))
       throw new Errorf(
         'The first argument of RequestParser.parse should be ' +
           'an instance of IncomingMessage, but %v was given.',
-        req,
+        request,
       );
     const data = {};
     const promises = [];
@@ -29,7 +29,7 @@ export class RequestParser extends DebuggableService {
     // значения, так как парсер может вернуть
     // Promise, и тогда придется разрывать
     // "eventLoop" с помощью "await"
-    const parsedQuery = this.getService(QueryParser).parse(req);
+    const parsedQuery = this.getService(QueryParser).parse(request);
     if (isPromise(parsedQuery)) {
       promises.push(parsedQuery.then(v => (data.query = v)));
     } else {
@@ -39,7 +39,7 @@ export class RequestParser extends DebuggableService {
     // данные заголовка "cookie" с проверкой
     // значения на Promise, и разрываем
     // "eventLoop" при необходимости
-    const parsedCookies = this.getService(CookiesParser).parse(req);
+    const parsedCookies = this.getService(CookiesParser).parse(request);
     if (isPromise(parsedCookies)) {
       promises.push(parsedCookies.then(v => (data.cookies = v)));
     } else {
@@ -48,7 +48,7 @@ export class RequestParser extends DebuggableService {
     // аналогично предыдущей операции, разбираем
     // тело запроса с проверкой результата
     // на наличие Promise
-    const parsedBody = this.getService(BodyParser).parse(req);
+    const parsedBody = this.getService(BodyParser).parse(request);
     if (isPromise(parsedBody)) {
       promises.push(parsedBody.then(v => (data.body = v)));
     } else {
@@ -56,7 +56,7 @@ export class RequestParser extends DebuggableService {
     }
     // что бы предотвратить модификацию
     // заголовков, возвращаем их копию
-    data.headers = Object.assign({}, req.headers);
+    data.headers = Object.assign({}, request.headers);
     // если имеются асинхронные операции, то результат
     // будет обернут в Promise, в противном случае
     // данные возвращаются сразу

+ 1 - 1
src/parsers/request-parser.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {HttpMethod} from '../route.js';
 import {format} from '@e22m4u/js-format';
 import {RequestParser} from './request-parser.js';

+ 3 - 3
src/request-context.d.ts

@@ -20,17 +20,17 @@ export declare class RequestContext {
   /**
    * Container.
    */
-  cont: ServiceContainer;
+  container: ServiceContainer;
 
   /**
    * Request.
    */
-  req: IncomingMessage;
+  request: IncomingMessage;
 
   /**
    * Response.
    */
-  res: ServerResponse;
+  response: ServerResponse;
 
   /**
    * Query.

+ 9 - 9
src/request-context.js

@@ -14,21 +14,21 @@ export class RequestContext {
    *
    * @type {import('@e22m4u/js-service').ServiceContainer}
    */
-  cont;
+  container;
 
   /**
    * Request.
    *
    * @type {import('http').IncomingMessage}
    */
-  req;
+  request;
 
   /**
    * Response.
    *
    * @type {import('http').ServerResponse}
    */
-  res;
+  response;
 
   /**
    * Query.
@@ -78,7 +78,7 @@ export class RequestContext {
    * @returns {string}
    */
   get method() {
-    return this.req.method.toUpperCase();
+    return this.request.method.toUpperCase();
   }
 
   /**
@@ -87,7 +87,7 @@ export class RequestContext {
    * @returns {string}
    */
   get path() {
-    return this.req.url;
+    return this.request.url;
   }
 
   /**
@@ -105,7 +105,7 @@ export class RequestContext {
    */
   get pathname() {
     if (this._pathname != null) return this._pathname;
-    this._pathname = getRequestPathname(this.req);
+    this._pathname = getRequestPathname(this.request);
     return this._pathname;
   }
 
@@ -123,7 +123,7 @@ export class RequestContext {
           'should be an instance of ServiceContainer, but %v was given.',
         container,
       );
-    this.cont = container;
+    this.container = container;
     if (
       !request ||
       typeof request !== 'object' ||
@@ -136,7 +136,7 @@ export class RequestContext {
         request,
       );
     }
-    this.req = request;
+    this.request = request;
     if (
       !response ||
       typeof response !== 'object' ||
@@ -149,6 +149,6 @@ export class RequestContext {
         response,
       );
     }
-    this.res = response;
+    this.response = response;
   }
 }

+ 4 - 4
src/request-context.spec.js

@@ -1,4 +1,4 @@
-import {expect} from './chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {createRequestMock} from './utils/index.js';
 import {RequestContext} from './request-context.js';
@@ -81,9 +81,9 @@ describe('RequestContext', function () {
       const res = createResponseMock();
       const cont = new ServiceContainer();
       const ctx = new RequestContext(cont, req, res);
-      expect(ctx.cont).to.be.eq(cont);
-      expect(ctx.req).to.be.eq(req);
-      expect(ctx.res).to.be.eq(res);
+      expect(ctx.container).to.be.eq(cont);
+      expect(ctx.request).to.be.eq(req);
+      expect(ctx.response).to.be.eq(res);
     });
 
     it('sets an empty object to the "meta" property', function () {

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

@@ -33,7 +33,7 @@ export declare class RouteRegistry extends DebuggableService {
   /**
    * Match route by request.
    *
-   * @param req
+   * @param request
    */
-  matchRouteByRequest(req: IncomingMessage): ResolvedRoute | undefined;
+  matchRouteByRequest(request: IncomingMessage): ResolvedRoute | undefined;
 }

+ 7 - 7
src/route-registry.js

@@ -52,21 +52,21 @@ export class RouteRegistry extends DebuggableService {
   /**
    * Match route by request.
    *
-   * @param {import('http').IncomingRequest} req
+   * @param {import('http').IncomingRequest} request
    * @returns {ResolvedRoute|undefined}
    */
-  matchRouteByRequest(req) {
+  matchRouteByRequest(request) {
     const debug = this.getDebuggerFor(this.matchRouteByRequest);
-    const requestPath = (req.url || '/').replace(/\?.*$/, '');
+    const requestPath = (request.url || '/').replace(/\?.*$/, '');
     debug(
       'Matching routes with the request %s %v.',
-      req.method.toUpperCase(),
+      request.method.toUpperCase(),
       requestPath,
     );
-    const rawTriePath = `${req.method.toUpperCase()}/${requestPath}`;
+    const rawTriePath = `${request.method.toUpperCase()}/${requestPath}`;
     // маршрут формируется с удалением дубликатов косой черты
     // "OPTIONS//api/users/login" => "OPTIONS/api/users/login"
-    const triePath = rawTriePath.replace(/\/+/, '/');
+    const triePath = rawTriePath.replace(/\/+/g, '/');
     const resolved = this._trie.match(triePath);
     if (resolved) {
       const route = resolved.value;
@@ -91,7 +91,7 @@ export class RouteRegistry extends DebuggableService {
     }
     debug(
       'No matched route for the request %s %v.',
-      req.method.toUpperCase(),
+      request.method.toUpperCase(),
       requestPath,
     );
   }

+ 1 - 1
src/route-registry.spec.js

@@ -1,5 +1,5 @@
 import {Route} from './route.js';
-import {expect} from './chai.js';
+import {expect} from 'chai';
 import {HttpMethod} from './route.js';
 import {format} from '@e22m4u/js-format';
 import {RouteRegistry} from './route-registry.js';

+ 1 - 1
src/route.js

@@ -200,7 +200,7 @@ export class Route extends Debuggable {
    */
   handle(context) {
     const debug = this.getDebuggerFor(this.handle);
-    const requestPath = getRequestPathname(context.req);
+    const requestPath = getRequestPathname(context.request);
     debug(
       'Invoking the Route handler for the request %s %v.',
       this.method.toUpperCase(),

+ 1 - 1
src/route.spec.js

@@ -1,5 +1,5 @@
 import {Route} from './route.js';
-import {expect} from './chai.js';
+import {expect} from 'chai';
 import {HttpMethod} from './route.js';
 import {format} from '@e22m4u/js-format';
 import {RouterHookType} from './hooks/index.js';

+ 1 - 1
src/router-options.spec.js

@@ -1,4 +1,4 @@
-import {expect} from './chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {RouterOptions} from './router-options.js';
 

+ 2 - 2
src/senders/data-sender.d.ts

@@ -8,8 +8,8 @@ export declare class DataSender extends DebuggableService {
   /**
    * Send.
    *
-   * @param res
+   * @param response
    * @param data
    */
-  send(res: ServerResponse, data: unknown): void;
+  send(response: ServerResponse, data: unknown): void;
 }

+ 11 - 11
src/senders/data-sender.js

@@ -9,17 +9,17 @@ export class DataSender extends DebuggableService {
   /**
    * Send.
    *
-   * @param {import('http').ServerResponse} res
+   * @param {import('http').ServerResponse} response
    * @param {*} data
    * @returns {undefined}
    */
-  send(res, data) {
+  send(response, data) {
     const debug = this.getDebuggerFor(this.send);
     // если ответ контроллера является объектом
     // ServerResponse, или имеются отправленные
     // заголовки, то считаем, что контроллер
     // уже отправил ответ самостоятельно
-    if (data === res || res.headersSent) {
+    if (data === response || response.headersSent) {
       debug(
         'Response sending was skipped because ' +
           'its headers where sent already.',
@@ -29,16 +29,16 @@ export class DataSender extends DebuggableService {
     // если ответ контроллера пуст, то отправляем
     // статус 204 "No Content"
     if (data == null) {
-      res.statusCode = 204;
-      res.end();
+      response.statusCode = 204;
+      response.end();
       debug('The empty response was sent.');
       return;
     }
     // если ответ контроллера является стримом,
     // то отправляем его как бинарные данные
     if (isReadableStream(data)) {
-      res.setHeader('Content-Type', 'application/octet-stream');
-      data.pipe(res);
+      response.setHeader('Content-Type', 'application/octet-stream');
+      data.pipe(response);
       debug('The stream response was sent.');
       return;
     }
@@ -52,22 +52,22 @@ export class DataSender extends DebuggableService {
         if (Buffer.isBuffer(data)) {
           // тип Buffer отправляется
           // как бинарные данные
-          res.setHeader('content-type', 'application/octet-stream');
+          response.setHeader('content-type', 'application/octet-stream');
           debugMsg = 'The Buffer was sent as binary data.';
         } else {
-          res.setHeader('content-type', 'application/json');
+          response.setHeader('content-type', 'application/json');
           debugMsg = format('The %v was sent as JSON.', typeof data);
           data = JSON.stringify(data);
         }
         break;
       default:
-        res.setHeader('content-type', 'text/plain');
+        response.setHeader('content-type', 'text/plain');
         debugMsg = 'The response data was sent as plain text.';
         data = String(data);
         break;
     }
     // отправка подготовленных данных
-    res.end(data);
+    response.end(data);
     debug(debugMsg);
   }
 }

+ 1 - 1
src/senders/data-sender.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {Readable, Writable} from 'stream';
 import {DataSender} from './data-sender.js';
 import {createResponseMock} from '../utils/index.js';

+ 11 - 6
src/senders/error-sender.d.ts

@@ -2,6 +2,11 @@ import {ServerResponse} from 'http';
 import {IncomingMessage} from 'http';
 import {DebuggableService} from '../debuggable-service.js';
 
+/**
+ * Exposed error properties.
+ */
+export const EXPOSED_ERROR_PROPERTIES: ['code', 'details'];
+
 /**
  * Error sender.
  */
@@ -9,17 +14,17 @@ export declare class ErrorSender extends DebuggableService {
   /**
    * Send.
    *
-   * @param req
-   * @param res
+   * @param request
+   * @param response
    * @param error
    */
-  send(req: IncomingMessage, res: ServerResponse, error: Error): void;
+  send(request: IncomingMessage, response: ServerResponse, error: Error): void;
 
   /**
    * Send 404.
    *
-   * @param req
-   * @param res
+   * @param request
+   * @param response
    */
-  send404(req: IncomingMessage, res: ServerResponse): void;
+  send404(request: IncomingMessage, response: ServerResponse): void;
 }

+ 19 - 19
src/senders/error-sender.js

@@ -17,12 +17,12 @@ export class ErrorSender extends DebuggableService {
   /**
    * Handle.
    *
-   * @param {import('http').IncomingMessage} req
-   * @param {import('http').ServerResponse} res
+   * @param {import('http').IncomingMessage} request
+   * @param {import('http').ServerResponse} response
    * @param {Error} error
    * @returns {undefined}
    */
-  send(req, res, error) {
+  send(request, response, error) {
     const debug = this.getDebuggerFor(this.send);
     let safeError = {};
     if (error) {
@@ -43,9 +43,9 @@ export class ErrorSender extends DebuggableService {
       if (name in safeError) body.error[name] = safeError[name];
     });
     const requestData = {
-      url: req.url,
-      method: req.method,
-      headers: req.headers,
+      url: request.url,
+      method: request.method,
+      headers: request.headers,
     };
     const inspectOptions = {
       showHidden: false,
@@ -60,33 +60,33 @@ export class ErrorSender extends DebuggableService {
     } else {
       console.error(error);
     }
-    res.statusCode = statusCode;
-    res.setHeader('content-type', 'application/json; charset=utf-8');
-    res.end(JSON.stringify(body, null, 2), 'utf-8');
+    response.statusCode = statusCode;
+    response.setHeader('content-type', 'application/json; charset=utf-8');
+    response.end(JSON.stringify(body, null, 2), 'utf-8');
     debug(
       'The %s error was sent for the request %s %v.',
       statusCode,
-      req.method,
-      getRequestPathname(req),
+      request.method,
+      getRequestPathname(request),
     );
   }
 
   /**
    * Send 404.
    *
-   * @param {import('http').IncomingMessage} req
-   * @param {import('http').ServerResponse} res
+   * @param {import('http').IncomingMessage} request
+   * @param {import('http').ServerResponse} response
    * @returns {undefined}
    */
-  send404(req, res) {
+  send404(request, response) {
     const debug = this.getDebuggerFor(this.send404);
-    res.statusCode = 404;
-    res.setHeader('content-type', 'text/plain; charset=utf-8');
-    res.end('404 Not Found', 'utf-8');
+    response.statusCode = 404;
+    response.setHeader('content-type', 'text/plain; charset=utf-8');
+    response.end('404 Not Found', 'utf-8');
     debug(
       'The 404 error was sent for the request %s %v.',
-      req.method,
-      getRequestPathname(req),
+      request.method,
+      getRequestPathname(request),
     );
   }
 }

+ 6 - 3
src/senders/error-sender.spec.js

@@ -1,5 +1,5 @@
 import {Writable} from 'stream';
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import HttpErrors from 'http-errors';
 import {ErrorSender} from './error-sender.js';
 import {createRequestMock} from '../utils/index.js';
@@ -49,8 +49,11 @@ describe('ErrorSender', function () {
         const json = Buffer.concat(chunks).toString('utf-8');
         const data = JSON.parse(json);
         const expectedData = {error: {message: 'Unauthorized'}};
-        EXPOSED_ERROR_PROPERTIES.forEach(name => (expectedData[name] = name));
-        expect(data).not.to.have.property('shouldNotBeExposedProp');
+        EXPOSED_ERROR_PROPERTIES.forEach(
+          name => (expectedData.error[name] = name),
+        );
+        expect(data.error).not.to.have.property('shouldNotBeExposedProp');
+        expect(data).to.be.eql(expectedData);
         expect(res.statusCode).to.be.eq(401);
         const ct = res.getHeader('content-type');
         expect(ct).to.be.eq('application/json; charset=utf-8');

+ 19 - 18
src/trie-router.js

@@ -67,30 +67,31 @@ export class TrieRouter extends DebuggableService {
   /**
    * Handle incoming request.
    *
-   * @param {import('http').IncomingMessage} req
-   * @param {import('http').ServerResponse} res
+   * @param {import('http').IncomingMessage} request
+   * @param {import('http').ServerResponse} response
    * @returns {Promise<undefined>}
    * @private
    */
-  async _handleRequest(req, res) {
+  async _handleRequest(request, response) {
     const debug = this.getDebuggerFor(this._handleRequest);
-    const requestPath = (req.url || '/').replace(/\?.*$/, '');
+    const requestPath = (request.url || '/').replace(/\?.*$/, '');
     debug(
       'Preparing to handle an incoming request %s %v.',
-      req.method,
+      request.method,
       requestPath,
     );
-    const resolved = this.getService(RouteRegistry).matchRouteByRequest(req);
+    const resolved =
+      this.getService(RouteRegistry).matchRouteByRequest(request);
     if (!resolved) {
-      debug('No route for the request %s %v.', req.method, requestPath);
-      this.getService(ErrorSender).send404(req, res);
+      debug('No route for the request %s %v.', request.method, requestPath);
+      this.getService(ErrorSender).send404(request, response);
     } else {
       const {route, params} = resolved;
       // создание дочернего сервис-контейнера для передачи
       // в контекст запроса, что бы родительский контекст
       // нельзя было модифицировать
       const container = new ServiceContainer(this.container);
-      const context = new RequestContext(container, req, res);
+      const context = new RequestContext(container, request, response);
       // чтобы метаданные маршрута были доступны в хуках,
       // их копия устанавливается в контекст запроса
       if (route.meta != null) {
@@ -101,8 +102,8 @@ export class TrieRouter extends DebuggableService {
       container.set(RequestContext, context);
       // регистрация текущего экземпляра IncomingMessage
       // и ServerResponse в сервис-контейнере запроса
-      container.set(IncomingMessage, req);
-      container.set(ServerResponse, res);
+      container.set(IncomingMessage, request);
+      container.set(ServerResponse, response);
       // запись параметров пути в контекст запроса,
       // так как они были определены в момент
       // поиска подходящего роута
@@ -115,7 +116,7 @@ export class TrieRouter extends DebuggableService {
         // разбор тела, заголовков и других данных запроса
         // выполняется отдельным сервисом, после чего результат
         // записывается в контекст передаваемый обработчику
-        const reqDataOrPromise = this.getService(RequestParser).parse(req);
+        const reqDataOrPromise = this.getService(RequestParser).parse(request);
         // результат разбора может являться асинхронным, и вместо
         // того, что бы разрывать поток выполнения, стоит проверить,
         // действительно ли необходимо использование оператора "await"
@@ -135,7 +136,7 @@ export class TrieRouter extends DebuggableService {
         data = hookInvoker.invokeAndContinueUntilValueReceived(
           route,
           RouterHookType.PRE_HANDLER,
-          res,
+          response,
           context,
         );
         if (isPromise(data)) data = await data;
@@ -143,7 +144,7 @@ export class TrieRouter extends DebuggableService {
         // и сами "preHandler" хуки не вернули значения, то вызывается
         // основной обработчик маршрута, результат которого передается
         // в хуки "postHandler"
-        if (!isResponseSent(res) && data == null) {
+        if (!isResponseSent(response) && data == null) {
           data = route.handle(context);
           if (isPromise(data)) data = await data;
           // вызываются хуки "postHandler", результат которых
@@ -151,7 +152,7 @@ export class TrieRouter extends DebuggableService {
           let postHandlerData = hookInvoker.invokeAndContinueUntilValueReceived(
             route,
             RouterHookType.POST_HANDLER,
-            res,
+            response,
             context,
             data,
           );
@@ -160,14 +161,14 @@ export class TrieRouter extends DebuggableService {
           if (postHandlerData != null) data = postHandlerData;
         }
       } catch (error) {
-        this.getService(ErrorSender).send(req, res, error);
+        this.getService(ErrorSender).send(request, response, error);
         return;
       }
       // если ответ не был отправлен во время выполнения
       // хуков и основного обработчика запроса,
       // то результат передается в DataSender
-      if (!isResponseSent(res)) {
-        this.getService(DataSender).send(res, data);
+      if (!isResponseSent(response)) {
+        this.getService(DataSender).send(response, data);
       }
     }
   }

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

@@ -1,5 +1,5 @@
 import {Route} from './route.js';
-import {expect} from './chai.js';
+import {expect} from 'chai';
 import {ServerResponse} from 'http';
 import {IncomingMessage} from 'http';
 import {HttpMethod} from './route.js';
@@ -486,7 +486,7 @@ describe('TrieRouter', function () {
         method: HttpMethod.GET,
         path: '/',
         handler(ctx) {
-          const res = ctx.cont.getRegistered(RequestContext);
+          const res = ctx.container.getRegistered(RequestContext);
           expect(res).to.be.eq(ctx);
           expect(res).to.be.not.eq(router.container);
           done();
@@ -505,7 +505,7 @@ describe('TrieRouter', function () {
         method: HttpMethod.GET,
         path: '/',
         handler(ctx) {
-          const result = ctx.cont.getRegistered(IncomingMessage);
+          const result = ctx.container.getRegistered(IncomingMessage);
           expect(result).to.be.eq(req);
           done();
         },
@@ -521,7 +521,7 @@ describe('TrieRouter', function () {
         method: HttpMethod.GET,
         path: '/',
         handler(ctx) {
-          const result = ctx.cont.getRegistered(ServerResponse);
+          const result = ctx.container.getRegistered(ServerResponse);
           expect(result).to.be.eq(res);
           done();
         },
@@ -561,8 +561,8 @@ describe('TrieRouter', function () {
         preHandler(ctx) {
           return new Promise(resolve => {
             setTimeout(() => {
-              ctx.res.setHeader('Content-Type', 'text/plain');
-              ctx.res.end('Response from preHandler');
+              ctx.response.setHeader('Content-Type', 'text/plain');
+              ctx.response.end('Response from preHandler');
               resolve(undefined);
             }, 10);
           });

+ 1 - 1
src/utils/clone-deep.js

@@ -20,7 +20,7 @@ export function cloneDeep(value) {
   // handle plain objects (literals) by recursively cloning properties
   const proto = Object.getPrototypeOf(value);
   if (proto === Object.prototype || proto === null) {
-    const newObj = {};
+    const newObj = proto === null ? Object.create(null) : {};
     for (const key in value) {
       // ensure we only copy own properties
       if (Object.prototype.hasOwnProperty.call(value, key)) {

+ 1 - 1
src/utils/clone-deep.spec.js

@@ -96,7 +96,7 @@ describe('cloneDeep', function () {
       const cloned = cloneDeep(original);
       expect(cloned).to.be.eql(original);
       expect(cloned).to.be.not.eq(original);
-      expect(Object.getPrototypeOf(cloned)).to.not.be.null;
+      expect(Object.getPrototypeOf(cloned)).to.be.null;
     });
   });
 

+ 1 - 1
src/utils/create-cookies-string.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {createCookiesString} from './create-cookies-string.js';
 

+ 1 - 1
src/utils/create-debugger.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {createDebugger} from './create-debugger.js';
 

+ 1 - 1
src/utils/create-error.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {createError} from './create-error.js';
 

+ 11 - 11
src/utils/create-request-mock.js

@@ -136,11 +136,11 @@ export function createRequestMock(patch) {
   // если передан поток, он будет использован
   // в качестве объекта запроса, в противном
   // случае создается новый
-  const req =
+  const request =
     patch.stream ||
     createRequestStream(patch.secure, patch.body, patch.encoding);
-  req.url = createRequestUrl(patch.path || '/', patch.query);
-  req.headers = createRequestHeaders(
+  request.url = createRequestUrl(patch.path || '/', patch.query);
+  request.headers = createRequestHeaders(
     patch.host,
     patch.secure,
     patch.body,
@@ -148,8 +148,8 @@ export function createRequestMock(patch) {
     patch.encoding,
     patch.headers,
   );
-  req.method = (patch.method || 'get').toUpperCase();
-  return req;
+  request.method = (patch.method || 'get').toUpperCase();
+  return request;
 }
 
 /**
@@ -172,22 +172,22 @@ function createRequestStream(secure, body, encoding) {
   // использует обертка TLSSocket
   let socket = new Socket();
   if (secure) socket = new TLSSocket(socket);
-  const req = new IncomingMessage(socket);
+  const request = new IncomingMessage(socket);
   // тело запроса должно являться
   // строкой или бинарными данными
   if (body != null) {
     if (typeof body === 'string') {
-      req.push(body, encoding);
+      request.push(body, encoding);
     } else if (Buffer.isBuffer(body)) {
-      req.push(body);
+      request.push(body);
     } else {
-      req.push(JSON.stringify(body));
+      request.push(JSON.stringify(body));
     }
   }
   // передача "null" определяет
   // конец данных
-  req.push(null);
-  return req;
+  request.push(null);
+  return request;
 }
 
 /**

+ 1 - 1
src/utils/create-request-mock.spec.js

@@ -1,7 +1,7 @@
 import {Socket} from 'net';
 import {Stream} from 'stream';
 import {TLSSocket} from 'tls';
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {createRequestMock} from './create-request-mock.js';
 import {CHARACTER_ENCODING_LIST} from './fetch-request-body.js';

+ 2 - 1
src/utils/create-response-mock.d.ts

@@ -6,7 +6,8 @@ import {ServerResponse} from 'http';
 export type ServerResponseMock = ServerResponse & {
   _headersSent: boolean;
   _headers: {[name: string]: string | undefined};
-  getEncoding(encoding: BufferEncoding): ServerResponseMock;
+  setEncoding(encoding: string): ServerResponseMock;
+  getEncoding(): string | undefined;
   getBody(): Promise<string>;
 };
 

+ 30 - 30
src/utils/create-response-mock.js

@@ -6,32 +6,32 @@ import {PassThrough} from 'stream';
  * @returns {import('http').ServerResponse}
  */
 export function createResponseMock() {
-  const res = new PassThrough();
-  patchEncoding(res);
-  patchHeaders(res);
-  patchBody(res);
-  return res;
+  const response = new PassThrough();
+  patchEncoding(response);
+  patchHeaders(response);
+  patchBody(response);
+  return response;
 }
 
 /**
  * Patch encoding.
  *
- * @param {object} res
+ * @param {object} response
  */
-function patchEncoding(res) {
-  Object.defineProperty(res, '_encoding', {
+function patchEncoding(response) {
+  Object.defineProperty(response, '_encoding', {
     configurable: true,
     writable: true,
     value: undefined,
   });
-  Object.defineProperty(res, 'setEncoding', {
+  Object.defineProperty(response, 'setEncoding', {
     configurable: true,
     value: function (enc) {
       this._encoding = enc;
       return this;
     },
   });
-  Object.defineProperty(res, 'getEncoding', {
+  Object.defineProperty(response, 'getEncoding', {
     configurable: true,
     value: function () {
       return this._encoding;
@@ -42,26 +42,26 @@ function patchEncoding(res) {
 /**
  * Patch headers.
  *
- * @param {object} res
+ * @param {object} response
  */
-function patchHeaders(res) {
-  Object.defineProperty(res, '_headersSent', {
+function patchHeaders(response) {
+  Object.defineProperty(response, '_headersSent', {
     configurable: true,
     writable: true,
     value: false,
   });
-  Object.defineProperty(res, 'headersSent', {
+  Object.defineProperty(response, 'headersSent', {
     configurable: true,
     get() {
       return this._headersSent;
     },
   });
-  Object.defineProperty(res, '_headers', {
+  Object.defineProperty(response, '_headers', {
     configurable: true,
     writable: true,
     value: {},
   });
-  Object.defineProperty(res, 'setHeader', {
+  Object.defineProperty(response, 'setHeader', {
     configurable: true,
     value: function (name, value) {
       if (this.headersSent)
@@ -74,13 +74,13 @@ function patchHeaders(res) {
       return this;
     },
   });
-  Object.defineProperty(res, 'getHeader', {
+  Object.defineProperty(response, 'getHeader', {
     configurable: true,
     value: function (name) {
       return this._headers[name.toLowerCase()];
     },
   });
-  Object.defineProperty(res, 'getHeaders', {
+  Object.defineProperty(response, 'getHeaders', {
     configurable: true,
     value: function () {
       return JSON.parse(JSON.stringify(this._headers));
@@ -91,30 +91,30 @@ function patchHeaders(res) {
 /**
  * Patch body.
  *
- * @param {object} res
+ * @param {object} response
  */
-function patchBody(res) {
+function patchBody(response) {
   let resolve, reject;
-  const promise = new Promise((res, rej) => {
-    resolve = res;
+  const promise = new Promise((rsv, rej) => {
+    resolve = rsv;
     reject = rej;
   });
   const data = [];
-  res.on('data', c => data.push(c));
-  res.on('error', e => reject(e));
-  res.on('end', () => {
+  response.on('data', c => data.push(c));
+  response.on('error', e => reject(e));
+  response.on('end', () => {
     resolve(Buffer.concat(data));
   });
   // флаг _headersSent должен быть установлен синхронно
-  // после вызова метода res.end, так как асинхронная
-  // установка (к примеру в res.on('end')) не позволит
+  // после вызова метода response.end, так как асинхронная
+  // установка (к примеру в response.on('end')) не позволит
   // отследить отправку ответа при синхронном выполнении
-  const originalEnd = res.end.bind(res);
-  res.end = function (...args) {
+  const originalEnd = response.end.bind(response);
+  response.end = function (...args) {
     this._headersSent = true;
     return originalEnd(...args);
   };
-  Object.defineProperty(res, 'getBody', {
+  Object.defineProperty(response, 'getBody', {
     configurable: true,
     value: function () {
       return promise.then(buffer => {

+ 1 - 1
src/utils/create-response-mock.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {PassThrough} from 'stream';
 import {createResponseMock} from './create-response-mock.js';
 

+ 2 - 2
src/utils/fetch-request-body.d.ts

@@ -17,10 +17,10 @@ export const CHARACTER_ENCODING_LIST: (
 /**
  * Fetch request body.
  *
- * @param req
+ * @param request
  * @param bodyBytesLimit
  */
 export declare function fetchRequestBody(
-  req: IncomingMessage,
+  request: IncomingMessage,
   bodyBytesLimit?: number,
 ): Promise<string>;

+ 16 - 13
src/utils/fetch-request-body.js

@@ -21,16 +21,16 @@ export const CHARACTER_ENCODING_LIST = [
 /**
  * Fetch request body.
  *
- * @param {IncomingMessage} req
+ * @param {IncomingMessage} request
  * @param {number} bodyBytesLimit
  * @returns {Promise<string|undefined>}
  */
-export function fetchRequestBody(req, bodyBytesLimit = 0) {
-  if (!(req instanceof IncomingMessage))
+export function fetchRequestBody(request, bodyBytesLimit = 0) {
+  if (!(request instanceof IncomingMessage))
     throw new Errorf(
       'The first parameter of "fetchRequestBody" should be ' +
         'an IncomingMessage instance, but %v was given.',
-      req,
+      request,
     );
   if (typeof bodyBytesLimit !== 'number')
     throw new Errorf(
@@ -42,7 +42,10 @@ export function fetchRequestBody(req, bodyBytesLimit = 0) {
     // сравнение внутреннего ограничения
     // размера тела запроса с заголовком
     // "content-length"
-    const contentLength = parseInt(req.headers['content-length'] || '0', 10);
+    const contentLength = parseInt(
+      request.headers['content-length'] || '0',
+      10,
+    );
     if (bodyBytesLimit && contentLength && contentLength > bodyBytesLimit)
       throw createError(
         HttpErrors.PayloadTooLarge,
@@ -53,7 +56,7 @@ export function fetchRequestBody(req, bodyBytesLimit = 0) {
     // определение кодировки
     // по заголовку "content-type"
     let encoding = 'utf-8';
-    const contentType = req.headers['content-type'] || '';
+    const contentType = request.headers['content-type'] || '';
     if (contentType) {
       const parsedContentType = parseContentType(contentType);
       if (parsedContentType && parsedContentType.charset) {
@@ -75,7 +78,7 @@ export function fetchRequestBody(req, bodyBytesLimit = 0) {
     const onData = chunk => {
       receivedLength += chunk.length;
       if (bodyBytesLimit && receivedLength > bodyBytesLimit) {
-        req.removeAllListeners();
+        request.removeAllListeners();
         const error = createError(
           HttpErrors.PayloadTooLarge,
           'Request body limit is %v bytes, but %v bytes given.',
@@ -91,7 +94,7 @@ export function fetchRequestBody(req, bodyBytesLimit = 0) {
     // обработчики событий, и сравнить полученный объем
     // данных с заявленным в заголовке "content-length"
     const onEnd = () => {
-      req.removeAllListeners();
+      request.removeAllListeners();
       if (contentLength && contentLength !== receivedLength) {
         const error = createError(
           HttpErrors.BadRequest,
@@ -112,15 +115,15 @@ export function fetchRequestBody(req, bodyBytesLimit = 0) {
     // и отклоняется ожидающий Promise
     // ошибкой с кодом 400
     const onError = error => {
-      req.removeAllListeners();
+      request.removeAllListeners();
       reject(HttpErrors(400, error));
     };
     // добавление обработчиков прослушивающих
     // события входящего запроса и возобновление
     // потока данных
-    req.on('data', onData);
-    req.on('end', onEnd);
-    req.on('error', onError);
-    req.resume();
+    request.on('data', onData);
+    request.on('end', onEnd);
+    request.on('error', onError);
+    request.resume();
   });
 }

+ 1 - 1
src/utils/fetch-request-body.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {fetchRequestBody} from './fetch-request-body.js';
 import {createRequestMock} from './create-request-mock.js';

+ 2 - 2
src/utils/get-request-pathname.d.ts

@@ -3,6 +3,6 @@ import {IncomingMessage} from 'http';
 /**
  * Get request pathname.
  *
- * @param req
+ * @param request
  */
-export declare function getRequestPathname(req: IncomingMessage): string;
+export declare function getRequestPathname(request: IncomingMessage): string;

+ 8 - 8
src/utils/get-request-pathname.js

@@ -3,21 +3,21 @@ import {Errorf} from '@e22m4u/js-format';
 /**
  * Get request pathname.
  *
- * @param {import('http').IncomingMessage} req
+ * @param {import('http').IncomingMessage} request
  * @returns {string}
  */
-export function getRequestPathname(req) {
+export function getRequestPathname(request) {
   if (
-    !req ||
-    typeof req !== 'object' ||
-    Array.isArray(req) ||
-    typeof req.url !== 'string'
+    !request ||
+    typeof request !== 'object' ||
+    Array.isArray(request) ||
+    typeof request.url !== 'string'
   ) {
     throw new Errorf(
       'The first argument of "getRequestPathname" should be ' +
         'an instance of IncomingMessage, but %v was given.',
-      req,
+      request,
     );
   }
-  return (req.url || '/').replace(/\?.*$/, '');
+  return (request.url || '/').replace(/\?.*$/, '');
 }

+ 1 - 1
src/utils/get-request-pathname.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {getRequestPathname} from './get-request-pathname.js';
 

+ 1 - 1
src/utils/is-promise.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {isPromise} from './is-promise.js';
 
 describe('isPromise', function () {

+ 1 - 1
src/utils/is-readable-stream.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {Readable} from 'stream';
 import {isReadableStream} from './is-readable-stream.js';
 

+ 2 - 2
src/utils/is-response-sent.d.ts

@@ -3,6 +3,6 @@ import {ServerResponse} from 'http';
 /**
  * Is response sent.
  *
- * @param res
+ * @param response
  */
-export declare function isResponseSent(res: ServerResponse): boolean;
+export declare function isResponseSent(response: ServerResponse): boolean;

+ 8 - 8
src/utils/is-response-sent.js

@@ -3,21 +3,21 @@ import {Errorf} from '@e22m4u/js-format';
 /**
  * Is response sent.
  *
- * @param {import('http').ServerResponse} res
+ * @param {import('http').ServerResponse} response
  * @returns {boolean}
  */
-export function isResponseSent(res) {
+export function isResponseSent(response) {
   if (
-    !res ||
-    typeof res !== 'object' ||
-    Array.isArray(res) ||
-    typeof res.headersSent !== 'boolean'
+    !response ||
+    typeof response !== 'object' ||
+    Array.isArray(response) ||
+    typeof response.headersSent !== 'boolean'
   ) {
     throw new Errorf(
       'The first argument of "isResponseSent" should be ' +
         'an instance of ServerResponse, but %v was given.',
-      res,
+      response,
     );
   }
-  return res.headersSent;
+  return response.headersSent;
 }

+ 1 - 1
src/utils/is-response-sent.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {isResponseSent} from './is-response-sent.js';
 

+ 1 - 1
src/utils/is-writable-stream.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {Writable} from 'stream';
 import {isWritableStream} from './is-writable-stream.js';
 

+ 1 - 1
src/utils/parse-content-type.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {parseContentType} from './parse-content-type.js';
 
 describe('parseContentType', function () {

+ 1 - 1
src/utils/parse-cookies.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {parseCookies} from './parse-cookies.js';
 

+ 1 - 1
src/utils/to-camel-case.spec.js

@@ -1,4 +1,4 @@
-import {expect} from '../chai.js';
+import {expect} from 'chai';
 import {format} from '@e22m4u/js-format';
 import {toCamelCase} from './to-camel-case.js';