@veloxts/auth 0.3.3 → 0.3.4
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.
- package/README.md +755 -30
- package/dist/adapter.d.ts +710 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +581 -0
- package/dist/adapter.js.map +1 -0
- package/dist/adapters/better-auth.d.ts +271 -0
- package/dist/adapters/better-auth.d.ts.map +1 -0
- package/dist/adapters/better-auth.js +341 -0
- package/dist/adapters/better-auth.js.map +1 -0
- package/dist/adapters/index.d.ts +28 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +28 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/csrf.d.ts +294 -0
- package/dist/csrf.d.ts.map +1 -0
- package/dist/csrf.js +396 -0
- package/dist/csrf.js.map +1 -0
- package/dist/guards.d.ts +139 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +247 -0
- package/dist/guards.js.map +1 -0
- package/dist/hash.d.ts +85 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +220 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +25 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -36
- package/dist/index.js.map +1 -1
- package/dist/jwt.d.ts +128 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +363 -0
- package/dist/jwt.js.map +1 -0
- package/dist/middleware.d.ts +87 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +241 -0
- package/dist/middleware.js.map +1 -0
- package/dist/plugin.d.ts +107 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +174 -0
- package/dist/plugin.js.map +1 -0
- package/dist/policies.d.ts +137 -0
- package/dist/policies.d.ts.map +1 -0
- package/dist/policies.js +240 -0
- package/dist/policies.js.map +1 -0
- package/dist/session.d.ts +494 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +795 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +251 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +33 -0
- package/dist/types.js.map +1 -0
- package/package.json +38 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable Authentication Adapter System for @veloxts/auth
|
|
3
|
+
*
|
|
4
|
+
* This module provides a flexible adapter interface for integrating external
|
|
5
|
+
* authentication providers (BetterAuth, Clerk, Auth0, etc.) with VeloxTS.
|
|
6
|
+
*
|
|
7
|
+
* The adapter system abstracts provider-specific logic while maintaining
|
|
8
|
+
* full type safety and integration with VeloxTS's existing auth infrastructure.
|
|
9
|
+
*
|
|
10
|
+
* @module auth/adapter
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { createAuthAdapterPlugin, defineAuthAdapter } from '@veloxts/auth';
|
|
15
|
+
* import { betterAuth } from 'better-auth';
|
|
16
|
+
*
|
|
17
|
+
* // Create a BetterAuth adapter
|
|
18
|
+
* const betterAuthAdapter = defineBetterAuthAdapter({
|
|
19
|
+
* auth: betterAuth({ database, trustedOrigins: [...] }),
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // Create the plugin
|
|
23
|
+
* const authPlugin = createAuthAdapterPlugin(betterAuthAdapter);
|
|
24
|
+
*
|
|
25
|
+
* // Register with VeloxApp
|
|
26
|
+
* app.use(authPlugin);
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
import { AuthError } from './types.js';
|
|
30
|
+
/**
|
|
31
|
+
* Authentication adapter error
|
|
32
|
+
*
|
|
33
|
+
* Extends AuthError with adapter-specific error codes for
|
|
34
|
+
* better error handling and debugging.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* throw new AuthAdapterError(
|
|
39
|
+
* 'Failed to initialize BetterAuth adapter',
|
|
40
|
+
* 500,
|
|
41
|
+
* 'ADAPTER_INIT_FAILED',
|
|
42
|
+
* originalError
|
|
43
|
+
* );
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export class AuthAdapterError extends AuthError {
|
|
47
|
+
/** Original error from the auth provider (if available) */
|
|
48
|
+
cause;
|
|
49
|
+
/** Adapter-specific error code */
|
|
50
|
+
code;
|
|
51
|
+
constructor(message, statusCode, code, cause) {
|
|
52
|
+
super(message, statusCode, code);
|
|
53
|
+
this.name = 'AuthAdapterError';
|
|
54
|
+
this.code = code;
|
|
55
|
+
this.cause = cause;
|
|
56
|
+
Error.captureStackTrace?.(this, AuthAdapterError);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// ============================================================================
|
|
60
|
+
// Adapter Factory
|
|
61
|
+
// ============================================================================
|
|
62
|
+
/**
|
|
63
|
+
* Defines an auth adapter with proper typing
|
|
64
|
+
*
|
|
65
|
+
* This is a helper function that provides better TypeScript inference
|
|
66
|
+
* and validates adapter implementation at definition time.
|
|
67
|
+
*
|
|
68
|
+
* @template TConfig - Adapter-specific configuration type
|
|
69
|
+
* @param adapter - Adapter implementation
|
|
70
|
+
* @returns The same adapter with proper types
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* interface BetterAuthConfig extends AuthAdapterConfig {
|
|
75
|
+
* auth: BetterAuthInstance;
|
|
76
|
+
* }
|
|
77
|
+
*
|
|
78
|
+
* export const betterAuthAdapter = defineAuthAdapter<BetterAuthConfig>({
|
|
79
|
+
* name: 'better-auth',
|
|
80
|
+
* version: '1.0.0',
|
|
81
|
+
*
|
|
82
|
+
* async initialize(fastify, config) {
|
|
83
|
+
* // Store auth instance for later use
|
|
84
|
+
* },
|
|
85
|
+
*
|
|
86
|
+
* async getSession(request) {
|
|
87
|
+
* // Load session using BetterAuth
|
|
88
|
+
* },
|
|
89
|
+
*
|
|
90
|
+
* getRoutes() {
|
|
91
|
+
* return [{ path: '/api/auth/*', handler: ... }];
|
|
92
|
+
* },
|
|
93
|
+
* });
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export function defineAuthAdapter(adapter) {
|
|
97
|
+
// Validate adapter at definition time
|
|
98
|
+
validateAdapter(adapter);
|
|
99
|
+
return adapter;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Validates an adapter implementation
|
|
103
|
+
*
|
|
104
|
+
* @param adapter - Adapter to validate
|
|
105
|
+
* @throws {AuthAdapterError} If adapter is invalid
|
|
106
|
+
*
|
|
107
|
+
* @internal
|
|
108
|
+
*/
|
|
109
|
+
function validateAdapter(adapter) {
|
|
110
|
+
if (!adapter.name || typeof adapter.name !== 'string') {
|
|
111
|
+
throw new AuthAdapterError('Adapter must have a name', 500, 'ADAPTER_NOT_CONFIGURED');
|
|
112
|
+
}
|
|
113
|
+
if (!adapter.version || typeof adapter.version !== 'string') {
|
|
114
|
+
throw new AuthAdapterError(`Adapter "${adapter.name}" must have a version`, 500, 'ADAPTER_NOT_CONFIGURED');
|
|
115
|
+
}
|
|
116
|
+
if (typeof adapter.initialize !== 'function') {
|
|
117
|
+
throw new AuthAdapterError(`Adapter "${adapter.name}" must implement initialize()`, 500, 'ADAPTER_NOT_CONFIGURED');
|
|
118
|
+
}
|
|
119
|
+
if (typeof adapter.getSession !== 'function') {
|
|
120
|
+
throw new AuthAdapterError(`Adapter "${adapter.name}" must implement getSession()`, 500, 'ADAPTER_NOT_CONFIGURED');
|
|
121
|
+
}
|
|
122
|
+
if (typeof adapter.getRoutes !== 'function') {
|
|
123
|
+
throw new AuthAdapterError(`Adapter "${adapter.name}" must implement getRoutes()`, 500, 'ADAPTER_NOT_CONFIGURED');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Default user transformer
|
|
128
|
+
*
|
|
129
|
+
* Transforms AdapterUser to VeloxTS User with basic mapping.
|
|
130
|
+
* Override via config.transformUser for custom behavior.
|
|
131
|
+
*/
|
|
132
|
+
function defaultTransformUser(adapterUser) {
|
|
133
|
+
return {
|
|
134
|
+
id: adapterUser.id,
|
|
135
|
+
email: adapterUser.email,
|
|
136
|
+
// Include optional fields if present
|
|
137
|
+
...(adapterUser.name !== undefined && { name: adapterUser.name }),
|
|
138
|
+
...(adapterUser.emailVerified !== undefined && { emailVerified: adapterUser.emailVerified }),
|
|
139
|
+
...(adapterUser.image !== undefined && { image: adapterUser.image }),
|
|
140
|
+
// Spread provider data (users can access via declaration merging)
|
|
141
|
+
...adapterUser.providerData,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Check if a path matches any exclude pattern
|
|
146
|
+
*
|
|
147
|
+
* Supports:
|
|
148
|
+
* - Exact matches: `/api/health`
|
|
149
|
+
* - Wildcard suffixes: `/api/public/*`
|
|
150
|
+
*
|
|
151
|
+
* @param path - Request path to check
|
|
152
|
+
* @param patterns - Patterns to match against
|
|
153
|
+
* @returns true if path matches any pattern
|
|
154
|
+
*
|
|
155
|
+
* @internal
|
|
156
|
+
*/
|
|
157
|
+
function matchesExcludePattern(path, patterns) {
|
|
158
|
+
for (const pattern of patterns) {
|
|
159
|
+
if (pattern.endsWith('/*')) {
|
|
160
|
+
const prefix = pattern.slice(0, -1); // Remove trailing *
|
|
161
|
+
if (path.startsWith(prefix)) {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else if (path === pattern) {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Creates a VeloxTS plugin from an auth adapter
|
|
173
|
+
*
|
|
174
|
+
* This factory function wraps an auth adapter in a Fastify plugin
|
|
175
|
+
* that integrates with VeloxTS's plugin system. It handles:
|
|
176
|
+
*
|
|
177
|
+
* - Adapter initialization
|
|
178
|
+
* - Route mounting
|
|
179
|
+
* - Session loading via preHandler hook
|
|
180
|
+
* - Request decoration with auth context
|
|
181
|
+
* - Cleanup on shutdown
|
|
182
|
+
*
|
|
183
|
+
* @template TConfig - Adapter-specific configuration type
|
|
184
|
+
* @param options - Plugin options with adapter and config
|
|
185
|
+
* @returns VeloxTS plugin ready for registration
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```typescript
|
|
189
|
+
* import { createAuthAdapterPlugin } from '@veloxts/auth';
|
|
190
|
+
* import { betterAuthAdapter } from './adapters/better-auth';
|
|
191
|
+
*
|
|
192
|
+
* const authPlugin = createAuthAdapterPlugin({
|
|
193
|
+
* adapter: betterAuthAdapter,
|
|
194
|
+
* config: {
|
|
195
|
+
* name: 'better-auth',
|
|
196
|
+
* auth: betterAuth({
|
|
197
|
+
* database: db,
|
|
198
|
+
* trustedOrigins: ['http://localhost:3000'],
|
|
199
|
+
* }),
|
|
200
|
+
* debug: process.env.NODE_ENV === 'development',
|
|
201
|
+
* },
|
|
202
|
+
* });
|
|
203
|
+
*
|
|
204
|
+
* // Register with VeloxApp
|
|
205
|
+
* app.use(authPlugin);
|
|
206
|
+
* ```
|
|
207
|
+
*/
|
|
208
|
+
export function createAuthAdapterPlugin(options) {
|
|
209
|
+
const { adapter, config } = options;
|
|
210
|
+
const debug = config.debug ?? false;
|
|
211
|
+
const excludeRoutes = config.excludeRoutes ?? [];
|
|
212
|
+
const transformUser = config.transformUser ?? defaultTransformUser;
|
|
213
|
+
return {
|
|
214
|
+
name: `@veloxts/auth-adapter:${adapter.name}`,
|
|
215
|
+
version: adapter.version,
|
|
216
|
+
dependencies: ['@veloxts/core'],
|
|
217
|
+
async register(server, _opts) {
|
|
218
|
+
const mergedConfig = { ...config, ..._opts.config };
|
|
219
|
+
if (debug) {
|
|
220
|
+
server.log.info(`Registering auth adapter: ${adapter.name}`);
|
|
221
|
+
}
|
|
222
|
+
// Initialize adapter
|
|
223
|
+
try {
|
|
224
|
+
await adapter.initialize(server, mergedConfig);
|
|
225
|
+
if (debug) {
|
|
226
|
+
server.log.info(`Auth adapter "${adapter.name}" initialized`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
const adapterError = new AuthAdapterError(`Failed to initialize adapter "${adapter.name}"`, 500, 'ADAPTER_INIT_FAILED', error instanceof Error ? error : undefined);
|
|
231
|
+
server.log.error(adapterError);
|
|
232
|
+
throw adapterError;
|
|
233
|
+
}
|
|
234
|
+
// Decorate requests with auth context
|
|
235
|
+
server.decorateRequest('auth', undefined);
|
|
236
|
+
server.decorateRequest('user', undefined);
|
|
237
|
+
// Mount adapter routes
|
|
238
|
+
const routes = adapter.getRoutes();
|
|
239
|
+
for (const route of routes) {
|
|
240
|
+
const methods = route.methods ?? [
|
|
241
|
+
'GET',
|
|
242
|
+
'POST',
|
|
243
|
+
'PUT',
|
|
244
|
+
'PATCH',
|
|
245
|
+
'DELETE',
|
|
246
|
+
'OPTIONS',
|
|
247
|
+
'HEAD',
|
|
248
|
+
];
|
|
249
|
+
for (const method of methods) {
|
|
250
|
+
const routeOptions = {
|
|
251
|
+
method: method,
|
|
252
|
+
url: route.path,
|
|
253
|
+
handler: route.handler,
|
|
254
|
+
};
|
|
255
|
+
server.route(routeOptions);
|
|
256
|
+
if (debug) {
|
|
257
|
+
server.log.debug(`Mounted adapter route: ${method} ${route.path}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Add preHandler hook for session loading
|
|
262
|
+
server.addHook('preHandler', async (request, reply) => {
|
|
263
|
+
// Skip excluded routes
|
|
264
|
+
if (matchesExcludePattern(request.url, excludeRoutes)) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
// Skip adapter's own routes (they handle auth internally)
|
|
268
|
+
for (const route of routes) {
|
|
269
|
+
if (route.path.endsWith('/*')) {
|
|
270
|
+
const prefix = route.path.slice(0, -1);
|
|
271
|
+
if (request.url.startsWith(prefix)) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
else if (request.url === route.path) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
const sessionResult = await adapter.getSession(request);
|
|
281
|
+
if (sessionResult) {
|
|
282
|
+
// Validate session if adapter provides validation
|
|
283
|
+
if (adapter.validateSession) {
|
|
284
|
+
const isValid = await adapter.validateSession(sessionResult);
|
|
285
|
+
if (!isValid) {
|
|
286
|
+
if (debug) {
|
|
287
|
+
server.log.debug('Session validation failed');
|
|
288
|
+
}
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Check session expiration
|
|
293
|
+
if (sessionResult.session.expiresAt) {
|
|
294
|
+
if (sessionResult.session.expiresAt < Date.now()) {
|
|
295
|
+
if (debug) {
|
|
296
|
+
server.log.debug('Session has expired');
|
|
297
|
+
}
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Check if session is active
|
|
302
|
+
if (!sessionResult.session.isActive) {
|
|
303
|
+
if (debug) {
|
|
304
|
+
server.log.debug('Session is not active');
|
|
305
|
+
}
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
// Transform user to VeloxTS User
|
|
309
|
+
let user;
|
|
310
|
+
try {
|
|
311
|
+
user = transformUser(sessionResult.user);
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
throw new AuthAdapterError('Failed to transform user', 500, 'ADAPTER_USER_TRANSFORM_ERROR', error instanceof Error ? error : undefined);
|
|
315
|
+
}
|
|
316
|
+
// Set auth context on request
|
|
317
|
+
const authContext = {
|
|
318
|
+
user,
|
|
319
|
+
isAuthenticated: true,
|
|
320
|
+
// Token payload is not available from adapters
|
|
321
|
+
// (they use sessions, not JWTs internally)
|
|
322
|
+
};
|
|
323
|
+
request.auth = authContext;
|
|
324
|
+
request.user = user;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
// Handle adapter errors
|
|
329
|
+
if (error instanceof AuthAdapterError) {
|
|
330
|
+
if (mergedConfig.onError) {
|
|
331
|
+
await mergedConfig.onError(error, request, reply);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
throw error;
|
|
335
|
+
}
|
|
336
|
+
// Wrap unknown errors
|
|
337
|
+
const adapterError = new AuthAdapterError('Session loading failed', 500, 'ADAPTER_SESSION_ERROR', error instanceof Error ? error : undefined);
|
|
338
|
+
if (mergedConfig.onError) {
|
|
339
|
+
await mergedConfig.onError(adapterError, request, reply);
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (debug) {
|
|
343
|
+
server.log.error(adapterError);
|
|
344
|
+
}
|
|
345
|
+
// Don't throw - allow request to continue unauthenticated
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
// Add cleanup hook
|
|
349
|
+
server.addHook('onClose', async () => {
|
|
350
|
+
if (debug) {
|
|
351
|
+
server.log.info(`Cleaning up auth adapter: ${adapter.name}`);
|
|
352
|
+
}
|
|
353
|
+
try {
|
|
354
|
+
await adapter.cleanup?.();
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
server.log.error(new AuthAdapterError(`Failed to cleanup adapter "${adapter.name}"`, 500, 'ADAPTER_INIT_FAILED', error instanceof Error ? error : undefined));
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
if (debug) {
|
|
361
|
+
server.log.info(`Auth adapter "${adapter.name}" registered successfully`);
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Creates middleware for adapter-based authentication
|
|
368
|
+
*
|
|
369
|
+
* Use this middleware in procedures to require or optionally
|
|
370
|
+
* check authentication via the adapter.
|
|
371
|
+
*
|
|
372
|
+
* @returns Middleware factory functions
|
|
373
|
+
*
|
|
374
|
+
* @example
|
|
375
|
+
* ```typescript
|
|
376
|
+
* const auth = createAdapterAuthMiddleware();
|
|
377
|
+
*
|
|
378
|
+
* // Require authentication
|
|
379
|
+
* const getProfile = procedure()
|
|
380
|
+
* .use(auth.requireAuth())
|
|
381
|
+
* .query(async ({ ctx }) => {
|
|
382
|
+
* return ctx.user; // User is guaranteed to exist
|
|
383
|
+
* });
|
|
384
|
+
*
|
|
385
|
+
* // Optional authentication
|
|
386
|
+
* const getPosts = procedure()
|
|
387
|
+
* .use(auth.optionalAuth())
|
|
388
|
+
* .query(async ({ ctx }) => {
|
|
389
|
+
* // ctx.user may be undefined
|
|
390
|
+
* return fetchPosts(ctx.user?.id);
|
|
391
|
+
* });
|
|
392
|
+
* ```
|
|
393
|
+
*/
|
|
394
|
+
export function createAdapterAuthMiddleware() {
|
|
395
|
+
/**
|
|
396
|
+
* Creates the middleware function
|
|
397
|
+
*/
|
|
398
|
+
function middleware(options = {}) {
|
|
399
|
+
return async ({ ctx, next }) => {
|
|
400
|
+
const request = ctx.request;
|
|
401
|
+
// Check if auth was already loaded by preHandler hook
|
|
402
|
+
const auth = request.auth;
|
|
403
|
+
const user = request.user;
|
|
404
|
+
if (!user || !auth?.isAuthenticated) {
|
|
405
|
+
if (options.optional) {
|
|
406
|
+
// Optional auth - continue without user
|
|
407
|
+
const authContext = {
|
|
408
|
+
user: undefined,
|
|
409
|
+
isAuthenticated: false,
|
|
410
|
+
};
|
|
411
|
+
return next({
|
|
412
|
+
ctx: {
|
|
413
|
+
...ctx,
|
|
414
|
+
auth: authContext,
|
|
415
|
+
user: undefined,
|
|
416
|
+
isAuthenticated: false,
|
|
417
|
+
},
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
// Required auth - reject
|
|
421
|
+
throw new AuthError('Authentication required', 401, 'UNAUTHORIZED');
|
|
422
|
+
}
|
|
423
|
+
// Continue with authenticated context
|
|
424
|
+
return next({
|
|
425
|
+
ctx: {
|
|
426
|
+
...ctx,
|
|
427
|
+
auth,
|
|
428
|
+
user,
|
|
429
|
+
isAuthenticated: true,
|
|
430
|
+
},
|
|
431
|
+
});
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Shorthand for required authentication
|
|
436
|
+
*/
|
|
437
|
+
function requireAuth() {
|
|
438
|
+
return middleware({ optional: false });
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Shorthand for optional authentication
|
|
442
|
+
*/
|
|
443
|
+
function optionalAuth() {
|
|
444
|
+
return middleware({ optional: true });
|
|
445
|
+
}
|
|
446
|
+
return {
|
|
447
|
+
middleware,
|
|
448
|
+
requireAuth,
|
|
449
|
+
optionalAuth,
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Type guard to check if a value is a valid AuthAdapter
|
|
454
|
+
*
|
|
455
|
+
* @param value - Value to check
|
|
456
|
+
* @returns true if value is a valid AuthAdapter
|
|
457
|
+
*
|
|
458
|
+
* @example
|
|
459
|
+
* ```typescript
|
|
460
|
+
* if (isAuthAdapter(maybeAdapter)) {
|
|
461
|
+
* const plugin = createAuthAdapterPlugin({
|
|
462
|
+
* adapter: maybeAdapter,
|
|
463
|
+
* config: { name: 'test' },
|
|
464
|
+
* });
|
|
465
|
+
* }
|
|
466
|
+
* ```
|
|
467
|
+
*/
|
|
468
|
+
export function isAuthAdapter(value) {
|
|
469
|
+
if (typeof value !== 'object' || value === null) {
|
|
470
|
+
return false;
|
|
471
|
+
}
|
|
472
|
+
return ('name' in value &&
|
|
473
|
+
'version' in value &&
|
|
474
|
+
'initialize' in value &&
|
|
475
|
+
'getSession' in value &&
|
|
476
|
+
'getRoutes' in value &&
|
|
477
|
+
typeof value.name === 'string' &&
|
|
478
|
+
typeof value.version === 'string' &&
|
|
479
|
+
typeof value.initialize === 'function' &&
|
|
480
|
+
typeof value.getSession === 'function' &&
|
|
481
|
+
typeof value.getRoutes === 'function');
|
|
482
|
+
}
|
|
483
|
+
// ============================================================================
|
|
484
|
+
// Abstract Base Adapter
|
|
485
|
+
// ============================================================================
|
|
486
|
+
/**
|
|
487
|
+
* Abstract base class for auth adapters
|
|
488
|
+
*
|
|
489
|
+
* Provides common functionality that most adapters need,
|
|
490
|
+
* reducing boilerplate in adapter implementations.
|
|
491
|
+
*
|
|
492
|
+
* @template TConfig - Adapter-specific configuration type
|
|
493
|
+
*
|
|
494
|
+
* @example
|
|
495
|
+
* ```typescript
|
|
496
|
+
* class MyAdapter extends BaseAuthAdapter<MyConfig> {
|
|
497
|
+
* constructor() {
|
|
498
|
+
* super('my-adapter', '1.0.0');
|
|
499
|
+
* }
|
|
500
|
+
*
|
|
501
|
+
* async initialize(fastify: FastifyInstance, config: MyConfig) {
|
|
502
|
+
* // Custom initialization
|
|
503
|
+
* }
|
|
504
|
+
*
|
|
505
|
+
* async getSession(request: FastifyRequest) {
|
|
506
|
+
* // Custom session loading
|
|
507
|
+
* }
|
|
508
|
+
*
|
|
509
|
+
* getRoutes() {
|
|
510
|
+
* return []; // Or custom routes
|
|
511
|
+
* }
|
|
512
|
+
* }
|
|
513
|
+
* ```
|
|
514
|
+
*/
|
|
515
|
+
export class BaseAuthAdapter {
|
|
516
|
+
name;
|
|
517
|
+
version;
|
|
518
|
+
fastify = null;
|
|
519
|
+
config = null;
|
|
520
|
+
constructor(name, version) {
|
|
521
|
+
this.name = name;
|
|
522
|
+
this.version = version;
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Initialize the adapter
|
|
526
|
+
*
|
|
527
|
+
* Stores fastify and config references for subclass use.
|
|
528
|
+
* Override in subclass but call super.initialize() first.
|
|
529
|
+
*/
|
|
530
|
+
async initialize(fastify, config) {
|
|
531
|
+
this.fastify = fastify;
|
|
532
|
+
this.config = config;
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Get routes to mount
|
|
536
|
+
*
|
|
537
|
+
* Default implementation returns empty array.
|
|
538
|
+
* Override to provide adapter-specific routes.
|
|
539
|
+
*/
|
|
540
|
+
getRoutes() {
|
|
541
|
+
return [];
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Clean up adapter resources
|
|
545
|
+
*
|
|
546
|
+
* Default implementation does nothing.
|
|
547
|
+
* Override to clean up provider resources.
|
|
548
|
+
*/
|
|
549
|
+
async cleanup() {
|
|
550
|
+
this.fastify = null;
|
|
551
|
+
this.config = null;
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* Log a debug message (if debug is enabled)
|
|
555
|
+
*/
|
|
556
|
+
debug(message) {
|
|
557
|
+
if (this.config?.debug && this.fastify) {
|
|
558
|
+
this.fastify.log.debug(`[${this.name}] ${message}`);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Log an info message
|
|
563
|
+
*/
|
|
564
|
+
info(message) {
|
|
565
|
+
if (this.fastify) {
|
|
566
|
+
this.fastify.log.info(`[${this.name}] ${message}`);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Log an error
|
|
571
|
+
*/
|
|
572
|
+
error(message, cause) {
|
|
573
|
+
if (this.fastify) {
|
|
574
|
+
const errorMessage = cause
|
|
575
|
+
? `[${this.name}] ${message}: ${cause.message}`
|
|
576
|
+
: `[${this.name}] ${message}`;
|
|
577
|
+
this.fastify.log.error(errorMessage);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|