@rapidraptor/auth-server 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 (77) hide show
  1. package/dist/config.d.ts +33 -0
  2. package/dist/config.d.ts.map +1 -0
  3. package/dist/config.js +44 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/firebase/admin.d.ts +18 -0
  6. package/dist/firebase/admin.d.ts.map +1 -0
  7. package/dist/firebase/admin.js +96 -0
  8. package/dist/firebase/admin.js.map +1 -0
  9. package/dist/index.d.ts +14 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +15 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/middleware/authMiddleware.d.ts +9 -0
  14. package/dist/middleware/authMiddleware.d.ts.map +1 -0
  15. package/dist/middleware/authMiddleware.js +241 -0
  16. package/dist/middleware/authMiddleware.js.map +1 -0
  17. package/dist/middleware/authMiddleware.test.d.ts +2 -0
  18. package/dist/middleware/authMiddleware.test.d.ts.map +1 -0
  19. package/dist/middleware/authMiddleware.test.js +691 -0
  20. package/dist/middleware/authMiddleware.test.js.map +1 -0
  21. package/dist/middleware/logoutHandler.d.ts +9 -0
  22. package/dist/middleware/logoutHandler.d.ts.map +1 -0
  23. package/dist/middleware/logoutHandler.js +54 -0
  24. package/dist/middleware/logoutHandler.js.map +1 -0
  25. package/dist/middleware/logoutHandler.test.d.ts +2 -0
  26. package/dist/middleware/logoutHandler.test.d.ts.map +1 -0
  27. package/dist/middleware/logoutHandler.test.js +103 -0
  28. package/dist/middleware/logoutHandler.test.js.map +1 -0
  29. package/dist/session/firestoreSync.d.ts +37 -0
  30. package/dist/session/firestoreSync.d.ts.map +1 -0
  31. package/dist/session/firestoreSync.js +88 -0
  32. package/dist/session/firestoreSync.js.map +1 -0
  33. package/dist/session/firestoreSync.test.d.ts +2 -0
  34. package/dist/session/firestoreSync.test.d.ts.map +1 -0
  35. package/dist/session/firestoreSync.test.js +142 -0
  36. package/dist/session/firestoreSync.test.js.map +1 -0
  37. package/dist/session/sessionCache.d.ts +37 -0
  38. package/dist/session/sessionCache.d.ts.map +1 -0
  39. package/dist/session/sessionCache.js +63 -0
  40. package/dist/session/sessionCache.js.map +1 -0
  41. package/dist/session/sessionCache.test.d.ts +2 -0
  42. package/dist/session/sessionCache.test.d.ts.map +1 -0
  43. package/dist/session/sessionCache.test.js +117 -0
  44. package/dist/session/sessionCache.test.js.map +1 -0
  45. package/dist/session/sessionService.d.ts +97 -0
  46. package/dist/session/sessionService.d.ts.map +1 -0
  47. package/dist/session/sessionService.js +311 -0
  48. package/dist/session/sessionService.js.map +1 -0
  49. package/dist/session/sessionService.test.d.ts +2 -0
  50. package/dist/session/sessionService.test.d.ts.map +1 -0
  51. package/dist/session/sessionService.test.js +426 -0
  52. package/dist/session/sessionService.test.js.map +1 -0
  53. package/dist/session/types.d.ts +7 -0
  54. package/dist/session/types.d.ts.map +1 -0
  55. package/dist/session/types.js +2 -0
  56. package/dist/session/types.js.map +1 -0
  57. package/dist/tokenVerifier/errors.d.ts +23 -0
  58. package/dist/tokenVerifier/errors.d.ts.map +1 -0
  59. package/dist/tokenVerifier/errors.js +34 -0
  60. package/dist/tokenVerifier/errors.js.map +1 -0
  61. package/dist/tokenVerifier/joseTokenVerifier.d.ts +24 -0
  62. package/dist/tokenVerifier/joseTokenVerifier.d.ts.map +1 -0
  63. package/dist/tokenVerifier/joseTokenVerifier.js +157 -0
  64. package/dist/tokenVerifier/joseTokenVerifier.js.map +1 -0
  65. package/dist/tokenVerifier/types.d.ts +41 -0
  66. package/dist/tokenVerifier/types.d.ts.map +1 -0
  67. package/dist/tokenVerifier/types.js +2 -0
  68. package/dist/tokenVerifier/types.js.map +1 -0
  69. package/dist/types/middleware.d.ts +33 -0
  70. package/dist/types/middleware.d.ts.map +1 -0
  71. package/dist/types/middleware.js +2 -0
  72. package/dist/types/middleware.js.map +1 -0
  73. package/dist/types/session.d.ts +7 -0
  74. package/dist/types/session.d.ts.map +1 -0
  75. package/dist/types/session.js +2 -0
  76. package/dist/types/session.js.map +1 -0
  77. package/package.json +36 -0
@@ -0,0 +1,426 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { SessionService, TokenRevokedError } from './sessionService.js';
3
+ import { SessionCache } from './sessionCache.js';
4
+ import { FirestoreSync } from './firestoreSync.js';
5
+ import { SessionValidationStatus } from '@rapidraptor/auth-shared';
6
+ describe('SessionService', () => {
7
+ let sessionService;
8
+ let cache;
9
+ let firestoreSync;
10
+ let mockFirestore;
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ let mockCollection;
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ let mockDoc;
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ let mockLogoutsCollection;
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ let mockLogoutDoc;
19
+ const inactivityTimeout = 24 * 60 * 60 * 1000; // 24 hours
20
+ beforeEach(() => {
21
+ cache = new SessionCache(inactivityTimeout);
22
+ // Create a proper mock Firestore with batch method
23
+ const mockBatch = {
24
+ set: vi.fn(),
25
+ commit: vi.fn().mockResolvedValue(undefined),
26
+ };
27
+ const mockFirestoreWithBatch = {
28
+ collection: vi.fn(),
29
+ batch: vi.fn(() => mockBatch),
30
+ };
31
+ firestoreSync = new FirestoreSync(mockFirestoreWithBatch, 5 * 60 * 1000, 'user_sessions');
32
+ mockDoc = {
33
+ get: vi.fn(),
34
+ set: vi.fn(),
35
+ delete: vi.fn(),
36
+ };
37
+ mockCollection = {
38
+ doc: vi.fn(() => mockDoc),
39
+ where: vi.fn(() => ({
40
+ get: vi.fn(),
41
+ })),
42
+ };
43
+ mockLogoutDoc = {
44
+ get: vi.fn(),
45
+ set: vi.fn(),
46
+ };
47
+ mockLogoutsCollection = {
48
+ doc: vi.fn(() => mockLogoutDoc),
49
+ };
50
+ mockFirestore = {
51
+ collection: vi.fn((collectionName) => {
52
+ if (collectionName === 'user_logouts') {
53
+ return mockLogoutsCollection;
54
+ }
55
+ return mockCollection;
56
+ }),
57
+ runTransaction: vi.fn(),
58
+ };
59
+ sessionService = new SessionService(cache, firestoreSync, mockFirestore, inactivityTimeout);
60
+ });
61
+ describe('validateSession', () => {
62
+ it('should return VALID for valid cached session', async () => {
63
+ const session = {
64
+ userId: 'user1',
65
+ createdAt: new Date(),
66
+ lastActivityAt: new Date(),
67
+ expiresAt: new Date(Date.now() + inactivityTimeout),
68
+ };
69
+ cache.set('user1', session);
70
+ const status = await sessionService.validateSession('user1');
71
+ expect(status).toBe(SessionValidationStatus.VALID);
72
+ expect(mockFirestore.collection).not.toHaveBeenCalled();
73
+ });
74
+ it('should return EXPIRED for expired cached session and check Firestore', async () => {
75
+ const expiredSession = {
76
+ userId: 'user1',
77
+ createdAt: new Date(Date.now() - inactivityTimeout),
78
+ lastActivityAt: new Date(Date.now() - inactivityTimeout),
79
+ expiresAt: new Date(Date.now() - 1000),
80
+ };
81
+ cache.set('user1', expiredSession);
82
+ mockDoc.get.mockResolvedValue({
83
+ exists: true,
84
+ data: () => ({
85
+ userId: 'user1',
86
+ createdAt: { toDate: () => expiredSession.createdAt },
87
+ lastActivityAt: { toDate: () => expiredSession.lastActivityAt },
88
+ expiresAt: { toDate: () => expiredSession.expiresAt },
89
+ }),
90
+ });
91
+ const status = await sessionService.validateSession('user1');
92
+ expect(status).toBe(SessionValidationStatus.EXPIRED);
93
+ });
94
+ it('should return NOT_FOUND when Firestore document does not exist', async () => {
95
+ mockDoc.get.mockResolvedValue({
96
+ exists: false,
97
+ });
98
+ const status = await sessionService.validateSession('user1');
99
+ expect(status).toBe(SessionValidationStatus.NOT_FOUND);
100
+ });
101
+ it('should return VALID when Firestore document exists and is not expired', async () => {
102
+ const now = new Date();
103
+ const expiresAt = new Date(now.getTime() + inactivityTimeout);
104
+ const firestoreTimestamp = {
105
+ toDate: () => now,
106
+ };
107
+ mockDoc.get.mockResolvedValue({
108
+ exists: true,
109
+ data: () => ({
110
+ userId: 'user1',
111
+ createdAt: firestoreTimestamp,
112
+ lastActivityAt: firestoreTimestamp,
113
+ expiresAt: { toDate: () => expiresAt },
114
+ }),
115
+ });
116
+ const status = await sessionService.validateSession('user1');
117
+ expect(status).toBe(SessionValidationStatus.VALID);
118
+ expect(cache.get('user1')).toBeTruthy();
119
+ });
120
+ it('should return EXPIRED when Firestore document exists but is expired', async () => {
121
+ const now = new Date();
122
+ const expiredTime = new Date(now.getTime() - 1000);
123
+ const firestoreTimestamp = {
124
+ toDate: () => expiredTime,
125
+ };
126
+ mockDoc.get.mockResolvedValue({
127
+ exists: true,
128
+ data: () => ({
129
+ userId: 'user1',
130
+ createdAt: firestoreTimestamp,
131
+ lastActivityAt: firestoreTimestamp,
132
+ expiresAt: { toDate: () => expiredTime },
133
+ }),
134
+ });
135
+ const status = await sessionService.validateSession('user1');
136
+ expect(status).toBe(SessionValidationStatus.EXPIRED);
137
+ });
138
+ it('should return DATA_INTEGRITY_ERROR when cached session userId mismatch', async () => {
139
+ const session = {
140
+ userId: 'user2', // Mismatch
141
+ createdAt: new Date(),
142
+ lastActivityAt: new Date(),
143
+ expiresAt: new Date(Date.now() + inactivityTimeout),
144
+ };
145
+ cache.set('user1', session);
146
+ const status = await sessionService.validateSession('user1');
147
+ expect(status).toBe(SessionValidationStatus.DATA_INTEGRITY_ERROR);
148
+ expect(cache.get('user1')).toBeNull(); // Should be cleared
149
+ });
150
+ it('should return DATA_INTEGRITY_ERROR when Firestore document userId mismatch', async () => {
151
+ const now = new Date();
152
+ const expiresAt = new Date(now.getTime() + inactivityTimeout);
153
+ const firestoreTimestamp = {
154
+ toDate: () => now,
155
+ };
156
+ mockDoc.get.mockResolvedValue({
157
+ exists: true,
158
+ data: () => ({
159
+ userId: 'user2', // Mismatch with document ID
160
+ createdAt: firestoreTimestamp,
161
+ lastActivityAt: firestoreTimestamp,
162
+ expiresAt: { toDate: () => expiresAt },
163
+ }),
164
+ });
165
+ const status = await sessionService.validateSession('user1');
166
+ expect(status).toBe(SessionValidationStatus.DATA_INTEGRITY_ERROR);
167
+ });
168
+ });
169
+ describe('isSessionValid', () => {
170
+ it('should return true for valid session', async () => {
171
+ const session = {
172
+ userId: 'user1',
173
+ createdAt: new Date(),
174
+ lastActivityAt: new Date(),
175
+ expiresAt: new Date(Date.now() + inactivityTimeout),
176
+ };
177
+ cache.set('user1', session);
178
+ const isValid = await sessionService.isSessionValid('user1');
179
+ expect(isValid).toBe(true);
180
+ });
181
+ it('should return false for invalid session', async () => {
182
+ mockDoc.get.mockResolvedValue({
183
+ exists: false,
184
+ });
185
+ const isValid = await sessionService.isSessionValid('user1');
186
+ expect(isValid).toBe(false);
187
+ });
188
+ });
189
+ describe('ensureSession', () => {
190
+ it('should create new session if it does not exist', async () => {
191
+ // Mock Firestore to return no document (session doesn't exist)
192
+ mockDoc.get.mockResolvedValue({
193
+ exists: false,
194
+ });
195
+ const wasCreated = await sessionService.ensureSession('user1');
196
+ expect(wasCreated).toBe(true);
197
+ expect(cache.get('user1')).toBeTruthy();
198
+ expect(mockDoc.set).toHaveBeenCalled();
199
+ });
200
+ it('should return false if session already exists and is valid', async () => {
201
+ const session = {
202
+ userId: 'user1',
203
+ createdAt: new Date(),
204
+ lastActivityAt: new Date(),
205
+ expiresAt: new Date(Date.now() + inactivityTimeout),
206
+ };
207
+ // Set valid session in cache
208
+ cache.set('user1', session);
209
+ const wasCreated = await sessionService.ensureSession('user1');
210
+ expect(wasCreated).toBe(false);
211
+ expect(mockDoc.set).not.toHaveBeenCalled();
212
+ });
213
+ it('should throw error if session exists but is expired', async () => {
214
+ const expiredSession = {
215
+ userId: 'user1',
216
+ createdAt: new Date(Date.now() - inactivityTimeout),
217
+ lastActivityAt: new Date(Date.now() - inactivityTimeout),
218
+ expiresAt: new Date(Date.now() - 1000),
219
+ };
220
+ // Set expired session in cache
221
+ cache.set('user1', expiredSession);
222
+ // Mock Firestore to return expired session
223
+ mockDoc.get.mockResolvedValue({
224
+ exists: true,
225
+ data: () => ({
226
+ userId: 'user1',
227
+ createdAt: { toDate: () => expiredSession.createdAt },
228
+ lastActivityAt: { toDate: () => expiredSession.lastActivityAt },
229
+ expiresAt: { toDate: () => expiredSession.expiresAt },
230
+ }),
231
+ });
232
+ await expect(sessionService.ensureSession('user1')).rejects.toThrow('Session has expired. Please logout and login again.');
233
+ // Verify session was NOT recreated
234
+ expect(mockDoc.set).not.toHaveBeenCalled();
235
+ });
236
+ it('should recreate session if data integrity issue detected (userId mismatch)', async () => {
237
+ // Mock Firestore to return document with mismatched userId
238
+ mockDoc.get.mockResolvedValue({
239
+ exists: true,
240
+ data: () => ({
241
+ userId: 'different-user', // Mismatch with document ID
242
+ createdAt: { toDate: () => new Date() },
243
+ lastActivityAt: { toDate: () => new Date() },
244
+ expiresAt: { toDate: () => new Date(Date.now() + inactivityTimeout) },
245
+ }),
246
+ });
247
+ const wasCreated = await sessionService.ensureSession('user1');
248
+ expect(wasCreated).toBe(true);
249
+ expect(cache.get('user1')).toBeTruthy();
250
+ // Verify new session was created with correct userId
251
+ const newSession = cache.get('user1');
252
+ expect(newSession.userId).toBe('user1');
253
+ expect(mockDoc.set).toHaveBeenCalled();
254
+ });
255
+ it('should throw error if token was issued before logout', async () => {
256
+ // Mock logout record exists
257
+ const loggedOutAt = new Date();
258
+ const tokenIssuedAt = new Date(loggedOutAt.getTime() - 1000); // 1 second before logout
259
+ mockLogoutDoc.get.mockResolvedValue({
260
+ exists: true,
261
+ data: () => ({
262
+ userId: 'user1',
263
+ loggedOutAt: { toDate: () => loggedOutAt },
264
+ expiresAt: { toDate: () => new Date(loggedOutAt.getTime() + 3600000) }, // 1 hour TTL, still valid
265
+ }),
266
+ });
267
+ // Mock Firestore to return no document (session doesn't exist)
268
+ mockDoc.get.mockResolvedValue({
269
+ exists: false,
270
+ });
271
+ await expect(sessionService.ensureSession('user1', tokenIssuedAt)).rejects.toThrow(TokenRevokedError);
272
+ expect(mockDoc.set).not.toHaveBeenCalled();
273
+ });
274
+ it('should create session if token was issued after logout', async () => {
275
+ // Mock logout record exists but token was issued after
276
+ const loggedOutAt = new Date();
277
+ const tokenIssuedAt = new Date(loggedOutAt.getTime() + 1000); // 1 second after logout
278
+ mockLogoutDoc.get.mockResolvedValue({
279
+ exists: true,
280
+ data: () => ({
281
+ userId: 'user1',
282
+ loggedOutAt: { toDate: () => loggedOutAt },
283
+ expiresAt: { toDate: () => new Date(loggedOutAt.getTime() + 3600000) }, // 1 hour TTL, still valid
284
+ }),
285
+ });
286
+ // Mock Firestore to return no document (session doesn't exist)
287
+ mockDoc.get.mockResolvedValue({
288
+ exists: false,
289
+ });
290
+ const wasCreated = await sessionService.ensureSession('user1', tokenIssuedAt);
291
+ expect(wasCreated).toBe(true);
292
+ expect(cache.get('user1')).toBeTruthy();
293
+ expect(mockDoc.set).toHaveBeenCalled();
294
+ });
295
+ it('should work without tokenIssuedAt parameter (backward compatibility)', async () => {
296
+ // Mock Firestore to return no document (session doesn't exist)
297
+ mockDoc.get.mockResolvedValue({
298
+ exists: false,
299
+ });
300
+ const wasCreated = await sessionService.ensureSession('user1');
301
+ expect(wasCreated).toBe(true);
302
+ expect(cache.get('user1')).toBeTruthy();
303
+ expect(mockDoc.set).toHaveBeenCalled();
304
+ });
305
+ });
306
+ describe('updateLastActivity', () => {
307
+ it('should update cache immediately and queue Firestore write', async () => {
308
+ const originalTime = new Date(Date.now() - 1000); // Set time 1 second ago
309
+ const originalExpiresAt = new Date(Date.now() + inactivityTimeout); // Set expiresAt in the future (valid)
310
+ const session = {
311
+ userId: 'user1',
312
+ createdAt: originalTime,
313
+ lastActivityAt: originalTime,
314
+ expiresAt: originalExpiresAt,
315
+ };
316
+ cache.set('user1', session);
317
+ const queueWriteSpy = vi.spyOn(firestoreSync, 'queueWrite');
318
+ await sessionService.updateLastActivity('user1');
319
+ const updatedSession = cache.get('user1');
320
+ expect(updatedSession).toBeTruthy();
321
+ // Verify that lastActivityAt was updated (should be more recent)
322
+ expect(updatedSession.lastActivityAt.getTime()).toBeGreaterThanOrEqual(originalTime.getTime());
323
+ // Verify expiresAt was also updated (should be in the future now)
324
+ expect(updatedSession.expiresAt.getTime()).toBeGreaterThan(Date.now());
325
+ expect(updatedSession.expiresAt.getTime()).toBeGreaterThanOrEqual(originalExpiresAt.getTime());
326
+ expect(queueWriteSpy).toHaveBeenCalled();
327
+ });
328
+ it('should load session from Firestore if not in cache', async () => {
329
+ const now = new Date();
330
+ const expiresAt = new Date(now.getTime() + inactivityTimeout);
331
+ mockDoc.get.mockResolvedValue({
332
+ exists: true,
333
+ data: () => ({
334
+ userId: 'user1',
335
+ createdAt: { toDate: () => now },
336
+ lastActivityAt: { toDate: () => now },
337
+ expiresAt: { toDate: () => expiresAt },
338
+ }),
339
+ });
340
+ const queueWriteSpy = vi.spyOn(firestoreSync, 'queueWrite');
341
+ await sessionService.updateLastActivity('user1');
342
+ expect(cache.get('user1')).toBeTruthy();
343
+ // Verify the session was loaded and updated
344
+ const updatedSession = cache.get('user1');
345
+ expect(updatedSession).toBeTruthy();
346
+ expect(updatedSession.lastActivityAt.getTime()).toBeGreaterThanOrEqual(now.getTime());
347
+ expect(queueWriteSpy).toHaveBeenCalled();
348
+ });
349
+ });
350
+ describe('clearSession', () => {
351
+ it('should clear cache, store logout timestamp, and delete from Firestore', async () => {
352
+ const session = {
353
+ userId: 'user1',
354
+ createdAt: new Date(),
355
+ lastActivityAt: new Date(),
356
+ expiresAt: new Date(Date.now() + inactivityTimeout),
357
+ };
358
+ cache.set('user1', session);
359
+ await sessionService.clearSession('user1');
360
+ expect(cache.get('user1')).toBeNull();
361
+ expect(mockDoc.delete).toHaveBeenCalled();
362
+ // Verify logout timestamp was stored
363
+ expect(mockFirestore.collection).toHaveBeenCalledWith('user_logouts');
364
+ expect(mockLogoutDoc.set).toHaveBeenCalledWith(expect.objectContaining({
365
+ userId: 'user1',
366
+ loggedOutAt: expect.any(Date),
367
+ expiresAt: expect.any(Date),
368
+ }));
369
+ });
370
+ });
371
+ describe('wasTokenIssuedBeforeLogout', () => {
372
+ it('should return false if no logout record exists', async () => {
373
+ mockLogoutDoc.get.mockResolvedValue({
374
+ exists: false,
375
+ });
376
+ const tokenIssuedAt = new Date();
377
+ const wasIssuedBeforeLogout = await sessionService.wasTokenIssuedBeforeLogout('user1', tokenIssuedAt);
378
+ expect(wasIssuedBeforeLogout).toBe(false);
379
+ });
380
+ it('should still check token validity even if logout record has expired (TTL is only for cleanup)', async () => {
381
+ const loggedOutAt = new Date(Date.now() - 2 * 60 * 60 * 1000); // 2 hours ago
382
+ const tokenIssuedAt = new Date(loggedOutAt.getTime() - 1000); // 1 second before logout
383
+ // Logout record exists but has expired (for cleanup purposes)
384
+ mockLogoutDoc.get.mockResolvedValue({
385
+ exists: true,
386
+ data: () => ({
387
+ userId: 'user1',
388
+ loggedOutAt: { toDate: () => loggedOutAt },
389
+ expiresAt: { toDate: () => new Date(loggedOutAt.getTime() + 3600000) }, // 1 hour TTL, expired
390
+ }),
391
+ });
392
+ // Token was issued before logout, so it should be rejected even though logout record expired
393
+ const wasIssuedBeforeLogout = await sessionService.wasTokenIssuedBeforeLogout('user1', tokenIssuedAt);
394
+ expect(wasIssuedBeforeLogout).toBe(true);
395
+ });
396
+ it('should return true if token was issued before logout', async () => {
397
+ const loggedOutAt = new Date();
398
+ const tokenIssuedAt = new Date(loggedOutAt.getTime() - 1000); // 1 second before logout
399
+ mockLogoutDoc.get.mockResolvedValue({
400
+ exists: true,
401
+ data: () => ({
402
+ userId: 'user1',
403
+ loggedOutAt: { toDate: () => loggedOutAt },
404
+ expiresAt: { toDate: () => new Date(loggedOutAt.getTime() + 3600000) }, // 1 hour TTL, still valid
405
+ }),
406
+ });
407
+ const wasIssuedBeforeLogout = await sessionService.wasTokenIssuedBeforeLogout('user1', tokenIssuedAt);
408
+ expect(wasIssuedBeforeLogout).toBe(true);
409
+ });
410
+ it('should return false if token was issued after logout', async () => {
411
+ const loggedOutAt = new Date();
412
+ const tokenIssuedAt = new Date(loggedOutAt.getTime() + 1000); // 1 second after logout
413
+ mockLogoutDoc.get.mockResolvedValue({
414
+ exists: true,
415
+ data: () => ({
416
+ userId: 'user1',
417
+ loggedOutAt: { toDate: () => loggedOutAt },
418
+ expiresAt: { toDate: () => new Date(loggedOutAt.getTime() + 3600000) }, // 1 hour TTL, still valid
419
+ }),
420
+ });
421
+ const wasIssuedBeforeLogout = await sessionService.wasTokenIssuedBeforeLogout('user1', tokenIssuedAt);
422
+ expect(wasIssuedBeforeLogout).toBe(false);
423
+ });
424
+ });
425
+ });
426
+ //# sourceMappingURL=sessionService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionService.test.js","sourceRoot":"","sources":["../../src/session/sessionService.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { SessionInfo } from '@rapidraptor/auth-shared';
2
+ /**
3
+ * Type alias for session storage maps
4
+ * Used for in-memory caches and write queues
5
+ */
6
+ export type SessionMap = Map<string, SessionInfo>;
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Base error for token verification
3
+ */
4
+ export declare class TokenVerificationError extends Error {
5
+ originalError?: Error | undefined;
6
+ constructor(message: string, originalError?: Error | undefined);
7
+ }
8
+ /**
9
+ * Error thrown when token verification fails
10
+ * Includes isExpired flag for expired tokens
11
+ * Compatible with UserTokenVerificationError interface
12
+ */
13
+ export declare class TokenVerificationFailedError extends TokenVerificationError {
14
+ isExpired?: boolean;
15
+ constructor(message: string, isExpired?: boolean, originalError?: Error);
16
+ }
17
+ /**
18
+ * Error thrown when token verifier configuration is invalid
19
+ */
20
+ export declare class TokenVerifierConfigurationError extends Error {
21
+ constructor(message: string);
22
+ }
23
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/tokenVerifier/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IACX,aAAa,CAAC,EAAE,KAAK;gBAA7C,OAAO,EAAE,MAAM,EAAS,aAAa,CAAC,EAAE,KAAK,YAAA;CAI1D;AAED;;;;GAIG;AACH,qBAAa,4BAA6B,SAAQ,sBAAsB;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC;gBAEf,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,KAAK;CAKxE;AAED;;GAEG;AACH,qBAAa,+BAAgC,SAAQ,KAAK;gBAC5C,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Base error for token verification
3
+ */
4
+ export class TokenVerificationError extends Error {
5
+ originalError;
6
+ constructor(message, originalError) {
7
+ super(message);
8
+ this.originalError = originalError;
9
+ this.name = 'TokenVerificationError';
10
+ }
11
+ }
12
+ /**
13
+ * Error thrown when token verification fails
14
+ * Includes isExpired flag for expired tokens
15
+ * Compatible with UserTokenVerificationError interface
16
+ */
17
+ export class TokenVerificationFailedError extends TokenVerificationError {
18
+ isExpired;
19
+ constructor(message, isExpired, originalError) {
20
+ super(message, originalError);
21
+ this.name = 'TokenVerificationFailedError';
22
+ this.isExpired = isExpired;
23
+ }
24
+ }
25
+ /**
26
+ * Error thrown when token verifier configuration is invalid
27
+ */
28
+ export class TokenVerifierConfigurationError extends Error {
29
+ constructor(message) {
30
+ super(`Token Verifier Configuration Error: ${message}`);
31
+ this.name = 'TokenVerifierConfigurationError';
32
+ }
33
+ }
34
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/tokenVerifier/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACX;IAApC,YAAY,OAAe,EAAS,aAAqB;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,kBAAa,GAAb,aAAa,CAAQ;QAEvD,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,4BAA6B,SAAQ,sBAAsB;IAC/D,SAAS,CAAW;IAE3B,YAAY,OAAe,EAAE,SAAmB,EAAE,aAAqB;QACrE,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,+BAAgC,SAAQ,KAAK;IACxD,YAAY,OAAe;QACzB,KAAK,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAC;IAChD,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { TokenVerifierConfig } from './types.js';
2
+ import type { UserTokenVerifier, Logger } from '../types/middleware.js';
3
+ /**
4
+ * Default JWT token verifier implementation using jose library
5
+ * Supports JWKS URIs, static public keys, and skip verification mode
6
+ */
7
+ export declare class JoseTokenVerifier implements UserTokenVerifier {
8
+ private config;
9
+ private logger?;
10
+ private jwksClient?;
11
+ private cachedPublicKey?;
12
+ constructor(config: TokenVerifierConfig, logger?: Logger | undefined);
13
+ verify(token: string, correlationId?: string): Promise<{
14
+ sub: string;
15
+ email?: string;
16
+ name?: string;
17
+ }>;
18
+ private getVerificationKey;
19
+ /**
20
+ * Clear cached keys (useful for testing or key rotation)
21
+ */
22
+ clearCache(): void;
23
+ }
24
+ //# sourceMappingURL=joseTokenVerifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joseTokenVerifier.d.ts","sourceRoot":"","sources":["../../src/tokenVerifier/joseTokenVerifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAExE;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,iBAAiB;IAKvD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM,CAAC;IALjB,OAAO,CAAC,UAAU,CAAC,CAA6C;IAChE,OAAO,CAAC,eAAe,CAAC,CAAe;gBAG7B,MAAM,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,MAAM,YAAA;IAUnB,MAAM,CACV,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;YAiH5C,kBAAkB;IA6ChC;;OAEG;IACH,UAAU,IAAI,IAAI;CAQnB"}