Review multi-region session revocation

src/session-revocation-types.tsTypeScript
@@ -0,0 +1,56 @@
1+export interface SessionToken {
2+ sessionId: string;
3+ userId: string;
4+ revocationEpoch: number;
5+ expiresAt: string;
6+}
7+
8+export type RevocationEvent =
9+ | {
10+ eventId: string;
11+ kind: "session-revoked";
12+ sessionId: string;
13+ userId: string;
14+ }
15+ | {
16+ eventId: string;
17+ kind: "user-epoch-raised";
18+ userId: string;
19+ newEpoch: number;
20+ };
21+
22+export interface RegionalRevocationCache {
23+ getSessionRevoked(sessionId: string): Promise<boolean | undefined>;
24+ getUserEpoch(userId: string): Promise<number | undefined>;
25+ setSessionRevoked(sessionId: string): Promise<void>;
26+ setUserEpoch(userId: string, epoch: number): Promise<void>;
27+ raiseUserEpoch(userId: string, epoch: number): Promise<void>;
28+}
29+
30+export interface RevocationAuthority {
31+ isSessionRevoked(sessionId: string): Promise<boolean>;
32+ getUserEpoch(userId: string): Promise<number>;
33+}
34+
35+export interface RevocationRepository {
36+ revokeSession(sessionId: string, requestKey: string): Promise<void>;
37+ incrementUserEpoch(userId: string, requestKey: string): Promise<number>;
38+ revokeSessionAndEnqueue(
39+ sessionId: string,
40+ userId: string,
41+ requestKey: string,
42+ ): Promise<void>;
43+ incrementUserEpochAndEnqueue(
44+ userId: string,
45+ requestKey: string,
46+ ): Promise<number>;
47+}
48+
49+export interface EventBus {
50+ publish(event: RevocationEvent): Promise<void>;
51+}
52+
53+export interface RevocationMessage {
54+ event: RevocationEvent;
55+ ack(): Promise<void>;
56+}