@warlock.js/auth 4.0.161 → 4.0.163

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 (83) hide show
  1. package/esm/commands/auth-cleanup-command.d.ts +10 -0
  2. package/esm/commands/auth-cleanup-command.d.ts.map +1 -0
  3. package/esm/commands/auth-cleanup-command.js +29 -0
  4. package/esm/commands/auth-cleanup-command.js.map +1 -0
  5. package/esm/commands/jwt-secret-generator-command.d.ts +2 -0
  6. package/esm/commands/jwt-secret-generator-command.d.ts.map +1 -0
  7. package/esm/commands/jwt-secret-generator-command.js +7 -0
  8. package/esm/commands/jwt-secret-generator-command.js.map +1 -0
  9. package/esm/contracts/auth-contract.d.ts +23 -0
  10. package/esm/contracts/auth-contract.d.ts.map +1 -0
  11. package/esm/contracts/index.d.ts +3 -0
  12. package/esm/contracts/index.d.ts.map +1 -0
  13. package/esm/contracts/types.d.ts +167 -0
  14. package/esm/contracts/types.d.ts.map +1 -0
  15. package/esm/contracts/types.js +20 -0
  16. package/esm/contracts/types.js.map +1 -0
  17. package/esm/index.d.ts +8 -0
  18. package/esm/index.d.ts.map +1 -0
  19. package/esm/index.js +1 -0
  20. package/esm/index.js.map +1 -0
  21. package/esm/middleware/auth.middleware.d.ts +2 -0
  22. package/esm/middleware/auth.middleware.d.ts.map +1 -0
  23. package/esm/middleware/auth.middleware.js +72 -0
  24. package/esm/middleware/auth.middleware.js.map +1 -0
  25. package/esm/middleware/index.d.ts +2 -0
  26. package/esm/middleware/index.d.ts.map +1 -0
  27. package/esm/models/access-token/access-token.model.d.ts +9 -0
  28. package/esm/models/access-token/access-token.model.d.ts.map +1 -0
  29. package/esm/models/access-token/access-token.model.js +14 -0
  30. package/esm/models/access-token/access-token.model.js.map +1 -0
  31. package/esm/models/access-token/index.d.ts +2 -0
  32. package/esm/models/access-token/index.d.ts.map +1 -0
  33. package/esm/models/access-token/migration.d.ts +2 -0
  34. package/esm/models/access-token/migration.d.ts.map +1 -0
  35. package/esm/models/access-token/migration.js +22 -0
  36. package/esm/models/access-token/migration.js.map +1 -0
  37. package/esm/models/auth.model.d.ts +58 -0
  38. package/esm/models/auth.model.d.ts.map +1 -0
  39. package/esm/models/auth.model.js +68 -0
  40. package/esm/models/auth.model.js.map +1 -0
  41. package/esm/models/index.d.ts +5 -0
  42. package/esm/models/index.d.ts.map +1 -0
  43. package/esm/models/index.js +1 -0
  44. package/esm/models/index.js.map +1 -0
  45. package/esm/models/refresh-token/index.d.ts +2 -0
  46. package/esm/models/refresh-token/index.d.ts.map +1 -0
  47. package/esm/models/refresh-token/migration.d.ts +2 -0
  48. package/esm/models/refresh-token/migration.d.ts.map +1 -0
  49. package/esm/models/refresh-token/migration.js +23 -0
  50. package/esm/models/refresh-token/migration.js.map +1 -0
  51. package/esm/models/refresh-token/refresh-token.model.d.ts +32 -0
  52. package/esm/models/refresh-token/refresh-token.model.d.ts.map +1 -0
  53. package/esm/models/refresh-token/refresh-token.model.js +53 -0
  54. package/esm/models/refresh-token/refresh-token.model.js.map +1 -0
  55. package/esm/services/auth-events.d.ts +85 -0
  56. package/esm/services/auth-events.d.ts.map +1 -0
  57. package/esm/services/auth-events.js +65 -0
  58. package/esm/services/auth-events.js.map +1 -0
  59. package/esm/services/auth.service.d.ts +92 -0
  60. package/esm/services/auth.service.d.ts.map +1 -0
  61. package/esm/services/auth.service.js +322 -0
  62. package/esm/services/auth.service.js.map +1 -0
  63. package/esm/services/generate-jwt-secret.d.ts +2 -0
  64. package/esm/services/generate-jwt-secret.d.ts.map +1 -0
  65. package/esm/services/generate-jwt-secret.js +47 -0
  66. package/esm/services/generate-jwt-secret.js.map +1 -0
  67. package/esm/services/index.d.ts +5 -0
  68. package/esm/services/index.d.ts.map +1 -0
  69. package/esm/services/jwt.d.ts +23 -0
  70. package/esm/services/jwt.d.ts.map +1 -0
  71. package/esm/services/jwt.js +40 -0
  72. package/esm/services/jwt.js.map +1 -0
  73. package/esm/utils/auth-error-codes.d.ts +18 -0
  74. package/esm/utils/auth-error-codes.d.ts.map +1 -0
  75. package/esm/utils/auth-error-codes.js +18 -0
  76. package/esm/utils/auth-error-codes.js.map +1 -0
  77. package/esm/utils/duration.d.ts +45 -0
  78. package/esm/utils/duration.d.ts.map +1 -0
  79. package/esm/utils/duration.js +93 -0
  80. package/esm/utils/duration.js.map +1 -0
  81. package/esm/utils/index.d.ts +3 -0
  82. package/esm/utils/index.d.ts.map +1 -0
  83. package/package.json +5 -5
@@ -0,0 +1,322 @@
1
+ import {Random}from'@mongez/reinforcements';import {config,verifyPassword,hashPassword}from'@warlock.js/core';import {AccessToken}from'../models/access-token/access-token.model.js';import {RefreshToken}from'../models/refresh-token/refresh-token.model.js';import {toJwtExpiresIn}from'../utils/duration.js';import {authEvents}from'./auth-events.js';import {jwt}from'./jwt.js';class AuthService {
2
+ /**
3
+ * Build access token payload from user
4
+ */
5
+ buildAccessTokenPayload(user) {
6
+ return {
7
+ id: user.id,
8
+ userType: user.userType,
9
+ created_at: Date.now(),
10
+ };
11
+ }
12
+ /**
13
+ * Generate access token for user
14
+ */
15
+ async generateAccessToken(user, payload) {
16
+ const data = payload || this.buildAccessTokenPayload(user);
17
+ const expiresInConfig = config.key("auth.jwt.expiresIn");
18
+ const expiresIn = toJwtExpiresIn(expiresInConfig, 3_600); // default 1 hour
19
+ // If expiresIn is undefined, token never expires
20
+ const token = await jwt.generate(data, { expiresIn });
21
+ const decoed = await jwt.verify(token);
22
+ // Store in database
23
+ await AccessToken.create({
24
+ token,
25
+ user_id: user.id,
26
+ user_type: user.userType,
27
+ });
28
+ return { token, expiresAt: new Date(decoed.exp * 1_000).toISOString() };
29
+ }
30
+ /**
31
+ * Create refresh token for user
32
+ */
33
+ async createRefreshToken(user, deviceInfo) {
34
+ const familyId = deviceInfo?.familyId || Random.string(32);
35
+ const payload = {
36
+ userId: user.id,
37
+ userType: user.userType,
38
+ familyId,
39
+ };
40
+ const token = await jwt.generateRefreshToken(payload);
41
+ const decoed = await jwt.verifyRefreshToken(token);
42
+ // Calculate expiration date (undefined means never expires, but we still set a far future date)
43
+ const expiresAt = new Date(decoed.exp * 1_000).toISOString();
44
+ // Enforce max tokens per user
45
+ await this.enforceMaxRefreshTokens(user);
46
+ // Store in database
47
+ return RefreshToken.create({
48
+ token,
49
+ user_id: user.id,
50
+ user_type: user.userType,
51
+ family_id: familyId,
52
+ expires_at: expiresAt,
53
+ device_info: deviceInfo
54
+ ? {
55
+ userAgent: deviceInfo.userAgent,
56
+ ip: deviceInfo.ip,
57
+ deviceId: deviceInfo.deviceId,
58
+ }
59
+ : undefined,
60
+ });
61
+ }
62
+ /**
63
+ * Create both access and refresh tokens
64
+ */
65
+ async createTokenPair(user, deviceInfo) {
66
+ const accessToken = await this.generateAccessToken(user, deviceInfo?.payload);
67
+ const refreshToken = await this.createRefreshToken(user, deviceInfo);
68
+ const tokenPair = {
69
+ accessToken,
70
+ refreshToken: {
71
+ token: refreshToken.get("token"),
72
+ expiresAt: refreshToken.get("expires_at"),
73
+ },
74
+ };
75
+ // Emit events
76
+ authEvents.emit("token.created", user, tokenPair);
77
+ authEvents.emit("session.created", user, refreshToken, deviceInfo);
78
+ return tokenPair;
79
+ }
80
+ /**
81
+ * Refresh tokens using a refresh token
82
+ */
83
+ async refreshTokens(refreshTokenString, deviceInfo) {
84
+ try {
85
+ // 1. Verify JWT signature
86
+ const decoded = await jwt.verifyRefreshToken(refreshTokenString);
87
+ if (!decoded)
88
+ return null;
89
+ // 2. Find token in database
90
+ const refreshToken = await RefreshToken.first({ token: refreshTokenString });
91
+ if (!refreshToken?.isValid) {
92
+ // If token was already used (rotation detection), revoke entire family
93
+ if (refreshToken) {
94
+ await this.revokeTokenFamily(refreshToken.get("family_id"));
95
+ }
96
+ return null;
97
+ }
98
+ // 3. Get user model and find user
99
+ const UserModel = config.key(`auth.userType.${decoded.userType}`);
100
+ if (!UserModel)
101
+ return null;
102
+ const user = (await UserModel.find(decoded.userId));
103
+ if (!user)
104
+ return null;
105
+ // 4. Rotate token if enabled (revoke old token)
106
+ const rotationEnabled = config.key("auth.jwt.refresh.rotation", true);
107
+ if (rotationEnabled) {
108
+ await refreshToken.revoke();
109
+ }
110
+ else {
111
+ await refreshToken.markAsUsed();
112
+ }
113
+ // 5. Generate new token pair (keep same family)
114
+ const newTokenPair = await this.createTokenPair(user, {
115
+ ...deviceInfo,
116
+ familyId: refreshToken.get("family_id"),
117
+ });
118
+ // Emit token refreshed event
119
+ authEvents.emit("token.refreshed", user, newTokenPair, refreshToken);
120
+ return newTokenPair;
121
+ }
122
+ catch {
123
+ return null;
124
+ }
125
+ }
126
+ /**
127
+ * Verify password
128
+ */
129
+ async verifyPassword(plainPassword, hashedPassword) {
130
+ return verifyPassword(plainPassword, hashedPassword);
131
+ }
132
+ /**
133
+ * Hash password
134
+ */
135
+ async hashPassword(password) {
136
+ return hashPassword(password);
137
+ }
138
+ /**
139
+ * Attempt to login user with given credentials
140
+ */
141
+ async attemptLogin(Model, data) {
142
+ const { password, ...otherData } = data;
143
+ // Emit login attempt event
144
+ authEvents.emit("login.attempt", otherData);
145
+ const user = (await Model.first(otherData));
146
+ if (!user) {
147
+ authEvents.emit("login.failed", otherData, "User not found");
148
+ return null;
149
+ }
150
+ if (!(await this.verifyPassword(password, user.string("password")))) {
151
+ authEvents.emit("login.failed", otherData, "Invalid password");
152
+ return null;
153
+ }
154
+ return user;
155
+ }
156
+ /**
157
+ * Full login flow: validate credentials, create tokens, emit events
158
+ * Returns token pair on success, null on failure
159
+ */
160
+ async login(Model, credentials, deviceInfo) {
161
+ const user = await this.attemptLogin(Model, credentials);
162
+ if (!user) {
163
+ return null;
164
+ }
165
+ // if no refresh token in config, then return user and access token only
166
+ if (!config.key("auth.jwt.refresh.enabled", true)) {
167
+ const accessToken = await this.generateAccessToken(user, deviceInfo?.payload);
168
+ return { user, tokens: { accessToken } };
169
+ }
170
+ const tokens = await this.createTokenPair(user, deviceInfo);
171
+ // Emit login success event
172
+ authEvents.emit("login.success", user, tokens, deviceInfo);
173
+ return { user, tokens };
174
+ }
175
+ /**
176
+ * Logout user
177
+ * @param user - The authenticated user
178
+ * @param accessToken - Optional access token string to revoke
179
+ * @param refreshToken - Optional refresh token string to revoke
180
+ * If refresh token is not provided, behavior is determined by config:
181
+ * - "revoke-all" (default): Revoke ALL refresh tokens for security
182
+ * - "error": Throw error requiring refresh token
183
+ */
184
+ async logout(user, accessToken, refreshToken) {
185
+ // Remove access token if provided
186
+ if (accessToken) {
187
+ await this.removeAccessToken(user, accessToken);
188
+ }
189
+ if (refreshToken) {
190
+ // Revoke specific refresh token
191
+ const token = await RefreshToken.first({
192
+ token: refreshToken,
193
+ userId: user.id, // Security: ensure token belongs to this user
194
+ });
195
+ if (token) {
196
+ await token.revoke();
197
+ authEvents.emit("session.destroyed", user, token);
198
+ }
199
+ }
200
+ else {
201
+ // No refresh token provided - check configured behavior
202
+ const behavior = config.key("auth.jwt.refresh.logoutWithoutToken", "revoke-all");
203
+ if (behavior === "error") {
204
+ throw new Error("Refresh token required for logout");
205
+ }
206
+ // Default: revoke-all (fail-safe)
207
+ await this.revokeAllTokens(user);
208
+ authEvents.emit("logout.failsafe", user);
209
+ }
210
+ // Emit logout event
211
+ authEvents.emit("logout", user);
212
+ }
213
+ /**
214
+ * Remove specific access token
215
+ */
216
+ async removeAccessToken(user, token) {
217
+ AccessToken.delete({
218
+ token,
219
+ userId: user.id,
220
+ });
221
+ }
222
+ /**
223
+ * Remove all access tokens for a user
224
+ */
225
+ async removeAllAccessTokens(user) {
226
+ // Delete access token
227
+ AccessToken.delete({
228
+ user_id: user.id,
229
+ });
230
+ }
231
+ /**
232
+ * Remove specific refresh token
233
+ */
234
+ async removeRefreshToken(user, token) {
235
+ RefreshToken.delete({
236
+ token,
237
+ userId: user.id,
238
+ });
239
+ }
240
+ /**
241
+ * Revoke all tokens for a user
242
+ */
243
+ async revokeAllTokens(user) {
244
+ // Revoke all refresh tokens
245
+ const refreshTokens = await RefreshToken.query()
246
+ .where("user_id", user.id)
247
+ .where("user_type", user.userType)
248
+ .where("revoked_at", null)
249
+ .get();
250
+ for (const token of refreshTokens) {
251
+ await token.revoke();
252
+ authEvents.emit("token.revoked", user, token);
253
+ }
254
+ // Delete all access tokens
255
+ await this.removeAllAccessTokens(user);
256
+ // Emit logout all event
257
+ authEvents.emit("logout.all", user);
258
+ }
259
+ /**
260
+ * Revoke entire token family (for rotation breach detection)
261
+ */
262
+ async revokeTokenFamily(familyId) {
263
+ const tokens = await RefreshToken.query()
264
+ .where("family_id", familyId)
265
+ .where("revoked_at", null)
266
+ .get();
267
+ for (const token of tokens) {
268
+ await token.revoke();
269
+ }
270
+ // Emit family revoked event
271
+ authEvents.emit("token.familyRevoked", familyId, tokens);
272
+ }
273
+ /**
274
+ * Cleanup expired tokens
275
+ */
276
+ async cleanupExpiredTokens() {
277
+ const expiredTokens = await RefreshToken.query().where("expires_at", "<", new Date()).get();
278
+ for (const token of expiredTokens) {
279
+ authEvents.emit("token.expired", token);
280
+ await token.destroy();
281
+ }
282
+ // Emit cleanup completed event
283
+ authEvents.emit("cleanup.completed", expiredTokens.length);
284
+ return expiredTokens.length;
285
+ }
286
+ /**
287
+ * Enforce max refresh tokens per user
288
+ */
289
+ async enforceMaxRefreshTokens(user) {
290
+ const maxPerUser = config.key("auth.jwt.refresh.maxPerUser", 5);
291
+ const activeTokens = await RefreshToken.query()
292
+ .where({
293
+ user_id: user.id,
294
+ user_type: user.userType,
295
+ revoked_at: null,
296
+ })
297
+ .orderBy("created_at", "asc")
298
+ .get();
299
+ // Revoke oldest tokens if exceeding limit
300
+ if (activeTokens.length >= maxPerUser) {
301
+ const tokensToRevoke = activeTokens.slice(0, activeTokens.length - maxPerUser + 1);
302
+ for (const token of tokensToRevoke) {
303
+ await token.revoke();
304
+ }
305
+ }
306
+ }
307
+ /**
308
+ * Get active sessions for user
309
+ */
310
+ async getActiveSessions(user) {
311
+ return RefreshToken.query()
312
+ .where({
313
+ user_id: user.id,
314
+ user_type: user.userType,
315
+ revoked_at: null,
316
+ })
317
+ .where("expires_at", ">", new Date())
318
+ .orderBy("created_at", "desc")
319
+ .get();
320
+ }
321
+ }
322
+ const authService = new AuthService();export{authService};//# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sources":["../../src/services/auth.service.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function generateJWTSecret(): Promise<void>;
2
+ //# sourceMappingURL=generate-jwt-secret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-jwt-secret.d.ts","sourceRoot":"","sources":["../../src/services/generate-jwt-secret.ts"],"names":[],"mappings":"AAKA,wBAAsB,iBAAiB,kBAuDtC"}
@@ -0,0 +1,47 @@
1
+ import {fileExistsAsync,getFileAsync,putFileAsync}from'@mongez/fs';import {Random}from'@mongez/reinforcements';import {rootPath,environment}from'@warlock.js/core';import {log}from'@warlock.js/logger';async function generateJWTSecret() {
2
+ let envFile = rootPath(".env");
3
+ log.info("jwt", "generating", "Generating JWT secrets");
4
+ const environmentMode = environment();
5
+ if (!(await fileExistsAsync(envFile))) {
6
+ const envFileType = environmentMode === "production" ? ".env.production" : ".env.development";
7
+ envFile = rootPath(envFileType);
8
+ }
9
+ if (!(await fileExistsAsync(envFile))) {
10
+ log.error("jwt", "error", ".env file not found");
11
+ return;
12
+ }
13
+ let contents = await getFileAsync(envFile);
14
+ const hasJwtSecret = contents.includes("JWT_SECRET");
15
+ const hasJwtRefreshSecret = contents.includes("JWT_REFRESH_SECRET");
16
+ if (hasJwtSecret && hasJwtRefreshSecret) {
17
+ log.warn("jwt", "exists", "JWT secrets already exist in the .env file.");
18
+ return;
19
+ }
20
+ let secretsToAdd = "";
21
+ if (!hasJwtSecret) {
22
+ const jwtSecret = Random.string(32);
23
+ secretsToAdd += `
24
+ # JWT Secret
25
+ JWT_SECRET=${jwtSecret}
26
+ `;
27
+ log.success("jwt", "generated", "JWT_SECRET generated and added to the .env file.");
28
+ }
29
+ else {
30
+ log.info("jwt", "exists", "JWT_SECRET already exists in the .env file.");
31
+ }
32
+ if (!hasJwtRefreshSecret) {
33
+ const jwtRefreshSecret = Random.string(32);
34
+ secretsToAdd += `
35
+ # JWT Refresh Secret
36
+ JWT_REFRESH_SECRET=${jwtRefreshSecret}
37
+ `;
38
+ log.success("jwt", "generated", "JWT_REFRESH_SECRET generated and added to the .env file.");
39
+ }
40
+ else {
41
+ log.info("jwt", "exists", "JWT_REFRESH_SECRET already exists in the .env file.");
42
+ }
43
+ if (secretsToAdd) {
44
+ contents += secretsToAdd;
45
+ await putFileAsync(envFile, contents);
46
+ }
47
+ }export{generateJWTSecret};//# sourceMappingURL=generate-jwt-secret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-jwt-secret.js","sources":["../../src/services/generate-jwt-secret.ts"],"sourcesContent":[null],"names":[],"mappings":"wMAKO,eAAe,iBAAiB,GAAA;AACrC,IAAA,IAAI,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE/B,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,wBAAwB,CAAC,CAAC;AAExD,IAAA,MAAM,eAAe,GAAG,WAAW,EAAE,CAAC;IAEtC,IAAI,EAAE,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE;AACrC,QAAA,MAAM,WAAW,GAAG,eAAe,KAAK,YAAY,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAC9F,QAAA,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;AACjC,KAAA;IAED,IAAI,EAAE,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE;QACrC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC;QACjD,OAAO;AACR,KAAA;AAED,IAAA,IAAI,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAE3C,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAEpE,IAAI,YAAY,IAAI,mBAAmB,EAAE;QACvC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,6CAA6C,CAAC,CAAC;QACzE,OAAO;AACR,KAAA;IAED,IAAI,YAAY,GAAG,EAAE,CAAC;IAEtB,IAAI,CAAC,YAAY,EAAE;QACjB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACpC,QAAA,YAAY,IAAI,CAAA;;aAEP,SAAS,CAAA;CACrB,CAAC;QACE,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,kDAAkD,CAAC,CAAC;AACrF,KAAA;AAAM,SAAA;QACL,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,6CAA6C,CAAC,CAAC;AAC1E,KAAA;IAED,IAAI,CAAC,mBAAmB,EAAE;QACxB,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC3C,QAAA,YAAY,IAAI,CAAA;;qBAEC,gBAAgB,CAAA;CACpC,CAAC;QACE,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,0DAA0D,CAAC,CAAC;AAC7F,KAAA;AAAM,SAAA;QACL,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,qDAAqD,CAAC,CAAC;AAClF,KAAA;AAED,IAAA,IAAI,YAAY,EAAE;QAChB,QAAQ,IAAI,YAAY,CAAC;AACzB,QAAA,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACvC,KAAA;AACH"}
@@ -0,0 +1,5 @@
1
+ export * from "./auth-events";
2
+ export * from "./auth.service";
3
+ export * from "./generate-jwt-secret";
4
+ export * from "./jwt";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,OAAO,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type SignerOptions, type VerifierOptions } from "fast-jwt";
2
+ export declare const jwt: {
3
+ /**
4
+ * Generate a new JWT token for the user.
5
+ * @param payload The payload to encode in the JWT token.
6
+ */
7
+ generate(payload: any, { key, algorithm, ...options }?: any): Promise<string>;
8
+ /**
9
+ * Verify the given token.
10
+ * @param token The JWT token to verify.
11
+ * @returns The decoded token payload if verification is successful.
12
+ */
13
+ verify<T = any>(token: string, { key, algorithms, ...options }?: any): Promise<T>;
14
+ /**
15
+ * Generate a new refresh token for the user.
16
+ */
17
+ generateRefreshToken(payload: any, { key, expiresIn, algorithm, ...options }?: any): Promise<string>;
18
+ /**
19
+ * Verify the given refresh token.
20
+ */
21
+ verifyRefreshToken<T_1 = any>(token: string, { key, algorithms, ...options }?: any): Promise<T_1>;
22
+ };
23
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/services/jwt.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,UAAU,CAAC;AASlB,eAAO,MAAM,GAAG;IACd;;;OAGG;sBAEQ,GAAG,yCAMX,QAAQ,MAAM,CAAC;IAQlB;;;;OAIG;2BAEM,MAAM;IAYf;;OAEG;kCAEQ,GAAG,oDAOX,QAAQ,MAAM,CAAC;IAKlB;;OAEG;yCAEM,MAAM;CAUhB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import {config}from'@warlock.js/core';import {createSigner,createVerifier}from'fast-jwt';const getSecretKey = () => config.key("auth.jwt.secret");
2
+ const getAlgorithm = () => config.key("auth.jwt.algorithm", "HS256");
3
+ const getRefreshSecretKey = () => config.key("auth.jwt.refresh.secret");
4
+ // Assuming there's a separate config for refresh token validity, for example, '7d' for 7 days
5
+ const getRefreshTokenValidity = () => config.key("auth.jwt.refresh.expiresIn");
6
+ const jwt = {
7
+ /**
8
+ * Generate a new JWT token for the user.
9
+ * @param payload The payload to encode in the JWT token.
10
+ */
11
+ async generate(payload, { key = getSecretKey(), algorithm = getAlgorithm(), ...options } = {}) {
12
+ // Create a signer function with predefined options
13
+ const sign = createSigner({ key, ...options, algorithm });
14
+ const token = await sign({ ...payload });
15
+ return token;
16
+ },
17
+ /**
18
+ * Verify the given token.
19
+ * @param token The JWT token to verify.
20
+ * @returns The decoded token payload if verification is successful.
21
+ */
22
+ async verify(token, { key = getSecretKey(), algorithms = getAlgorithm() ? [getAlgorithm()] : undefined, ...options } = {}) {
23
+ const verify = createVerifier({ key, ...options, algorithms });
24
+ return await verify(token);
25
+ },
26
+ /**
27
+ * Generate a new refresh token for the user.
28
+ */
29
+ async generateRefreshToken(payload, { key = getRefreshSecretKey(), expiresIn = getRefreshTokenValidity(), algorithm = getAlgorithm(), ...options } = {}) {
30
+ const sign = createSigner({ key, expiresIn, algorithm, ...options });
31
+ return sign({ ...payload });
32
+ },
33
+ /**
34
+ * Verify the given refresh token.
35
+ */
36
+ async verifyRefreshToken(token, { key = getRefreshSecretKey(), algorithms = [getAlgorithm()], ...options } = {}) {
37
+ const verify = createVerifier({ key, algorithms, ...options });
38
+ return await verify(token);
39
+ },
40
+ };export{jwt};//# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sources":["../../src/services/jwt.ts"],"sourcesContent":[null],"names":[],"mappings":"yFASA,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAW,CAAC;AACnE,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAc,CAAC;AAElF,MAAM,mBAAmB,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAW,CAAC;AAClF;AACA,MAAM,uBAAuB,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAoB,CAAC;AAErF,MAAA,GAAG,GAAG;AACjB;;;AAGG;AACH,IAAA,MAAM,QAAQ,CACZ,OAAY,EACZ,EACE,GAAG,GAAG,YAAY,EAAE,EACpB,SAAS,GAAG,YAAY,EAAE,EAC1B,GAAG,OAAO,KAC0B,EAAE,EAAA;;AAGxC,QAAA,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAE1D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AACzC,QAAA,OAAO,KAAK,CAAC;KACd;AAED;;;;AAIG;AACH,IAAA,MAAM,MAAM,CACV,KAAa,EACb,EACE,GAAG,GAAG,YAAY,EAAE,EACpB,UAAU,GAAG,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,SAAS,EAC1D,GAAG,OAAO,KAC4B,EAAE,EAAA;AAE1C,QAAA,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;AAE/D,QAAA,OAAO,MAAM,MAAM,CAAC,KAAe,CAAC,CAAC;KACtC;AAED;;AAEG;IACH,MAAM,oBAAoB,CACxB,OAAY,EACZ,EACE,GAAG,GAAG,mBAAmB,EAAE,EAC3B,SAAS,GAAG,uBAAuB,EAAE,EACrC,SAAS,GAAG,YAAY,EAAE,EAC1B,GAAG,OAAO,EAAA,GAC0B,EAAE,EAAA;AAExC,QAAA,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AACrE,QAAA,OAAO,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;KAC7B;AAED;;AAEG;IACH,MAAM,kBAAkB,CACtB,KAAa,EACb,EACE,GAAG,GAAG,mBAAmB,EAAE,EAC3B,UAAU,GAAG,CAAC,YAAY,EAAE,CAAC,EAC7B,GAAG,OAAO,EAAA,GAC4B,EAAE,EAAA;AAE1C,QAAA,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAC/D,QAAA,OAAO,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;KAC5B;"}
@@ -0,0 +1,18 @@
1
+ export declare enum AuthErrorCodes {
2
+ /**
3
+ * Missing Access Token Error Code EC001
4
+ * EC001 = Missing Access Token
5
+ */
6
+ MissingAccessToken = "EC001",
7
+ /**
8
+ * Invalid Access Token Error Code EC002
9
+ * EC002 = Invalid Access Token
10
+ */
11
+ InvalidAccessToken = "EC002",
12
+ /**
13
+ * Unauthorized Error Code EC003
14
+ * EC003 = Unauthorized
15
+ */
16
+ Unauthorized = "EC003"
17
+ }
18
+ //# sourceMappingURL=auth-error-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-error-codes.d.ts","sourceRoot":"","sources":["../../src/utils/auth-error-codes.ts"],"names":[],"mappings":"AAAA,oBAAY,cAAc;IACxB;;;OAGG;IACH,kBAAkB,UAAU;IAC5B;;;OAGG;IACH,kBAAkB,UAAU;IAC5B;;;OAGG;IACH,YAAY,UAAU;CACvB"}
@@ -0,0 +1,18 @@
1
+ var AuthErrorCodes;
2
+ (function (AuthErrorCodes) {
3
+ /**
4
+ * Missing Access Token Error Code EC001
5
+ * EC001 = Missing Access Token
6
+ */
7
+ AuthErrorCodes["MissingAccessToken"] = "EC001";
8
+ /**
9
+ * Invalid Access Token Error Code EC002
10
+ * EC002 = Invalid Access Token
11
+ */
12
+ AuthErrorCodes["InvalidAccessToken"] = "EC002";
13
+ /**
14
+ * Unauthorized Error Code EC003
15
+ * EC003 = Unauthorized
16
+ */
17
+ AuthErrorCodes["Unauthorized"] = "EC003";
18
+ })(AuthErrorCodes || (AuthErrorCodes = {}));export{AuthErrorCodes};//# sourceMappingURL=auth-error-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-error-codes.js","sources":["../../src/utils/auth-error-codes.ts"],"sourcesContent":[null],"names":[],"mappings":"IAAY,eAgBX;AAhBD,CAAA,UAAY,cAAc,EAAA;AACxB;;;AAGG;AACH,IAAA,cAAA,CAAA,oBAAA,CAAA,GAAA,OAA4B,CAAA;AAC5B;;;AAGG;AACH,IAAA,cAAA,CAAA,oBAAA,CAAA,GAAA,OAA4B,CAAA;AAC5B;;;AAGG;AACH,IAAA,cAAA,CAAA,cAAA,CAAA,GAAA,OAAsB,CAAA;AACxB,CAAC,EAhBW,cAAc,KAAd,cAAc,GAgBzB,EAAA,CAAA,CAAA"}
@@ -0,0 +1,45 @@
1
+ import { NO_EXPIRATION } from "../contracts/types";
2
+ /**
3
+ * Duration object for specifying time periods
4
+ * All units are additive (e.g., { days: 1, hours: 6 } = 30 hours)
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * { hours: 1 } // 1 hour
9
+ * { days: 7, hours: 12 } // 7.5 days
10
+ * { minutes: 30 } // 30 minutes
11
+ * ```
12
+ */
13
+ export type Duration = {
14
+ milliseconds?: number;
15
+ seconds?: number;
16
+ minutes?: number;
17
+ hours?: number;
18
+ days?: number;
19
+ weeks?: number;
20
+ };
21
+ /**
22
+ * Expiration value type - can be a Duration object, string format, or NO_EXPIRATION
23
+ */
24
+ export type ExpiresIn = Duration | typeof NO_EXPIRATION | string | number;
25
+ /**
26
+ * Parse duration to milliseconds
27
+ * Supports Duration object, string format ("1d 2h 30m"), or number (raw ms)
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * parseExpirationToMs({ hours: 1 }) // 3600000
32
+ * parseExpirationToMs({ days: 1 }) // 86400000
33
+ * parseExpirationToMs("1h") // 3600000
34
+ * parseExpirationToMs("1d 2h 30m") // 95400000
35
+ * parseExpirationToMs(3600000) // 3600000
36
+ * parseExpirationToMs(NO_EXPIRATION) // undefined
37
+ * ```
38
+ */
39
+ export declare function parseExpirationToMs(expiration: ExpiresIn | undefined, defaultMs?: number): number | undefined;
40
+ /**
41
+ * Convert ExpiresIn to a value suitable for jwt.generate (string or number)
42
+ * Returns undefined if NO_EXPIRATION
43
+ */
44
+ export declare function toJwtExpiresIn(expiration: ExpiresIn | undefined, defaultMs?: number): string | undefined;
45
+ //# sourceMappingURL=duration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../../src/utils/duration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,SAAS,GAAG,SAAS,EACjC,SAAS,GAAE,MAAgB,GAC1B,MAAM,GAAG,SAAS,CAmBpB;AAuDD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,SAAS,GAAG,SAAS,EACjC,SAAS,GAAE,MAAgB,GAC1B,MAAM,GAAG,SAAS,CAMpB"}