[{"data":1,"prerenderedAt":3304},["ShallowReactive",2],{"navigation":3,"docs-path-index":152,"-docs-modules-auth-overview":198,"-docs-modules-auth-overview-surround":3299},[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":66,"body":200,"description":3293,"extension":3294,"links":3295,"meta":3296,"navigation":56,"path":67,"seo":3297,"stem":68,"__hash__":3298},"docs\u002Fdocs\u002F3.modules\u002F1.auth\u002F0.overview.md",{"type":201,"value":202,"toc":3282},"minimark",[203,207,211,279,283,1594,1598,1601,1607,1635,1638,1641,1681,1685,1691,1759,1764,1768,1771,1809,1813,1817,3278],[204,205,206],"p",{},"The Auth module provides a powerful, flexible authentication system for Vercube applications. Built around a provider-based architecture, it allows you to implement various authentication strategies such as JWT, sessions, OAuth, or custom solutions.",[208,209,18],"h2",{"id":210},"installation",[212,213,214,244,262],"code-group",{},[215,216,222],"pre",{"className":217,"code":218,"filename":219,"language":220,"meta":221,"style":221},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$ pnpm add @vercube\u002Fauth\n","pnpm","bash","",[223,224,225],"code",{"__ignoreMap":221},[226,227,230,234,238,241],"span",{"class":228,"line":229},"line",1,[226,231,233],{"class":232},"sBMFI","$",[226,235,237],{"class":236},"sfazB"," pnpm",[226,239,240],{"class":236}," add",[226,242,243],{"class":236}," @vercube\u002Fauth\n",[215,245,248],{"className":217,"code":246,"filename":247,"language":220,"meta":221,"style":221},"$ npm install @vercube\u002Fauth\n","npm",[223,249,250],{"__ignoreMap":221},[226,251,252,254,257,260],{"class":228,"line":229},[226,253,233],{"class":232},[226,255,256],{"class":236}," npm",[226,258,259],{"class":236}," install",[226,261,243],{"class":236},[215,263,266],{"className":217,"code":264,"filename":265,"language":220,"meta":221,"style":221},"$ bun install @vercube\u002Fauth\n","bun",[223,267,268],{"__ignoreMap":221},[226,269,270,272,275,277],{"class":228,"line":229},[226,271,233],{"class":232},[226,273,274],{"class":236}," bun",[226,276,259],{"class":236},[226,278,243],{"class":236},[208,280,282],{"id":281},"quick-start","Quick Start",[284,285,286,291,298,1123,1127,1130,1262,1266,1273],"steps",{},[287,288,290],"h3",{"id":289},"create-an-auth-provider","Create an Auth Provider",[204,292,293,294,297],{},"Create a custom authentication provider by extending the ",[223,295,296],{},"AuthProvider"," class:",[215,299,304],{"className":300,"code":301,"filename":302,"language":303,"meta":221,"style":221},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { AuthProvider, type AuthTypes } from '@vercube\u002Fauth';\n\ninterface User {\n  id: number;\n  username: string;\n  roles: string[];\n}\n\nexport class JWTAuthProvider extends AuthProvider\u003CUser> {\n  \n  public validate(request: Request, params?: AuthTypes.MiddlewareOptions): string | null {\n    const token = request.headers.get('Authorization')?.replace('Bearer ', '');\n    \n    if (!token) {\n      return 'No token provided';\n    }\n\n    try {\n      const user = this.verifyToken(token);\n      \n      \u002F\u002F Check roles if specified\n      if (params?.roles && params.roles.length > 0) {\n        const hasRequiredRole = params.roles.some(role => user.roles.includes(role));\n        if (!hasRequiredRole) {\n          return 'Insufficient permissions';\n        }\n      }\n      \n      return null; \u002F\u002F Authentication successful\n    } catch {\n      return 'Invalid token';\n    }\n  }\n\n  public getCurrentUser(request: Request): User | null {\n    const token = request.headers.get('Authorization')?.replace('Bearer ', '');\n    \n    if (!token) {\n      return null;\n    }\n\n    try {\n      return this.verifyToken(token);\n    } catch {\n      return null;\n    }\n  }\n\n  private verifyToken(token: string): User {\n    \u002F\u002F Your JWT verification logic here\n    \u002F\u002F This is a simplified example\n    return { id: 1, username: 'john', roles: ['user'] };\n  }\n}\n","src\u002Fproviders\u002FJWTAuthProvider.ts","ts",[223,305,306,347,353,366,381,394,409,415,420,448,454,504,566,572,593,608,614,619,627,652,658,665,706,756,773,788,794,800,805,816,827,841,846,852,857,883,932,937,952,960,965,970,977,994,1003,1010,1015,1020,1025,1048,1054,1060,1113,1118],{"__ignoreMap":221},[226,307,308,312,316,320,323,326,329,332,335,338,341,344],{"class":228,"line":229},[226,309,311],{"class":310},"s7zQu","import",[226,313,315],{"class":314},"sMK4o"," {",[226,317,319],{"class":318},"sTEyZ"," AuthProvider",[226,321,322],{"class":314},",",[226,324,325],{"class":310}," type",[226,327,328],{"class":318}," AuthTypes",[226,330,331],{"class":314}," }",[226,333,334],{"class":310}," from",[226,336,337],{"class":314}," '",[226,339,340],{"class":236},"@vercube\u002Fauth",[226,342,343],{"class":314},"'",[226,345,346],{"class":314},";\n",[226,348,350],{"class":228,"line":349},2,[226,351,352],{"emptyLinePlaceholder":56},"\n",[226,354,356,360,363],{"class":228,"line":355},3,[226,357,359],{"class":358},"spNyl","interface",[226,361,362],{"class":232}," User",[226,364,365],{"class":314}," {\n",[226,367,369,373,376,379],{"class":228,"line":368},4,[226,370,372],{"class":371},"swJcz","  id",[226,374,375],{"class":314},":",[226,377,378],{"class":232}," number",[226,380,346],{"class":314},[226,382,384,387,389,392],{"class":228,"line":383},5,[226,385,386],{"class":371},"  username",[226,388,375],{"class":314},[226,390,391],{"class":232}," string",[226,393,346],{"class":314},[226,395,397,400,402,404,407],{"class":228,"line":396},6,[226,398,399],{"class":371},"  roles",[226,401,375],{"class":314},[226,403,391],{"class":232},[226,405,406],{"class":318},"[]",[226,408,346],{"class":314},[226,410,412],{"class":228,"line":411},7,[226,413,414],{"class":314},"}\n",[226,416,418],{"class":228,"line":417},8,[226,419,352],{"emptyLinePlaceholder":56},[226,421,423,426,429,432,435,437,440,443,446],{"class":228,"line":422},9,[226,424,425],{"class":310},"export",[226,427,428],{"class":358}," class",[226,430,431],{"class":232}," JWTAuthProvider",[226,433,434],{"class":358}," extends",[226,436,319],{"class":232},[226,438,439],{"class":314},"\u003C",[226,441,442],{"class":232},"User",[226,444,445],{"class":314},">",[226,447,365],{"class":314},[226,449,451],{"class":228,"line":450},10,[226,452,453],{"class":318},"  \n",[226,455,457,460,463,466,470,472,475,477,480,483,485,488,491,494,496,499,502],{"class":228,"line":456},11,[226,458,459],{"class":358},"  public",[226,461,462],{"class":371}," validate",[226,464,465],{"class":314},"(",[226,467,469],{"class":468},"sHdIc","request",[226,471,375],{"class":314},[226,473,474],{"class":232}," Request",[226,476,322],{"class":314},[226,478,479],{"class":468}," params",[226,481,482],{"class":314},"?:",[226,484,328],{"class":232},[226,486,487],{"class":314},".",[226,489,490],{"class":232},"MiddlewareOptions",[226,492,493],{"class":314},"):",[226,495,391],{"class":232},[226,497,498],{"class":314}," |",[226,500,501],{"class":232}," null",[226,503,365],{"class":314},[226,505,507,510,513,516,519,521,524,526,530,532,534,537,539,542,545,548,550,552,555,557,559,562,564],{"class":228,"line":506},12,[226,508,509],{"class":358},"    const",[226,511,512],{"class":318}," token",[226,514,515],{"class":314}," =",[226,517,518],{"class":318}," request",[226,520,487],{"class":314},[226,522,523],{"class":318},"headers",[226,525,487],{"class":314},[226,527,529],{"class":528},"s2Zo4","get",[226,531,465],{"class":371},[226,533,343],{"class":314},[226,535,536],{"class":236},"Authorization",[226,538,343],{"class":314},[226,540,541],{"class":371},")",[226,543,544],{"class":314},"?.",[226,546,547],{"class":528},"replace",[226,549,465],{"class":371},[226,551,343],{"class":314},[226,553,554],{"class":236},"Bearer ",[226,556,343],{"class":314},[226,558,322],{"class":314},[226,560,561],{"class":314}," ''",[226,563,541],{"class":371},[226,565,346],{"class":314},[226,567,569],{"class":228,"line":568},13,[226,570,571],{"class":371},"    \n",[226,573,575,578,581,584,587,590],{"class":228,"line":574},14,[226,576,577],{"class":310},"    if",[226,579,580],{"class":371}," (",[226,582,583],{"class":314},"!",[226,585,586],{"class":318},"token",[226,588,589],{"class":371},") ",[226,591,592],{"class":314},"{\n",[226,594,596,599,601,604,606],{"class":228,"line":595},15,[226,597,598],{"class":310},"      return",[226,600,337],{"class":314},[226,602,603],{"class":236},"No token provided",[226,605,343],{"class":314},[226,607,346],{"class":314},[226,609,611],{"class":228,"line":610},16,[226,612,613],{"class":314},"    }\n",[226,615,617],{"class":228,"line":616},17,[226,618,352],{"emptyLinePlaceholder":56},[226,620,622,625],{"class":228,"line":621},18,[226,623,624],{"class":310},"    try",[226,626,365],{"class":314},[226,628,630,633,636,638,641,644,646,648,650],{"class":228,"line":629},19,[226,631,632],{"class":358},"      const",[226,634,635],{"class":318}," user",[226,637,515],{"class":314},[226,639,640],{"class":314}," this.",[226,642,643],{"class":528},"verifyToken",[226,645,465],{"class":371},[226,647,586],{"class":318},[226,649,541],{"class":371},[226,651,346],{"class":314},[226,653,655],{"class":228,"line":654},20,[226,656,657],{"class":371},"      \n",[226,659,661],{"class":228,"line":660},21,[226,662,664],{"class":663},"sHwdD","      \u002F\u002F Check roles if specified\n",[226,666,668,671,673,676,678,681,684,686,688,690,692,695,698,702,704],{"class":228,"line":667},22,[226,669,670],{"class":310},"      if",[226,672,580],{"class":371},[226,674,675],{"class":318},"params",[226,677,544],{"class":314},[226,679,680],{"class":318},"roles",[226,682,683],{"class":314}," &&",[226,685,479],{"class":318},[226,687,487],{"class":314},[226,689,680],{"class":318},[226,691,487],{"class":314},[226,693,694],{"class":318},"length",[226,696,697],{"class":314}," >",[226,699,701],{"class":700},"sbssI"," 0",[226,703,589],{"class":371},[226,705,592],{"class":314},[226,707,709,712,715,717,719,721,723,725,728,730,733,736,738,740,742,744,747,749,751,754],{"class":228,"line":708},23,[226,710,711],{"class":358},"        const",[226,713,714],{"class":318}," hasRequiredRole",[226,716,515],{"class":314},[226,718,479],{"class":318},[226,720,487],{"class":314},[226,722,680],{"class":318},[226,724,487],{"class":314},[226,726,727],{"class":528},"some",[226,729,465],{"class":371},[226,731,732],{"class":468},"role",[226,734,735],{"class":358}," =>",[226,737,635],{"class":318},[226,739,487],{"class":314},[226,741,680],{"class":318},[226,743,487],{"class":314},[226,745,746],{"class":528},"includes",[226,748,465],{"class":371},[226,750,732],{"class":318},[226,752,753],{"class":371},"))",[226,755,346],{"class":314},[226,757,759,762,764,766,769,771],{"class":228,"line":758},24,[226,760,761],{"class":310},"        if",[226,763,580],{"class":371},[226,765,583],{"class":314},[226,767,768],{"class":318},"hasRequiredRole",[226,770,589],{"class":371},[226,772,592],{"class":314},[226,774,776,779,781,784,786],{"class":228,"line":775},25,[226,777,778],{"class":310},"          return",[226,780,337],{"class":314},[226,782,783],{"class":236},"Insufficient permissions",[226,785,343],{"class":314},[226,787,346],{"class":314},[226,789,791],{"class":228,"line":790},26,[226,792,793],{"class":314},"        }\n",[226,795,797],{"class":228,"line":796},27,[226,798,799],{"class":314},"      }\n",[226,801,803],{"class":228,"line":802},28,[226,804,657],{"class":371},[226,806,808,810,813],{"class":228,"line":807},29,[226,809,598],{"class":310},[226,811,812],{"class":314}," null;",[226,814,815],{"class":663}," \u002F\u002F Authentication successful\n",[226,817,819,822,825],{"class":228,"line":818},30,[226,820,821],{"class":314},"    }",[226,823,824],{"class":310}," catch",[226,826,365],{"class":314},[226,828,830,832,834,837,839],{"class":228,"line":829},31,[226,831,598],{"class":310},[226,833,337],{"class":314},[226,835,836],{"class":236},"Invalid token",[226,838,343],{"class":314},[226,840,346],{"class":314},[226,842,844],{"class":228,"line":843},32,[226,845,613],{"class":314},[226,847,849],{"class":228,"line":848},33,[226,850,851],{"class":314},"  }\n",[226,853,855],{"class":228,"line":854},34,[226,856,352],{"emptyLinePlaceholder":56},[226,858,860,862,865,867,869,871,873,875,877,879,881],{"class":228,"line":859},35,[226,861,459],{"class":358},[226,863,864],{"class":371}," getCurrentUser",[226,866,465],{"class":314},[226,868,469],{"class":468},[226,870,375],{"class":314},[226,872,474],{"class":232},[226,874,493],{"class":314},[226,876,362],{"class":232},[226,878,498],{"class":314},[226,880,501],{"class":232},[226,882,365],{"class":314},[226,884,886,888,890,892,894,896,898,900,902,904,906,908,910,912,914,916,918,920,922,924,926,928,930],{"class":228,"line":885},36,[226,887,509],{"class":358},[226,889,512],{"class":318},[226,891,515],{"class":314},[226,893,518],{"class":318},[226,895,487],{"class":314},[226,897,523],{"class":318},[226,899,487],{"class":314},[226,901,529],{"class":528},[226,903,465],{"class":371},[226,905,343],{"class":314},[226,907,536],{"class":236},[226,909,343],{"class":314},[226,911,541],{"class":371},[226,913,544],{"class":314},[226,915,547],{"class":528},[226,917,465],{"class":371},[226,919,343],{"class":314},[226,921,554],{"class":236},[226,923,343],{"class":314},[226,925,322],{"class":314},[226,927,561],{"class":314},[226,929,541],{"class":371},[226,931,346],{"class":314},[226,933,935],{"class":228,"line":934},37,[226,936,571],{"class":371},[226,938,940,942,944,946,948,950],{"class":228,"line":939},38,[226,941,577],{"class":310},[226,943,580],{"class":371},[226,945,583],{"class":314},[226,947,586],{"class":318},[226,949,589],{"class":371},[226,951,592],{"class":314},[226,953,955,957],{"class":228,"line":954},39,[226,956,598],{"class":310},[226,958,959],{"class":314}," null;\n",[226,961,963],{"class":228,"line":962},40,[226,964,613],{"class":314},[226,966,968],{"class":228,"line":967},41,[226,969,352],{"emptyLinePlaceholder":56},[226,971,973,975],{"class":228,"line":972},42,[226,974,624],{"class":310},[226,976,365],{"class":314},[226,978,980,982,984,986,988,990,992],{"class":228,"line":979},43,[226,981,598],{"class":310},[226,983,640],{"class":314},[226,985,643],{"class":528},[226,987,465],{"class":371},[226,989,586],{"class":318},[226,991,541],{"class":371},[226,993,346],{"class":314},[226,995,997,999,1001],{"class":228,"line":996},44,[226,998,821],{"class":314},[226,1000,824],{"class":310},[226,1002,365],{"class":314},[226,1004,1006,1008],{"class":228,"line":1005},45,[226,1007,598],{"class":310},[226,1009,959],{"class":314},[226,1011,1013],{"class":228,"line":1012},46,[226,1014,613],{"class":314},[226,1016,1018],{"class":228,"line":1017},47,[226,1019,851],{"class":314},[226,1021,1023],{"class":228,"line":1022},48,[226,1024,352],{"emptyLinePlaceholder":56},[226,1026,1028,1031,1034,1036,1038,1040,1042,1044,1046],{"class":228,"line":1027},49,[226,1029,1030],{"class":358},"  private",[226,1032,1033],{"class":371}," verifyToken",[226,1035,465],{"class":314},[226,1037,586],{"class":468},[226,1039,375],{"class":314},[226,1041,391],{"class":232},[226,1043,493],{"class":314},[226,1045,362],{"class":232},[226,1047,365],{"class":314},[226,1049,1051],{"class":228,"line":1050},50,[226,1052,1053],{"class":663},"    \u002F\u002F Your JWT verification logic here\n",[226,1055,1057],{"class":228,"line":1056},51,[226,1058,1059],{"class":663},"    \u002F\u002F This is a simplified example\n",[226,1061,1063,1066,1068,1071,1073,1076,1078,1081,1083,1085,1088,1090,1092,1095,1097,1100,1102,1105,1107,1110],{"class":228,"line":1062},52,[226,1064,1065],{"class":310},"    return",[226,1067,315],{"class":314},[226,1069,1070],{"class":371}," id",[226,1072,375],{"class":314},[226,1074,1075],{"class":700}," 1",[226,1077,322],{"class":314},[226,1079,1080],{"class":371}," username",[226,1082,375],{"class":314},[226,1084,337],{"class":314},[226,1086,1087],{"class":236},"john",[226,1089,343],{"class":314},[226,1091,322],{"class":314},[226,1093,1094],{"class":371}," roles",[226,1096,375],{"class":314},[226,1098,1099],{"class":371}," [",[226,1101,343],{"class":314},[226,1103,1104],{"class":236},"user",[226,1106,343],{"class":314},[226,1108,1109],{"class":371},"] ",[226,1111,1112],{"class":314},"};\n",[226,1114,1116],{"class":228,"line":1115},53,[226,1117,851],{"class":314},[226,1119,1121],{"class":228,"line":1120},54,[226,1122,414],{"class":314},[287,1124,1126],{"id":1125},"register-provider-in-container","Register Provider in Container",[204,1128,1129],{},"Register your auth provider in the DI container during application setup:",[215,1131,1134],{"className":300,"code":1132,"filename":1133,"language":303,"meta":221,"style":221},"import { type App } from '@vercube\u002Fcore';\nimport { AuthProvider } from '@vercube\u002Fauth';\nimport { JWTAuthProvider } from '.\u002Fproviders\u002FJWTAuthProvider';\n\nexport function setup(app: App): void {\n  app.container.bind(AuthProvider, JWTAuthProvider);\n}\n","src\u002Fsetup.ts",[223,1135,1136,1160,1180,1201,1205,1231,1258],{"__ignoreMap":221},[226,1137,1138,1140,1142,1144,1147,1149,1151,1153,1156,1158],{"class":228,"line":229},[226,1139,311],{"class":310},[226,1141,315],{"class":314},[226,1143,325],{"class":310},[226,1145,1146],{"class":318}," App",[226,1148,331],{"class":314},[226,1150,334],{"class":310},[226,1152,337],{"class":314},[226,1154,1155],{"class":236},"@vercube\u002Fcore",[226,1157,343],{"class":314},[226,1159,346],{"class":314},[226,1161,1162,1164,1166,1168,1170,1172,1174,1176,1178],{"class":228,"line":349},[226,1163,311],{"class":310},[226,1165,315],{"class":314},[226,1167,319],{"class":318},[226,1169,331],{"class":314},[226,1171,334],{"class":310},[226,1173,337],{"class":314},[226,1175,340],{"class":236},[226,1177,343],{"class":314},[226,1179,346],{"class":314},[226,1181,1182,1184,1186,1188,1190,1192,1194,1197,1199],{"class":228,"line":355},[226,1183,311],{"class":310},[226,1185,315],{"class":314},[226,1187,431],{"class":318},[226,1189,331],{"class":314},[226,1191,334],{"class":310},[226,1193,337],{"class":314},[226,1195,1196],{"class":236},".\u002Fproviders\u002FJWTAuthProvider",[226,1198,343],{"class":314},[226,1200,346],{"class":314},[226,1202,1203],{"class":228,"line":368},[226,1204,352],{"emptyLinePlaceholder":56},[226,1206,1207,1209,1212,1215,1217,1220,1222,1224,1226,1229],{"class":228,"line":383},[226,1208,425],{"class":310},[226,1210,1211],{"class":358}," function",[226,1213,1214],{"class":528}," setup",[226,1216,465],{"class":314},[226,1218,1219],{"class":468},"app",[226,1221,375],{"class":314},[226,1223,1146],{"class":232},[226,1225,493],{"class":314},[226,1227,1228],{"class":232}," void",[226,1230,365],{"class":314},[226,1232,1233,1236,1238,1241,1243,1246,1248,1250,1252,1254,1256],{"class":228,"line":396},[226,1234,1235],{"class":318},"  app",[226,1237,487],{"class":314},[226,1239,1240],{"class":318},"container",[226,1242,487],{"class":314},[226,1244,1245],{"class":528},"bind",[226,1247,465],{"class":371},[226,1249,296],{"class":318},[226,1251,322],{"class":314},[226,1253,431],{"class":318},[226,1255,541],{"class":371},[226,1257,346],{"class":314},[226,1259,1260],{"class":228,"line":411},[226,1261,414],{"class":314},[287,1263,1265],{"id":1264},"protect-your-endpoints","Protect Your Endpoints",[204,1267,1268,1269,1272],{},"Use the ",[223,1270,1271],{},"@Auth"," decorator to protect controller methods:",[215,1274,1277],{"className":300,"code":1275,"filename":1276,"language":303,"meta":221,"style":221},"import { Controller, Get } from '@vercube\u002Fcore';\nimport { Auth, User } from '@vercube\u002Fauth';\n\ninterface User {\n  id: number;\n  username: string;\n  roles: string[];\n}\n\n@Controller('\u002Fprofile')\nexport class ProfileController {\n  \n  @Get('\u002F')\n  @Auth()\n  public getProfile(@User() user: User) {\n    return { profile: user };\n  }\n  \n  @Get('\u002Fadmin')\n  @Auth({ roles: ['admin'] })\n  public getAdminPanel(@User() user: User) {\n    return { admin: true, user };\n  }\n}\n","src\u002Fcontrollers\u002FProfileController.ts",[223,1278,1279,1305,1330,1334,1342,1352,1362,1374,1378,1382,1402,1413,1417,1436,1445,1470,1486,1490,1494,1511,1542,1565,1586,1590],{"__ignoreMap":221},[226,1280,1281,1283,1285,1288,1290,1293,1295,1297,1299,1301,1303],{"class":228,"line":229},[226,1282,311],{"class":310},[226,1284,315],{"class":314},[226,1286,1287],{"class":318}," Controller",[226,1289,322],{"class":314},[226,1291,1292],{"class":318}," Get",[226,1294,331],{"class":314},[226,1296,334],{"class":310},[226,1298,337],{"class":314},[226,1300,1155],{"class":236},[226,1302,343],{"class":314},[226,1304,346],{"class":314},[226,1306,1307,1309,1311,1314,1316,1318,1320,1322,1324,1326,1328],{"class":228,"line":349},[226,1308,311],{"class":310},[226,1310,315],{"class":314},[226,1312,1313],{"class":318}," Auth",[226,1315,322],{"class":314},[226,1317,362],{"class":318},[226,1319,331],{"class":314},[226,1321,334],{"class":310},[226,1323,337],{"class":314},[226,1325,340],{"class":236},[226,1327,343],{"class":314},[226,1329,346],{"class":314},[226,1331,1332],{"class":228,"line":355},[226,1333,352],{"emptyLinePlaceholder":56},[226,1335,1336,1338,1340],{"class":228,"line":368},[226,1337,359],{"class":358},[226,1339,362],{"class":232},[226,1341,365],{"class":314},[226,1343,1344,1346,1348,1350],{"class":228,"line":383},[226,1345,372],{"class":371},[226,1347,375],{"class":314},[226,1349,378],{"class":232},[226,1351,346],{"class":314},[226,1353,1354,1356,1358,1360],{"class":228,"line":396},[226,1355,386],{"class":371},[226,1357,375],{"class":314},[226,1359,391],{"class":232},[226,1361,346],{"class":314},[226,1363,1364,1366,1368,1370,1372],{"class":228,"line":411},[226,1365,399],{"class":371},[226,1367,375],{"class":314},[226,1369,391],{"class":232},[226,1371,406],{"class":318},[226,1373,346],{"class":314},[226,1375,1376],{"class":228,"line":417},[226,1377,414],{"class":314},[226,1379,1380],{"class":228,"line":422},[226,1381,352],{"emptyLinePlaceholder":56},[226,1383,1384,1387,1390,1392,1394,1397,1399],{"class":228,"line":450},[226,1385,1386],{"class":314},"@",[226,1388,1389],{"class":528},"Controller",[226,1391,465],{"class":318},[226,1393,343],{"class":314},[226,1395,1396],{"class":236},"\u002Fprofile",[226,1398,343],{"class":314},[226,1400,1401],{"class":318},")\n",[226,1403,1404,1406,1408,1411],{"class":228,"line":456},[226,1405,425],{"class":310},[226,1407,428],{"class":358},[226,1409,1410],{"class":232}," ProfileController",[226,1412,365],{"class":314},[226,1414,1415],{"class":228,"line":506},[226,1416,453],{"class":318},[226,1418,1419,1422,1425,1427,1429,1432,1434],{"class":228,"line":568},[226,1420,1421],{"class":314},"  @",[226,1423,1424],{"class":528},"Get",[226,1426,465],{"class":318},[226,1428,343],{"class":314},[226,1430,1431],{"class":236},"\u002F",[226,1433,343],{"class":314},[226,1435,1401],{"class":318},[226,1437,1438,1440,1442],{"class":228,"line":574},[226,1439,1421],{"class":314},[226,1441,61],{"class":528},[226,1443,1444],{"class":318},"()\n",[226,1446,1447,1449,1452,1455,1457,1460,1462,1464,1466,1468],{"class":228,"line":595},[226,1448,459],{"class":358},[226,1450,1451],{"class":371}," getProfile",[226,1453,1454],{"class":314},"(@",[226,1456,442],{"class":528},[226,1458,1459],{"class":318},"() ",[226,1461,1104],{"class":468},[226,1463,375],{"class":314},[226,1465,362],{"class":232},[226,1467,541],{"class":314},[226,1469,365],{"class":314},[226,1471,1472,1474,1476,1479,1481,1483],{"class":228,"line":610},[226,1473,1065],{"class":310},[226,1475,315],{"class":314},[226,1477,1478],{"class":371}," profile",[226,1480,375],{"class":314},[226,1482,635],{"class":318},[226,1484,1485],{"class":314}," };\n",[226,1487,1488],{"class":228,"line":616},[226,1489,851],{"class":314},[226,1491,1492],{"class":228,"line":621},[226,1493,453],{"class":318},[226,1495,1496,1498,1500,1502,1504,1507,1509],{"class":228,"line":629},[226,1497,1421],{"class":314},[226,1499,1424],{"class":528},[226,1501,465],{"class":318},[226,1503,343],{"class":314},[226,1505,1506],{"class":236},"\u002Fadmin",[226,1508,343],{"class":314},[226,1510,1401],{"class":318},[226,1512,1513,1515,1517,1519,1522,1524,1526,1528,1530,1533,1535,1537,1540],{"class":228,"line":654},[226,1514,1421],{"class":314},[226,1516,61],{"class":528},[226,1518,465],{"class":318},[226,1520,1521],{"class":314},"{",[226,1523,1094],{"class":371},[226,1525,375],{"class":314},[226,1527,1099],{"class":318},[226,1529,343],{"class":314},[226,1531,1532],{"class":236},"admin",[226,1534,343],{"class":314},[226,1536,1109],{"class":318},[226,1538,1539],{"class":314},"}",[226,1541,1401],{"class":318},[226,1543,1544,1546,1549,1551,1553,1555,1557,1559,1561,1563],{"class":228,"line":660},[226,1545,459],{"class":358},[226,1547,1548],{"class":371}," getAdminPanel",[226,1550,1454],{"class":314},[226,1552,442],{"class":528},[226,1554,1459],{"class":318},[226,1556,1104],{"class":468},[226,1558,375],{"class":314},[226,1560,362],{"class":232},[226,1562,541],{"class":314},[226,1564,365],{"class":314},[226,1566,1567,1569,1571,1574,1576,1580,1582,1584],{"class":228,"line":667},[226,1568,1065],{"class":310},[226,1570,315],{"class":314},[226,1572,1573],{"class":371}," admin",[226,1575,375],{"class":314},[226,1577,1579],{"class":1578},"sfNiH"," true",[226,1581,322],{"class":314},[226,1583,635],{"class":318},[226,1585,1485],{"class":314},[226,1587,1588],{"class":228,"line":708},[226,1589,851],{"class":314},[226,1591,1592],{"class":228,"line":758},[226,1593,414],{"class":314},[208,1595,1597],{"id":1596},"core-concepts","Core Concepts",[287,1599,296],{"id":1600},"authprovider",[204,1602,1603,1604,1606],{},"The ",[223,1605,296],{}," is an abstract class that defines the interface for authentication implementations. All authentication providers must extend this class and implement two methods:",[1608,1609,1610,1624],"ul",{},[1611,1612,1613,1619,1620,1623],"li",{},[1614,1615,1616],"strong",{},[223,1617,1618],{},"validate()"," - Validates incoming requests and returns ",[223,1621,1622],{},"null"," on success or an error message string on failure",[1611,1625,1626,1631,1632,1634],{},[1614,1627,1628],{},[223,1629,1630],{},"getCurrentUser()"," - Returns the authenticated user object or ",[223,1633,1622],{}," if not authenticated",[287,1636,70],{"id":1637},"decorators",[204,1639,1640],{},"The Auth module provides two decorators for easy integration with controllers:",[1642,1643,1644,1657],"table",{},[1645,1646,1647],"thead",{},[1648,1649,1650,1654],"tr",{},[1651,1652,1653],"th",{},"Decorator",[1651,1655,1656],{},"Description",[1658,1659,1660,1671],"tbody",{},[1648,1661,1662,1668],{},[1663,1664,1665],"td",{},[223,1666,1667],{},"@Auth()",[1663,1669,1670],{},"Protects a method, requiring authentication before execution",[1648,1672,1673,1678],{},[1663,1674,1675],{},[223,1676,1677],{},"@User()",[1663,1679,1680],{},"Injects the current authenticated user as a method parameter",[287,1682,1684],{"id":1683},"role-based-access-control","Role-Based Access Control",[204,1686,1687,1688,1690],{},"You can restrict access based on user roles by passing options to the ",[223,1689,1271],{}," decorator:",[215,1692,1694],{"className":300,"code":1693,"language":303,"meta":221,"style":221},"@Auth({ roles: ['admin', 'moderator'] })\npublic adminOnly(@User() user: User) {\n  \u002F\u002F Only accessible by admins and moderators\n}\n",[223,1695,1696,1733,1750,1755],{"__ignoreMap":221},[226,1697,1698,1700,1702,1704,1706,1708,1710,1712,1714,1716,1718,1720,1722,1725,1727,1729,1731],{"class":228,"line":229},[226,1699,1386],{"class":314},[226,1701,61],{"class":528},[226,1703,465],{"class":318},[226,1705,1521],{"class":314},[226,1707,1094],{"class":371},[226,1709,375],{"class":314},[226,1711,1099],{"class":318},[226,1713,343],{"class":314},[226,1715,1532],{"class":236},[226,1717,343],{"class":314},[226,1719,322],{"class":314},[226,1721,337],{"class":314},[226,1723,1724],{"class":236},"moderator",[226,1726,343],{"class":314},[226,1728,1109],{"class":318},[226,1730,1539],{"class":314},[226,1732,1401],{"class":318},[226,1734,1735,1738,1741,1743,1745,1748],{"class":228,"line":349},[226,1736,1737],{"class":318},"public ",[226,1739,1740],{"class":528},"adminOnly",[226,1742,1454],{"class":318},[226,1744,442],{"class":528},[226,1746,1747],{"class":318},"() user: User) ",[226,1749,592],{"class":314},[226,1751,1752],{"class":228,"line":355},[226,1753,1754],{"class":663},"  \u002F\u002F Only accessible by admins and moderators\n",[226,1756,1757],{"class":228,"line":368},[226,1758,414],{"class":314},[204,1760,1603,1761,1763],{},[223,1762,1618],{}," method in your provider receives these options and should check if the user has the required roles.",[208,1765,1767],{"id":1766},"authentication-flow","Authentication Flow",[204,1769,1770],{},"When a request hits a protected endpoint:",[1772,1773,1774,1779,1786,1795,1800],"ol",{},[1611,1775,1603,1776,1778],{},[223,1777,1271],{}," decorator triggers the authentication middleware",[1611,1780,1781,1782,1785],{},"Your ",[223,1783,1784],{},"AuthProvider.validate()"," method is called with the request",[1611,1787,1788,1789,1791,1792,1794],{},"If ",[223,1790,1618],{}," returns ",[223,1793,1622],{},", authentication succeeds",[1611,1796,1788,1797,1799],{},[223,1798,1618],{}," returns a string, authentication fails with that error message",[1611,1801,1603,1802,1805,1806,1808],{},[223,1803,1804],{},"@User"," decorator calls ",[223,1807,1630],{}," to inject the user object",[1810,1811],"img",{"src":1812,"alt":1767},"\u002Fimages\u002Fauth-1.svg",[208,1814,1816],{"id":1815},"common-patterns","Common Patterns",[212,1818,1819,2418,2804],{},[215,1820,1823],{"className":300,"code":1821,"filename":1822,"language":303,"meta":221,"style":221},"import { AuthProvider, type AuthTypes } from '@vercube\u002Fauth';\nimport jwt from 'jsonwebtoken';\n\nexport class JWTAuthProvider extends AuthProvider\u003CUser> {\n  private secret = process.env.JWT_SECRET!;\n  \n  public validate(request: Request, params?: AuthTypes.MiddlewareOptions): string | null {\n    const token = request.headers.get('Authorization')?.replace('Bearer ', '');\n    \n    if (!token) {\n      return 'Authorization header required';\n    }\n\n    try {\n      const decoded = jwt.verify(token, this.secret) as User;\n      \n      if (params?.roles?.length) {\n        if (!params.roles.some(role => decoded.roles.includes(role))) {\n          return 'Insufficient permissions';\n        }\n      }\n      \n      return null;\n    } catch (error) {\n      if (error instanceof jwt.TokenExpiredError) {\n        return 'Token expired';\n      }\n      return 'Invalid token';\n    }\n  }\n\n  public getCurrentUser(request: Request): User | null {\n    const token = request.headers.get('Authorization')?.replace('Bearer ', '');\n    if (!token) return null;\n    \n    try {\n      return jwt.verify(token, this.secret) as User;\n    } catch {\n      return null;\n    }\n  }\n}\n","JWT",[223,1824,1825,1851,1870,1874,1894,1919,1923,1959,2007,2011,2025,2038,2042,2046,2052,2089,2093,2113,2156,2168,2172,2176,2180,2186,2201,2223,2237,2241,2253,2257,2261,2265,2289,2337,2354,2358,2364,2392,2400,2406,2410,2414],{"__ignoreMap":221},[226,1826,1827,1829,1831,1833,1835,1837,1839,1841,1843,1845,1847,1849],{"class":228,"line":229},[226,1828,311],{"class":310},[226,1830,315],{"class":314},[226,1832,319],{"class":318},[226,1834,322],{"class":314},[226,1836,325],{"class":310},[226,1838,328],{"class":318},[226,1840,331],{"class":314},[226,1842,334],{"class":310},[226,1844,337],{"class":314},[226,1846,340],{"class":236},[226,1848,343],{"class":314},[226,1850,346],{"class":314},[226,1852,1853,1855,1858,1861,1863,1866,1868],{"class":228,"line":349},[226,1854,311],{"class":310},[226,1856,1857],{"class":318}," jwt ",[226,1859,1860],{"class":310},"from",[226,1862,337],{"class":314},[226,1864,1865],{"class":236},"jsonwebtoken",[226,1867,343],{"class":314},[226,1869,346],{"class":314},[226,1871,1872],{"class":228,"line":355},[226,1873,352],{"emptyLinePlaceholder":56},[226,1875,1876,1878,1880,1882,1884,1886,1888,1890,1892],{"class":228,"line":368},[226,1877,425],{"class":310},[226,1879,428],{"class":358},[226,1881,431],{"class":232},[226,1883,434],{"class":358},[226,1885,319],{"class":232},[226,1887,439],{"class":314},[226,1889,442],{"class":232},[226,1891,445],{"class":314},[226,1893,365],{"class":314},[226,1895,1896,1898,1901,1903,1906,1908,1911,1913,1916],{"class":228,"line":383},[226,1897,1030],{"class":358},[226,1899,1900],{"class":371}," secret",[226,1902,515],{"class":314},[226,1904,1905],{"class":318}," process",[226,1907,487],{"class":314},[226,1909,1910],{"class":318},"env",[226,1912,487],{"class":314},[226,1914,1915],{"class":318},"JWT_SECRET",[226,1917,1918],{"class":314},"!;\n",[226,1920,1921],{"class":228,"line":396},[226,1922,453],{"class":318},[226,1924,1925,1927,1929,1931,1933,1935,1937,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957],{"class":228,"line":411},[226,1926,459],{"class":358},[226,1928,462],{"class":371},[226,1930,465],{"class":314},[226,1932,469],{"class":468},[226,1934,375],{"class":314},[226,1936,474],{"class":232},[226,1938,322],{"class":314},[226,1940,479],{"class":468},[226,1942,482],{"class":314},[226,1944,328],{"class":232},[226,1946,487],{"class":314},[226,1948,490],{"class":232},[226,1950,493],{"class":314},[226,1952,391],{"class":232},[226,1954,498],{"class":314},[226,1956,501],{"class":232},[226,1958,365],{"class":314},[226,1960,1961,1963,1965,1967,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987,1989,1991,1993,1995,1997,1999,2001,2003,2005],{"class":228,"line":417},[226,1962,509],{"class":358},[226,1964,512],{"class":318},[226,1966,515],{"class":314},[226,1968,518],{"class":318},[226,1970,487],{"class":314},[226,1972,523],{"class":318},[226,1974,487],{"class":314},[226,1976,529],{"class":528},[226,1978,465],{"class":371},[226,1980,343],{"class":314},[226,1982,536],{"class":236},[226,1984,343],{"class":314},[226,1986,541],{"class":371},[226,1988,544],{"class":314},[226,1990,547],{"class":528},[226,1992,465],{"class":371},[226,1994,343],{"class":314},[226,1996,554],{"class":236},[226,1998,343],{"class":314},[226,2000,322],{"class":314},[226,2002,561],{"class":314},[226,2004,541],{"class":371},[226,2006,346],{"class":314},[226,2008,2009],{"class":228,"line":422},[226,2010,571],{"class":371},[226,2012,2013,2015,2017,2019,2021,2023],{"class":228,"line":450},[226,2014,577],{"class":310},[226,2016,580],{"class":371},[226,2018,583],{"class":314},[226,2020,586],{"class":318},[226,2022,589],{"class":371},[226,2024,592],{"class":314},[226,2026,2027,2029,2031,2034,2036],{"class":228,"line":456},[226,2028,598],{"class":310},[226,2030,337],{"class":314},[226,2032,2033],{"class":236},"Authorization header required",[226,2035,343],{"class":314},[226,2037,346],{"class":314},[226,2039,2040],{"class":228,"line":506},[226,2041,613],{"class":314},[226,2043,2044],{"class":228,"line":568},[226,2045,352],{"emptyLinePlaceholder":56},[226,2047,2048,2050],{"class":228,"line":574},[226,2049,624],{"class":310},[226,2051,365],{"class":314},[226,2053,2054,2056,2059,2061,2064,2066,2069,2071,2073,2075,2077,2080,2082,2085,2087],{"class":228,"line":595},[226,2055,632],{"class":358},[226,2057,2058],{"class":318}," decoded",[226,2060,515],{"class":314},[226,2062,2063],{"class":318}," jwt",[226,2065,487],{"class":314},[226,2067,2068],{"class":528},"verify",[226,2070,465],{"class":371},[226,2072,586],{"class":318},[226,2074,322],{"class":314},[226,2076,640],{"class":314},[226,2078,2079],{"class":318},"secret",[226,2081,589],{"class":371},[226,2083,2084],{"class":310},"as",[226,2086,362],{"class":232},[226,2088,346],{"class":314},[226,2090,2091],{"class":228,"line":610},[226,2092,657],{"class":371},[226,2094,2095,2097,2099,2101,2103,2105,2107,2109,2111],{"class":228,"line":616},[226,2096,670],{"class":310},[226,2098,580],{"class":371},[226,2100,675],{"class":318},[226,2102,544],{"class":314},[226,2104,680],{"class":318},[226,2106,544],{"class":314},[226,2108,694],{"class":318},[226,2110,589],{"class":371},[226,2112,592],{"class":314},[226,2114,2115,2117,2119,2121,2123,2125,2127,2129,2131,2133,2135,2137,2139,2141,2143,2145,2147,2149,2151,2154],{"class":228,"line":621},[226,2116,761],{"class":310},[226,2118,580],{"class":371},[226,2120,583],{"class":314},[226,2122,675],{"class":318},[226,2124,487],{"class":314},[226,2126,680],{"class":318},[226,2128,487],{"class":314},[226,2130,727],{"class":528},[226,2132,465],{"class":371},[226,2134,732],{"class":468},[226,2136,735],{"class":358},[226,2138,2058],{"class":318},[226,2140,487],{"class":314},[226,2142,680],{"class":318},[226,2144,487],{"class":314},[226,2146,746],{"class":528},[226,2148,465],{"class":371},[226,2150,732],{"class":318},[226,2152,2153],{"class":371},"))) ",[226,2155,592],{"class":314},[226,2157,2158,2160,2162,2164,2166],{"class":228,"line":629},[226,2159,778],{"class":310},[226,2161,337],{"class":314},[226,2163,783],{"class":236},[226,2165,343],{"class":314},[226,2167,346],{"class":314},[226,2169,2170],{"class":228,"line":654},[226,2171,793],{"class":314},[226,2173,2174],{"class":228,"line":660},[226,2175,799],{"class":314},[226,2177,2178],{"class":228,"line":667},[226,2179,657],{"class":371},[226,2181,2182,2184],{"class":228,"line":708},[226,2183,598],{"class":310},[226,2185,959],{"class":314},[226,2187,2188,2190,2192,2194,2197,2199],{"class":228,"line":758},[226,2189,821],{"class":314},[226,2191,824],{"class":310},[226,2193,580],{"class":371},[226,2195,2196],{"class":318},"error",[226,2198,589],{"class":371},[226,2200,592],{"class":314},[226,2202,2203,2205,2207,2209,2212,2214,2216,2219,2221],{"class":228,"line":775},[226,2204,670],{"class":310},[226,2206,580],{"class":371},[226,2208,2196],{"class":318},[226,2210,2211],{"class":314}," instanceof",[226,2213,2063],{"class":232},[226,2215,487],{"class":314},[226,2217,2218],{"class":232},"TokenExpiredError",[226,2220,589],{"class":371},[226,2222,592],{"class":314},[226,2224,2225,2228,2230,2233,2235],{"class":228,"line":790},[226,2226,2227],{"class":310},"        return",[226,2229,337],{"class":314},[226,2231,2232],{"class":236},"Token expired",[226,2234,343],{"class":314},[226,2236,346],{"class":314},[226,2238,2239],{"class":228,"line":796},[226,2240,799],{"class":314},[226,2242,2243,2245,2247,2249,2251],{"class":228,"line":802},[226,2244,598],{"class":310},[226,2246,337],{"class":314},[226,2248,836],{"class":236},[226,2250,343],{"class":314},[226,2252,346],{"class":314},[226,2254,2255],{"class":228,"line":807},[226,2256,613],{"class":314},[226,2258,2259],{"class":228,"line":818},[226,2260,851],{"class":314},[226,2262,2263],{"class":228,"line":829},[226,2264,352],{"emptyLinePlaceholder":56},[226,2266,2267,2269,2271,2273,2275,2277,2279,2281,2283,2285,2287],{"class":228,"line":843},[226,2268,459],{"class":358},[226,2270,864],{"class":371},[226,2272,465],{"class":314},[226,2274,469],{"class":468},[226,2276,375],{"class":314},[226,2278,474],{"class":232},[226,2280,493],{"class":314},[226,2282,362],{"class":232},[226,2284,498],{"class":314},[226,2286,501],{"class":232},[226,2288,365],{"class":314},[226,2290,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319,2321,2323,2325,2327,2329,2331,2333,2335],{"class":228,"line":848},[226,2292,509],{"class":358},[226,2294,512],{"class":318},[226,2296,515],{"class":314},[226,2298,518],{"class":318},[226,2300,487],{"class":314},[226,2302,523],{"class":318},[226,2304,487],{"class":314},[226,2306,529],{"class":528},[226,2308,465],{"class":371},[226,2310,343],{"class":314},[226,2312,536],{"class":236},[226,2314,343],{"class":314},[226,2316,541],{"class":371},[226,2318,544],{"class":314},[226,2320,547],{"class":528},[226,2322,465],{"class":371},[226,2324,343],{"class":314},[226,2326,554],{"class":236},[226,2328,343],{"class":314},[226,2330,322],{"class":314},[226,2332,561],{"class":314},[226,2334,541],{"class":371},[226,2336,346],{"class":314},[226,2338,2339,2341,2343,2345,2347,2349,2352],{"class":228,"line":854},[226,2340,577],{"class":310},[226,2342,580],{"class":371},[226,2344,583],{"class":314},[226,2346,586],{"class":318},[226,2348,589],{"class":371},[226,2350,2351],{"class":310},"return",[226,2353,959],{"class":314},[226,2355,2356],{"class":228,"line":859},[226,2357,571],{"class":371},[226,2359,2360,2362],{"class":228,"line":885},[226,2361,624],{"class":310},[226,2363,365],{"class":314},[226,2365,2366,2368,2370,2372,2374,2376,2378,2380,2382,2384,2386,2388,2390],{"class":228,"line":934},[226,2367,598],{"class":310},[226,2369,2063],{"class":318},[226,2371,487],{"class":314},[226,2373,2068],{"class":528},[226,2375,465],{"class":371},[226,2377,586],{"class":318},[226,2379,322],{"class":314},[226,2381,640],{"class":314},[226,2383,2079],{"class":318},[226,2385,589],{"class":371},[226,2387,2084],{"class":310},[226,2389,362],{"class":232},[226,2391,346],{"class":314},[226,2393,2394,2396,2398],{"class":228,"line":939},[226,2395,821],{"class":314},[226,2397,824],{"class":310},[226,2399,365],{"class":314},[226,2401,2402,2404],{"class":228,"line":954},[226,2403,598],{"class":310},[226,2405,959],{"class":314},[226,2407,2408],{"class":228,"line":962},[226,2409,613],{"class":314},[226,2411,2412],{"class":228,"line":967},[226,2413,851],{"class":314},[226,2415,2416],{"class":228,"line":972},[226,2417,414],{"class":314},[215,2419,2422],{"className":300,"code":2420,"filename":2421,"language":303,"meta":221,"style":221},"import { AuthProvider, type AuthTypes } from '@vercube\u002Fauth';\n\ninterface ApiKeyUser {\n  apiKeyId: string;\n  permissions: string[];\n}\n\nexport class ApiKeyAuthProvider extends AuthProvider\u003CApiKeyUser> {\n  private validKeys = new Map\u003Cstring, ApiKeyUser>();\n  \n  public validate(request: Request): string | null {\n    const apiKey = request.headers.get('X-API-Key');\n    \n    if (!apiKey) {\n      return 'API key required';\n    }\n\n    if (!this.validKeys.has(apiKey)) {\n      return 'Invalid API key';\n    }\n    \n    return null;\n  }\n\n  public getCurrentUser(request: Request): ApiKeyUser | null {\n    const apiKey = request.headers.get('X-API-Key');\n    return apiKey ? this.validKeys.get(apiKey) || null : null;\n  }\n}\n","API Key",[223,2423,2424,2450,2454,2463,2474,2487,2491,2495,2517,2548,2552,2576,2608,2612,2627,2640,2644,2648,2674,2687,2691,2695,2701,2705,2709,2733,2763,2796,2800],{"__ignoreMap":221},[226,2425,2426,2428,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448],{"class":228,"line":229},[226,2427,311],{"class":310},[226,2429,315],{"class":314},[226,2431,319],{"class":318},[226,2433,322],{"class":314},[226,2435,325],{"class":310},[226,2437,328],{"class":318},[226,2439,331],{"class":314},[226,2441,334],{"class":310},[226,2443,337],{"class":314},[226,2445,340],{"class":236},[226,2447,343],{"class":314},[226,2449,346],{"class":314},[226,2451,2452],{"class":228,"line":349},[226,2453,352],{"emptyLinePlaceholder":56},[226,2455,2456,2458,2461],{"class":228,"line":355},[226,2457,359],{"class":358},[226,2459,2460],{"class":232}," ApiKeyUser",[226,2462,365],{"class":314},[226,2464,2465,2468,2470,2472],{"class":228,"line":368},[226,2466,2467],{"class":371},"  apiKeyId",[226,2469,375],{"class":314},[226,2471,391],{"class":232},[226,2473,346],{"class":314},[226,2475,2476,2479,2481,2483,2485],{"class":228,"line":383},[226,2477,2478],{"class":371},"  permissions",[226,2480,375],{"class":314},[226,2482,391],{"class":232},[226,2484,406],{"class":318},[226,2486,346],{"class":314},[226,2488,2489],{"class":228,"line":396},[226,2490,414],{"class":314},[226,2492,2493],{"class":228,"line":411},[226,2494,352],{"emptyLinePlaceholder":56},[226,2496,2497,2499,2501,2504,2506,2508,2510,2513,2515],{"class":228,"line":417},[226,2498,425],{"class":310},[226,2500,428],{"class":358},[226,2502,2503],{"class":232}," ApiKeyAuthProvider",[226,2505,434],{"class":358},[226,2507,319],{"class":232},[226,2509,439],{"class":314},[226,2511,2512],{"class":232},"ApiKeyUser",[226,2514,445],{"class":314},[226,2516,365],{"class":314},[226,2518,2519,2521,2524,2526,2529,2532,2534,2537,2539,2541,2543,2546],{"class":228,"line":422},[226,2520,1030],{"class":358},[226,2522,2523],{"class":371}," validKeys",[226,2525,515],{"class":314},[226,2527,2528],{"class":314}," new",[226,2530,2531],{"class":371}," Map",[226,2533,439],{"class":314},[226,2535,2536],{"class":232},"string",[226,2538,322],{"class":314},[226,2540,2460],{"class":232},[226,2542,445],{"class":314},[226,2544,2545],{"class":318},"()",[226,2547,346],{"class":314},[226,2549,2550],{"class":228,"line":450},[226,2551,453],{"class":318},[226,2553,2554,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574],{"class":228,"line":456},[226,2555,459],{"class":358},[226,2557,462],{"class":371},[226,2559,465],{"class":314},[226,2561,469],{"class":468},[226,2563,375],{"class":314},[226,2565,474],{"class":232},[226,2567,493],{"class":314},[226,2569,391],{"class":232},[226,2571,498],{"class":314},[226,2573,501],{"class":232},[226,2575,365],{"class":314},[226,2577,2578,2580,2583,2585,2587,2589,2591,2593,2595,2597,2599,2602,2604,2606],{"class":228,"line":506},[226,2579,509],{"class":358},[226,2581,2582],{"class":318}," apiKey",[226,2584,515],{"class":314},[226,2586,518],{"class":318},[226,2588,487],{"class":314},[226,2590,523],{"class":318},[226,2592,487],{"class":314},[226,2594,529],{"class":528},[226,2596,465],{"class":371},[226,2598,343],{"class":314},[226,2600,2601],{"class":236},"X-API-Key",[226,2603,343],{"class":314},[226,2605,541],{"class":371},[226,2607,346],{"class":314},[226,2609,2610],{"class":228,"line":568},[226,2611,571],{"class":371},[226,2613,2614,2616,2618,2620,2623,2625],{"class":228,"line":574},[226,2615,577],{"class":310},[226,2617,580],{"class":371},[226,2619,583],{"class":314},[226,2621,2622],{"class":318},"apiKey",[226,2624,589],{"class":371},[226,2626,592],{"class":314},[226,2628,2629,2631,2633,2636,2638],{"class":228,"line":595},[226,2630,598],{"class":310},[226,2632,337],{"class":314},[226,2634,2635],{"class":236},"API key required",[226,2637,343],{"class":314},[226,2639,346],{"class":314},[226,2641,2642],{"class":228,"line":610},[226,2643,613],{"class":314},[226,2645,2646],{"class":228,"line":616},[226,2647,352],{"emptyLinePlaceholder":56},[226,2649,2650,2652,2654,2657,2660,2662,2665,2667,2669,2672],{"class":228,"line":621},[226,2651,577],{"class":310},[226,2653,580],{"class":371},[226,2655,2656],{"class":314},"!this.",[226,2658,2659],{"class":318},"validKeys",[226,2661,487],{"class":314},[226,2663,2664],{"class":528},"has",[226,2666,465],{"class":371},[226,2668,2622],{"class":318},[226,2670,2671],{"class":371},")) ",[226,2673,592],{"class":314},[226,2675,2676,2678,2680,2683,2685],{"class":228,"line":629},[226,2677,598],{"class":310},[226,2679,337],{"class":314},[226,2681,2682],{"class":236},"Invalid API key",[226,2684,343],{"class":314},[226,2686,346],{"class":314},[226,2688,2689],{"class":228,"line":654},[226,2690,613],{"class":314},[226,2692,2693],{"class":228,"line":660},[226,2694,571],{"class":371},[226,2696,2697,2699],{"class":228,"line":667},[226,2698,1065],{"class":310},[226,2700,959],{"class":314},[226,2702,2703],{"class":228,"line":708},[226,2704,851],{"class":314},[226,2706,2707],{"class":228,"line":758},[226,2708,352],{"emptyLinePlaceholder":56},[226,2710,2711,2713,2715,2717,2719,2721,2723,2725,2727,2729,2731],{"class":228,"line":775},[226,2712,459],{"class":358},[226,2714,864],{"class":371},[226,2716,465],{"class":314},[226,2718,469],{"class":468},[226,2720,375],{"class":314},[226,2722,474],{"class":232},[226,2724,493],{"class":314},[226,2726,2460],{"class":232},[226,2728,498],{"class":314},[226,2730,501],{"class":232},[226,2732,365],{"class":314},[226,2734,2735,2737,2739,2741,2743,2745,2747,2749,2751,2753,2755,2757,2759,2761],{"class":228,"line":790},[226,2736,509],{"class":358},[226,2738,2582],{"class":318},[226,2740,515],{"class":314},[226,2742,518],{"class":318},[226,2744,487],{"class":314},[226,2746,523],{"class":318},[226,2748,487],{"class":314},[226,2750,529],{"class":528},[226,2752,465],{"class":371},[226,2754,343],{"class":314},[226,2756,2601],{"class":236},[226,2758,343],{"class":314},[226,2760,541],{"class":371},[226,2762,346],{"class":314},[226,2764,2765,2767,2769,2772,2774,2776,2778,2780,2782,2784,2786,2789,2791,2794],{"class":228,"line":796},[226,2766,1065],{"class":310},[226,2768,2582],{"class":318},[226,2770,2771],{"class":314}," ?",[226,2773,640],{"class":314},[226,2775,2659],{"class":318},[226,2777,487],{"class":314},[226,2779,529],{"class":528},[226,2781,465],{"class":371},[226,2783,2622],{"class":318},[226,2785,589],{"class":371},[226,2787,2788],{"class":314},"||",[226,2790,501],{"class":314},[226,2792,2793],{"class":314}," :",[226,2795,959],{"class":314},[226,2797,2798],{"class":228,"line":802},[226,2799,851],{"class":314},[226,2801,2802],{"class":228,"line":807},[226,2803,414],{"class":314},[215,2805,2808],{"className":300,"code":2806,"filename":2807,"language":303,"meta":221,"style":221},"import { AuthProvider } from '@vercube\u002Fauth';\nimport { Inject } from '@vercube\u002Fdi';\n\nexport class SessionAuthProvider extends AuthProvider\u003CUser> {\n  @Inject(SessionStore)\n  private sessions!: SessionStore;\n  \n  public async validate(request: Request): Promise\u003Cstring | null> {\n    const sessionId = this.getSessionCookie(request);\n    \n    if (!sessionId) {\n      return 'Session required';\n    }\n\n    const session = await this.sessions.get(sessionId);\n    if (!session) {\n      return 'Invalid or expired session';\n    }\n    \n    return null;\n  }\n\n  public async getCurrentUser(request: Request): Promise\u003CUser | null> {\n    const sessionId = this.getSessionCookie(request);\n    if (!sessionId) return null;\n    \n    const session = await this.sessions.get(sessionId);\n    return session?.user || null;\n  }\n  \n  private getSessionCookie(request: Request): string | null {\n    const cookies = request.headers.get('Cookie');\n    \u002F\u002F Parse session cookie...\n    return null;\n  }\n}\n","Session",[223,2809,2810,2830,2852,2856,2877,2887,2902,2906,2940,2962,2966,2981,2994,2998,3002,3031,3046,3059,3063,3067,3073,3077,3081,3113,3133,3149,3153,3179,3194,3198,3202,3227,3259,3264,3270,3274],{"__ignoreMap":221},[226,2811,2812,2814,2816,2818,2820,2822,2824,2826,2828],{"class":228,"line":229},[226,2813,311],{"class":310},[226,2815,315],{"class":314},[226,2817,319],{"class":318},[226,2819,331],{"class":314},[226,2821,334],{"class":310},[226,2823,337],{"class":314},[226,2825,340],{"class":236},[226,2827,343],{"class":314},[226,2829,346],{"class":314},[226,2831,2832,2834,2836,2839,2841,2843,2845,2848,2850],{"class":228,"line":349},[226,2833,311],{"class":310},[226,2835,315],{"class":314},[226,2837,2838],{"class":318}," Inject",[226,2840,331],{"class":314},[226,2842,334],{"class":310},[226,2844,337],{"class":314},[226,2846,2847],{"class":236},"@vercube\u002Fdi",[226,2849,343],{"class":314},[226,2851,346],{"class":314},[226,2853,2854],{"class":228,"line":355},[226,2855,352],{"emptyLinePlaceholder":56},[226,2857,2858,2860,2862,2865,2867,2869,2871,2873,2875],{"class":228,"line":368},[226,2859,425],{"class":310},[226,2861,428],{"class":358},[226,2863,2864],{"class":232}," SessionAuthProvider",[226,2866,434],{"class":358},[226,2868,319],{"class":232},[226,2870,439],{"class":314},[226,2872,442],{"class":232},[226,2874,445],{"class":314},[226,2876,365],{"class":314},[226,2878,2879,2881,2884],{"class":228,"line":383},[226,2880,1421],{"class":314},[226,2882,2883],{"class":528},"Inject",[226,2885,2886],{"class":318},"(SessionStore)\n",[226,2888,2889,2891,2894,2897,2900],{"class":228,"line":396},[226,2890,1030],{"class":358},[226,2892,2893],{"class":371}," sessions",[226,2895,2896],{"class":314},"!:",[226,2898,2899],{"class":232}," SessionStore",[226,2901,346],{"class":314},[226,2903,2904],{"class":228,"line":411},[226,2905,453],{"class":318},[226,2907,2908,2910,2913,2915,2917,2919,2921,2923,2925,2928,2930,2932,2934,2936,2938],{"class":228,"line":417},[226,2909,459],{"class":358},[226,2911,2912],{"class":358}," async",[226,2914,462],{"class":371},[226,2916,465],{"class":314},[226,2918,469],{"class":468},[226,2920,375],{"class":314},[226,2922,474],{"class":232},[226,2924,493],{"class":314},[226,2926,2927],{"class":232}," Promise",[226,2929,439],{"class":314},[226,2931,2536],{"class":232},[226,2933,498],{"class":314},[226,2935,501],{"class":232},[226,2937,445],{"class":314},[226,2939,365],{"class":314},[226,2941,2942,2944,2947,2949,2951,2954,2956,2958,2960],{"class":228,"line":422},[226,2943,509],{"class":358},[226,2945,2946],{"class":318}," sessionId",[226,2948,515],{"class":314},[226,2950,640],{"class":314},[226,2952,2953],{"class":528},"getSessionCookie",[226,2955,465],{"class":371},[226,2957,469],{"class":318},[226,2959,541],{"class":371},[226,2961,346],{"class":314},[226,2963,2964],{"class":228,"line":450},[226,2965,571],{"class":371},[226,2967,2968,2970,2972,2974,2977,2979],{"class":228,"line":456},[226,2969,577],{"class":310},[226,2971,580],{"class":371},[226,2973,583],{"class":314},[226,2975,2976],{"class":318},"sessionId",[226,2978,589],{"class":371},[226,2980,592],{"class":314},[226,2982,2983,2985,2987,2990,2992],{"class":228,"line":506},[226,2984,598],{"class":310},[226,2986,337],{"class":314},[226,2988,2989],{"class":236},"Session required",[226,2991,343],{"class":314},[226,2993,346],{"class":314},[226,2995,2996],{"class":228,"line":568},[226,2997,613],{"class":314},[226,2999,3000],{"class":228,"line":574},[226,3001,352],{"emptyLinePlaceholder":56},[226,3003,3004,3006,3009,3011,3014,3016,3019,3021,3023,3025,3027,3029],{"class":228,"line":595},[226,3005,509],{"class":358},[226,3007,3008],{"class":318}," session",[226,3010,515],{"class":314},[226,3012,3013],{"class":310}," await",[226,3015,640],{"class":314},[226,3017,3018],{"class":318},"sessions",[226,3020,487],{"class":314},[226,3022,529],{"class":528},[226,3024,465],{"class":371},[226,3026,2976],{"class":318},[226,3028,541],{"class":371},[226,3030,346],{"class":314},[226,3032,3033,3035,3037,3039,3042,3044],{"class":228,"line":610},[226,3034,577],{"class":310},[226,3036,580],{"class":371},[226,3038,583],{"class":314},[226,3040,3041],{"class":318},"session",[226,3043,589],{"class":371},[226,3045,592],{"class":314},[226,3047,3048,3050,3052,3055,3057],{"class":228,"line":616},[226,3049,598],{"class":310},[226,3051,337],{"class":314},[226,3053,3054],{"class":236},"Invalid or expired session",[226,3056,343],{"class":314},[226,3058,346],{"class":314},[226,3060,3061],{"class":228,"line":621},[226,3062,613],{"class":314},[226,3064,3065],{"class":228,"line":629},[226,3066,571],{"class":371},[226,3068,3069,3071],{"class":228,"line":654},[226,3070,1065],{"class":310},[226,3072,959],{"class":314},[226,3074,3075],{"class":228,"line":660},[226,3076,851],{"class":314},[226,3078,3079],{"class":228,"line":667},[226,3080,352],{"emptyLinePlaceholder":56},[226,3082,3083,3085,3087,3089,3091,3093,3095,3097,3099,3101,3103,3105,3107,3109,3111],{"class":228,"line":708},[226,3084,459],{"class":358},[226,3086,2912],{"class":358},[226,3088,864],{"class":371},[226,3090,465],{"class":314},[226,3092,469],{"class":468},[226,3094,375],{"class":314},[226,3096,474],{"class":232},[226,3098,493],{"class":314},[226,3100,2927],{"class":232},[226,3102,439],{"class":314},[226,3104,442],{"class":232},[226,3106,498],{"class":314},[226,3108,501],{"class":232},[226,3110,445],{"class":314},[226,3112,365],{"class":314},[226,3114,3115,3117,3119,3121,3123,3125,3127,3129,3131],{"class":228,"line":758},[226,3116,509],{"class":358},[226,3118,2946],{"class":318},[226,3120,515],{"class":314},[226,3122,640],{"class":314},[226,3124,2953],{"class":528},[226,3126,465],{"class":371},[226,3128,469],{"class":318},[226,3130,541],{"class":371},[226,3132,346],{"class":314},[226,3134,3135,3137,3139,3141,3143,3145,3147],{"class":228,"line":775},[226,3136,577],{"class":310},[226,3138,580],{"class":371},[226,3140,583],{"class":314},[226,3142,2976],{"class":318},[226,3144,589],{"class":371},[226,3146,2351],{"class":310},[226,3148,959],{"class":314},[226,3150,3151],{"class":228,"line":790},[226,3152,571],{"class":371},[226,3154,3155,3157,3159,3161,3163,3165,3167,3169,3171,3173,3175,3177],{"class":228,"line":796},[226,3156,509],{"class":358},[226,3158,3008],{"class":318},[226,3160,515],{"class":314},[226,3162,3013],{"class":310},[226,3164,640],{"class":314},[226,3166,3018],{"class":318},[226,3168,487],{"class":314},[226,3170,529],{"class":528},[226,3172,465],{"class":371},[226,3174,2976],{"class":318},[226,3176,541],{"class":371},[226,3178,346],{"class":314},[226,3180,3181,3183,3185,3187,3189,3192],{"class":228,"line":802},[226,3182,1065],{"class":310},[226,3184,3008],{"class":318},[226,3186,544],{"class":314},[226,3188,1104],{"class":318},[226,3190,3191],{"class":314}," ||",[226,3193,959],{"class":314},[226,3195,3196],{"class":228,"line":807},[226,3197,851],{"class":314},[226,3199,3200],{"class":228,"line":818},[226,3201,453],{"class":318},[226,3203,3204,3206,3209,3211,3213,3215,3217,3219,3221,3223,3225],{"class":228,"line":829},[226,3205,1030],{"class":358},[226,3207,3208],{"class":371}," getSessionCookie",[226,3210,465],{"class":314},[226,3212,469],{"class":468},[226,3214,375],{"class":314},[226,3216,474],{"class":232},[226,3218,493],{"class":314},[226,3220,391],{"class":232},[226,3222,498],{"class":314},[226,3224,501],{"class":232},[226,3226,365],{"class":314},[226,3228,3229,3231,3234,3236,3238,3240,3242,3244,3246,3248,3250,3253,3255,3257],{"class":228,"line":843},[226,3230,509],{"class":358},[226,3232,3233],{"class":318}," cookies",[226,3235,515],{"class":314},[226,3237,518],{"class":318},[226,3239,487],{"class":314},[226,3241,523],{"class":318},[226,3243,487],{"class":314},[226,3245,529],{"class":528},[226,3247,465],{"class":371},[226,3249,343],{"class":314},[226,3251,3252],{"class":236},"Cookie",[226,3254,343],{"class":314},[226,3256,541],{"class":371},[226,3258,346],{"class":314},[226,3260,3261],{"class":228,"line":848},[226,3262,3263],{"class":663},"    \u002F\u002F Parse session cookie...\n",[226,3265,3266,3268],{"class":228,"line":854},[226,3267,1065],{"class":310},[226,3269,959],{"class":314},[226,3271,3272],{"class":228,"line":859},[226,3273,851],{"class":314},[226,3275,3276],{"class":228,"line":885},[226,3277,414],{"class":314},[3279,3280,3281],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 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}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":221,"searchDepth":229,"depth":349,"links":3283},[3284,3285,3286,3291,3292],{"id":210,"depth":349,"text":18},{"id":281,"depth":349,"text":282},{"id":1596,"depth":349,"text":1597,"children":3287},[3288,3289,3290],{"id":1600,"depth":355,"text":296},{"id":1637,"depth":355,"text":70},{"id":1683,"depth":355,"text":1684},{"id":1766,"depth":349,"text":1767},{"id":1815,"depth":349,"text":1816},"Flexible authentication system for Vercube applications","md",null,{},{"title":66,"description":3293},"pKs9mH6Zo71fVTeqKo1vywl0Zqd6ELOud4AJOjkMFAo",[3300,3302],{"title":49,"path":50,"stem":51,"description":3301,"children":-1},"Automatic request validation with Standard Schema support",{"title":70,"path":71,"stem":72,"description":3303,"children":-1},"Authentication decorators for protecting endpoints and accessing user data",1775552781926]