[{"data":1,"prerenderedAt":2790},["ShallowReactive",2],{"navigation":3,"-adapters-elysia-sessions":171,"-adapters-elysia-sessions-surround":2787},[4,22,78,106,141,148],{"title":5,"path":6,"stem":7,"children":8},"Introduction","\u002Fgetting-started","0.Getting-Started\u002F0.index",[9,10,14,18],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Installation","\u002Fgetting-started\u002Finstallation","0.Getting-Started\u002F1.installation",{"title":15,"path":16,"stem":17},"Quickstart","\u002Fgetting-started\u002Fquickstart","0.Getting-Started\u002F2.quickstart",{"title":19,"path":20,"stem":21},"Core concepts","\u002Fgetting-started\u002Fcore-concepts","0.Getting-Started\u002F3.core-concepts",{"title":23,"path":24,"stem":25,"children":26,"icon":28},"JWT","\u002Fjwt","1.JWT\u002F0.index",[27,29,52],{"title":23,"path":24,"stem":25,"icon":28},"i-carbon-certificate",{"title":30,"path":31,"stem":32,"children":33,"icon":35},"JWS","\u002Fjwt\u002Fjws","1.JWT\u002F1.JWS\u002F0.index",[34,36,40,44,48],{"title":30,"path":31,"stem":32,"icon":35},"i-carbon-document-signed",{"title":37,"path":38,"stem":39},"Signing","\u002Fjwt\u002Fjws\u002Fsigning","1.JWT\u002F1.JWS\u002F1.signing",{"title":41,"path":42,"stem":43},"Verifying","\u002Fjwt\u002Fjws\u002Fverifying","1.JWT\u002F1.JWS\u002F2.verifying",{"title":45,"path":46,"stem":47},"Multi-signature","\u002Fjwt\u002Fjws\u002Fmulti-signature","1.JWT\u002F1.JWS\u002F3.multi-signature",{"title":49,"path":50,"stem":51},"Algorithms","\u002Fjwt\u002Fjws\u002Falgorithms","1.JWT\u002F1.JWS\u002F4.algorithms",{"title":53,"path":54,"stem":55,"children":56,"icon":58},"JWE","\u002Fjwt\u002Fjwe","1.JWT\u002F2.JWE\u002F0.index",[57,59,63,67,71,75],{"title":53,"path":54,"stem":55,"icon":58},"i-carbon-locked",{"title":60,"path":61,"stem":62},"Encrypting","\u002Fjwt\u002Fjwe\u002Fencrypting","1.JWT\u002F2.JWE\u002F1.encrypting",{"title":64,"path":65,"stem":66},"Decrypting","\u002Fjwt\u002Fjwe\u002Fdecrypting","1.JWT\u002F2.JWE\u002F2.decrypting",{"title":68,"path":69,"stem":70},"Multi-recipient","\u002Fjwt\u002Fjwe\u002Fmulti-recipient","1.JWT\u002F2.JWE\u002F3.multi-recipient",{"title":72,"path":73,"stem":74},"ECDH-ES and end-to-end encryption","\u002Fjwt\u002Fjwe\u002Fecdh-es","1.JWT\u002F2.JWE\u002F4.ecdh-es",{"title":49,"path":76,"stem":77},"\u002Fjwt\u002Fjwe\u002Falgorithms","1.JWT\u002F2.JWE\u002F5.algorithms",{"title":79,"path":80,"stem":81,"children":82,"icon":84},"Examples","\u002Fexamples","10.Examples\u002F0.index",[83,85,90,94,98,102],{"title":79,"path":80,"stem":81,"icon":84},"i-carbon-code-reference",{"title":86,"path":87,"stem":88,"icon":89},"Authentication basics","\u002Fexamples\u002Fauthentication-basics","10.Examples\u002F1.authentication-basics","i-lucide-code",{"title":91,"path":92,"stem":93,"icon":89},"Consuming a JWKS endpoint","\u002Fexamples\u002Fjwks-endpoint","10.Examples\u002F2.jwks-endpoint",{"title":95,"path":96,"stem":97,"icon":89},"Refresh token pattern","\u002Fexamples\u002Frefresh-token-pattern","10.Examples\u002F3.refresh-token-pattern",{"title":99,"path":100,"stem":101,"icon":89},"End-to-end encryption","\u002Fexamples\u002Fend-to-end-encryption","10.Examples\u002F4.end-to-end-encryption",{"title":103,"path":104,"stem":105,"icon":89},"Signed receipts","\u002Fexamples\u002Fsigned-receipts","10.Examples\u002F5.signed-receipts",{"title":107,"path":108,"stem":109,"children":110,"icon":112},"JWK","\u002Fjwk","2.JWK\u002F0.index",[111,113,117,121,125,129,133,137],{"title":107,"path":108,"stem":109,"icon":112},"i-carbon-two-factor-authentication",{"title":114,"path":115,"stem":116},"Generating keys","\u002Fjwk\u002Fgenerating","2.JWK\u002F1.generating",{"title":118,"path":119,"stem":120},"Importing and exporting","\u002Fjwk\u002Fimport-export","2.JWK\u002F2.import-export",{"title":122,"path":123,"stem":124},"PEM conversion","\u002Fjwk\u002Fpem","2.JWK\u002F3.pem",{"title":126,"path":127,"stem":128},"Key wrapping","\u002Fjwk\u002Fwrapping","2.JWK\u002F4.wrapping",{"title":130,"path":131,"stem":132},"Password derivation","\u002Fjwk\u002Fpassword-derivation","2.JWK\u002F5.password-derivation",{"title":134,"path":135,"stem":136},"JWK Sets","\u002Fjwk\u002Fjwk-sets","2.JWK\u002F6.jwk-sets",{"title":138,"path":139,"stem":140},"JWK cache","\u002Fjwk\u002Fcache","2.JWK\u002F7.cache",{"title":142,"path":143,"stem":144,"children":145,"icon":147},"Utilities","\u002Futilities","3.Utilities\u002F0.index",[146],{"title":142,"path":143,"stem":144,"icon":147},"i-carbon-tool-box",{"title":149,"path":150,"stem":151,"children":152,"icon":154},"Adapters","\u002Fadapters","99.Adapters\u002F0.index",[153,155,159,163,167],{"title":149,"path":150,"stem":151,"icon":154},"i-carbon-plug",{"title":156,"path":157,"stem":158},"H3 sessions","\u002Fadapters\u002Fh3-sessions","99.Adapters\u002F1.h3-sessions",{"title":160,"path":161,"stem":162},"Lifecycle hooks","\u002Fadapters\u002Fhooks","99.Adapters\u002F2.hooks",{"title":164,"path":165,"stem":166},"Lower-level functions","\u002Fadapters\u002Flower-level","99.Adapters\u002F3.lower-level",{"title":168,"path":169,"stem":170},"Elysia sessions","\u002Fadapters\u002Felysia-sessions","99.Adapters\u002F4.elysia-sessions",{"id":172,"title":168,"body":173,"description":203,"extension":2782,"meta":2783,"navigation":2784,"path":169,"seo":2785,"stem":170,"__hash__":2786},"content\u002F99.Adapters\u002F4.elysia-sessions.md",{"type":174,"value":175,"toc":2761},"minimark",[176,197,229,255,260,270,493,515,520,643,658,662,681,803,810,814,837,938,970,973,1057,1073,1092,1096,1103,1420,1427,1671,1691,1695,1989,2009,2105,2118,2146,2150,2163,2217,2239,2243,2253,2270,2276,2279,2307,2330,2359,2449,2456,2479,2586,2607,2611,2727,2734,2738,2757],[177,178,179,180,187,188,192,193,196],"p",{},"Cookie-based JWT session management for ",[181,182,186],"a",{"href":183,"rel":184},"https:\u002F\u002Felysiajs.com",[185],"nofollow","Elysia",". The adapter ships as two\nplugins — ",[189,190,191],"code",{},"jwsSession"," (signed) and ",[189,194,195],{},"jweSession"," (encrypted) — that attach a ready-to-use session\nmanager to the request context, plus a guard macro for protected routes.",[198,199,204],"pre",{"className":200,"code":201,"language":202,"meta":203,"style":203},"language-ts shiki shiki-themes github-light github-dark github-dark","import { jwsSession, jweSession } from \"unjwt\u002Fadapters\u002Felysia\";\n","ts","",[189,205,206],{"__ignoreMap":203},[207,208,211,215,219,222,226],"span",{"class":209,"line":210},"line",1,[207,212,214],{"class":213},"so5gQ","import",[207,216,218],{"class":217},"slsVL"," { jwsSession, jweSession } ",[207,220,221],{"class":213},"from",[207,223,225],{"class":224},"sfrk1"," \"unjwt\u002Fadapters\u002Felysia\"",[207,227,228],{"class":217},";\n",[230,231,232],"note",{},[177,233,234,235,238,239,242,243,246,247,250,251,254],{},"Peer dep: ",[189,236,237],{},"elysia"," (",[189,240,241],{},">=1.4.0","). The adapter is Web-Standard and runs anywhere Elysia's\n",[189,244,245],{},"app.handle(Request)"," does — Bun, Node (via ",[189,248,249],{},"@elysiajs\u002Fnode"," for the server, not needed for\n",[189,252,253],{},"handle","), Deno, Workers.",[256,257,259],"h2",{"id":258},"basic-usage","Basic usage",[177,261,262,265,266,269],{},[189,263,264],{},".use()"," the plugin, then read ",[189,267,268],{},"ctx.session"," in any route below it:",[198,271,274],{"className":200,"code":272,"filename":273,"language":202,"meta":203,"style":203},"import { Elysia, t } from \"elysia\";\nimport { jweSession } from \"unjwt\u002Fadapters\u002Felysia\";\n\nconst app = new Elysia()\n  .use(jweSession({ key: process.env.SESSION_SECRET!, maxAge: \"7D\" }))\n  .post(\n    \"\u002Flogin\",\n    async ({ session, body }) => {\n      await session.update({ userId: body.userId });\n      return { id: session.id };\n    },\n    { body: t.Object({ userId: t.String() }) },\n  )\n  .get(\"\u002Fme\", ({ session }) => session.data);\n","basic.ts",[189,275,276,290,304,311,334,366,377,386,414,429,438,444,462,468],{"__ignoreMap":203},[207,277,278,280,283,285,288],{"class":209,"line":210},[207,279,214],{"class":213},[207,281,282],{"class":217}," { Elysia, t } ",[207,284,221],{"class":213},[207,286,287],{"class":224}," \"elysia\"",[207,289,228],{"class":217},[207,291,293,295,298,300,302],{"class":209,"line":292},2,[207,294,214],{"class":213},[207,296,297],{"class":217}," { jweSession } ",[207,299,221],{"class":213},[207,301,225],{"class":224},[207,303,228],{"class":217},[207,305,307],{"class":209,"line":306},3,[207,308,310],{"emptyLinePlaceholder":309},true,"\n",[207,312,314,317,321,324,327,331],{"class":209,"line":313},4,[207,315,316],{"class":213},"const",[207,318,320],{"class":319},"suiK_"," app",[207,322,323],{"class":213}," =",[207,325,326],{"class":213}," new",[207,328,330],{"class":329},"shcOC"," Elysia",[207,332,333],{"class":217},"()\n",[207,335,337,340,343,346,348,351,354,357,360,363],{"class":209,"line":336},5,[207,338,339],{"class":217},"  .",[207,341,342],{"class":329},"use",[207,344,345],{"class":217},"(",[207,347,195],{"class":329},[207,349,350],{"class":217},"({ key: process.env.",[207,352,353],{"class":319},"SESSION_SECRET",[207,355,356],{"class":213},"!",[207,358,359],{"class":217},", maxAge: ",[207,361,362],{"class":224},"\"7D\"",[207,364,365],{"class":217}," }))\n",[207,367,369,371,374],{"class":209,"line":368},6,[207,370,339],{"class":217},[207,372,373],{"class":329},"post",[207,375,376],{"class":217},"(\n",[207,378,380,383],{"class":209,"line":379},7,[207,381,382],{"class":224},"    \"\u002Flogin\"",[207,384,385],{"class":217},",\n",[207,387,389,392,395,399,402,405,408,411],{"class":209,"line":388},8,[207,390,391],{"class":213},"    async",[207,393,394],{"class":217}," ({ ",[207,396,398],{"class":397},"sQHwn","session",[207,400,401],{"class":217},", ",[207,403,404],{"class":397},"body",[207,406,407],{"class":217}," }) ",[207,409,410],{"class":213},"=>",[207,412,413],{"class":217}," {\n",[207,415,417,420,423,426],{"class":209,"line":416},9,[207,418,419],{"class":213},"      await",[207,421,422],{"class":217}," session.",[207,424,425],{"class":329},"update",[207,427,428],{"class":217},"({ userId: body.userId });\n",[207,430,432,435],{"class":209,"line":431},10,[207,433,434],{"class":213},"      return",[207,436,437],{"class":217}," { id: session.id };\n",[207,439,441],{"class":209,"line":440},11,[207,442,443],{"class":217},"    },\n",[207,445,447,450,453,456,459],{"class":209,"line":446},12,[207,448,449],{"class":217},"    { body: t.",[207,451,452],{"class":329},"Object",[207,454,455],{"class":217},"({ userId: t.",[207,457,458],{"class":329},"String",[207,460,461],{"class":217},"() }) },\n",[207,463,465],{"class":209,"line":464},13,[207,466,467],{"class":217},"  )\n",[207,469,471,473,476,478,481,484,486,488,490],{"class":209,"line":470},14,[207,472,339],{"class":217},[207,474,475],{"class":329},"get",[207,477,345],{"class":217},[207,479,480],{"class":224},"\"\u002Fme\"",[207,482,483],{"class":217},", ({ ",[207,485,398],{"class":397},[207,487,407],{"class":217},[207,489,410],{"class":213},[207,491,492],{"class":217}," session.data);\n",[177,494,495,497,498,401,501,401,504,401,507,510,511,514],{},[189,496,398],{}," is fully typed — ",[189,499,500],{},"session.data",[189,502,503],{},"session.update()",[189,505,506],{},"session.clear()",[189,508,509],{},"session.id",", etc.\nNo need to call anything to obtain it; the plugin's scoped ",[189,512,513],{},"resolve"," populates it per request.",[516,517,519],"h3",{"id":518},"signed-session-jws","Signed session (JWS)",[198,521,524],{"className":200,"code":522,"filename":523,"language":202,"meta":203,"style":203},"import { Elysia } from \"elysia\";\nimport { jwsSession, generateJWK } from \"unjwt\u002Fadapters\u002Felysia\";\n\nconst keys = await generateJWK(\"RS256\"); \u002F\u002F persist these!\n\nconst app = new Elysia()\n  .use(jwsSession({ key: keys, maxAge: \"1h\" }))\n  .get(\"\u002Fme\", ({ session }) => session.data); \u002F\u002F JWS payload is client-readable\n","jws.ts",[189,525,526,539,552,556,583,587,601,619],{"__ignoreMap":203},[207,527,528,530,533,535,537],{"class":209,"line":210},[207,529,214],{"class":213},[207,531,532],{"class":217}," { Elysia } ",[207,534,221],{"class":213},[207,536,287],{"class":224},[207,538,228],{"class":217},[207,540,541,543,546,548,550],{"class":209,"line":292},[207,542,214],{"class":213},[207,544,545],{"class":217}," { jwsSession, generateJWK } ",[207,547,221],{"class":213},[207,549,225],{"class":224},[207,551,228],{"class":217},[207,553,554],{"class":209,"line":306},[207,555,310],{"emptyLinePlaceholder":309},[207,557,558,560,563,565,568,571,573,576,579],{"class":209,"line":313},[207,559,316],{"class":213},[207,561,562],{"class":319}," keys",[207,564,323],{"class":213},[207,566,567],{"class":213}," await",[207,569,570],{"class":329}," generateJWK",[207,572,345],{"class":217},[207,574,575],{"class":224},"\"RS256\"",[207,577,578],{"class":217},"); ",[207,580,582],{"class":581},"sCsY4","\u002F\u002F persist these!\n",[207,584,585],{"class":209,"line":336},[207,586,310],{"emptyLinePlaceholder":309},[207,588,589,591,593,595,597,599],{"class":209,"line":368},[207,590,316],{"class":213},[207,592,320],{"class":319},[207,594,323],{"class":213},[207,596,326],{"class":213},[207,598,330],{"class":329},[207,600,333],{"class":217},[207,602,603,605,607,609,611,614,617],{"class":209,"line":379},[207,604,339],{"class":217},[207,606,342],{"class":329},[207,608,345],{"class":217},[207,610,191],{"class":329},[207,612,613],{"class":217},"({ key: keys, maxAge: ",[207,615,616],{"class":224},"\"1h\"",[207,618,365],{"class":217},[207,620,621,623,625,627,629,631,633,635,637,640],{"class":209,"line":388},[207,622,339],{"class":217},[207,624,475],{"class":329},[207,626,345],{"class":217},[207,628,480],{"class":224},[207,630,483],{"class":217},[207,632,398],{"class":397},[207,634,407],{"class":217},[207,636,410],{"class":213},[207,638,639],{"class":217}," session.data); ",[207,641,642],{"class":581},"\u002F\u002F JWS payload is client-readable\n",[177,644,645,646,649,650,653,654,657],{},"See ",[181,647,648],{"href":150},"JWE vs JWS"," for when to choose which. Cookie defaults match the rest of the library:\nJWE ",[189,651,652],{},"httpOnly: true",", JWS ",[189,655,656],{},"httpOnly: false"," (the signed payload is meant to be readable).",[256,659,661],{"id":660},"protecting-routes-the-guard-macro","Protecting routes — the guard macro",[177,663,664,665,668,669,672,673,676,677,680],{},"Each plugin registers a guard macro named after its context key. The default key ",[189,666,667],{},"\"session\""," yields\n",[189,670,671],{},"requireSession",". Opt a route (or a ",[189,674,675],{},".guard"," group) in, and unauthenticated requests get ",[189,678,679],{},"401","\nbefore the handler runs:",[198,682,685],{"className":200,"code":683,"filename":684,"language":202,"meta":203,"style":203},"const app = new Elysia()\n  .use(jwsSession({ key: keys, maxAge: \"1h\" }))\n  .get(\"\u002Fme\", ({ session }) => session.data) \u002F\u002F open\n  .guard(\n    { requireSession: true },\n    (app) => app.get(\"\u002Fadmin\", ({ session }) => session.data), \u002F\u002F 401 without a valid session\n  );\n","guard.ts",[189,686,687,701,717,741,750,761,798],{"__ignoreMap":203},[207,688,689,691,693,695,697,699],{"class":209,"line":210},[207,690,316],{"class":213},[207,692,320],{"class":319},[207,694,323],{"class":213},[207,696,326],{"class":213},[207,698,330],{"class":329},[207,700,333],{"class":217},[207,702,703,705,707,709,711,713,715],{"class":209,"line":292},[207,704,339],{"class":217},[207,706,342],{"class":329},[207,708,345],{"class":217},[207,710,191],{"class":329},[207,712,613],{"class":217},[207,714,616],{"class":224},[207,716,365],{"class":217},[207,718,719,721,723,725,727,729,731,733,735,738],{"class":209,"line":306},[207,720,339],{"class":217},[207,722,475],{"class":329},[207,724,345],{"class":217},[207,726,480],{"class":224},[207,728,483],{"class":217},[207,730,398],{"class":397},[207,732,407],{"class":217},[207,734,410],{"class":213},[207,736,737],{"class":217}," session.data) ",[207,739,740],{"class":581},"\u002F\u002F open\n",[207,742,743,745,748],{"class":209,"line":313},[207,744,339],{"class":217},[207,746,747],{"class":329},"guard",[207,749,376],{"class":217},[207,751,752,755,758],{"class":209,"line":336},[207,753,754],{"class":217},"    { requireSession: ",[207,756,757],{"class":319},"true",[207,759,760],{"class":217}," },\n",[207,762,763,766,769,772,774,777,779,781,784,786,788,790,792,795],{"class":209,"line":368},[207,764,765],{"class":217},"    (",[207,767,768],{"class":397},"app",[207,770,771],{"class":217},") ",[207,773,410],{"class":213},[207,775,776],{"class":217}," app.",[207,778,475],{"class":329},[207,780,345],{"class":217},[207,782,783],{"class":224},"\"\u002Fadmin\"",[207,785,483],{"class":217},[207,787,398],{"class":397},[207,789,407],{"class":217},[207,791,410],{"class":213},[207,793,794],{"class":217}," session.data), ",[207,796,797],{"class":581},"\u002F\u002F 401 without a valid session\n",[207,799,800],{"class":209,"line":379},[207,801,802],{"class":217},"  );\n",[177,804,805,806,809],{},"The guard returns Elysia's ",[189,807,808],{},"status(401)"," (idiomatic — correct HTTP status and Eden\u002FOpenAPI types),\nit does not throw or redirect.",[256,811,813],{"id":812},"multiple-sessions-on-one-app","Multiple sessions on one app",[177,815,816,817,821,822,825,826,829,830,829,833,836],{},"Run several sessions side by side — e.g. a short-lived ",[818,819,820],"strong",{},"access"," token (JWS, client-readable) and a\nlong-lived ",[818,823,824],{},"refresh"," token (JWE, opaque). Give each plugin a distinct ",[189,827,828],{},"contextKey"," ",[818,831,832],{},"and",[189,834,835],{},"name",":",[198,838,841],{"className":200,"code":839,"filename":840,"language":202,"meta":203,"style":203},"const app = new Elysia()\n  .use(jwsSession({ key: accessKey, contextKey: \"access\", name: \"at\", maxAge: \"10m\" }))\n  .use(jweSession({ key: refreshKey, contextKey: \"refresh\", name: \"rt\", maxAge: \"7D\" }))\n  .get(\"\u002Fme\", ({ access, refresh }) => ({ user: access.data, sub: refresh.data.sub }));\n","access-refresh.ts",[189,842,843,857,886,913],{"__ignoreMap":203},[207,844,845,847,849,851,853,855],{"class":209,"line":210},[207,846,316],{"class":213},[207,848,320],{"class":319},[207,850,323],{"class":213},[207,852,326],{"class":213},[207,854,330],{"class":329},[207,856,333],{"class":217},[207,858,859,861,863,865,867,870,873,876,879,881,884],{"class":209,"line":292},[207,860,339],{"class":217},[207,862,342],{"class":329},[207,864,345],{"class":217},[207,866,191],{"class":329},[207,868,869],{"class":217},"({ key: accessKey, contextKey: ",[207,871,872],{"class":224},"\"access\"",[207,874,875],{"class":217},", name: ",[207,877,878],{"class":224},"\"at\"",[207,880,359],{"class":217},[207,882,883],{"class":224},"\"10m\"",[207,885,365],{"class":217},[207,887,888,890,892,894,896,899,902,904,907,909,911],{"class":209,"line":306},[207,889,339],{"class":217},[207,891,342],{"class":329},[207,893,345],{"class":217},[207,895,195],{"class":329},[207,897,898],{"class":217},"({ key: refreshKey, contextKey: ",[207,900,901],{"class":224},"\"refresh\"",[207,903,875],{"class":217},[207,905,906],{"class":224},"\"rt\"",[207,908,359],{"class":217},[207,910,362],{"class":224},[207,912,365],{"class":217},[207,914,915,917,919,921,923,925,927,929,931,933,935],{"class":209,"line":313},[207,916,339],{"class":217},[207,918,475],{"class":329},[207,920,345],{"class":217},[207,922,480],{"class":224},[207,924,483],{"class":217},[207,926,820],{"class":397},[207,928,401],{"class":217},[207,930,824],{"class":397},[207,932,407],{"class":217},[207,934,410],{"class":213},[207,936,937],{"class":217}," ({ user: access.data, sub: refresh.data.sub }));\n",[939,940,941,959],"ul",{},[942,943,944,948,949,401,952,955,956,958],"li",{},[818,945,946],{},[189,947,828],{}," — the context property the session is exposed under (",[189,950,951],{},"ctx.access",[189,953,954],{},"ctx.refresh",").\nDefaults to ",[189,957,667],{},".",[942,960,961,965,966,969],{},[818,962,963],{},[189,964,835],{}," — the cookie name (and the default ",[189,967,968],{},"x-\u003Cname>-session"," header). Distinct names keep the\ncookies separate.",[177,971,972],{},"The guard macro is named per context key, so guards don't collide:",[198,974,976],{"className":200,"code":975,"language":202,"meta":203,"style":203},".guard({ requireAccess: true },  (app) => app.get(\"\u002Fapi\", ...))   \u002F\u002F checks ctx.access\n.guard({ requireRefresh: true }, (app) => app.get(\"\u002Frenew\", ...)) \u002F\u002F checks ctx.refresh\n",[189,977,978,1018],{"__ignoreMap":203},[207,979,980,982,984,987,989,992,994,996,998,1000,1002,1004,1007,1009,1012,1015],{"class":209,"line":210},[207,981,958],{"class":217},[207,983,747],{"class":329},[207,985,986],{"class":217},"({ requireAccess: ",[207,988,757],{"class":319},[207,990,991],{"class":217}," },  (",[207,993,768],{"class":397},[207,995,771],{"class":217},[207,997,410],{"class":213},[207,999,776],{"class":217},[207,1001,475],{"class":329},[207,1003,345],{"class":217},[207,1005,1006],{"class":224},"\"\u002Fapi\"",[207,1008,401],{"class":217},[207,1010,1011],{"class":213},"...",[207,1013,1014],{"class":217},"))   ",[207,1016,1017],{"class":581},"\u002F\u002F checks ctx.access\n",[207,1019,1020,1022,1024,1027,1029,1032,1034,1036,1038,1040,1042,1044,1047,1049,1051,1054],{"class":209,"line":292},[207,1021,958],{"class":217},[207,1023,747],{"class":329},[207,1025,1026],{"class":217},"({ requireRefresh: ",[207,1028,757],{"class":319},[207,1030,1031],{"class":217}," }, (",[207,1033,768],{"class":397},[207,1035,771],{"class":217},[207,1037,410],{"class":213},[207,1039,776],{"class":217},[207,1041,475],{"class":329},[207,1043,345],{"class":217},[207,1045,1046],{"class":224},"\"\u002Frenew\"",[207,1048,401],{"class":217},[207,1050,1011],{"class":213},[207,1052,1053],{"class":217},")) ",[207,1055,1056],{"class":581},"\u002F\u002F checks ctx.refresh\n",[177,1058,1059,1060,1063,1064,401,1066,385,1069,1072],{},"The macro name is ",[189,1061,1062],{},"require"," + the capitalized context key: ",[189,1065,671],{},[189,1067,1068],{},"requireAccess",[189,1070,1071],{},"requireRefresh",", etc.",[1074,1075,1076],"warning",{},[177,1077,1078,1079,1082,1083,1085,1086,1088,1089,1091],{},"When combining plugins you ",[818,1080,1081],{},"must"," set distinct ",[189,1084,828],{}," and ",[189,1087,835],{}," on each. With defaults they\nwould both expose ",[189,1090,268],{}," (the later one wins) and reuse default cookie names.",[256,1093,1095],{"id":1094},"configuration","Configuration",[516,1097,1099,1100],{"id":1098},"jws-sessionconfigjws","JWS — ",[189,1101,1102],{},"SessionConfigJWS",[198,1104,1106],{"className":200,"code":1105,"language":202,"meta":203,"style":203},"interface SessionConfigJWS\u003CT, MaxAge, TContext> {\n  key:\n    | JWK_oct\u003CJWK_HMAC> \u002F\u002F symmetric (HMAC) JWK\n    | {\n        privateKey: JWSAsymmetricPrivateJWK;\n        publicKey: JWSAsymmetricPublicJWK | JWSAsymmetricPublicJWK[] | JWKSet;\n      };\n\n  maxAge?: MaxAge; \u002F\u002F ExpiresIn duration; sets exp + cookie lifetime\n  name?: string; \u002F\u002F cookie name (default: \"elysia-jws\")\n  contextKey?: string; \u002F\u002F context property (default: \"session\")\n  cookie?: false | (CookieAttributes & { chunkMaxLength?: number });\n  sessionHeader?: false | string; \u002F\u002F default: x-\u003Cname>-session; \"Bearer \" is stripped\n  generateId?: () => string; \u002F\u002F default: crypto.randomUUID()\n\n  jws?: {\n    signOptions?: Omit\u003CJWSSignOptions, \"expiresIn\">; \u002F\u002F set `alg` to pin the algorithm\n    verifyOptions?: JWTClaimValidationOptions;\n  };\n\n  hooks?: SessionHooksJWS\u003CT, MaxAge, TContext>;\n}\n",[189,1107,1108,1135,1143,1162,1168,1176,1195,1200,1204,1221,1236,1250,1285,1303,1322,1327,1337,1364,1377,1383,1388,1414],{"__ignoreMap":203},[207,1109,1110,1113,1116,1119,1122,1124,1127,1129,1132],{"class":209,"line":210},[207,1111,1112],{"class":213},"interface",[207,1114,1115],{"class":329}," SessionConfigJWS",[207,1117,1118],{"class":217},"\u003C",[207,1120,1121],{"class":329},"T",[207,1123,401],{"class":217},[207,1125,1126],{"class":329},"MaxAge",[207,1128,401],{"class":217},[207,1130,1131],{"class":329},"TContext",[207,1133,1134],{"class":217},"> {\n",[207,1136,1137,1140],{"class":209,"line":292},[207,1138,1139],{"class":397},"  key",[207,1141,1142],{"class":213},":\n",[207,1144,1145,1148,1151,1153,1156,1159],{"class":209,"line":306},[207,1146,1147],{"class":213},"    |",[207,1149,1150],{"class":329}," JWK_oct",[207,1152,1118],{"class":217},[207,1154,1155],{"class":329},"JWK_HMAC",[207,1157,1158],{"class":217},"> ",[207,1160,1161],{"class":581},"\u002F\u002F symmetric (HMAC) JWK\n",[207,1163,1164,1166],{"class":209,"line":313},[207,1165,1147],{"class":213},[207,1167,413],{"class":217},[207,1169,1170,1173],{"class":209,"line":336},[207,1171,1172],{"class":329},"        privateKey",[207,1174,1175],{"class":217},": JWSAsymmetricPrivateJWK;\n",[207,1177,1178,1181,1184,1187,1190,1192],{"class":209,"line":368},[207,1179,1180],{"class":329},"        publicKey",[207,1182,1183],{"class":217},": JWSAsymmetricPublicJWK ",[207,1185,1186],{"class":213},"|",[207,1188,1189],{"class":217}," JWSAsymmetricPublicJWK[] ",[207,1191,1186],{"class":213},[207,1193,1194],{"class":217}," JWKSet;\n",[207,1196,1197],{"class":209,"line":379},[207,1198,1199],{"class":217},"      };\n",[207,1201,1202],{"class":209,"line":388},[207,1203,310],{"emptyLinePlaceholder":309},[207,1205,1206,1209,1212,1215,1218],{"class":209,"line":416},[207,1207,1208],{"class":397},"  maxAge",[207,1210,1211],{"class":213},"?:",[207,1213,1214],{"class":329}," MaxAge",[207,1216,1217],{"class":217},"; ",[207,1219,1220],{"class":581},"\u002F\u002F ExpiresIn duration; sets exp + cookie lifetime\n",[207,1222,1223,1226,1228,1231,1233],{"class":209,"line":431},[207,1224,1225],{"class":397},"  name",[207,1227,1211],{"class":213},[207,1229,1230],{"class":319}," string",[207,1232,1217],{"class":217},[207,1234,1235],{"class":581},"\u002F\u002F cookie name (default: \"elysia-jws\")\n",[207,1237,1238,1241,1243,1245,1247],{"class":209,"line":440},[207,1239,1240],{"class":397},"  contextKey",[207,1242,1211],{"class":213},[207,1244,1230],{"class":319},[207,1246,1217],{"class":217},[207,1248,1249],{"class":581},"\u002F\u002F context property (default: \"session\")\n",[207,1251,1252,1255,1257,1260,1263,1265,1268,1271,1274,1277,1279,1282],{"class":209,"line":446},[207,1253,1254],{"class":397},"  cookie",[207,1256,1211],{"class":213},[207,1258,1259],{"class":319}," false",[207,1261,1262],{"class":213}," |",[207,1264,238],{"class":217},[207,1266,1267],{"class":329},"CookieAttributes",[207,1269,1270],{"class":213}," &",[207,1272,1273],{"class":217}," { ",[207,1275,1276],{"class":397},"chunkMaxLength",[207,1278,1211],{"class":213},[207,1280,1281],{"class":319}," number",[207,1283,1284],{"class":217}," });\n",[207,1286,1287,1290,1292,1294,1296,1298,1300],{"class":209,"line":464},[207,1288,1289],{"class":397},"  sessionHeader",[207,1291,1211],{"class":213},[207,1293,1259],{"class":319},[207,1295,1262],{"class":213},[207,1297,1230],{"class":319},[207,1299,1217],{"class":217},[207,1301,1302],{"class":581},"\u002F\u002F default: x-\u003Cname>-session; \"Bearer \" is stripped\n",[207,1304,1305,1308,1310,1313,1315,1317,1319],{"class":209,"line":470},[207,1306,1307],{"class":329},"  generateId",[207,1309,1211],{"class":213},[207,1311,1312],{"class":217}," () ",[207,1314,410],{"class":213},[207,1316,1230],{"class":319},[207,1318,1217],{"class":217},[207,1320,1321],{"class":581},"\u002F\u002F default: crypto.randomUUID()\n",[207,1323,1325],{"class":209,"line":1324},15,[207,1326,310],{"emptyLinePlaceholder":309},[207,1328,1330,1333,1335],{"class":209,"line":1329},16,[207,1331,1332],{"class":397},"  jws",[207,1334,1211],{"class":213},[207,1336,413],{"class":217},[207,1338,1340,1343,1345,1348,1350,1353,1355,1358,1361],{"class":209,"line":1339},17,[207,1341,1342],{"class":397},"    signOptions",[207,1344,1211],{"class":213},[207,1346,1347],{"class":329}," Omit",[207,1349,1118],{"class":217},[207,1351,1352],{"class":329},"JWSSignOptions",[207,1354,401],{"class":217},[207,1356,1357],{"class":224},"\"expiresIn\"",[207,1359,1360],{"class":217},">; ",[207,1362,1363],{"class":581},"\u002F\u002F set `alg` to pin the algorithm\n",[207,1365,1367,1370,1372,1375],{"class":209,"line":1366},18,[207,1368,1369],{"class":397},"    verifyOptions",[207,1371,1211],{"class":213},[207,1373,1374],{"class":329}," JWTClaimValidationOptions",[207,1376,228],{"class":217},[207,1378,1380],{"class":209,"line":1379},19,[207,1381,1382],{"class":217},"  };\n",[207,1384,1386],{"class":209,"line":1385},20,[207,1387,310],{"emptyLinePlaceholder":309},[207,1389,1391,1394,1396,1399,1401,1403,1405,1407,1409,1411],{"class":209,"line":1390},21,[207,1392,1393],{"class":397},"  hooks",[207,1395,1211],{"class":213},[207,1397,1398],{"class":329}," SessionHooksJWS",[207,1400,1118],{"class":217},[207,1402,1121],{"class":329},[207,1404,401],{"class":217},[207,1406,1126],{"class":329},[207,1408,401],{"class":217},[207,1410,1131],{"class":329},[207,1412,1413],{"class":217},">;\n",[207,1415,1417],{"class":209,"line":1416},22,[207,1418,1419],{"class":217},"}\n",[516,1421,1423,1424],{"id":1422},"jwe-sessionconfigjwe","JWE — ",[189,1425,1426],{},"SessionConfigJWE",[198,1428,1430],{"className":200,"code":1429,"language":202,"meta":203,"style":203},"interface SessionConfigJWE\u003CT, MaxAge, TContext> {\n  key:\n    | string \u002F\u002F password for PBES2\n    | JWEEncryptJWK \u002F\u002F symmetric or public asymmetric JWK\n    | { privateKey: JWEAsymmetricPrivateJWK; publicKey?: JWEAsymmetricPublicJWK };\n\n  maxAge?: MaxAge;\n  name?: string; \u002F\u002F default: \"elysia-jwe\"\n  contextKey?: string; \u002F\u002F default: \"session\"\n  cookie?: false | (CookieAttributes & { chunkMaxLength?: number });\n  sessionHeader?: false | string;\n  generateId?: () => string;\n\n  jwe?: {\n    encryptOptions?: Omit\u003CJWEEncryptOptions, \"expiresIn\">; \u002F\u002F set `alg` + `enc` to pin\n    decryptOptions?: JWTClaimValidationOptions;\n  };\n\n  hooks?: SessionHooksJWE\u003CT, MaxAge, TContext>;\n}\n",[189,1431,1432,1453,1459,1468,1478,1495,1499,1509,1522,1535,1561,1575,1589,1593,1602,1625,1636,1640,1644,1667],{"__ignoreMap":203},[207,1433,1434,1436,1439,1441,1443,1445,1447,1449,1451],{"class":209,"line":210},[207,1435,1112],{"class":213},[207,1437,1438],{"class":329}," SessionConfigJWE",[207,1440,1118],{"class":217},[207,1442,1121],{"class":329},[207,1444,401],{"class":217},[207,1446,1126],{"class":329},[207,1448,401],{"class":217},[207,1450,1131],{"class":329},[207,1452,1134],{"class":217},[207,1454,1455,1457],{"class":209,"line":292},[207,1456,1139],{"class":397},[207,1458,1142],{"class":213},[207,1460,1461,1463,1465],{"class":209,"line":306},[207,1462,1147],{"class":213},[207,1464,1230],{"class":319},[207,1466,1467],{"class":581}," \u002F\u002F password for PBES2\n",[207,1469,1470,1472,1475],{"class":209,"line":313},[207,1471,1147],{"class":213},[207,1473,1474],{"class":217}," JWEEncryptJWK ",[207,1476,1477],{"class":581},"\u002F\u002F symmetric or public asymmetric JWK\n",[207,1479,1480,1482,1484,1487,1490,1492],{"class":209,"line":336},[207,1481,1147],{"class":213},[207,1483,1273],{"class":217},[207,1485,1486],{"class":329},"privateKey",[207,1488,1489],{"class":217},": JWEAsymmetricPrivateJWK; publicKey",[207,1491,1211],{"class":213},[207,1493,1494],{"class":217}," JWEAsymmetricPublicJWK };\n",[207,1496,1497],{"class":209,"line":368},[207,1498,310],{"emptyLinePlaceholder":309},[207,1500,1501,1503,1505,1507],{"class":209,"line":379},[207,1502,1208],{"class":397},[207,1504,1211],{"class":213},[207,1506,1214],{"class":329},[207,1508,228],{"class":217},[207,1510,1511,1513,1515,1517,1519],{"class":209,"line":388},[207,1512,1225],{"class":397},[207,1514,1211],{"class":213},[207,1516,1230],{"class":319},[207,1518,1217],{"class":217},[207,1520,1521],{"class":581},"\u002F\u002F default: \"elysia-jwe\"\n",[207,1523,1524,1526,1528,1530,1532],{"class":209,"line":416},[207,1525,1240],{"class":397},[207,1527,1211],{"class":213},[207,1529,1230],{"class":319},[207,1531,1217],{"class":217},[207,1533,1534],{"class":581},"\u002F\u002F default: \"session\"\n",[207,1536,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555,1557,1559],{"class":209,"line":431},[207,1538,1254],{"class":397},[207,1540,1211],{"class":213},[207,1542,1259],{"class":319},[207,1544,1262],{"class":213},[207,1546,238],{"class":217},[207,1548,1267],{"class":329},[207,1550,1270],{"class":213},[207,1552,1273],{"class":217},[207,1554,1276],{"class":397},[207,1556,1211],{"class":213},[207,1558,1281],{"class":319},[207,1560,1284],{"class":217},[207,1562,1563,1565,1567,1569,1571,1573],{"class":209,"line":440},[207,1564,1289],{"class":397},[207,1566,1211],{"class":213},[207,1568,1259],{"class":319},[207,1570,1262],{"class":213},[207,1572,1230],{"class":319},[207,1574,228],{"class":217},[207,1576,1577,1579,1581,1583,1585,1587],{"class":209,"line":446},[207,1578,1307],{"class":329},[207,1580,1211],{"class":213},[207,1582,1312],{"class":217},[207,1584,410],{"class":213},[207,1586,1230],{"class":319},[207,1588,228],{"class":217},[207,1590,1591],{"class":209,"line":464},[207,1592,310],{"emptyLinePlaceholder":309},[207,1594,1595,1598,1600],{"class":209,"line":470},[207,1596,1597],{"class":397},"  jwe",[207,1599,1211],{"class":213},[207,1601,413],{"class":217},[207,1603,1604,1607,1609,1611,1613,1616,1618,1620,1622],{"class":209,"line":1324},[207,1605,1606],{"class":397},"    encryptOptions",[207,1608,1211],{"class":213},[207,1610,1347],{"class":329},[207,1612,1118],{"class":217},[207,1614,1615],{"class":329},"JWEEncryptOptions",[207,1617,401],{"class":217},[207,1619,1357],{"class":224},[207,1621,1360],{"class":217},[207,1623,1624],{"class":581},"\u002F\u002F set `alg` + `enc` to pin\n",[207,1626,1627,1630,1632,1634],{"class":209,"line":1329},[207,1628,1629],{"class":397},"    decryptOptions",[207,1631,1211],{"class":213},[207,1633,1374],{"class":329},[207,1635,228],{"class":217},[207,1637,1638],{"class":209,"line":1339},[207,1639,1382],{"class":217},[207,1641,1642],{"class":209,"line":1366},[207,1643,310],{"emptyLinePlaceholder":309},[207,1645,1646,1648,1650,1653,1655,1657,1659,1661,1663,1665],{"class":209,"line":1379},[207,1647,1393],{"class":397},[207,1649,1211],{"class":213},[207,1651,1652],{"class":329}," SessionHooksJWE",[207,1654,1118],{"class":217},[207,1656,1121],{"class":329},[207,1658,401],{"class":217},[207,1660,1126],{"class":329},[207,1662,401],{"class":217},[207,1664,1131],{"class":329},[207,1666,1413],{"class":217},[207,1668,1669],{"class":209,"line":1385},[207,1670,1419],{"class":217},[230,1672,1673],{},[177,1674,1675,1678,1679,1682,1683,1686,1687,1690],{},[818,1676,1677],{},"Pin algorithms"," for production: set ",[189,1680,1681],{},"jws.signOptions.alg"," (or ",[189,1684,1685],{},"jwe.encryptOptions.alg"," + ",[189,1688,1689],{},"enc",").\nSigning\u002Fsealing uses them and verification\u002Funsealing then accepts only those values. Without them,\nallowed algorithms are inferred from the key's metadata.",[256,1692,1694],{"id":1693},"the-session-manager","The session manager",[198,1696,1698],{"className":200,"code":1697,"language":202,"meta":203,"style":203},"interface SessionManager\u003CT, ConfigMaxAge> {\n  readonly id: string | undefined; \u002F\u002F from jti — undefined until update() is called\n  readonly createdAt: number; \u002F\u002F from iat, in ms\n  readonly expiresAt: ConfigMaxAge extends ExpiresIn ? number : number | undefined;\n  readonly data: SessionData\u003CT>; \u002F\u002F payload (excludes jti\u002Fiat\u002Fexp)\n  readonly token: string | undefined;\n\n  update: (update?: SessionUpdate\u003CT>) => Promise\u003CSessionManager\u003CT, ConfigMaxAge>>;\n  clear: () => Promise\u003CSessionManager\u003CT, ConfigMaxAge>>;\n}\n\ntype SessionUpdate\u003CT> =\n  | Partial\u003CSessionData\u003CT>>\n  | ((oldData: SessionData\u003CT>) => Partial\u003CSessionData\u003CT>> | undefined);\n",[189,1699,1700,1718,1740,1756,1790,1811,1828,1832,1876,1903,1907,1911,1927,1947],{"__ignoreMap":203},[207,1701,1702,1704,1707,1709,1711,1713,1716],{"class":209,"line":210},[207,1703,1112],{"class":213},[207,1705,1706],{"class":329}," SessionManager",[207,1708,1118],{"class":217},[207,1710,1121],{"class":329},[207,1712,401],{"class":217},[207,1714,1715],{"class":329},"ConfigMaxAge",[207,1717,1134],{"class":217},[207,1719,1720,1723,1726,1728,1730,1732,1735,1737],{"class":209,"line":292},[207,1721,1722],{"class":213},"  readonly",[207,1724,1725],{"class":397}," id",[207,1727,836],{"class":213},[207,1729,1230],{"class":319},[207,1731,1262],{"class":213},[207,1733,1734],{"class":319}," undefined",[207,1736,1217],{"class":217},[207,1738,1739],{"class":581},"\u002F\u002F from jti — undefined until update() is called\n",[207,1741,1742,1744,1747,1749,1751,1753],{"class":209,"line":306},[207,1743,1722],{"class":213},[207,1745,1746],{"class":397}," createdAt",[207,1748,836],{"class":213},[207,1750,1281],{"class":319},[207,1752,1217],{"class":217},[207,1754,1755],{"class":581},"\u002F\u002F from iat, in ms\n",[207,1757,1758,1760,1763,1765,1768,1771,1774,1777,1779,1782,1784,1786,1788],{"class":209,"line":313},[207,1759,1722],{"class":213},[207,1761,1762],{"class":397}," expiresAt",[207,1764,836],{"class":213},[207,1766,1767],{"class":329}," ConfigMaxAge",[207,1769,1770],{"class":213}," extends",[207,1772,1773],{"class":329}," ExpiresIn",[207,1775,1776],{"class":213}," ?",[207,1778,1281],{"class":319},[207,1780,1781],{"class":213}," :",[207,1783,1281],{"class":319},[207,1785,1262],{"class":213},[207,1787,1734],{"class":319},[207,1789,228],{"class":217},[207,1791,1792,1794,1797,1799,1802,1804,1806,1808],{"class":209,"line":336},[207,1793,1722],{"class":213},[207,1795,1796],{"class":397}," data",[207,1798,836],{"class":213},[207,1800,1801],{"class":329}," SessionData",[207,1803,1118],{"class":217},[207,1805,1121],{"class":329},[207,1807,1360],{"class":217},[207,1809,1810],{"class":581},"\u002F\u002F payload (excludes jti\u002Fiat\u002Fexp)\n",[207,1812,1813,1815,1818,1820,1822,1824,1826],{"class":209,"line":368},[207,1814,1722],{"class":213},[207,1816,1817],{"class":397}," token",[207,1819,836],{"class":213},[207,1821,1230],{"class":319},[207,1823,1262],{"class":213},[207,1825,1734],{"class":319},[207,1827,228],{"class":217},[207,1829,1830],{"class":209,"line":379},[207,1831,310],{"emptyLinePlaceholder":309},[207,1833,1834,1837,1839,1841,1843,1845,1848,1850,1852,1855,1857,1860,1862,1865,1867,1869,1871,1873],{"class":209,"line":388},[207,1835,1836],{"class":329},"  update",[207,1838,836],{"class":213},[207,1840,238],{"class":217},[207,1842,425],{"class":397},[207,1844,1211],{"class":213},[207,1846,1847],{"class":329}," SessionUpdate",[207,1849,1118],{"class":217},[207,1851,1121],{"class":329},[207,1853,1854],{"class":217},">) ",[207,1856,410],{"class":213},[207,1858,1859],{"class":329}," Promise",[207,1861,1118],{"class":217},[207,1863,1864],{"class":329},"SessionManager",[207,1866,1118],{"class":217},[207,1868,1121],{"class":329},[207,1870,401],{"class":217},[207,1872,1715],{"class":329},[207,1874,1875],{"class":217},">>;\n",[207,1877,1878,1881,1883,1885,1887,1889,1891,1893,1895,1897,1899,1901],{"class":209,"line":416},[207,1879,1880],{"class":329},"  clear",[207,1882,836],{"class":213},[207,1884,1312],{"class":217},[207,1886,410],{"class":213},[207,1888,1859],{"class":329},[207,1890,1118],{"class":217},[207,1892,1864],{"class":329},[207,1894,1118],{"class":217},[207,1896,1121],{"class":329},[207,1898,401],{"class":217},[207,1900,1715],{"class":329},[207,1902,1875],{"class":217},[207,1904,1905],{"class":209,"line":431},[207,1906,1419],{"class":217},[207,1908,1909],{"class":209,"line":440},[207,1910,310],{"emptyLinePlaceholder":309},[207,1912,1913,1916,1918,1920,1922,1924],{"class":209,"line":446},[207,1914,1915],{"class":213},"type",[207,1917,1847],{"class":329},[207,1919,1118],{"class":217},[207,1921,1121],{"class":329},[207,1923,1158],{"class":217},[207,1925,1926],{"class":213},"=\n",[207,1928,1929,1932,1935,1937,1940,1942,1944],{"class":209,"line":464},[207,1930,1931],{"class":213},"  |",[207,1933,1934],{"class":329}," Partial",[207,1936,1118],{"class":217},[207,1938,1939],{"class":329},"SessionData",[207,1941,1118],{"class":217},[207,1943,1121],{"class":329},[207,1945,1946],{"class":217},">>\n",[207,1948,1949,1951,1954,1957,1959,1961,1963,1965,1967,1969,1971,1973,1975,1977,1979,1982,1984,1986],{"class":209,"line":470},[207,1950,1931],{"class":213},[207,1952,1953],{"class":217}," ((",[207,1955,1956],{"class":397},"oldData",[207,1958,836],{"class":213},[207,1960,1801],{"class":329},[207,1962,1118],{"class":217},[207,1964,1121],{"class":329},[207,1966,1854],{"class":217},[207,1968,410],{"class":213},[207,1970,1934],{"class":329},[207,1972,1118],{"class":217},[207,1974,1939],{"class":329},[207,1976,1118],{"class":217},[207,1978,1121],{"class":329},[207,1980,1981],{"class":217},">> ",[207,1983,1186],{"class":213},[207,1985,1734],{"class":319},[207,1987,1988],{"class":217},");\n",[177,1990,1991,1992,1995,1996,1998,1999,2002,2003,2005,2006,2008],{},"Sessions are ",[818,1993,1994],{},"lazy"," — ",[189,1997,509],{}," is ",[189,2000,2001],{},"undefined"," until ",[189,2004,503],{}," is first called.\nReading ",[189,2007,268],{}," without updating sets no cookie.",[198,2010,2013],{"className":200,"code":2011,"filename":2012,"language":202,"meta":203,"style":203},"await session.update({ theme: \"dark\" }); \u002F\u002F partial merge\nawait session.update((d) => ({ count: (d.count ?? 0) + 1 })); \u002F\u002F updater fn\nawait session.update(); \u002F\u002F rotate token (new jti\u002Fiat\u002Fexp), same data\nawait session.clear(); \u002F\u002F expire the cookie + reset state, fires onClear\n","update.ts",[189,2014,2015,2036,2077,2091],{"__ignoreMap":203},[207,2016,2017,2020,2022,2024,2027,2030,2033],{"class":209,"line":210},[207,2018,2019],{"class":213},"await",[207,2021,422],{"class":217},[207,2023,425],{"class":329},[207,2025,2026],{"class":217},"({ theme: ",[207,2028,2029],{"class":224},"\"dark\"",[207,2031,2032],{"class":217}," }); ",[207,2034,2035],{"class":581},"\u002F\u002F partial merge\n",[207,2037,2038,2040,2042,2044,2047,2050,2052,2054,2057,2060,2063,2065,2068,2071,2074],{"class":209,"line":292},[207,2039,2019],{"class":213},[207,2041,422],{"class":217},[207,2043,425],{"class":329},[207,2045,2046],{"class":217},"((",[207,2048,2049],{"class":397},"d",[207,2051,771],{"class":217},[207,2053,410],{"class":213},[207,2055,2056],{"class":217}," ({ count: (d.count ",[207,2058,2059],{"class":213},"??",[207,2061,2062],{"class":319}," 0",[207,2064,771],{"class":217},[207,2066,2067],{"class":213},"+",[207,2069,2070],{"class":319}," 1",[207,2072,2073],{"class":217}," })); ",[207,2075,2076],{"class":581},"\u002F\u002F updater fn\n",[207,2078,2079,2081,2083,2085,2088],{"class":209,"line":306},[207,2080,2019],{"class":213},[207,2082,422],{"class":217},[207,2084,425],{"class":329},[207,2086,2087],{"class":217},"(); ",[207,2089,2090],{"class":581},"\u002F\u002F rotate token (new jti\u002Fiat\u002Fexp), same data\n",[207,2092,2093,2095,2097,2100,2102],{"class":209,"line":313},[207,2094,2019],{"class":213},[207,2096,422],{"class":217},[207,2098,2099],{"class":329},"clear",[207,2101,2087],{"class":217},[207,2103,2104],{"class":581},"\u002F\u002F expire the cookie + reset state, fires onClear\n",[177,2106,2107,2110,2111,2114,2115,958],{},[189,2108,2109],{},"clear()"," (explicit termination) is distinct from token expiry — they fire ",[189,2112,2113],{},"onClear"," vs ",[189,2116,2117],{},"onExpire",[230,2119,2120],{},[177,2121,2122,829,2125,1085,2128,2131,2132,2135,2136,2139,2140,2142,2143,2145],{},[818,2123,2124],{},"Reserved claims.",[189,2126,2127],{},"jti",[189,2129,2130],{},"iat"," always overwrite same-named keys in your session data. ",[189,2133,2134],{},"exp"," is\nwritten only when ",[189,2137,2138],{},"maxAge"," is set — without ",[189,2141,2138],{},", an ",[189,2144,2134],{}," key in the data is carried into the\ntoken as its real expiry (useful for per-session lifetimes; surprising if accidental).",[256,2147,2149],{"id":2148},"cookies","Cookies",[177,2151,2152,2153,2156,2157,2159,2160,836],{},"Defaults: JWE ",[189,2154,2155],{},"path: \"\u002F\", secure: true, httpOnly: true","; JWS the same but ",[189,2158,656],{},". Override\nvia ",[189,2161,2162],{},"cookie",[198,2164,2167],{"className":200,"code":2165,"filename":2166,"language":202,"meta":203,"style":203},"jweSession({\n  key: secret,\n  maxAge: \"7D\",\n  cookie: { sameSite: \"strict\", domain: \".example.com\", chunkMaxLength: 3000 },\n});\n","cookie-opts.ts",[189,2168,2169,2176,2181,2190,2212],{"__ignoreMap":203},[207,2170,2171,2173],{"class":209,"line":210},[207,2172,195],{"class":329},[207,2174,2175],{"class":217},"({\n",[207,2177,2178],{"class":209,"line":292},[207,2179,2180],{"class":217},"  key: secret,\n",[207,2182,2183,2186,2188],{"class":209,"line":306},[207,2184,2185],{"class":217},"  maxAge: ",[207,2187,362],{"class":224},[207,2189,385],{"class":217},[207,2191,2192,2195,2198,2201,2204,2207,2210],{"class":209,"line":313},[207,2193,2194],{"class":217},"  cookie: { sameSite: ",[207,2196,2197],{"class":224},"\"strict\"",[207,2199,2200],{"class":217},", domain: ",[207,2202,2203],{"class":224},"\".example.com\"",[207,2205,2206],{"class":217},", chunkMaxLength: ",[207,2208,2209],{"class":319},"3000",[207,2211,760],{"class":217},[207,2213,2214],{"class":209,"line":336},[207,2215,2216],{"class":217},"});\n",[177,2218,2219,2220,2223,2224,401,2227,2230,2231,2234,2235,2238],{},"Large tokens (common for JWE with sizeable payloads) are transparently ",[818,2221,2222],{},"chunked"," across\n",[189,2225,2226],{},"name.0",[189,2228,2229],{},"name.1",", … and reassembled on read (default 4000 bytes\u002Fchunk, override via\n",[189,2232,2233],{},"cookie.chunkMaxLength","). Pass ",[189,2236,2237],{},"cookie: false"," for header-only mode.",[256,2240,2242],{"id":2241},"header-based-tokens","Header-based tokens",[177,2244,2245,2246,2248,2249,2252],{},"For clients that can't use cookies, read the token from a header (the default is\n",[189,2247,968],{},"; a leading ",[189,2250,2251],{},"Bearer "," is stripped):",[198,2254,2256],{"className":200,"code":2255,"language":202,"meta":203,"style":203},"jweSession({ key: secret, sessionHeader: \"authorization\" });\n",[189,2257,2258],{"__ignoreMap":203},[207,2259,2260,2262,2265,2268],{"class":209,"line":210},[207,2261,195],{"class":329},[207,2263,2264],{"class":217},"({ key: secret, sessionHeader: ",[207,2266,2267],{"class":224},"\"authorization\"",[207,2269,1284],{"class":217},[177,2271,2272,2275],{},[189,2273,2274],{},"sessionHeader: false"," disables header reads. When both are enabled, the header takes precedence,\nthen the cookie.",[256,2277,160],{"id":2278},"lifecycle-hooks",[177,2280,2281,2284,2285,401,2288,401,2291,385,2293,401,2295,2298,2299,2302,2303,2306],{},[189,2282,2283],{},"config.hooks"," accepts the same set as the H3 adapters — ",[189,2286,2287],{},"onRead",[189,2289,2290],{},"onUpdate",[189,2292,2113],{},[189,2294,2117],{},[189,2296,2297],{},"onError",", plus key-lookup hooks ",[189,2300,2301],{},"onVerifyKeyLookup"," (JWS) \u002F ",[189,2304,2305],{},"onUnsealKeyLookup"," (JWE).",[230,2308,2309],{},[177,2310,2311,2312,238,2315,2318,2319,2322,2323,401,2326,2329],{},"These are unjwt ",[818,2313,2314],{},"session hooks",[189,2316,2317],{},"config.hooks.*","), not Elysia's request ",[818,2320,2321],{},"lifecycle hooks","\n(",[189,2324,2325],{},"onRequest",[189,2327,2328],{},"beforeHandle",", …). The names are unrelated.",[177,2331,2332,2333,2336,2337,2340,2341,2344,2345,2347,2348,2347,2350,2352,2353,2355,2356,958],{},"Each hook receives ",[189,2334,2335],{},"{ session, context, config }"," (the Elysia ",[189,2338,2339],{},"context",", not an H3 ",[189,2342,2343],{},"event",").\n",[189,2346,2287],{},"\u002F",[189,2349,2117],{},[189,2351,2297],{}," are mutually exclusive per incoming token; ",[189,2354,2290],{}," fires after every\nsuccessful sign\u002Fseal (including a data-less token refresh) with a deep-cloned ",[189,2357,2358],{},"oldSession",[198,2360,2363],{"className":200,"code":2361,"filename":2362,"language":202,"meta":203,"style":203},"jweSession({\n  key: secret,\n  maxAge: \"7D\",\n  hooks: {\n    onUpdate: ({ session }) => db.sessions.upsert(session.id!, session.expiresAt),\n    onExpire: ({ session }) => db.sessions.revoke(session.id), \u002F\u002F session.id from error.cause.jti\n  },\n});\n","hooks.ts",[189,2364,2365,2371,2375,2383,2388,2416,2440,2445],{"__ignoreMap":203},[207,2366,2367,2369],{"class":209,"line":210},[207,2368,195],{"class":329},[207,2370,2175],{"class":217},[207,2372,2373],{"class":209,"line":292},[207,2374,2180],{"class":217},[207,2376,2377,2379,2381],{"class":209,"line":306},[207,2378,2185],{"class":217},[207,2380,362],{"class":224},[207,2382,385],{"class":217},[207,2384,2385],{"class":209,"line":313},[207,2386,2387],{"class":217},"  hooks: {\n",[207,2389,2390,2393,2396,2398,2400,2402,2405,2408,2411,2413],{"class":209,"line":336},[207,2391,2392],{"class":329},"    onUpdate",[207,2394,2395],{"class":217},": ({ ",[207,2397,398],{"class":397},[207,2399,407],{"class":217},[207,2401,410],{"class":213},[207,2403,2404],{"class":217}," db.sessions.",[207,2406,2407],{"class":329},"upsert",[207,2409,2410],{"class":217},"(session.id",[207,2412,356],{"class":213},[207,2414,2415],{"class":217},", session.expiresAt),\n",[207,2417,2418,2421,2423,2425,2427,2429,2431,2434,2437],{"class":209,"line":368},[207,2419,2420],{"class":329},"    onExpire",[207,2422,2395],{"class":217},[207,2424,398],{"class":397},[207,2426,407],{"class":217},[207,2428,410],{"class":213},[207,2430,2404],{"class":217},[207,2432,2433],{"class":329},"revoke",[207,2435,2436],{"class":217},"(session.id), ",[207,2438,2439],{"class":581},"\u002F\u002F session.id from error.cause.jti\n",[207,2441,2442],{"class":209,"line":379},[207,2443,2444],{"class":217},"  },\n",[207,2446,2447],{"class":209,"line":388},[207,2448,2216],{"class":217},[256,2450,2452,2453,2455],{"id":2451},"lower-level-manual-resolve-wiring","Lower-level: manual ",[189,2454,513],{}," wiring",[177,2457,2458,2459,2462,2463,2466,2467,2470,2471,2473,2474,2347,2476,836],{},"The plugins are built on ",[189,2460,2461],{},"createJWSSession"," \u002F ",[189,2464,2465],{},"createJWESession",", which take a minimal context\n(",[189,2468,2469],{},"{ cookie, request }",") and return a ",[189,2472,1864],{},". Use them directly when you want to wire the\nsession into your own ",[189,2475,513],{},[189,2477,2478],{},"derive",[198,2480,2483],{"className":200,"code":2481,"filename":2482,"language":202,"meta":203,"style":203},"import { createJWSSession } from \"unjwt\u002Fadapters\u002Felysia\";\n\nconst app = new Elysia()\n  .resolve(async ({ cookie, request }) => ({\n    session: await createJWSSession({ cookie, request }, { key: keys, maxAge: \"1h\" }),\n  }))\n  .get(\"\u002Fme\", ({ session }) => session.data);\n","manual.ts",[189,2484,2485,2498,2502,2516,2543,2561,2566],{"__ignoreMap":203},[207,2486,2487,2489,2492,2494,2496],{"class":209,"line":210},[207,2488,214],{"class":213},[207,2490,2491],{"class":217}," { createJWSSession } ",[207,2493,221],{"class":213},[207,2495,225],{"class":224},[207,2497,228],{"class":217},[207,2499,2500],{"class":209,"line":292},[207,2501,310],{"emptyLinePlaceholder":309},[207,2503,2504,2506,2508,2510,2512,2514],{"class":209,"line":306},[207,2505,316],{"class":213},[207,2507,320],{"class":319},[207,2509,323],{"class":213},[207,2511,326],{"class":213},[207,2513,330],{"class":329},[207,2515,333],{"class":217},[207,2517,2518,2520,2522,2524,2527,2529,2531,2533,2536,2538,2540],{"class":209,"line":313},[207,2519,339],{"class":217},[207,2521,513],{"class":329},[207,2523,345],{"class":217},[207,2525,2526],{"class":213},"async",[207,2528,394],{"class":217},[207,2530,2162],{"class":397},[207,2532,401],{"class":217},[207,2534,2535],{"class":397},"request",[207,2537,407],{"class":217},[207,2539,410],{"class":213},[207,2541,2542],{"class":217}," ({\n",[207,2544,2545,2548,2550,2553,2556,2558],{"class":209,"line":336},[207,2546,2547],{"class":217},"    session: ",[207,2549,2019],{"class":213},[207,2551,2552],{"class":329}," createJWSSession",[207,2554,2555],{"class":217},"({ cookie, request }, { key: keys, maxAge: ",[207,2557,616],{"class":224},[207,2559,2560],{"class":217}," }),\n",[207,2562,2563],{"class":209,"line":368},[207,2564,2565],{"class":217},"  }))\n",[207,2567,2568,2570,2572,2574,2576,2578,2580,2582,2584],{"class":209,"line":379},[207,2569,339],{"class":217},[207,2571,475],{"class":329},[207,2573,345],{"class":217},[207,2575,480],{"class":224},[207,2577,483],{"class":217},[207,2579,398],{"class":397},[207,2581,407],{"class":217},[207,2583,410],{"class":213},[207,2585,492],{"class":217},[1074,2587,2588],{},[177,2589,2590,2591,829,2594,2596,2597,2599,2600,2603,2604,2606],{},"You must ",[818,2592,2593],{},"destructure",[189,2595,2469],{}," in the ",[189,2598,513],{}," signature (rather than taking the\nwhole ",[189,2601,2602],{},"ctx","). Elysia provisions context fields by statically scanning the hook source — if ",[189,2605,2162],{},"\nisn't referenced there, it won't be populated and the session can't read or write it.",[256,2608,2610],{"id":2609},"typing-session-data","Typing session data",[198,2612,2615],{"className":200,"code":2613,"filename":2614,"language":202,"meta":203,"style":203},"interface MyData {\n  userId: string;\n  role: \"admin\" | \"user\";\n}\n\nconst app = new Elysia().use(jweSession\u003CMyData>({ key: secret })).get(\"\u002Fme\", ({ session }) => {\n  session.data.userId; \u002F\u002F string\n  session.data.role; \u002F\u002F \"admin\" | \"user\"\n});\n","typed.ts",[189,2616,2617,2626,2637,2654,2658,2662,2707,2715,2723],{"__ignoreMap":203},[207,2618,2619,2621,2624],{"class":209,"line":210},[207,2620,1112],{"class":213},[207,2622,2623],{"class":329}," MyData",[207,2625,413],{"class":217},[207,2627,2628,2631,2633,2635],{"class":209,"line":292},[207,2629,2630],{"class":397},"  userId",[207,2632,836],{"class":213},[207,2634,1230],{"class":319},[207,2636,228],{"class":217},[207,2638,2639,2642,2644,2647,2649,2652],{"class":209,"line":306},[207,2640,2641],{"class":397},"  role",[207,2643,836],{"class":213},[207,2645,2646],{"class":224}," \"admin\"",[207,2648,1262],{"class":213},[207,2650,2651],{"class":224}," \"user\"",[207,2653,228],{"class":217},[207,2655,2656],{"class":209,"line":313},[207,2657,1419],{"class":217},[207,2659,2660],{"class":209,"line":336},[207,2661,310],{"emptyLinePlaceholder":309},[207,2663,2664,2666,2668,2670,2672,2674,2677,2679,2681,2683,2685,2688,2691,2693,2695,2697,2699,2701,2703,2705],{"class":209,"line":368},[207,2665,316],{"class":213},[207,2667,320],{"class":319},[207,2669,323],{"class":213},[207,2671,326],{"class":213},[207,2673,330],{"class":329},[207,2675,2676],{"class":217},"().",[207,2678,342],{"class":329},[207,2680,345],{"class":217},[207,2682,195],{"class":329},[207,2684,1118],{"class":217},[207,2686,2687],{"class":329},"MyData",[207,2689,2690],{"class":217},">({ key: secret })).",[207,2692,475],{"class":329},[207,2694,345],{"class":217},[207,2696,480],{"class":224},[207,2698,483],{"class":217},[207,2700,398],{"class":397},[207,2702,407],{"class":217},[207,2704,410],{"class":213},[207,2706,413],{"class":217},[207,2708,2709,2712],{"class":209,"line":379},[207,2710,2711],{"class":217},"  session.data.userId; ",[207,2713,2714],{"class":581},"\u002F\u002F string\n",[207,2716,2717,2720],{"class":209,"line":388},[207,2718,2719],{"class":217},"  session.data.role; ",[207,2721,2722],{"class":581},"\u002F\u002F \"admin\" | \"user\"\n",[207,2724,2725],{"class":209,"line":416},[207,2726,2216],{"class":217},[177,2728,2729,2730,2733],{},"The generic threads through ",[189,2731,2732],{},"update()"," and every hook payload.",[256,2735,2737],{"id":2736},"see-also","See also",[939,2739,2740,2746,2752],{},[942,2741,2742,2745],{},[181,2743,2744],{"href":150},"Adapters overview →"," — JWE vs JWS, the session manager, what adapters do.",[942,2747,2748,2751],{},[181,2749,2750],{"href":161},"Lifecycle hooks →"," — patterns (logging, revocation, key rotation) shared with H3.",[942,2753,2754,958],{},[181,2755,2756],{"href":96},"Example: refresh token pattern →",[2758,2759,2760],"style",{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}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 .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":203,"searchDepth":292,"depth":292,"links":2762},[2763,2766,2767,2768,2774,2775,2776,2777,2778,2780,2781],{"id":258,"depth":292,"text":259,"children":2764},[2765],{"id":518,"depth":306,"text":519},{"id":660,"depth":292,"text":661},{"id":812,"depth":292,"text":813},{"id":1094,"depth":292,"text":1095,"children":2769},[2770,2772],{"id":1098,"depth":306,"text":2771},"JWS — SessionConfigJWS",{"id":1422,"depth":306,"text":2773},"JWE — SessionConfigJWE",{"id":1693,"depth":292,"text":1694},{"id":2148,"depth":292,"text":2149},{"id":2241,"depth":292,"text":2242},{"id":2278,"depth":292,"text":160},{"id":2451,"depth":292,"text":2779},"Lower-level: manual resolve wiring",{"id":2609,"depth":292,"text":2610},{"id":2736,"depth":292,"text":2737},"md",{},{},{"title":168,"description":203},"cfCV9hmsT6KFGJHOI8YbyYAGkCYC36SglHHURbQ6Ucg",[2788,2789],{"title":164,"path":165,"stem":166,"description":203,"children":-1},null,1783185172424]