@veloxts/auth 0.3.3 → 0.3.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 (66) hide show
  1. package/README.md +1157 -30
  2. package/dist/__integration__/fixtures.d.ts +41 -0
  3. package/dist/__integration__/fixtures.d.ts.map +1 -0
  4. package/dist/__integration__/fixtures.js +79 -0
  5. package/dist/__integration__/fixtures.js.map +1 -0
  6. package/dist/__integration__/setup.d.ts +26 -0
  7. package/dist/__integration__/setup.d.ts.map +1 -0
  8. package/dist/__integration__/setup.js +28 -0
  9. package/dist/__integration__/setup.js.map +1 -0
  10. package/dist/adapter.d.ts +710 -0
  11. package/dist/adapter.d.ts.map +1 -0
  12. package/dist/adapter.js +581 -0
  13. package/dist/adapter.js.map +1 -0
  14. package/dist/adapters/better-auth.d.ts +271 -0
  15. package/dist/adapters/better-auth.d.ts.map +1 -0
  16. package/dist/adapters/better-auth.js +341 -0
  17. package/dist/adapters/better-auth.js.map +1 -0
  18. package/dist/adapters/index.d.ts +28 -0
  19. package/dist/adapters/index.d.ts.map +1 -0
  20. package/dist/adapters/index.js +28 -0
  21. package/dist/adapters/index.js.map +1 -0
  22. package/dist/csrf.d.ts +300 -0
  23. package/dist/csrf.d.ts.map +1 -0
  24. package/dist/csrf.js +402 -0
  25. package/dist/csrf.js.map +1 -0
  26. package/dist/guards.d.ts +142 -0
  27. package/dist/guards.d.ts.map +1 -0
  28. package/dist/guards.js +259 -0
  29. package/dist/guards.js.map +1 -0
  30. package/dist/hash.d.ts +91 -0
  31. package/dist/hash.d.ts.map +1 -0
  32. package/dist/hash.js +236 -0
  33. package/dist/hash.js.map +1 -0
  34. package/dist/index.d.ts +27 -32
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +94 -36
  37. package/dist/index.js.map +1 -1
  38. package/dist/jwt.d.ts +157 -0
  39. package/dist/jwt.d.ts.map +1 -0
  40. package/dist/jwt.js +489 -0
  41. package/dist/jwt.js.map +1 -0
  42. package/dist/middleware.d.ts +99 -0
  43. package/dist/middleware.d.ts.map +1 -0
  44. package/dist/middleware.js +253 -0
  45. package/dist/middleware.js.map +1 -0
  46. package/dist/plugin.d.ts +125 -0
  47. package/dist/plugin.d.ts.map +1 -0
  48. package/dist/plugin.js +193 -0
  49. package/dist/plugin.js.map +1 -0
  50. package/dist/policies.d.ts +137 -0
  51. package/dist/policies.d.ts.map +1 -0
  52. package/dist/policies.js +240 -0
  53. package/dist/policies.js.map +1 -0
  54. package/dist/rate-limit.d.ts +231 -0
  55. package/dist/rate-limit.d.ts.map +1 -0
  56. package/dist/rate-limit.js +352 -0
  57. package/dist/rate-limit.js.map +1 -0
  58. package/dist/session.d.ts +500 -0
  59. package/dist/session.d.ts.map +1 -0
  60. package/dist/session.js +801 -0
  61. package/dist/session.js.map +1 -0
  62. package/dist/types.d.ts +261 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +33 -0
  65. package/dist/types.js.map +1 -0
  66. package/package.json +61 -7
package/dist/hash.js ADDED
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Password hashing utilities for @veloxts/auth
3
+ * @module auth/hash
4
+ */
5
+ import { randomBytes, scrypt, timingSafeEqual } from 'node:crypto';
6
+ import { promisify } from 'node:util';
7
+ const scryptAsync = promisify(scrypt);
8
+ // ============================================================================
9
+ // Constants
10
+ // ============================================================================
11
+ const DEFAULT_BCRYPT_ROUNDS = 12;
12
+ const DEFAULT_ARGON2_MEMORY_COST = 65536; // 64 MB
13
+ const DEFAULT_ARGON2_TIME_COST = 3;
14
+ const DEFAULT_ARGON2_PARALLELISM = 4;
15
+ // ============================================================================
16
+ // Password Hasher Class
17
+ // ============================================================================
18
+ /**
19
+ * Password hasher with configurable algorithms
20
+ *
21
+ * Supports bcrypt and argon2 algorithms. Falls back to scrypt-based
22
+ * implementation when native modules are not available.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const hasher = new PasswordHasher({ algorithm: 'bcrypt', bcryptRounds: 12 });
27
+ *
28
+ * // Hash a password
29
+ * const hash = await hasher.hash('mypassword123');
30
+ *
31
+ * // Verify a password
32
+ * const isValid = await hasher.verify('mypassword123', hash);
33
+ * ```
34
+ */
35
+ export class PasswordHasher {
36
+ config;
37
+ bcrypt = null;
38
+ argon2 = null;
39
+ constructor(config = {}) {
40
+ this.config = {
41
+ algorithm: config.algorithm ?? 'bcrypt',
42
+ bcryptRounds: config.bcryptRounds ?? DEFAULT_BCRYPT_ROUNDS,
43
+ argon2MemoryCost: config.argon2MemoryCost ?? DEFAULT_ARGON2_MEMORY_COST,
44
+ argon2TimeCost: config.argon2TimeCost ?? DEFAULT_ARGON2_TIME_COST,
45
+ argon2Parallelism: config.argon2Parallelism ?? DEFAULT_ARGON2_PARALLELISM,
46
+ };
47
+ }
48
+ /**
49
+ * Lazily load bcrypt module
50
+ */
51
+ async loadBcrypt() {
52
+ if (!this.bcrypt) {
53
+ try {
54
+ this.bcrypt = await import('bcrypt');
55
+ }
56
+ catch {
57
+ throw new Error('bcrypt module not found. Install it with: pnpm add bcrypt && pnpm add -D @types/bcrypt');
58
+ }
59
+ }
60
+ return this.bcrypt;
61
+ }
62
+ /**
63
+ * Lazily load argon2 module
64
+ */
65
+ async loadArgon2() {
66
+ if (!this.argon2) {
67
+ try {
68
+ this.argon2 = await import('argon2');
69
+ }
70
+ catch {
71
+ throw new Error('argon2 module not found. Install it with: pnpm add argon2');
72
+ }
73
+ }
74
+ return this.argon2;
75
+ }
76
+ /**
77
+ * Hash a password using the configured algorithm
78
+ */
79
+ async hash(password) {
80
+ if (this.config.algorithm === 'argon2') {
81
+ return this.hashWithArgon2(password);
82
+ }
83
+ return this.hashWithBcrypt(password);
84
+ }
85
+ /**
86
+ * Verify a password against a hash
87
+ */
88
+ async verify(password, hash) {
89
+ // Detect hash type from format
90
+ if (hash.startsWith('$argon2')) {
91
+ return this.verifyWithArgon2(password, hash);
92
+ }
93
+ if (hash.startsWith('$2')) {
94
+ return this.verifyWithBcrypt(password, hash);
95
+ }
96
+ if (hash.startsWith('$scrypt$')) {
97
+ return this.verifyWithScrypt(password, hash);
98
+ }
99
+ throw new Error('Unknown hash format');
100
+ }
101
+ /**
102
+ * Hash using bcrypt
103
+ */
104
+ async hashWithBcrypt(password) {
105
+ try {
106
+ const bcrypt = await this.loadBcrypt();
107
+ return bcrypt.hash(password, this.config.bcryptRounds);
108
+ }
109
+ catch (error) {
110
+ // Fallback to scrypt if bcrypt fails
111
+ if (error.message.includes('not found')) {
112
+ console.warn('bcrypt not available, falling back to scrypt');
113
+ return this.hashWithScrypt(password);
114
+ }
115
+ throw error;
116
+ }
117
+ }
118
+ /**
119
+ * Verify using bcrypt
120
+ */
121
+ async verifyWithBcrypt(password, hash) {
122
+ const bcrypt = await this.loadBcrypt();
123
+ return bcrypt.compare(password, hash);
124
+ }
125
+ /**
126
+ * Hash using argon2
127
+ */
128
+ async hashWithArgon2(password) {
129
+ try {
130
+ const argon2 = await this.loadArgon2();
131
+ return argon2.hash(password, {
132
+ memoryCost: this.config.argon2MemoryCost,
133
+ timeCost: this.config.argon2TimeCost,
134
+ parallelism: this.config.argon2Parallelism,
135
+ type: 2, // argon2id
136
+ });
137
+ }
138
+ catch (error) {
139
+ // Fallback to scrypt if argon2 fails
140
+ if (error.message.includes('not found')) {
141
+ console.warn('argon2 not available, falling back to scrypt');
142
+ return this.hashWithScrypt(password);
143
+ }
144
+ throw error;
145
+ }
146
+ }
147
+ /**
148
+ * Verify using argon2
149
+ */
150
+ async verifyWithArgon2(password, hash) {
151
+ const argon2 = await this.loadArgon2();
152
+ return argon2.verify(hash, password);
153
+ }
154
+ /**
155
+ * Hash using Node.js built-in scrypt (fallback)
156
+ */
157
+ async hashWithScrypt(password) {
158
+ const salt = randomBytes(32);
159
+ const derivedKey = (await scryptAsync(password, salt, 64));
160
+ return `$scrypt$${salt.toString('hex')}$${derivedKey.toString('hex')}`;
161
+ }
162
+ /**
163
+ * Verify using scrypt
164
+ */
165
+ async verifyWithScrypt(password, hash) {
166
+ const parts = hash.split('$');
167
+ if (parts.length !== 4 || parts[1] !== 'scrypt') {
168
+ throw new Error('Invalid scrypt hash format');
169
+ }
170
+ const salt = Buffer.from(parts[2], 'hex');
171
+ const storedKey = Buffer.from(parts[3], 'hex');
172
+ const derivedKey = (await scryptAsync(password, salt, 64));
173
+ return timingSafeEqual(storedKey, derivedKey);
174
+ }
175
+ /**
176
+ * Check if a hash needs rehashing (algorithm or cost changed)
177
+ */
178
+ needsRehash(hash) {
179
+ // If using argon2 but hash is bcrypt/scrypt, rehash
180
+ if (this.config.algorithm === 'argon2' && !hash.startsWith('$argon2')) {
181
+ return true;
182
+ }
183
+ // If using bcrypt but hash is argon2/scrypt, rehash
184
+ if (this.config.algorithm === 'bcrypt' && !hash.startsWith('$2')) {
185
+ return true;
186
+ }
187
+ // Check bcrypt rounds from hash and compare with configured rounds
188
+ // bcrypt hashes include rounds in format: $2b$XX$... where XX is the rounds (cost factor)
189
+ if (this.config.algorithm === 'bcrypt' && hash.startsWith('$2')) {
190
+ const parts = hash.split('$');
191
+ // Format: ['', '2b', 'rounds', 'salt+hash']
192
+ if (parts.length >= 4) {
193
+ const hashRounds = parseInt(parts[2], 10);
194
+ if (!Number.isNaN(hashRounds) && hashRounds !== this.config.bcryptRounds) {
195
+ return true;
196
+ }
197
+ }
198
+ }
199
+ return false;
200
+ }
201
+ }
202
+ /**
203
+ * Creates a new password hasher instance (succinct API)
204
+ */
205
+ export function passwordHasher(config) {
206
+ return new PasswordHasher(config);
207
+ }
208
+ /**
209
+ * Creates a new password hasher instance
210
+ *
211
+ * @deprecated Use `passwordHasher()` instead. Will be removed in v0.9.
212
+ */
213
+ export const createPasswordHasher = passwordHasher;
214
+ /**
215
+ * Default password hasher instance (bcrypt, 12 rounds)
216
+ */
217
+ let defaultHasher = null;
218
+ /**
219
+ * Hash a password using the default hasher
220
+ */
221
+ export async function hashPassword(password) {
222
+ if (!defaultHasher) {
223
+ defaultHasher = new PasswordHasher();
224
+ }
225
+ return defaultHasher.hash(password);
226
+ }
227
+ /**
228
+ * Verify a password using the default hasher
229
+ */
230
+ export async function verifyPassword(password, hash) {
231
+ if (!defaultHasher) {
232
+ defaultHasher = new PasswordHasher();
233
+ }
234
+ return defaultHasher.verify(password, hash);
235
+ }
236
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,40 +1,35 @@
1
1
  /**
2
2
  * @veloxts/auth - Authentication and authorization system
3
3
  *
4
- * Provides authentication middleware, session management, and authorization
5
- * guards for VeloxTS applications. Deferred to v1.1+ release.
4
+ * Provides JWT authentication, password hashing, authorization guards,
5
+ * resource policies, and rate limiting for VeloxTS applications.
6
6
  *
7
- * @note This package is a placeholder for MVP (v0.1.0)
7
+ * @packageDocumentation
8
+ * @module @veloxts/auth
8
9
  */
9
- /** Auth package version */
10
- export declare const AUTH_VERSION: string;
10
+ export { AUTH_VERSION } from './plugin.js';
11
+ export type { AuthConfig, AuthContext, AuthMiddlewareOptions, GuardDefinition, GuardFunction, HashConfig, JwtConfig,
11
12
  /**
12
- * User interface for authenticated requests
13
+ * @deprecated Use SessionConfig from session.ts for full session management
13
14
  */
14
- export interface User {
15
- id: string;
16
- email: string;
17
- [key: string]: unknown;
18
- }
19
- /**
20
- * Creates an authentication plugin for VeloxTS
21
- *
22
- * @param _config
23
- * @returns Auth plugin
24
- *
25
- * @note Full implementation coming in v1.1+
26
- */
27
- export declare function createAuth(_config?: {
28
- secret?: string;
29
- sessionStore?: unknown;
30
- }): {
31
- version: string;
32
- middleware: () => void;
33
- };
34
- /**
35
- * Authorization guard decorator (placeholder)
36
- *
37
- * @note Full implementation coming in v1.1+
38
- */
39
- export declare function guard(permissions: string[]): (target: unknown) => unknown;
15
+ LegacySessionConfig, PolicyAction, PolicyDefinition, RateLimitConfig, TokenPair, TokenPayload, User, } from './types.js';
16
+ export { AuthError } from './types.js';
17
+ export type { TokenStore } from './jwt.js';
18
+ export { createInMemoryTokenStore, createJwtManager, generateTokenId, isValidTimespan, JwtManager, jwtManager, parseTimeToSeconds, validateTokenExpiration, } from './jwt.js';
19
+ export { createPasswordHasher, hashPassword, PasswordHasher, passwordHasher, verifyPassword, } from './hash.js';
20
+ export { allOf, anyOf, authenticated, defineGuard, emailVerified, executeGuard, executeGuards, guard, hasAnyPermission, hasPermission, hasRole, not, userCan, } from './guards.js';
21
+ export { authorize, can, cannot, clearPolicies, createAdminOnlyPolicy, createOwnerOrAdminPolicy, createPolicyBuilder, createReadOnlyPolicy, definePolicy, getPolicy, registerPolicy, } from './policies.js';
22
+ export { authMiddleware, clearRateLimitStore, createAuthMiddleware, createRateLimitMiddleware, rateLimitMiddleware, } from './middleware.js';
23
+ export type { AuthRateLimitConfig, AuthRateLimiterConfig } from './rate-limit.js';
24
+ export { authRateLimiter, clearAuthRateLimitStore, createAuthRateLimiter, stopAuthRateLimitCleanup, } from './rate-limit.js';
25
+ export type { AuthPluginOptions, AuthService } from './plugin.js';
26
+ export { authPlugin, createAuthPlugin, defaultAuthPlugin, } from './plugin.js';
27
+ export type { CsrfConfig, CsrfContext, CsrfCookieConfig, CsrfErrorCode, CsrfManager, CsrfMiddlewareOptions, CsrfTokenConfig, CsrfTokenData, CsrfTokenResult, CsrfValidationConfig, } from './csrf.js';
28
+ export { CsrfError, createCsrfManager, createCsrfMiddleware, csrfMiddleware, } from './csrf.js';
29
+ export type { Session, SessionAuthContext, SessionConfig, SessionContext, SessionCookieConfig, SessionData, SessionExpirationConfig, SessionManager, SessionMiddlewareOptions, SessionStore, StoredSession, } from './session.js';
30
+ export { createInMemorySessionStore, createSessionManager, createSessionMiddleware, isSessionAuthenticated, loginSession, logoutSession, sessionMiddleware, } from './session.js';
31
+ export type { AdapterAuthContext, AdapterHttpMethod, AdapterMiddlewareOptions, AdapterRoute, AdapterSession, AdapterSessionResult, AdapterUser, AuthAdapter, AuthAdapterConfig, AuthAdapterErrorCode, AuthAdapterPluginOptions, InferAdapterConfig, } from './adapter.js';
32
+ export { AuthAdapterError, BaseAuthAdapter, createAdapterAuthMiddleware, createAuthAdapterPlugin, defineAuthAdapter, isAuthAdapter, } from './adapter.js';
33
+ export type { BetterAuthAdapterConfig, BetterAuthApi, BetterAuthHandler, BetterAuthInstance, BetterAuthSession, BetterAuthSessionResult, BetterAuthUser, } from './adapters/better-auth.js';
34
+ export { BetterAuthAdapter, createBetterAuthAdapter } from './adapters/better-auth.js';
40
35
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,2BAA2B;AAC3B,eAAO,MAAM,YAAY,EAAE,MAA+C,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO;;;EAOnF;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IACjC,QAAQ,OAAO,aAIxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,42 +1,100 @@
1
1
  /**
2
2
  * @veloxts/auth - Authentication and authorization system
3
3
  *
4
- * Provides authentication middleware, session management, and authorization
5
- * guards for VeloxTS applications. Deferred to v1.1+ release.
4
+ * Provides JWT authentication, password hashing, authorization guards,
5
+ * resource policies, and rate limiting for VeloxTS applications.
6
6
  *
7
- * @note This package is a placeholder for MVP (v0.1.0)
7
+ * @packageDocumentation
8
+ * @module @veloxts/auth
8
9
  */
9
- import { createRequire } from 'node:module';
10
- // Read version from package.json dynamically
11
- const require = createRequire(import.meta.url);
12
- const packageJson = require('../package.json');
13
- /** Auth package version */
14
- export const AUTH_VERSION = packageJson.version ?? '0.0.0-unknown';
15
- /**
16
- * Creates an authentication plugin for VeloxTS
17
- *
18
- * @param _config
19
- * @returns Auth plugin
20
- *
21
- * @note Full implementation coming in v1.1+
22
- */
23
- export function createAuth(_config = {}) {
24
- return {
25
- version: AUTH_VERSION,
26
- middleware: () => {
27
- console.log('Auth middleware placeholder (v1.1+)');
28
- },
29
- };
30
- }
31
- /**
32
- * Authorization guard decorator (placeholder)
33
- *
34
- * @note Full implementation coming in v1.1+
35
- */
36
- export function guard(permissions) {
37
- return (target) => {
38
- console.log(`Guard decorator placeholder: ${permissions.join(', ')}`);
39
- return target;
40
- };
41
- }
10
+ // ============================================================================
11
+ // Version Export
12
+ // ============================================================================
13
+ export { AUTH_VERSION } from './plugin.js';
14
+ export { AuthError } from './types.js';
15
+ export { createInMemoryTokenStore,
16
+ // Legacy (deprecated)
17
+ createJwtManager, generateTokenId, isValidTimespan, JwtManager,
18
+ // Succinct API
19
+ jwtManager, parseTimeToSeconds,
20
+ // Security validation
21
+ validateTokenExpiration, } from './jwt.js';
22
+ // ============================================================================
23
+ // Password Hashing
24
+ // ============================================================================
25
+ export {
26
+ // Legacy (deprecated)
27
+ createPasswordHasher, hashPassword, PasswordHasher,
28
+ // Succinct API
29
+ passwordHasher, verifyPassword, } from './hash.js';
30
+ // ============================================================================
31
+ // Guards
32
+ // ============================================================================
33
+ export {
34
+ // Combinators
35
+ allOf, anyOf,
36
+ // Built-in guards
37
+ authenticated,
38
+ // Factory functions
39
+ defineGuard, emailVerified,
40
+ // Execution
41
+ executeGuard, executeGuards, guard, hasAnyPermission, hasPermission, hasRole, not, userCan, } from './guards.js';
42
+ // ============================================================================
43
+ // Policies
44
+ // ============================================================================
45
+ export { authorize,
46
+ // Authorization checks
47
+ can, cannot, clearPolicies, createAdminOnlyPolicy,
48
+ // Common patterns
49
+ createOwnerOrAdminPolicy, createPolicyBuilder, createReadOnlyPolicy,
50
+ // Factory
51
+ definePolicy, getPolicy,
52
+ // Registry
53
+ registerPolicy, } from './policies.js';
54
+ // ============================================================================
55
+ // Middleware
56
+ // ============================================================================
57
+ export {
58
+ // Succinct API
59
+ authMiddleware, clearRateLimitStore,
60
+ // Legacy (deprecated)
61
+ createAuthMiddleware, createRateLimitMiddleware, rateLimitMiddleware, } from './middleware.js';
62
+ export {
63
+ // Pre-configured instance
64
+ authRateLimiter,
65
+ // Store management (for testing)
66
+ clearAuthRateLimitStore,
67
+ // Factory
68
+ createAuthRateLimiter, stopAuthRateLimitCleanup, } from './rate-limit.js';
69
+ export {
70
+ // Succinct API
71
+ authPlugin,
72
+ // Legacy (deprecated)
73
+ createAuthPlugin, defaultAuthPlugin, } from './plugin.js';
74
+ export { CsrfError, createCsrfManager,
75
+ // Legacy (deprecated)
76
+ createCsrfMiddleware,
77
+ // Succinct API
78
+ csrfMiddleware, } from './csrf.js';
79
+ export {
80
+ // Store implementations
81
+ createInMemorySessionStore,
82
+ // Session manager
83
+ createSessionManager,
84
+ // Legacy (deprecated)
85
+ createSessionMiddleware,
86
+ // Helper functions
87
+ isSessionAuthenticated, loginSession, logoutSession,
88
+ // Succinct API
89
+ sessionMiddleware, } from './session.js';
90
+ export {
91
+ // Error class
92
+ AuthAdapterError,
93
+ // Abstract base class
94
+ BaseAuthAdapter,
95
+ // Factory functions
96
+ createAdapterAuthMiddleware, createAuthAdapterPlugin, defineAuthAdapter,
97
+ // Type guard
98
+ isAuthAdapter, } from './adapter.js';
99
+ export { BetterAuthAdapter, createBetterAuthAdapter } from './adapters/better-auth.js';
42
100
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,2BAA2B;AAC3B,MAAM,CAAC,MAAM,YAAY,GAAW,WAAW,CAAC,OAAO,IAAI,eAAe,CAAC;AAW3E;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,UAAuD,EAAE;IAClF,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,UAAU,EAAE,GAAG,EAAE;YACf,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,WAAqB;IACzC,OAAO,CAAC,MAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,gCAAgC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA6B3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAOvC,OAAO,EACL,wBAAwB;AACxB,sBAAsB;AACtB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,UAAU;AACV,eAAe;AACf,UAAU,EACV,kBAAkB;AAClB,sBAAsB;AACtB,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAElB,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,OAAO;AACL,sBAAsB;AACtB,oBAAoB,EACpB,YAAY,EACZ,cAAc;AACd,eAAe;AACf,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,OAAO;AACL,cAAc;AACd,KAAK,EACL,KAAK;AACL,kBAAkB;AAClB,aAAa;AACb,oBAAoB;AACpB,WAAW,EACX,aAAa;AACb,YAAY;AACZ,YAAY,EACZ,aAAa,EACb,KAAK,EACL,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,GAAG,EACH,OAAO,GACR,MAAM,aAAa,CAAC;AAErB,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,OAAO,EACL,SAAS;AACT,uBAAuB;AACvB,GAAG,EACH,MAAM,EACN,aAAa,EACb,qBAAqB;AACrB,kBAAkB;AAClB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB;AACpB,UAAU;AACV,YAAY,EACZ,SAAS;AACT,WAAW;AACX,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO;AACL,eAAe;AACf,cAAc,EACd,mBAAmB;AACnB,sBAAsB;AACtB,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAOzB,OAAO;AACL,0BAA0B;AAC1B,eAAe;AACf,iCAAiC;AACjC,uBAAuB;AACvB,UAAU;AACV,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAOzB,OAAO;AACL,eAAe;AACf,UAAU;AACV,sBAAsB;AACtB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAkBrB,OAAO,EACL,SAAS,EACT,iBAAiB;AACjB,sBAAsB;AACtB,oBAAoB;AACpB,eAAe;AACf,cAAc,GACf,MAAM,WAAW,CAAC;AA0BnB,OAAO;AACL,wBAAwB;AACxB,0BAA0B;AAC1B,kBAAkB;AAClB,oBAAoB;AACpB,sBAAsB;AACtB,uBAAuB;AACvB,mBAAmB;AACnB,sBAAsB,EACtB,YAAY,EACZ,aAAa;AACb,eAAe;AACf,iBAAiB,GAClB,MAAM,cAAc,CAAC;AA4BtB,OAAO;AACL,cAAc;AACd,gBAAgB;AAChB,sBAAsB;AACtB,eAAe;AACf,oBAAoB;AACpB,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB;AACjB,aAAa;AACb,aAAa,GACd,MAAM,cAAc,CAAC;AAetB,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/jwt.d.ts ADDED
@@ -0,0 +1,157 @@
1
+ /**
2
+ * JWT token utilities for @veloxts/auth
3
+ * @module auth/jwt
4
+ */
5
+ import type { JwtConfig, TokenPair, TokenPayload, User } from './types.js';
6
+ /**
7
+ * Validates a time string format
8
+ * Supports: '1s', '15m', '1h', '7d', etc.
9
+ * Minimum valid value is '1s' (1 second)
10
+ *
11
+ * @returns true if valid, false otherwise
12
+ */
13
+ export declare function isValidTimespan(time: string): boolean;
14
+ /**
15
+ * Parses time string to seconds
16
+ * Supports: '15m', '1h', '7d', '30d', etc.
17
+ */
18
+ export declare function parseTimeToSeconds(time: string): number;
19
+ /**
20
+ * Generate a unique token ID
21
+ */
22
+ export declare function generateTokenId(): string;
23
+ /**
24
+ * Validates token expiration against security bounds
25
+ *
26
+ * @param accessExpiry - Access token expiry string (e.g., '15m')
27
+ * @param refreshExpiry - Refresh token expiry string (e.g., '7d')
28
+ * @throws Error if expiration times are outside security bounds
29
+ */
30
+ export declare function validateTokenExpiration(accessExpiry: string, refreshExpiry: string): void;
31
+ /**
32
+ * JWT token manager
33
+ *
34
+ * Handles token creation, verification, and refresh.
35
+ * Uses HS256 (HMAC-SHA256) algorithm.
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * const jwt = new JwtManager({
40
+ * secret: process.env.JWT_SECRET!,
41
+ * accessTokenExpiry: '15m',
42
+ * refreshTokenExpiry: '7d',
43
+ * });
44
+ *
45
+ * // Create tokens for user
46
+ * const tokens = jwt.createTokenPair(user);
47
+ *
48
+ * // Verify access token
49
+ * const payload = jwt.verifyToken(tokens.accessToken);
50
+ *
51
+ * // Refresh tokens
52
+ * const newTokens = jwt.refreshTokens(tokens.refreshToken);
53
+ * ```
54
+ */
55
+ export declare class JwtManager {
56
+ private readonly config;
57
+ constructor(config: JwtConfig);
58
+ /**
59
+ * Creates a JWT token with the given payload
60
+ *
61
+ * @param payload - Token payload (sub, email, type required)
62
+ * @param expiresIn - Expiration time string (e.g., '15m', '7d')
63
+ * @param options - Additional options
64
+ * @param options.notBefore - Delay in seconds before token becomes valid (default: 0)
65
+ */
66
+ createToken(payload: Omit<TokenPayload, 'iat' | 'exp'> & {
67
+ sub: string;
68
+ email: string;
69
+ type: TokenPayload['type'];
70
+ }, expiresIn: string, options?: {
71
+ notBefore?: number;
72
+ }): string;
73
+ /**
74
+ * Verifies a JWT token and returns the payload
75
+ *
76
+ * @throws AuthError if token is invalid or expired
77
+ */
78
+ verifyToken(token: string): TokenPayload;
79
+ /**
80
+ * Creates an access/refresh token pair for a user
81
+ *
82
+ * @param user - The user to create tokens for
83
+ * @param additionalClaims - Custom claims to include (cannot override reserved claims)
84
+ * @throws AuthError if additionalClaims contains reserved JWT claims
85
+ */
86
+ createTokenPair(user: User, additionalClaims?: Record<string, unknown>): TokenPair;
87
+ /**
88
+ * Refreshes tokens using a valid refresh token
89
+ *
90
+ * @throws AuthError if refresh token is invalid or not a refresh token
91
+ */
92
+ refreshTokens(refreshToken: string, userLoader?: (userId: string) => Promise<User | null>): Promise<TokenPair>;
93
+ refreshTokens(refreshToken: string): TokenPair;
94
+ /**
95
+ * Decodes a token without verification
96
+ * Useful for extracting payload from expired tokens
97
+ */
98
+ decodeToken(token: string): TokenPayload | null;
99
+ /**
100
+ * Extracts token from Authorization header
101
+ * Supports 'Bearer <token>' format
102
+ */
103
+ extractFromHeader(authHeader: string | undefined): string | null;
104
+ }
105
+ /**
106
+ * Creates a new JWT manager instance (succinct API)
107
+ */
108
+ export declare function jwtManager(config: JwtConfig): JwtManager;
109
+ /**
110
+ * Creates a new JWT manager instance
111
+ *
112
+ * @deprecated Use `jwtManager()` instead. Will be removed in v0.9.
113
+ */
114
+ export declare const createJwtManager: typeof jwtManager;
115
+ /**
116
+ * Token store interface for revocation management
117
+ */
118
+ export interface TokenStore {
119
+ /** Revoke a token by its ID (jti) */
120
+ revoke: (tokenId: string) => void | Promise<void>;
121
+ /** Check if a token is revoked */
122
+ isRevoked: (tokenId: string) => boolean | Promise<boolean>;
123
+ /** Clear all revoked tokens (useful for testing) */
124
+ clear: () => void;
125
+ }
126
+ /**
127
+ * Creates an in-memory token store for development and testing
128
+ *
129
+ * ⚠️ WARNING: NOT suitable for production!
130
+ * - Does not persist across server restarts
131
+ * - Does not work across multiple server instances
132
+ * - No automatic cleanup of expired token IDs
133
+ *
134
+ * For production, use Redis or database-backed storage:
135
+ * - upstash/redis for serverless
136
+ * - ioredis for traditional servers
137
+ * - Database table for audit trail
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * // Development/Testing
142
+ * const tokenStore = createInMemoryTokenStore();
143
+ *
144
+ * const authConfig: AuthConfig = {
145
+ * jwt: { secret: process.env.JWT_SECRET! },
146
+ * isTokenRevoked: tokenStore.isRevoked,
147
+ * };
148
+ *
149
+ * // Revoke on logout
150
+ * app.post('/logout', async (req) => {
151
+ * const tokenId = req.auth.token.jti;
152
+ * tokenStore.revoke(tokenId);
153
+ * });
154
+ * ```
155
+ */
156
+ export declare function createInMemoryTokenStore(): TokenStore;
157
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA+E3E;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQrD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyBvD;AA4BD;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAkEzF;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGX;gBAEA,MAAM,EAAE,SAAS;IAyD7B;;;;;;;OAOG;IACH,WAAW,CACT,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG;QAC3C,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;KAC5B,EACD,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,MAAM;IA2BT;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IA6FxC;;;;;;OAMG;IACH,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;IA4ClF;;;;OAIG;IACH,aAAa,CACX,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,GACpD,OAAO,CAAC,SAAS,CAAC;IACrB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS;IA8B9C;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAa/C;;;OAGG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI;CAYjE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAExD;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,mBAAa,CAAC;AAM3C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,kCAAkC;IAClC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,oDAAoD;IACpD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,wBAAwB,IAAI,UAAU,CAYrD"}