tangled
alpha
login
or
join now
cosmik.network
/
semble
43
fork
atom
A social knowledge tool for researchers built on ATProto
43
fork
atom
overview
issues
13
pulls
pipelines
formatting
Wesley Finck
4 months ago
c9720a5a
d6f98144
+62
-22
3 changed files
expand all
collapse all
unified
split
src
modules
user
infrastructure
repositories
DrizzleTokenRepository.ts
services
JwtTokenService.ts
webapp
lib
auth
dal.ts
+33
-11
src/modules/user/infrastructure/repositories/DrizzleTokenRepository.ts
···
13
13
async saveRefreshToken(token: RefreshToken): Promise<Result<void>> {
14
14
try {
15
15
const tokenPreview = '...' + token.refreshToken.slice(-8);
16
16
-
console.log(`[DrizzleTokenRepository] Saving new refresh token: ${tokenPreview} for user: ${token.userDid}, expiresAt: ${token.expiresAt.toISOString()}`);
16
16
+
console.log(
17
17
+
`[DrizzleTokenRepository] Saving new refresh token: ${tokenPreview} for user: ${token.userDid}, expiresAt: ${token.expiresAt.toISOString()}`,
18
18
+
);
17
19
18
20
await this.db.insert(authRefreshTokens).values({
19
21
tokenId: token.tokenId,
···
24
26
revoked: token.revoked,
25
27
});
26
28
27
27
-
console.log(`[DrizzleTokenRepository] Successfully saved refresh token: ${tokenPreview}`);
29
29
+
console.log(
30
30
+
`[DrizzleTokenRepository] Successfully saved refresh token: ${tokenPreview}`,
31
31
+
);
28
32
return ok(undefined);
29
33
} catch (error: any) {
30
30
-
console.log(`[DrizzleTokenRepository] Failed to save refresh token: ${error.message}`);
34
34
+
console.log(
35
35
+
`[DrizzleTokenRepository] Failed to save refresh token: ${error.message}`,
36
36
+
);
31
37
return err(error);
32
38
}
33
39
}
···
37
43
): Promise<Result<RefreshToken | null>> {
38
44
try {
39
45
const tokenPreview = '...' + refreshToken.slice(-8);
40
40
-
console.log(`[DrizzleTokenRepository] Searching for token: ${tokenPreview}`);
46
46
+
console.log(
47
47
+
`[DrizzleTokenRepository] Searching for token: ${tokenPreview}`,
48
48
+
);
41
49
42
50
const result = await this.db
43
51
.select()
···
50
58
)
51
59
.limit(1);
52
60
53
53
-
console.log(`[DrizzleTokenRepository] Query returned ${result.length} results`);
61
61
+
console.log(
62
62
+
`[DrizzleTokenRepository] Query returned ${result.length} results`,
63
63
+
);
54
64
55
65
if (result.length === 0) {
56
66
// Check if token exists but is revoked
···
61
71
.limit(1);
62
72
63
73
if (revokedResult.length > 0) {
64
64
-
console.log(`[DrizzleTokenRepository] Token exists but is revoked: ${tokenPreview}`);
74
74
+
console.log(
75
75
+
`[DrizzleTokenRepository] Token exists but is revoked: ${tokenPreview}`,
76
76
+
);
65
77
} else {
66
66
-
console.log(`[DrizzleTokenRepository] Token does not exist in database: ${tokenPreview}`);
78
78
+
console.log(
79
79
+
`[DrizzleTokenRepository] Token does not exist in database: ${tokenPreview}`,
80
80
+
);
67
81
}
68
82
69
83
return ok(null);
70
84
}
71
85
72
86
const token = result[0]!;
73
73
-
console.log(`[DrizzleTokenRepository] Token found - userDid: ${token.userDid}, revoked: ${token.revoked}, expiresAt: ${token.expiresAt.toISOString()}`);
87
87
+
console.log(
88
88
+
`[DrizzleTokenRepository] Token found - userDid: ${token.userDid}, revoked: ${token.revoked}, expiresAt: ${token.expiresAt.toISOString()}`,
89
89
+
);
74
90
75
91
return ok({ ...token, revoked: token.revoked === true });
76
92
} catch (error: any) {
···
82
98
async revokeRefreshToken(refreshToken: string): Promise<Result<void>> {
83
99
try {
84
100
const tokenPreview = '...' + refreshToken.slice(-8);
85
85
-
console.log(`[DrizzleTokenRepository] Revoking refresh token: ${tokenPreview}`);
101
101
+
console.log(
102
102
+
`[DrizzleTokenRepository] Revoking refresh token: ${tokenPreview}`,
103
103
+
);
86
104
87
105
const result = await this.db
88
106
.update(authRefreshTokens)
89
107
.set({ revoked: true })
90
108
.where(eq(authRefreshTokens.refreshToken, refreshToken));
91
109
92
92
-
console.log(`[DrizzleTokenRepository] Successfully revoked refresh token: ${tokenPreview}`);
110
110
+
console.log(
111
111
+
`[DrizzleTokenRepository] Successfully revoked refresh token: ${tokenPreview}`,
112
112
+
);
93
113
return ok(undefined);
94
114
} catch (error: any) {
95
95
-
console.log(`[DrizzleTokenRepository] Failed to revoke refresh token: ${error.message}`);
115
115
+
console.log(
116
116
+
`[DrizzleTokenRepository] Failed to revoke refresh token: ${error.message}`,
117
117
+
);
96
118
return err(error);
97
119
}
98
120
}
+27
-9
src/modules/user/infrastructure/services/JwtTokenService.ts
···
66
66
async refreshToken(refreshToken: string): Promise<Result<TokenPair | null>> {
67
67
try {
68
68
const tokenPreview = '...' + refreshToken.slice(-8);
69
69
-
console.log(`[JwtTokenService] Starting refresh for token: ${tokenPreview}`);
69
69
+
console.log(
70
70
+
`[JwtTokenService] Starting refresh for token: ${tokenPreview}`,
71
71
+
);
70
72
71
73
// Find the refresh token
72
74
const findResult =
73
75
await this.tokenRepository.findRefreshToken(refreshToken);
74
76
75
77
if (findResult.isErr()) {
76
76
-
console.log(`[JwtTokenService] Database error finding token: ${findResult.error.message}`);
78
78
+
console.log(
79
79
+
`[JwtTokenService] Database error finding token: ${findResult.error.message}`,
80
80
+
);
77
81
return err(findResult.error);
78
82
}
79
83
80
84
const tokenData = findResult.unwrap();
81
85
if (!tokenData) {
82
82
-
console.log(`[JwtTokenService] Token not found in database: ${tokenPreview}`);
86
86
+
console.log(
87
87
+
`[JwtTokenService] Token not found in database: ${tokenPreview}`,
88
88
+
);
83
89
return ok(null);
84
90
}
85
91
86
86
-
console.log(`[JwtTokenService] Token found - userDid: ${tokenData.userDid}, issuedAt: ${tokenData.issuedAt.toISOString()}, expiresAt: ${tokenData.expiresAt.toISOString()}, revoked: ${tokenData.revoked}`);
92
92
+
console.log(
93
93
+
`[JwtTokenService] Token found - userDid: ${tokenData.userDid}, issuedAt: ${tokenData.issuedAt.toISOString()}, expiresAt: ${tokenData.expiresAt.toISOString()}, revoked: ${tokenData.revoked}`,
94
94
+
);
87
95
88
96
// Check if token is expired
89
97
const now = new Date();
90
98
if (now > tokenData.expiresAt) {
91
91
-
console.log(`[JwtTokenService] Token expired - now: ${now.toISOString()}, expiresAt: ${tokenData.expiresAt.toISOString()}`);
99
99
+
console.log(
100
100
+
`[JwtTokenService] Token expired - now: ${now.toISOString()}, expiresAt: ${tokenData.expiresAt.toISOString()}`,
101
101
+
);
92
102
await this.revokeToken(refreshToken);
93
103
return ok(null);
94
104
}
95
105
96
96
-
console.log(`[JwtTokenService] Token is valid, generating new tokens for user: ${tokenData.userDid}`);
106
106
+
console.log(
107
107
+
`[JwtTokenService] Token is valid, generating new tokens for user: ${tokenData.userDid}`,
108
108
+
);
97
109
98
110
// Generate new tokens
99
111
const newTokens = await this.generateToken(tokenData.userDid);
100
112
101
113
if (newTokens.isErr()) {
102
102
-
console.log(`[JwtTokenService] Failed to generate new tokens: ${newTokens.error.message}`);
114
114
+
console.log(
115
115
+
`[JwtTokenService] Failed to generate new tokens: ${newTokens.error.message}`,
116
116
+
);
103
117
return newTokens;
104
118
}
105
119
···
108
122
// Revoke old token
109
123
const revokeResult = await this.revokeToken(refreshToken);
110
124
if (revokeResult.isErr()) {
111
111
-
console.log(`[JwtTokenService] Warning: Failed to revoke old token: ${revokeResult.error.message}`);
125
125
+
console.log(
126
126
+
`[JwtTokenService] Warning: Failed to revoke old token: ${revokeResult.error.message}`,
127
127
+
);
112
128
} else {
113
129
console.log(`[JwtTokenService] Old token revoked successfully`);
114
130
}
115
131
116
132
return newTokens;
117
133
} catch (error: any) {
118
118
-
console.log(`[JwtTokenService] Unexpected error during refresh: ${error.message}`);
134
134
+
console.log(
135
135
+
`[JwtTokenService] Unexpected error during refresh: ${error.message}`,
136
136
+
);
119
137
return err(error);
120
138
}
121
139
}
+2
-2
src/webapp/lib/auth/dal.ts
···
13
13
console.log('Auth refresh already in progress, waiting...');
14
14
return refreshPromise;
15
15
}
16
16
-
16
16
+
17
17
isRefreshing = true;
18
18
refreshPromise = (async () => {
19
19
try {
···
34
34
refreshPromise = null;
35
35
}
36
36
})();
37
37
-
37
37
+
38
38
return refreshPromise;
39
39
},
40
40
);