A social knowledge tool for researchers built on ATProto
1import { Result, ok, err } from 'src/shared/core/Result';
2import {
3 ITokenRepository,
4 RefreshToken,
5} from '../../domain/repositories/ITokenRepository';
6
7export class InMemoryTokenRepository implements ITokenRepository {
8 private tokens: Map<string, RefreshToken> = new Map();
9
10 async saveRefreshToken(token: RefreshToken): Promise<Result<void>> {
11 try {
12 this.tokens.set(token.refreshToken, token);
13 return ok(undefined);
14 } catch (error: any) {
15 return err(error);
16 }
17 }
18
19 async findRefreshToken(
20 refreshToken: string,
21 ): Promise<Result<RefreshToken | null>> {
22 try {
23 const token = this.tokens.get(refreshToken);
24 if (!token || token.revoked) {
25 return ok(null);
26 }
27 return ok(token);
28 } catch (error: any) {
29 return err(error);
30 }
31 }
32
33 async revokeRefreshToken(refreshToken: string): Promise<Result<void>> {
34 try {
35 const token = this.tokens.get(refreshToken);
36 if (token) {
37 token.revoked = true;
38 this.tokens.set(refreshToken, token);
39 }
40 return ok(undefined);
41 } catch (error: any) {
42 return err(error);
43 }
44 }
45
46 // Helper method for testing
47 clear(): void {
48 this.tokens.clear();
49 }
50}