Browse Source

feat: adds IncomingMessage and ServerResponse to request container

e22m4u 1 month ago
parent
commit
c999b03292
4 changed files with 51 additions and 4 deletions
  1. 6 0
      dist/cjs/index.cjs
  2. 2 2
      package.json
  3. 9 2
      src/trie-router.js
  4. 34 0
      src/trie-router.spec.js

+ 6 - 0
dist/cjs/index.cjs

@@ -925,6 +925,10 @@ var _Route = class _Route extends import_js_debug.Debuggable {
 __name(_Route, "Route");
 var Route = _Route;
 
+// src/trie-router.js
+var import_http4 = require("http");
+var import_http5 = require("http");
+
 // src/senders/data-sender.js
 var import_js_format15 = require("@e22m4u/js-format");
 var _DataSender = class _DataSender extends DebuggableService {
@@ -1619,6 +1623,8 @@ var _TrieRouter = class _TrieRouter extends DebuggableService {
       const container = new import_js_service5.ServiceContainer(this.container);
       const context = new RequestContext(container, req, res);
       container.set(RequestContext, context);
+      container.set(import_http5.IncomingMessage, req);
+      container.set(import_http4.ServerResponse, res);
       context.params = params;
       let data;
       try {

+ 2 - 2
package.json

@@ -41,7 +41,7 @@
     "@e22m4u/js-debug": "~0.3.1",
     "@e22m4u/js-format": "~0.2.0",
     "@e22m4u/js-path-trie": "~0.0.12",
-    "@e22m4u/js-service": "~0.4.2",
+    "@e22m4u/js-service": "~0.4.3",
     "debug": "~4.4.3",
     "http-errors": "~2.0.0",
     "statuses": "~2.0.2"
@@ -58,7 +58,7 @@
     "eslint": "~9.37.0",
     "eslint-config-prettier": "~10.1.8",
     "eslint-plugin-chai-expect": "~3.1.0",
-    "eslint-plugin-jsdoc": "~61.0.0",
+    "eslint-plugin-jsdoc": "~61.1.1",
     "eslint-plugin-mocha": "~11.2.0",
     "globals": "~16.4.0",
     "husky": "~9.1.7",

+ 9 - 2
src/trie-router.js

@@ -1,9 +1,12 @@
+import {ServerResponse} from 'http';
+import {IncomingMessage} from 'http';
 import {HookType} from './hooks/index.js';
-import {isPromise, isResponseSent} from './utils/index.js';
+import {isPromise} from './utils/index.js';
 import {HookInvoker} from './hooks/index.js';
 import {DataSender} from './senders/index.js';
 import {HookRegistry} from './hooks/index.js';
 import {ErrorSender} from './senders/index.js';
+import {isResponseSent} from './utils/index.js';
 import {RequestParser} from './parsers/index.js';
 import {RouteRegistry} from './route-registry.js';
 import {RequestContext} from './request-context.js';
@@ -94,8 +97,12 @@ export class TrieRouter extends DebuggableService {
       const container = new ServiceContainer(this.container);
       const context = new RequestContext(container, req, res);
       // регистрация контекста запроса в сервис-контейнере
-      // для удобного доступа через container.getRegistered(RequestContext)
+      // для доступа через container.getRegistered(RequestContext)
       container.set(RequestContext, context);
+      // регистрация текущего экземпляра IncomingMessage
+      // и ServerResponse в сервис-контейнере запроса
+      container.set(IncomingMessage, req);
+      container.set(ServerResponse, res);
       // запись параметров пути в контекст запроса,
       // так как они были определены в момент
       // поиска подходящего роута

+ 34 - 0
src/trie-router.spec.js

@@ -1,5 +1,7 @@
 import {Route} from './route.js';
 import {expect} from './chai.js';
+import {ServerResponse} from 'http';
+import {IncomingMessage} from 'http';
 import {HttpMethod} from './route.js';
 import {HookType} from './hooks/index.js';
 import {TrieRouter} from './trie-router.js';
@@ -473,6 +475,38 @@ describe('TrieRouter', function () {
       router.requestListener(req, res);
     });
 
+    it('should register the IncomingMessage in the request-scope ServiceContainer', function (done) {
+      const router = new TrieRouter();
+      const req = createRequestMock();
+      const res = createResponseMock();
+      router.defineRoute({
+        method: HttpMethod.GET,
+        path: '/',
+        handler(ctx) {
+          const result = ctx.container.getRegistered(IncomingMessage);
+          expect(result).to.be.eq(req);
+          done();
+        },
+      });
+      router.requestListener(req, res);
+    });
+
+    it('should register the ServerResponse in the request-scope ServiceContainer', function (done) {
+      const router = new TrieRouter();
+      const req = createRequestMock();
+      const res = createResponseMock();
+      router.defineRoute({
+        method: HttpMethod.GET,
+        path: '/',
+        handler(ctx) {
+          const result = ctx.container.getRegistered(ServerResponse);
+          expect(result).to.be.eq(res);
+          done();
+        },
+      });
+      router.requestListener(req, res);
+    });
+
     it('should send parsing error response instead of throwing error', async function () {
       const router = new TrieRouter();
       router.defineRoute({