@geekmidas/auth 0.1.0 → 0.2.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 (116) hide show
  1. package/dist/{cacheTokenStorage-Ca05vf3T.mjs → cacheTokenStorage-16NE8Cd9.mjs} +3 -3
  2. package/dist/cacheTokenStorage-16NE8Cd9.mjs.map +1 -0
  3. package/dist/{cacheTokenStorage-BzBRJfd-.d.mts → cacheTokenStorage-B7sOoysu.d.cts} +8 -6
  4. package/dist/cacheTokenStorage-B7sOoysu.d.cts.map +1 -0
  5. package/dist/{cacheTokenStorage-CvptztkW.cjs → cacheTokenStorage-CEpMniTi.cjs} +3 -3
  6. package/dist/cacheTokenStorage-CEpMniTi.cjs.map +1 -0
  7. package/dist/{cacheTokenStorage-yNUpDD8W.d.cts → cacheTokenStorage-_tq4Kmhc.d.mts} +8 -6
  8. package/dist/cacheTokenStorage-_tq4Kmhc.d.mts.map +1 -0
  9. package/dist/cacheTokenStorage.cjs +1 -1
  10. package/dist/cacheTokenStorage.d.cts +1 -1
  11. package/dist/cacheTokenStorage.d.mts +1 -1
  12. package/dist/cacheTokenStorage.mjs +1 -1
  13. package/dist/{client-DaiUm0UZ.cjs → client-BPl_mMvb.cjs} +14 -8
  14. package/dist/client-BPl_mMvb.cjs.map +1 -0
  15. package/dist/{client-DjNZS6vZ.mjs → client-eidYNJSH.mjs} +14 -8
  16. package/dist/client-eidYNJSH.mjs.map +1 -0
  17. package/dist/client.cjs +2 -2
  18. package/dist/client.d.cts +1 -1
  19. package/dist/client.d.mts +1 -1
  20. package/dist/client.mjs +2 -2
  21. package/dist/hono/jwt.cjs +1 -1
  22. package/dist/hono/jwt.cjs.map +1 -1
  23. package/dist/hono/jwt.d.cts +2 -1
  24. package/dist/hono/jwt.d.cts.map +1 -0
  25. package/dist/hono/jwt.d.mts +2 -1
  26. package/dist/hono/jwt.d.mts.map +1 -0
  27. package/dist/hono/jwt.mjs +1 -1
  28. package/dist/hono/jwt.mjs.map +1 -1
  29. package/dist/hono/oidc.cjs +1 -1
  30. package/dist/hono/oidc.cjs.map +1 -1
  31. package/dist/hono/oidc.d.cts +3 -2
  32. package/dist/hono/oidc.d.cts.map +1 -0
  33. package/dist/hono/oidc.d.mts +3 -2
  34. package/dist/hono/oidc.d.mts.map +1 -0
  35. package/dist/hono/oidc.mjs +1 -1
  36. package/dist/hono/oidc.mjs.map +1 -1
  37. package/dist/index.cjs +3 -3
  38. package/dist/index.d.cts +2 -2
  39. package/dist/index.d.mts +2 -2
  40. package/dist/index.mjs +3 -3
  41. package/dist/{jwt-DF9kFbmh.d.cts → jwt-3eIuY2dg.d.cts} +2 -1
  42. package/dist/jwt-3eIuY2dg.d.cts.map +1 -0
  43. package/dist/jwt-Bo_eACEi.cjs.map +1 -1
  44. package/dist/{jwt-DH8CJ2xC.d.mts → jwt-BqLlRkw-.d.mts} +2 -1
  45. package/dist/jwt-BqLlRkw-.d.mts.map +1 -0
  46. package/dist/jwt-D88cPJyT.mjs.map +1 -1
  47. package/dist/jwt.d.cts +1 -1
  48. package/dist/jwt.d.mts +1 -1
  49. package/dist/lambda/jwt.cjs +2 -2
  50. package/dist/lambda/jwt.cjs.map +1 -1
  51. package/dist/lambda/jwt.d.cts +2 -1
  52. package/dist/lambda/jwt.d.cts.map +1 -0
  53. package/dist/lambda/jwt.d.mts +2 -1
  54. package/dist/lambda/jwt.d.mts.map +1 -0
  55. package/dist/lambda/jwt.mjs +2 -2
  56. package/dist/lambda/jwt.mjs.map +1 -1
  57. package/dist/lambda/oidc.cjs +2 -2
  58. package/dist/lambda/oidc.cjs.map +1 -1
  59. package/dist/lambda/oidc.d.cts +3 -2
  60. package/dist/lambda/oidc.d.cts.map +1 -0
  61. package/dist/lambda/oidc.d.mts +3 -2
  62. package/dist/lambda/oidc.d.mts.map +1 -0
  63. package/dist/lambda/oidc.mjs +2 -2
  64. package/dist/lambda/oidc.mjs.map +1 -1
  65. package/dist/oidc-C0KyYaAK.cjs.map +1 -1
  66. package/dist/{oidc-CKOGLxjV.d.mts → oidc-ChA17wLB.d.cts} +3 -2
  67. package/dist/oidc-ChA17wLB.d.cts.map +1 -0
  68. package/dist/{oidc-DDLIB5gb.d.cts → oidc-DTRgBBl6.d.mts} +3 -2
  69. package/dist/oidc-DTRgBBl6.d.mts.map +1 -0
  70. package/dist/oidc-KA30gMlx.mjs.map +1 -1
  71. package/dist/oidc.d.cts +2 -2
  72. package/dist/oidc.d.mts +2 -2
  73. package/dist/server.cjs +2 -2
  74. package/dist/server.d.cts +2 -2
  75. package/dist/server.d.mts +2 -2
  76. package/dist/server.mjs +2 -2
  77. package/dist/{tokenManager--Q93eNYr.d.mts → tokenManager-CL3yE06D.d.cts} +2 -1
  78. package/dist/tokenManager-CL3yE06D.d.cts.map +1 -0
  79. package/dist/{tokenManager-BVXxfHRa.mjs → tokenManager-Ci2Tgxp8.mjs} +5 -3
  80. package/dist/tokenManager-Ci2Tgxp8.mjs.map +1 -0
  81. package/dist/{tokenManager-EPmwgai2.cjs → tokenManager-CvEMgxOp.cjs} +5 -3
  82. package/dist/tokenManager-CvEMgxOp.cjs.map +1 -0
  83. package/dist/{tokenManager-H6-lWEah.d.cts → tokenManager-RrwjL0y-.d.mts} +2 -1
  84. package/dist/tokenManager-RrwjL0y-.d.mts.map +1 -0
  85. package/dist/tokenManager.cjs +1 -1
  86. package/dist/tokenManager.d.cts +1 -1
  87. package/dist/tokenManager.d.mts +1 -1
  88. package/dist/tokenManager.mjs +1 -1
  89. package/package.json +3 -3
  90. package/src/__tests__/cacheTokenStorage.spec.ts +148 -148
  91. package/src/__tests__/client.spec.ts +339 -339
  92. package/src/__tests__/hono-jwt.spec.ts +219 -219
  93. package/src/__tests__/hono-oidc.spec.ts +560 -560
  94. package/src/__tests__/jwt.spec.ts +150 -127
  95. package/src/__tests__/lambda-jwt.spec.ts +205 -205
  96. package/src/__tests__/lambda-oidc.spec.ts +580 -579
  97. package/src/__tests__/oidc.spec.ts +365 -365
  98. package/src/__tests__/tokenManager.spec.ts +254 -254
  99. package/src/cacheTokenStorage.ts +32 -32
  100. package/src/client.ts +199 -190
  101. package/src/hono/jwt.ts +111 -111
  102. package/src/hono/oidc.ts +131 -131
  103. package/src/index.ts +2 -2
  104. package/src/jwt.ts +57 -57
  105. package/src/lambda/jwt.ts +170 -170
  106. package/src/lambda/oidc.ts +165 -165
  107. package/src/oidc.ts +121 -121
  108. package/src/server.ts +6 -7
  109. package/src/tokenManager.ts +89 -87
  110. package/tsconfig.json +10 -0
  111. package/dist/cacheTokenStorage-Ca05vf3T.mjs.map +0 -1
  112. package/dist/cacheTokenStorage-CvptztkW.cjs.map +0 -1
  113. package/dist/client-DaiUm0UZ.cjs.map +0 -1
  114. package/dist/client-DjNZS6vZ.mjs.map +0 -1
  115. package/dist/tokenManager-BVXxfHRa.mjs.map +0 -1
  116. package/dist/tokenManager-EPmwgai2.cjs.map +0 -1
@@ -2,103 +2,105 @@ import jwt from 'jsonwebtoken';
2
2
  import type ms from 'ms';
3
3
 
4
4
  export interface TokenPayload {
5
- userId: string;
6
- email?: string;
7
- [key: string]: any;
5
+ userId: string;
6
+ email?: string;
7
+ [key: string]: any;
8
8
  }
9
9
 
10
10
  export interface TokenPair {
11
- accessToken: string;
12
- refreshToken: string;
11
+ accessToken: string;
12
+ refreshToken: string;
13
13
  }
14
14
 
15
15
  export interface TokenManagerOptions {
16
- accessTokenSecret: string;
17
- refreshTokenSecret: string;
18
- accessTokenExpiresIn?: ms.StringValue;
19
- refreshTokenExpiresIn?: ms.StringValue;
16
+ accessTokenSecret: string;
17
+ refreshTokenSecret: string;
18
+ accessTokenExpiresIn?: ms.StringValue;
19
+ refreshTokenExpiresIn?: ms.StringValue;
20
20
  }
21
21
 
22
22
  export interface DecodedToken extends TokenPayload {
23
- iat: number;
24
- exp: number;
23
+ iat: number;
24
+ exp: number;
25
25
  }
26
26
 
27
27
  export class TokenManager {
28
- private accessTokenSecret: string;
29
- private refreshTokenSecret: string;
30
- private accessTokenExpiresIn: ms.StringValue;
31
- private refreshTokenExpiresIn: ms.StringValue;
32
-
33
- constructor(options: TokenManagerOptions) {
34
- this.accessTokenSecret = options.accessTokenSecret;
35
- this.refreshTokenSecret = options.refreshTokenSecret;
36
- this.accessTokenExpiresIn = options.accessTokenExpiresIn || '15m';
37
- this.refreshTokenExpiresIn = options.refreshTokenExpiresIn || '7d';
38
- }
39
-
40
- generateTokenPair(payload: TokenPayload): TokenPair {
41
- const accessToken = jwt.sign(payload, this.accessTokenSecret, {
42
- expiresIn: this.accessTokenExpiresIn,
43
- });
44
-
45
- const refreshToken = jwt.sign(payload, this.refreshTokenSecret, {
46
- expiresIn: this.refreshTokenExpiresIn,
47
- });
48
-
49
- return {
50
- accessToken,
51
- refreshToken,
52
- };
53
- }
54
-
55
- verifyAccessToken(token: string): DecodedToken {
56
- try {
57
- return jwt.verify(token, this.accessTokenSecret) as DecodedToken;
58
- } catch (error) {
59
- throw new Error(`Invalid access token: ${error.message}`);
60
- }
61
- }
62
-
63
- verifyRefreshToken(token: string): DecodedToken {
64
- try {
65
- return jwt.verify(token, this.refreshTokenSecret) as DecodedToken;
66
- } catch (error) {
67
- throw new Error(`Invalid refresh token: ${error.message}`);
68
- }
69
- }
70
-
71
- refreshAccessToken(refreshToken: string): string {
72
- const decoded = this.verifyRefreshToken(refreshToken);
73
-
74
- // Remove JWT specific fields before creating new token
75
- const { iat, exp, ...payload } = decoded;
76
-
77
- return jwt.sign(payload, this.accessTokenSecret, {
78
- expiresIn: this.accessTokenExpiresIn,
79
- });
80
- }
81
-
82
- decodeToken(token: string): DecodedToken | null {
83
- try {
84
- return jwt.decode(token) as DecodedToken;
85
- } catch {
86
- return null;
87
- }
88
- }
89
-
90
- isTokenExpired(token: string): boolean {
91
- const decoded = this.decodeToken(token);
92
- if (!decoded) return true;
93
-
94
- const now = Math.floor(Date.now() / 1000);
95
- return decoded.exp < now;
96
- }
97
-
98
- getTokenExpiration(token: string): Date | null {
99
- const decoded = this.decodeToken(token);
100
- if (!decoded) return null;
101
-
102
- return new Date(decoded.exp * 1000);
103
- }
28
+ private accessTokenSecret: string;
29
+ private refreshTokenSecret: string;
30
+ private accessTokenExpiresIn: ms.StringValue;
31
+ private refreshTokenExpiresIn: ms.StringValue;
32
+
33
+ constructor(options: TokenManagerOptions) {
34
+ this.accessTokenSecret = options.accessTokenSecret;
35
+ this.refreshTokenSecret = options.refreshTokenSecret;
36
+ this.accessTokenExpiresIn = options.accessTokenExpiresIn || '15m';
37
+ this.refreshTokenExpiresIn = options.refreshTokenExpiresIn || '7d';
38
+ }
39
+
40
+ generateTokenPair(payload: TokenPayload): TokenPair {
41
+ const accessToken = jwt.sign(payload, this.accessTokenSecret, {
42
+ expiresIn: this.accessTokenExpiresIn,
43
+ });
44
+
45
+ const refreshToken = jwt.sign(payload, this.refreshTokenSecret, {
46
+ expiresIn: this.refreshTokenExpiresIn,
47
+ });
48
+
49
+ return {
50
+ accessToken,
51
+ refreshToken,
52
+ };
53
+ }
54
+
55
+ verifyAccessToken(token: string): DecodedToken {
56
+ try {
57
+ return jwt.verify(token, this.accessTokenSecret) as DecodedToken;
58
+ } catch (error) {
59
+ const message = error instanceof Error ? error.message : String(error);
60
+ throw new Error(`Invalid access token: ${message}`);
61
+ }
62
+ }
63
+
64
+ verifyRefreshToken(token: string): DecodedToken {
65
+ try {
66
+ return jwt.verify(token, this.refreshTokenSecret) as DecodedToken;
67
+ } catch (error) {
68
+ const message = error instanceof Error ? error.message : String(error);
69
+ throw new Error(`Invalid refresh token: ${message}`);
70
+ }
71
+ }
72
+
73
+ refreshAccessToken(refreshToken: string): string {
74
+ const decoded = this.verifyRefreshToken(refreshToken);
75
+
76
+ // Remove JWT specific fields before creating new token
77
+ const { iat, exp, ...payload } = decoded;
78
+
79
+ return jwt.sign(payload, this.accessTokenSecret, {
80
+ expiresIn: this.accessTokenExpiresIn,
81
+ });
82
+ }
83
+
84
+ decodeToken(token: string): DecodedToken | null {
85
+ try {
86
+ return jwt.decode(token) as DecodedToken;
87
+ } catch {
88
+ return null;
89
+ }
90
+ }
91
+
92
+ isTokenExpired(token: string): boolean {
93
+ const decoded = this.decodeToken(token);
94
+ if (!decoded) return true;
95
+
96
+ const now = Math.floor(Date.now() / 1000);
97
+ return decoded.exp < now;
98
+ }
99
+
100
+ getTokenExpiration(token: string): Date | null {
101
+ const decoded = this.decodeToken(token);
102
+ if (!decoded) return null;
103
+
104
+ return new Date(decoded.exp * 1000);
105
+ }
104
106
  }
package/tsconfig.json ADDED
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "composite": true,
7
+ "lib": ["ES2023", "DOM"]
8
+ },
9
+ "include": ["src/**/*"]
10
+ }
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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":"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"}
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokenManager-BVXxfHRa.mjs","names":["options: TokenManagerOptions","payload: TokenPayload","token: string","refreshToken: string"],"sources":["../src/tokenManager.ts"],"sourcesContent":["import jwt from 'jsonwebtoken';\nimport type ms from 'ms';\n\nexport interface TokenPayload {\n userId: string;\n email?: string;\n [key: string]: any;\n}\n\nexport interface TokenPair {\n accessToken: string;\n refreshToken: string;\n}\n\nexport interface TokenManagerOptions {\n accessTokenSecret: string;\n refreshTokenSecret: string;\n accessTokenExpiresIn?: ms.StringValue;\n refreshTokenExpiresIn?: ms.StringValue;\n}\n\nexport interface DecodedToken extends TokenPayload {\n iat: number;\n exp: number;\n}\n\nexport class TokenManager {\n private accessTokenSecret: string;\n private refreshTokenSecret: string;\n private accessTokenExpiresIn: ms.StringValue;\n private refreshTokenExpiresIn: ms.StringValue;\n\n constructor(options: TokenManagerOptions) {\n this.accessTokenSecret = options.accessTokenSecret;\n this.refreshTokenSecret = options.refreshTokenSecret;\n this.accessTokenExpiresIn = options.accessTokenExpiresIn || '15m';\n this.refreshTokenExpiresIn = options.refreshTokenExpiresIn || '7d';\n }\n\n generateTokenPair(payload: TokenPayload): TokenPair {\n const accessToken = jwt.sign(payload, this.accessTokenSecret, {\n expiresIn: this.accessTokenExpiresIn,\n });\n\n const refreshToken = jwt.sign(payload, this.refreshTokenSecret, {\n expiresIn: this.refreshTokenExpiresIn,\n });\n\n return {\n accessToken,\n refreshToken,\n };\n }\n\n verifyAccessToken(token: string): DecodedToken {\n try {\n return jwt.verify(token, this.accessTokenSecret) as DecodedToken;\n } catch (error) {\n throw new Error(`Invalid access token: ${error.message}`);\n }\n }\n\n verifyRefreshToken(token: string): DecodedToken {\n try {\n return jwt.verify(token, this.refreshTokenSecret) as DecodedToken;\n } catch (error) {\n throw new Error(`Invalid refresh token: ${error.message}`);\n }\n }\n\n refreshAccessToken(refreshToken: string): string {\n const decoded = this.verifyRefreshToken(refreshToken);\n\n // Remove JWT specific fields before creating new token\n const { iat, exp, ...payload } = decoded;\n\n return jwt.sign(payload, this.accessTokenSecret, {\n expiresIn: this.accessTokenExpiresIn,\n });\n }\n\n decodeToken(token: string): DecodedToken | null {\n try {\n return jwt.decode(token) as DecodedToken;\n } catch {\n return null;\n }\n }\n\n isTokenExpired(token: string): boolean {\n const decoded = this.decodeToken(token);\n if (!decoded) return true;\n\n const now = Math.floor(Date.now() / 1000);\n return decoded.exp < now;\n }\n\n getTokenExpiration(token: string): Date | null {\n const decoded = this.decodeToken(token);\n if (!decoded) return null;\n\n return new Date(decoded.exp * 1000);\n }\n}\n"],"mappings":";;;AA0BA,IAAa,eAAb,MAA0B;CACxB,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YAAYA,SAA8B;AACxC,OAAK,oBAAoB,QAAQ;AACjC,OAAK,qBAAqB,QAAQ;AAClC,OAAK,uBAAuB,QAAQ,wBAAwB;AAC5D,OAAK,wBAAwB,QAAQ,yBAAyB;CAC/D;CAED,kBAAkBC,SAAkC;EAClD,MAAM,cAAc,IAAI,KAAK,SAAS,KAAK,mBAAmB,EAC5D,WAAW,KAAK,qBACjB,EAAC;EAEF,MAAM,eAAe,IAAI,KAAK,SAAS,KAAK,oBAAoB,EAC9D,WAAW,KAAK,sBACjB,EAAC;AAEF,SAAO;GACL;GACA;EACD;CACF;CAED,kBAAkBC,OAA6B;AAC7C,MAAI;AACF,UAAO,IAAI,OAAO,OAAO,KAAK,kBAAkB;EACjD,SAAQ,OAAO;AACd,SAAM,IAAI,OAAO,wBAAwB,MAAM,QAAQ;EACxD;CACF;CAED,mBAAmBA,OAA6B;AAC9C,MAAI;AACF,UAAO,IAAI,OAAO,OAAO,KAAK,mBAAmB;EAClD,SAAQ,OAAO;AACd,SAAM,IAAI,OAAO,yBAAyB,MAAM,QAAQ;EACzD;CACF;CAED,mBAAmBC,cAA8B;EAC/C,MAAM,UAAU,KAAK,mBAAmB,aAAa;EAGrD,MAAM,EAAE,KAAK,IAAK,GAAG,SAAS,GAAG;AAEjC,SAAO,IAAI,KAAK,SAAS,KAAK,mBAAmB,EAC/C,WAAW,KAAK,qBACjB,EAAC;CACH;CAED,YAAYD,OAAoC;AAC9C,MAAI;AACF,UAAO,IAAI,OAAO,MAAM;EACzB,QAAO;AACN,UAAO;EACR;CACF;CAED,eAAeA,OAAwB;EACrC,MAAM,UAAU,KAAK,YAAY,MAAM;AACvC,OAAK,QAAS,QAAO;EAErB,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;AACzC,SAAO,QAAQ,MAAM;CACtB;CAED,mBAAmBA,OAA4B;EAC7C,MAAM,UAAU,KAAK,YAAY,MAAM;AACvC,OAAK,QAAS,QAAO;AAErB,SAAO,IAAI,KAAK,QAAQ,MAAM;CAC/B;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokenManager-EPmwgai2.cjs","names":["options: TokenManagerOptions","payload: TokenPayload","token: string","refreshToken: string"],"sources":["../src/tokenManager.ts"],"sourcesContent":["import jwt from 'jsonwebtoken';\nimport type ms from 'ms';\n\nexport interface TokenPayload {\n userId: string;\n email?: string;\n [key: string]: any;\n}\n\nexport interface TokenPair {\n accessToken: string;\n refreshToken: string;\n}\n\nexport interface TokenManagerOptions {\n accessTokenSecret: string;\n refreshTokenSecret: string;\n accessTokenExpiresIn?: ms.StringValue;\n refreshTokenExpiresIn?: ms.StringValue;\n}\n\nexport interface DecodedToken extends TokenPayload {\n iat: number;\n exp: number;\n}\n\nexport class TokenManager {\n private accessTokenSecret: string;\n private refreshTokenSecret: string;\n private accessTokenExpiresIn: ms.StringValue;\n private refreshTokenExpiresIn: ms.StringValue;\n\n constructor(options: TokenManagerOptions) {\n this.accessTokenSecret = options.accessTokenSecret;\n this.refreshTokenSecret = options.refreshTokenSecret;\n this.accessTokenExpiresIn = options.accessTokenExpiresIn || '15m';\n this.refreshTokenExpiresIn = options.refreshTokenExpiresIn || '7d';\n }\n\n generateTokenPair(payload: TokenPayload): TokenPair {\n const accessToken = jwt.sign(payload, this.accessTokenSecret, {\n expiresIn: this.accessTokenExpiresIn,\n });\n\n const refreshToken = jwt.sign(payload, this.refreshTokenSecret, {\n expiresIn: this.refreshTokenExpiresIn,\n });\n\n return {\n accessToken,\n refreshToken,\n };\n }\n\n verifyAccessToken(token: string): DecodedToken {\n try {\n return jwt.verify(token, this.accessTokenSecret) as DecodedToken;\n } catch (error) {\n throw new Error(`Invalid access token: ${error.message}`);\n }\n }\n\n verifyRefreshToken(token: string): DecodedToken {\n try {\n return jwt.verify(token, this.refreshTokenSecret) as DecodedToken;\n } catch (error) {\n throw new Error(`Invalid refresh token: ${error.message}`);\n }\n }\n\n refreshAccessToken(refreshToken: string): string {\n const decoded = this.verifyRefreshToken(refreshToken);\n\n // Remove JWT specific fields before creating new token\n const { iat, exp, ...payload } = decoded;\n\n return jwt.sign(payload, this.accessTokenSecret, {\n expiresIn: this.accessTokenExpiresIn,\n });\n }\n\n decodeToken(token: string): DecodedToken | null {\n try {\n return jwt.decode(token) as DecodedToken;\n } catch {\n return null;\n }\n }\n\n isTokenExpired(token: string): boolean {\n const decoded = this.decodeToken(token);\n if (!decoded) return true;\n\n const now = Math.floor(Date.now() / 1000);\n return decoded.exp < now;\n }\n\n getTokenExpiration(token: string): Date | null {\n const decoded = this.decodeToken(token);\n if (!decoded) return null;\n\n return new Date(decoded.exp * 1000);\n }\n}\n"],"mappings":";;;;AA0BA,IAAa,eAAb,MAA0B;CACxB,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YAAYA,SAA8B;AACxC,OAAK,oBAAoB,QAAQ;AACjC,OAAK,qBAAqB,QAAQ;AAClC,OAAK,uBAAuB,QAAQ,wBAAwB;AAC5D,OAAK,wBAAwB,QAAQ,yBAAyB;CAC/D;CAED,kBAAkBC,SAAkC;EAClD,MAAM,cAAc,qBAAI,KAAK,SAAS,KAAK,mBAAmB,EAC5D,WAAW,KAAK,qBACjB,EAAC;EAEF,MAAM,eAAe,qBAAI,KAAK,SAAS,KAAK,oBAAoB,EAC9D,WAAW,KAAK,sBACjB,EAAC;AAEF,SAAO;GACL;GACA;EACD;CACF;CAED,kBAAkBC,OAA6B;AAC7C,MAAI;AACF,UAAO,qBAAI,OAAO,OAAO,KAAK,kBAAkB;EACjD,SAAQ,OAAO;AACd,SAAM,IAAI,OAAO,wBAAwB,MAAM,QAAQ;EACxD;CACF;CAED,mBAAmBA,OAA6B;AAC9C,MAAI;AACF,UAAO,qBAAI,OAAO,OAAO,KAAK,mBAAmB;EAClD,SAAQ,OAAO;AACd,SAAM,IAAI,OAAO,yBAAyB,MAAM,QAAQ;EACzD;CACF;CAED,mBAAmBC,cAA8B;EAC/C,MAAM,UAAU,KAAK,mBAAmB,aAAa;EAGrD,MAAM,EAAE,KAAK,IAAK,GAAG,SAAS,GAAG;AAEjC,SAAO,qBAAI,KAAK,SAAS,KAAK,mBAAmB,EAC/C,WAAW,KAAK,qBACjB,EAAC;CACH;CAED,YAAYD,OAAoC;AAC9C,MAAI;AACF,UAAO,qBAAI,OAAO,MAAM;EACzB,QAAO;AACN,UAAO;EACR;CACF;CAED,eAAeA,OAAwB;EACrC,MAAM,UAAU,KAAK,YAAY,MAAM;AACvC,OAAK,QAAS,QAAO;EAErB,MAAM,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK;AACzC,SAAO,QAAQ,MAAM;CACtB;CAED,mBAAmBA,OAA4B;EAC7C,MAAM,UAAU,KAAK,YAAY,MAAM;AACvC,OAAK,QAAS,QAAO;AAErB,SAAO,IAAI,KAAK,QAAQ,MAAM;CAC/B;AACF"}