@e22m4u/js-trie-router 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -925,6 +925,10 @@ var _Route = class _Route extends import_js_debug.Debuggable {
925
925
  __name(_Route, "Route");
926
926
  var Route = _Route;
927
927
 
928
+ // src/trie-router.js
929
+ var import_http4 = require("http");
930
+ var import_http5 = require("http");
931
+
928
932
  // src/senders/data-sender.js
929
933
  var import_js_format15 = require("@e22m4u/js-format");
930
934
  var _DataSender = class _DataSender extends DebuggableService {
@@ -1619,6 +1623,8 @@ var _TrieRouter = class _TrieRouter extends DebuggableService {
1619
1623
  const container = new import_js_service5.ServiceContainer(this.container);
1620
1624
  const context = new RequestContext(container, req, res);
1621
1625
  container.set(RequestContext, context);
1626
+ container.set(import_http5.IncomingMessage, req);
1627
+ container.set(import_http4.ServerResponse, res);
1622
1628
  context.params = params;
1623
1629
  let data;
1624
1630
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e22m4u/js-trie-router",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "HTTP маршрутизатор для Node.js на основе префиксного дерева",
5
5
  "author": "Mikhail Evstropov <e22m4u@yandex.ru>",
6
6
  "license": "MIT",
@@ -38,10 +38,10 @@
38
38
  "prepare": "husky"
39
39
  },
40
40
  "dependencies": {
41
- "@e22m4u/js-debug": "~0.3.1",
41
+ "@e22m4u/js-debug": "~0.3.2",
42
42
  "@e22m4u/js-format": "~0.2.0",
43
43
  "@e22m4u/js-path-trie": "~0.0.12",
44
- "@e22m4u/js-service": "~0.4.0",
44
+ "@e22m4u/js-service": "~0.4.4",
45
45
  "debug": "~4.4.3",
46
46
  "http-errors": "~2.0.0",
47
47
  "statuses": "~2.0.2"
@@ -49,20 +49,20 @@
49
49
  "devDependencies": {
50
50
  "@commitlint/cli": "~20.1.0",
51
51
  "@commitlint/config-conventional": "~20.0.0",
52
- "@eslint/js": "~9.36.0",
52
+ "@eslint/js": "~9.38.0",
53
53
  "@types/chai-as-promised": "~8.0.2",
54
54
  "c8": "~10.1.3",
55
55
  "chai": "~6.2.0",
56
56
  "chai-as-promised": "~8.0.2",
57
- "esbuild": "~0.25.10",
58
- "eslint": "~9.36.0",
57
+ "esbuild": "~0.25.11",
58
+ "eslint": "~9.38.0",
59
59
  "eslint-config-prettier": "~10.1.8",
60
60
  "eslint-plugin-chai-expect": "~3.1.0",
61
- "eslint-plugin-jsdoc": "~60.6.0",
62
- "eslint-plugin-mocha": "~11.1.0",
61
+ "eslint-plugin-jsdoc": "~61.1.10",
62
+ "eslint-plugin-mocha": "~11.2.0",
63
63
  "globals": "~16.4.0",
64
64
  "husky": "~9.1.7",
65
- "mocha": "~11.7.3",
65
+ "mocha": "~11.7.4",
66
66
  "prettier": "~3.6.2",
67
67
  "rimraf": "~6.0.1",
68
68
  "typescript": "~5.9.3"
@@ -1,4 +1,5 @@
1
1
  import {Callable} from '../types.js';
2
+ import {RequestContext} from '../request-context.js';
2
3
  import {DebuggableService} from '../debuggable-service.js';
3
4
 
4
5
  /**
@@ -17,12 +18,38 @@ export type HookType = (typeof HookType)[keyof typeof HookType];
17
18
  /**
18
19
  * Router hook.
19
20
  */
20
- export type RouterHook<T = unknown> = Callable<T>;
21
+ export type RouterHook = Callable;
22
+
23
+ /**
24
+ * Pre handler hook.
25
+ */
26
+ export type PreHandlerHook = (ctx: RequestContext) => unknown;
27
+
28
+ /**
29
+ * Post handler hook.
30
+ */
31
+ export type PostHandlerHook = (ctx: RequestContext, data: unknown) => unknown;
21
32
 
22
33
  /**
23
34
  * Hook registry.
24
35
  */
25
36
  export declare class HookRegistry extends DebuggableService {
37
+ /**
38
+ * Add hook.
39
+ *
40
+ * @param type
41
+ * @param hook
42
+ */
43
+ addHook(type: typeof HookType.PRE_HANDLER, hook: PreHandlerHook): this;
44
+
45
+ /**
46
+ * Add hook.
47
+ *
48
+ * @param type
49
+ * @param hook
50
+ */
51
+ addHook(type: typeof HookType.POST_HANDLER, hook: PostHandlerHook): this;
52
+
26
53
  /**
27
54
  * Add hook.
28
55
  *
@@ -1,10 +1,15 @@
1
1
  import {Route} from './route.js';
2
2
  import {RequestListener} from 'http';
3
- import {HookType} from './hooks/index.js';
4
3
  import {RouteDefinition} from './route.js';
5
- import {RouterHook} from './hooks/index.js';
6
4
  import {DebuggableService} from './debuggable-service.js';
7
5
 
6
+ import {
7
+ HookType,
8
+ RouterHook,
9
+ PostHandlerHook,
10
+ PreHandlerHook,
11
+ } from './hooks/index.js';
12
+
8
13
  /**
9
14
  * Trie router.
10
15
  */
@@ -56,6 +61,22 @@ export declare class TrieRouter extends DebuggableService {
56
61
  */
57
62
  get requestListener(): RequestListener;
58
63
 
64
+ /**
65
+ * Add hook.
66
+ *
67
+ * @param type
68
+ * @param hook
69
+ */
70
+ addHook(type: typeof HookType.PRE_HANDLER, hook: PreHandlerHook): this;
71
+
72
+ /**
73
+ * Add hook.
74
+ *
75
+ * @param type
76
+ * @param hook
77
+ */
78
+ addHook(type: typeof HookType.POST_HANDLER, hook: PostHandlerHook): this;
79
+
59
80
  /**
60
81
  * Add hook.
61
82
  *
@@ -1,9 +1,12 @@
1
+ import {ServerResponse} from 'http';
2
+ import {IncomingMessage} from 'http';
1
3
  import {HookType} from './hooks/index.js';
2
- import {isPromise, isResponseSent} from './utils/index.js';
4
+ import {isPromise} from './utils/index.js';
3
5
  import {HookInvoker} from './hooks/index.js';
4
6
  import {DataSender} from './senders/index.js';
5
7
  import {HookRegistry} from './hooks/index.js';
6
8
  import {ErrorSender} from './senders/index.js';
9
+ import {isResponseSent} from './utils/index.js';
7
10
  import {RequestParser} from './parsers/index.js';
8
11
  import {RouteRegistry} from './route-registry.js';
9
12
  import {RequestContext} from './request-context.js';
@@ -94,8 +97,12 @@ export class TrieRouter extends DebuggableService {
94
97
  const container = new ServiceContainer(this.container);
95
98
  const context = new RequestContext(container, req, res);
96
99
  // регистрация контекста запроса в сервис-контейнере
97
- // для удобного доступа через container.getRegistered(RequestContext)
100
+ // для доступа через container.getRegistered(RequestContext)
98
101
  container.set(RequestContext, context);
102
+ // регистрация текущего экземпляра IncomingMessage
103
+ // и ServerResponse в сервис-контейнере запроса
104
+ container.set(IncomingMessage, req);
105
+ container.set(ServerResponse, res);
99
106
  // запись параметров пути в контекст запроса,
100
107
  // так как они были определены в момент
101
108
  // поиска подходящего роута
@@ -1,5 +1,7 @@
1
1
  import {Route} from './route.js';
2
2
  import {expect} from './chai.js';
3
+ import {ServerResponse} from 'http';
4
+ import {IncomingMessage} from 'http';
3
5
  import {HttpMethod} from './route.js';
4
6
  import {HookType} from './hooks/index.js';
5
7
  import {TrieRouter} from './trie-router.js';
@@ -473,6 +475,38 @@ describe('TrieRouter', function () {
473
475
  router.requestListener(req, res);
474
476
  });
475
477
 
478
+ it('should register the IncomingMessage in the request-scope ServiceContainer', function (done) {
479
+ const router = new TrieRouter();
480
+ const req = createRequestMock();
481
+ const res = createResponseMock();
482
+ router.defineRoute({
483
+ method: HttpMethod.GET,
484
+ path: '/',
485
+ handler(ctx) {
486
+ const result = ctx.container.getRegistered(IncomingMessage);
487
+ expect(result).to.be.eq(req);
488
+ done();
489
+ },
490
+ });
491
+ router.requestListener(req, res);
492
+ });
493
+
494
+ it('should register the ServerResponse in the request-scope ServiceContainer', function (done) {
495
+ const router = new TrieRouter();
496
+ const req = createRequestMock();
497
+ const res = createResponseMock();
498
+ router.defineRoute({
499
+ method: HttpMethod.GET,
500
+ path: '/',
501
+ handler(ctx) {
502
+ const result = ctx.container.getRegistered(ServerResponse);
503
+ expect(result).to.be.eq(res);
504
+ done();
505
+ },
506
+ });
507
+ router.requestListener(req, res);
508
+ });
509
+
476
510
  it('should send parsing error response instead of throwing error', async function () {
477
511
  const router = new TrieRouter();
478
512
  router.defineRoute({