[{"data":1,"prerenderedAt":1543},["ShallowReactive",2],{"navigation":3,"docs-path-index":152,"-docs-core-features-middlewares":198,"-docs-core-features-middlewares-surround":1538},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":52},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,26,53,138],{"title":11,"path":12,"stem":13,"children":14,"icon":25},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples","i-lucide-rocket",{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":52},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[32,36,40,44,48],{"title":33,"path":34,"stem":35},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":37,"path":38,"stem":39},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":41,"path":42,"stem":43},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":45,"path":46,"stem":47},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":49,"path":50,"stem":51},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",false,{"title":54,"icon":55,"defaultOpen":56,"path":57,"stem":58,"children":59,"page":52},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[60,77,93,109,123,134],{"title":61,"icon":52,"defaultOpen":52,"path":62,"stem":63,"children":64,"page":52},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[65,69,73],{"title":66,"path":67,"stem":68},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":70,"path":71,"stem":72},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":74,"path":75,"stem":76},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":78,"icon":52,"defaultOpen":52,"path":79,"stem":80,"children":81,"page":52},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[82,85,89],{"title":66,"path":83,"stem":84},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":86,"path":87,"stem":88},"Drivers","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":90,"path":91,"stem":92},"API","\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":94,"icon":52,"defaultOpen":52,"path":95,"stem":96,"children":97,"page":52},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[98,101,105],{"title":66,"path":99,"stem":100},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":102,"path":103,"stem":104},"AWS Lambda","\u002Fdocs\u002Fmodules\u002Fserverless\u002Faws-lambda","docs\u002F3.modules\u002F3.serverless\u002F1.aws-lambda",{"title":106,"path":107,"stem":108},"Azure Functions","\u002Fdocs\u002Fmodules\u002Fserverless\u002Fazure-functions","docs\u002F3.modules\u002F3.serverless\u002F2.azure-functions",{"title":110,"icon":52,"defaultOpen":52,"path":111,"stem":112,"children":113,"page":52},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[114,117,120],{"title":66,"path":115,"stem":116},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":86,"path":118,"stem":119},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":90,"path":121,"stem":122},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":124,"icon":52,"defaultOpen":52,"path":125,"stem":126,"children":127,"page":52},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[128,131],{"title":66,"path":129,"stem":130},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":90,"path":132,"stem":133},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":135,"path":136,"stem":137},"MCP","\u002Fdocs\u002Fmodules\u002Fmcp","docs\u002F3.modules\u002F6.mcp",{"title":139,"icon":140,"defaultOpen":52,"path":141,"stem":142,"children":143,"page":52},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[144,148],{"title":145,"path":146,"stem":147},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":149,"path":150,"stem":151},"Custom Plugin","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",[153,155,157,158,159,160,162,163,164,165,166,167,169,171,172,173,174,176,177,178,179,181,182,183,184,186,187,188,189,191,192,193,194,196,197],{"path":154},"\u002Fdocs\u002F.navigation",{"path":156},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":161},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":34},{"path":38},{"path":42},{"path":46},{"path":50},{"path":168},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":170},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":67},{"path":71},{"path":75},{"path":175},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":83},{"path":87},{"path":91},{"path":180},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":99},{"path":103},{"path":107},{"path":185},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":115},{"path":118},{"path":121},{"path":190},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":129},{"path":132},{"path":136},{"path":195},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":146},{"path":150},{"id":199,"title":45,"body":200,"description":1533,"extension":1534,"links":1533,"meta":1535,"navigation":56,"path":46,"seo":1536,"stem":47,"__hash__":1537},"docs\u002Fdocs\u002F2.core-features\u002F3.middlewares.md",{"type":201,"value":202,"toc":1524},"minimark",[203,207,210,215,231,237,247,658,674,679,684,1050,1061,1079,1083,1090,1093,1209,1213,1216,1226,1342,1353,1357,1363,1366,1517,1520],[204,205,206],"p",{},"Middlewares in Vercube provides a powerful way to handle and modify requests and responses at different levels of your application. They allow you to execute code before or after specific routes, add common functionality across multiple endpoints, or implement cross-cutting concerns like authentication, logging, or error handling.",[204,208,209],{},"The middleware system in Vercube is designed to be flexible and intuitive, while maintaining the framework's high-performance characteristics. Each middleware can access and modify the request and response objects, making it possible to implement various functionalities like request validation, response transformation, or custom header management.",[211,212,214],"h2",{"id":213},"creating-middleware","Creating Middleware",[204,216,217,218,222,223,226,227,230],{},"In Vercube, to create a middleware, you need to create a class that extends ",[219,220,221],"code",{},"BaseMiddleware",". This class provides two methods: ",[219,224,225],{},"onRequest"," and ",[219,228,229],{},"onResponse",", which are invoked at different stages of the request lifecycle.",[232,233,235],"h3",{"id":234},"onrequest",[219,236,225],{},[204,238,239,240,242,243,246],{},"The ",[219,241,225],{}," method is executed before the endpoint handler is called. It allows you to modify the request, validate input data, check user permissions, or interrupt further request processing by returning a ",[219,244,245],{},"Response"," object. This is the ideal place to implement authorization logic, request logging, or preliminary data validation.",[248,249,250,524],"code-group",{},[251,252,258],"pre",{"className":253,"code":254,"filename":255,"language":256,"meta":257,"style":257},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { BaseMiddleware } from '@vercube\u002Fcore';\nimport type { MiddlewareOptions } from '@vercube\u002Fcore';\n\nexport class LoggingMiddleware extends BaseMiddleware {\n\n  public async onRequest(\n    request: Request,\n    response: Response,\n    opts: MiddlewareOptions\n  ): Promise\u003Cvoid> {\n    console.log(`[${new Date().toISOString()}] ${request.method} ${request.url}`);\n  }\n\n}\n\n","LoggingMiddleware.ts","ts","",[219,259,260,296,321,327,349,354,370,386,399,410,430,507,513,518],{"__ignoreMap":257},[261,262,265,269,273,277,280,283,286,290,293],"span",{"class":263,"line":264},"line",1,[261,266,268],{"class":267},"s7zQu","import",[261,270,272],{"class":271},"sMK4o"," {",[261,274,276],{"class":275},"sTEyZ"," BaseMiddleware",[261,278,279],{"class":271}," }",[261,281,282],{"class":267}," from",[261,284,285],{"class":271}," '",[261,287,289],{"class":288},"sfazB","@vercube\u002Fcore",[261,291,292],{"class":271},"'",[261,294,295],{"class":271},";\n",[261,297,299,301,304,306,309,311,313,315,317,319],{"class":263,"line":298},2,[261,300,268],{"class":267},[261,302,303],{"class":267}," type",[261,305,272],{"class":271},[261,307,308],{"class":275}," MiddlewareOptions",[261,310,279],{"class":271},[261,312,282],{"class":267},[261,314,285],{"class":271},[261,316,289],{"class":288},[261,318,292],{"class":271},[261,320,295],{"class":271},[261,322,324],{"class":263,"line":323},3,[261,325,326],{"emptyLinePlaceholder":56},"\n",[261,328,330,333,337,341,344,346],{"class":263,"line":329},4,[261,331,332],{"class":267},"export",[261,334,336],{"class":335},"spNyl"," class",[261,338,340],{"class":339},"sBMFI"," LoggingMiddleware",[261,342,343],{"class":335}," extends",[261,345,276],{"class":339},[261,347,348],{"class":271}," {\n",[261,350,352],{"class":263,"line":351},5,[261,353,326],{"emptyLinePlaceholder":56},[261,355,357,360,363,367],{"class":263,"line":356},6,[261,358,359],{"class":335},"  public",[261,361,362],{"class":335}," async",[261,364,366],{"class":365},"swJcz"," onRequest",[261,368,369],{"class":271},"(\n",[261,371,373,377,380,383],{"class":263,"line":372},7,[261,374,376],{"class":375},"sHdIc","    request",[261,378,379],{"class":271},":",[261,381,382],{"class":339}," Request",[261,384,385],{"class":271},",\n",[261,387,389,392,394,397],{"class":263,"line":388},8,[261,390,391],{"class":375},"    response",[261,393,379],{"class":271},[261,395,396],{"class":339}," Response",[261,398,385],{"class":271},[261,400,402,405,407],{"class":263,"line":401},9,[261,403,404],{"class":375},"    opts",[261,406,379],{"class":271},[261,408,409],{"class":339}," MiddlewareOptions\n",[261,411,413,416,419,422,425,428],{"class":263,"line":412},10,[261,414,415],{"class":271},"  ):",[261,417,418],{"class":339}," Promise",[261,420,421],{"class":271},"\u003C",[261,423,424],{"class":339},"void",[261,426,427],{"class":271},">",[261,429,348],{"class":271},[261,431,433,436,439,443,446,449,452,455,458,461,464,466,469,471,474,477,479,482,484,487,489,492,494,496,499,502,505],{"class":263,"line":432},11,[261,434,435],{"class":275},"    console",[261,437,438],{"class":271},".",[261,440,442],{"class":441},"s2Zo4","log",[261,444,445],{"class":365},"(",[261,447,448],{"class":271},"`",[261,450,451],{"class":288},"[",[261,453,454],{"class":271},"${",[261,456,457],{"class":271},"new",[261,459,460],{"class":441}," Date",[261,462,463],{"class":275},"()",[261,465,438],{"class":271},[261,467,468],{"class":441},"toISOString",[261,470,463],{"class":275},[261,472,473],{"class":271},"}",[261,475,476],{"class":288},"] ",[261,478,454],{"class":271},[261,480,481],{"class":275},"request",[261,483,438],{"class":271},[261,485,486],{"class":275},"method",[261,488,473],{"class":271},[261,490,491],{"class":271}," ${",[261,493,481],{"class":275},[261,495,438],{"class":271},[261,497,498],{"class":275},"url",[261,500,501],{"class":271},"}`",[261,503,504],{"class":365},")",[261,506,295],{"class":271},[261,508,510],{"class":263,"line":509},12,[261,511,512],{"class":271},"  }\n",[261,514,516],{"class":263,"line":515},13,[261,517,326],{"emptyLinePlaceholder":56},[261,519,521],{"class":263,"line":520},14,[261,522,523],{"class":271},"}\n",[251,525,528],{"className":253,"code":526,"filename":527,"language":256,"meta":257,"style":257},"import { Controller, Get, Middleware } from '@vercube\u002Fcore';\nimport { LoggingMiddleware } from '@\u002Fmiddlewares\u002FLoggingMiddleware';\n\n@Controller('\u002Fusers')\n@Middleware(LoggingMiddleware, { logLevel: 'debug' })\nexport class UserController {\n  \u002F\u002F ...\n}\n\n","FooController.ts",[219,529,530,562,583,587,607,637,648,654],{"__ignoreMap":257},[261,531,532,534,536,539,542,545,547,550,552,554,556,558,560],{"class":263,"line":264},[261,533,268],{"class":267},[261,535,272],{"class":271},[261,537,538],{"class":275}," Controller",[261,540,541],{"class":271},",",[261,543,544],{"class":275}," Get",[261,546,541],{"class":271},[261,548,549],{"class":275}," Middleware",[261,551,279],{"class":271},[261,553,282],{"class":267},[261,555,285],{"class":271},[261,557,289],{"class":288},[261,559,292],{"class":271},[261,561,295],{"class":271},[261,563,564,566,568,570,572,574,576,579,581],{"class":263,"line":298},[261,565,268],{"class":267},[261,567,272],{"class":271},[261,569,340],{"class":275},[261,571,279],{"class":271},[261,573,282],{"class":267},[261,575,285],{"class":271},[261,577,578],{"class":288},"@\u002Fmiddlewares\u002FLoggingMiddleware",[261,580,292],{"class":271},[261,582,295],{"class":271},[261,584,585],{"class":263,"line":323},[261,586,326],{"emptyLinePlaceholder":56},[261,588,589,592,595,597,599,602,604],{"class":263,"line":329},[261,590,591],{"class":271},"@",[261,593,594],{"class":441},"Controller",[261,596,445],{"class":275},[261,598,292],{"class":271},[261,600,601],{"class":288},"\u002Fusers",[261,603,292],{"class":271},[261,605,606],{"class":275},")\n",[261,608,609,611,614,617,619,621,624,626,628,631,633,635],{"class":263,"line":351},[261,610,591],{"class":271},[261,612,613],{"class":441},"Middleware",[261,615,616],{"class":275},"(LoggingMiddleware",[261,618,541],{"class":271},[261,620,272],{"class":271},[261,622,623],{"class":365}," logLevel",[261,625,379],{"class":271},[261,627,285],{"class":271},[261,629,630],{"class":288},"debug",[261,632,292],{"class":271},[261,634,279],{"class":271},[261,636,606],{"class":275},[261,638,639,641,643,646],{"class":263,"line":356},[261,640,332],{"class":267},[261,642,336],{"class":335},[261,644,645],{"class":339}," UserController",[261,647,348],{"class":271},[261,649,650],{"class":263,"line":372},[261,651,653],{"class":652},"sHwdD","  \u002F\u002F ...\n",[261,655,656],{"class":263,"line":388},[261,657,523],{"class":271},[659,660,661],"note",{},[204,662,663,664,666,667,669,670,673],{},"If the ",[219,665,225],{}," method returns a ",[219,668,245],{}," object (including ",[219,671,672],{},"FastResponse",") or throws an HTTP error - the endpoint handler will not be invoked.",[232,675,677],{"id":676},"onresponse",[219,678,229],{},[204,680,239,681,683],{},[219,682,229],{}," method is executed after the endpoint handler has been called and returns a response. It allows you to modify the response payload, add custom headers, perform post-processing operations, or implement response logging. This is the ideal place to implement response transformation, final logging, or cleanup operations.",[248,685,686,931],{},[251,687,690],{"className":253,"code":688,"filename":689,"language":256,"meta":257,"style":257},"import { BaseMiddleware } from '@vercube\u002Fcore';\nimport type { MiddlewareOptions } from '@vercube\u002Fcore';\n\ninterface IMyData {\n  name: string;\n  age: number;\n}\n\nexport class ResponseLoggingMiddleware extends BaseMiddleware\u003C{}, IMyData> {\n\n  public async onResponse(\n    request: Request,\n    response: Response,\n    payload: IMyData,\n  ): Promise\u003Cvoid> {\n    console.log(`[${new Date().toISOString()}] Response: ${JSON.stringify(payload)}`);\n  }\n\n}\n","ResponseLoggingMiddleware.ts",[219,691,692,712,734,738,748,760,772,776,780,802,806,817,827,837,848,863,916,921,926],{"__ignoreMap":257},[261,693,694,696,698,700,702,704,706,708,710],{"class":263,"line":264},[261,695,268],{"class":267},[261,697,272],{"class":271},[261,699,276],{"class":275},[261,701,279],{"class":271},[261,703,282],{"class":267},[261,705,285],{"class":271},[261,707,289],{"class":288},[261,709,292],{"class":271},[261,711,295],{"class":271},[261,713,714,716,718,720,722,724,726,728,730,732],{"class":263,"line":298},[261,715,268],{"class":267},[261,717,303],{"class":267},[261,719,272],{"class":271},[261,721,308],{"class":275},[261,723,279],{"class":271},[261,725,282],{"class":267},[261,727,285],{"class":271},[261,729,289],{"class":288},[261,731,292],{"class":271},[261,733,295],{"class":271},[261,735,736],{"class":263,"line":323},[261,737,326],{"emptyLinePlaceholder":56},[261,739,740,743,746],{"class":263,"line":329},[261,741,742],{"class":335},"interface",[261,744,745],{"class":339}," IMyData",[261,747,348],{"class":271},[261,749,750,753,755,758],{"class":263,"line":351},[261,751,752],{"class":365},"  name",[261,754,379],{"class":271},[261,756,757],{"class":339}," string",[261,759,295],{"class":271},[261,761,762,765,767,770],{"class":263,"line":356},[261,763,764],{"class":365},"  age",[261,766,379],{"class":271},[261,768,769],{"class":339}," number",[261,771,295],{"class":271},[261,773,774],{"class":263,"line":372},[261,775,523],{"class":271},[261,777,778],{"class":263,"line":388},[261,779,326],{"emptyLinePlaceholder":56},[261,781,782,784,786,789,791,793,796,798,800],{"class":263,"line":401},[261,783,332],{"class":267},[261,785,336],{"class":335},[261,787,788],{"class":339}," ResponseLoggingMiddleware",[261,790,343],{"class":335},[261,792,276],{"class":339},[261,794,795],{"class":271},"\u003C{},",[261,797,745],{"class":339},[261,799,427],{"class":271},[261,801,348],{"class":271},[261,803,804],{"class":263,"line":412},[261,805,326],{"emptyLinePlaceholder":56},[261,807,808,810,812,815],{"class":263,"line":432},[261,809,359],{"class":335},[261,811,362],{"class":335},[261,813,814],{"class":365}," onResponse",[261,816,369],{"class":271},[261,818,819,821,823,825],{"class":263,"line":509},[261,820,376],{"class":375},[261,822,379],{"class":271},[261,824,382],{"class":339},[261,826,385],{"class":271},[261,828,829,831,833,835],{"class":263,"line":515},[261,830,391],{"class":375},[261,832,379],{"class":271},[261,834,396],{"class":339},[261,836,385],{"class":271},[261,838,839,842,844,846],{"class":263,"line":520},[261,840,841],{"class":375},"    payload",[261,843,379],{"class":271},[261,845,745],{"class":339},[261,847,385],{"class":271},[261,849,851,853,855,857,859,861],{"class":263,"line":850},15,[261,852,415],{"class":271},[261,854,418],{"class":339},[261,856,421],{"class":271},[261,858,424],{"class":339},[261,860,427],{"class":271},[261,862,348],{"class":271},[261,864,866,868,870,872,874,876,878,880,882,884,886,888,890,892,894,897,899,902,904,907,910,912,914],{"class":263,"line":865},16,[261,867,435],{"class":275},[261,869,438],{"class":271},[261,871,442],{"class":441},[261,873,445],{"class":365},[261,875,448],{"class":271},[261,877,451],{"class":288},[261,879,454],{"class":271},[261,881,457],{"class":271},[261,883,460],{"class":441},[261,885,463],{"class":275},[261,887,438],{"class":271},[261,889,468],{"class":441},[261,891,463],{"class":275},[261,893,473],{"class":271},[261,895,896],{"class":288},"] Response: ",[261,898,454],{"class":271},[261,900,901],{"class":275},"JSON",[261,903,438],{"class":271},[261,905,906],{"class":441},"stringify",[261,908,909],{"class":275},"(payload)",[261,911,501],{"class":271},[261,913,504],{"class":365},[261,915,295],{"class":271},[261,917,919],{"class":263,"line":918},17,[261,920,512],{"class":271},[261,922,924],{"class":263,"line":923},18,[261,925,326],{"emptyLinePlaceholder":56},[261,927,929],{"class":263,"line":928},19,[261,930,523],{"class":271},[251,932,934],{"className":253,"code":933,"filename":527,"language":256,"meta":257,"style":257},"import { Controller, Get, Middleware } from '@vercube\u002Fcore';\nimport { ResponseLoggingMiddleware } from '@\u002Fmiddlewares\u002FResponseLoggingMiddleware';\n\n@Controller('\u002Fusers')\n@Middleware(ResponseLoggingMiddleware, { logLevel: 'debug' })\nexport class UserController {\n  \u002F\u002F ...\n}\n",[219,935,936,964,985,989,1005,1032,1042,1046],{"__ignoreMap":257},[261,937,938,940,942,944,946,948,950,952,954,956,958,960,962],{"class":263,"line":264},[261,939,268],{"class":267},[261,941,272],{"class":271},[261,943,538],{"class":275},[261,945,541],{"class":271},[261,947,544],{"class":275},[261,949,541],{"class":271},[261,951,549],{"class":275},[261,953,279],{"class":271},[261,955,282],{"class":267},[261,957,285],{"class":271},[261,959,289],{"class":288},[261,961,292],{"class":271},[261,963,295],{"class":271},[261,965,966,968,970,972,974,976,978,981,983],{"class":263,"line":298},[261,967,268],{"class":267},[261,969,272],{"class":271},[261,971,788],{"class":275},[261,973,279],{"class":271},[261,975,282],{"class":267},[261,977,285],{"class":271},[261,979,980],{"class":288},"@\u002Fmiddlewares\u002FResponseLoggingMiddleware",[261,982,292],{"class":271},[261,984,295],{"class":271},[261,986,987],{"class":263,"line":323},[261,988,326],{"emptyLinePlaceholder":56},[261,990,991,993,995,997,999,1001,1003],{"class":263,"line":329},[261,992,591],{"class":271},[261,994,594],{"class":441},[261,996,445],{"class":275},[261,998,292],{"class":271},[261,1000,601],{"class":288},[261,1002,292],{"class":271},[261,1004,606],{"class":275},[261,1006,1007,1009,1011,1014,1016,1018,1020,1022,1024,1026,1028,1030],{"class":263,"line":351},[261,1008,591],{"class":271},[261,1010,613],{"class":441},[261,1012,1013],{"class":275},"(ResponseLoggingMiddleware",[261,1015,541],{"class":271},[261,1017,272],{"class":271},[261,1019,623],{"class":365},[261,1021,379],{"class":271},[261,1023,285],{"class":271},[261,1025,630],{"class":288},[261,1027,292],{"class":271},[261,1029,279],{"class":271},[261,1031,606],{"class":275},[261,1033,1034,1036,1038,1040],{"class":263,"line":356},[261,1035,332],{"class":267},[261,1037,336],{"class":335},[261,1039,645],{"class":339},[261,1041,348],{"class":271},[261,1043,1044],{"class":263,"line":372},[261,1045,653],{"class":652},[261,1047,1048],{"class":263,"line":388},[261,1049,523],{"class":271},[659,1051,1052],{},[204,1053,239,1054,1056,1057,1060],{},[219,1055,229],{}," method receives the ",[219,1058,1059],{},"payload"," parameter, which is the object returned by the endpoint handler. You can modify this payload or perform operations based on its content.",[1062,1063,1064],"warning",{},[204,1065,1066,1070,1071,669,1073,1075,1076,1078],{},[1067,1068,1069],"strong",{},"Important:"," When an endpoint handler returns a ",[219,1072,245],{},[219,1074,672],{},"), the middleware will be executed but the response object, including its headers, status code, and body, cannot be modified or overridden within the ",[219,1077,229],{}," method.",[211,1080,1082],{"id":1081},"applying-middleware","Applying Middleware",[204,1084,1085,1086,1089],{},"To apply middleware to your endpoint, use the ",[219,1087,1088],{},"@Middleware"," decorator. This decorator can be applied to an entire controller class or to individual methods, giving you fine-grained control over where middleware logic is executed.",[204,1091,1092],{},"When applied at the class level, the middleware will be executed for all endpoints within that controller. When applied at the method level, it will only affect that specific endpoint. You can also combine both approaches - class-level middleware will execute first, followed by method-level middleware, allowing you to create layered middleware chains that handle both general and specific concerns.",[251,1094,1095],{"className":253,"code":526,"filename":527,"language":256,"meta":257,"style":257},[219,1096,1097,1125,1145,1149,1165,1191,1201,1205],{"__ignoreMap":257},[261,1098,1099,1101,1103,1105,1107,1109,1111,1113,1115,1117,1119,1121,1123],{"class":263,"line":264},[261,1100,268],{"class":267},[261,1102,272],{"class":271},[261,1104,538],{"class":275},[261,1106,541],{"class":271},[261,1108,544],{"class":275},[261,1110,541],{"class":271},[261,1112,549],{"class":275},[261,1114,279],{"class":271},[261,1116,282],{"class":267},[261,1118,285],{"class":271},[261,1120,289],{"class":288},[261,1122,292],{"class":271},[261,1124,295],{"class":271},[261,1126,1127,1129,1131,1133,1135,1137,1139,1141,1143],{"class":263,"line":298},[261,1128,268],{"class":267},[261,1130,272],{"class":271},[261,1132,340],{"class":275},[261,1134,279],{"class":271},[261,1136,282],{"class":267},[261,1138,285],{"class":271},[261,1140,578],{"class":288},[261,1142,292],{"class":271},[261,1144,295],{"class":271},[261,1146,1147],{"class":263,"line":323},[261,1148,326],{"emptyLinePlaceholder":56},[261,1150,1151,1153,1155,1157,1159,1161,1163],{"class":263,"line":329},[261,1152,591],{"class":271},[261,1154,594],{"class":441},[261,1156,445],{"class":275},[261,1158,292],{"class":271},[261,1160,601],{"class":288},[261,1162,292],{"class":271},[261,1164,606],{"class":275},[261,1166,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189],{"class":263,"line":351},[261,1168,591],{"class":271},[261,1170,613],{"class":441},[261,1172,616],{"class":275},[261,1174,541],{"class":271},[261,1176,272],{"class":271},[261,1178,623],{"class":365},[261,1180,379],{"class":271},[261,1182,285],{"class":271},[261,1184,630],{"class":288},[261,1186,292],{"class":271},[261,1188,279],{"class":271},[261,1190,606],{"class":275},[261,1192,1193,1195,1197,1199],{"class":263,"line":356},[261,1194,332],{"class":267},[261,1196,336],{"class":335},[261,1198,645],{"class":339},[261,1200,348],{"class":271},[261,1202,1203],{"class":263,"line":372},[261,1204,653],{"class":652},[261,1206,1207],{"class":263,"line":388},[261,1208,523],{"class":271},[211,1210,1212],{"id":1211},"middleware-prioritization","Middleware Prioritization",[204,1214,1215],{},"Vercube provides middleware prioritization capabilities, offering flexible control over execution order and timing. This allows you to precisely manage when and in what sequence middleware components are executed.",[204,1217,1218,1219,1221,1222,1225],{},"To set middleware priority, pass a second argument to the ",[219,1220,1088],{}," decorator containing a ",[219,1223,1224],{},"priority"," property. Lower priority values execute earlier in the middleware chain.",[251,1227,1229],{"className":253,"code":1228,"filename":527,"language":256,"meta":257,"style":257},"import { Controller, Get, Middleware } from '@vercube\u002Fcore';\nimport { LoggingMiddleware } from '@\u002Fmiddlewares\u002FLoggingMiddleware';\n\n@Controller('\u002Fusers')\n@Middleware(LoggingMiddleware, { priority: 1 })\nexport class UserController {\n  \u002F\u002F ...\n}\n\n",[219,1230,1231,1259,1279,1283,1299,1324,1334,1338],{"__ignoreMap":257},[261,1232,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257],{"class":263,"line":264},[261,1234,268],{"class":267},[261,1236,272],{"class":271},[261,1238,538],{"class":275},[261,1240,541],{"class":271},[261,1242,544],{"class":275},[261,1244,541],{"class":271},[261,1246,549],{"class":275},[261,1248,279],{"class":271},[261,1250,282],{"class":267},[261,1252,285],{"class":271},[261,1254,289],{"class":288},[261,1256,292],{"class":271},[261,1258,295],{"class":271},[261,1260,1261,1263,1265,1267,1269,1271,1273,1275,1277],{"class":263,"line":298},[261,1262,268],{"class":267},[261,1264,272],{"class":271},[261,1266,340],{"class":275},[261,1268,279],{"class":271},[261,1270,282],{"class":267},[261,1272,285],{"class":271},[261,1274,578],{"class":288},[261,1276,292],{"class":271},[261,1278,295],{"class":271},[261,1280,1281],{"class":263,"line":323},[261,1282,326],{"emptyLinePlaceholder":56},[261,1284,1285,1287,1289,1291,1293,1295,1297],{"class":263,"line":329},[261,1286,591],{"class":271},[261,1288,594],{"class":441},[261,1290,445],{"class":275},[261,1292,292],{"class":271},[261,1294,601],{"class":288},[261,1296,292],{"class":271},[261,1298,606],{"class":275},[261,1300,1301,1303,1305,1307,1309,1311,1314,1316,1320,1322],{"class":263,"line":351},[261,1302,591],{"class":271},[261,1304,613],{"class":441},[261,1306,616],{"class":275},[261,1308,541],{"class":271},[261,1310,272],{"class":271},[261,1312,1313],{"class":365}," priority",[261,1315,379],{"class":271},[261,1317,1319],{"class":1318},"sbssI"," 1",[261,1321,279],{"class":271},[261,1323,606],{"class":275},[261,1325,1326,1328,1330,1332],{"class":263,"line":356},[261,1327,332],{"class":267},[261,1329,336],{"class":335},[261,1331,645],{"class":339},[261,1333,348],{"class":271},[261,1335,1336],{"class":263,"line":372},[261,1337,653],{"class":652},[261,1339,1340],{"class":263,"line":388},[261,1341,523],{"class":271},[659,1343,1344],{},[204,1345,1346,1347,1349,1350,438],{},"The default ",[219,1348,1224],{}," value is ",[219,1351,1352],{},"999",[211,1354,1356],{"id":1355},"global-middlewares","Global Middlewares",[204,1358,1359,1360,438],{},"In addition to middleware that can be applied to specific endpoints or endpoint groups, Vercube provides the capability to create global middleware. Global middleware functions identically to regular middleware, with the key difference being in their registration process. For global middleware, you must utilize the IOC service ",[219,1361,1362],{},"GlobalMiddlewareRegistry",[204,1364,1365],{},"You can register global middleware during your application setup:",[251,1367,1370],{"className":253,"code":1368,"filename":1369,"language":256,"meta":257,"style":257},"import { type App } from '@vercube\u002Fcore';\nimport { LoggingMiddleware } from '@\u002Fmiddlewares\u002FLoggingMiddleware';\n\nexport function setup(app: App): void {\n  const registry = app.container.get(GlobalMiddlewareRegistry);\n\n  registry.registerGlobalMiddleware(LoggingMiddleware, { priority: 1 });\n}\n","setup.ts",[219,1371,1372,1395,1415,1419,1446,1478,1482,1513],{"__ignoreMap":257},[261,1373,1374,1376,1378,1380,1383,1385,1387,1389,1391,1393],{"class":263,"line":264},[261,1375,268],{"class":267},[261,1377,272],{"class":271},[261,1379,303],{"class":267},[261,1381,1382],{"class":275}," App",[261,1384,279],{"class":271},[261,1386,282],{"class":267},[261,1388,285],{"class":271},[261,1390,289],{"class":288},[261,1392,292],{"class":271},[261,1394,295],{"class":271},[261,1396,1397,1399,1401,1403,1405,1407,1409,1411,1413],{"class":263,"line":298},[261,1398,268],{"class":267},[261,1400,272],{"class":271},[261,1402,340],{"class":275},[261,1404,279],{"class":271},[261,1406,282],{"class":267},[261,1408,285],{"class":271},[261,1410,578],{"class":288},[261,1412,292],{"class":271},[261,1414,295],{"class":271},[261,1416,1417],{"class":263,"line":323},[261,1418,326],{"emptyLinePlaceholder":56},[261,1420,1421,1423,1426,1429,1431,1434,1436,1438,1441,1444],{"class":263,"line":329},[261,1422,332],{"class":267},[261,1424,1425],{"class":335}," function",[261,1427,1428],{"class":441}," setup",[261,1430,445],{"class":271},[261,1432,1433],{"class":375},"app",[261,1435,379],{"class":271},[261,1437,1382],{"class":339},[261,1439,1440],{"class":271},"):",[261,1442,1443],{"class":339}," void",[261,1445,348],{"class":271},[261,1447,1448,1451,1454,1457,1460,1462,1465,1467,1470,1472,1474,1476],{"class":263,"line":351},[261,1449,1450],{"class":335},"  const",[261,1452,1453],{"class":275}," registry",[261,1455,1456],{"class":271}," =",[261,1458,1459],{"class":275}," app",[261,1461,438],{"class":271},[261,1463,1464],{"class":275},"container",[261,1466,438],{"class":271},[261,1468,1469],{"class":441},"get",[261,1471,445],{"class":365},[261,1473,1362],{"class":275},[261,1475,504],{"class":365},[261,1477,295],{"class":271},[261,1479,1480],{"class":263,"line":356},[261,1481,326],{"emptyLinePlaceholder":56},[261,1483,1484,1487,1489,1492,1494,1497,1499,1501,1503,1505,1507,1509,1511],{"class":263,"line":372},[261,1485,1486],{"class":275},"  registry",[261,1488,438],{"class":271},[261,1490,1491],{"class":441},"registerGlobalMiddleware",[261,1493,445],{"class":365},[261,1495,1496],{"class":275},"LoggingMiddleware",[261,1498,541],{"class":271},[261,1500,272],{"class":271},[261,1502,1313],{"class":365},[261,1504,379],{"class":271},[261,1506,1319],{"class":1318},[261,1508,279],{"class":271},[261,1510,504],{"class":365},[261,1512,295],{"class":271},[261,1514,1515],{"class":263,"line":388},[261,1516,523],{"class":271},[204,1518,1519],{},"Once registered, the middleware will be executed for every endpoint in your application.",[1521,1522,1523],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":257,"searchDepth":264,"depth":298,"links":1525},[1526,1530,1531,1532],{"id":213,"depth":298,"text":214,"children":1527},[1528,1529],{"id":234,"depth":323,"text":225},{"id":676,"depth":323,"text":229},{"id":1081,"depth":298,"text":1082},{"id":1211,"depth":298,"text":1212},{"id":1355,"depth":298,"text":1356},null,"md",{},{"title":45,"description":1533},"lL3EKdTqB5Y6fa2jXfTim4XJCopj2XCOU_QwdS7oX3c",[1539,1541],{"title":41,"path":42,"stem":43,"description":1540,"children":-1},"Building APIs with Controllers in Vercube",{"title":49,"path":50,"stem":51,"description":1542,"children":-1},"Automatic request validation with Standard Schema support",1775552780365]