@warlock.js/auth 4.0.162 → 4.0.164
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/esm/index.d.ts +8 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -0
- package/esm/middleware/auth.middleware.d.ts +2 -0
- package/esm/middleware/auth.middleware.d.ts.map +1 -0
- package/esm/middleware/auth.middleware.js +72 -0
- package/esm/middleware/auth.middleware.js.map +1 -0
- package/esm/middleware/index.d.ts +2 -0
- package/esm/middleware/index.d.ts.map +1 -0
- package/esm/models/access-token/access-token.model.d.ts +9 -0
- package/esm/models/access-token/access-token.model.d.ts.map +1 -0
- package/esm/models/access-token/access-token.model.js +14 -0
- package/esm/models/access-token/access-token.model.js.map +1 -0
- package/esm/models/access-token/index.d.ts +2 -0
- package/esm/models/access-token/index.d.ts.map +1 -0
- package/esm/models/access-token/migration.d.ts +2 -0
- package/esm/models/access-token/migration.d.ts.map +1 -0
- package/esm/models/access-token/migration.js +22 -0
- package/esm/models/access-token/migration.js.map +1 -0
- package/esm/models/auth.model.d.ts +58 -0
- package/esm/models/auth.model.d.ts.map +1 -0
- package/esm/models/auth.model.js +68 -0
- package/esm/models/auth.model.js.map +1 -0
- package/esm/models/index.d.ts +5 -0
- package/esm/models/index.d.ts.map +1 -0
- package/esm/models/index.js +1 -0
- package/esm/models/index.js.map +1 -0
- package/esm/models/refresh-token/index.d.ts +2 -0
- package/esm/models/refresh-token/index.d.ts.map +1 -0
- package/esm/models/refresh-token/migration.d.ts +2 -0
- package/esm/models/refresh-token/migration.d.ts.map +1 -0
- package/esm/models/refresh-token/migration.js +23 -0
- package/esm/models/refresh-token/migration.js.map +1 -0
- package/esm/models/refresh-token/refresh-token.model.d.ts +32 -0
- package/esm/models/refresh-token/refresh-token.model.d.ts.map +1 -0
- package/esm/models/refresh-token/refresh-token.model.js +53 -0
- package/esm/models/refresh-token/refresh-token.model.js.map +1 -0
- package/esm/services/auth-events.d.ts +85 -0
- package/esm/services/auth-events.d.ts.map +1 -0
- package/esm/services/auth-events.js +65 -0
- package/esm/services/auth-events.js.map +1 -0
- package/esm/services/auth.service.d.ts +92 -0
- package/esm/services/auth.service.d.ts.map +1 -0
- package/esm/services/auth.service.js +322 -0
- package/esm/services/auth.service.js.map +1 -0
- package/esm/services/generate-jwt-secret.d.ts +2 -0
- package/esm/services/generate-jwt-secret.d.ts.map +1 -0
- package/esm/services/generate-jwt-secret.js +47 -0
- package/esm/services/generate-jwt-secret.js.map +1 -0
- package/esm/services/index.d.ts +5 -0
- package/esm/services/index.d.ts.map +1 -0
- package/esm/services/jwt.d.ts +23 -0
- package/esm/services/jwt.d.ts.map +1 -0
- package/esm/services/jwt.js +40 -0
- package/esm/services/jwt.js.map +1 -0
- package/esm/utils/auth-error-codes.d.ts +18 -0
- package/esm/utils/auth-error-codes.d.ts.map +1 -0
- package/esm/utils/auth-error-codes.js +18 -0
- package/esm/utils/auth-error-codes.js.map +1 -0
- package/esm/utils/duration.d.ts +45 -0
- package/esm/utils/duration.d.ts.map +1 -0
- package/esm/utils/duration.js +93 -0
- package/esm/utils/duration.js.map +1 -0
- package/esm/utils/index.d.ts +3 -0
- package/esm/utils/index.d.ts.map +1 -0
- package/package.json +5 -5
package/esm/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./commands/auth-cleanup-command";
|
|
2
|
+
export * from "./commands/jwt-secret-generator-command";
|
|
3
|
+
export * from "./contracts";
|
|
4
|
+
export * from "./middleware";
|
|
5
|
+
export * from "./models";
|
|
6
|
+
export * from "./services";
|
|
7
|
+
export * from "./utils";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
package/esm/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{registerAuthCleanupCommand}from'./commands/auth-cleanup-command.js';export{registerJWTSecretGeneratorCommand}from'./commands/jwt-secret-generator-command.js';export{NO_EXPIRATION}from'./contracts/types.js';export{authMiddleware}from'./middleware/auth.middleware.js';export{authMigrations}from'./models/index.js';export{authEvents}from'./services/auth-events.js';export{authService}from'./services/auth.service.js';export{generateJWTSecret}from'./services/generate-jwt-secret.js';export{jwt}from'./services/jwt.js';export{AuthErrorCodes}from'./utils/auth-error-codes.js';export{parseExpirationToMs,toJwtExpiresIn}from'./utils/duration.js';export{AccessToken}from'./models/access-token/access-token.model.js';export{Auth}from'./models/auth.model.js';export{RefreshToken}from'./models/refresh-token/refresh-token.model.js';//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.middleware.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,cAsFjE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import {t,config}from'@warlock.js/core';import {log}from'@warlock.js/logger';import {AccessToken}from'../models/access-token/access-token.model.js';import {jwt}from'../services/jwt.js';import {AuthErrorCodes}from'../utils/auth-error-codes.js';function authMiddleware(allowedUserType) {
|
|
2
|
+
const allowedTypes = !allowedUserType
|
|
3
|
+
? []
|
|
4
|
+
: Array.isArray(allowedUserType)
|
|
5
|
+
? allowedUserType
|
|
6
|
+
: [allowedUserType];
|
|
7
|
+
const auth = async (request, response) => {
|
|
8
|
+
try {
|
|
9
|
+
const authorizationValue = request.authorizationValue;
|
|
10
|
+
if (!allowedTypes.length && !authorizationValue)
|
|
11
|
+
return;
|
|
12
|
+
if (!authorizationValue) {
|
|
13
|
+
return response.unauthorized({
|
|
14
|
+
error: t("auth.errors.missingAccessToken"),
|
|
15
|
+
errorCode: AuthErrorCodes.MissingAccessToken,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
// get current user jwt
|
|
19
|
+
const user = await jwt.verify(authorizationValue);
|
|
20
|
+
// store decoded access token object in request object
|
|
21
|
+
request.decodedAccessToken = user;
|
|
22
|
+
// use our own jwt verify to verify the token
|
|
23
|
+
const accessToken = await AccessToken.first({
|
|
24
|
+
token: authorizationValue,
|
|
25
|
+
});
|
|
26
|
+
if (!accessToken) {
|
|
27
|
+
return response.unauthorized({
|
|
28
|
+
error: t("auth.errors.invalidAccessToken"),
|
|
29
|
+
errorCode: AuthErrorCodes.InvalidAccessToken,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
// now, we need to get an instance of user using its corresponding model
|
|
33
|
+
const userType = user.userType || accessToken.get("userType");
|
|
34
|
+
// check if the user type is allowed
|
|
35
|
+
if (allowedTypes.length && !allowedTypes.includes(userType)) {
|
|
36
|
+
return response.unauthorized({
|
|
37
|
+
error: t("auth.errors.unauthorized"),
|
|
38
|
+
errorCode: AuthErrorCodes.Unauthorized,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// get user model class
|
|
42
|
+
const UserModel = config.key(`auth.userType.${userType}`);
|
|
43
|
+
if (!UserModel) {
|
|
44
|
+
throw new Error(`User type ${userType} is unknown type.`);
|
|
45
|
+
}
|
|
46
|
+
// get user model instance
|
|
47
|
+
const currentUser = await UserModel.find(user.id);
|
|
48
|
+
if (!currentUser) {
|
|
49
|
+
accessToken.destroy();
|
|
50
|
+
return response.unauthorized({
|
|
51
|
+
error: t("auth.errors.invalidAccessToken"),
|
|
52
|
+
errorCode: AuthErrorCodes.InvalidAccessToken,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// update last access
|
|
56
|
+
// accessToken.set("lastAccess", new Date());
|
|
57
|
+
// await accessToken.save({ skipEvents: true });
|
|
58
|
+
// set current user
|
|
59
|
+
request.user = currentUser;
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
log.error("http", "auth", err);
|
|
63
|
+
// unset current user
|
|
64
|
+
request.clearCurrentUser();
|
|
65
|
+
return response.unauthorized({
|
|
66
|
+
error: t("auth.errors.invalidAccessToken"),
|
|
67
|
+
errorCode: AuthErrorCodes.InvalidAccessToken,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
return auth;
|
|
72
|
+
}export{authMiddleware};//# sourceMappingURL=auth.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.middleware.js","sources":["../../src/middleware/auth.middleware.ts"],"sourcesContent":[null],"names":[],"mappings":"mPAMM,SAAU,cAAc,CAAC,eAAmC,EAAA;IAChE,MAAM,YAAY,GAAG,CAAC,eAAe;AACnC,UAAE,EAAE;AACJ,UAAE,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;AAC9B,cAAE,eAAe;AACjB,cAAE,CAAC,eAAe,CAAC,CAAC;IAExB,MAAM,IAAI,GAAe,OAAO,OAAgB,EAAE,QAAkB,KAAI;QACtE,IAAI;AACF,YAAA,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;AAEtD,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,kBAAkB;gBAAE,OAAO;YAExD,IAAI,CAAC,kBAAkB,EAAE;gBACvB,OAAO,QAAQ,CAAC,YAAY,CAAC;AAC3B,oBAAA,KAAK,EAAE,CAAC,CAAC,gCAAgC,CAAC;oBAC1C,SAAS,EAAE,cAAc,CAAC,kBAAkB;AAC7C,iBAAA,CAAC,CAAC;AACJ,aAAA;;YAGD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;;AAGlD,YAAA,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;;AAElC,YAAA,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC;AAC1C,gBAAA,KAAK,EAAE,kBAAkB;AAC1B,aAAA,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,EAAE;gBAChB,OAAO,QAAQ,CAAC,YAAY,CAAC;AAC3B,oBAAA,KAAK,EAAE,CAAC,CAAC,gCAAgC,CAAC;oBAC1C,SAAS,EAAE,cAAc,CAAC,kBAAkB;AAC7C,iBAAA,CAAC,CAAC;AACJ,aAAA;;AAGD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;;YAG9D,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBAC3D,OAAO,QAAQ,CAAC,YAAY,CAAC;AAC3B,oBAAA,KAAK,EAAE,CAAC,CAAC,0BAA0B,CAAC;oBACpC,SAAS,EAAE,cAAc,CAAC,YAAY;AACvC,iBAAA,CAAC,CAAC;AACJ,aAAA;;YAGD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAiB,cAAA,EAAA,QAAQ,CAAE,CAAA,CAAC,CAAC;YAE1D,IAAI,CAAC,SAAS,EAAE;AACd,gBAAA,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,CAAA,iBAAA,CAAmB,CAAC,CAAC;AAC3D,aAAA;;YAGD,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAElD,IAAI,CAAC,WAAW,EAAE;gBAChB,WAAW,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO,QAAQ,CAAC,YAAY,CAAC;AAC3B,oBAAA,KAAK,EAAE,CAAC,CAAC,gCAAgC,CAAC;oBAC1C,SAAS,EAAE,cAAc,CAAC,kBAAkB;AAC7C,iBAAA,CAAC,CAAC;AACJ,aAAA;;;;;AAOD,YAAA,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC;AAC5B,SAAA;AAAC,QAAA,OAAO,GAAQ,EAAE;YACjB,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;;YAG/B,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAE3B,OAAO,QAAQ,CAAC,YAAY,CAAC;AAC3B,gBAAA,KAAK,EAAE,CAAC,CAAC,gCAAgC,CAAC;gBAC1C,SAAS,EAAE,cAAc,CAAC,kBAAkB;AAC7C,aAAA,CAAC,CAAC;AACJ,SAAA;AACH,KAAC,CAAC;AAEF,IAAA,OAAO,IAAI,CAAC;AACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-token.model.d.ts","sourceRoot":"","sources":["../../../src/models/access-token/access-token.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAW5C,qBAAa,WAAY,SAAQ,KAAK;IACpC;;OAEG;IACH,OAAc,KAAK,SAAmB;IAEtC,OAAc,MAAM,MAAqB;CAC1C"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import {Model}from'@warlock.js/cascade';import {v}from'@warlock.js/seal';const accessTokenSchema = v.object({
|
|
2
|
+
token: v.string().required(),
|
|
3
|
+
last_access: v.date().defaultNow().optional(),
|
|
4
|
+
user_id: v.scalar().required(),
|
|
5
|
+
user_type: v.string().required(),
|
|
6
|
+
is_active: v.boolean().default(true),
|
|
7
|
+
});
|
|
8
|
+
class AccessToken extends Model {
|
|
9
|
+
/**
|
|
10
|
+
* {@inheritDoc}
|
|
11
|
+
*/
|
|
12
|
+
static table = "access_tokens";
|
|
13
|
+
static schema = accessTokenSchema;
|
|
14
|
+
}export{AccessToken};//# sourceMappingURL=access-token.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-token.model.js","sources":["../../../src/models/access-token/access-token.model.ts"],"sourcesContent":[null],"names":[],"mappings":"yEAGA,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;AACjC,IAAA,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE;AAC7C,IAAA,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC9B,IAAA,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;AACrC,CAAA,CAAC,CAAC;AAEG,MAAO,WAAY,SAAQ,KAAK,CAAA;AACpC;;AAEG;AACI,IAAA,OAAO,KAAK,GAAG,eAAe,CAAC;AAE/B,IAAA,OAAO,MAAM,GAAG,iBAAiB,CAAC;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/access-token/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/models/access-token/migration.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB,KA0B/B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {migrate}from'@warlock.js/cascade';import {AccessToken}from'./access-token.model.js';const AccessTokenMigration = migrate(AccessToken, {
|
|
2
|
+
name: "accessToken",
|
|
3
|
+
up() {
|
|
4
|
+
// Create table
|
|
5
|
+
this.createTableIfNotExists();
|
|
6
|
+
// Primary key
|
|
7
|
+
this.primaryUuid();
|
|
8
|
+
// Token field
|
|
9
|
+
this.text("token").unique();
|
|
10
|
+
this.timestamp("last_access").nullable();
|
|
11
|
+
// User reference (flat columns for cross-driver compatibility)
|
|
12
|
+
this.uuid("user_id").index();
|
|
13
|
+
this.string("user_type", 50).nullable();
|
|
14
|
+
// Status (for token revocation)
|
|
15
|
+
this.boolean("is_active").nullable();
|
|
16
|
+
// Timestamps
|
|
17
|
+
this.timestamps();
|
|
18
|
+
},
|
|
19
|
+
down() {
|
|
20
|
+
this.dropTableIfExists();
|
|
21
|
+
},
|
|
22
|
+
});export{AccessTokenMigration};//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sources":["../../../src/models/access-token/migration.ts"],"sourcesContent":[null],"names":[],"mappings":"4FAGa,MAAA,oBAAoB,GAAG,OAAO,CAAC,WAAW,EAAE;AACvD,IAAA,IAAI,EAAE,aAAa;IACnB,EAAE,GAAA;;QAEA,IAAI,CAAC,sBAAsB,EAAE,CAAC;;QAG9B,IAAI,CAAC,WAAW,EAAE,CAAC;;QAGnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC;;QAGzC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;;QAGxC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;;QAGrC,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;IACD,IAAI,GAAA;QACF,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;AACF,CAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type ChildModel, Model, type ModelSchema } from "@warlock.js/cascade";
|
|
2
|
+
import type { AccessTokenOutput, DeviceInfo, TokenPair } from "../contracts/types";
|
|
3
|
+
import type { RefreshToken } from "./refresh-token/refresh-token.model";
|
|
4
|
+
export declare abstract class Auth<Schema extends ModelSchema = ModelSchema> extends Model<Schema> {
|
|
5
|
+
/**
|
|
6
|
+
* Get user type
|
|
7
|
+
*/
|
|
8
|
+
abstract get userType(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Get access token payload
|
|
11
|
+
*/
|
|
12
|
+
accessTokenPayload(): {
|
|
13
|
+
id: any;
|
|
14
|
+
userType: string;
|
|
15
|
+
created_at: number;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Create both access and refresh tokens
|
|
19
|
+
*/
|
|
20
|
+
createTokenPair(deviceInfo?: DeviceInfo): Promise<TokenPair>;
|
|
21
|
+
/**
|
|
22
|
+
* Generate access token
|
|
23
|
+
*/
|
|
24
|
+
generateAccessToken(data?: any): Promise<AccessTokenOutput>;
|
|
25
|
+
/**
|
|
26
|
+
* Generate refresh token
|
|
27
|
+
*/
|
|
28
|
+
generateRefreshToken(deviceInfo?: DeviceInfo): Promise<RefreshToken>;
|
|
29
|
+
/**
|
|
30
|
+
* Remove current access token
|
|
31
|
+
*/
|
|
32
|
+
removeAccessToken(token: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Remove refresh token
|
|
35
|
+
*/
|
|
36
|
+
removeRefreshToken(token: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Remove all access tokens
|
|
39
|
+
*/
|
|
40
|
+
removeAllAccessTokens(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Revoke all tokens (logout from all devices)
|
|
43
|
+
*/
|
|
44
|
+
revokeAllTokens(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Get active sessions
|
|
47
|
+
*/
|
|
48
|
+
activeSessions(): Promise<RefreshToken[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Attempt to login the user
|
|
51
|
+
*/
|
|
52
|
+
static attempt(this: ChildModel<Auth>, data: any): Promise<Auth | null>;
|
|
53
|
+
/**
|
|
54
|
+
* Confirm password
|
|
55
|
+
*/
|
|
56
|
+
confirmPassword(password: string): Promise<boolean>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=auth.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.model.d.ts","sourceRoot":"","sources":["../../src/models/auth.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAExE,8BAAsB,IAAI,CAAC,MAAM,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,KAAK,CAAC,MAAM,CAAC;IACxF;;OAEG;IACH,aAAoB,QAAQ,IAAI,MAAM,CAAC;IAEvC;;OAEG;IACI,kBAAkB;;;;;IAIzB;;OAEG;IACU,eAAe,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAIzE;;OAEG;IACU,mBAAmB,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIxE;;OAEG;IACU,oBAAoB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAIjF;;OAEG;IACU,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D;;OAEG;IACU,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;OAEG;IACU,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAInD;;OAEG;IACU,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7C;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAItD;;OAEG;WACiB,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAIpF;;OAEG;IACU,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGjE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import {Model}from'@warlock.js/cascade';import'@mongez/events';import {authService}from'../services/auth.service.js';import'@mongez/fs';import'@mongez/reinforcements';import'@warlock.js/core';import'@warlock.js/logger';import'fast-jwt';class Auth extends Model {
|
|
2
|
+
/**
|
|
3
|
+
* Get access token payload
|
|
4
|
+
*/
|
|
5
|
+
accessTokenPayload() {
|
|
6
|
+
return authService.buildAccessTokenPayload(this);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Create both access and refresh tokens
|
|
10
|
+
*/
|
|
11
|
+
async createTokenPair(deviceInfo) {
|
|
12
|
+
return authService.createTokenPair(this, deviceInfo);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate access token
|
|
16
|
+
*/
|
|
17
|
+
async generateAccessToken(data) {
|
|
18
|
+
return authService.generateAccessToken(this, data);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Generate refresh token
|
|
22
|
+
*/
|
|
23
|
+
async generateRefreshToken(deviceInfo) {
|
|
24
|
+
return authService.createRefreshToken(this, deviceInfo);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Remove current access token
|
|
28
|
+
*/
|
|
29
|
+
async removeAccessToken(token) {
|
|
30
|
+
return authService.removeAccessToken(this, token);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Remove refresh token
|
|
34
|
+
*/
|
|
35
|
+
async removeRefreshToken(token) {
|
|
36
|
+
return authService.removeRefreshToken(this, token);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Remove all access tokens
|
|
40
|
+
*/
|
|
41
|
+
async removeAllAccessTokens() {
|
|
42
|
+
return authService.removeAllAccessTokens(this);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Revoke all tokens (logout from all devices)
|
|
46
|
+
*/
|
|
47
|
+
async revokeAllTokens() {
|
|
48
|
+
return authService.revokeAllTokens(this);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get active sessions
|
|
52
|
+
*/
|
|
53
|
+
async activeSessions() {
|
|
54
|
+
return authService.getActiveSessions(this);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Attempt to login the user
|
|
58
|
+
*/
|
|
59
|
+
static async attempt(data) {
|
|
60
|
+
return authService.attemptLogin(this, data);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Confirm password
|
|
64
|
+
*/
|
|
65
|
+
async confirmPassword(password) {
|
|
66
|
+
return authService.verifyPassword(this.string("password"), password);
|
|
67
|
+
}
|
|
68
|
+
}export{Auth};//# sourceMappingURL=auth.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.model.js","sources":["../../src/models/auth.model.ts"],"sourcesContent":[null],"names":[],"mappings":"4OAKM,MAAgB,IAA+C,SAAQ,KAAa,CAAA;AAMxF;;AAEG;IACI,kBAAkB,GAAA;AACvB,QAAA,OAAO,WAAW,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;KAClD;AAED;;AAEG;IACI,MAAM,eAAe,CAAC,UAAuB,EAAA;QAClD,OAAO,WAAW,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;KACtD;AAED;;AAEG;IACI,MAAM,mBAAmB,CAAC,IAAU,EAAA;QACzC,OAAO,WAAW,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACpD;AAED;;AAEG;IACI,MAAM,oBAAoB,CAAC,UAAuB,EAAA;QACvD,OAAO,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;KACzD;AAED;;AAEG;IACI,MAAM,iBAAiB,CAAC,KAAa,EAAA;QAC1C,OAAO,WAAW,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACnD;AAED;;AAEG;IACI,MAAM,kBAAkB,CAAC,KAAa,EAAA;QAC3C,OAAO,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KACpD;AAED;;AAEG;AACI,IAAA,MAAM,qBAAqB,GAAA;AAChC,QAAA,OAAO,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;KAChD;AAED;;AAEG;AACI,IAAA,MAAM,eAAe,GAAA;AAC1B,QAAA,OAAO,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KAC1C;AAED;;AAEG;AACI,IAAA,MAAM,cAAc,GAAA;AACzB,QAAA,OAAO,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;KAC5C;AAED;;AAEG;AACI,IAAA,aAAa,OAAO,CAAyB,IAAS,EAAA;QAC3D,OAAO,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KAC7C;AAED;;AAEG;IACI,MAAM,eAAe,CAAC,QAAgB,EAAA;AAC3C,QAAA,OAAO,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAE,EAAE,QAAQ,CAAC,CAAC;KACvE;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAGA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAEhC,eAAO,MAAM,cAAc,OAAgD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {AccessTokenMigration}from'./access-token/migration.js';import {RefreshTokenMigration}from'./refresh-token/migration.js';export{AccessToken}from'./access-token/access-token.model.js';import'@warlock.js/cascade';import'@mongez/events';import'@mongez/reinforcements';import'@warlock.js/core';export{RefreshToken}from'./refresh-token/refresh-token.model.js';import'fast-jwt';import'@mongez/fs';import'@warlock.js/logger';const authMigrations = [AccessTokenMigration, RefreshTokenMigration];export{authMigrations};//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/models/index.ts"],"sourcesContent":[null],"names":[],"mappings":"+aAOa,cAAc,GAAG,CAAC,oBAAoB,EAAE,qBAAqB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/migration.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB,KAyBhC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {migrate}from'@warlock.js/cascade';import {RefreshToken}from'./refresh-token.model.js';const RefreshTokenMigration = migrate(RefreshToken, {
|
|
2
|
+
name: "refreshToken",
|
|
3
|
+
up() {
|
|
4
|
+
// Create table
|
|
5
|
+
this.createTableIfNotExists();
|
|
6
|
+
// Primary key
|
|
7
|
+
this.primaryUuid();
|
|
8
|
+
// Token fields
|
|
9
|
+
this.text("token").unique();
|
|
10
|
+
this.uuid("user_id").index();
|
|
11
|
+
this.string("user_type", 50).nullable();
|
|
12
|
+
this.text("family_id").index().nullable();
|
|
13
|
+
this.timestamp("expires_at").index().nullable();
|
|
14
|
+
this.timestamp("last_used_at").nullable();
|
|
15
|
+
this.timestamp("revoked_at").nullable();
|
|
16
|
+
this.json("device_info").nullable();
|
|
17
|
+
// Timestamps
|
|
18
|
+
this.timestamps();
|
|
19
|
+
},
|
|
20
|
+
down() {
|
|
21
|
+
this.dropTableIfExists();
|
|
22
|
+
},
|
|
23
|
+
});export{RefreshTokenMigration};//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sources":["../../../src/models/refresh-token/migration.ts"],"sourcesContent":[null],"names":[],"mappings":"8FAGa,MAAA,qBAAqB,GAAG,OAAO,CAAC,YAAY,EAAE;AACzD,IAAA,IAAI,EAAE,cAAc;IACpB,EAAE,GAAA;;QAEA,IAAI,CAAC,sBAAsB,EAAE,CAAC;;QAG9B,IAAI,CAAC,WAAW,EAAE,CAAC;;QAGnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC;;QAGpC,IAAI,CAAC,UAAU,EAAE,CAAC;KACnB;IACD,IAAI,GAAA;QACF,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1B;AACF,CAAA"}
|
|
@@ -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 last_used_at)
|
|
29
|
+
*/
|
|
30
|
+
markAsUsed(): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=refresh-token.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-token.model.d.ts","sourceRoot":"","sources":["../../../src/models/refresh-token/refresh-token.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAc5C,qBAAa,YAAa,SAAQ,KAAK;IACrC;;OAEG;IACH,OAAc,KAAK,SAAoB;IAEvC;;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
|
+
user_id: v.scalar().required(),
|
|
4
|
+
user_type: v.string().required(),
|
|
5
|
+
family_id: v.string().required(),
|
|
6
|
+
expires_at: v.date().required(),
|
|
7
|
+
last_used_at: v.date().default(() => new Date()),
|
|
8
|
+
revoked_at: v.date().optional(),
|
|
9
|
+
device_info: v.record(v.any()).optional(),
|
|
10
|
+
});
|
|
11
|
+
class RefreshToken extends Model {
|
|
12
|
+
/**
|
|
13
|
+
* {@inheritDoc}
|
|
14
|
+
*/
|
|
15
|
+
static table = "refresh_tokens";
|
|
16
|
+
/**
|
|
17
|
+
* {@inheritDoc}
|
|
18
|
+
*/
|
|
19
|
+
static schema = refreshTokenSchema;
|
|
20
|
+
/**
|
|
21
|
+
* Check if token is expired
|
|
22
|
+
*/
|
|
23
|
+
get isExpired() {
|
|
24
|
+
const expiresAt = this.get("expires_at");
|
|
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("revoked_at");
|
|
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({ revoked_at: new Date() }).save();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Mark token as used (update last_used_at)
|
|
49
|
+
*/
|
|
50
|
+
async markAsUsed() {
|
|
51
|
+
await this.merge({ last_used_at: new Date() }).save();
|
|
52
|
+
}
|
|
53
|
+
}export{RefreshToken};//# sourceMappingURL=refresh-token.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-token.model.js","sources":["../../../src/models/refresh-token/refresh-token.model.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,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAC9B,IAAA,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAChC,IAAA,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;AAChC,IAAA,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;AAC/B,IAAA,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;AAChD,IAAA,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;AAC/B,IAAA,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;AAC1C,CAAA,CAAC,CAAC;AAEG,MAAO,YAAa,SAAQ,KAAK,CAAA;AACrC;;AAEG;AACI,IAAA,OAAO,KAAK,GAAG,gBAAgB,CAAC;AAEvC;;AAEG;AACI,IAAA,OAAO,MAAM,GAAG,kBAAkB,CAAC;AAE1C;;AAEG;AACH,IAAA,IAAW,SAAS,GAAA;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACzC,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,YAAY,CAAC,CAAC;KACjC;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,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;KACtD;AAED;;AAEG;AACI,IAAA,MAAM,UAAU,GAAA;AACrB,QAAA,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;KACvD;"}
|
|
@@ -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.model";
|
|
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,sBAAsB,CAAC;AACjD,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"}
|