@geekmidas/auth 0.0.4 → 0.0.5

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 (102) hide show
  1. package/dist/{cacheTokenStorage-BlpcZwef.d.mts → cacheTokenStorage-BzBRJfd-.d.mts} +2 -1
  2. package/dist/cacheTokenStorage-Ca05vf3T.mjs +2 -1
  3. package/dist/cacheTokenStorage-Ca05vf3T.mjs.map +1 -0
  4. package/dist/cacheTokenStorage-CvptztkW.cjs +2 -1
  5. package/dist/cacheTokenStorage-CvptztkW.cjs.map +1 -0
  6. package/dist/cacheTokenStorage-yNUpDD8W.d.cts +2 -1
  7. package/dist/cacheTokenStorage.d.mts +1 -1
  8. package/dist/{chunk-DWy1uDak.cjs → chunk-CUT6urMc.cjs} +0 -9
  9. package/dist/client-DaiUm0UZ.cjs +2 -1
  10. package/dist/client-DaiUm0UZ.cjs.map +1 -0
  11. package/dist/client-DjNZS6vZ.mjs +2 -1
  12. package/dist/client-DjNZS6vZ.mjs.map +1 -0
  13. package/dist/client.d.mts +1 -1
  14. package/dist/hono/jwt.cjs +92 -0
  15. package/dist/hono/jwt.cjs.map +1 -0
  16. package/dist/hono/jwt.d.cts +45 -0
  17. package/dist/hono/jwt.d.mts +45 -0
  18. package/dist/hono/jwt.mjs +91 -0
  19. package/dist/hono/jwt.mjs.map +1 -0
  20. package/dist/hono/oidc.cjs +104 -0
  21. package/dist/hono/oidc.cjs.map +1 -0
  22. package/dist/hono/oidc.d.cts +48 -0
  23. package/dist/hono/oidc.d.mts +48 -0
  24. package/dist/hono/oidc.mjs +103 -0
  25. package/dist/hono/oidc.mjs.map +1 -0
  26. package/dist/index.cjs +1 -1
  27. package/dist/index.d.cts +1 -1
  28. package/dist/index.d.mts +2 -2
  29. package/dist/jwt-Bo_eACEi.cjs +70 -0
  30. package/dist/jwt-Bo_eACEi.cjs.map +1 -0
  31. package/dist/jwt-D88cPJyT.mjs +52 -0
  32. package/dist/jwt-D88cPJyT.mjs.map +1 -0
  33. package/dist/jwt-DF9kFbmh.d.cts +61 -0
  34. package/dist/jwt-DH8CJ2xC.d.mts +61 -0
  35. package/dist/jwt.cjs +5 -0
  36. package/dist/jwt.d.cts +2 -0
  37. package/dist/jwt.d.mts +2 -0
  38. package/dist/jwt.mjs +3 -0
  39. package/dist/lambda/jwt.cjs +126 -0
  40. package/dist/lambda/jwt.cjs.map +1 -0
  41. package/dist/lambda/jwt.d.cts +52 -0
  42. package/dist/lambda/jwt.d.mts +52 -0
  43. package/dist/lambda/jwt.mjs +125 -0
  44. package/dist/lambda/jwt.mjs.map +1 -0
  45. package/dist/lambda/oidc.cjs +117 -0
  46. package/dist/lambda/oidc.cjs.map +1 -0
  47. package/dist/lambda/oidc.d.cts +44 -0
  48. package/dist/lambda/oidc.d.mts +44 -0
  49. package/dist/lambda/oidc.mjs +116 -0
  50. package/dist/lambda/oidc.mjs.map +1 -0
  51. package/dist/oidc-C0KyYaAK.cjs +68 -0
  52. package/dist/oidc-C0KyYaAK.cjs.map +1 -0
  53. package/dist/oidc-CKOGLxjV.d.mts +86 -0
  54. package/dist/oidc-DDLIB5gb.d.cts +86 -0
  55. package/dist/oidc-KA30gMlx.mjs +62 -0
  56. package/dist/oidc-KA30gMlx.mjs.map +1 -0
  57. package/dist/oidc.cjs +3 -0
  58. package/dist/oidc.d.cts +3 -0
  59. package/dist/oidc.d.mts +3 -0
  60. package/dist/oidc.mjs +3 -0
  61. package/dist/server.cjs +1 -1
  62. package/dist/server.d.cts +1 -1
  63. package/dist/server.d.mts +2 -2
  64. package/dist/{tokenManager-CCcFk2Py.d.mts → tokenManager--Q93eNYr.d.mts} +2 -1
  65. package/dist/tokenManager-BVXxfHRa.mjs +2 -1
  66. package/dist/tokenManager-BVXxfHRa.mjs.map +1 -0
  67. package/dist/{tokenManager-B60gFnEF.cjs → tokenManager-EPmwgai2.cjs} +3 -2
  68. package/dist/tokenManager-EPmwgai2.cjs.map +1 -0
  69. package/dist/{tokenManager-mpzJKLvX.d.cts → tokenManager-H6-lWEah.d.cts} +2 -1
  70. package/dist/tokenManager.cjs +1 -1
  71. package/dist/tokenManager.d.cts +1 -1
  72. package/dist/tokenManager.d.mts +1 -1
  73. package/package.json +48 -1
  74. package/src/__tests__/hono-jwt.spec.ts +232 -0
  75. package/src/__tests__/hono-oidc.spec.ts +605 -0
  76. package/src/__tests__/jwt.spec.ts +174 -0
  77. package/src/__tests__/lambda-jwt.spec.ts +278 -0
  78. package/src/__tests__/lambda-oidc.spec.ts +623 -0
  79. package/src/__tests__/oidc.spec.ts +405 -0
  80. package/src/hono/jwt.ts +142 -0
  81. package/src/hono/oidc.ts +170 -0
  82. package/src/jwt.ts +106 -0
  83. package/src/lambda/jwt.ts +210 -0
  84. package/src/lambda/oidc.ts +203 -0
  85. package/src/oidc.ts +156 -0
  86. package/dist/__tests__/cacheTokenStorage.spec.cjs +0 -146
  87. package/dist/__tests__/cacheTokenStorage.spec.d.cts +0 -1
  88. package/dist/__tests__/cacheTokenStorage.spec.d.mts +0 -1
  89. package/dist/__tests__/cacheTokenStorage.spec.mjs +0 -145
  90. package/dist/__tests__/client.spec.cjs +0 -17281
  91. package/dist/__tests__/client.spec.d.cts +0 -1
  92. package/dist/__tests__/client.spec.d.mts +0 -1
  93. package/dist/__tests__/client.spec.mjs +0 -17308
  94. package/dist/__tests__/tokenManager.spec.cjs +0 -197
  95. package/dist/__tests__/tokenManager.spec.d.cts +0 -1
  96. package/dist/__tests__/tokenManager.spec.d.mts +0 -1
  97. package/dist/__tests__/tokenManager.spec.mjs +0 -196
  98. package/dist/playground.cjs +0 -0
  99. package/dist/playground.d.cts +0 -1
  100. package/dist/playground.d.mts +0 -1
  101. package/dist/playground.mjs +0 -0
  102. package/src/playground.ts +0 -0
@@ -67,4 +67,5 @@ declare class CacheTokenStorage implements TokenStorage {
67
67
  clearTokens(): Promise<void>;
68
68
  }
69
69
  //#endregion
70
- export { CacheTokenStorage, LocalStorageTokenStorage, MemoryTokenStorage, TokenClient, TokenClientOptions, TokenStorage };
70
+ export { CacheTokenStorage, LocalStorageTokenStorage, MemoryTokenStorage, TokenClient, TokenClientOptions, TokenStorage };
71
+ //# sourceMappingURL=cacheTokenStorage-BzBRJfd-.d.mts.map
@@ -28,4 +28,5 @@ var CacheTokenStorage = class {
28
28
  };
29
29
 
30
30
  //#endregion
31
- export { CacheTokenStorage };
31
+ export { CacheTokenStorage };
32
+ //# sourceMappingURL=cacheTokenStorage-Ca05vf3T.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cacheTokenStorage-Ca05vf3T.mjs","names":["cache: Cache<string>","accessTokenKey: string","refreshTokenKey: string","token: string","ttl?: number"],"sources":["../src/cacheTokenStorage.ts"],"sourcesContent":["import type { Cache } from '@geekmidas/cache';\nimport type { TokenStorage } from './client.js';\n\nexport class CacheTokenStorage implements TokenStorage {\n private cache: Cache<string>;\n private accessTokenKey: string;\n private refreshTokenKey: string;\n\n constructor(\n cache: Cache<string>,\n accessTokenKey: string = 'access_token',\n refreshTokenKey: string = 'refresh_token',\n ) {\n this.cache = cache;\n this.accessTokenKey = accessTokenKey;\n this.refreshTokenKey = refreshTokenKey;\n }\n\n async getAccessToken(): Promise<string | null> {\n const token = await this.cache.get(this.accessTokenKey);\n return token || null;\n }\n\n async setAccessToken(token: string, ttl?: number): Promise<void> {\n await this.cache.set(this.accessTokenKey, token, ttl);\n }\n\n async getRefreshToken(): Promise<string | null> {\n const token = await this.cache.get(this.refreshTokenKey);\n return token || null;\n }\n\n async setRefreshToken(token: string, ttl?: number): Promise<void> {\n await this.cache.set(this.refreshTokenKey, token, ttl);\n }\n\n async clearTokens(): Promise<void> {\n await Promise.all([\n this.cache.delete(this.accessTokenKey),\n this.cache.delete(this.refreshTokenKey),\n ]);\n }\n}\n"],"mappings":";AAGA,IAAa,oBAAb,MAAuD;CACrD,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACEA,OACAC,iBAAyB,gBACzBC,kBAA0B,iBAC1B;AACA,OAAK,QAAQ;AACb,OAAK,iBAAiB;AACtB,OAAK,kBAAkB;CACxB;CAED,MAAM,iBAAyC;EAC7C,MAAM,QAAQ,MAAM,KAAK,MAAM,IAAI,KAAK,eAAe;AACvD,SAAO,SAAS;CACjB;CAED,MAAM,eAAeC,OAAeC,KAA6B;AAC/D,QAAM,KAAK,MAAM,IAAI,KAAK,gBAAgB,OAAO,IAAI;CACtD;CAED,MAAM,kBAA0C;EAC9C,MAAM,QAAQ,MAAM,KAAK,MAAM,IAAI,KAAK,gBAAgB;AACxD,SAAO,SAAS;CACjB;CAED,MAAM,gBAAgBD,OAAeC,KAA6B;AAChE,QAAM,KAAK,MAAM,IAAI,KAAK,iBAAiB,OAAO,IAAI;CACvD;CAED,MAAM,cAA6B;AACjC,QAAM,QAAQ,IAAI,CAChB,KAAK,MAAM,OAAO,KAAK,eAAe,EACtC,KAAK,MAAM,OAAO,KAAK,gBAAgB,AACxC,EAAC;CACH;AACF"}
@@ -34,4 +34,5 @@ Object.defineProperty(exports, 'CacheTokenStorage', {
34
34
  get: function () {
35
35
  return CacheTokenStorage;
36
36
  }
37
- });
37
+ });
38
+ //# sourceMappingURL=cacheTokenStorage-CvptztkW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cacheTokenStorage-CvptztkW.cjs","names":["cache: Cache<string>","accessTokenKey: string","refreshTokenKey: string","token: string","ttl?: number"],"sources":["../src/cacheTokenStorage.ts"],"sourcesContent":["import type { Cache } from '@geekmidas/cache';\nimport type { TokenStorage } from './client.js';\n\nexport class CacheTokenStorage implements TokenStorage {\n private cache: Cache<string>;\n private accessTokenKey: string;\n private refreshTokenKey: string;\n\n constructor(\n cache: Cache<string>,\n accessTokenKey: string = 'access_token',\n refreshTokenKey: string = 'refresh_token',\n ) {\n this.cache = cache;\n this.accessTokenKey = accessTokenKey;\n this.refreshTokenKey = refreshTokenKey;\n }\n\n async getAccessToken(): Promise<string | null> {\n const token = await this.cache.get(this.accessTokenKey);\n return token || null;\n }\n\n async setAccessToken(token: string, ttl?: number): Promise<void> {\n await this.cache.set(this.accessTokenKey, token, ttl);\n }\n\n async getRefreshToken(): Promise<string | null> {\n const token = await this.cache.get(this.refreshTokenKey);\n return token || null;\n }\n\n async setRefreshToken(token: string, ttl?: number): Promise<void> {\n await this.cache.set(this.refreshTokenKey, token, ttl);\n }\n\n async clearTokens(): Promise<void> {\n await Promise.all([\n this.cache.delete(this.accessTokenKey),\n this.cache.delete(this.refreshTokenKey),\n ]);\n }\n}\n"],"mappings":";;AAGA,IAAa,oBAAb,MAAuD;CACrD,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACEA,OACAC,iBAAyB,gBACzBC,kBAA0B,iBAC1B;AACA,OAAK,QAAQ;AACb,OAAK,iBAAiB;AACtB,OAAK,kBAAkB;CACxB;CAED,MAAM,iBAAyC;EAC7C,MAAM,QAAQ,MAAM,KAAK,MAAM,IAAI,KAAK,eAAe;AACvD,SAAO,SAAS;CACjB;CAED,MAAM,eAAeC,OAAeC,KAA6B;AAC/D,QAAM,KAAK,MAAM,IAAI,KAAK,gBAAgB,OAAO,IAAI;CACtD;CAED,MAAM,kBAA0C;EAC9C,MAAM,QAAQ,MAAM,KAAK,MAAM,IAAI,KAAK,gBAAgB;AACxD,SAAO,SAAS;CACjB;CAED,MAAM,gBAAgBD,OAAeC,KAA6B;AAChE,QAAM,KAAK,MAAM,IAAI,KAAK,iBAAiB,OAAO,IAAI;CACvD;CAED,MAAM,cAA6B;AACjC,QAAM,QAAQ,IAAI,CAChB,KAAK,MAAM,OAAO,KAAK,eAAe,EACtC,KAAK,MAAM,OAAO,KAAK,gBAAgB,AACxC,EAAC;CACH;AACF"}
@@ -67,4 +67,5 @@ declare class CacheTokenStorage implements TokenStorage {
67
67
  clearTokens(): Promise<void>;
68
68
  }
69
69
  //#endregion
70
- export { CacheTokenStorage, LocalStorageTokenStorage, MemoryTokenStorage, TokenClient, TokenClientOptions, TokenStorage };
70
+ export { CacheTokenStorage, LocalStorageTokenStorage, MemoryTokenStorage, TokenClient, TokenClientOptions, TokenStorage };
71
+ //# sourceMappingURL=cacheTokenStorage-yNUpDD8W.d.cts.map
@@ -1,2 +1,2 @@
1
- import { CacheTokenStorage } from "./cacheTokenStorage-BlpcZwef.mjs";
1
+ import { CacheTokenStorage } from "./cacheTokenStorage-BzBRJfd-.mjs";
2
2
  export { CacheTokenStorage };
@@ -5,9 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __commonJS = (cb, mod) => function() {
9
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
- };
11
8
  var __copyProps = (to, from, except, desc) => {
12
9
  if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
13
10
  key = keys[i];
@@ -25,12 +22,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
22
 
26
23
  //#endregion
27
24
 
28
- Object.defineProperty(exports, '__commonJS', {
29
- enumerable: true,
30
- get: function () {
31
- return __commonJS;
32
- }
33
- });
34
25
  Object.defineProperty(exports, '__toESM', {
35
26
  enumerable: true,
36
27
  get: function () {
@@ -152,4 +152,5 @@ Object.defineProperty(exports, 'TokenClient', {
152
152
  get: function () {
153
153
  return TokenClient;
154
154
  }
155
- });
155
+ });
156
+ //# sourceMappingURL=client-DaiUm0UZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-DaiUm0UZ.cjs","names":["accessTokenKey: string","refreshTokenKey: string","token: string","ttl?: number","options: TokenClientOptions","accessToken: string","refreshToken?: string","accessTtl?: number","refreshTtl?: number"],"sources":["../src/client.ts"],"sourcesContent":["export interface TokenStorage {\n getAccessToken(): Promise<string | null> | string | null;\n setAccessToken(token: string, ttl?: number): Promise<void> | void;\n getRefreshToken(): Promise<string | null> | string | null;\n setRefreshToken(token: string, ttl?: number): Promise<void> | void;\n clearTokens(): Promise<void> | void;\n}\n\nexport class LocalStorageTokenStorage implements TokenStorage {\n private accessTokenKey: string;\n private refreshTokenKey: string;\n\n constructor(\n accessTokenKey: string = 'access_token',\n refreshTokenKey: string = 'refresh_token',\n ) {\n this.accessTokenKey = accessTokenKey;\n this.refreshTokenKey = refreshTokenKey;\n }\n\n getAccessToken(): string | null {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(this.accessTokenKey);\n }\n\n setAccessToken(token: string, ttl?: number): void {\n if (typeof window === 'undefined') return;\n localStorage.setItem(this.accessTokenKey, token);\n }\n\n getRefreshToken(): string | null {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(this.refreshTokenKey);\n }\n\n setRefreshToken(token: string, ttl?: number): void {\n if (typeof window === 'undefined') return;\n localStorage.setItem(this.refreshTokenKey, token);\n }\n\n clearTokens(): void {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(this.accessTokenKey);\n localStorage.removeItem(this.refreshTokenKey);\n }\n}\n\nexport class MemoryTokenStorage implements TokenStorage {\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n\n getAccessToken(): string | null {\n return this.accessToken;\n }\n\n setAccessToken(token: string, ttl?: number): void {\n this.accessToken = token;\n }\n\n getRefreshToken(): string | null {\n return this.refreshToken;\n }\n\n setRefreshToken(token: string, ttl?: number): void {\n this.refreshToken = token;\n }\n\n clearTokens(): void {\n this.accessToken = null;\n this.refreshToken = null;\n }\n}\n\nexport interface TokenClientOptions {\n storage?: TokenStorage;\n refreshEndpoint?: string;\n onTokenRefresh?: (tokens: {\n accessToken: string;\n refreshToken?: string;\n }) => void;\n onTokenExpired?: () => void;\n}\n\nexport class TokenClient {\n private storage: TokenStorage;\n private refreshEndpoint?: string;\n private onTokenRefresh?: (tokens: {\n accessToken: string;\n refreshToken?: string;\n }) => void;\n private onTokenExpired?: () => void;\n\n constructor(options: TokenClientOptions = {}) {\n this.storage = options.storage || new LocalStorageTokenStorage();\n this.refreshEndpoint = options.refreshEndpoint;\n this.onTokenRefresh = options.onTokenRefresh;\n this.onTokenExpired = options.onTokenExpired;\n }\n\n async getAccessToken(): Promise<string | null> {\n return await this.storage.getAccessToken();\n }\n\n async getRefreshToken(): Promise<string | null> {\n return await this.storage.getRefreshToken();\n }\n\n async setTokens(\n accessToken: string,\n refreshToken?: string,\n accessTtl?: number,\n refreshTtl?: number,\n ): Promise<void> {\n await this.storage.setAccessToken(accessToken, accessTtl);\n if (refreshToken) {\n await this.storage.setRefreshToken(refreshToken, refreshTtl);\n }\n }\n\n async clearTokens(): Promise<void> {\n await this.storage.clearTokens();\n }\n\n isTokenExpired(token: string): boolean {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n const now = Math.floor(Date.now() / 1000);\n return payload.exp < now;\n } catch {\n return true;\n }\n }\n\n getTokenExpiration(token: string): Date | null {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n return new Date(payload.exp * 1000);\n } catch {\n return null;\n }\n }\n\n async refreshTokens(): Promise<boolean> {\n const refreshToken = await this.getRefreshToken();\n\n if (!refreshToken || !this.refreshEndpoint) {\n return false;\n }\n\n try {\n const response = await fetch(this.refreshEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ refreshToken }),\n });\n\n if (!response.ok) {\n throw new Error('Failed to refresh token');\n }\n\n const data = await response.json();\n const { accessToken, refreshToken: newRefreshToken } = data;\n\n await this.setTokens(accessToken, newRefreshToken);\n\n if (this.onTokenRefresh) {\n this.onTokenRefresh({ accessToken, refreshToken: newRefreshToken });\n }\n\n return true;\n } catch (error) {\n await this.clearTokens();\n if (this.onTokenExpired) {\n this.onTokenExpired();\n }\n return false;\n }\n }\n\n async getValidAccessToken(): Promise<string | null> {\n const accessToken = await this.getAccessToken();\n\n if (!accessToken) {\n return null;\n }\n\n if (this.isTokenExpired(accessToken)) {\n const refreshed = await this.refreshTokens();\n if (!refreshed) {\n return null;\n }\n return await this.getAccessToken();\n }\n\n return accessToken;\n }\n\n async createAuthHeaders(): Promise<Record<string, string>> {\n const token = await this.getAccessToken();\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n\n async createValidAuthHeaders(): Promise<Record<string, string>> {\n const token = await this.getValidAccessToken();\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n}\n\nexport { CacheTokenStorage } from './cacheTokenStorage.js';\n"],"mappings":";;AAQA,IAAa,2BAAb,MAA8D;CAC5D,AAAQ;CACR,AAAQ;CAER,YACEA,iBAAyB,gBACzBC,kBAA0B,iBAC1B;AACA,OAAK,iBAAiB;AACtB,OAAK,kBAAkB;CACxB;CAED,iBAAgC;AAC9B,aAAW,WAAW,YAAa,QAAO;AAC1C,SAAO,aAAa,QAAQ,KAAK,eAAe;CACjD;CAED,eAAeC,OAAeC,KAAoB;AAChD,aAAW,WAAW,YAAa;AACnC,eAAa,QAAQ,KAAK,gBAAgB,MAAM;CACjD;CAED,kBAAiC;AAC/B,aAAW,WAAW,YAAa,QAAO;AAC1C,SAAO,aAAa,QAAQ,KAAK,gBAAgB;CAClD;CAED,gBAAgBD,OAAeC,KAAoB;AACjD,aAAW,WAAW,YAAa;AACnC,eAAa,QAAQ,KAAK,iBAAiB,MAAM;CAClD;CAED,cAAoB;AAClB,aAAW,WAAW,YAAa;AACnC,eAAa,WAAW,KAAK,eAAe;AAC5C,eAAa,WAAW,KAAK,gBAAgB;CAC9C;AACF;AAED,IAAa,qBAAb,MAAwD;CACtD,AAAQ,cAA6B;CACrC,AAAQ,eAA8B;CAEtC,iBAAgC;AAC9B,SAAO,KAAK;CACb;CAED,eAAeD,OAAeC,KAAoB;AAChD,OAAK,cAAc;CACpB;CAED,kBAAiC;AAC/B,SAAO,KAAK;CACb;CAED,gBAAgBD,OAAeC,KAAoB;AACjD,OAAK,eAAe;CACrB;CAED,cAAoB;AAClB,OAAK,cAAc;AACnB,OAAK,eAAe;CACrB;AACF;AAYD,IAAa,cAAb,MAAyB;CACvB,AAAQ;CACR,AAAQ;CACR,AAAQ;CAIR,AAAQ;CAER,YAAYC,UAA8B,CAAE,GAAE;AAC5C,OAAK,UAAU,QAAQ,WAAW,IAAI;AACtC,OAAK,kBAAkB,QAAQ;AAC/B,OAAK,iBAAiB,QAAQ;AAC9B,OAAK,iBAAiB,QAAQ;CAC/B;CAED,MAAM,iBAAyC;AAC7C,SAAO,MAAM,KAAK,QAAQ,gBAAgB;CAC3C;CAED,MAAM,kBAA0C;AAC9C,SAAO,MAAM,KAAK,QAAQ,iBAAiB;CAC5C;CAED,MAAM,UACJC,aACAC,cACAC,WACAC,YACe;AACf,QAAM,KAAK,QAAQ,eAAe,aAAa,UAAU;AACzD,MAAI,aACF,OAAM,KAAK,QAAQ,gBAAgB,cAAc,WAAW;CAE/D;CAED,MAAM,cAA6B;AACjC,QAAM,KAAK,QAAQ,aAAa;CACjC;CAED,eAAeN,OAAwB;AACrC,MAAI;GACF,MAAM,UAAU,KAAK,MAAM,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,CAAC;GACrD,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;AACzC,UAAO,QAAQ,MAAM;EACtB,QAAO;AACN,UAAO;EACR;CACF;CAED,mBAAmBA,OAA4B;AAC7C,MAAI;GACF,MAAM,UAAU,KAAK,MAAM,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,CAAC;AACrD,UAAO,IAAI,KAAK,QAAQ,MAAM;EAC/B,QAAO;AACN,UAAO;EACR;CACF;CAED,MAAM,gBAAkC;EACtC,MAAM,eAAe,MAAM,KAAK,iBAAiB;AAEjD,OAAK,iBAAiB,KAAK,gBACzB,QAAO;AAGT,MAAI;GACF,MAAM,WAAW,MAAM,MAAM,KAAK,iBAAiB;IACjD,QAAQ;IACR,SAAS,EACP,gBAAgB,mBACjB;IACD,MAAM,KAAK,UAAU,EAAE,aAAc,EAAC;GACvC,EAAC;AAEF,QAAK,SAAS,GACZ,OAAM,IAAI,MAAM;GAGlB,MAAM,OAAO,MAAM,SAAS,MAAM;GAClC,MAAM,EAAE,aAAa,cAAc,iBAAiB,GAAG;AAEvD,SAAM,KAAK,UAAU,aAAa,gBAAgB;AAElD,OAAI,KAAK,eACP,MAAK,eAAe;IAAE;IAAa,cAAc;GAAiB,EAAC;AAGrE,UAAO;EACR,SAAQ,OAAO;AACd,SAAM,KAAK,aAAa;AACxB,OAAI,KAAK,eACP,MAAK,gBAAgB;AAEvB,UAAO;EACR;CACF;CAED,MAAM,sBAA8C;EAClD,MAAM,cAAc,MAAM,KAAK,gBAAgB;AAE/C,OAAK,YACH,QAAO;AAGT,MAAI,KAAK,eAAe,YAAY,EAAE;GACpC,MAAM,YAAY,MAAM,KAAK,eAAe;AAC5C,QAAK,UACH,QAAO;AAET,UAAO,MAAM,KAAK,gBAAgB;EACnC;AAED,SAAO;CACR;CAED,MAAM,oBAAqD;EACzD,MAAM,QAAQ,MAAM,KAAK,gBAAgB;AACzC,SAAO,QAAQ,EAAE,gBAAgB,SAAS,MAAM,EAAG,IAAG,CAAE;CACzD;CAED,MAAM,yBAA0D;EAC9D,MAAM,QAAQ,MAAM,KAAK,qBAAqB;AAC9C,SAAO,QAAQ,EAAE,gBAAgB,SAAS,MAAM,EAAG,IAAG,CAAE;CACzD;AACF"}
@@ -134,4 +134,5 @@ var TokenClient = class {
134
134
  };
135
135
 
136
136
  //#endregion
137
- export { LocalStorageTokenStorage, MemoryTokenStorage, TokenClient };
137
+ export { LocalStorageTokenStorage, MemoryTokenStorage, TokenClient };
138
+ //# sourceMappingURL=client-DjNZS6vZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-DjNZS6vZ.mjs","names":["accessTokenKey: string","refreshTokenKey: string","token: string","ttl?: number","options: TokenClientOptions","accessToken: string","refreshToken?: string","accessTtl?: number","refreshTtl?: number"],"sources":["../src/client.ts"],"sourcesContent":["export interface TokenStorage {\n getAccessToken(): Promise<string | null> | string | null;\n setAccessToken(token: string, ttl?: number): Promise<void> | void;\n getRefreshToken(): Promise<string | null> | string | null;\n setRefreshToken(token: string, ttl?: number): Promise<void> | void;\n clearTokens(): Promise<void> | void;\n}\n\nexport class LocalStorageTokenStorage implements TokenStorage {\n private accessTokenKey: string;\n private refreshTokenKey: string;\n\n constructor(\n accessTokenKey: string = 'access_token',\n refreshTokenKey: string = 'refresh_token',\n ) {\n this.accessTokenKey = accessTokenKey;\n this.refreshTokenKey = refreshTokenKey;\n }\n\n getAccessToken(): string | null {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(this.accessTokenKey);\n }\n\n setAccessToken(token: string, ttl?: number): void {\n if (typeof window === 'undefined') return;\n localStorage.setItem(this.accessTokenKey, token);\n }\n\n getRefreshToken(): string | null {\n if (typeof window === 'undefined') return null;\n return localStorage.getItem(this.refreshTokenKey);\n }\n\n setRefreshToken(token: string, ttl?: number): void {\n if (typeof window === 'undefined') return;\n localStorage.setItem(this.refreshTokenKey, token);\n }\n\n clearTokens(): void {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(this.accessTokenKey);\n localStorage.removeItem(this.refreshTokenKey);\n }\n}\n\nexport class MemoryTokenStorage implements TokenStorage {\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n\n getAccessToken(): string | null {\n return this.accessToken;\n }\n\n setAccessToken(token: string, ttl?: number): void {\n this.accessToken = token;\n }\n\n getRefreshToken(): string | null {\n return this.refreshToken;\n }\n\n setRefreshToken(token: string, ttl?: number): void {\n this.refreshToken = token;\n }\n\n clearTokens(): void {\n this.accessToken = null;\n this.refreshToken = null;\n }\n}\n\nexport interface TokenClientOptions {\n storage?: TokenStorage;\n refreshEndpoint?: string;\n onTokenRefresh?: (tokens: {\n accessToken: string;\n refreshToken?: string;\n }) => void;\n onTokenExpired?: () => void;\n}\n\nexport class TokenClient {\n private storage: TokenStorage;\n private refreshEndpoint?: string;\n private onTokenRefresh?: (tokens: {\n accessToken: string;\n refreshToken?: string;\n }) => void;\n private onTokenExpired?: () => void;\n\n constructor(options: TokenClientOptions = {}) {\n this.storage = options.storage || new LocalStorageTokenStorage();\n this.refreshEndpoint = options.refreshEndpoint;\n this.onTokenRefresh = options.onTokenRefresh;\n this.onTokenExpired = options.onTokenExpired;\n }\n\n async getAccessToken(): Promise<string | null> {\n return await this.storage.getAccessToken();\n }\n\n async getRefreshToken(): Promise<string | null> {\n return await this.storage.getRefreshToken();\n }\n\n async setTokens(\n accessToken: string,\n refreshToken?: string,\n accessTtl?: number,\n refreshTtl?: number,\n ): Promise<void> {\n await this.storage.setAccessToken(accessToken, accessTtl);\n if (refreshToken) {\n await this.storage.setRefreshToken(refreshToken, refreshTtl);\n }\n }\n\n async clearTokens(): Promise<void> {\n await this.storage.clearTokens();\n }\n\n isTokenExpired(token: string): boolean {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n const now = Math.floor(Date.now() / 1000);\n return payload.exp < now;\n } catch {\n return true;\n }\n }\n\n getTokenExpiration(token: string): Date | null {\n try {\n const payload = JSON.parse(atob(token.split('.')[1]));\n return new Date(payload.exp * 1000);\n } catch {\n return null;\n }\n }\n\n async refreshTokens(): Promise<boolean> {\n const refreshToken = await this.getRefreshToken();\n\n if (!refreshToken || !this.refreshEndpoint) {\n return false;\n }\n\n try {\n const response = await fetch(this.refreshEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ refreshToken }),\n });\n\n if (!response.ok) {\n throw new Error('Failed to refresh token');\n }\n\n const data = await response.json();\n const { accessToken, refreshToken: newRefreshToken } = data;\n\n await this.setTokens(accessToken, newRefreshToken);\n\n if (this.onTokenRefresh) {\n this.onTokenRefresh({ accessToken, refreshToken: newRefreshToken });\n }\n\n return true;\n } catch (error) {\n await this.clearTokens();\n if (this.onTokenExpired) {\n this.onTokenExpired();\n }\n return false;\n }\n }\n\n async getValidAccessToken(): Promise<string | null> {\n const accessToken = await this.getAccessToken();\n\n if (!accessToken) {\n return null;\n }\n\n if (this.isTokenExpired(accessToken)) {\n const refreshed = await this.refreshTokens();\n if (!refreshed) {\n return null;\n }\n return await this.getAccessToken();\n }\n\n return accessToken;\n }\n\n async createAuthHeaders(): Promise<Record<string, string>> {\n const token = await this.getAccessToken();\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n\n async createValidAuthHeaders(): Promise<Record<string, string>> {\n const token = await this.getValidAccessToken();\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n}\n\nexport { CacheTokenStorage } from './cacheTokenStorage.js';\n"],"mappings":"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"}
package/dist/client.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { CacheTokenStorage, LocalStorageTokenStorage, MemoryTokenStorage, TokenClient, TokenClientOptions, TokenStorage } from "./cacheTokenStorage-BlpcZwef.mjs";
1
+ import { CacheTokenStorage, LocalStorageTokenStorage, MemoryTokenStorage, TokenClient, TokenClientOptions, TokenStorage } from "./cacheTokenStorage-BzBRJfd-.mjs";
2
2
  export { CacheTokenStorage, LocalStorageTokenStorage, MemoryTokenStorage, TokenClient, TokenClientOptions, TokenStorage };
@@ -0,0 +1,92 @@
1
+ const require_jwt = require('../jwt-Bo_eACEi.cjs');
2
+
3
+ //#region src/hono/jwt.ts
4
+ function extractToken(c, options = {}) {
5
+ const { headerName = "authorization", cookieName, tokenPrefix = "Bearer " } = options;
6
+ const headerValue = c.req.header(headerName);
7
+ if (headerValue) {
8
+ if (tokenPrefix && headerValue.startsWith(tokenPrefix)) return headerValue.slice(tokenPrefix.length);
9
+ return headerValue;
10
+ }
11
+ if (cookieName) {
12
+ const cookieHeader = c.req.header("cookie");
13
+ if (cookieHeader) {
14
+ const match = cookieHeader.match(new RegExp(`${cookieName}=([^;]+)`));
15
+ if (match) return match[1];
16
+ }
17
+ }
18
+ return null;
19
+ }
20
+ /**
21
+ * JWT Middleware for Hono
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const jwt = new JwtMiddleware({
26
+ * config: { secret: process.env.JWT_SECRET! },
27
+ * });
28
+ *
29
+ * app.use('/api/*', jwt.handler());
30
+ *
31
+ * // Or for optional auth
32
+ * app.use('/public/*', jwt.optional());
33
+ * ```
34
+ */
35
+ var JwtMiddleware = class {
36
+ verifier;
37
+ extraction;
38
+ contextKey;
39
+ onError;
40
+ transformClaims;
41
+ constructor(options) {
42
+ this.verifier = new require_jwt.JwtVerifier(options.config);
43
+ this.extraction = options.extraction ?? {};
44
+ this.contextKey = options.contextKey ?? "jwtClaims";
45
+ this.onError = options.onError;
46
+ this.transformClaims = options.transformClaims;
47
+ }
48
+ /**
49
+ * Returns middleware that requires valid JWT
50
+ */
51
+ handler() {
52
+ return async (c, next) => {
53
+ const token = extractToken(c, this.extraction);
54
+ if (!token) {
55
+ if (this.onError) return this.onError(c, new Error("No token provided"));
56
+ return c.json({ error: "Unauthorized" }, 401);
57
+ }
58
+ try {
59
+ const payload = await this.verifier.verify(token);
60
+ const claims = this.transformClaims ? this.transformClaims(payload) : payload;
61
+ c.set(this.contextKey, claims);
62
+ c.set("jwtToken", token);
63
+ await next();
64
+ } catch (error) {
65
+ if (this.onError) return this.onError(c, error);
66
+ return c.json({ error: "Invalid token" }, 401);
67
+ }
68
+ };
69
+ }
70
+ /**
71
+ * Returns middleware that allows unauthenticated requests
72
+ */
73
+ optional() {
74
+ return async (c, next) => {
75
+ const token = extractToken(c, this.extraction);
76
+ if (token) {
77
+ const claims = await this.verifier.verifyOrNull(token);
78
+ if (claims) {
79
+ const transformed = this.transformClaims ? this.transformClaims(claims) : claims;
80
+ c.set(this.contextKey, transformed);
81
+ c.set("jwtToken", token);
82
+ }
83
+ }
84
+ await next();
85
+ };
86
+ }
87
+ };
88
+
89
+ //#endregion
90
+ exports.JwtMiddleware = JwtMiddleware;
91
+ exports.JwtVerifier = require_jwt.JwtVerifier;
92
+ //# sourceMappingURL=jwt.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.cjs","names":["c: Context","options: TokenExtractionOptions","options: JwtMiddlewareOptions<TClaims>","JwtVerifier","next: Next"],"sources":["../../src/hono/jwt.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport {\n type JwtClaims,\n type JwtConfig,\n JwtVerifier,\n type TokenExtractionOptions,\n} from '../jwt';\n\nexport {\n JwtVerifier,\n type JwtClaims,\n type JwtConfig,\n type TokenExtractionOptions,\n};\n\nfunction extractToken(\n c: Context,\n options: TokenExtractionOptions = {},\n): string | null {\n const {\n headerName = 'authorization',\n cookieName,\n tokenPrefix = 'Bearer ',\n } = options;\n\n const headerValue = c.req.header(headerName);\n if (headerValue) {\n if (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n return headerValue.slice(tokenPrefix.length);\n }\n return headerValue;\n }\n\n if (cookieName) {\n const cookieHeader = c.req.header('cookie');\n if (cookieHeader) {\n const match = cookieHeader.match(new RegExp(`${cookieName}=([^;]+)`));\n if (match) {\n return match[1];\n }\n }\n }\n\n return null;\n}\n\nexport interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {\n config: JwtConfig;\n extraction?: TokenExtractionOptions;\n contextKey?: string;\n onError?: (c: Context, error: Error) => Response | Promise<Response>;\n transformClaims?: (claims: JwtClaims) => TClaims;\n}\n\n/**\n * JWT Middleware for Hono\n *\n * @example\n * ```typescript\n * const jwt = new JwtMiddleware({\n * config: { secret: process.env.JWT_SECRET! },\n * });\n *\n * app.use('/api/*', jwt.handler());\n *\n * // Or for optional auth\n * app.use('/public/*', jwt.optional());\n * ```\n */\nexport class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {\n private readonly verifier: JwtVerifier<TClaims>;\n private readonly extraction: TokenExtractionOptions;\n private readonly contextKey: string;\n private readonly onError?: (\n c: Context,\n error: Error,\n ) => Response | Promise<Response>;\n private readonly transformClaims?: (claims: JwtClaims) => TClaims;\n\n constructor(options: JwtMiddlewareOptions<TClaims>) {\n this.verifier = new JwtVerifier(options.config);\n this.extraction = options.extraction ?? {};\n this.contextKey = options.contextKey ?? 'jwtClaims';\n this.onError = options.onError;\n this.transformClaims = options.transformClaims;\n }\n\n /**\n * Returns middleware that requires valid JWT\n */\n handler(): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n const token = extractToken(c, this.extraction);\n\n if (!token) {\n if (this.onError) {\n return this.onError(c, new Error('No token provided'));\n }\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n try {\n const payload = await this.verifier.verify(token);\n const claims = this.transformClaims\n ? this.transformClaims(payload)\n : payload;\n\n c.set(this.contextKey, claims);\n c.set('jwtToken', token);\n\n await next();\n } catch (error) {\n if (this.onError) {\n return this.onError(c, error as Error);\n }\n return c.json({ error: 'Invalid token' }, 401);\n }\n };\n }\n\n /**\n * Returns middleware that allows unauthenticated requests\n */\n optional(): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n const token = extractToken(c, this.extraction);\n\n if (token) {\n const claims = await this.verifier.verifyOrNull(token);\n if (claims) {\n const transformed = this.transformClaims\n ? this.transformClaims(claims)\n : claims;\n c.set(this.contextKey, transformed);\n c.set('jwtToken', token);\n }\n }\n\n await next();\n };\n }\n}\n"],"mappings":";;;AAeA,SAAS,aACPA,GACAC,UAAkC,CAAE,GACrB;CACf,MAAM,EACJ,aAAa,iBACb,YACA,cAAc,WACf,GAAG;CAEJ,MAAM,cAAc,EAAE,IAAI,OAAO,WAAW;AAC5C,KAAI,aAAa;AACf,MAAI,eAAe,YAAY,WAAW,YAAY,CACpD,QAAO,YAAY,MAAM,YAAY,OAAO;AAE9C,SAAO;CACR;AAED,KAAI,YAAY;EACd,MAAM,eAAe,EAAE,IAAI,OAAO,SAAS;AAC3C,MAAI,cAAc;GAChB,MAAM,QAAQ,aAAa,MAAM,IAAI,QAAQ,EAAE,WAAW,WAAW;AACrE,OAAI,MACF,QAAO,MAAM;EAEhB;CACF;AAED,QAAO;AACR;;;;;;;;;;;;;;;;AAyBD,IAAa,gBAAb,MAAkE;CAChE,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAIjB,AAAiB;CAEjB,YAAYC,SAAwC;AAClD,OAAK,WAAW,IAAIC,wBAAY,QAAQ;AACxC,OAAK,aAAa,QAAQ,cAAc,CAAE;AAC1C,OAAK,aAAa,QAAQ,cAAc;AACxC,OAAK,UAAU,QAAQ;AACvB,OAAK,kBAAkB,QAAQ;CAChC;;;;CAKD,UAA6B;AAC3B,SAAO,OAAOH,GAAYI,SAAe;GACvC,MAAM,QAAQ,aAAa,GAAG,KAAK,WAAW;AAE9C,QAAK,OAAO;AACV,QAAI,KAAK,QACP,QAAO,KAAK,QAAQ,GAAG,IAAI,MAAM,qBAAqB;AAExD,WAAO,EAAE,KAAK,EAAE,OAAO,eAAgB,GAAE,IAAI;GAC9C;AAED,OAAI;IACF,MAAM,UAAU,MAAM,KAAK,SAAS,OAAO,MAAM;IACjD,MAAM,SAAS,KAAK,kBAChB,KAAK,gBAAgB,QAAQ,GAC7B;AAEJ,MAAE,IAAI,KAAK,YAAY,OAAO;AAC9B,MAAE,IAAI,YAAY,MAAM;AAExB,UAAM,MAAM;GACb,SAAQ,OAAO;AACd,QAAI,KAAK,QACP,QAAO,KAAK,QAAQ,GAAG,MAAe;AAExC,WAAO,EAAE,KAAK,EAAE,OAAO,gBAAiB,GAAE,IAAI;GAC/C;EACF;CACF;;;;CAKD,WAA8B;AAC5B,SAAO,OAAOJ,GAAYI,SAAe;GACvC,MAAM,QAAQ,aAAa,GAAG,KAAK,WAAW;AAE9C,OAAI,OAAO;IACT,MAAM,SAAS,MAAM,KAAK,SAAS,aAAa,MAAM;AACtD,QAAI,QAAQ;KACV,MAAM,cAAc,KAAK,kBACrB,KAAK,gBAAgB,OAAO,GAC5B;AACJ,OAAE,IAAI,KAAK,YAAY,YAAY;AACnC,OAAE,IAAI,YAAY,MAAM;IACzB;GACF;AAED,SAAM,MAAM;EACb;CACF;AACF"}
@@ -0,0 +1,45 @@
1
+ import { JwtClaims, JwtConfig, JwtVerifier, TokenExtractionOptions } from "../jwt-DF9kFbmh.cjs";
2
+ import { Context, MiddlewareHandler } from "hono";
3
+
4
+ //#region src/hono/jwt.d.ts
5
+ interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {
6
+ config: JwtConfig;
7
+ extraction?: TokenExtractionOptions;
8
+ contextKey?: string;
9
+ onError?: (c: Context, error: Error) => Response | Promise<Response>;
10
+ transformClaims?: (claims: JwtClaims) => TClaims;
11
+ }
12
+ /**
13
+ * JWT Middleware for Hono
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const jwt = new JwtMiddleware({
18
+ * config: { secret: process.env.JWT_SECRET! },
19
+ * });
20
+ *
21
+ * app.use('/api/*', jwt.handler());
22
+ *
23
+ * // Or for optional auth
24
+ * app.use('/public/*', jwt.optional());
25
+ * ```
26
+ */
27
+ declare class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {
28
+ private readonly verifier;
29
+ private readonly extraction;
30
+ private readonly contextKey;
31
+ private readonly onError?;
32
+ private readonly transformClaims?;
33
+ constructor(options: JwtMiddlewareOptions<TClaims>);
34
+ /**
35
+ * Returns middleware that requires valid JWT
36
+ */
37
+ handler(): MiddlewareHandler;
38
+ /**
39
+ * Returns middleware that allows unauthenticated requests
40
+ */
41
+ optional(): MiddlewareHandler;
42
+ }
43
+ //#endregion
44
+ export { JwtClaims, JwtConfig, JwtMiddleware, JwtMiddlewareOptions, JwtVerifier, TokenExtractionOptions };
45
+ //# sourceMappingURL=jwt.d.cts.map
@@ -0,0 +1,45 @@
1
+ import { JwtClaims, JwtConfig, JwtVerifier, TokenExtractionOptions } from "../jwt-DH8CJ2xC.mjs";
2
+ import { Context, MiddlewareHandler } from "hono";
3
+
4
+ //#region src/hono/jwt.d.ts
5
+ interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {
6
+ config: JwtConfig;
7
+ extraction?: TokenExtractionOptions;
8
+ contextKey?: string;
9
+ onError?: (c: Context, error: Error) => Response | Promise<Response>;
10
+ transformClaims?: (claims: JwtClaims) => TClaims;
11
+ }
12
+ /**
13
+ * JWT Middleware for Hono
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const jwt = new JwtMiddleware({
18
+ * config: { secret: process.env.JWT_SECRET! },
19
+ * });
20
+ *
21
+ * app.use('/api/*', jwt.handler());
22
+ *
23
+ * // Or for optional auth
24
+ * app.use('/public/*', jwt.optional());
25
+ * ```
26
+ */
27
+ declare class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {
28
+ private readonly verifier;
29
+ private readonly extraction;
30
+ private readonly contextKey;
31
+ private readonly onError?;
32
+ private readonly transformClaims?;
33
+ constructor(options: JwtMiddlewareOptions<TClaims>);
34
+ /**
35
+ * Returns middleware that requires valid JWT
36
+ */
37
+ handler(): MiddlewareHandler;
38
+ /**
39
+ * Returns middleware that allows unauthenticated requests
40
+ */
41
+ optional(): MiddlewareHandler;
42
+ }
43
+ //#endregion
44
+ export { JwtClaims, JwtConfig, JwtMiddleware, JwtMiddlewareOptions, JwtVerifier, TokenExtractionOptions };
45
+ //# sourceMappingURL=jwt.d.mts.map
@@ -0,0 +1,91 @@
1
+ import { JwtVerifier } from "../jwt-D88cPJyT.mjs";
2
+
3
+ //#region src/hono/jwt.ts
4
+ function extractToken(c, options = {}) {
5
+ const { headerName = "authorization", cookieName, tokenPrefix = "Bearer " } = options;
6
+ const headerValue = c.req.header(headerName);
7
+ if (headerValue) {
8
+ if (tokenPrefix && headerValue.startsWith(tokenPrefix)) return headerValue.slice(tokenPrefix.length);
9
+ return headerValue;
10
+ }
11
+ if (cookieName) {
12
+ const cookieHeader = c.req.header("cookie");
13
+ if (cookieHeader) {
14
+ const match = cookieHeader.match(new RegExp(`${cookieName}=([^;]+)`));
15
+ if (match) return match[1];
16
+ }
17
+ }
18
+ return null;
19
+ }
20
+ /**
21
+ * JWT Middleware for Hono
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const jwt = new JwtMiddleware({
26
+ * config: { secret: process.env.JWT_SECRET! },
27
+ * });
28
+ *
29
+ * app.use('/api/*', jwt.handler());
30
+ *
31
+ * // Or for optional auth
32
+ * app.use('/public/*', jwt.optional());
33
+ * ```
34
+ */
35
+ var JwtMiddleware = class {
36
+ verifier;
37
+ extraction;
38
+ contextKey;
39
+ onError;
40
+ transformClaims;
41
+ constructor(options) {
42
+ this.verifier = new JwtVerifier(options.config);
43
+ this.extraction = options.extraction ?? {};
44
+ this.contextKey = options.contextKey ?? "jwtClaims";
45
+ this.onError = options.onError;
46
+ this.transformClaims = options.transformClaims;
47
+ }
48
+ /**
49
+ * Returns middleware that requires valid JWT
50
+ */
51
+ handler() {
52
+ return async (c, next) => {
53
+ const token = extractToken(c, this.extraction);
54
+ if (!token) {
55
+ if (this.onError) return this.onError(c, new Error("No token provided"));
56
+ return c.json({ error: "Unauthorized" }, 401);
57
+ }
58
+ try {
59
+ const payload = await this.verifier.verify(token);
60
+ const claims = this.transformClaims ? this.transformClaims(payload) : payload;
61
+ c.set(this.contextKey, claims);
62
+ c.set("jwtToken", token);
63
+ await next();
64
+ } catch (error) {
65
+ if (this.onError) return this.onError(c, error);
66
+ return c.json({ error: "Invalid token" }, 401);
67
+ }
68
+ };
69
+ }
70
+ /**
71
+ * Returns middleware that allows unauthenticated requests
72
+ */
73
+ optional() {
74
+ return async (c, next) => {
75
+ const token = extractToken(c, this.extraction);
76
+ if (token) {
77
+ const claims = await this.verifier.verifyOrNull(token);
78
+ if (claims) {
79
+ const transformed = this.transformClaims ? this.transformClaims(claims) : claims;
80
+ c.set(this.contextKey, transformed);
81
+ c.set("jwtToken", token);
82
+ }
83
+ }
84
+ await next();
85
+ };
86
+ }
87
+ };
88
+
89
+ //#endregion
90
+ export { JwtMiddleware, JwtVerifier };
91
+ //# sourceMappingURL=jwt.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.mjs","names":["c: Context","options: TokenExtractionOptions","options: JwtMiddlewareOptions<TClaims>","next: Next"],"sources":["../../src/hono/jwt.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport {\n type JwtClaims,\n type JwtConfig,\n JwtVerifier,\n type TokenExtractionOptions,\n} from '../jwt';\n\nexport {\n JwtVerifier,\n type JwtClaims,\n type JwtConfig,\n type TokenExtractionOptions,\n};\n\nfunction extractToken(\n c: Context,\n options: TokenExtractionOptions = {},\n): string | null {\n const {\n headerName = 'authorization',\n cookieName,\n tokenPrefix = 'Bearer ',\n } = options;\n\n const headerValue = c.req.header(headerName);\n if (headerValue) {\n if (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n return headerValue.slice(tokenPrefix.length);\n }\n return headerValue;\n }\n\n if (cookieName) {\n const cookieHeader = c.req.header('cookie');\n if (cookieHeader) {\n const match = cookieHeader.match(new RegExp(`${cookieName}=([^;]+)`));\n if (match) {\n return match[1];\n }\n }\n }\n\n return null;\n}\n\nexport interface JwtMiddlewareOptions<TClaims extends JwtClaims = JwtClaims> {\n config: JwtConfig;\n extraction?: TokenExtractionOptions;\n contextKey?: string;\n onError?: (c: Context, error: Error) => Response | Promise<Response>;\n transformClaims?: (claims: JwtClaims) => TClaims;\n}\n\n/**\n * JWT Middleware for Hono\n *\n * @example\n * ```typescript\n * const jwt = new JwtMiddleware({\n * config: { secret: process.env.JWT_SECRET! },\n * });\n *\n * app.use('/api/*', jwt.handler());\n *\n * // Or for optional auth\n * app.use('/public/*', jwt.optional());\n * ```\n */\nexport class JwtMiddleware<TClaims extends JwtClaims = JwtClaims> {\n private readonly verifier: JwtVerifier<TClaims>;\n private readonly extraction: TokenExtractionOptions;\n private readonly contextKey: string;\n private readonly onError?: (\n c: Context,\n error: Error,\n ) => Response | Promise<Response>;\n private readonly transformClaims?: (claims: JwtClaims) => TClaims;\n\n constructor(options: JwtMiddlewareOptions<TClaims>) {\n this.verifier = new JwtVerifier(options.config);\n this.extraction = options.extraction ?? {};\n this.contextKey = options.contextKey ?? 'jwtClaims';\n this.onError = options.onError;\n this.transformClaims = options.transformClaims;\n }\n\n /**\n * Returns middleware that requires valid JWT\n */\n handler(): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n const token = extractToken(c, this.extraction);\n\n if (!token) {\n if (this.onError) {\n return this.onError(c, new Error('No token provided'));\n }\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n try {\n const payload = await this.verifier.verify(token);\n const claims = this.transformClaims\n ? this.transformClaims(payload)\n : payload;\n\n c.set(this.contextKey, claims);\n c.set('jwtToken', token);\n\n await next();\n } catch (error) {\n if (this.onError) {\n return this.onError(c, error as Error);\n }\n return c.json({ error: 'Invalid token' }, 401);\n }\n };\n }\n\n /**\n * Returns middleware that allows unauthenticated requests\n */\n optional(): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n const token = extractToken(c, this.extraction);\n\n if (token) {\n const claims = await this.verifier.verifyOrNull(token);\n if (claims) {\n const transformed = this.transformClaims\n ? this.transformClaims(claims)\n : claims;\n c.set(this.contextKey, transformed);\n c.set('jwtToken', token);\n }\n }\n\n await next();\n };\n }\n}\n"],"mappings":";;;AAeA,SAAS,aACPA,GACAC,UAAkC,CAAE,GACrB;CACf,MAAM,EACJ,aAAa,iBACb,YACA,cAAc,WACf,GAAG;CAEJ,MAAM,cAAc,EAAE,IAAI,OAAO,WAAW;AAC5C,KAAI,aAAa;AACf,MAAI,eAAe,YAAY,WAAW,YAAY,CACpD,QAAO,YAAY,MAAM,YAAY,OAAO;AAE9C,SAAO;CACR;AAED,KAAI,YAAY;EACd,MAAM,eAAe,EAAE,IAAI,OAAO,SAAS;AAC3C,MAAI,cAAc;GAChB,MAAM,QAAQ,aAAa,MAAM,IAAI,QAAQ,EAAE,WAAW,WAAW;AACrE,OAAI,MACF,QAAO,MAAM;EAEhB;CACF;AAED,QAAO;AACR;;;;;;;;;;;;;;;;AAyBD,IAAa,gBAAb,MAAkE;CAChE,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAIjB,AAAiB;CAEjB,YAAYC,SAAwC;AAClD,OAAK,WAAW,IAAI,YAAY,QAAQ;AACxC,OAAK,aAAa,QAAQ,cAAc,CAAE;AAC1C,OAAK,aAAa,QAAQ,cAAc;AACxC,OAAK,UAAU,QAAQ;AACvB,OAAK,kBAAkB,QAAQ;CAChC;;;;CAKD,UAA6B;AAC3B,SAAO,OAAOF,GAAYG,SAAe;GACvC,MAAM,QAAQ,aAAa,GAAG,KAAK,WAAW;AAE9C,QAAK,OAAO;AACV,QAAI,KAAK,QACP,QAAO,KAAK,QAAQ,GAAG,IAAI,MAAM,qBAAqB;AAExD,WAAO,EAAE,KAAK,EAAE,OAAO,eAAgB,GAAE,IAAI;GAC9C;AAED,OAAI;IACF,MAAM,UAAU,MAAM,KAAK,SAAS,OAAO,MAAM;IACjD,MAAM,SAAS,KAAK,kBAChB,KAAK,gBAAgB,QAAQ,GAC7B;AAEJ,MAAE,IAAI,KAAK,YAAY,OAAO;AAC9B,MAAE,IAAI,YAAY,MAAM;AAExB,UAAM,MAAM;GACb,SAAQ,OAAO;AACd,QAAI,KAAK,QACP,QAAO,KAAK,QAAQ,GAAG,MAAe;AAExC,WAAO,EAAE,KAAK,EAAE,OAAO,gBAAiB,GAAE,IAAI;GAC/C;EACF;CACF;;;;CAKD,WAA8B;AAC5B,SAAO,OAAOH,GAAYG,SAAe;GACvC,MAAM,QAAQ,aAAa,GAAG,KAAK,WAAW;AAE9C,OAAI,OAAO;IACT,MAAM,SAAS,MAAM,KAAK,SAAS,aAAa,MAAM;AACtD,QAAI,QAAQ;KACV,MAAM,cAAc,KAAK,kBACrB,KAAK,gBAAgB,OAAO,GAC5B;AACJ,OAAE,IAAI,KAAK,YAAY,YAAY;AACnC,OAAE,IAAI,YAAY,MAAM;IACzB;GACF;AAED,SAAM,MAAM;EACb;CACF;AACF"}
@@ -0,0 +1,104 @@
1
+ const require_oidc = require('../oidc-C0KyYaAK.cjs');
2
+
3
+ //#region src/hono/oidc.ts
4
+ function extractToken(c, options = {}) {
5
+ const { headerName = "authorization", cookieName, tokenPrefix = "Bearer " } = options;
6
+ const headerValue = c.req.header(headerName);
7
+ if (headerValue) {
8
+ if (tokenPrefix && headerValue.startsWith(tokenPrefix)) return headerValue.slice(tokenPrefix.length);
9
+ return headerValue;
10
+ }
11
+ if (cookieName) {
12
+ const cookieHeader = c.req.header("cookie");
13
+ if (cookieHeader) {
14
+ const match = cookieHeader.match(new RegExp(`${cookieName}=([^;]+)`));
15
+ if (match) return match[1];
16
+ }
17
+ }
18
+ return null;
19
+ }
20
+ /**
21
+ * OIDC Middleware for Hono
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const oidc = new OidcMiddleware({
26
+ * config: {
27
+ * issuer: 'https://auth.example.com',
28
+ * audience: 'my-client-id',
29
+ * },
30
+ * });
31
+ *
32
+ * app.use('/api/*', oidc.handler());
33
+ *
34
+ * // With user info
35
+ * const oidcWithUserInfo = new OidcMiddleware({
36
+ * config: { issuer: '...', audience: '...' },
37
+ * fetchUserInfo: true,
38
+ * });
39
+ * ```
40
+ */
41
+ var OidcMiddleware = class {
42
+ verifier;
43
+ extraction;
44
+ contextKey;
45
+ fetchUserInfo;
46
+ onError;
47
+ transformClaims;
48
+ constructor(options) {
49
+ this.verifier = new require_oidc.OidcVerifier(options.config);
50
+ this.extraction = options.extraction ?? {};
51
+ this.contextKey = options.contextKey ?? "oidcClaims";
52
+ this.fetchUserInfo = options.fetchUserInfo ?? false;
53
+ this.onError = options.onError;
54
+ this.transformClaims = options.transformClaims;
55
+ }
56
+ handler() {
57
+ return async (c, next) => {
58
+ const token = extractToken(c, this.extraction);
59
+ if (!token) {
60
+ if (this.onError) return this.onError(c, new Error("No token provided"));
61
+ return c.json({ error: "Unauthorized" }, 401);
62
+ }
63
+ try {
64
+ const payload = await this.verifier.verify(token);
65
+ let userInfo;
66
+ if (this.fetchUserInfo) {
67
+ userInfo = await this.verifier.fetchUserInfo(token) ?? void 0;
68
+ c.set("oidcUserInfo", userInfo);
69
+ }
70
+ const claims = this.transformClaims ? this.transformClaims(payload, userInfo) : payload;
71
+ c.set(this.contextKey, claims);
72
+ c.set("oidcToken", token);
73
+ await next();
74
+ } catch (error) {
75
+ if (this.onError) return this.onError(c, error);
76
+ return c.json({ error: "Invalid token" }, 401);
77
+ }
78
+ };
79
+ }
80
+ optional() {
81
+ return async (c, next) => {
82
+ const token = extractToken(c, this.extraction);
83
+ if (token) {
84
+ const payload = await this.verifier.verifyOrNull(token);
85
+ if (payload) {
86
+ let userInfo;
87
+ if (this.fetchUserInfo) {
88
+ userInfo = await this.verifier.fetchUserInfo(token) ?? void 0;
89
+ c.set("oidcUserInfo", userInfo);
90
+ }
91
+ const claims = this.transformClaims ? this.transformClaims(payload, userInfo) : payload;
92
+ c.set(this.contextKey, claims);
93
+ c.set("oidcToken", token);
94
+ }
95
+ }
96
+ await next();
97
+ };
98
+ }
99
+ };
100
+
101
+ //#endregion
102
+ exports.OidcMiddleware = OidcMiddleware;
103
+ exports.OidcVerifier = require_oidc.OidcVerifier;
104
+ //# sourceMappingURL=oidc.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc.cjs","names":["c: Context","options: TokenExtractionOptions","options: OidcMiddlewareOptions<TClaims, TUserInfo>","OidcVerifier","next: Next","userInfo: TUserInfo | undefined"],"sources":["../../src/hono/oidc.ts"],"sourcesContent":["import type { Context, MiddlewareHandler, Next } from 'hono';\nimport {\n type OidcClaims,\n type OidcConfig,\n type OidcUserInfo,\n OidcVerifier,\n type TokenExtractionOptions,\n} from '../oidc';\n\nexport {\n OidcVerifier,\n type OidcClaims,\n type OidcConfig,\n type OidcUserInfo,\n type TokenExtractionOptions,\n};\n\nfunction extractToken(\n c: Context,\n options: TokenExtractionOptions = {},\n): string | null {\n const {\n headerName = 'authorization',\n cookieName,\n tokenPrefix = 'Bearer ',\n } = options;\n\n const headerValue = c.req.header(headerName);\n if (headerValue) {\n if (tokenPrefix && headerValue.startsWith(tokenPrefix)) {\n return headerValue.slice(tokenPrefix.length);\n }\n return headerValue;\n }\n\n if (cookieName) {\n const cookieHeader = c.req.header('cookie');\n if (cookieHeader) {\n const match = cookieHeader.match(new RegExp(`${cookieName}=([^;]+)`));\n if (match) {\n return match[1];\n }\n }\n }\n\n return null;\n}\n\nexport interface OidcMiddlewareOptions<\n TClaims extends OidcClaims = OidcClaims,\n TUserInfo extends OidcUserInfo = OidcUserInfo,\n> {\n config: OidcConfig;\n extraction?: TokenExtractionOptions;\n contextKey?: string;\n fetchUserInfo?: boolean;\n onError?: (c: Context, error: Error) => Response | Promise<Response>;\n transformClaims?: (claims: OidcClaims, userInfo?: TUserInfo) => TClaims;\n}\n\n/**\n * OIDC Middleware for Hono\n *\n * @example\n * ```typescript\n * const oidc = new OidcMiddleware({\n * config: {\n * issuer: 'https://auth.example.com',\n * audience: 'my-client-id',\n * },\n * });\n *\n * app.use('/api/*', oidc.handler());\n *\n * // With user info\n * const oidcWithUserInfo = new OidcMiddleware({\n * config: { issuer: '...', audience: '...' },\n * fetchUserInfo: true,\n * });\n * ```\n */\nexport class OidcMiddleware<\n TClaims extends OidcClaims = OidcClaims,\n TUserInfo extends OidcUserInfo = OidcUserInfo,\n> {\n private readonly verifier: OidcVerifier<TClaims, TUserInfo>;\n private readonly extraction: TokenExtractionOptions;\n private readonly contextKey: string;\n private readonly fetchUserInfo: boolean;\n private readonly onError?: (\n c: Context,\n error: Error,\n ) => Response | Promise<Response>;\n private readonly transformClaims?: (\n claims: OidcClaims,\n userInfo?: TUserInfo,\n ) => TClaims;\n\n constructor(options: OidcMiddlewareOptions<TClaims, TUserInfo>) {\n this.verifier = new OidcVerifier(options.config);\n this.extraction = options.extraction ?? {};\n this.contextKey = options.contextKey ?? 'oidcClaims';\n this.fetchUserInfo = options.fetchUserInfo ?? false;\n this.onError = options.onError;\n this.transformClaims = options.transformClaims;\n }\n\n handler(): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n const token = extractToken(c, this.extraction);\n\n if (!token) {\n if (this.onError) {\n return this.onError(c, new Error('No token provided'));\n }\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n try {\n const payload = await this.verifier.verify(token);\n\n let userInfo: TUserInfo | undefined;\n if (this.fetchUserInfo) {\n userInfo = (await this.verifier.fetchUserInfo(token)) ?? undefined;\n c.set('oidcUserInfo', userInfo);\n }\n\n const claims = this.transformClaims\n ? this.transformClaims(payload, userInfo)\n : payload;\n\n c.set(this.contextKey, claims);\n c.set('oidcToken', token);\n\n await next();\n } catch (error) {\n if (this.onError) {\n return this.onError(c, error as Error);\n }\n return c.json({ error: 'Invalid token' }, 401);\n }\n };\n }\n\n optional(): MiddlewareHandler {\n return async (c: Context, next: Next) => {\n const token = extractToken(c, this.extraction);\n\n if (token) {\n const payload = await this.verifier.verifyOrNull(token);\n if (payload) {\n let userInfo: TUserInfo | undefined;\n if (this.fetchUserInfo) {\n userInfo = (await this.verifier.fetchUserInfo(token)) ?? undefined;\n c.set('oidcUserInfo', userInfo);\n }\n\n const claims = this.transformClaims\n ? this.transformClaims(payload, userInfo)\n : payload;\n\n c.set(this.contextKey, claims);\n c.set('oidcToken', token);\n }\n }\n\n await next();\n };\n }\n}\n"],"mappings":";;;AAiBA,SAAS,aACPA,GACAC,UAAkC,CAAE,GACrB;CACf,MAAM,EACJ,aAAa,iBACb,YACA,cAAc,WACf,GAAG;CAEJ,MAAM,cAAc,EAAE,IAAI,OAAO,WAAW;AAC5C,KAAI,aAAa;AACf,MAAI,eAAe,YAAY,WAAW,YAAY,CACpD,QAAO,YAAY,MAAM,YAAY,OAAO;AAE9C,SAAO;CACR;AAED,KAAI,YAAY;EACd,MAAM,eAAe,EAAE,IAAI,OAAO,SAAS;AAC3C,MAAI,cAAc;GAChB,MAAM,QAAQ,aAAa,MAAM,IAAI,QAAQ,EAAE,WAAW,WAAW;AACrE,OAAI,MACF,QAAO,MAAM;EAEhB;CACF;AAED,QAAO;AACR;;;;;;;;;;;;;;;;;;;;;;AAmCD,IAAa,iBAAb,MAGE;CACA,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAIjB,AAAiB;CAKjB,YAAYC,SAAoD;AAC9D,OAAK,WAAW,IAAIC,0BAAa,QAAQ;AACzC,OAAK,aAAa,QAAQ,cAAc,CAAE;AAC1C,OAAK,aAAa,QAAQ,cAAc;AACxC,OAAK,gBAAgB,QAAQ,iBAAiB;AAC9C,OAAK,UAAU,QAAQ;AACvB,OAAK,kBAAkB,QAAQ;CAChC;CAED,UAA6B;AAC3B,SAAO,OAAOH,GAAYI,SAAe;GACvC,MAAM,QAAQ,aAAa,GAAG,KAAK,WAAW;AAE9C,QAAK,OAAO;AACV,QAAI,KAAK,QACP,QAAO,KAAK,QAAQ,GAAG,IAAI,MAAM,qBAAqB;AAExD,WAAO,EAAE,KAAK,EAAE,OAAO,eAAgB,GAAE,IAAI;GAC9C;AAED,OAAI;IACF,MAAM,UAAU,MAAM,KAAK,SAAS,OAAO,MAAM;IAEjD,IAAIC;AACJ,QAAI,KAAK,eAAe;AACtB,gBAAY,MAAM,KAAK,SAAS,cAAc,MAAM;AACpD,OAAE,IAAI,gBAAgB,SAAS;IAChC;IAED,MAAM,SAAS,KAAK,kBAChB,KAAK,gBAAgB,SAAS,SAAS,GACvC;AAEJ,MAAE,IAAI,KAAK,YAAY,OAAO;AAC9B,MAAE,IAAI,aAAa,MAAM;AAEzB,UAAM,MAAM;GACb,SAAQ,OAAO;AACd,QAAI,KAAK,QACP,QAAO,KAAK,QAAQ,GAAG,MAAe;AAExC,WAAO,EAAE,KAAK,EAAE,OAAO,gBAAiB,GAAE,IAAI;GAC/C;EACF;CACF;CAED,WAA8B;AAC5B,SAAO,OAAOL,GAAYI,SAAe;GACvC,MAAM,QAAQ,aAAa,GAAG,KAAK,WAAW;AAE9C,OAAI,OAAO;IACT,MAAM,UAAU,MAAM,KAAK,SAAS,aAAa,MAAM;AACvD,QAAI,SAAS;KACX,IAAIC;AACJ,SAAI,KAAK,eAAe;AACtB,iBAAY,MAAM,KAAK,SAAS,cAAc,MAAM;AACpD,QAAE,IAAI,gBAAgB,SAAS;KAChC;KAED,MAAM,SAAS,KAAK,kBAChB,KAAK,gBAAgB,SAAS,SAAS,GACvC;AAEJ,OAAE,IAAI,KAAK,YAAY,OAAO;AAC9B,OAAE,IAAI,aAAa,MAAM;IAC1B;GACF;AAED,SAAM,MAAM;EACb;CACF;AACF"}
@@ -0,0 +1,48 @@
1
+ import { TokenExtractionOptions } from "../jwt-DF9kFbmh.cjs";
2
+ import { OidcClaims, OidcConfig, OidcUserInfo, OidcVerifier } from "../oidc-DDLIB5gb.cjs";
3
+ import { Context, MiddlewareHandler } from "hono";
4
+
5
+ //#region src/hono/oidc.d.ts
6
+ interface OidcMiddlewareOptions<TClaims extends OidcClaims = OidcClaims, TUserInfo extends OidcUserInfo = OidcUserInfo> {
7
+ config: OidcConfig;
8
+ extraction?: TokenExtractionOptions;
9
+ contextKey?: string;
10
+ fetchUserInfo?: boolean;
11
+ onError?: (c: Context, error: Error) => Response | Promise<Response>;
12
+ transformClaims?: (claims: OidcClaims, userInfo?: TUserInfo) => TClaims;
13
+ }
14
+ /**
15
+ * OIDC Middleware for Hono
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const oidc = new OidcMiddleware({
20
+ * config: {
21
+ * issuer: 'https://auth.example.com',
22
+ * audience: 'my-client-id',
23
+ * },
24
+ * });
25
+ *
26
+ * app.use('/api/*', oidc.handler());
27
+ *
28
+ * // With user info
29
+ * const oidcWithUserInfo = new OidcMiddleware({
30
+ * config: { issuer: '...', audience: '...' },
31
+ * fetchUserInfo: true,
32
+ * });
33
+ * ```
34
+ */
35
+ declare class OidcMiddleware<TClaims extends OidcClaims = OidcClaims, TUserInfo extends OidcUserInfo = OidcUserInfo> {
36
+ private readonly verifier;
37
+ private readonly extraction;
38
+ private readonly contextKey;
39
+ private readonly fetchUserInfo;
40
+ private readonly onError?;
41
+ private readonly transformClaims?;
42
+ constructor(options: OidcMiddlewareOptions<TClaims, TUserInfo>);
43
+ handler(): MiddlewareHandler;
44
+ optional(): MiddlewareHandler;
45
+ }
46
+ //#endregion
47
+ export { OidcClaims, OidcConfig, OidcMiddleware, OidcMiddlewareOptions, OidcUserInfo, OidcVerifier, TokenExtractionOptions };
48
+ //# sourceMappingURL=oidc.d.cts.map