@kurdel/auth-db 0.1.0-beta.4 → 0.1.0-beta.6

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 (50) hide show
  1. package/README.md +192 -96
  2. package/lib/api-key-hasher.d.ts +15 -0
  3. package/lib/api-key-hasher.js +6 -0
  4. package/lib/api-key-hasher.js.map +1 -1
  5. package/lib/auth-database-module.d.ts +28 -0
  6. package/lib/auth-database-module.js +23 -0
  7. package/lib/auth-database-module.js.map +1 -1
  8. package/lib/auth-database-tables.d.ts +26 -0
  9. package/lib/auth-database-tables.js +28 -1
  10. package/lib/auth-database-tables.js.map +1 -1
  11. package/lib/database-api-key-repository.d.ts +29 -0
  12. package/lib/database-api-key-repository.js +29 -0
  13. package/lib/database-api-key-repository.js.map +1 -1
  14. package/lib/database-api-key-service.d.ts +33 -0
  15. package/lib/database-api-key-service.js +33 -0
  16. package/lib/database-api-key-service.js.map +1 -1
  17. package/lib/database-api-key-usage-recorder.d.ts +25 -1
  18. package/lib/database-api-key-usage-recorder.js +25 -1
  19. package/lib/database-api-key-usage-recorder.js.map +1 -1
  20. package/lib/database-auth-event-sink-provider.d.ts +8 -0
  21. package/lib/database-auth-event-sink-provider.js +15 -0
  22. package/lib/database-auth-event-sink-provider.js.map +1 -0
  23. package/lib/database-auth-event-store.d.ts +28 -1
  24. package/lib/database-auth-event-store.js +37 -1
  25. package/lib/database-auth-event-store.js.map +1 -1
  26. package/lib/database-auth-user-repository.d.ts +28 -0
  27. package/lib/database-auth-user-repository.js +28 -0
  28. package/lib/database-auth-user-repository.js.map +1 -1
  29. package/lib/database-jwt-session-repository.d.ts +27 -1
  30. package/lib/database-jwt-session-repository.js +27 -1
  31. package/lib/database-jwt-session-repository.js.map +1 -1
  32. package/lib/database-jwt-session-service.d.ts +55 -1
  33. package/lib/database-jwt-session-service.js +182 -1
  34. package/lib/database-jwt-session-service.js.map +1 -1
  35. package/lib/database-password-credential-repository.d.ts +27 -0
  36. package/lib/database-password-credential-repository.js +27 -0
  37. package/lib/database-password-credential-repository.js.map +1 -1
  38. package/lib/database-password-service.d.ts +31 -0
  39. package/lib/database-password-service.js +31 -0
  40. package/lib/database-password-service.js.map +1 -1
  41. package/lib/database-user-service.d.ts +47 -13
  42. package/lib/database-user-service.js +273 -190
  43. package/lib/database-user-service.js.map +1 -1
  44. package/lib/index.d.ts +1 -0
  45. package/lib/index.js +1 -0
  46. package/lib/index.js.map +1 -1
  47. package/lib/tokens.d.ts +8 -0
  48. package/lib/tokens.js +8 -0
  49. package/lib/tokens.js.map +1 -1
  50. package/package.json +5 -5
@@ -19,7 +19,40 @@ export class ApiKeyNotFoundError extends Error {
19
19
  this.apiKeyId = apiKeyId;
20
20
  }
21
21
  }
22
+ /**
23
+ * ## DatabaseApiKeyService
24
+ *
25
+ * Application service responsible for issuing, listing and revoking
26
+ * database-backed API keys.
27
+ *
28
+ * Responsibilities:
29
+ * - issue API keys for active users
30
+ * - list API keys owned by a user
31
+ * - revoke existing API keys
32
+ * - publish API key lifecycle audit events
33
+ *
34
+ * Guarantees:
35
+ * - only active users can receive new API keys
36
+ * - API keys are persisted atomically using database transactions
37
+ * - plaintext API keys are returned only during creation
38
+ * - remains database-agnostic (SQLite/PostgreSQL)
39
+ *
40
+ * Non-responsibilities:
41
+ * - API key authentication
42
+ * - API key hash verification
43
+ * - authorization policy evaluation
44
+ * - HTTP request handling
45
+ */
22
46
  export class DatabaseApiKeyService {
47
+ /**
48
+ * Creates a new database-backed API key management service.
49
+ *
50
+ * @param db Database abstraction used for persistence.
51
+ * @param hasher Hashing strategy used before storing API keys.
52
+ * @param tables Optional table name overrides.
53
+ * @param events Optional authentication audit event sink.
54
+ * @param now Clock provider used for timestamps and testing.
55
+ */
23
56
  constructor(db, hasher, tables = {}, events, now = () => new Date()) {
24
57
  this.db = db;
25
58
  this.hasher = hasher;
@@ -1 +1 @@
1
- {"version":3,"file":"database-api-key-service.js","sourceRoot":"","sources":["../src/database-api-key-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database-api-key-service.js","sourceRoot":"","sources":["../src/database-api-key-service.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,34 @@
1
1
  import type { ApiKeyUsageRecorder } from '@kurdel/auth';
2
2
  import type { Database } from '@kurdel/db';
3
3
  import { type AuthDatabaseTables } from './auth-database-tables.js';
4
- /** Records the most recent successful use of a database-backed API key. */
4
+ /**
5
+ * ## DatabaseApiKeyUsageRecorder
6
+ *
7
+ * Database-backed recorder for API key usage.
8
+ *
9
+ * Responsibilities:
10
+ * - record the most recent successful use of an API key
11
+ * - isolate API key usage persistence from the underlying database schema
12
+ *
13
+ * Guarantees:
14
+ * - updates only the API key usage timestamp
15
+ * - remains database-agnostic (SQLite/PostgreSQL)
16
+ *
17
+ * Non-responsibilities:
18
+ * - API key validation
19
+ * - authentication
20
+ * - audit event persistence
21
+ * - HTTP request handling
22
+ */
5
23
  export declare class DatabaseApiKeyUsageRecorder implements ApiKeyUsageRecorder {
6
24
  private readonly db;
7
25
  private readonly tables;
26
+ /**
27
+ * Creates a new database-backed API key usage recorder.
28
+ *
29
+ * @param db Database abstraction used for persistence.
30
+ * @param tables Optional table name overrides.
31
+ */
8
32
  constructor(db: Database, tables?: Partial<AuthDatabaseTables>);
9
33
  recordUsage(credentialId: string, usedAt: Date): Promise<void>;
10
34
  }
@@ -1,6 +1,30 @@
1
1
  import { resolveAuthDatabaseTables } from './auth-database-tables.js';
2
- /** Records the most recent successful use of a database-backed API key. */
2
+ /**
3
+ * ## DatabaseApiKeyUsageRecorder
4
+ *
5
+ * Database-backed recorder for API key usage.
6
+ *
7
+ * Responsibilities:
8
+ * - record the most recent successful use of an API key
9
+ * - isolate API key usage persistence from the underlying database schema
10
+ *
11
+ * Guarantees:
12
+ * - updates only the API key usage timestamp
13
+ * - remains database-agnostic (SQLite/PostgreSQL)
14
+ *
15
+ * Non-responsibilities:
16
+ * - API key validation
17
+ * - authentication
18
+ * - audit event persistence
19
+ * - HTTP request handling
20
+ */
3
21
  export class DatabaseApiKeyUsageRecorder {
22
+ /**
23
+ * Creates a new database-backed API key usage recorder.
24
+ *
25
+ * @param db Database abstraction used for persistence.
26
+ * @param tables Optional table name overrides.
27
+ */
4
28
  constructor(db, tables = {}) {
5
29
  this.db = db;
6
30
  this.tables = resolveAuthDatabaseTables(tables);
@@ -1 +1 @@
1
- {"version":3,"file":"database-api-key-usage-recorder.js","sourceRoot":"","sources":["../src/database-api-key-usage-recorder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAE/F,2EAA2E;AAC3E,MAAM,OAAO,2BAA2B;IAGtC,YACmB,EAAY,EAC7B,SAAsC,EAAE;QADvB,OAAE,GAAF,EAAE,CAAU;QAG7B,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,YAAoB,EAAE,MAAY;QAClD,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAChB,GAAG,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,OAAO,qCAAqC;YACvE,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"database-api-key-usage-recorder.js","sourceRoot":"","sources":["../src/database-api-key-usage-recorder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAE/F;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,2BAA2B;IAGtC;;;;;OAKG;IACH,YACmB,EAAY,EAC7B,SAAsC,EAAE;QADvB,OAAE,GAAF,EAAE,CAAU;QAG7B,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,YAAoB,EAAE,MAAY;QAClD,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAChB,GAAG,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,OAAO,qCAAqC;YACvE,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { AuthEventSinkProvider } from '@kurdel/auth';
2
+ /**
3
+ * Resolves the database-backed authentication event sink for `AuthModule`.
4
+ *
5
+ * `AuthDatabaseModule` must be configured with `audit: true` so that the
6
+ * event store is registered in the application container.
7
+ */
8
+ export declare function databaseAuthEventSink(): AuthEventSinkProvider;
@@ -0,0 +1,15 @@
1
+ import { AUTH_DB_TOKENS } from './tokens.js';
2
+ /**
3
+ * Resolves the database-backed authentication event sink for `AuthModule`.
4
+ *
5
+ * `AuthDatabaseModule` must be configured with `audit: true` so that the
6
+ * event store is registered in the application container.
7
+ */
8
+ export function databaseAuthEventSink() {
9
+ return {
10
+ useFactory(container) {
11
+ return container.get(AUTH_DB_TOKENS.EventStore);
12
+ },
13
+ };
14
+ }
15
+ //# sourceMappingURL=database-auth-event-sink-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-auth-event-sink-provider.js","sourceRoot":"","sources":["../src/database-auth-event-sink-provider.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,UAAU,CAAC,SAAoB;YAC7B,OAAO,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -26,10 +26,37 @@ export type AuthEventList = {
26
26
  limit: number;
27
27
  offset: number;
28
28
  };
29
- /** Persists and queries sanitized authentication audit events. */
29
+ /**
30
+ * ## DatabaseAuthEventStore
31
+ *
32
+ * Database-backed store for authentication audit events.
33
+ *
34
+ * Responsibilities:
35
+ * - persist authentication audit events
36
+ * - provide filtered and paginated audit queries
37
+ * - map database records to audit event DTOs
38
+ * - isolate audit persistence from the underlying database schema
39
+ *
40
+ * Guarantees:
41
+ * - stores sanitized authentication events only
42
+ * - supports transactional event persistence
43
+ * - remains database-agnostic (SQLite/PostgreSQL)
44
+ *
45
+ * Non-responsibilities:
46
+ * - authentication
47
+ * - authorization policy evaluation
48
+ * - event dispatching
49
+ * - HTTP request handling
50
+ */
30
51
  export declare class DatabaseAuthEventStore implements AuthEventSink {
31
52
  private readonly db;
32
53
  private readonly tables;
54
+ /**
55
+ * Creates a new database-backed authentication audit store.
56
+ *
57
+ * @param db Database abstraction used for persistence.
58
+ * @param tables Optional table name overrides.
59
+ */
33
60
  constructor(db: Database, tables?: Partial<AuthDatabaseTables>);
34
61
  report(event: AuthEvent, database?: DatabaseSession): Promise<void>;
35
62
  list(input?: ListAuthEventsInput): Promise<StoredAuthEvent[]>;
@@ -1,10 +1,40 @@
1
1
  import { resolveAuthDatabaseTables } from './auth-database-tables.js';
2
- /** Persists and queries sanitized authentication audit events. */
2
+ /**
3
+ * ## DatabaseAuthEventStore
4
+ *
5
+ * Database-backed store for authentication audit events.
6
+ *
7
+ * Responsibilities:
8
+ * - persist authentication audit events
9
+ * - provide filtered and paginated audit queries
10
+ * - map database records to audit event DTOs
11
+ * - isolate audit persistence from the underlying database schema
12
+ *
13
+ * Guarantees:
14
+ * - stores sanitized authentication events only
15
+ * - supports transactional event persistence
16
+ * - remains database-agnostic (SQLite/PostgreSQL)
17
+ *
18
+ * Non-responsibilities:
19
+ * - authentication
20
+ * - authorization policy evaluation
21
+ * - event dispatching
22
+ * - HTTP request handling
23
+ */
3
24
  export class DatabaseAuthEventStore {
25
+ /**
26
+ * Creates a new database-backed authentication audit store.
27
+ *
28
+ * @param db Database abstraction used for persistence.
29
+ * @param tables Optional table name overrides.
30
+ */
4
31
  constructor(db, tables = {}) {
5
32
  this.db = db;
6
33
  this.tables = resolveAuthDatabaseTables(tables);
7
34
  }
35
+ // ---------------------------------------------------------------------
36
+ // Event persistence
37
+ // ---------------------------------------------------------------------
8
38
  async report(event, database = this.db) {
9
39
  await database.run({
10
40
  sql: [
@@ -24,6 +54,9 @@ export class DatabaseAuthEventStore {
24
54
  ],
25
55
  });
26
56
  }
57
+ // ---------------------------------------------------------------------
58
+ // Event queries
59
+ // ---------------------------------------------------------------------
27
60
  async list(input = {}) {
28
61
  return (await this.listPage(input)).events;
29
62
  }
@@ -79,6 +112,9 @@ export class DatabaseAuthEventStore {
79
112
  offset,
80
113
  };
81
114
  }
115
+ // ---------------------------------------------------------------------
116
+ // Utilities
117
+ // ---------------------------------------------------------------------
82
118
  serializeDate(value) {
83
119
  return value instanceof Date ? value.toISOString() : value;
84
120
  }
@@ -1 +1 @@
1
- {"version":3,"file":"database-auth-event-store.js","sourceRoot":"","sources":["../src/database-auth-event-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database-auth-event-store.js","sourceRoot":"","sources":["../src/database-auth-event-store.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,37 @@ import type { AuthUserRepository } from '@kurdel/auth';
2
2
  import type { AuthUser } from '@kurdel/common';
3
3
  import type { Database } from '@kurdel/db';
4
4
  import { type AuthDatabaseTables } from './auth-database-tables.js';
5
+ /**
6
+ * ## DatabaseAuthUserRepository
7
+ *
8
+ * Database-backed repository for authenticated users.
9
+ *
10
+ * Responsibilities:
11
+ * - resolve authenticated users by identifier
12
+ * - load user roles and effective permissions
13
+ * - map database records to `AuthUser`
14
+ * - isolate authentication from the underlying database schema
15
+ *
16
+ * Guarantees:
17
+ * - returns `null` for missing or inactive users
18
+ * - resolves effective permissions from assigned roles
19
+ * - remains database-agnostic (SQLite/PostgreSQL)
20
+ *
21
+ * Non-responsibilities:
22
+ * - user management
23
+ * - role or permission management
24
+ * - authentication workflows
25
+ * - HTTP request handling
26
+ */
5
27
  export declare class DatabaseAuthUserRepository implements AuthUserRepository {
6
28
  private readonly db;
7
29
  private readonly tables;
30
+ /**
31
+ * Creates a new database-backed authenticated user repository.
32
+ *
33
+ * @param db Database abstraction used for persistence.
34
+ * @param tables Optional table name overrides.
35
+ */
8
36
  constructor(db: Database, tables?: Partial<AuthDatabaseTables>);
9
37
  findById(id: string | number): Promise<AuthUser | null>;
10
38
  }
@@ -1,5 +1,33 @@
1
1
  import { resolveAuthDatabaseTables } from './auth-database-tables.js';
2
+ /**
3
+ * ## DatabaseAuthUserRepository
4
+ *
5
+ * Database-backed repository for authenticated users.
6
+ *
7
+ * Responsibilities:
8
+ * - resolve authenticated users by identifier
9
+ * - load user roles and effective permissions
10
+ * - map database records to `AuthUser`
11
+ * - isolate authentication from the underlying database schema
12
+ *
13
+ * Guarantees:
14
+ * - returns `null` for missing or inactive users
15
+ * - resolves effective permissions from assigned roles
16
+ * - remains database-agnostic (SQLite/PostgreSQL)
17
+ *
18
+ * Non-responsibilities:
19
+ * - user management
20
+ * - role or permission management
21
+ * - authentication workflows
22
+ * - HTTP request handling
23
+ */
2
24
  export class DatabaseAuthUserRepository {
25
+ /**
26
+ * Creates a new database-backed authenticated user repository.
27
+ *
28
+ * @param db Database abstraction used for persistence.
29
+ * @param tables Optional table name overrides.
30
+ */
3
31
  constructor(db, tables = {}) {
4
32
  this.db = db;
5
33
  this.tables = resolveAuthDatabaseTables(tables);
@@ -1 +1 @@
1
- {"version":3,"file":"database-auth-user-repository.js","sourceRoot":"","sources":["../src/database-auth-user-repository.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAM/F,MAAM,OAAO,0BAA0B;IAGrC,YACmB,EAAY,EAC7B,SAAsC,EAAE;QADvB,OAAE,GAAF,EAAE,CAAU;QAG7B,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAmB;QAChC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAC9B,GAAG,EAAE,0BAA0B,IAAI,CAAC,MAAM,CAAC,KAAK,gBAAgB;YAChE,MAAM,EAAE,CAAC,EAAE,CAAC;SACb,CAAC,CAA2B,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEnD,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAC/B,GAAG,EAAE;gBACH,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO;gBAClC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC3B,cAAc,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBACrC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK;gBAC/D,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc;gBAC5C,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ;aACtC,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SAClB,CAAC,CAAiB,CAAC;QAEpB,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YACrC,GAAG,EAAE;gBACH,mBAAmB,IAAI,CAAC,MAAM,CAAC,WAAW,OAAO;gBACjD,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACjC,cAAc,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;gBAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,oBAAoB,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK;gBACjF,cAAc,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBACrC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc,IAAI,CAAC,MAAM,CAAC,eAAe,UAAU;gBAC9E,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc;gBAC5C,YAAY,IAAI,CAAC,MAAM,CAAC,WAAW,QAAQ;aAC5C,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SAClB,CAAC,CAAuB,CAAC;QAE1B,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;SAC5D,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"database-auth-user-repository.js","sourceRoot":"","sources":["../src/database-auth-user-repository.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAM/F;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,0BAA0B;IAGrC;;;;;OAKG;IACH,YACmB,EAAY,EAC7B,SAAsC,EAAE;QADvB,OAAE,GAAF,EAAE,CAAU;QAG7B,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAmB;QAChC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAC9B,GAAG,EAAE,0BAA0B,IAAI,CAAC,MAAM,CAAC,KAAK,gBAAgB;YAChE,MAAM,EAAE,CAAC,EAAE,CAAC;SACb,CAAC,CAA2B,CAAC;QAC9B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEnD,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAC/B,GAAG,EAAE;gBACH,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO;gBAClC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC3B,cAAc,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBACrC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK;gBAC/D,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc;gBAC5C,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ;aACtC,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SAClB,CAAC,CAAiB,CAAC;QAEpB,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YACrC,GAAG,EAAE;gBACH,mBAAmB,IAAI,CAAC,MAAM,CAAC,WAAW,OAAO;gBACjD,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACjC,cAAc,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;gBAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,oBAAoB,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK;gBACjF,cAAc,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBACrC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc,IAAI,CAAC,MAAM,CAAC,eAAe,UAAU;gBAC9E,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,cAAc;gBAC5C,YAAY,IAAI,CAAC,MAAM,CAAC,WAAW,QAAQ;aAC5C,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SAClB,CAAC,CAAuB,CAAC;QAE1B,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;SAC5D,CAAC;IACJ,CAAC;CACF"}
@@ -1,10 +1,36 @@
1
1
  import type { JwtSession, JwtSessionRepository } from '@kurdel/auth';
2
2
  import type { Database } from '@kurdel/db';
3
3
  import { type AuthDatabaseTables } from './auth-database-tables.js';
4
- /** Resolves persisted JWT sessions for token revocation checks. */
4
+ /**
5
+ * ## DatabaseJwtSessionRepository
6
+ *
7
+ * Database-backed repository for persisted JWT sessions.
8
+ *
9
+ * Responsibilities:
10
+ * - resolve JWT sessions by identifier
11
+ * - map database records to `JwtSession`
12
+ * - isolate JWT validation from the underlying database schema
13
+ *
14
+ * Guarantees:
15
+ * - returns `null` when the session does not exist
16
+ * - exposes session revocation and expiration state
17
+ * - remains database-agnostic (SQLite/PostgreSQL)
18
+ *
19
+ * Non-responsibilities:
20
+ * - session creation or revocation
21
+ * - refresh token management
22
+ * - JWT signing or verification
23
+ * - HTTP request handling
24
+ */
5
25
  export declare class DatabaseJwtSessionRepository implements JwtSessionRepository {
6
26
  private readonly db;
7
27
  private readonly tables;
28
+ /**
29
+ * Creates a new database-backed JWT session repository.
30
+ *
31
+ * @param db Database abstraction used for persistence.
32
+ * @param tables Optional table name overrides.
33
+ */
8
34
  constructor(db: Database, tables?: Partial<AuthDatabaseTables>);
9
35
  findById(id: string): Promise<JwtSession | null>;
10
36
  }
@@ -1,6 +1,32 @@
1
1
  import { resolveAuthDatabaseTables } from './auth-database-tables.js';
2
- /** Resolves persisted JWT sessions for token revocation checks. */
2
+ /**
3
+ * ## DatabaseJwtSessionRepository
4
+ *
5
+ * Database-backed repository for persisted JWT sessions.
6
+ *
7
+ * Responsibilities:
8
+ * - resolve JWT sessions by identifier
9
+ * - map database records to `JwtSession`
10
+ * - isolate JWT validation from the underlying database schema
11
+ *
12
+ * Guarantees:
13
+ * - returns `null` when the session does not exist
14
+ * - exposes session revocation and expiration state
15
+ * - remains database-agnostic (SQLite/PostgreSQL)
16
+ *
17
+ * Non-responsibilities:
18
+ * - session creation or revocation
19
+ * - refresh token management
20
+ * - JWT signing or verification
21
+ * - HTTP request handling
22
+ */
3
23
  export class DatabaseJwtSessionRepository {
24
+ /**
25
+ * Creates a new database-backed JWT session repository.
26
+ *
27
+ * @param db Database abstraction used for persistence.
28
+ * @param tables Optional table name overrides.
29
+ */
4
30
  constructor(db, tables = {}) {
5
31
  this.db = db;
6
32
  this.tables = resolveAuthDatabaseTables(tables);
@@ -1 +1 @@
1
- {"version":3,"file":"database-jwt-session-repository.js","sourceRoot":"","sources":["../src/database-jwt-session-repository.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAS/F,mEAAmE;AACnE,MAAM,OAAO,4BAA4B;IAGvC,YACmB,EAAY,EAC7B,SAAsC,EAAE;QADvB,OAAE,GAAF,EAAE,CAAU;QAG7B,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAC/B,GAAG,EAAE;gBACH,wCAAwC;gBACxC,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,gBAAgB;aAChD,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,CAAC,EAAE,CAAC;SACb,CAAiC,CAAC;QACnC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,MAAM,EAAE,MAAM,CAAC,OAAO;YACtB,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,QAAQ;YACnC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"database-jwt-session-repository.js","sourceRoot":"","sources":["../src/database-jwt-session-repository.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAA2B,MAAM,2BAA2B,CAAC;AAS/F;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,4BAA4B;IAGvC;;;;;OAKG;IACH,YACmB,EAAY,EAC7B,SAAsC,EAAE;QADvB,OAAE,GAAF,EAAE,CAAU;QAG7B,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;YAC/B,GAAG,EAAE;gBACH,wCAAwC;gBACxC,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,gBAAgB;aAChD,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,CAAC,EAAE,CAAC;SACb,CAAiC,CAAC;QACnC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,MAAM,EAAE,MAAM,CAAC,OAAO;YACtB,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,QAAQ;YACnC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACJ,CAAC;CACF"}
@@ -9,6 +9,18 @@ export type CreatedJwtSession = {
9
9
  userId: number;
10
10
  expiresAt: string;
11
11
  };
12
+ export type CreatedRefreshableJwtSession = CreatedJwtSession & {
13
+ refreshToken: string;
14
+ refreshExpiresAt: string;
15
+ };
16
+ export type RefreshedJwtSession = CreatedRefreshableJwtSession;
17
+ export type JwtSessionSummary = {
18
+ id: string;
19
+ userId: number;
20
+ status: 'active' | 'revoked' | 'expired';
21
+ expiresAt: string;
22
+ createdAt: string;
23
+ };
12
24
  export declare class JwtSessionNotFoundError extends Error {
13
25
  readonly userId: number;
14
26
  readonly sessionId: string;
@@ -18,14 +30,56 @@ export declare class ActiveJwtSessionUserNotFoundError extends Error {
18
30
  readonly userId: number;
19
31
  constructor(userId: number);
20
32
  }
21
- /** Creates and revokes the server-side state referenced by JWT `jti` claims. */
33
+ export declare class InvalidRefreshTokenError extends Error {
34
+ constructor();
35
+ }
36
+ /**
37
+ * ## DatabaseJwtSessionService
38
+ *
39
+ * Application service responsible for managing persistent JWT sessions
40
+ * backed by a relational database through the `Database` abstraction.
41
+ *
42
+ * Responsibilities:
43
+ * - create server-side JWT sessions
44
+ * - issue and rotate refresh tokens
45
+ * - list active and historical sessions
46
+ * - revoke individual or all user sessions
47
+ * - emit JWT session audit events
48
+ *
49
+ * Guarantees:
50
+ * - validates that sessions belong to active users
51
+ * - stores refresh tokens as SHA-256 hashes only
52
+ * - rotates refresh tokens atomically
53
+ * - performs all state changes inside database transactions
54
+ * - remains database-agnostic (SQLite/PostgreSQL)
55
+ *
56
+ * Non-responsibilities:
57
+ * - JWT signing or verification
58
+ * - access token generation
59
+ * - authorization policy evaluation
60
+ * - HTTP request handling
61
+ */
22
62
  export declare class DatabaseJwtSessionService {
23
63
  private readonly db;
24
64
  private readonly events?;
25
65
  private readonly now;
26
66
  private readonly tables;
67
+ /**
68
+ * Creates a new database-backed JWT session service.
69
+ *
70
+ * @param db Database abstraction used for persistence.
71
+ * @param tables Optional table name overrides.
72
+ * @param events Optional transactional audit event sink.
73
+ * @param now Time provider used for expiration checks and timestamps.
74
+ */
27
75
  constructor(db: Database, tables?: Partial<AuthDatabaseTables>, events?: TransactionalAuthEventSink | undefined, now?: () => Date);
28
76
  create(userId: number, expiresAt: Date): Promise<CreatedJwtSession>;
77
+ createRefreshable(userId: number, refreshExpiresAt: Date): Promise<CreatedRefreshableJwtSession>;
78
+ refresh(refreshToken: string): Promise<RefreshedJwtSession>;
79
+ list(userId: number): Promise<JwtSessionSummary[]>;
80
+ revokeAll(userId: number): Promise<void>;
29
81
  revoke(userId: number, sessionId: string): Promise<void>;
82
+ private generateRefreshToken;
83
+ private hashRefreshToken;
30
84
  }
31
85
  export {};