@rapidraptor/auth-server 0.2.3 → 1.0.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.
- package/dist/firebase/admin.d.ts +3 -0
- package/dist/firebase/admin.d.ts.map +1 -1
- package/dist/firebase/admin.js +36 -2
- package/dist/firebase/admin.js.map +1 -1
- package/dist/session/firestoreSync.d.ts.map +1 -1
- package/dist/session/firestoreSync.js +4 -3
- package/dist/session/firestoreSync.js.map +1 -1
- package/dist/session/firestoreSync.test.js +12 -6
- package/dist/session/firestoreSync.test.js.map +1 -1
- package/dist/session/sessionCache.test.js +13 -2
- package/dist/session/sessionCache.test.js.map +1 -1
- package/dist/session/sessionService.d.ts +37 -26
- package/dist/session/sessionService.d.ts.map +1 -1
- package/dist/session/sessionService.js +95 -83
- package/dist/session/sessionService.js.map +1 -1
- package/dist/session/sessionService.test.js +85 -119
- package/dist/session/sessionService.test.js.map +1 -1
- package/package.json +2 -2
package/dist/firebase/admin.d.ts
CHANGED
|
@@ -3,6 +3,9 @@ import { type Firestore } from 'firebase-admin/firestore';
|
|
|
3
3
|
/**
|
|
4
4
|
* Initialize Firebase Admin SDK
|
|
5
5
|
* Can be called multiple times safely (idempotent)
|
|
6
|
+
*
|
|
7
|
+
* Supports emulator mode when FIREBASE_AUTH_EMULATOR_HOST and FIRESTORE_EMULATOR_HOST are set.
|
|
8
|
+
* In emulator mode, credentials are not required.
|
|
6
9
|
*/
|
|
7
10
|
export declare function initializeFirebaseAdmin(): Promise<void>;
|
|
8
11
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/firebase/admin.ts"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAqDxE
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/firebase/admin.ts"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAqDxE;;;;;;GAMG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4E7D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,SAAS,CAOhD;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,GAAG,CAOpC"}
|
package/dist/firebase/admin.js
CHANGED
|
@@ -41,6 +41,9 @@ function getCredentialsFromFile() {
|
|
|
41
41
|
/**
|
|
42
42
|
* Initialize Firebase Admin SDK
|
|
43
43
|
* Can be called multiple times safely (idempotent)
|
|
44
|
+
*
|
|
45
|
+
* Supports emulator mode when FIREBASE_AUTH_EMULATOR_HOST and FIRESTORE_EMULATOR_HOST are set.
|
|
46
|
+
* In emulator mode, credentials are not required.
|
|
44
47
|
*/
|
|
45
48
|
export async function initializeFirebaseAdmin() {
|
|
46
49
|
// Check if already initialized
|
|
@@ -49,7 +52,32 @@ export async function initializeFirebaseAdmin() {
|
|
|
49
52
|
appInstance = getApps()[0];
|
|
50
53
|
return;
|
|
51
54
|
}
|
|
52
|
-
//
|
|
55
|
+
// Check if emulator mode is enabled
|
|
56
|
+
const authEmulatorHost = process.env.FIREBASE_AUTH_EMULATOR_HOST;
|
|
57
|
+
const firestoreEmulatorHost = process.env.FIRESTORE_EMULATOR_HOST;
|
|
58
|
+
const projectId = process.env.FIREBASE_PROJECT_ID || 'demo-project';
|
|
59
|
+
// Debug logging to help troubleshoot emulator detection
|
|
60
|
+
if (process.env.NODE_ENV === 'development' || process.env.DEBUG) {
|
|
61
|
+
console.log('[Firebase Admin] Environment check:');
|
|
62
|
+
console.log(` FIREBASE_AUTH_EMULATOR_HOST: ${authEmulatorHost || '(not set)'}`);
|
|
63
|
+
console.log(` FIRESTORE_EMULATOR_HOST: ${firestoreEmulatorHost || '(not set)'}`);
|
|
64
|
+
console.log(` FIREBASE_PROJECT_ID: ${projectId}`);
|
|
65
|
+
}
|
|
66
|
+
// Check if emulator mode is enabled (handle empty strings as falsy)
|
|
67
|
+
const isEmulatorMode = !!(authEmulatorHost?.trim() || firestoreEmulatorHost?.trim());
|
|
68
|
+
if (isEmulatorMode) {
|
|
69
|
+
// Emulator mode: Initialize without credentials
|
|
70
|
+
// Firebase Admin SDK automatically connects to emulators when env vars are set
|
|
71
|
+
if (process.env.NODE_ENV === 'development' || process.env.DEBUG) {
|
|
72
|
+
console.log('[Firebase Admin] Initializing in emulator mode');
|
|
73
|
+
}
|
|
74
|
+
appInstance = initializeApp({
|
|
75
|
+
projectId,
|
|
76
|
+
});
|
|
77
|
+
firestoreInstance = getFirestore(appInstance);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Production mode: Try to get credentials from environment or file
|
|
53
81
|
// Environment variables take precedence over file-based credentials
|
|
54
82
|
const envCredentials = getCredentialsFromEnv();
|
|
55
83
|
const fileCredentials = getCredentialsFromFile();
|
|
@@ -59,7 +87,13 @@ export async function initializeFirebaseAdmin() {
|
|
|
59
87
|
}
|
|
60
88
|
const credentials = envCredentials || fileCredentials;
|
|
61
89
|
if (!credentials) {
|
|
62
|
-
|
|
90
|
+
// Provide helpful error message with current environment state
|
|
91
|
+
const envVars = [
|
|
92
|
+
`FIREBASE_AUTH_EMULATOR_HOST=${authEmulatorHost || '(not set)'}`,
|
|
93
|
+
`FIRESTORE_EMULATOR_HOST=${firestoreEmulatorHost || '(not set)'}`,
|
|
94
|
+
`FIREBASE_PROJECT_ID=${process.env.FIREBASE_PROJECT_ID || '(not set)'}`,
|
|
95
|
+
].join(', ');
|
|
96
|
+
throw new Error(`Firebase Admin credentials not found. Set FIREBASE_PROJECT_ID, FIREBASE_PRIVATE_KEY, and FIREBASE_CLIENT_EMAIL environment variables, or set GOOGLE_APPLICATION_CREDENTIALS to point to a service account file. For emulator mode, set FIREBASE_AUTH_EMULATOR_HOST and FIRESTORE_EMULATOR_HOST. Current env: ${envVars}`);
|
|
63
97
|
}
|
|
64
98
|
// Initialize Firebase Admin
|
|
65
99
|
appInstance = initializeApp({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/firebase/admin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAY,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAkB,MAAM,0BAA0B,CAAC;AAExE,IAAI,iBAAiB,GAAqB,IAAI,CAAC;AAC/C,IAAI,WAAW,GAAe,IAAI,CAAC;AAWnC;;GAEG;AACH,SAAS,qBAAqB;IAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAClD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAEtD,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB;IAC7B,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;IACtE,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,+DAA+D;QAC/D,MAAM,YAAY,GAAG,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAChD,OAAO;YACL,SAAS,EAAE,cAAc,CAAC,UAAU;YACpC,UAAU,EAAE,cAAc,CAAC,WAAW;YACtC,WAAW,EAAE,cAAc,CAAC,YAAY;SACzC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/firebase/admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firestoreSync.d.ts","sourceRoot":"","sources":["../../src/session/firestoreSync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,cAAc,CAAS;gBAG7B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,cAAc,GAAE,MAAoD;IAQtE;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAMtD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"firestoreSync.d.ts","sourceRoot":"","sources":["../../src/session/firestoreSync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,cAAc,CAAS;gBAG7B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,cAAc,GAAE,MAAoD;IAQtE;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAMtD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAqChC;;;OAGG;IACH,iBAAiB,IAAI,IAAI;IAYzB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAOxB;;OAEG;IACH,oBAAoB,IAAI,MAAM;CAG/B"}
|
|
@@ -34,10 +34,11 @@ export class FirestoreSync {
|
|
|
34
34
|
// Create Firestore batch
|
|
35
35
|
const batch = this.firestore.batch();
|
|
36
36
|
const collection = this.firestore.collection(this.collectionName);
|
|
37
|
-
// Add all queued writes to batch
|
|
38
|
-
for (const [
|
|
39
|
-
const docRef = collection.doc(
|
|
37
|
+
// Add all queued writes to batch (document ID = sessionId)
|
|
38
|
+
for (const [, session] of this.writeQueue.entries()) {
|
|
39
|
+
const docRef = collection.doc(session.sessionId);
|
|
40
40
|
batch.set(docRef, {
|
|
41
|
+
sessionId: session.sessionId,
|
|
41
42
|
userId: session.userId,
|
|
42
43
|
createdAt: session.createdAt,
|
|
43
44
|
lastActivityAt: session.lastActivityAt,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firestoreSync.js","sourceRoot":"","sources":["../../src/session/firestoreSync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGpD;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,SAAS,CAAY;IACrB,UAAU,CAAa;IACvB,UAAU,CAAS;IACnB,iBAAiB,GAA0B,IAAI,CAAC;IAChD,cAAc,CAAS;IAE/B,YACE,SAAoB,EACpB,UAAkB,EAClB,iBAAyB,QAAQ,CAAC,kCAAkC;QAEpE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,MAAc,EAAE,OAAoB;QAC7C,mDAAmD;QACnD,sDAAsD;QACtD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAElE,
|
|
1
|
+
{"version":3,"file":"firestoreSync.js","sourceRoot":"","sources":["../../src/session/firestoreSync.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,9 +30,12 @@ describe('FirestoreSync', () => {
|
|
|
30
30
|
afterEach(() => {
|
|
31
31
|
firestoreSync.stopPeriodicSync();
|
|
32
32
|
});
|
|
33
|
+
const SESSION_ID_1 = '550e8400-e29b-41d4-a716-446655440001';
|
|
34
|
+
const SESSION_ID_2 = '550e8400-e29b-41d4-a716-446655440002';
|
|
33
35
|
describe('queueWrite', () => {
|
|
34
36
|
it('should queue writes for batch processing', () => {
|
|
35
37
|
const session = {
|
|
38
|
+
sessionId: SESSION_ID_1,
|
|
36
39
|
userId: 'user1',
|
|
37
40
|
createdAt: new Date(),
|
|
38
41
|
lastActivityAt: new Date(),
|
|
@@ -43,32 +46,35 @@ describe('FirestoreSync', () => {
|
|
|
43
46
|
});
|
|
44
47
|
it('should update existing queue entry with latest session data', () => {
|
|
45
48
|
const session1 = {
|
|
49
|
+
sessionId: SESSION_ID_1,
|
|
46
50
|
userId: 'user1',
|
|
47
51
|
createdAt: new Date(),
|
|
48
52
|
lastActivityAt: new Date(),
|
|
49
53
|
expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000),
|
|
50
54
|
};
|
|
51
55
|
const session2 = {
|
|
56
|
+
sessionId: SESSION_ID_1,
|
|
52
57
|
userId: 'user1',
|
|
53
58
|
createdAt: new Date(),
|
|
54
59
|
lastActivityAt: new Date(Date.now() + 1000),
|
|
55
60
|
expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000),
|
|
56
61
|
};
|
|
57
62
|
firestoreSync.queueWrite('user1', session1);
|
|
58
|
-
firestoreSync.queueWrite('user1', session2);
|
|
59
|
-
// Should still be 1 (updated, not added)
|
|
63
|
+
firestoreSync.queueWrite('user1', session2);
|
|
60
64
|
expect(firestoreSync.getPendingWriteCount()).toBe(1);
|
|
61
65
|
});
|
|
62
66
|
});
|
|
63
67
|
describe('batchSync', () => {
|
|
64
68
|
it('should sync all queued writes to Firestore', async () => {
|
|
65
69
|
const session1 = {
|
|
70
|
+
sessionId: SESSION_ID_1,
|
|
66
71
|
userId: 'user1',
|
|
67
72
|
createdAt: new Date(),
|
|
68
73
|
lastActivityAt: new Date(),
|
|
69
74
|
expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000),
|
|
70
75
|
};
|
|
71
76
|
const session2 = {
|
|
77
|
+
sessionId: SESSION_ID_2,
|
|
72
78
|
userId: 'user2',
|
|
73
79
|
createdAt: new Date(),
|
|
74
80
|
lastActivityAt: new Date(),
|
|
@@ -76,12 +82,10 @@ describe('FirestoreSync', () => {
|
|
|
76
82
|
};
|
|
77
83
|
firestoreSync.queueWrite('user1', session1);
|
|
78
84
|
firestoreSync.queueWrite('user2', session2);
|
|
79
|
-
// Reset mocks before batchSync
|
|
80
|
-
vi.clearAllMocks();
|
|
81
85
|
await firestoreSync.batchSync();
|
|
82
86
|
expect(mockFirestore.collection).toHaveBeenCalledWith('user_sessions');
|
|
83
|
-
expect(mockCollection.doc).toHaveBeenCalledWith(
|
|
84
|
-
expect(mockCollection.doc).toHaveBeenCalledWith(
|
|
87
|
+
expect(mockCollection.doc).toHaveBeenCalledWith(SESSION_ID_1);
|
|
88
|
+
expect(mockCollection.doc).toHaveBeenCalledWith(SESSION_ID_2);
|
|
85
89
|
expect(mockBatch.set).toHaveBeenCalledTimes(2);
|
|
86
90
|
expect(mockBatch.commit).toHaveBeenCalledOnce();
|
|
87
91
|
expect(firestoreSync.getPendingWriteCount()).toBe(0);
|
|
@@ -92,6 +96,7 @@ describe('FirestoreSync', () => {
|
|
|
92
96
|
});
|
|
93
97
|
it('should handle Firestore errors', async () => {
|
|
94
98
|
const session = {
|
|
99
|
+
sessionId: SESSION_ID_1,
|
|
95
100
|
userId: 'user1',
|
|
96
101
|
createdAt: new Date(),
|
|
97
102
|
lastActivityAt: new Date(),
|
|
@@ -129,6 +134,7 @@ describe('FirestoreSync', () => {
|
|
|
129
134
|
});
|
|
130
135
|
it('should return correct count', () => {
|
|
131
136
|
const session = {
|
|
137
|
+
sessionId: SESSION_ID_1,
|
|
132
138
|
userId: 'user1',
|
|
133
139
|
createdAt: new Date(),
|
|
134
140
|
lastActivityAt: new Date(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firestoreSync.test.js","sourceRoot":"","sources":["../../src/session/firestoreSync.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"firestoreSync.test.js","sourceRoot":"","sources":["../../src/session/firestoreSync.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
2
|
import { SessionCache } from './sessionCache.js';
|
|
3
|
+
const SESSION_ID_1 = '550e8400-e29b-41d4-a716-446655440001';
|
|
4
|
+
const SESSION_ID_2 = '550e8400-e29b-41d4-a716-446655440002';
|
|
5
|
+
const inactivityTimeout = 24 * 60 * 60 * 1000; // 24 hours
|
|
3
6
|
describe('SessionCache', () => {
|
|
4
7
|
let cache;
|
|
5
|
-
const inactivityTimeout = 24 * 60 * 60 * 1000; // 24 hours
|
|
6
8
|
beforeEach(() => {
|
|
7
9
|
cache = new SessionCache(inactivityTimeout);
|
|
8
10
|
});
|
|
@@ -12,6 +14,7 @@ describe('SessionCache', () => {
|
|
|
12
14
|
});
|
|
13
15
|
it('should return session when it exists', () => {
|
|
14
16
|
const session = {
|
|
17
|
+
sessionId: SESSION_ID_1,
|
|
15
18
|
userId: 'user1',
|
|
16
19
|
createdAt: new Date(),
|
|
17
20
|
lastActivityAt: new Date(),
|
|
@@ -24,6 +27,7 @@ describe('SessionCache', () => {
|
|
|
24
27
|
describe('set', () => {
|
|
25
28
|
it('should store session in cache', () => {
|
|
26
29
|
const session = {
|
|
30
|
+
sessionId: SESSION_ID_1,
|
|
27
31
|
userId: 'user1',
|
|
28
32
|
createdAt: new Date(),
|
|
29
33
|
lastActivityAt: new Date(),
|
|
@@ -39,6 +43,7 @@ describe('SessionCache', () => {
|
|
|
39
43
|
});
|
|
40
44
|
it('should return false for valid session', () => {
|
|
41
45
|
const session = {
|
|
46
|
+
sessionId: SESSION_ID_1,
|
|
42
47
|
userId: 'user1',
|
|
43
48
|
createdAt: new Date(),
|
|
44
49
|
lastActivityAt: new Date(),
|
|
@@ -49,10 +54,11 @@ describe('SessionCache', () => {
|
|
|
49
54
|
});
|
|
50
55
|
it('should return true for expired session', () => {
|
|
51
56
|
const session = {
|
|
57
|
+
sessionId: SESSION_ID_1,
|
|
52
58
|
userId: 'user1',
|
|
53
59
|
createdAt: new Date(Date.now() - inactivityTimeout),
|
|
54
60
|
lastActivityAt: new Date(Date.now() - inactivityTimeout),
|
|
55
|
-
expiresAt: new Date(Date.now() - 1000),
|
|
61
|
+
expiresAt: new Date(Date.now() - 1000),
|
|
56
62
|
};
|
|
57
63
|
cache.set('user1', session);
|
|
58
64
|
expect(cache.isExpired('user1')).toBe(true);
|
|
@@ -61,6 +67,7 @@ describe('SessionCache', () => {
|
|
|
61
67
|
describe('clear', () => {
|
|
62
68
|
it('should remove session from cache', () => {
|
|
63
69
|
const session = {
|
|
70
|
+
sessionId: SESSION_ID_1,
|
|
64
71
|
userId: 'user1',
|
|
65
72
|
createdAt: new Date(),
|
|
66
73
|
lastActivityAt: new Date(),
|
|
@@ -74,12 +81,14 @@ describe('SessionCache', () => {
|
|
|
74
81
|
describe('clearExpired', () => {
|
|
75
82
|
it('should remove expired sessions', () => {
|
|
76
83
|
const expiredSession = {
|
|
84
|
+
sessionId: SESSION_ID_1,
|
|
77
85
|
userId: 'user1',
|
|
78
86
|
createdAt: new Date(Date.now() - inactivityTimeout),
|
|
79
87
|
lastActivityAt: new Date(Date.now() - inactivityTimeout),
|
|
80
88
|
expiresAt: new Date(Date.now() - 1000),
|
|
81
89
|
};
|
|
82
90
|
const validSession = {
|
|
91
|
+
sessionId: SESSION_ID_2,
|
|
83
92
|
userId: 'user2',
|
|
84
93
|
createdAt: new Date(),
|
|
85
94
|
lastActivityAt: new Date(),
|
|
@@ -95,12 +104,14 @@ describe('SessionCache', () => {
|
|
|
95
104
|
describe('clearAll', () => {
|
|
96
105
|
it('should remove all sessions', () => {
|
|
97
106
|
const session1 = {
|
|
107
|
+
sessionId: SESSION_ID_1,
|
|
98
108
|
userId: 'user1',
|
|
99
109
|
createdAt: new Date(),
|
|
100
110
|
lastActivityAt: new Date(),
|
|
101
111
|
expiresAt: new Date(Date.now() + inactivityTimeout),
|
|
102
112
|
};
|
|
103
113
|
const session2 = {
|
|
114
|
+
sessionId: SESSION_ID_2,
|
|
104
115
|
userId: 'user2',
|
|
105
116
|
createdAt: new Date(),
|
|
106
117
|
lastActivityAt: new Date(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionCache.test.js","sourceRoot":"","sources":["../../src/session/sessionCache.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,
|
|
1
|
+
{"version":3,"file":"sessionCache.test.js","sourceRoot":"","sources":["../../src/session/sessionCache.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,9 @@ export declare class TokenRevokedError extends Error {
|
|
|
9
9
|
constructor();
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* Main session management service
|
|
13
|
-
*
|
|
12
|
+
* Main session management service. Sessions are stored in Firestore as user_sessions/{sessionId}
|
|
13
|
+
* (sessionId is a UUID). Lookup is by userId (from JWT sub); cache is keyed by userId.
|
|
14
|
+
* Uses cache-first strategy with Firestore fallback.
|
|
14
15
|
*/
|
|
15
16
|
export declare class SessionService {
|
|
16
17
|
private cache;
|
|
@@ -21,6 +22,13 @@ export declare class SessionService {
|
|
|
21
22
|
private logoutsCollectionName;
|
|
22
23
|
private logoutTtlMs;
|
|
23
24
|
constructor(cache: SessionCache, firestoreSync: FirestoreSync, firestore: Firestore, inactivityTimeout: number, collectionName?: string, logoutsCollectionName?: string, logoutTtlMs?: number);
|
|
25
|
+
/**
|
|
26
|
+
* Find active session for user.
|
|
27
|
+
* Sessions are stored as user_sessions/{sessionId}; we query by userId (from JWT sub) since
|
|
28
|
+
* sessionId is not sent by the client. orderBy lastActivityAt desc ensures a deterministic
|
|
29
|
+
* result when multiple active sessions exist for the same user (e.g. race or bug).
|
|
30
|
+
*/
|
|
31
|
+
private findActiveSessionByUserId;
|
|
24
32
|
/**
|
|
25
33
|
* Validate session and return detailed status (cache-first lookup with Firestore fallback)
|
|
26
34
|
* Returns explicit status instead of boolean to avoid requiring additional calls
|
|
@@ -33,64 +41,67 @@ export declare class SessionService {
|
|
|
33
41
|
*/
|
|
34
42
|
isSessionValid(userId: string): Promise<boolean>;
|
|
35
43
|
/**
|
|
36
|
-
* Check if session exists in Firestore (regardless of expiration)
|
|
37
|
-
*
|
|
44
|
+
* Check if a session document exists in Firestore for this user (regardless of expiration).
|
|
45
|
+
* Uses a query by userId since documents are keyed by sessionId.
|
|
38
46
|
*/
|
|
39
47
|
sessionExists(userId: string): Promise<boolean>;
|
|
40
48
|
/**
|
|
41
|
-
* Ensure session exists (idempotent
|
|
42
|
-
* Returns true if session was created, false if
|
|
43
|
-
*
|
|
49
|
+
* Ensure a session exists for the user (idempotent). Creates a new session only when none
|
|
50
|
+
* exists or there is a data integrity issue. Returns true if a session was created, false if
|
|
51
|
+
* one already existed and is valid.
|
|
44
52
|
*
|
|
45
|
-
* @param userId -
|
|
46
|
-
* @param tokenIssuedAt - Optional JWT
|
|
47
|
-
* @throws TokenRevokedError if token was issued before logout
|
|
48
|
-
* @throws Error if session is expired (user must logout and
|
|
53
|
+
* @param userId - User ID (from JWT sub)
|
|
54
|
+
* @param tokenIssuedAt - Optional JWT iat; if provided, we reject tokens issued before logout
|
|
55
|
+
* @throws TokenRevokedError if token was issued before logout
|
|
56
|
+
* @throws Error if session is expired (user must logout and log in again; we do not auto-recreate)
|
|
49
57
|
*/
|
|
50
58
|
ensureSession(userId: string, tokenIssuedAt?: Date): Promise<boolean>;
|
|
51
59
|
/**
|
|
52
|
-
* Create new session
|
|
60
|
+
* Create a new session. Session ID is an independent UUID (not derived from userId), so each
|
|
61
|
+
* login gets a distinct session and logout/re-login works correctly.
|
|
53
62
|
*/
|
|
54
63
|
createSession(userId: string): Promise<void>;
|
|
55
64
|
/**
|
|
56
|
-
* Update last activity timestamp
|
|
57
|
-
*
|
|
65
|
+
* Update last activity timestamp and extend expiration. Cache is updated immediately for
|
|
66
|
+
* fast reads; Firestore write is queued and throttled (see FirestoreSync).
|
|
58
67
|
*/
|
|
59
68
|
updateLastActivity(userId: string): Promise<void>;
|
|
60
69
|
/**
|
|
61
|
-
* Clear session (logout)
|
|
62
|
-
*
|
|
70
|
+
* Clear session (logout). Removes all session documents for this user and records the logout
|
|
71
|
+
* so tokens issued before this time can be rejected (see wasTokenIssuedBeforeLogout).
|
|
63
72
|
*/
|
|
64
73
|
clearSession(userId: string): Promise<void>;
|
|
65
74
|
/**
|
|
66
|
-
* Check if JWT
|
|
67
|
-
*
|
|
75
|
+
* Check if the JWT was issued before the user's last logout.
|
|
76
|
+
* Logout records are stored at user_logouts/{userId} (one per user). We use this to reject
|
|
77
|
+
* tokens that were issued before logout, since JWTs cannot be revoked directly.
|
|
78
|
+
* Returns true if token was issued before logout (token should be rejected).
|
|
68
79
|
*/
|
|
69
80
|
wasTokenIssuedBeforeLogout(userId: string, tokenIssuedAt: Date): Promise<boolean>;
|
|
70
81
|
/**
|
|
71
|
-
* Warmup cache from Firestore
|
|
72
|
-
*
|
|
73
|
-
* Also
|
|
82
|
+
* Warmup cache from Firestore on startup. Loads all non-expired sessions into the in-memory
|
|
83
|
+
* cache (keyed by userId). Document IDs in user_sessions are sessionIds; we cache by userId
|
|
84
|
+
* for lookup. Also performs lazy deletion of expired session documents.
|
|
74
85
|
*/
|
|
75
86
|
warmupCache(): Promise<void>;
|
|
76
87
|
/**
|
|
77
|
-
* Parse Firestore document
|
|
88
|
+
* Parse Firestore session document (timestamp fields may be Firestore Timestamp or Date) into SessionInfo.
|
|
78
89
|
*/
|
|
79
90
|
private parseFirestoreDocument;
|
|
80
91
|
/**
|
|
81
|
-
* Convert SessionInfo to Firestore document format
|
|
92
|
+
* Convert SessionInfo to Firestore document format for user_sessions collection.
|
|
82
93
|
*/
|
|
83
94
|
private toFirestoreDocument;
|
|
84
95
|
/**
|
|
85
|
-
*
|
|
96
|
+
* Normalize Firestore Timestamp or Date to JavaScript Date.
|
|
86
97
|
*/
|
|
87
98
|
private toDate;
|
|
88
99
|
/**
|
|
89
|
-
* Parse Firestore logout document
|
|
100
|
+
* Parse Firestore logout document (user_logouts collection) into typed fields.
|
|
90
101
|
*/
|
|
91
102
|
private parseLogoutDocument;
|
|
92
103
|
/**
|
|
93
|
-
* Convert logout info to Firestore document format
|
|
104
|
+
* Convert logout info to Firestore document format for user_logouts collection.
|
|
94
105
|
*/
|
|
95
106
|
private toLogoutDocument;
|
|
96
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionService.d.ts","sourceRoot":"","sources":["../../src/session/sessionService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sessionService.d.ts","sourceRoot":"","sources":["../../src/session/sessionService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAGnE;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;;CAK3C;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,WAAW,CAAS;gBAG1B,KAAK,EAAE,YAAY,EACnB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,MAAM,EACzB,cAAc,GAAE,MAAoD,EACpE,qBAAqB,GAAE,MAAmD,EAC1E,WAAW,GAAE,MAA+B;IAW9C;;;;;OAKG;YACW,yBAAyB;IAgBvC;;;;OAIG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAuCvE;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtD;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAcrD;;;;;;;;;OASG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAuB3E;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBlD;;;OAGG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBvD;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BjD;;;;;OAKG;IACG,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBvF;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAgDlC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,MAAM;IAOd;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAWzB"}
|