@authrim/server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +610 -0
  2. package/dist/adapters/express.cjs +3 -0
  3. package/dist/adapters/express.cjs.map +1 -0
  4. package/dist/adapters/express.d.cts +75 -0
  5. package/dist/adapters/express.d.ts +75 -0
  6. package/dist/adapters/express.js +3 -0
  7. package/dist/adapters/express.js.map +1 -0
  8. package/dist/adapters/fastify.cjs +3 -0
  9. package/dist/adapters/fastify.cjs.map +1 -0
  10. package/dist/adapters/fastify.d.cts +101 -0
  11. package/dist/adapters/fastify.d.ts +101 -0
  12. package/dist/adapters/fastify.js +3 -0
  13. package/dist/adapters/fastify.js.map +1 -0
  14. package/dist/adapters/hono.cjs +2 -0
  15. package/dist/adapters/hono.cjs.map +1 -0
  16. package/dist/adapters/hono.d.cts +85 -0
  17. package/dist/adapters/hono.d.ts +85 -0
  18. package/dist/adapters/hono.js +2 -0
  19. package/dist/adapters/hono.js.map +1 -0
  20. package/dist/adapters/koa.cjs +3 -0
  21. package/dist/adapters/koa.cjs.map +1 -0
  22. package/dist/adapters/koa.d.cts +75 -0
  23. package/dist/adapters/koa.d.ts +75 -0
  24. package/dist/adapters/koa.js +3 -0
  25. package/dist/adapters/koa.js.map +1 -0
  26. package/dist/adapters/nestjs.cjs +3 -0
  27. package/dist/adapters/nestjs.cjs.map +1 -0
  28. package/dist/adapters/nestjs.d.cts +126 -0
  29. package/dist/adapters/nestjs.d.ts +126 -0
  30. package/dist/adapters/nestjs.js +3 -0
  31. package/dist/adapters/nestjs.js.map +1 -0
  32. package/dist/chunk-7POGA5LZ.cjs +3 -0
  33. package/dist/chunk-7POGA5LZ.cjs.map +1 -0
  34. package/dist/chunk-N3ONRO35.js +2 -0
  35. package/dist/chunk-N3ONRO35.js.map +1 -0
  36. package/dist/chunk-O2ALCNXB.cjs +2 -0
  37. package/dist/chunk-O2ALCNXB.cjs.map +1 -0
  38. package/dist/chunk-OS567YCE.js +3 -0
  39. package/dist/chunk-OS567YCE.js.map +1 -0
  40. package/dist/chunk-TPROSFE7.cjs +2 -0
  41. package/dist/chunk-TPROSFE7.cjs.map +1 -0
  42. package/dist/chunk-XOFM2JHF.js +2 -0
  43. package/dist/chunk-XOFM2JHF.js.map +1 -0
  44. package/dist/config-I0GIVJA_.d.cts +364 -0
  45. package/dist/config-I0GIVJA_.d.ts +364 -0
  46. package/dist/index.cjs +3 -0
  47. package/dist/index.cjs.map +1 -0
  48. package/dist/index.d.cts +791 -0
  49. package/dist/index.d.ts +791 -0
  50. package/dist/index.js +3 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/providers/index.cjs +2 -0
  53. package/dist/providers/index.cjs.map +1 -0
  54. package/dist/providers/index.d.cts +79 -0
  55. package/dist/providers/index.d.ts +79 -0
  56. package/dist/providers/index.js +2 -0
  57. package/dist/providers/index.js.map +1 -0
  58. package/dist/types-CzpMdWFR.d.cts +435 -0
  59. package/dist/types-D7gjcvs9.d.ts +435 -0
  60. package/package.json +119 -0
@@ -0,0 +1,75 @@
1
+ import { V as ValidatedToken, A as AuthrimServer, M as MiddlewareOptions } from '../types-D7gjcvs9.js';
2
+ import '../config-I0GIVJA_.js';
3
+
4
+ /**
5
+ * Express Adapter
6
+ *
7
+ * Thin wrapper around authenticateRequest for Express framework.
8
+ */
9
+
10
+ /**
11
+ * Extended Express Request with auth property
12
+ */
13
+ interface AuthrimExpressRequest {
14
+ auth?: ValidatedToken;
15
+ authTokenType?: 'Bearer' | 'DPoP';
16
+ }
17
+ /**
18
+ * Express request type (minimal interface)
19
+ */
20
+ interface ExpressRequest {
21
+ headers: Record<string, string | string[] | undefined>;
22
+ method: string;
23
+ protocol: string;
24
+ get(name: string): string | undefined;
25
+ originalUrl: string;
26
+ }
27
+ /**
28
+ * Express response type (minimal interface)
29
+ */
30
+ interface ExpressResponse {
31
+ status(code: number): ExpressResponse;
32
+ set(headers: Record<string, string>): ExpressResponse;
33
+ json(body: unknown): void;
34
+ }
35
+ /**
36
+ * Express next function
37
+ */
38
+ type ExpressNextFunction = (err?: unknown) => void;
39
+ /**
40
+ * Create Express middleware for token validation
41
+ *
42
+ * @param server - AuthrimServer instance
43
+ * @param options - Middleware options
44
+ * @returns Express middleware function
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * import express from 'express';
49
+ * import { createAuthrimServer } from '@authrim/server';
50
+ * import { authrimMiddleware } from '@authrim/server/adapters/express';
51
+ *
52
+ * const app = express();
53
+ * const server = createAuthrimServer({
54
+ * issuer: 'https://auth.example.com',
55
+ * audience: 'https://api.example.com',
56
+ * });
57
+ *
58
+ * app.use('/api', authrimMiddleware(server));
59
+ *
60
+ * app.get('/api/protected', (req, res) => {
61
+ * res.json({ user: req.auth.claims.sub });
62
+ * });
63
+ * ```
64
+ */
65
+ declare function authrimMiddleware(server: AuthrimServer, options?: MiddlewareOptions): (req: ExpressRequest & AuthrimExpressRequest, res: ExpressResponse, next: ExpressNextFunction) => Promise<void>;
66
+ /**
67
+ * Create optional auth middleware (doesn't fail if no token)
68
+ *
69
+ * @param server - AuthrimServer instance
70
+ * @param options - Middleware options
71
+ * @returns Express middleware function
72
+ */
73
+ declare function authrimOptionalMiddleware(server: AuthrimServer, _options?: MiddlewareOptions): (req: ExpressRequest & AuthrimExpressRequest, _res: ExpressResponse, next: ExpressNextFunction) => Promise<void>;
74
+
75
+ export { type AuthrimExpressRequest, authrimMiddleware, authrimOptionalMiddleware };
@@ -0,0 +1,3 @@
1
+ import {c as c$1,a as a$1}from'../chunk-XOFM2JHF.js';import {c,a}from'../chunk-N3ONRO35.js';function x(n,s={}){return async(e,d,o)=>{let u=e.get("host")??"localhost",i=`${e.protocol}://${u}${e.originalUrl}`,r=await c(n,{headers:e.headers,method:e.method,url:i});if(r.error){let t=new a(r.error.code,r.error.message),c=c$1(t,{realm:s.realm,scheme:"Bearer"});s.onError&&s.onError(r.error),d.status(r.error.httpStatus).set(c).json(a$1(t));return}e.auth=r.data.claims,e.authTokenType=r.data.tokenType,o();}}function E(n,s={}){return async(e,d,o)=>{if(!e.headers.authorization){o();return}let i=e.get("host")??"localhost",r=`${e.protocol}://${i}${e.originalUrl}`,t=await c(n,{headers:e.headers,method:e.method,url:r});t.data&&(e.auth=t.data.claims,e.authTokenType=t.data.tokenType),o();}}
2
+ export{x as authrimMiddleware,E as authrimOptionalMiddleware};//# sourceMappingURL=express.js.map
3
+ //# sourceMappingURL=express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/express.ts"],"names":["authrimMiddleware","server","options","req","res","next","host","url","result","authenticateRequest","error","AuthrimServerError","headers","buildErrorHeaders","buildErrorResponse","authrimOptionalMiddleware","_options","_res"],"mappings":"4FAwEO,SAASA,EACdC,CAAAA,CACAC,CAAAA,CAA6B,EAAC,CAC9B,CACA,OAAO,MACLC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,GACkB,CAElB,IAAMC,CAAAA,CAAOH,EAAI,GAAA,CAAI,MAAM,GAAK,WAAA,CAC1BI,CAAAA,CAAM,CAAA,EAAGJ,CAAAA,CAAI,QAAQ,CAAA,GAAA,EAAMG,CAAI,GAAGH,CAAAA,CAAI,WAAW,GAGjDK,CAAAA,CAAS,MAAMC,EAAoBR,CAAAA,CAAQ,CAC/C,QAASE,CAAAA,CAAI,OAAA,CACb,OAAQA,CAAAA,CAAI,MAAA,CACZ,IAAAI,CACF,CAAC,CAAA,CAED,GAAIC,EAAO,KAAA,CAAO,CAChB,IAAME,CAAAA,CAAQ,IAAIC,EAChBH,CAAAA,CAAO,KAAA,CAAM,IAAA,CACbA,CAAAA,CAAO,MAAM,OACf,CAAA,CAEMI,EAAUC,GAAAA,CAAkBH,CAAAA,CAAO,CACvC,KAAA,CAAOR,CAAAA,CAAQ,KAAA,CACf,MAAA,CAAQ,QACV,CAAC,CAAA,CAEGA,EAAQ,OAAA,EACVA,CAAAA,CAAQ,QAAQM,CAAAA,CAAO,KAAK,EAG9BJ,CAAAA,CAAI,MAAA,CAAOI,EAAO,KAAA,CAAM,UAAU,EAAE,GAAA,CAAII,CAAO,EAAE,IAAA,CAAKE,GAAAA,CAAmBJ,CAAK,CAAC,EAC/E,MACF,CAGAP,EAAI,IAAA,CAAOK,CAAAA,CAAO,KAAK,MAAA,CACvBL,CAAAA,CAAI,aAAA,CAAgBK,CAAAA,CAAO,KAAK,SAAA,CAEhCH,CAAAA,GACF,CACF,CASO,SAASU,CAAAA,CACdd,CAAAA,CACAe,CAAAA,CAA8B,GAC9B,CACA,aACEb,CAAAA,CACAc,CAAAA,CACAZ,IACkB,CAGlB,GAAI,CADeF,CAAAA,CAAI,OAAA,CAAQ,cACd,CACfE,CAAAA,GACA,MACF,CAGA,IAAMC,CAAAA,CAAOH,CAAAA,CAAI,GAAA,CAAI,MAAM,GAAK,WAAA,CAC1BI,CAAAA,CAAM,GAAGJ,CAAAA,CAAI,QAAQ,MAAMG,CAAI,CAAA,EAAGH,CAAAA,CAAI,WAAW,GAGjDK,CAAAA,CAAS,MAAMC,EAAoBR,CAAAA,CAAQ,CAC/C,QAASE,CAAAA,CAAI,OAAA,CACb,MAAA,CAAQA,CAAAA,CAAI,OACZ,GAAA,CAAAI,CACF,CAAC,CAAA,CAEGC,CAAAA,CAAO,OACTL,CAAAA,CAAI,IAAA,CAAOK,EAAO,IAAA,CAAK,MAAA,CACvBL,EAAI,aAAA,CAAgBK,CAAAA,CAAO,KAAK,SAAA,CAAA,CAGlCH,CAAAA,GACF,CACF","file":"express.js","sourcesContent":["/**\r\n * Express Adapter\r\n *\r\n * Thin wrapper around authenticateRequest for Express framework.\r\n */\r\n\r\nimport type { AuthrimServer } from '../core/client.js';\r\nimport type { MiddlewareOptions } from '../middleware/types.js';\r\nimport type { ValidatedToken } from '../types/claims.js';\r\nimport { authenticateRequest } from '../middleware/authenticate.js';\r\nimport { buildErrorResponse, buildErrorHeaders } from '../utils/error-response.js';\r\nimport { AuthrimServerError } from '../types/errors.js';\r\n\r\n/**\r\n * Extended Express Request with auth property\r\n */\r\nexport interface AuthrimExpressRequest {\r\n auth?: ValidatedToken;\r\n authTokenType?: 'Bearer' | 'DPoP';\r\n}\r\n\r\n/**\r\n * Express request type (minimal interface)\r\n */\r\ninterface ExpressRequest {\r\n headers: Record<string, string | string[] | undefined>;\r\n method: string;\r\n protocol: string;\r\n get(name: string): string | undefined;\r\n originalUrl: string;\r\n}\r\n\r\n/**\r\n * Express response type (minimal interface)\r\n */\r\ninterface ExpressResponse {\r\n status(code: number): ExpressResponse;\r\n set(headers: Record<string, string>): ExpressResponse;\r\n json(body: unknown): void;\r\n}\r\n\r\n/**\r\n * Express next function\r\n */\r\ntype ExpressNextFunction = (err?: unknown) => void;\r\n\r\n/**\r\n * Create Express middleware for token validation\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param options - Middleware options\r\n * @returns Express middleware function\r\n *\r\n * @example\r\n * ```typescript\r\n * import express from 'express';\r\n * import { createAuthrimServer } from '@authrim/server';\r\n * import { authrimMiddleware } from '@authrim/server/adapters/express';\r\n *\r\n * const app = express();\r\n * const server = createAuthrimServer({\r\n * issuer: 'https://auth.example.com',\r\n * audience: 'https://api.example.com',\r\n * });\r\n *\r\n * app.use('/api', authrimMiddleware(server));\r\n *\r\n * app.get('/api/protected', (req, res) => {\r\n * res.json({ user: req.auth.claims.sub });\r\n * });\r\n * ```\r\n */\r\nexport function authrimMiddleware(\r\n server: AuthrimServer,\r\n options: MiddlewareOptions = {}\r\n) {\r\n return async (\r\n req: ExpressRequest & AuthrimExpressRequest,\r\n res: ExpressResponse,\r\n next: ExpressNextFunction\r\n ): Promise<void> => {\r\n // Build URL\r\n const host = req.get('host') ?? 'localhost';\r\n const url = `${req.protocol}://${host}${req.originalUrl}`;\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers: req.headers as Record<string, string | string[] | undefined>,\r\n method: req.method,\r\n url,\r\n });\r\n\r\n if (result.error) {\r\n const error = new AuthrimServerError(\r\n result.error.code as any,\r\n result.error.message\r\n );\r\n\r\n const headers = buildErrorHeaders(error, {\r\n realm: options.realm,\r\n scheme: 'Bearer',\r\n });\r\n\r\n if (options.onError) {\r\n options.onError(result.error);\r\n }\r\n\r\n res.status(result.error.httpStatus).set(headers).json(buildErrorResponse(error));\r\n return;\r\n }\r\n\r\n // Attach auth to request\r\n req.auth = result.data.claims;\r\n req.authTokenType = result.data.tokenType;\r\n\r\n next();\r\n };\r\n}\r\n\r\n/**\r\n * Create optional auth middleware (doesn't fail if no token)\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param options - Middleware options\r\n * @returns Express middleware function\r\n */\r\nexport function authrimOptionalMiddleware(\r\n server: AuthrimServer,\r\n _options: MiddlewareOptions = {}\r\n) {\r\n return async (\r\n req: ExpressRequest & AuthrimExpressRequest,\r\n _res: ExpressResponse,\r\n next: ExpressNextFunction\r\n ): Promise<void> => {\r\n // Check if Authorization header exists\r\n const authHeader = req.headers['authorization'];\r\n if (!authHeader) {\r\n next();\r\n return;\r\n }\r\n\r\n // Build URL\r\n const host = req.get('host') ?? 'localhost';\r\n const url = `${req.protocol}://${host}${req.originalUrl}`;\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers: req.headers as Record<string, string | string[] | undefined>,\r\n method: req.method,\r\n url,\r\n });\r\n\r\n if (result.data) {\r\n req.auth = result.data.claims;\r\n req.authTokenType = result.data.tokenType;\r\n }\r\n\r\n next();\r\n };\r\n}\r\n"]}
@@ -0,0 +1,3 @@
1
+ 'use strict';var chunkO2ALCNXB_cjs=require('../chunk-O2ALCNXB.cjs'),chunkTPROSFE7_cjs=require('../chunk-TPROSFE7.cjs');function u(a,t={}){return async(r,i)=>{let d=`${r.protocol}://${r.hostname}${r.url}`,e=await chunkTPROSFE7_cjs.c(a,{headers:r.headers,method:r.method,url:d});if(e.error){let o=new chunkTPROSFE7_cjs.a(e.error.code,e.error.message),m=chunkO2ALCNXB_cjs.c(o,{realm:t.realm,scheme:"Bearer"});t.onError&&t.onError(e.error),i.code(e.error.httpStatus).headers(m).send(chunkO2ALCNXB_cjs.a(o));return}r.auth=e.data.claims,r.authTokenType=e.data.tokenType;}}function p(a,t={}){return async(r,i)=>{if(!r.headers.authorization)return;let e=`${r.protocol}://${r.hostname}${r.url}`,o=await chunkTPROSFE7_cjs.c(a,{headers:r.headers,method:r.method,url:e});o.data&&(r.auth=o.data.claims,r.authTokenType=o.data.tokenType);}}function g(a,t={}){return async r=>{r.addHook("preHandler",u(a,t));}}function k(a,t={}){return async r=>{r.addHook("preHandler",p(a,t));}}
2
+ exports.authrimOptionalPlugin=k;exports.authrimOptionalPreHandler=p;exports.authrimPlugin=g;exports.authrimPreHandler=u;//# sourceMappingURL=fastify.cjs.map
3
+ //# sourceMappingURL=fastify.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/fastify.ts"],"names":["authrimPreHandler","server","options","request","reply","url","result","authenticateRequest","error","AuthrimServerError","headers","buildErrorHeaders","buildErrorResponse","authrimOptionalPreHandler","_options","_reply","authrimPlugin","fastify","authrimOptionalPlugin"],"mappings":"uHAuEO,SAASA,CAAAA,CACdC,EACAC,CAAAA,CAA6B,GAC7B,CACA,aACEC,CAAAA,CACAC,CAAAA,GACkB,CAElB,IAAMC,CAAAA,CAAM,GAAGF,CAAAA,CAAQ,QAAQ,MAAMA,CAAAA,CAAQ,QAAQ,CAAA,EAAGA,CAAAA,CAAQ,GAAG,CAAA,CAAA,CAG7DG,EAAS,MAAMC,mBAAAA,CAAoBN,EAAQ,CAC/C,OAAA,CAASE,EAAQ,OAAA,CACjB,MAAA,CAAQA,EAAQ,MAAA,CAChB,GAAA,CAAAE,CACF,CAAC,CAAA,CAED,GAAIC,CAAAA,CAAO,KAAA,CAAO,CAChB,IAAME,CAAAA,CAAQ,IAAIC,mBAAAA,CAChBH,CAAAA,CAAO,KAAA,CAAM,KACbA,CAAAA,CAAO,KAAA,CAAM,OACf,CAAA,CAEMI,CAAAA,CAAUC,oBAAkBH,CAAAA,CAAO,CACvC,MAAON,CAAAA,CAAQ,KAAA,CACf,OAAQ,QACV,CAAC,EAEGA,CAAAA,CAAQ,OAAA,EACVA,EAAQ,OAAA,CAAQI,CAAAA,CAAO,KAAK,CAAA,CAG9BF,CAAAA,CAAM,IAAA,CAAKE,EAAO,KAAA,CAAM,UAAU,EAAE,OAAA,CAAQI,CAAO,EAAE,IAAA,CAAKE,mBAAAA,CAAmBJ,CAAK,CAAC,CAAA,CACnF,MACF,CAGAL,CAAAA,CAAQ,IAAA,CAAOG,EAAO,IAAA,CAAK,MAAA,CAC3BH,EAAQ,aAAA,CAAgBG,CAAAA,CAAO,IAAA,CAAK,UACtC,CACF,CASO,SAASO,CAAAA,CACdZ,CAAAA,CACAa,EAA8B,EAAC,CAC/B,CACA,OAAO,MACLX,EACAY,CAAAA,GACkB,CAGlB,GAAI,CADeZ,CAAAA,CAAQ,QAAQ,aAAA,CAEjC,OAIF,IAAME,CAAAA,CAAM,CAAA,EAAGF,CAAAA,CAAQ,QAAQ,CAAA,GAAA,EAAMA,CAAAA,CAAQ,QAAQ,CAAA,EAAGA,CAAAA,CAAQ,GAAG,CAAA,CAAA,CAG7DG,CAAAA,CAAS,MAAMC,mBAAAA,CAAoBN,CAAAA,CAAQ,CAC/C,OAAA,CAASE,CAAAA,CAAQ,QACjB,MAAA,CAAQA,CAAAA,CAAQ,OAChB,GAAA,CAAAE,CACF,CAAC,CAAA,CAEGC,CAAAA,CAAO,IAAA,GACTH,CAAAA,CAAQ,IAAA,CAAOG,CAAAA,CAAO,KAAK,MAAA,CAC3BH,CAAAA,CAAQ,cAAgBG,CAAAA,CAAO,IAAA,CAAK,WAExC,CACF,CASO,SAASU,CAAAA,CAAcf,CAAAA,CAAuBC,EAA6B,EAAC,CAAG,CACpF,OAAO,MAAOe,GAAmE,CAC/EA,CAAAA,CAAQ,OAAA,CAAQ,YAAA,CAAcjB,CAAAA,CAAkBC,CAAAA,CAAQC,CAAO,CAAC,EAClE,CACF,CASO,SAASgB,EAAsBjB,CAAAA,CAAuBC,CAAAA,CAA6B,EAAC,CAAG,CAC5F,aAAce,CAAAA,EAAmE,CAC/EA,EAAQ,OAAA,CAAQ,YAAA,CAAcJ,EAA0BZ,CAAAA,CAAQC,CAAO,CAAC,EAC1E,CACF","file":"fastify.cjs","sourcesContent":["/**\r\n * Fastify Adapter\r\n *\r\n * Thin wrapper around authenticateRequest for Fastify framework.\r\n */\r\n\r\nimport type { AuthrimServer } from '../core/client.js';\r\nimport type { MiddlewareOptions } from '../middleware/types.js';\r\nimport type { ValidatedToken } from '../types/claims.js';\r\nimport { authenticateRequest } from '../middleware/authenticate.js';\r\nimport { buildErrorResponse, buildErrorHeaders } from '../utils/error-response.js';\r\nimport { AuthrimServerError } from '../types/errors.js';\r\n\r\n/**\r\n * Extended Fastify Request with auth property\r\n *\r\n * Note: Users should add this to their own type declarations:\r\n * declare module 'fastify' {\r\n * interface FastifyRequest {\r\n * auth?: ValidatedToken;\r\n * authTokenType?: 'Bearer' | 'DPoP';\r\n * }\r\n * }\r\n */\r\n\r\n/**\r\n * Fastify request type (minimal interface)\r\n */\r\ninterface FastifyRequest {\r\n headers: Record<string, string | string[] | undefined>;\r\n method: string;\r\n protocol: string;\r\n hostname: string;\r\n url: string;\r\n}\r\n\r\n/**\r\n * Fastify reply type (minimal interface)\r\n */\r\ninterface FastifyReply {\r\n code(statusCode: number): FastifyReply;\r\n headers(headers: Record<string, string>): FastifyReply;\r\n send(payload?: unknown): FastifyReply;\r\n}\r\n\r\n/**\r\n * Create Fastify preHandler hook for token validation\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param options - Middleware options\r\n * @returns Fastify preHandler function\r\n *\r\n * @example\r\n * ```typescript\r\n * import Fastify from 'fastify';\r\n * import { createAuthrimServer } from '@authrim/server';\r\n * import { authrimPreHandler } from '@authrim/server/adapters/fastify';\r\n *\r\n * const fastify = Fastify();\r\n * const server = createAuthrimServer({\r\n * issuer: 'https://auth.example.com',\r\n * audience: 'https://api.example.com',\r\n * });\r\n *\r\n * fastify.addHook('preHandler', authrimPreHandler(server));\r\n *\r\n * fastify.get('/api/protected', async (request) => {\r\n * return { user: request.auth.claims.sub };\r\n * });\r\n * ```\r\n */\r\nexport function authrimPreHandler(\r\n server: AuthrimServer,\r\n options: MiddlewareOptions = {}\r\n) {\r\n return async (\r\n request: FastifyRequest & { auth?: ValidatedToken; authTokenType?: 'Bearer' | 'DPoP' },\r\n reply: FastifyReply\r\n ): Promise<void> => {\r\n // Build URL\r\n const url = `${request.protocol}://${request.hostname}${request.url}`;\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers: request.headers as Record<string, string | string[] | undefined>,\r\n method: request.method,\r\n url,\r\n });\r\n\r\n if (result.error) {\r\n const error = new AuthrimServerError(\r\n result.error.code as any,\r\n result.error.message\r\n );\r\n\r\n const headers = buildErrorHeaders(error, {\r\n realm: options.realm,\r\n scheme: 'Bearer',\r\n });\r\n\r\n if (options.onError) {\r\n options.onError(result.error);\r\n }\r\n\r\n reply.code(result.error.httpStatus).headers(headers).send(buildErrorResponse(error));\r\n return;\r\n }\r\n\r\n // Attach auth to request\r\n request.auth = result.data.claims;\r\n request.authTokenType = result.data.tokenType;\r\n };\r\n}\r\n\r\n/**\r\n * Create optional auth preHandler (doesn't fail if no token)\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param _options - Middleware options (unused for optional middleware)\r\n * @returns Fastify preHandler function\r\n */\r\nexport function authrimOptionalPreHandler(\r\n server: AuthrimServer,\r\n _options: MiddlewareOptions = {}\r\n) {\r\n return async (\r\n request: FastifyRequest & { auth?: ValidatedToken; authTokenType?: 'Bearer' | 'DPoP' },\r\n _reply: FastifyReply\r\n ): Promise<void> => {\r\n // Check if Authorization header exists\r\n const authHeader = request.headers['authorization'];\r\n if (!authHeader) {\r\n return;\r\n }\r\n\r\n // Build URL\r\n const url = `${request.protocol}://${request.hostname}${request.url}`;\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers: request.headers as Record<string, string | string[] | undefined>,\r\n method: request.method,\r\n url,\r\n });\r\n\r\n if (result.data) {\r\n request.auth = result.data.claims;\r\n request.authTokenType = result.data.tokenType;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Create Fastify plugin for token validation\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param options - Middleware options\r\n * @returns Fastify plugin\r\n */\r\nexport function authrimPlugin(server: AuthrimServer, options: MiddlewareOptions = {}) {\r\n return async (fastify: { addHook: (name: string, handler: unknown) => void }) => {\r\n fastify.addHook('preHandler', authrimPreHandler(server, options));\r\n };\r\n}\r\n\r\n/**\r\n * Create optional Fastify plugin (doesn't fail if no token)\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param options - Middleware options\r\n * @returns Fastify plugin\r\n */\r\nexport function authrimOptionalPlugin(server: AuthrimServer, options: MiddlewareOptions = {}) {\r\n return async (fastify: { addHook: (name: string, handler: unknown) => void }) => {\r\n fastify.addHook('preHandler', authrimOptionalPreHandler(server, options));\r\n };\r\n}\r\n"]}
@@ -0,0 +1,101 @@
1
+ import { A as AuthrimServer, M as MiddlewareOptions, V as ValidatedToken } from '../types-CzpMdWFR.cjs';
2
+ import '../config-I0GIVJA_.cjs';
3
+
4
+ /**
5
+ * Fastify Adapter
6
+ *
7
+ * Thin wrapper around authenticateRequest for Fastify framework.
8
+ */
9
+
10
+ /**
11
+ * Extended Fastify Request with auth property
12
+ *
13
+ * Note: Users should add this to their own type declarations:
14
+ * declare module 'fastify' {
15
+ * interface FastifyRequest {
16
+ * auth?: ValidatedToken;
17
+ * authTokenType?: 'Bearer' | 'DPoP';
18
+ * }
19
+ * }
20
+ */
21
+ /**
22
+ * Fastify request type (minimal interface)
23
+ */
24
+ interface FastifyRequest {
25
+ headers: Record<string, string | string[] | undefined>;
26
+ method: string;
27
+ protocol: string;
28
+ hostname: string;
29
+ url: string;
30
+ }
31
+ /**
32
+ * Fastify reply type (minimal interface)
33
+ */
34
+ interface FastifyReply {
35
+ code(statusCode: number): FastifyReply;
36
+ headers(headers: Record<string, string>): FastifyReply;
37
+ send(payload?: unknown): FastifyReply;
38
+ }
39
+ /**
40
+ * Create Fastify preHandler hook for token validation
41
+ *
42
+ * @param server - AuthrimServer instance
43
+ * @param options - Middleware options
44
+ * @returns Fastify preHandler function
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * import Fastify from 'fastify';
49
+ * import { createAuthrimServer } from '@authrim/server';
50
+ * import { authrimPreHandler } from '@authrim/server/adapters/fastify';
51
+ *
52
+ * const fastify = Fastify();
53
+ * const server = createAuthrimServer({
54
+ * issuer: 'https://auth.example.com',
55
+ * audience: 'https://api.example.com',
56
+ * });
57
+ *
58
+ * fastify.addHook('preHandler', authrimPreHandler(server));
59
+ *
60
+ * fastify.get('/api/protected', async (request) => {
61
+ * return { user: request.auth.claims.sub };
62
+ * });
63
+ * ```
64
+ */
65
+ declare function authrimPreHandler(server: AuthrimServer, options?: MiddlewareOptions): (request: FastifyRequest & {
66
+ auth?: ValidatedToken;
67
+ authTokenType?: "Bearer" | "DPoP";
68
+ }, reply: FastifyReply) => Promise<void>;
69
+ /**
70
+ * Create optional auth preHandler (doesn't fail if no token)
71
+ *
72
+ * @param server - AuthrimServer instance
73
+ * @param _options - Middleware options (unused for optional middleware)
74
+ * @returns Fastify preHandler function
75
+ */
76
+ declare function authrimOptionalPreHandler(server: AuthrimServer, _options?: MiddlewareOptions): (request: FastifyRequest & {
77
+ auth?: ValidatedToken;
78
+ authTokenType?: "Bearer" | "DPoP";
79
+ }, _reply: FastifyReply) => Promise<void>;
80
+ /**
81
+ * Create Fastify plugin for token validation
82
+ *
83
+ * @param server - AuthrimServer instance
84
+ * @param options - Middleware options
85
+ * @returns Fastify plugin
86
+ */
87
+ declare function authrimPlugin(server: AuthrimServer, options?: MiddlewareOptions): (fastify: {
88
+ addHook: (name: string, handler: unknown) => void;
89
+ }) => Promise<void>;
90
+ /**
91
+ * Create optional Fastify plugin (doesn't fail if no token)
92
+ *
93
+ * @param server - AuthrimServer instance
94
+ * @param options - Middleware options
95
+ * @returns Fastify plugin
96
+ */
97
+ declare function authrimOptionalPlugin(server: AuthrimServer, options?: MiddlewareOptions): (fastify: {
98
+ addHook: (name: string, handler: unknown) => void;
99
+ }) => Promise<void>;
100
+
101
+ export { authrimOptionalPlugin, authrimOptionalPreHandler, authrimPlugin, authrimPreHandler };
@@ -0,0 +1,101 @@
1
+ import { A as AuthrimServer, M as MiddlewareOptions, V as ValidatedToken } from '../types-D7gjcvs9.js';
2
+ import '../config-I0GIVJA_.js';
3
+
4
+ /**
5
+ * Fastify Adapter
6
+ *
7
+ * Thin wrapper around authenticateRequest for Fastify framework.
8
+ */
9
+
10
+ /**
11
+ * Extended Fastify Request with auth property
12
+ *
13
+ * Note: Users should add this to their own type declarations:
14
+ * declare module 'fastify' {
15
+ * interface FastifyRequest {
16
+ * auth?: ValidatedToken;
17
+ * authTokenType?: 'Bearer' | 'DPoP';
18
+ * }
19
+ * }
20
+ */
21
+ /**
22
+ * Fastify request type (minimal interface)
23
+ */
24
+ interface FastifyRequest {
25
+ headers: Record<string, string | string[] | undefined>;
26
+ method: string;
27
+ protocol: string;
28
+ hostname: string;
29
+ url: string;
30
+ }
31
+ /**
32
+ * Fastify reply type (minimal interface)
33
+ */
34
+ interface FastifyReply {
35
+ code(statusCode: number): FastifyReply;
36
+ headers(headers: Record<string, string>): FastifyReply;
37
+ send(payload?: unknown): FastifyReply;
38
+ }
39
+ /**
40
+ * Create Fastify preHandler hook for token validation
41
+ *
42
+ * @param server - AuthrimServer instance
43
+ * @param options - Middleware options
44
+ * @returns Fastify preHandler function
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * import Fastify from 'fastify';
49
+ * import { createAuthrimServer } from '@authrim/server';
50
+ * import { authrimPreHandler } from '@authrim/server/adapters/fastify';
51
+ *
52
+ * const fastify = Fastify();
53
+ * const server = createAuthrimServer({
54
+ * issuer: 'https://auth.example.com',
55
+ * audience: 'https://api.example.com',
56
+ * });
57
+ *
58
+ * fastify.addHook('preHandler', authrimPreHandler(server));
59
+ *
60
+ * fastify.get('/api/protected', async (request) => {
61
+ * return { user: request.auth.claims.sub };
62
+ * });
63
+ * ```
64
+ */
65
+ declare function authrimPreHandler(server: AuthrimServer, options?: MiddlewareOptions): (request: FastifyRequest & {
66
+ auth?: ValidatedToken;
67
+ authTokenType?: "Bearer" | "DPoP";
68
+ }, reply: FastifyReply) => Promise<void>;
69
+ /**
70
+ * Create optional auth preHandler (doesn't fail if no token)
71
+ *
72
+ * @param server - AuthrimServer instance
73
+ * @param _options - Middleware options (unused for optional middleware)
74
+ * @returns Fastify preHandler function
75
+ */
76
+ declare function authrimOptionalPreHandler(server: AuthrimServer, _options?: MiddlewareOptions): (request: FastifyRequest & {
77
+ auth?: ValidatedToken;
78
+ authTokenType?: "Bearer" | "DPoP";
79
+ }, _reply: FastifyReply) => Promise<void>;
80
+ /**
81
+ * Create Fastify plugin for token validation
82
+ *
83
+ * @param server - AuthrimServer instance
84
+ * @param options - Middleware options
85
+ * @returns Fastify plugin
86
+ */
87
+ declare function authrimPlugin(server: AuthrimServer, options?: MiddlewareOptions): (fastify: {
88
+ addHook: (name: string, handler: unknown) => void;
89
+ }) => Promise<void>;
90
+ /**
91
+ * Create optional Fastify plugin (doesn't fail if no token)
92
+ *
93
+ * @param server - AuthrimServer instance
94
+ * @param options - Middleware options
95
+ * @returns Fastify plugin
96
+ */
97
+ declare function authrimOptionalPlugin(server: AuthrimServer, options?: MiddlewareOptions): (fastify: {
98
+ addHook: (name: string, handler: unknown) => void;
99
+ }) => Promise<void>;
100
+
101
+ export { authrimOptionalPlugin, authrimOptionalPreHandler, authrimPlugin, authrimPreHandler };
@@ -0,0 +1,3 @@
1
+ import {c as c$1,a as a$1}from'../chunk-XOFM2JHF.js';import {c,a}from'../chunk-N3ONRO35.js';function u(a$2,t={}){return async(r,i)=>{let d=`${r.protocol}://${r.hostname}${r.url}`,e=await c(a$2,{headers:r.headers,method:r.method,url:d});if(e.error){let o=new a(e.error.code,e.error.message),m=c$1(o,{realm:t.realm,scheme:"Bearer"});t.onError&&t.onError(e.error),i.code(e.error.httpStatus).headers(m).send(a$1(o));return}r.auth=e.data.claims,r.authTokenType=e.data.tokenType;}}function p(a,t={}){return async(r,i)=>{if(!r.headers.authorization)return;let e=`${r.protocol}://${r.hostname}${r.url}`,o=await c(a,{headers:r.headers,method:r.method,url:e});o.data&&(r.auth=o.data.claims,r.authTokenType=o.data.tokenType);}}function g(a,t={}){return async r=>{r.addHook("preHandler",u(a,t));}}function k(a,t={}){return async r=>{r.addHook("preHandler",p(a,t));}}
2
+ export{k as authrimOptionalPlugin,p as authrimOptionalPreHandler,g as authrimPlugin,u as authrimPreHandler};//# sourceMappingURL=fastify.js.map
3
+ //# sourceMappingURL=fastify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/fastify.ts"],"names":["authrimPreHandler","server","options","request","reply","url","result","authenticateRequest","error","AuthrimServerError","headers","buildErrorHeaders","buildErrorResponse","authrimOptionalPreHandler","_options","_reply","authrimPlugin","fastify","authrimOptionalPlugin"],"mappings":"4FAuEO,SAASA,CAAAA,CACdC,IACAC,CAAAA,CAA6B,GAC7B,CACA,aACEC,CAAAA,CACAC,CAAAA,GACkB,CAElB,IAAMC,CAAAA,CAAM,GAAGF,CAAAA,CAAQ,QAAQ,MAAMA,CAAAA,CAAQ,QAAQ,CAAA,EAAGA,CAAAA,CAAQ,GAAG,CAAA,CAAA,CAG7DG,EAAS,MAAMC,CAAAA,CAAoBN,IAAQ,CAC/C,OAAA,CAASE,EAAQ,OAAA,CACjB,MAAA,CAAQA,EAAQ,MAAA,CAChB,GAAA,CAAAE,CACF,CAAC,CAAA,CAED,GAAIC,CAAAA,CAAO,KAAA,CAAO,CAChB,IAAME,CAAAA,CAAQ,IAAIC,CAAAA,CAChBH,CAAAA,CAAO,KAAA,CAAM,KACbA,CAAAA,CAAO,KAAA,CAAM,OACf,CAAA,CAEMI,CAAAA,CAAUC,IAAkBH,CAAAA,CAAO,CACvC,MAAON,CAAAA,CAAQ,KAAA,CACf,OAAQ,QACV,CAAC,EAEGA,CAAAA,CAAQ,OAAA,EACVA,EAAQ,OAAA,CAAQI,CAAAA,CAAO,KAAK,CAAA,CAG9BF,CAAAA,CAAM,IAAA,CAAKE,EAAO,KAAA,CAAM,UAAU,EAAE,OAAA,CAAQI,CAAO,EAAE,IAAA,CAAKE,GAAAA,CAAmBJ,CAAK,CAAC,CAAA,CACnF,MACF,CAGAL,CAAAA,CAAQ,IAAA,CAAOG,EAAO,IAAA,CAAK,MAAA,CAC3BH,EAAQ,aAAA,CAAgBG,CAAAA,CAAO,IAAA,CAAK,UACtC,CACF,CASO,SAASO,CAAAA,CACdZ,CAAAA,CACAa,EAA8B,EAAC,CAC/B,CACA,OAAO,MACLX,EACAY,CAAAA,GACkB,CAGlB,GAAI,CADeZ,CAAAA,CAAQ,QAAQ,aAAA,CAEjC,OAIF,IAAME,CAAAA,CAAM,CAAA,EAAGF,CAAAA,CAAQ,QAAQ,CAAA,GAAA,EAAMA,CAAAA,CAAQ,QAAQ,CAAA,EAAGA,CAAAA,CAAQ,GAAG,CAAA,CAAA,CAG7DG,CAAAA,CAAS,MAAMC,CAAAA,CAAoBN,CAAAA,CAAQ,CAC/C,OAAA,CAASE,CAAAA,CAAQ,QACjB,MAAA,CAAQA,CAAAA,CAAQ,OAChB,GAAA,CAAAE,CACF,CAAC,CAAA,CAEGC,CAAAA,CAAO,IAAA,GACTH,CAAAA,CAAQ,IAAA,CAAOG,CAAAA,CAAO,KAAK,MAAA,CAC3BH,CAAAA,CAAQ,cAAgBG,CAAAA,CAAO,IAAA,CAAK,WAExC,CACF,CASO,SAASU,CAAAA,CAAcf,CAAAA,CAAuBC,EAA6B,EAAC,CAAG,CACpF,OAAO,MAAOe,GAAmE,CAC/EA,CAAAA,CAAQ,OAAA,CAAQ,YAAA,CAAcjB,CAAAA,CAAkBC,CAAAA,CAAQC,CAAO,CAAC,EAClE,CACF,CASO,SAASgB,EAAsBjB,CAAAA,CAAuBC,CAAAA,CAA6B,EAAC,CAAG,CAC5F,aAAce,CAAAA,EAAmE,CAC/EA,EAAQ,OAAA,CAAQ,YAAA,CAAcJ,EAA0BZ,CAAAA,CAAQC,CAAO,CAAC,EAC1E,CACF","file":"fastify.js","sourcesContent":["/**\r\n * Fastify Adapter\r\n *\r\n * Thin wrapper around authenticateRequest for Fastify framework.\r\n */\r\n\r\nimport type { AuthrimServer } from '../core/client.js';\r\nimport type { MiddlewareOptions } from '../middleware/types.js';\r\nimport type { ValidatedToken } from '../types/claims.js';\r\nimport { authenticateRequest } from '../middleware/authenticate.js';\r\nimport { buildErrorResponse, buildErrorHeaders } from '../utils/error-response.js';\r\nimport { AuthrimServerError } from '../types/errors.js';\r\n\r\n/**\r\n * Extended Fastify Request with auth property\r\n *\r\n * Note: Users should add this to their own type declarations:\r\n * declare module 'fastify' {\r\n * interface FastifyRequest {\r\n * auth?: ValidatedToken;\r\n * authTokenType?: 'Bearer' | 'DPoP';\r\n * }\r\n * }\r\n */\r\n\r\n/**\r\n * Fastify request type (minimal interface)\r\n */\r\ninterface FastifyRequest {\r\n headers: Record<string, string | string[] | undefined>;\r\n method: string;\r\n protocol: string;\r\n hostname: string;\r\n url: string;\r\n}\r\n\r\n/**\r\n * Fastify reply type (minimal interface)\r\n */\r\ninterface FastifyReply {\r\n code(statusCode: number): FastifyReply;\r\n headers(headers: Record<string, string>): FastifyReply;\r\n send(payload?: unknown): FastifyReply;\r\n}\r\n\r\n/**\r\n * Create Fastify preHandler hook for token validation\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param options - Middleware options\r\n * @returns Fastify preHandler function\r\n *\r\n * @example\r\n * ```typescript\r\n * import Fastify from 'fastify';\r\n * import { createAuthrimServer } from '@authrim/server';\r\n * import { authrimPreHandler } from '@authrim/server/adapters/fastify';\r\n *\r\n * const fastify = Fastify();\r\n * const server = createAuthrimServer({\r\n * issuer: 'https://auth.example.com',\r\n * audience: 'https://api.example.com',\r\n * });\r\n *\r\n * fastify.addHook('preHandler', authrimPreHandler(server));\r\n *\r\n * fastify.get('/api/protected', async (request) => {\r\n * return { user: request.auth.claims.sub };\r\n * });\r\n * ```\r\n */\r\nexport function authrimPreHandler(\r\n server: AuthrimServer,\r\n options: MiddlewareOptions = {}\r\n) {\r\n return async (\r\n request: FastifyRequest & { auth?: ValidatedToken; authTokenType?: 'Bearer' | 'DPoP' },\r\n reply: FastifyReply\r\n ): Promise<void> => {\r\n // Build URL\r\n const url = `${request.protocol}://${request.hostname}${request.url}`;\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers: request.headers as Record<string, string | string[] | undefined>,\r\n method: request.method,\r\n url,\r\n });\r\n\r\n if (result.error) {\r\n const error = new AuthrimServerError(\r\n result.error.code as any,\r\n result.error.message\r\n );\r\n\r\n const headers = buildErrorHeaders(error, {\r\n realm: options.realm,\r\n scheme: 'Bearer',\r\n });\r\n\r\n if (options.onError) {\r\n options.onError(result.error);\r\n }\r\n\r\n reply.code(result.error.httpStatus).headers(headers).send(buildErrorResponse(error));\r\n return;\r\n }\r\n\r\n // Attach auth to request\r\n request.auth = result.data.claims;\r\n request.authTokenType = result.data.tokenType;\r\n };\r\n}\r\n\r\n/**\r\n * Create optional auth preHandler (doesn't fail if no token)\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param _options - Middleware options (unused for optional middleware)\r\n * @returns Fastify preHandler function\r\n */\r\nexport function authrimOptionalPreHandler(\r\n server: AuthrimServer,\r\n _options: MiddlewareOptions = {}\r\n) {\r\n return async (\r\n request: FastifyRequest & { auth?: ValidatedToken; authTokenType?: 'Bearer' | 'DPoP' },\r\n _reply: FastifyReply\r\n ): Promise<void> => {\r\n // Check if Authorization header exists\r\n const authHeader = request.headers['authorization'];\r\n if (!authHeader) {\r\n return;\r\n }\r\n\r\n // Build URL\r\n const url = `${request.protocol}://${request.hostname}${request.url}`;\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers: request.headers as Record<string, string | string[] | undefined>,\r\n method: request.method,\r\n url,\r\n });\r\n\r\n if (result.data) {\r\n request.auth = result.data.claims;\r\n request.authTokenType = result.data.tokenType;\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Create Fastify plugin for token validation\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param options - Middleware options\r\n * @returns Fastify plugin\r\n */\r\nexport function authrimPlugin(server: AuthrimServer, options: MiddlewareOptions = {}) {\r\n return async (fastify: { addHook: (name: string, handler: unknown) => void }) => {\r\n fastify.addHook('preHandler', authrimPreHandler(server, options));\r\n };\r\n}\r\n\r\n/**\r\n * Create optional Fastify plugin (doesn't fail if no token)\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param options - Middleware options\r\n * @returns Fastify plugin\r\n */\r\nexport function authrimOptionalPlugin(server: AuthrimServer, options: MiddlewareOptions = {}) {\r\n return async (fastify: { addHook: (name: string, handler: unknown) => void }) => {\r\n fastify.addHook('preHandler', authrimOptionalPreHandler(server, options));\r\n };\r\n}\r\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkO2ALCNXB_cjs=require('../chunk-O2ALCNXB.cjs'),chunkTPROSFE7_cjs=require('../chunk-TPROSFE7.cjs');var h="auth",p="authTokenType";function k(o){return o.get(h)}function x(o){return o.get(p)}function T(o,a={}){return async(e,s)=>{let i={};e.req.raw.headers.forEach((t,n)=>{i[n.toLowerCase()]=t;});let r=await chunkTPROSFE7_cjs.c(o,{headers:i,method:e.req.method,url:e.req.url});if(r.error){let t=new chunkTPROSFE7_cjs.a(r.error.code,r.error.message),n=chunkO2ALCNXB_cjs.c(t,{realm:a.realm,scheme:"Bearer"});a.onError&&a.onError(r.error);for(let[u,c]of Object.entries(n))e.header(u,c);return e.json(chunkO2ALCNXB_cjs.a(t),r.error.httpStatus)}e.set(h,r.data.claims),e.set(p,r.data.tokenType),await s();}}function v(o,a={}){return async(e,s)=>{if(!e.req.header("authorization")){await s();return}let d={};e.req.raw.headers.forEach((n,u)=>{d[u.toLowerCase()]=n;});let t=await chunkTPROSFE7_cjs.c(o,{headers:d,method:e.req.method,url:e.req.url});t.data&&(e.set(h,t.data.claims),e.set(p,t.data.tokenType)),await s();}}exports.AUTH_KEY=h;exports.AUTH_TOKEN_TYPE_KEY=p;exports.authrimMiddleware=T;exports.authrimOptionalMiddleware=v;exports.getAuth=k;exports.getAuthTokenType=x;//# sourceMappingURL=hono.cjs.map
2
+ //# sourceMappingURL=hono.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/hono.ts"],"names":["AUTH_KEY","AUTH_TOKEN_TYPE_KEY","getAuth","c","getAuthTokenType","authrimMiddleware","server","options","next","headers","value","key","result","authenticateRequest","error","AuthrimServerError","errorHeaders","buildErrorHeaders","buildErrorResponse","authrimOptionalMiddleware","_options"],"mappings":"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","file":"hono.cjs","sourcesContent":["/**\r\n * Hono Adapter\r\n *\r\n * Thin wrapper around authenticateRequest for Hono framework.\r\n */\r\n\r\nimport type { AuthrimServer } from '../core/client.js';\r\nimport type { MiddlewareOptions } from '../middleware/types.js';\r\nimport type { ValidatedToken } from '../types/claims.js';\r\nimport { authenticateRequest } from '../middleware/authenticate.js';\r\nimport { buildErrorResponse, buildErrorHeaders } from '../utils/error-response.js';\r\nimport { AuthrimServerError } from '../types/errors.js';\r\n\r\n/**\r\n * Hono context variable key for auth\r\n */\r\nexport const AUTH_KEY = 'auth';\r\nexport const AUTH_TOKEN_TYPE_KEY = 'authTokenType';\r\n\r\n/**\r\n * Hono Context type (minimal interface)\r\n */\r\ninterface HonoContext {\r\n req: {\r\n header(name: string): string | undefined;\r\n method: string;\r\n url: string;\r\n raw: Request;\r\n };\r\n set(key: string, value: unknown): void;\r\n get(key: string): unknown;\r\n json(data: unknown, status?: number): Response;\r\n header(name: string, value: string): void;\r\n}\r\n\r\n/**\r\n * Hono next function\r\n */\r\ntype HonoNext = () => Promise<void>;\r\n\r\n/**\r\n * Get auth from Hono context\r\n *\r\n * @param c - Hono context\r\n * @returns Validated token or undefined\r\n */\r\nexport function getAuth(c: HonoContext): ValidatedToken | undefined {\r\n return c.get(AUTH_KEY) as ValidatedToken | undefined;\r\n}\r\n\r\n/**\r\n * Get auth token type from Hono context\r\n *\r\n * @param c - Hono context\r\n * @returns Token type or undefined\r\n */\r\nexport function getAuthTokenType(c: HonoContext): 'Bearer' | 'DPoP' | undefined {\r\n return c.get(AUTH_TOKEN_TYPE_KEY) as 'Bearer' | 'DPoP' | undefined;\r\n}\r\n\r\n/**\r\n * Create Hono middleware for token validation\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param options - Middleware options\r\n * @returns Hono middleware function\r\n *\r\n * @example\r\n * ```typescript\r\n * import { Hono } from 'hono';\r\n * import { createAuthrimServer } from '@authrim/server';\r\n * import { authrimMiddleware, getAuth } from '@authrim/server/adapters/hono';\r\n *\r\n * const app = new Hono();\r\n * const server = createAuthrimServer({\r\n * issuer: 'https://auth.example.com',\r\n * audience: 'https://api.example.com',\r\n * });\r\n *\r\n * app.use('/api/*', authrimMiddleware(server));\r\n *\r\n * app.get('/api/protected', (c) => {\r\n * const auth = getAuth(c);\r\n * return c.json({ user: auth?.claims.sub });\r\n * });\r\n * ```\r\n */\r\nexport function authrimMiddleware(\r\n server: AuthrimServer,\r\n options: MiddlewareOptions = {}\r\n) {\r\n return async (c: HonoContext, next: HonoNext): Promise<Response | void> => {\r\n // Build headers record\r\n const headers: Record<string, string> = {};\r\n const rawHeaders = c.req.raw.headers;\r\n rawHeaders.forEach((value, key) => {\r\n headers[key.toLowerCase()] = value;\r\n });\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers,\r\n method: c.req.method,\r\n url: c.req.url,\r\n });\r\n\r\n if (result.error) {\r\n const error = new AuthrimServerError(\r\n result.error.code as any,\r\n result.error.message\r\n );\r\n\r\n const errorHeaders = buildErrorHeaders(error, {\r\n realm: options.realm,\r\n scheme: 'Bearer',\r\n });\r\n\r\n if (options.onError) {\r\n options.onError(result.error);\r\n }\r\n\r\n for (const [key, value] of Object.entries(errorHeaders)) {\r\n c.header(key, value);\r\n }\r\n\r\n return c.json(buildErrorResponse(error), result.error.httpStatus);\r\n }\r\n\r\n // Set auth in context\r\n c.set(AUTH_KEY, result.data.claims);\r\n c.set(AUTH_TOKEN_TYPE_KEY, result.data.tokenType);\r\n\r\n await next();\r\n };\r\n}\r\n\r\n/**\r\n * Create optional auth middleware (doesn't fail if no token)\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param _options - Middleware options (unused for optional middleware)\r\n * @returns Hono middleware function\r\n */\r\nexport function authrimOptionalMiddleware(\r\n server: AuthrimServer,\r\n _options: MiddlewareOptions = {}\r\n) {\r\n return async (c: HonoContext, next: HonoNext): Promise<void> => {\r\n // Check if Authorization header exists\r\n const authHeader = c.req.header('authorization');\r\n if (!authHeader) {\r\n await next();\r\n return;\r\n }\r\n\r\n // Build headers record\r\n const headers: Record<string, string> = {};\r\n const rawHeaders = c.req.raw.headers;\r\n rawHeaders.forEach((value, key) => {\r\n headers[key.toLowerCase()] = value;\r\n });\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers,\r\n method: c.req.method,\r\n url: c.req.url,\r\n });\r\n\r\n if (result.data) {\r\n c.set(AUTH_KEY, result.data.claims);\r\n c.set(AUTH_TOKEN_TYPE_KEY, result.data.tokenType);\r\n }\r\n\r\n await next();\r\n };\r\n}\r\n"]}
@@ -0,0 +1,85 @@
1
+ import { A as AuthrimServer, M as MiddlewareOptions, V as ValidatedToken } from '../types-CzpMdWFR.cjs';
2
+ import '../config-I0GIVJA_.cjs';
3
+
4
+ /**
5
+ * Hono Adapter
6
+ *
7
+ * Thin wrapper around authenticateRequest for Hono framework.
8
+ */
9
+
10
+ /**
11
+ * Hono context variable key for auth
12
+ */
13
+ declare const AUTH_KEY = "auth";
14
+ declare const AUTH_TOKEN_TYPE_KEY = "authTokenType";
15
+ /**
16
+ * Hono Context type (minimal interface)
17
+ */
18
+ interface HonoContext {
19
+ req: {
20
+ header(name: string): string | undefined;
21
+ method: string;
22
+ url: string;
23
+ raw: Request;
24
+ };
25
+ set(key: string, value: unknown): void;
26
+ get(key: string): unknown;
27
+ json(data: unknown, status?: number): Response;
28
+ header(name: string, value: string): void;
29
+ }
30
+ /**
31
+ * Hono next function
32
+ */
33
+ type HonoNext = () => Promise<void>;
34
+ /**
35
+ * Get auth from Hono context
36
+ *
37
+ * @param c - Hono context
38
+ * @returns Validated token or undefined
39
+ */
40
+ declare function getAuth(c: HonoContext): ValidatedToken | undefined;
41
+ /**
42
+ * Get auth token type from Hono context
43
+ *
44
+ * @param c - Hono context
45
+ * @returns Token type or undefined
46
+ */
47
+ declare function getAuthTokenType(c: HonoContext): 'Bearer' | 'DPoP' | undefined;
48
+ /**
49
+ * Create Hono middleware for token validation
50
+ *
51
+ * @param server - AuthrimServer instance
52
+ * @param options - Middleware options
53
+ * @returns Hono middleware function
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * import { Hono } from 'hono';
58
+ * import { createAuthrimServer } from '@authrim/server';
59
+ * import { authrimMiddleware, getAuth } from '@authrim/server/adapters/hono';
60
+ *
61
+ * const app = new Hono();
62
+ * const server = createAuthrimServer({
63
+ * issuer: 'https://auth.example.com',
64
+ * audience: 'https://api.example.com',
65
+ * });
66
+ *
67
+ * app.use('/api/*', authrimMiddleware(server));
68
+ *
69
+ * app.get('/api/protected', (c) => {
70
+ * const auth = getAuth(c);
71
+ * return c.json({ user: auth?.claims.sub });
72
+ * });
73
+ * ```
74
+ */
75
+ declare function authrimMiddleware(server: AuthrimServer, options?: MiddlewareOptions): (c: HonoContext, next: HonoNext) => Promise<Response | void>;
76
+ /**
77
+ * Create optional auth middleware (doesn't fail if no token)
78
+ *
79
+ * @param server - AuthrimServer instance
80
+ * @param _options - Middleware options (unused for optional middleware)
81
+ * @returns Hono middleware function
82
+ */
83
+ declare function authrimOptionalMiddleware(server: AuthrimServer, _options?: MiddlewareOptions): (c: HonoContext, next: HonoNext) => Promise<void>;
84
+
85
+ export { AUTH_KEY, AUTH_TOKEN_TYPE_KEY, authrimMiddleware, authrimOptionalMiddleware, getAuth, getAuthTokenType };
@@ -0,0 +1,85 @@
1
+ import { A as AuthrimServer, M as MiddlewareOptions, V as ValidatedToken } from '../types-D7gjcvs9.js';
2
+ import '../config-I0GIVJA_.js';
3
+
4
+ /**
5
+ * Hono Adapter
6
+ *
7
+ * Thin wrapper around authenticateRequest for Hono framework.
8
+ */
9
+
10
+ /**
11
+ * Hono context variable key for auth
12
+ */
13
+ declare const AUTH_KEY = "auth";
14
+ declare const AUTH_TOKEN_TYPE_KEY = "authTokenType";
15
+ /**
16
+ * Hono Context type (minimal interface)
17
+ */
18
+ interface HonoContext {
19
+ req: {
20
+ header(name: string): string | undefined;
21
+ method: string;
22
+ url: string;
23
+ raw: Request;
24
+ };
25
+ set(key: string, value: unknown): void;
26
+ get(key: string): unknown;
27
+ json(data: unknown, status?: number): Response;
28
+ header(name: string, value: string): void;
29
+ }
30
+ /**
31
+ * Hono next function
32
+ */
33
+ type HonoNext = () => Promise<void>;
34
+ /**
35
+ * Get auth from Hono context
36
+ *
37
+ * @param c - Hono context
38
+ * @returns Validated token or undefined
39
+ */
40
+ declare function getAuth(c: HonoContext): ValidatedToken | undefined;
41
+ /**
42
+ * Get auth token type from Hono context
43
+ *
44
+ * @param c - Hono context
45
+ * @returns Token type or undefined
46
+ */
47
+ declare function getAuthTokenType(c: HonoContext): 'Bearer' | 'DPoP' | undefined;
48
+ /**
49
+ * Create Hono middleware for token validation
50
+ *
51
+ * @param server - AuthrimServer instance
52
+ * @param options - Middleware options
53
+ * @returns Hono middleware function
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * import { Hono } from 'hono';
58
+ * import { createAuthrimServer } from '@authrim/server';
59
+ * import { authrimMiddleware, getAuth } from '@authrim/server/adapters/hono';
60
+ *
61
+ * const app = new Hono();
62
+ * const server = createAuthrimServer({
63
+ * issuer: 'https://auth.example.com',
64
+ * audience: 'https://api.example.com',
65
+ * });
66
+ *
67
+ * app.use('/api/*', authrimMiddleware(server));
68
+ *
69
+ * app.get('/api/protected', (c) => {
70
+ * const auth = getAuth(c);
71
+ * return c.json({ user: auth?.claims.sub });
72
+ * });
73
+ * ```
74
+ */
75
+ declare function authrimMiddleware(server: AuthrimServer, options?: MiddlewareOptions): (c: HonoContext, next: HonoNext) => Promise<Response | void>;
76
+ /**
77
+ * Create optional auth middleware (doesn't fail if no token)
78
+ *
79
+ * @param server - AuthrimServer instance
80
+ * @param _options - Middleware options (unused for optional middleware)
81
+ * @returns Hono middleware function
82
+ */
83
+ declare function authrimOptionalMiddleware(server: AuthrimServer, _options?: MiddlewareOptions): (c: HonoContext, next: HonoNext) => Promise<void>;
84
+
85
+ export { AUTH_KEY, AUTH_TOKEN_TYPE_KEY, authrimMiddleware, authrimOptionalMiddleware, getAuth, getAuthTokenType };
@@ -0,0 +1,2 @@
1
+ import {c as c$1,a as a$1}from'../chunk-XOFM2JHF.js';import {c,a}from'../chunk-N3ONRO35.js';var h="auth",p="authTokenType";function k(o){return o.get(h)}function x(o){return o.get(p)}function T(o,a$2={}){return async(e,s)=>{let i={};e.req.raw.headers.forEach((t,n)=>{i[n.toLowerCase()]=t;});let r=await c(o,{headers:i,method:e.req.method,url:e.req.url});if(r.error){let t=new a(r.error.code,r.error.message),n=c$1(t,{realm:a$2.realm,scheme:"Bearer"});a$2.onError&&a$2.onError(r.error);for(let[u,c]of Object.entries(n))e.header(u,c);return e.json(a$1(t),r.error.httpStatus)}e.set(h,r.data.claims),e.set(p,r.data.tokenType),await s();}}function v(o,a={}){return async(e,s)=>{if(!e.req.header("authorization")){await s();return}let d={};e.req.raw.headers.forEach((n,u)=>{d[u.toLowerCase()]=n;});let t=await c(o,{headers:d,method:e.req.method,url:e.req.url});t.data&&(e.set(h,t.data.claims),e.set(p,t.data.tokenType)),await s();}}export{h as AUTH_KEY,p as AUTH_TOKEN_TYPE_KEY,T as authrimMiddleware,v as authrimOptionalMiddleware,k as getAuth,x as getAuthTokenType};//# sourceMappingURL=hono.js.map
2
+ //# sourceMappingURL=hono.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/hono.ts"],"names":["AUTH_KEY","AUTH_TOKEN_TYPE_KEY","getAuth","c","getAuthTokenType","authrimMiddleware","server","options","next","headers","value","key","result","authenticateRequest","error","AuthrimServerError","errorHeaders","buildErrorHeaders","buildErrorResponse","authrimOptionalMiddleware","_options"],"mappings":"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","file":"hono.js","sourcesContent":["/**\r\n * Hono Adapter\r\n *\r\n * Thin wrapper around authenticateRequest for Hono framework.\r\n */\r\n\r\nimport type { AuthrimServer } from '../core/client.js';\r\nimport type { MiddlewareOptions } from '../middleware/types.js';\r\nimport type { ValidatedToken } from '../types/claims.js';\r\nimport { authenticateRequest } from '../middleware/authenticate.js';\r\nimport { buildErrorResponse, buildErrorHeaders } from '../utils/error-response.js';\r\nimport { AuthrimServerError } from '../types/errors.js';\r\n\r\n/**\r\n * Hono context variable key for auth\r\n */\r\nexport const AUTH_KEY = 'auth';\r\nexport const AUTH_TOKEN_TYPE_KEY = 'authTokenType';\r\n\r\n/**\r\n * Hono Context type (minimal interface)\r\n */\r\ninterface HonoContext {\r\n req: {\r\n header(name: string): string | undefined;\r\n method: string;\r\n url: string;\r\n raw: Request;\r\n };\r\n set(key: string, value: unknown): void;\r\n get(key: string): unknown;\r\n json(data: unknown, status?: number): Response;\r\n header(name: string, value: string): void;\r\n}\r\n\r\n/**\r\n * Hono next function\r\n */\r\ntype HonoNext = () => Promise<void>;\r\n\r\n/**\r\n * Get auth from Hono context\r\n *\r\n * @param c - Hono context\r\n * @returns Validated token or undefined\r\n */\r\nexport function getAuth(c: HonoContext): ValidatedToken | undefined {\r\n return c.get(AUTH_KEY) as ValidatedToken | undefined;\r\n}\r\n\r\n/**\r\n * Get auth token type from Hono context\r\n *\r\n * @param c - Hono context\r\n * @returns Token type or undefined\r\n */\r\nexport function getAuthTokenType(c: HonoContext): 'Bearer' | 'DPoP' | undefined {\r\n return c.get(AUTH_TOKEN_TYPE_KEY) as 'Bearer' | 'DPoP' | undefined;\r\n}\r\n\r\n/**\r\n * Create Hono middleware for token validation\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param options - Middleware options\r\n * @returns Hono middleware function\r\n *\r\n * @example\r\n * ```typescript\r\n * import { Hono } from 'hono';\r\n * import { createAuthrimServer } from '@authrim/server';\r\n * import { authrimMiddleware, getAuth } from '@authrim/server/adapters/hono';\r\n *\r\n * const app = new Hono();\r\n * const server = createAuthrimServer({\r\n * issuer: 'https://auth.example.com',\r\n * audience: 'https://api.example.com',\r\n * });\r\n *\r\n * app.use('/api/*', authrimMiddleware(server));\r\n *\r\n * app.get('/api/protected', (c) => {\r\n * const auth = getAuth(c);\r\n * return c.json({ user: auth?.claims.sub });\r\n * });\r\n * ```\r\n */\r\nexport function authrimMiddleware(\r\n server: AuthrimServer,\r\n options: MiddlewareOptions = {}\r\n) {\r\n return async (c: HonoContext, next: HonoNext): Promise<Response | void> => {\r\n // Build headers record\r\n const headers: Record<string, string> = {};\r\n const rawHeaders = c.req.raw.headers;\r\n rawHeaders.forEach((value, key) => {\r\n headers[key.toLowerCase()] = value;\r\n });\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers,\r\n method: c.req.method,\r\n url: c.req.url,\r\n });\r\n\r\n if (result.error) {\r\n const error = new AuthrimServerError(\r\n result.error.code as any,\r\n result.error.message\r\n );\r\n\r\n const errorHeaders = buildErrorHeaders(error, {\r\n realm: options.realm,\r\n scheme: 'Bearer',\r\n });\r\n\r\n if (options.onError) {\r\n options.onError(result.error);\r\n }\r\n\r\n for (const [key, value] of Object.entries(errorHeaders)) {\r\n c.header(key, value);\r\n }\r\n\r\n return c.json(buildErrorResponse(error), result.error.httpStatus);\r\n }\r\n\r\n // Set auth in context\r\n c.set(AUTH_KEY, result.data.claims);\r\n c.set(AUTH_TOKEN_TYPE_KEY, result.data.tokenType);\r\n\r\n await next();\r\n };\r\n}\r\n\r\n/**\r\n * Create optional auth middleware (doesn't fail if no token)\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param _options - Middleware options (unused for optional middleware)\r\n * @returns Hono middleware function\r\n */\r\nexport function authrimOptionalMiddleware(\r\n server: AuthrimServer,\r\n _options: MiddlewareOptions = {}\r\n) {\r\n return async (c: HonoContext, next: HonoNext): Promise<void> => {\r\n // Check if Authorization header exists\r\n const authHeader = c.req.header('authorization');\r\n if (!authHeader) {\r\n await next();\r\n return;\r\n }\r\n\r\n // Build headers record\r\n const headers: Record<string, string> = {};\r\n const rawHeaders = c.req.raw.headers;\r\n rawHeaders.forEach((value, key) => {\r\n headers[key.toLowerCase()] = value;\r\n });\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers,\r\n method: c.req.method,\r\n url: c.req.url,\r\n });\r\n\r\n if (result.data) {\r\n c.set(AUTH_KEY, result.data.claims);\r\n c.set(AUTH_TOKEN_TYPE_KEY, result.data.tokenType);\r\n }\r\n\r\n await next();\r\n };\r\n}\r\n"]}
@@ -0,0 +1,3 @@
1
+ 'use strict';var chunkO2ALCNXB_cjs=require('../chunk-O2ALCNXB.cjs'),chunkTPROSFE7_cjs=require('../chunk-TPROSFE7.cjs');function g(a,o={}){return async(e,s)=>{let n=`${e.request.protocol}://${e.request.host}${e.request.url}`,r=await chunkTPROSFE7_cjs.c(a,{headers:e.request.headers,method:e.request.method,url:n});if(r.error){let t=new chunkTPROSFE7_cjs.a(r.error.code,r.error.message),h=chunkO2ALCNXB_cjs.c(t,{realm:o.realm,scheme:"Bearer"});o.onError&&o.onError(r.error),e.response.status=r.error.httpStatus,e.response.set(h),e.response.body=chunkO2ALCNXB_cjs.a(t);return}e.state.auth=r.data.claims,e.state.authTokenType=r.data.tokenType,await s();}}function y(a,o={}){return async(e,s)=>{if(!e.request.headers.authorization){await s();return}let r=`${e.request.protocol}://${e.request.host}${e.request.url}`,t=await chunkTPROSFE7_cjs.c(a,{headers:e.request.headers,method:e.request.method,url:r});t.data&&(e.state.auth=t.data.claims,e.state.authTokenType=t.data.tokenType),await s();}}
2
+ exports.authrimMiddleware=g;exports.authrimOptionalMiddleware=y;//# sourceMappingURL=koa.cjs.map
3
+ //# sourceMappingURL=koa.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/koa.ts"],"names":["authrimMiddleware","server","options","ctx","next","url","result","authenticateRequest","error","AuthrimServerError","headers","buildErrorHeaders","buildErrorResponse","authrimOptionalMiddleware","_options"],"mappings":"uHAuEO,SAASA,EACdC,CAAAA,CACAC,CAAAA,CAA6B,EAAC,CAC9B,CACA,OAAO,MAAOC,CAAAA,CAAiBC,IAAiC,CAE9D,IAAMC,EAAM,CAAA,EAAGF,CAAAA,CAAI,QAAQ,QAAQ,CAAA,GAAA,EAAMA,EAAI,OAAA,CAAQ,IAAI,GAAGA,CAAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,CAAA,CAGrEG,CAAAA,CAAS,MAAMC,mBAAAA,CAAoBN,CAAAA,CAAQ,CAC/C,OAAA,CAASE,CAAAA,CAAI,QAAQ,OAAA,CACrB,MAAA,CAAQA,EAAI,OAAA,CAAQ,MAAA,CACpB,IAAAE,CACF,CAAC,EAED,GAAIC,CAAAA,CAAO,KAAA,CAAO,CAChB,IAAME,CAAAA,CAAQ,IAAIC,oBAChBH,CAAAA,CAAO,KAAA,CAAM,KACbA,CAAAA,CAAO,KAAA,CAAM,OACf,CAAA,CAEMI,CAAAA,CAAUC,oBAAkBH,CAAAA,CAAO,CACvC,MAAON,CAAAA,CAAQ,KAAA,CACf,OAAQ,QACV,CAAC,EAEGA,CAAAA,CAAQ,OAAA,EACVA,EAAQ,OAAA,CAAQI,CAAAA,CAAO,KAAK,CAAA,CAG9BH,CAAAA,CAAI,SAAS,MAAA,CAASG,CAAAA,CAAO,MAAM,UAAA,CACnCH,CAAAA,CAAI,SAAS,GAAA,CAAIO,CAAO,EACxBP,CAAAA,CAAI,QAAA,CAAS,KAAOS,mBAAAA,CAAmBJ,CAAK,CAAA,CAC5C,MACF,CAGAL,CAAAA,CAAI,KAAA,CAAM,KAAOG,CAAAA,CAAO,IAAA,CAAK,OAC7BH,CAAAA,CAAI,KAAA,CAAM,cAAgBG,CAAAA,CAAO,IAAA,CAAK,UAEtC,MAAMF,CAAAA,GACR,CACF,CASO,SAASS,CAAAA,CACdZ,CAAAA,CACAa,EAA8B,EAAC,CAC/B,CACA,OAAO,MAAOX,EAAiBC,CAAAA,GAAiC,CAG9D,GAAI,CADeD,CAAAA,CAAI,QAAQ,OAAA,CAAQ,aAAA,CACtB,CACf,MAAMC,CAAAA,GACN,MACF,CAGA,IAAMC,CAAAA,CAAM,CAAA,EAAGF,EAAI,OAAA,CAAQ,QAAQ,MAAMA,CAAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,EAAGA,CAAAA,CAAI,QAAQ,GAAG,CAAA,CAAA,CAGrEG,EAAS,MAAMC,mBAAAA,CAAoBN,EAAQ,CAC/C,OAAA,CAASE,EAAI,OAAA,CAAQ,OAAA,CACrB,OAAQA,CAAAA,CAAI,OAAA,CAAQ,OACpB,GAAA,CAAAE,CACF,CAAC,CAAA,CAEGC,CAAAA,CAAO,OACTH,CAAAA,CAAI,KAAA,CAAM,KAAOG,CAAAA,CAAO,IAAA,CAAK,OAC7BH,CAAAA,CAAI,KAAA,CAAM,cAAgBG,CAAAA,CAAO,IAAA,CAAK,WAGxC,MAAMF,CAAAA,GACR,CACF","file":"koa.cjs","sourcesContent":["/**\r\n * Koa Adapter\r\n *\r\n * Thin wrapper around authenticateRequest for Koa framework.\r\n */\r\n\r\nimport type { AuthrimServer } from '../core/client.js';\r\nimport type { MiddlewareOptions } from '../middleware/types.js';\r\nimport type { ValidatedToken } from '../types/claims.js';\r\nimport { authenticateRequest } from '../middleware/authenticate.js';\r\nimport { buildErrorResponse, buildErrorHeaders } from '../utils/error-response.js';\r\nimport { AuthrimServerError } from '../types/errors.js';\r\n\r\n/**\r\n * Koa state with auth\r\n */\r\nexport interface AuthrimKoaState {\r\n auth?: ValidatedToken;\r\n authTokenType?: 'Bearer' | 'DPoP';\r\n}\r\n\r\n/**\r\n * Koa context type (minimal interface)\r\n */\r\ninterface KoaContext {\r\n request: {\r\n headers: Record<string, string | string[] | undefined>;\r\n method: string;\r\n protocol: string;\r\n host: string;\r\n url: string;\r\n };\r\n response: {\r\n status: number;\r\n set(headers: Record<string, string>): void;\r\n body: unknown;\r\n };\r\n state: AuthrimKoaState;\r\n}\r\n\r\n/**\r\n * Koa next function\r\n */\r\ntype KoaNext = () => Promise<void>;\r\n\r\n/**\r\n * Create Koa middleware for token validation\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param options - Middleware options\r\n * @returns Koa middleware function\r\n *\r\n * @example\r\n * ```typescript\r\n * import Koa from 'koa';\r\n * import { createAuthrimServer } from '@authrim/server';\r\n * import { authrimMiddleware } from '@authrim/server/adapters/koa';\r\n *\r\n * const app = new Koa();\r\n * const server = createAuthrimServer({\r\n * issuer: 'https://auth.example.com',\r\n * audience: 'https://api.example.com',\r\n * });\r\n *\r\n * app.use(authrimMiddleware(server));\r\n *\r\n * app.use((ctx) => {\r\n * ctx.body = { user: ctx.state.auth?.claims.sub };\r\n * });\r\n * ```\r\n */\r\nexport function authrimMiddleware(\r\n server: AuthrimServer,\r\n options: MiddlewareOptions = {}\r\n) {\r\n return async (ctx: KoaContext, next: KoaNext): Promise<void> => {\r\n // Build URL\r\n const url = `${ctx.request.protocol}://${ctx.request.host}${ctx.request.url}`;\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers: ctx.request.headers as Record<string, string | string[] | undefined>,\r\n method: ctx.request.method,\r\n url,\r\n });\r\n\r\n if (result.error) {\r\n const error = new AuthrimServerError(\r\n result.error.code as any,\r\n result.error.message\r\n );\r\n\r\n const headers = buildErrorHeaders(error, {\r\n realm: options.realm,\r\n scheme: 'Bearer',\r\n });\r\n\r\n if (options.onError) {\r\n options.onError(result.error);\r\n }\r\n\r\n ctx.response.status = result.error.httpStatus;\r\n ctx.response.set(headers);\r\n ctx.response.body = buildErrorResponse(error);\r\n return;\r\n }\r\n\r\n // Attach auth to state\r\n ctx.state.auth = result.data.claims;\r\n ctx.state.authTokenType = result.data.tokenType;\r\n\r\n await next();\r\n };\r\n}\r\n\r\n/**\r\n * Create optional auth middleware (doesn't fail if no token)\r\n *\r\n * @param server - AuthrimServer instance\r\n * @param _options - Middleware options (unused for optional middleware)\r\n * @returns Koa middleware function\r\n */\r\nexport function authrimOptionalMiddleware(\r\n server: AuthrimServer,\r\n _options: MiddlewareOptions = {}\r\n) {\r\n return async (ctx: KoaContext, next: KoaNext): Promise<void> => {\r\n // Check if Authorization header exists\r\n const authHeader = ctx.request.headers['authorization'];\r\n if (!authHeader) {\r\n await next();\r\n return;\r\n }\r\n\r\n // Build URL\r\n const url = `${ctx.request.protocol}://${ctx.request.host}${ctx.request.url}`;\r\n\r\n // Authenticate\r\n const result = await authenticateRequest(server, {\r\n headers: ctx.request.headers as Record<string, string | string[] | undefined>,\r\n method: ctx.request.method,\r\n url,\r\n });\r\n\r\n if (result.data) {\r\n ctx.state.auth = result.data.claims;\r\n ctx.state.authTokenType = result.data.tokenType;\r\n }\r\n\r\n await next();\r\n };\r\n}\r\n"]}