11import { ClearRequest } from 'src/ClearRequest'
22import { ApiResourceMiddleware , ControllerAction , HttpMethod } from 'types/basic'
33import { H3App , Handler , HttpContext , Middleware , RouteHandler } from 'types/h3'
4+ import { AsyncLocalStorage } from 'node:async_hooks'
45
56import { getQuery , getRouterParams , readBody , type H3 } from 'h3'
67import { Controller } from 'src/Controller'
@@ -13,6 +14,11 @@ import { Route } from 'src/Route'
1314 * @repository https://github.com/toneflix/clear-router
1415 */
1516export class Router {
17+ private static readonly groupContext = new AsyncLocalStorage < {
18+ prefix : string
19+ groupMiddlewares : Middleware [ ]
20+ } > ( )
21+
1622 /**
1723 * All registered routes
1824 */
@@ -68,19 +74,23 @@ export class Router {
6874 handler : Handler ,
6975 middlewares ?: Middleware [ ] | Middleware
7076 ) : void {
77+ const context = this . groupContext . getStore ( )
78+ const activePrefix = context ?. prefix ?? this . prefix
79+ const activeGroupMiddlewares = context ?. groupMiddlewares ?? this . groupMiddlewares
80+
7181 methods = Array . isArray ( methods ) ? methods : [ methods ]
7282 middlewares = middlewares
7383 ? ( Array . isArray ( middlewares ) ? middlewares : [ middlewares ] )
7484 : undefined
7585
7686
77- const fullPath = this . normalizePath ( `${ this . prefix } /${ path } ` )
87+ const fullPath = this . normalizePath ( `${ activePrefix } /${ path } ` )
7888
7989 const route = new Route < HttpContext , Middleware > (
8090 methods . includes ( 'options' ) ? methods : methods . concat ( 'options' ) ,
8191 fullPath ,
8292 handler ,
83- [ ...this . globalMiddlewares , ...this . groupMiddlewares , ...( middlewares || [ ] ) ]
93+ [ ...this . globalMiddlewares , ...activeGroupMiddlewares , ...( middlewares || [ ] ) ]
8494 )
8595
8696 if (
@@ -231,22 +241,22 @@ export class Router {
231241 callback : ( ) => void | Promise < void > ,
232242 middlewares ?: Middleware [ ]
233243 ) : Promise < void > {
234- const previousPrefix = this . prefix
235- const previousMiddlewares = this . groupMiddlewares
244+ const context = this . groupContext . getStore ( )
245+ const previousPrefix = context ?. prefix ?? this . prefix
246+ const previousMiddlewares = context ?. groupMiddlewares ?? this . groupMiddlewares
236247
237248 const fullPrefix = [ previousPrefix , prefix ]
238249 . filter ( Boolean )
239250 . join ( '/' )
240251
241- this . prefix = this . normalizePath ( fullPrefix )
242- this . groupMiddlewares = [ ...previousMiddlewares , ...( middlewares || [ ] ) ]
252+ const nextContext = {
253+ prefix : this . normalizePath ( fullPrefix ) ,
254+ groupMiddlewares : [ ...previousMiddlewares , ...( middlewares || [ ] ) ] ,
255+ }
243256
244- try {
257+ await this . groupContext . run ( nextContext , async ( ) => {
245258 await Promise . resolve ( callback ( ) )
246- } finally {
247- this . prefix = previousPrefix
248- this . groupMiddlewares = previousMiddlewares
249- }
259+ } )
250260 }
251261
252262 /**
0 commit comments