@warlock.js/auth 4.0.47 → 4.0.58

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 (165) hide show
  1. package/cjs/commands/auth-cleanup-command.d.ts +10 -0
  2. package/cjs/commands/auth-cleanup-command.d.ts.map +1 -0
  3. package/cjs/commands/auth-cleanup-command.js +29 -0
  4. package/cjs/commands/auth-cleanup-command.js.map +1 -0
  5. package/cjs/commands/jwt-secret-generator-command.d.ts +2 -0
  6. package/cjs/commands/jwt-secret-generator-command.d.ts.map +1 -0
  7. package/cjs/commands/jwt-secret-generator-command.js +7 -0
  8. package/cjs/commands/jwt-secret-generator-command.js.map +1 -0
  9. package/cjs/contracts/auth-contract.d.ts +23 -0
  10. package/cjs/contracts/auth-contract.d.ts.map +1 -0
  11. package/cjs/contracts/index.d.ts +3 -0
  12. package/cjs/contracts/index.d.ts.map +1 -0
  13. package/cjs/contracts/types.d.ts +157 -0
  14. package/cjs/contracts/types.d.ts.map +1 -0
  15. package/cjs/contracts/types.js +20 -0
  16. package/cjs/contracts/types.js.map +1 -0
  17. package/cjs/index.d.ts +8 -0
  18. package/cjs/index.d.ts.map +1 -0
  19. package/cjs/index.js +1 -56
  20. package/cjs/index.js.map +1 -1
  21. package/cjs/middleware/auth.middleware.d.ts +2 -0
  22. package/cjs/middleware/auth.middleware.d.ts.map +1 -0
  23. package/cjs/middleware/auth.middleware.js +72 -0
  24. package/cjs/middleware/auth.middleware.js.map +1 -0
  25. package/cjs/middleware/index.d.ts +2 -0
  26. package/cjs/middleware/index.d.ts.map +1 -0
  27. package/cjs/models/access-token/access-token.d.ts +9 -0
  28. package/cjs/models/access-token/access-token.d.ts.map +1 -0
  29. package/cjs/models/access-token/access-token.js +18 -0
  30. package/cjs/models/access-token/access-token.js.map +1 -0
  31. package/cjs/models/access-token/index.d.ts +3 -0
  32. package/cjs/models/access-token/index.d.ts.map +1 -0
  33. package/cjs/models/access-token/migration.d.ts +3 -0
  34. package/cjs/models/access-token/migration.d.ts.map +1 -0
  35. package/cjs/models/access-token/migration.js +10 -0
  36. package/cjs/models/access-token/migration.js.map +1 -0
  37. package/cjs/models/auth.d.ts +54 -0
  38. package/cjs/models/auth.d.ts.map +1 -0
  39. package/cjs/models/auth.js +56 -0
  40. package/cjs/models/auth.js.map +1 -0
  41. package/cjs/models/casts/cast-password.d.ts +7 -0
  42. package/cjs/models/casts/cast-password.d.ts.map +1 -0
  43. package/cjs/models/casts/index.d.ts +2 -0
  44. package/cjs/models/casts/index.d.ts.map +1 -0
  45. package/cjs/models/index.d.ts +4 -0
  46. package/cjs/models/index.d.ts.map +1 -0
  47. package/cjs/models/refresh-token/index.d.ts +2 -0
  48. package/cjs/models/refresh-token/index.d.ts.map +1 -0
  49. package/cjs/models/refresh-token/migration.d.ts +3 -0
  50. package/cjs/models/refresh-token/migration.d.ts.map +1 -0
  51. package/cjs/models/refresh-token/refresh-token.d.ts +32 -0
  52. package/cjs/models/refresh-token/refresh-token.d.ts.map +1 -0
  53. package/cjs/models/refresh-token/refresh-token.js +53 -0
  54. package/cjs/models/refresh-token/refresh-token.js.map +1 -0
  55. package/cjs/services/auth-events.d.ts +85 -0
  56. package/cjs/services/auth-events.d.ts.map +1 -0
  57. package/cjs/services/auth-events.js +65 -0
  58. package/cjs/services/auth-events.js.map +1 -0
  59. package/cjs/services/auth.service.d.ts +91 -0
  60. package/cjs/services/auth.service.d.ts.map +1 -0
  61. package/cjs/services/auth.service.js +303 -0
  62. package/cjs/services/auth.service.js.map +1 -0
  63. package/cjs/services/generate-jwt-secret.d.ts +2 -0
  64. package/cjs/services/generate-jwt-secret.d.ts.map +1 -0
  65. package/cjs/services/generate-jwt-secret.js +47 -0
  66. package/cjs/services/generate-jwt-secret.js.map +1 -0
  67. package/cjs/services/index.d.ts +5 -0
  68. package/cjs/services/index.d.ts.map +1 -0
  69. package/cjs/services/jwt.d.ts +23 -0
  70. package/cjs/services/jwt.d.ts.map +1 -0
  71. package/cjs/services/jwt.js +39 -0
  72. package/cjs/services/jwt.js.map +1 -0
  73. package/cjs/utils/auth-error-codes.d.ts +18 -0
  74. package/cjs/utils/auth-error-codes.d.ts.map +1 -0
  75. package/cjs/utils/auth-error-codes.js +18 -0
  76. package/cjs/utils/auth-error-codes.js.map +1 -0
  77. package/cjs/utils/duration.d.ts +45 -0
  78. package/cjs/utils/duration.d.ts.map +1 -0
  79. package/cjs/utils/duration.js +93 -0
  80. package/cjs/utils/duration.js.map +1 -0
  81. package/cjs/utils/index.d.ts +3 -0
  82. package/cjs/utils/index.d.ts.map +1 -0
  83. package/esm/commands/auth-cleanup-command.d.ts +10 -0
  84. package/esm/commands/auth-cleanup-command.d.ts.map +1 -0
  85. package/esm/commands/auth-cleanup-command.js +29 -0
  86. package/esm/commands/auth-cleanup-command.js.map +1 -0
  87. package/esm/commands/jwt-secret-generator-command.d.ts +2 -0
  88. package/esm/commands/jwt-secret-generator-command.d.ts.map +1 -0
  89. package/esm/commands/jwt-secret-generator-command.js +7 -0
  90. package/esm/commands/jwt-secret-generator-command.js.map +1 -0
  91. package/esm/contracts/auth-contract.d.ts +23 -0
  92. package/esm/contracts/auth-contract.d.ts.map +1 -0
  93. package/esm/contracts/index.d.ts +3 -0
  94. package/esm/contracts/index.d.ts.map +1 -0
  95. package/esm/contracts/types.d.ts +157 -0
  96. package/esm/contracts/types.d.ts.map +1 -0
  97. package/esm/contracts/types.js +20 -0
  98. package/esm/contracts/types.js.map +1 -0
  99. package/esm/index.d.ts +8 -0
  100. package/esm/index.d.ts.map +1 -0
  101. package/esm/index.js +1 -9
  102. package/esm/index.js.map +1 -1
  103. package/esm/middleware/auth.middleware.d.ts +2 -0
  104. package/esm/middleware/auth.middleware.d.ts.map +1 -0
  105. package/esm/middleware/auth.middleware.js +72 -0
  106. package/esm/middleware/auth.middleware.js.map +1 -0
  107. package/esm/middleware/index.d.ts +2 -0
  108. package/esm/middleware/index.d.ts.map +1 -0
  109. package/esm/models/access-token/access-token.d.ts +9 -0
  110. package/esm/models/access-token/access-token.d.ts.map +1 -0
  111. package/esm/models/access-token/access-token.js +18 -0
  112. package/esm/models/access-token/access-token.js.map +1 -0
  113. package/esm/models/access-token/index.d.ts +3 -0
  114. package/esm/models/access-token/index.d.ts.map +1 -0
  115. package/esm/models/access-token/migration.d.ts +3 -0
  116. package/esm/models/access-token/migration.d.ts.map +1 -0
  117. package/esm/models/access-token/migration.js +10 -0
  118. package/esm/models/access-token/migration.js.map +1 -0
  119. package/esm/models/auth.d.ts +54 -0
  120. package/esm/models/auth.d.ts.map +1 -0
  121. package/esm/models/auth.js +56 -0
  122. package/esm/models/auth.js.map +1 -0
  123. package/esm/models/casts/cast-password.d.ts +7 -0
  124. package/esm/models/casts/cast-password.d.ts.map +1 -0
  125. package/esm/models/casts/index.d.ts +2 -0
  126. package/esm/models/casts/index.d.ts.map +1 -0
  127. package/esm/models/index.d.ts +4 -0
  128. package/esm/models/index.d.ts.map +1 -0
  129. package/esm/models/refresh-token/index.d.ts +2 -0
  130. package/esm/models/refresh-token/index.d.ts.map +1 -0
  131. package/esm/models/refresh-token/migration.d.ts +3 -0
  132. package/esm/models/refresh-token/migration.d.ts.map +1 -0
  133. package/esm/models/refresh-token/refresh-token.d.ts +32 -0
  134. package/esm/models/refresh-token/refresh-token.d.ts.map +1 -0
  135. package/esm/models/refresh-token/refresh-token.js +53 -0
  136. package/esm/models/refresh-token/refresh-token.js.map +1 -0
  137. package/esm/services/auth-events.d.ts +85 -0
  138. package/esm/services/auth-events.d.ts.map +1 -0
  139. package/esm/services/auth-events.js +65 -0
  140. package/esm/services/auth-events.js.map +1 -0
  141. package/esm/services/auth.service.d.ts +91 -0
  142. package/esm/services/auth.service.d.ts.map +1 -0
  143. package/esm/services/auth.service.js +303 -0
  144. package/esm/services/auth.service.js.map +1 -0
  145. package/esm/services/generate-jwt-secret.d.ts +2 -0
  146. package/esm/services/generate-jwt-secret.d.ts.map +1 -0
  147. package/esm/services/generate-jwt-secret.js +47 -0
  148. package/esm/services/generate-jwt-secret.js.map +1 -0
  149. package/esm/services/index.d.ts +5 -0
  150. package/esm/services/index.d.ts.map +1 -0
  151. package/esm/services/jwt.d.ts +23 -0
  152. package/esm/services/jwt.d.ts.map +1 -0
  153. package/esm/services/jwt.js +39 -0
  154. package/esm/services/jwt.js.map +1 -0
  155. package/esm/utils/auth-error-codes.d.ts +18 -0
  156. package/esm/utils/auth-error-codes.d.ts.map +1 -0
  157. package/esm/utils/auth-error-codes.js +18 -0
  158. package/esm/utils/auth-error-codes.js.map +1 -0
  159. package/esm/utils/duration.d.ts +45 -0
  160. package/esm/utils/duration.d.ts.map +1 -0
  161. package/esm/utils/duration.js +93 -0
  162. package/esm/utils/duration.js.map +1 -0
  163. package/esm/utils/index.d.ts +3 -0
  164. package/esm/utils/index.d.ts.map +1 -0
  165. package/package.json +35 -48
@@ -0,0 +1,2 @@
1
+ export * from "./cast-password";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/casts/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./access-token";
2
+ export * from "./auth";
3
+ export * from "./refresh-token";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./refresh-token";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/migration.ts"],"names":[],"mappings":";AAGA,wBAcG"}
@@ -0,0 +1,32 @@
1
+ import { Model } from "@warlock.js/cascade";
2
+ export declare class RefreshToken extends Model {
3
+ /**
4
+ * {@inheritDoc}
5
+ */
6
+ static table: string;
7
+ /**
8
+ * {@inheritDoc}
9
+ */
10
+ static schema: any;
11
+ /**
12
+ * Check if token is expired
13
+ */
14
+ get isExpired(): boolean;
15
+ /**
16
+ * Check if token is revoked
17
+ */
18
+ get isRevoked(): boolean;
19
+ /**
20
+ * Check if token is valid (not expired and not revoked)
21
+ */
22
+ get isValid(): boolean;
23
+ /**
24
+ * Revoke this token
25
+ */
26
+ revoke(): Promise<this>;
27
+ /**
28
+ * Mark token as used (update lastUsedAt)
29
+ */
30
+ markAsUsed(): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=refresh-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/refresh-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAc5C,qBAAa,YAAa,SAAQ,KAAK;IACrC;;OAEG;IACH,OAAc,KAAK,SAAmB;IAEtC;;OAEG;IACH,OAAc,MAAM,MAAsB;IAE1C;;OAEG;IACH,IAAW,SAAS,IAAI,OAAO,CAI9B;IAED;;OAEG;IACH,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED;;OAEG;IACH,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED;;OAEG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGzC"}
@@ -0,0 +1,53 @@
1
+ import {Model}from'@warlock.js/cascade';import {v}from'@warlock.js/seal';const refreshTokenSchema = v.object({
2
+ token: v.string().required(),
3
+ userId: v.number().required(),
4
+ userType: v.string().required(),
5
+ familyId: v.string().required(),
6
+ expiresAt: v.date().required(),
7
+ lastUsedAt: v.date().default(() => new Date()),
8
+ revokedAt: v.date(),
9
+ deviceInfo: v.record(v.any()),
10
+ });
11
+ class RefreshToken extends Model {
12
+ /**
13
+ * {@inheritDoc}
14
+ */
15
+ static table = "refreshTokens";
16
+ /**
17
+ * {@inheritDoc}
18
+ */
19
+ static schema = refreshTokenSchema;
20
+ /**
21
+ * Check if token is expired
22
+ */
23
+ get isExpired() {
24
+ const expiresAt = this.get("expiresAt");
25
+ if (!expiresAt)
26
+ return false;
27
+ return new Date() > new Date(expiresAt);
28
+ }
29
+ /**
30
+ * Check if token is revoked
31
+ */
32
+ get isRevoked() {
33
+ return !!this.get("revokedAt");
34
+ }
35
+ /**
36
+ * Check if token is valid (not expired and not revoked)
37
+ */
38
+ get isValid() {
39
+ return !this.isExpired && !this.isRevoked;
40
+ }
41
+ /**
42
+ * Revoke this token
43
+ */
44
+ async revoke() {
45
+ return this.merge({ revokedAt: new Date() }).save();
46
+ }
47
+ /**
48
+ * Mark token as used (update lastUsedAt)
49
+ */
50
+ async markAsUsed() {
51
+ await this.merge({ lastUsedAt: new Date() }).save();
52
+ }
53
+ }export{RefreshToken};//# sourceMappingURL=refresh-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.js","sources":["../../../src/models/refresh-token/refresh-token.ts"],"sourcesContent":[null],"names":[],"mappings":"yEAGA,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;AAClC,IAAA,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC5B,IAAA,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC7B,IAAA,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC/B,IAAA,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC/B,IAAA,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;AAC9B,IAAA,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;AAC9C,IAAA,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;IACnB,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC9B,CAAA,CAAC,CAAC;AAEG,MAAO,YAAa,SAAQ,KAAK,CAAA;AACrC;;AAEG;AACI,IAAA,OAAO,KAAK,GAAG,eAAe,CAAC;AAEtC;;AAEG;AACI,IAAA,OAAO,MAAM,GAAG,kBAAkB,CAAC;AAE1C;;AAEG;AACH,IAAA,IAAW,SAAS,GAAA;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,KAAK,CAAC;QAC7B,OAAO,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;KACzC;AAED;;AAEG;AACH,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;KAChC;AAED;;AAEG;AACH,IAAA,IAAW,OAAO,GAAA;QAChB,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;KAC3C;AAED;;AAEG;AACI,IAAA,MAAM,MAAM,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;KACrD;AAED;;AAEG;AACI,IAAA,MAAM,UAAU,GAAA;AACrB,QAAA,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;KACrD;"}
@@ -0,0 +1,85 @@
1
+ import { type EventSubscription } from "@mongez/events";
2
+ import type { DeviceInfo, TokenPair } from "../contracts/types";
3
+ import type { Auth } from "../models/auth";
4
+ import type { RefreshToken } from "../models/refresh-token";
5
+ /**
6
+ * Auth event payload types
7
+ */
8
+ export type AuthEventPayloads = {
9
+ "login.success": [user: Auth, tokenPair: TokenPair, deviceInfo?: DeviceInfo];
10
+ "login.failed": [credentials: {
11
+ email?: string;
12
+ username?: string;
13
+ }, reason: string];
14
+ "login.attempt": [credentials: {
15
+ email?: string;
16
+ username?: string;
17
+ }];
18
+ logout: [user: Auth];
19
+ "logout.all": [user: Auth];
20
+ "logout.failsafe": [user: Auth];
21
+ "token.created": [user: Auth, tokenPair: TokenPair];
22
+ "token.refreshed": [user: Auth, newTokenPair: TokenPair, oldRefreshToken: RefreshToken];
23
+ "token.revoked": [user: Auth, token: RefreshToken];
24
+ "token.expired": [token: RefreshToken];
25
+ "token.familyRevoked": [familyId: string, tokens: RefreshToken[]];
26
+ "password.changed": [user: Auth];
27
+ "password.resetRequested": [user: Auth, resetToken: string];
28
+ "password.reset": [user: Auth];
29
+ "session.created": [user: Auth, refreshToken: RefreshToken, deviceInfo?: DeviceInfo];
30
+ "session.destroyed": [user: Auth, refreshToken: RefreshToken];
31
+ "cleanup.completed": [expiredCount: number];
32
+ };
33
+ /**
34
+ * Auth event names
35
+ */
36
+ export type AuthEventName = keyof AuthEventPayloads;
37
+ /**
38
+ * Callback type for a specific event
39
+ */
40
+ export type AuthEventCallback<T extends AuthEventName> = (...args: AuthEventPayloads[T]) => void | Promise<void>;
41
+ /**
42
+ * Type-safe auth events manager
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * // Subscribe to events with full autocomplete
47
+ * authEvents.on("login.success", (user, tokenPair, deviceInfo) => {
48
+ * console.log(`User ${user.id} logged in`);
49
+ * });
50
+ *
51
+ * authEvents.on("token.refreshed", (user, newPair, oldToken) => {
52
+ * console.log(`Token refreshed for user ${user.id}`);
53
+ * });
54
+ *
55
+ * // Trigger events
56
+ * authEvents.emit("login.success", user, tokenPair, deviceInfo);
57
+ * ```
58
+ */
59
+ export declare const authEvents: {
60
+ /**
61
+ * Subscribe to an auth event
62
+ */
63
+ on<T extends keyof AuthEventPayloads>(event: T, callback: AuthEventCallback<T>): EventSubscription;
64
+ /**
65
+ * Subscribe to an auth event (alias for `on`)
66
+ */
67
+ subscribe<T_1 extends keyof AuthEventPayloads>(event: T_1, callback: AuthEventCallback<T_1>): EventSubscription;
68
+ /**
69
+ * Emit an auth event
70
+ */
71
+ emit<T_2 extends keyof AuthEventPayloads>(event: T_2, ...args: AuthEventPayloads[T_2]): void;
72
+ /**
73
+ * Emit an auth event (alias for `emit`)
74
+ */
75
+ trigger<T_3 extends keyof AuthEventPayloads>(event: T_3, ...args: AuthEventPayloads[T_3]): void;
76
+ /**
77
+ * Unsubscribe from all auth events
78
+ */
79
+ unsubscribeAll(): void;
80
+ /**
81
+ * Unsubscribe from a specific auth event
82
+ */
83
+ off(event?: AuthEventName): void;
84
+ };
85
+ //# sourceMappingURL=auth-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-events.d.ts","sourceRoot":"","sources":["../../src/services/auth-events.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAE9B,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7E,cAAc,EAAE,CAAC,WAAW,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACrF,eAAe,EAAE,CAAC,WAAW,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAGtE,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3B,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAGhC,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACpD,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;IACxF,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IACnD,eAAe,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACvC,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAGlE,kBAAkB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,yBAAyB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5D,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAG/B,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IACrF,mBAAmB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IAG9D,mBAAmB,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;CAC7C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC;AAEpD;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,aAAa,IAAI,CACvD,GAAG,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAC1B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAO1B;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,UAAU;IACrB;;OAEG;qFACoE,iBAAiB;IAIxF;;OAEG;kGAC2E,iBAAiB;IAI/F;;OAEG;4FACqE,IAAI;IAI5E;;OAEG;+FACwE,IAAI;IAI/E;;OAEG;sBACe,IAAI;IAItB;;OAEG;gBACS,aAAa,GAAG,IAAI;CAOjC,CAAC"}
@@ -0,0 +1,65 @@
1
+ import events from'@mongez/events';/**
2
+ * Event namespace prefix for auth events
3
+ */
4
+ const AUTH_EVENT_PREFIX = "auth.";
5
+ /**
6
+ * Type-safe auth events manager
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // Subscribe to events with full autocomplete
11
+ * authEvents.on("login.success", (user, tokenPair, deviceInfo) => {
12
+ * console.log(`User ${user.id} logged in`);
13
+ * });
14
+ *
15
+ * authEvents.on("token.refreshed", (user, newPair, oldToken) => {
16
+ * console.log(`Token refreshed for user ${user.id}`);
17
+ * });
18
+ *
19
+ * // Trigger events
20
+ * authEvents.emit("login.success", user, tokenPair, deviceInfo);
21
+ * ```
22
+ */
23
+ const authEvents = {
24
+ /**
25
+ * Subscribe to an auth event
26
+ */
27
+ on(event, callback) {
28
+ return events.subscribe(AUTH_EVENT_PREFIX + event, callback);
29
+ },
30
+ /**
31
+ * Subscribe to an auth event (alias for `on`)
32
+ */
33
+ subscribe(event, callback) {
34
+ return this.on(event, callback);
35
+ },
36
+ /**
37
+ * Emit an auth event
38
+ */
39
+ emit(event, ...args) {
40
+ events.trigger(AUTH_EVENT_PREFIX + event, ...args);
41
+ },
42
+ /**
43
+ * Emit an auth event (alias for `emit`)
44
+ */
45
+ trigger(event, ...args) {
46
+ this.emit(event, ...args);
47
+ },
48
+ /**
49
+ * Unsubscribe from all auth events
50
+ */
51
+ unsubscribeAll() {
52
+ events.unsubscribeNamespace(AUTH_EVENT_PREFIX.slice(0, -1));
53
+ },
54
+ /**
55
+ * Unsubscribe from a specific auth event
56
+ */
57
+ off(event) {
58
+ if (event) {
59
+ events.unsubscribe(AUTH_EVENT_PREFIX + event);
60
+ }
61
+ else {
62
+ this.unsubscribeAll();
63
+ }
64
+ },
65
+ };export{authEvents};//# sourceMappingURL=auth-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-events.js","sources":["../../src/services/auth-events.ts"],"sourcesContent":[null],"names":[],"mappings":"mCAmDA;;AAEG;AACH,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAElC;;;;;;;;;;;;;;;;;AAiBG;AACU,MAAA,UAAU,GAAG;AACxB;;AAEG;IACH,EAAE,CAA0B,KAAQ,EAAE,QAA8B,EAAA;QAClE,OAAO,MAAM,CAAC,SAAS,CAAC,iBAAiB,GAAG,KAAK,EAAE,QAAoB,CAAC,CAAC;KAC1E;AAED;;AAEG;IACH,SAAS,CAA0B,KAAQ,EAAE,QAA8B,EAAA;QACzE,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;KACjC;AAED;;AAEG;AACH,IAAA,IAAI,CAA0B,KAAQ,EAAE,GAAG,IAA0B,EAAA;QACnE,MAAM,CAAC,OAAO,CAAC,iBAAiB,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;KACpD;AAED;;AAEG;AACH,IAAA,OAAO,CAA0B,KAAQ,EAAE,GAAG,IAA0B,EAAA;QACtE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;KAC3B;AAED;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,MAAM,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAC7D;AAED;;AAEG;AACH,IAAA,GAAG,CAAC,KAAqB,EAAA;AACvB,QAAA,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,CAAC,WAAW,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC;AAC/C,SAAA;AAAM,aAAA;YACL,IAAI,CAAC,cAAc,EAAE,CAAC;AACvB,SAAA;KACF;"}
@@ -0,0 +1,91 @@
1
+ import type { ChildModel } from "@warlock.js/cascade";
2
+ import type { DeviceInfo, TokenPair } from "../contracts/types";
3
+ import type { Auth } from "../models/auth";
4
+ import { RefreshToken } from "../models/refresh-token";
5
+ declare class AuthService {
6
+ /**
7
+ * Build access token payload from user
8
+ */
9
+ buildAccessTokenPayload(user: Auth): {
10
+ id: any;
11
+ _id: any;
12
+ userType: string;
13
+ createdAt: number;
14
+ };
15
+ /**
16
+ * Generate access token for user
17
+ */
18
+ generateAccessToken(user: Auth, payload?: any): Promise<string>;
19
+ /**
20
+ * Create refresh token for user
21
+ */
22
+ createRefreshToken(user: Auth, deviceInfo?: DeviceInfo): Promise<RefreshToken>;
23
+ /**
24
+ * Create both access and refresh tokens
25
+ */
26
+ createTokenPair(user: Auth, deviceInfo?: DeviceInfo): Promise<TokenPair>;
27
+ /**
28
+ * Refresh tokens using a refresh token
29
+ */
30
+ refreshTokens(refreshTokenString: string, deviceInfo?: DeviceInfo): Promise<TokenPair | null>;
31
+ /**
32
+ * Verify password
33
+ */
34
+ verifyPassword(hashedPassword: string, plainPassword: string): boolean;
35
+ /**
36
+ * Hash password
37
+ */
38
+ hashPassword(password: string): string;
39
+ /**
40
+ * Attempt to login user with given credentials
41
+ */
42
+ attemptLogin(Model: ChildModel<Auth>, data: any): Promise<Auth | null>;
43
+ /**
44
+ * Full login flow: validate credentials, create tokens, emit events
45
+ * Returns token pair on success, null on failure
46
+ */
47
+ login(Model: ChildModel<Auth>, credentials: any, deviceInfo?: DeviceInfo): Promise<{
48
+ user: Auth;
49
+ tokens: TokenPair;
50
+ } | null | {
51
+ user: Auth;
52
+ accessToken: string;
53
+ }>;
54
+ /**
55
+ * Logout user
56
+ * @param user - The authenticated user
57
+ * @param accessToken - Optional access token string to revoke
58
+ * @param refreshToken - Optional refresh token string to revoke
59
+ * If refresh token is not provided, behavior is determined by config:
60
+ * - "revoke-all" (default): Revoke ALL refresh tokens for security
61
+ * - "error": Throw error requiring refresh token
62
+ */
63
+ logout(user: Auth, accessToken?: string, refreshToken?: string): Promise<void>;
64
+ /**
65
+ * Remove specific access token
66
+ */
67
+ removeAccessToken(user: Auth, token: string): Promise<void>;
68
+ /**
69
+ * Revoke all tokens for a user
70
+ */
71
+ revokeAllTokens(user: Auth): Promise<void>;
72
+ /**
73
+ * Revoke entire token family (for rotation breach detection)
74
+ */
75
+ revokeTokenFamily(familyId: string): Promise<void>;
76
+ /**
77
+ * Cleanup expired tokens
78
+ */
79
+ cleanupExpiredTokens(): Promise<number>;
80
+ /**
81
+ * Enforce max refresh tokens per user
82
+ */
83
+ private enforceMaxRefreshTokens;
84
+ /**
85
+ * Get active sessions for user
86
+ */
87
+ getActiveSessions(user: Auth): Promise<RefreshToken[]>;
88
+ }
89
+ export declare const authService: AuthService;
90
+ export {};
91
+ //# sourceMappingURL=auth.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAKvD,cAAM,WAAW;IACf;;OAEG;IACI,uBAAuB,CAAC,IAAI,EAAE,IAAI;;;;;;IASzC;;OAEG;IACU,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB5E;;OAEG;IACU,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAsC3F;;OAEG;IACU,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAiBrF;;OAEG;IACU,aAAa,CACxB,kBAAkB,EAAE,MAAM,EAC1B,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAoD5B;;OAEG;IACI,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAI7E;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI7C;;OAEG;IACU,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAqBnF;;;OAGG;IACU,KAAK,CAChB,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,EACvB,WAAW,EAAE,GAAG,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAqB1F;;;;;;;;OAQG;IACU,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC3F;;OAEG;IACU,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxE;;OAEG;IACU,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBvD;;OAEG;IACU,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/D;;OAEG;IACU,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAcpD;;OAEG;YACW,uBAAuB;IAmBrC;;OAEG;IACU,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CASpE;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}