@effect-auth/core 0.1.0-alpha.2 → 0.1.0-alpha.4
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/README.md +148 -13
- package/dist/ApiKey.d.ts +207 -0
- package/dist/ApiKey.d.ts.map +1 -0
- package/dist/ApiKey.js +275 -0
- package/dist/ApiKey.js.map +1 -0
- package/dist/AuditLog.d.ts +204 -1
- package/dist/AuditLog.d.ts.map +1 -1
- package/dist/AuditLog.js +170 -0
- package/dist/AuditLog.js.map +1 -1
- package/dist/AuthConfig.d.ts +0 -9
- package/dist/AuthConfig.d.ts.map +1 -1
- package/dist/AuthConfig.js +1 -14
- package/dist/AuthConfig.js.map +1 -1
- package/dist/AuthFlow.d.ts +220 -51
- package/dist/AuthFlow.d.ts.map +1 -1
- package/dist/AuthFlow.js +550 -22
- package/dist/AuthFlow.js.map +1 -1
- package/dist/AuthKernel.d.ts +1 -1
- package/dist/Challenge.d.ts +5 -1
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +58 -48
- package/dist/Challenge.js.map +1 -1
- package/dist/Client.d.ts +242 -1
- package/dist/Client.d.ts.map +1 -1
- package/dist/Client.js +489 -1
- package/dist/Client.js.map +1 -1
- package/dist/D1Kysely.d.ts +1 -1
- package/dist/D1Kysely.d.ts.map +1 -1
- package/dist/EffectQbSqliteStorage.d.ts +156 -41
- package/dist/EffectQbSqliteStorage.d.ts.map +1 -1
- package/dist/EffectQbSqliteStorage.js +336 -33
- package/dist/EffectQbSqliteStorage.js.map +1 -1
- package/dist/EmailOtp.d.ts +5 -2
- package/dist/EmailOtp.d.ts.map +1 -1
- package/dist/EmailOtp.js +11 -4
- package/dist/EmailOtp.js.map +1 -1
- package/dist/EmailVerification.d.ts +2 -2
- package/dist/EmailVerification.d.ts.map +1 -1
- package/dist/EmailVerification.js +2 -3
- package/dist/EmailVerification.js.map +1 -1
- package/dist/HttpApi/Api.d.ts +1161 -19
- package/dist/HttpApi/Api.d.ts.map +1 -1
- package/dist/HttpApi/Api.js +1433 -20
- package/dist/HttpApi/Api.js.map +1 -1
- package/dist/HttpApi/Endpoints.d.ts +611 -0
- package/dist/HttpApi/Endpoints.d.ts.map +1 -1
- package/dist/HttpApi/Endpoints.js +242 -1
- package/dist/HttpApi/Endpoints.js.map +1 -1
- package/dist/HttpApi/Schemas.d.ts +704 -0
- package/dist/HttpApi/Schemas.d.ts.map +1 -1
- package/dist/HttpApi/Schemas.js +435 -1
- package/dist/HttpApi/Schemas.js.map +1 -1
- package/dist/HttpApi/Security.d.ts +13 -1
- package/dist/HttpApi/Security.d.ts.map +1 -1
- package/dist/HttpApi/Security.js +107 -16
- package/dist/HttpApi/Security.js.map +1 -1
- package/dist/HttpApi/Transport.d.ts +36 -2
- package/dist/HttpApi/Transport.d.ts.map +1 -1
- package/dist/HttpApi/Transport.js +151 -9
- package/dist/HttpApi/Transport.js.map +1 -1
- package/dist/Jwt.d.ts +271 -0
- package/dist/Jwt.d.ts.map +1 -0
- package/dist/Jwt.js +512 -0
- package/dist/Jwt.js.map +1 -0
- package/dist/KyselyStorage.d.ts +134 -1
- package/dist/KyselyStorage.d.ts.map +1 -1
- package/dist/KyselyStorage.js +918 -4
- package/dist/KyselyStorage.js.map +1 -1
- package/dist/LoginApproval.d.ts +314 -0
- package/dist/LoginApproval.d.ts.map +1 -0
- package/dist/LoginApproval.js +551 -0
- package/dist/LoginApproval.js.map +1 -0
- package/dist/LoginNotification.d.ts +183 -0
- package/dist/LoginNotification.d.ts.map +1 -0
- package/dist/LoginNotification.js +329 -0
- package/dist/LoginNotification.js.map +1 -0
- package/dist/LoginRisk.d.ts +73 -0
- package/dist/LoginRisk.d.ts.map +1 -0
- package/dist/LoginRisk.js +57 -0
- package/dist/LoginRisk.js.map +1 -0
- package/dist/MagicLink.d.ts +85 -0
- package/dist/MagicLink.d.ts.map +1 -0
- package/dist/MagicLink.js +206 -0
- package/dist/MagicLink.js.map +1 -0
- package/dist/Mailer.d.ts +33 -2
- package/dist/Mailer.d.ts.map +1 -1
- package/dist/Mailer.js +107 -0
- package/dist/Mailer.js.map +1 -1
- package/dist/Passkey.d.ts +334 -0
- package/dist/Passkey.d.ts.map +1 -0
- package/dist/Passkey.js +422 -0
- package/dist/Passkey.js.map +1 -0
- package/dist/Password.d.ts +138 -8
- package/dist/Password.d.ts.map +1 -1
- package/dist/Password.js +397 -8
- package/dist/Password.js.map +1 -1
- package/dist/RecoveryCode.d.ts +169 -0
- package/dist/RecoveryCode.d.ts.map +1 -0
- package/dist/RecoveryCode.js +299 -0
- package/dist/RecoveryCode.js.map +1 -0
- package/dist/RefreshToken.d.ts +222 -0
- package/dist/RefreshToken.d.ts.map +1 -0
- package/dist/RefreshToken.js +342 -0
- package/dist/RefreshToken.js.map +1 -0
- package/dist/Sessions.d.ts +52 -2
- package/dist/Sessions.d.ts.map +1 -1
- package/dist/Sessions.js +123 -1
- package/dist/Sessions.js.map +1 -1
- package/dist/StepUp.d.ts +44 -0
- package/dist/StepUp.d.ts.map +1 -0
- package/dist/StepUp.js +82 -0
- package/dist/StepUp.js.map +1 -0
- package/dist/Storage.d.ts +14 -1
- package/dist/Storage.d.ts.map +1 -1
- package/dist/Storage.js.map +1 -1
- package/dist/StorageMigrations.d.ts +9 -1
- package/dist/StorageMigrations.d.ts.map +1 -1
- package/dist/StorageMigrations.js +159 -0
- package/dist/StorageMigrations.js.map +1 -1
- package/dist/Testing.d.ts +1 -1
- package/dist/Totp.d.ts +220 -0
- package/dist/Totp.d.ts.map +1 -0
- package/dist/Totp.js +477 -0
- package/dist/Totp.js.map +1 -0
- package/dist/TrustedDevice.d.ts +115 -0
- package/dist/TrustedDevice.d.ts.map +1 -0
- package/dist/TrustedDevice.js +222 -0
- package/dist/TrustedDevice.js.map +1 -0
- package/dist/alchemy/cloudflare/Email.d.ts +25 -0
- package/dist/alchemy/cloudflare/Email.d.ts.map +1 -0
- package/dist/alchemy/cloudflare/Email.js +117 -0
- package/dist/alchemy/cloudflare/Email.js.map +1 -0
- package/dist/cloudflare/Email.d.ts +25 -0
- package/dist/cloudflare/Email.d.ts.map +1 -0
- package/dist/cloudflare/Email.js +153 -0
- package/dist/cloudflare/Email.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/migrations/0003_auth_login_approval_review.sql +22 -0
- package/migrations/0004_auth_trusted_device.sql +12 -0
- package/migrations/0005_auth_passkey.sql +17 -0
- package/migrations/0006_auth_totp_factor.sql +17 -0
- package/migrations/0007_auth_recovery_code.sql +13 -0
- package/migrations/0008_auth_api_key.sql +17 -0
- package/migrations/0009_auth_refresh_token.sql +21 -0
- package/migrations/0010_auth_jwt_revocation.sql +8 -0
- package/package.json +57 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { Brand, Context, Effect, Layer, Redacted } from "effect";
|
|
2
|
+
import type * as OptionTypes from "effect/Option";
|
|
3
|
+
import { Crypto } from "./Crypto.js";
|
|
4
|
+
import type { CryptoService } from "./Crypto.js";
|
|
5
|
+
import type { UnixMillis, UserId } from "./Identifiers.js";
|
|
6
|
+
export type RefreshTokenId = Brand.Branded<string, "auth/RefreshTokenId">;
|
|
7
|
+
export declare const RefreshTokenId: Brand.Constructor<RefreshTokenId>;
|
|
8
|
+
export type RefreshTokenFamilyId = Brand.Branded<string, "auth/RefreshTokenFamilyId">;
|
|
9
|
+
export declare const RefreshTokenFamilyId: Brand.Constructor<RefreshTokenFamilyId>;
|
|
10
|
+
export type RefreshTokenSecret = Brand.Branded<string, "auth/RefreshTokenSecret">;
|
|
11
|
+
export declare const RefreshTokenSecret: Brand.Constructor<RefreshTokenSecret>;
|
|
12
|
+
export type RefreshTokenSecretHash = Brand.Branded<string, "auth/RefreshTokenSecretHash">;
|
|
13
|
+
export declare const RefreshTokenSecretHash: Brand.Constructor<RefreshTokenSecretHash>;
|
|
14
|
+
export declare const defaultRefreshTokenSecretBytes = 48;
|
|
15
|
+
export declare const defaultRefreshTokenIdBytes = 16;
|
|
16
|
+
export declare const defaultRefreshTokenFamilyIdBytes = 16;
|
|
17
|
+
export type RefreshTokenOperation = "generate" | "hash" | "verify";
|
|
18
|
+
declare const RefreshTokenError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
19
|
+
readonly _tag: "RefreshTokenError";
|
|
20
|
+
} & Readonly<A>;
|
|
21
|
+
export declare class RefreshTokenError extends RefreshTokenError_base<{
|
|
22
|
+
readonly operation: RefreshTokenOperation;
|
|
23
|
+
readonly message: string;
|
|
24
|
+
readonly cause?: unknown;
|
|
25
|
+
}> {
|
|
26
|
+
}
|
|
27
|
+
export interface RefreshTokenGenerateInput {
|
|
28
|
+
readonly secretBytes?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface RefreshTokenHashInput {
|
|
31
|
+
readonly token: Redacted.Redacted<string>;
|
|
32
|
+
}
|
|
33
|
+
export interface RefreshTokenVerifyInput extends RefreshTokenHashInput {
|
|
34
|
+
readonly hash: RefreshTokenSecretHash;
|
|
35
|
+
}
|
|
36
|
+
export interface RefreshTokensService {
|
|
37
|
+
readonly generate: (input?: RefreshTokenGenerateInput) => Effect.Effect<Redacted.Redacted<RefreshTokenSecret>, RefreshTokenError>;
|
|
38
|
+
readonly hash: (input: RefreshTokenHashInput) => Effect.Effect<RefreshTokenSecretHash, RefreshTokenError>;
|
|
39
|
+
readonly verify: (input: RefreshTokenVerifyInput) => Effect.Effect<boolean, RefreshTokenError>;
|
|
40
|
+
}
|
|
41
|
+
declare const RefreshTokens_base: Context.ServiceClass<RefreshTokens, "auth/RefreshTokens", RefreshTokensService>;
|
|
42
|
+
export declare class RefreshTokens extends RefreshTokens_base {
|
|
43
|
+
}
|
|
44
|
+
export declare namespace RefreshTokens {
|
|
45
|
+
const make: (service: RefreshTokensService) => RefreshTokensService;
|
|
46
|
+
}
|
|
47
|
+
export interface RefreshTokensDependencies {
|
|
48
|
+
readonly crypto: CryptoService;
|
|
49
|
+
}
|
|
50
|
+
export declare const makeRefreshTokens: (dependencies: RefreshTokensDependencies) => RefreshTokensService;
|
|
51
|
+
export declare const RefreshTokensLive: Layer.Layer<RefreshTokens, never, Crypto>;
|
|
52
|
+
export interface RefreshTokenRecord {
|
|
53
|
+
readonly id: RefreshTokenId;
|
|
54
|
+
readonly familyId: RefreshTokenFamilyId;
|
|
55
|
+
readonly userId: UserId;
|
|
56
|
+
readonly secretHash: RefreshTokenSecretHash;
|
|
57
|
+
readonly createdAt: UnixMillis;
|
|
58
|
+
readonly expiresAt: UnixMillis;
|
|
59
|
+
readonly lastUsedAt?: UnixMillis;
|
|
60
|
+
readonly rotatedAt?: UnixMillis;
|
|
61
|
+
readonly replacedById?: RefreshTokenId;
|
|
62
|
+
readonly revokedAt?: UnixMillis;
|
|
63
|
+
readonly reuseDetectedAt?: UnixMillis;
|
|
64
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
65
|
+
}
|
|
66
|
+
export interface RefreshTokenListByUserInput {
|
|
67
|
+
readonly userId: UserId;
|
|
68
|
+
readonly includeRevoked?: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface RefreshTokenListByFamilyInput {
|
|
71
|
+
readonly familyId: RefreshTokenFamilyId;
|
|
72
|
+
readonly includeRevoked?: boolean;
|
|
73
|
+
}
|
|
74
|
+
export interface RefreshTokenRotateStoreInput {
|
|
75
|
+
readonly id: RefreshTokenId;
|
|
76
|
+
readonly rotatedAt: UnixMillis;
|
|
77
|
+
readonly replacement: RefreshTokenRecord;
|
|
78
|
+
}
|
|
79
|
+
export interface RefreshTokenRotatedRecords {
|
|
80
|
+
readonly previous: RefreshTokenRecord;
|
|
81
|
+
readonly replacement: RefreshTokenRecord;
|
|
82
|
+
}
|
|
83
|
+
export interface RefreshTokenMarkReuseDetectedInput {
|
|
84
|
+
readonly id: RefreshTokenId;
|
|
85
|
+
readonly reuseDetectedAt: UnixMillis;
|
|
86
|
+
}
|
|
87
|
+
export interface RefreshTokenRevokeInput {
|
|
88
|
+
readonly id: RefreshTokenId;
|
|
89
|
+
readonly revokedAt: UnixMillis;
|
|
90
|
+
readonly reason?: string;
|
|
91
|
+
}
|
|
92
|
+
export interface RefreshTokenRevokeFamilyInput {
|
|
93
|
+
readonly familyId: RefreshTokenFamilyId;
|
|
94
|
+
readonly revokedAt: UnixMillis;
|
|
95
|
+
readonly reason?: string;
|
|
96
|
+
}
|
|
97
|
+
export type RefreshTokenStoreOperation = "insert" | "find" | "list" | "rotate" | "reuse" | "revoke";
|
|
98
|
+
declare const RefreshTokenStoreError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
99
|
+
readonly _tag: "RefreshTokenStoreError";
|
|
100
|
+
} & Readonly<A>;
|
|
101
|
+
export declare class RefreshTokenStoreError extends RefreshTokenStoreError_base<{
|
|
102
|
+
readonly operation: RefreshTokenStoreOperation;
|
|
103
|
+
readonly message: string;
|
|
104
|
+
readonly cause?: unknown;
|
|
105
|
+
}> {
|
|
106
|
+
}
|
|
107
|
+
export interface RefreshTokenStoreService {
|
|
108
|
+
readonly insert: (row: RefreshTokenRecord) => Effect.Effect<void, RefreshTokenStoreError>;
|
|
109
|
+
readonly findById: (id: RefreshTokenId) => Effect.Effect<OptionTypes.Option<RefreshTokenRecord>, RefreshTokenStoreError>;
|
|
110
|
+
readonly findBySecretHash: (hash: RefreshTokenSecretHash) => Effect.Effect<OptionTypes.Option<RefreshTokenRecord>, RefreshTokenStoreError>;
|
|
111
|
+
readonly listByUser: (input: RefreshTokenListByUserInput) => Effect.Effect<readonly RefreshTokenRecord[], RefreshTokenStoreError>;
|
|
112
|
+
readonly listByFamily: (input: RefreshTokenListByFamilyInput) => Effect.Effect<readonly RefreshTokenRecord[], RefreshTokenStoreError>;
|
|
113
|
+
readonly rotate: (input: RefreshTokenRotateStoreInput) => Effect.Effect<OptionTypes.Option<RefreshTokenRotatedRecords>, RefreshTokenStoreError>;
|
|
114
|
+
readonly markReuseDetected: (input: RefreshTokenMarkReuseDetectedInput) => Effect.Effect<OptionTypes.Option<RefreshTokenRecord>, RefreshTokenStoreError>;
|
|
115
|
+
readonly revoke: (input: RefreshTokenRevokeInput) => Effect.Effect<void, RefreshTokenStoreError>;
|
|
116
|
+
readonly revokeFamily: (input: RefreshTokenRevokeFamilyInput) => Effect.Effect<void, RefreshTokenStoreError>;
|
|
117
|
+
}
|
|
118
|
+
declare const RefreshTokenStore_base: Context.ServiceClass<RefreshTokenStore, "auth/RefreshTokenStore", RefreshTokenStoreService>;
|
|
119
|
+
export declare class RefreshTokenStore extends RefreshTokenStore_base {
|
|
120
|
+
}
|
|
121
|
+
export declare namespace RefreshTokenStore {
|
|
122
|
+
const make: (service: RefreshTokenStoreService) => RefreshTokenStoreService;
|
|
123
|
+
}
|
|
124
|
+
export declare const makeRefreshTokenStoreMemory: () => RefreshTokenStoreService;
|
|
125
|
+
export declare const RefreshTokenStoreMemoryLive: Layer.Layer<RefreshTokenStore, never, never>;
|
|
126
|
+
export interface RefreshTokenInfo {
|
|
127
|
+
readonly id: RefreshTokenId;
|
|
128
|
+
readonly familyId: RefreshTokenFamilyId;
|
|
129
|
+
readonly userId: UserId;
|
|
130
|
+
readonly createdAt: UnixMillis;
|
|
131
|
+
readonly expiresAt: UnixMillis;
|
|
132
|
+
readonly lastUsedAt?: UnixMillis;
|
|
133
|
+
readonly rotatedAt?: UnixMillis;
|
|
134
|
+
readonly replacedById?: RefreshTokenId;
|
|
135
|
+
readonly revokedAt?: UnixMillis;
|
|
136
|
+
readonly reuseDetectedAt?: UnixMillis;
|
|
137
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
138
|
+
}
|
|
139
|
+
export interface CreatedRefreshToken {
|
|
140
|
+
readonly token: Redacted.Redacted<RefreshTokenSecret>;
|
|
141
|
+
readonly refreshToken: RefreshTokenInfo;
|
|
142
|
+
}
|
|
143
|
+
export interface RefreshTokenIssueForUserInput {
|
|
144
|
+
readonly userId: UserId;
|
|
145
|
+
readonly tokenId?: RefreshTokenId;
|
|
146
|
+
readonly familyId?: RefreshTokenFamilyId;
|
|
147
|
+
readonly now?: UnixMillis;
|
|
148
|
+
readonly expiresAt: UnixMillis;
|
|
149
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
150
|
+
}
|
|
151
|
+
export interface RefreshTokenRotateInput {
|
|
152
|
+
readonly token: Redacted.Redacted<string>;
|
|
153
|
+
readonly tokenId?: RefreshTokenId;
|
|
154
|
+
readonly now?: UnixMillis;
|
|
155
|
+
readonly expiresAt: UnixMillis;
|
|
156
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
157
|
+
}
|
|
158
|
+
export type RefreshTokenInvalidReason = "not_found" | "expired" | "revoked";
|
|
159
|
+
export type RefreshTokenRotationResult = {
|
|
160
|
+
readonly _tag: "Rotated";
|
|
161
|
+
readonly token: Redacted.Redacted<RefreshTokenSecret>;
|
|
162
|
+
readonly refreshToken: RefreshTokenInfo;
|
|
163
|
+
readonly previousToken: RefreshTokenInfo;
|
|
164
|
+
} | {
|
|
165
|
+
readonly _tag: "Invalid";
|
|
166
|
+
readonly reason: RefreshTokenInvalidReason;
|
|
167
|
+
readonly refreshToken?: RefreshTokenInfo;
|
|
168
|
+
} | {
|
|
169
|
+
readonly _tag: "ReuseDetected";
|
|
170
|
+
readonly refreshToken: RefreshTokenInfo;
|
|
171
|
+
readonly revokedAt: UnixMillis;
|
|
172
|
+
};
|
|
173
|
+
export interface RefreshTokenManagementListInput {
|
|
174
|
+
readonly userId: UserId;
|
|
175
|
+
readonly includeRevoked?: boolean;
|
|
176
|
+
}
|
|
177
|
+
export interface RefreshTokenManagementRevokeInput {
|
|
178
|
+
readonly userId: UserId;
|
|
179
|
+
readonly tokenId: RefreshTokenId;
|
|
180
|
+
readonly revokedAt?: UnixMillis;
|
|
181
|
+
readonly reason?: string;
|
|
182
|
+
}
|
|
183
|
+
export interface RefreshTokenManagementRevokeFamilyInput {
|
|
184
|
+
readonly userId: UserId;
|
|
185
|
+
readonly familyId: RefreshTokenFamilyId;
|
|
186
|
+
readonly revokedAt?: UnixMillis;
|
|
187
|
+
readonly reason?: string;
|
|
188
|
+
}
|
|
189
|
+
export type RefreshTokenManagementOperation = "issue" | "rotate" | "list" | "revoke" | "revoke-family";
|
|
190
|
+
declare const RefreshTokenManagementError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
191
|
+
readonly _tag: "RefreshTokenManagementError";
|
|
192
|
+
} & Readonly<A>;
|
|
193
|
+
export declare class RefreshTokenManagementError extends RefreshTokenManagementError_base<{
|
|
194
|
+
readonly operation: RefreshTokenManagementOperation;
|
|
195
|
+
readonly message: string;
|
|
196
|
+
readonly cause?: unknown;
|
|
197
|
+
}> {
|
|
198
|
+
}
|
|
199
|
+
export interface RefreshTokenManagementService {
|
|
200
|
+
readonly issueForUser: (input: RefreshTokenIssueForUserInput) => Effect.Effect<CreatedRefreshToken, RefreshTokenManagementError>;
|
|
201
|
+
readonly rotate: (input: RefreshTokenRotateInput) => Effect.Effect<RefreshTokenRotationResult, RefreshTokenManagementError>;
|
|
202
|
+
readonly listForUser: (input: RefreshTokenManagementListInput) => Effect.Effect<readonly RefreshTokenInfo[], RefreshTokenManagementError>;
|
|
203
|
+
readonly revokeForUser: (input: RefreshTokenManagementRevokeInput) => Effect.Effect<void, RefreshTokenManagementError>;
|
|
204
|
+
readonly revokeFamilyForUser: (input: RefreshTokenManagementRevokeFamilyInput) => Effect.Effect<void, RefreshTokenManagementError>;
|
|
205
|
+
}
|
|
206
|
+
declare const RefreshTokenManagement_base: Context.ServiceClass<RefreshTokenManagement, "auth/RefreshTokenManagement", RefreshTokenManagementService>;
|
|
207
|
+
export declare class RefreshTokenManagement extends RefreshTokenManagement_base {
|
|
208
|
+
}
|
|
209
|
+
export declare namespace RefreshTokenManagement {
|
|
210
|
+
const make: (service: RefreshTokenManagementService) => RefreshTokenManagementService;
|
|
211
|
+
}
|
|
212
|
+
export interface RefreshTokenManagementDependencies {
|
|
213
|
+
readonly refreshTokens: RefreshTokensService;
|
|
214
|
+
readonly crypto: CryptoService;
|
|
215
|
+
readonly tokenStore: RefreshTokenStoreService;
|
|
216
|
+
readonly tokenIdBytes?: number;
|
|
217
|
+
readonly familyIdBytes?: number;
|
|
218
|
+
}
|
|
219
|
+
export declare const makeRefreshTokenManagement: (dependencies: RefreshTokenManagementDependencies) => RefreshTokenManagementService;
|
|
220
|
+
export declare const RefreshTokenManagementLive: Layer.Layer<RefreshTokenManagement, never, Crypto | RefreshTokens | RefreshTokenStore>;
|
|
221
|
+
export {};
|
|
222
|
+
//# sourceMappingURL=RefreshToken.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RefreshToken.d.ts","sourceRoot":"","sources":["../src/RefreshToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAQ,MAAM,EAAE,KAAK,EAAU,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC/E,OAAO,KAAK,KAAK,WAAW,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG3D,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAC1E,eAAO,MAAM,cAAc,mCAAkC,CAAC;AAE9D,MAAM,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAC9C,MAAM,EACN,2BAA2B,CAC5B,CAAC;AACF,eAAO,MAAM,oBAAoB,yCAAwC,CAAC;AAE1E,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;AAClF,eAAO,MAAM,kBAAkB,uCAAsC,CAAC;AAEtE,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC,OAAO,CAChD,MAAM,EACN,6BAA6B,CAC9B,CAAC;AACF,eAAO,MAAM,sBAAsB,2CAA0C,CAAC;AAE9E,eAAO,MAAM,8BAA8B,KAAK,CAAC;AACjD,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;;;;AAEnE,qBAAa,iBAAkB,SAAQ,uBAAsC;IAC3E,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;CAAG;AAEL,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;CACvC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,CACjB,KAAK,CAAC,EAAE,yBAAyB,KAC9B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC7E,QAAQ,CAAC,IAAI,EAAE,CACb,KAAK,EAAE,qBAAqB,KACzB,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,CAAC;IAC9D,QAAQ,CAAC,MAAM,EAAE,CACf,KAAK,EAAE,uBAAuB,KAC3B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;CAChD;;AAED,qBAAa,aAAc,SAAQ,kBAGV;CAAG;AAE5B,yBAAiB,aAAa,CAAC;IACtB,MAAM,IAAI,GAAI,SAAS,oBAAoB,KAAG,oBAC1B,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAoDD,eAAO,MAAM,iBAAiB,GAC5B,cAAc,yBAAyB,KACtC,oBAgDC,CAAC;AAEL,eAAO,MAAM,iBAAiB,2CAM7B,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;CAC1C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;CAC1C;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC;CACtC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,0BAA0B,GAClC,QAAQ,GACR,MAAM,GACN,MAAM,GACN,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;;;;AAEb,qBAAa,sBAAuB,SAAQ,4BAE1C;IACA,QAAQ,CAAC,SAAS,EAAE,0BAA0B,CAAC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;CAAG;AAEL,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,CACf,GAAG,EAAE,kBAAkB,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,CACjB,EAAE,EAAE,cAAc,KACf,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,CAAC;IACnF,QAAQ,CAAC,gBAAgB,EAAE,CACzB,IAAI,EAAE,sBAAsB,KACzB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,CAAC;IACnF,QAAQ,CAAC,UAAU,EAAE,CACnB,KAAK,EAAE,2BAA2B,KAC/B,MAAM,CAAC,MAAM,CAAC,SAAS,kBAAkB,EAAE,EAAE,sBAAsB,CAAC,CAAC;IAC1E,QAAQ,CAAC,YAAY,EAAE,CACrB,KAAK,EAAE,6BAA6B,KACjC,MAAM,CAAC,MAAM,CAAC,SAAS,kBAAkB,EAAE,EAAE,sBAAsB,CAAC,CAAC;IAC1E,QAAQ,CAAC,MAAM,EAAE,CACf,KAAK,EAAE,4BAA4B,KAChC,MAAM,CAAC,MAAM,CAChB,WAAW,CAAC,MAAM,CAAC,0BAA0B,CAAC,EAC9C,sBAAsB,CACvB,CAAC;IACF,QAAQ,CAAC,iBAAiB,EAAE,CAC1B,KAAK,EAAE,kCAAkC,KACtC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,CAAC;IACnF,QAAQ,CAAC,MAAM,EAAE,CACf,KAAK,EAAE,uBAAuB,KAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,CACrB,KAAK,EAAE,6BAA6B,KACjC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;CAClD;;AAED,qBAAa,iBAAkB,SAAQ,sBAGV;CAAG;AAEhC,yBAAiB,iBAAiB,CAAC;IAC1B,MAAM,IAAI,GACf,SAAS,wBAAwB,KAChC,wBAAyD,CAAC;CAC9D;AAmBD,eAAO,MAAM,2BAA2B,QAAO,wBAyH9C,CAAC;AAEF,eAAO,MAAM,2BAA2B,8CAEvC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IACtD,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;CACzC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED,MAAM,MAAM,yBAAyB,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5E,MAAM,MAAM,0BAA0B,GAClC;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IACtD,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,gBAAgB,CAAC;CAC1C,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC;CAC1C,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;CAChC,CAAC;AAEN,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uCAAuC;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,+BAA+B,GACvC,OAAO,GACP,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,eAAe,CAAC;;;;AAEpB,qBAAa,2BAA4B,SAAQ,iCAE/C;IACA,QAAQ,CAAC,SAAS,EAAE,+BAA+B,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;CAAG;AAEL,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,YAAY,EAAE,CACrB,KAAK,EAAE,6BAA6B,KACjC,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,CAAC;IACrE,QAAQ,CAAC,MAAM,EAAE,CACf,KAAK,EAAE,uBAAuB,KAC3B,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,2BAA2B,CAAC,CAAC;IAC5E,QAAQ,CAAC,WAAW,EAAE,CACpB,KAAK,EAAE,+BAA+B,KACnC,MAAM,CAAC,MAAM,CAAC,SAAS,gBAAgB,EAAE,EAAE,2BAA2B,CAAC,CAAC;IAC7E,QAAQ,CAAC,aAAa,EAAE,CACtB,KAAK,EAAE,iCAAiC,KACrC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;IACtD,QAAQ,CAAC,mBAAmB,EAAE,CAC5B,KAAK,EAAE,uCAAuC,KAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;CACvD;;AAED,qBAAa,sBAAuB,SAAQ,2BAGV;CAAG;AAErC,yBAAiB,sBAAsB,CAAC;IAC/B,MAAM,IAAI,GACf,SAAS,6BAA6B,KACrC,6BAAmE,CAAC;CACxE;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAC9C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AA+LD,eAAO,MAAM,0BAA0B,GACrC,cAAc,kCAAkC,KAC/C,6BA8KC,CAAC;AAEL,eAAO,MAAM,0BAA0B,wFAQtC,CAAC"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import { Brand, Context, Data, Effect, Layer, Option, Redacted } from "effect";
|
|
2
|
+
import { Crypto } from "./Crypto.js";
|
|
3
|
+
import { currentUnixMillis } from "./Internal.js";
|
|
4
|
+
export const RefreshTokenId = Brand.nominal();
|
|
5
|
+
export const RefreshTokenFamilyId = Brand.nominal();
|
|
6
|
+
export const RefreshTokenSecret = Brand.nominal();
|
|
7
|
+
export const RefreshTokenSecretHash = Brand.nominal();
|
|
8
|
+
export const defaultRefreshTokenSecretBytes = 48;
|
|
9
|
+
export const defaultRefreshTokenIdBytes = 16;
|
|
10
|
+
export const defaultRefreshTokenFamilyIdBytes = 16;
|
|
11
|
+
export class RefreshTokenError extends Data.TaggedError("RefreshTokenError") {
|
|
12
|
+
}
|
|
13
|
+
export class RefreshTokens extends Context.Service()("auth/RefreshTokens") {
|
|
14
|
+
}
|
|
15
|
+
(function (RefreshTokens) {
|
|
16
|
+
RefreshTokens.make = (service) => RefreshTokens.of(service);
|
|
17
|
+
})(RefreshTokens || (RefreshTokens = {}));
|
|
18
|
+
const textEncoder = new TextEncoder();
|
|
19
|
+
const refreshTokenError = (operation, message, cause) => new RefreshTokenError({
|
|
20
|
+
operation,
|
|
21
|
+
message,
|
|
22
|
+
...(cause === undefined ? {} : { cause }),
|
|
23
|
+
});
|
|
24
|
+
const validateByteLength = (byteLength, operation, label) => Number.isInteger(byteLength) && byteLength >= 16 && byteLength <= 256
|
|
25
|
+
? Effect.succeed(byteLength)
|
|
26
|
+
: Effect.fail(refreshTokenError(operation, `${label} byte length must be an integer between 16 and 256`));
|
|
27
|
+
const refreshTokenSecretValue = (token, operation) => {
|
|
28
|
+
const value = Redacted.value(token).trim();
|
|
29
|
+
return value.length === 0
|
|
30
|
+
? Effect.fail(refreshTokenError(operation, "Refresh token must not be empty"))
|
|
31
|
+
: Effect.succeed(value);
|
|
32
|
+
};
|
|
33
|
+
const hashRefreshTokenSecretValue = (dependencies, token, operation) => dependencies.crypto.digestSha256({ data: `refresh-token:${token}` }).pipe(Effect.map((hash) => RefreshTokenSecretHash(`sha256:${hash}`)), Effect.mapError((cause) => refreshTokenError(operation, "Failed to hash refresh token", cause)));
|
|
34
|
+
export const makeRefreshTokens = (dependencies) => RefreshTokens.make({
|
|
35
|
+
generate: Effect.fn("auth.refresh_token.generate")(function* (input) {
|
|
36
|
+
const secretBytes = yield* validateByteLength(input?.secretBytes ?? defaultRefreshTokenSecretBytes, "generate", "Refresh token secret");
|
|
37
|
+
const token = yield* dependencies.crypto.randomToken(secretBytes).pipe(Effect.map(RefreshTokenSecret), Effect.mapError((cause) => refreshTokenError("generate", "Failed to generate refresh token", cause)));
|
|
38
|
+
return Redacted.make(token);
|
|
39
|
+
}),
|
|
40
|
+
hash: Effect.fn("auth.refresh_token.hash")(function* (input) {
|
|
41
|
+
const token = yield* refreshTokenSecretValue(input.token, "hash");
|
|
42
|
+
return yield* hashRefreshTokenSecretValue(dependencies, token, "hash");
|
|
43
|
+
}),
|
|
44
|
+
verify: Effect.fn("auth.refresh_token.verify")(function* (input) {
|
|
45
|
+
const token = yield* refreshTokenSecretValue(input.token, "verify").pipe(Effect.catchTag("RefreshTokenError", () => Effect.succeed(undefined)));
|
|
46
|
+
if (token === undefined) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
const hash = yield* hashRefreshTokenSecretValue(dependencies, token, "verify");
|
|
50
|
+
return yield* dependencies.crypto
|
|
51
|
+
.timingSafeEqual({
|
|
52
|
+
left: textEncoder.encode(hash),
|
|
53
|
+
right: textEncoder.encode(input.hash),
|
|
54
|
+
})
|
|
55
|
+
.pipe(Effect.mapError((cause) => refreshTokenError("verify", "Failed to compare refresh token hashes", cause)));
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
export const RefreshTokensLive = Layer.effect(RefreshTokens)(Effect.gen(function* () {
|
|
59
|
+
const crypto = yield* Crypto;
|
|
60
|
+
return makeRefreshTokens({ crypto });
|
|
61
|
+
}));
|
|
62
|
+
export class RefreshTokenStoreError extends Data.TaggedError("RefreshTokenStoreError") {
|
|
63
|
+
}
|
|
64
|
+
export class RefreshTokenStore extends Context.Service()("auth/RefreshTokenStore") {
|
|
65
|
+
}
|
|
66
|
+
(function (RefreshTokenStore) {
|
|
67
|
+
RefreshTokenStore.make = (service) => RefreshTokenStore.of(service);
|
|
68
|
+
})(RefreshTokenStore || (RefreshTokenStore = {}));
|
|
69
|
+
const cloneMetadata = (metadata) => metadata === undefined ? undefined : structuredClone(metadata);
|
|
70
|
+
const cloneRefreshTokenRecord = (record) => ({
|
|
71
|
+
...record,
|
|
72
|
+
...(record.metadata === undefined ? {} : { metadata: cloneMetadata(record.metadata) }),
|
|
73
|
+
});
|
|
74
|
+
const metadataWithReason = (metadata, key, reason) => reason === undefined ? metadata : { ...metadata, [key]: reason };
|
|
75
|
+
export const makeRefreshTokenStoreMemory = () => {
|
|
76
|
+
const tokensById = new Map();
|
|
77
|
+
const idByHash = new Map();
|
|
78
|
+
return RefreshTokenStore.make({
|
|
79
|
+
insert: (row) => Effect.sync(() => {
|
|
80
|
+
tokensById.set(row.id, cloneRefreshTokenRecord(row));
|
|
81
|
+
idByHash.set(row.secretHash, row.id);
|
|
82
|
+
}),
|
|
83
|
+
findById: (id) => Effect.sync(() => {
|
|
84
|
+
const row = tokensById.get(id);
|
|
85
|
+
return row === undefined
|
|
86
|
+
? Option.none()
|
|
87
|
+
: Option.some(cloneRefreshTokenRecord(row));
|
|
88
|
+
}),
|
|
89
|
+
findBySecretHash: (hash) => Effect.sync(() => {
|
|
90
|
+
const id = idByHash.get(hash);
|
|
91
|
+
const row = id === undefined ? undefined : tokensById.get(id);
|
|
92
|
+
return row === undefined
|
|
93
|
+
? Option.none()
|
|
94
|
+
: Option.some(cloneRefreshTokenRecord(row));
|
|
95
|
+
}),
|
|
96
|
+
listByUser: (input) => Effect.sync(() => [...tokensById.values()]
|
|
97
|
+
.filter((row) => row.userId === input.userId &&
|
|
98
|
+
(input.includeRevoked === true || row.revokedAt === undefined))
|
|
99
|
+
.map(cloneRefreshTokenRecord)),
|
|
100
|
+
listByFamily: (input) => Effect.sync(() => [...tokensById.values()]
|
|
101
|
+
.filter((row) => row.familyId === input.familyId &&
|
|
102
|
+
(input.includeRevoked === true || row.revokedAt === undefined))
|
|
103
|
+
.map(cloneRefreshTokenRecord)),
|
|
104
|
+
rotate: (input) => Effect.sync(() => {
|
|
105
|
+
const current = tokensById.get(input.id);
|
|
106
|
+
if (current === undefined ||
|
|
107
|
+
current.rotatedAt !== undefined ||
|
|
108
|
+
current.revokedAt !== undefined) {
|
|
109
|
+
return Option.none();
|
|
110
|
+
}
|
|
111
|
+
const previous = {
|
|
112
|
+
...current,
|
|
113
|
+
lastUsedAt: input.rotatedAt,
|
|
114
|
+
rotatedAt: input.rotatedAt,
|
|
115
|
+
replacedById: input.replacement.id,
|
|
116
|
+
};
|
|
117
|
+
tokensById.set(previous.id, previous);
|
|
118
|
+
tokensById.set(input.replacement.id, cloneRefreshTokenRecord(input.replacement));
|
|
119
|
+
idByHash.set(input.replacement.secretHash, input.replacement.id);
|
|
120
|
+
return Option.some({
|
|
121
|
+
previous: cloneRefreshTokenRecord(previous),
|
|
122
|
+
replacement: cloneRefreshTokenRecord(input.replacement),
|
|
123
|
+
});
|
|
124
|
+
}),
|
|
125
|
+
markReuseDetected: (input) => Effect.sync(() => {
|
|
126
|
+
const row = tokensById.get(input.id);
|
|
127
|
+
if (row === undefined) {
|
|
128
|
+
return Option.none();
|
|
129
|
+
}
|
|
130
|
+
const updated = {
|
|
131
|
+
...row,
|
|
132
|
+
reuseDetectedAt: input.reuseDetectedAt,
|
|
133
|
+
};
|
|
134
|
+
tokensById.set(input.id, updated);
|
|
135
|
+
return Option.some(cloneRefreshTokenRecord(updated));
|
|
136
|
+
}),
|
|
137
|
+
revoke: (input) => Effect.sync(() => {
|
|
138
|
+
const row = tokensById.get(input.id);
|
|
139
|
+
if (row !== undefined) {
|
|
140
|
+
tokensById.set(input.id, {
|
|
141
|
+
...row,
|
|
142
|
+
revokedAt: input.revokedAt,
|
|
143
|
+
metadata: metadataWithReason(row.metadata, "revokeReason", input.reason),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}),
|
|
147
|
+
revokeFamily: (input) => Effect.sync(() => {
|
|
148
|
+
for (const row of tokensById.values()) {
|
|
149
|
+
if (row.familyId === input.familyId) {
|
|
150
|
+
tokensById.set(row.id, {
|
|
151
|
+
...row,
|
|
152
|
+
revokedAt: input.revokedAt,
|
|
153
|
+
metadata: metadataWithReason(row.metadata, "familyRevokeReason", input.reason),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}),
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
export const RefreshTokenStoreMemoryLive = Layer.sync(RefreshTokenStore)(makeRefreshTokenStoreMemory);
|
|
161
|
+
export class RefreshTokenManagementError extends Data.TaggedError("RefreshTokenManagementError") {
|
|
162
|
+
}
|
|
163
|
+
export class RefreshTokenManagement extends Context.Service()("auth/RefreshTokenManagement") {
|
|
164
|
+
}
|
|
165
|
+
(function (RefreshTokenManagement) {
|
|
166
|
+
RefreshTokenManagement.make = (service) => RefreshTokenManagement.of(service);
|
|
167
|
+
})(RefreshTokenManagement || (RefreshTokenManagement = {}));
|
|
168
|
+
const refreshTokenInfo = (record) => ({
|
|
169
|
+
id: record.id,
|
|
170
|
+
familyId: record.familyId,
|
|
171
|
+
userId: record.userId,
|
|
172
|
+
createdAt: record.createdAt,
|
|
173
|
+
expiresAt: record.expiresAt,
|
|
174
|
+
...(record.lastUsedAt === undefined ? {} : { lastUsedAt: record.lastUsedAt }),
|
|
175
|
+
...(record.rotatedAt === undefined ? {} : { rotatedAt: record.rotatedAt }),
|
|
176
|
+
...(record.replacedById === undefined ? {} : { replacedById: record.replacedById }),
|
|
177
|
+
...(record.revokedAt === undefined ? {} : { revokedAt: record.revokedAt }),
|
|
178
|
+
...(record.reuseDetectedAt === undefined
|
|
179
|
+
? {}
|
|
180
|
+
: { reuseDetectedAt: record.reuseDetectedAt }),
|
|
181
|
+
...(record.metadata === undefined ? {} : { metadata: record.metadata }),
|
|
182
|
+
});
|
|
183
|
+
const refreshTokenManagementError = (operation, message, cause) => new RefreshTokenManagementError({
|
|
184
|
+
operation,
|
|
185
|
+
message,
|
|
186
|
+
...(cause === undefined ? {} : { cause }),
|
|
187
|
+
});
|
|
188
|
+
const makeRefreshTokenId = (dependencies, operation) => dependencies.crypto
|
|
189
|
+
.randomToken(dependencies.tokenIdBytes ?? defaultRefreshTokenIdBytes)
|
|
190
|
+
.pipe(Effect.map(RefreshTokenId), Effect.mapError((cause) => refreshTokenManagementError(operation, "Failed to generate refresh token id", cause)));
|
|
191
|
+
const makeRefreshTokenFamilyId = (dependencies) => dependencies.crypto
|
|
192
|
+
.randomToken(dependencies.familyIdBytes ?? defaultRefreshTokenFamilyIdBytes)
|
|
193
|
+
.pipe(Effect.map(RefreshTokenFamilyId), Effect.mapError((cause) => refreshTokenManagementError("issue", "Failed to generate refresh token family id", cause)));
|
|
194
|
+
const generateRefreshToken = (dependencies, operation) => dependencies.refreshTokens.generate().pipe(Effect.mapError((cause) => refreshTokenManagementError(operation, "Failed to generate refresh token", cause)));
|
|
195
|
+
const hashRefreshToken = (dependencies, operation, token) => dependencies.refreshTokens.hash({ token }).pipe(Effect.mapError((cause) => refreshTokenManagementError(operation, "Failed to hash refresh token", cause)));
|
|
196
|
+
const isExpired = (record, now) => Number(record.expiresAt) <= Number(now);
|
|
197
|
+
const invalidRotation = (reason, record) => ({
|
|
198
|
+
_tag: "Invalid",
|
|
199
|
+
reason,
|
|
200
|
+
...(record === undefined ? {} : { refreshToken: refreshTokenInfo(record) }),
|
|
201
|
+
});
|
|
202
|
+
const loadOwnedRefreshToken = (dependencies, operation, input) => Effect.gen(function* () {
|
|
203
|
+
const token = yield* dependencies.tokenStore.findById(input.tokenId).pipe(Effect.mapError((cause) => refreshTokenManagementError(operation, "Failed to load refresh token", cause)));
|
|
204
|
+
if (Option.isNone(token) || token.value.userId !== input.userId) {
|
|
205
|
+
return yield* refreshTokenManagementError(operation, "Refresh token not found");
|
|
206
|
+
}
|
|
207
|
+
return token.value;
|
|
208
|
+
});
|
|
209
|
+
const loadOwnedRefreshTokenFamily = (dependencies, input) => Effect.gen(function* () {
|
|
210
|
+
const tokens = yield* dependencies.tokenStore
|
|
211
|
+
.listByFamily({ familyId: input.familyId, includeRevoked: true })
|
|
212
|
+
.pipe(Effect.mapError((cause) => refreshTokenManagementError("revoke-family", "Failed to load refresh token family", cause)));
|
|
213
|
+
if (tokens.length === 0 || tokens.some((token) => token.userId !== input.userId)) {
|
|
214
|
+
return yield* refreshTokenManagementError("revoke-family", "Refresh token family not found");
|
|
215
|
+
}
|
|
216
|
+
return tokens;
|
|
217
|
+
});
|
|
218
|
+
const markReuseDetected = (dependencies, record, now) => Effect.gen(function* () {
|
|
219
|
+
yield* dependencies.tokenStore
|
|
220
|
+
.markReuseDetected({ id: record.id, reuseDetectedAt: now })
|
|
221
|
+
.pipe(Effect.mapError((cause) => refreshTokenManagementError("rotate", "Failed to mark refresh token reuse", cause)));
|
|
222
|
+
yield* dependencies.tokenStore
|
|
223
|
+
.revokeFamily({
|
|
224
|
+
familyId: record.familyId,
|
|
225
|
+
revokedAt: now,
|
|
226
|
+
reason: "reuse_detected",
|
|
227
|
+
})
|
|
228
|
+
.pipe(Effect.mapError((cause) => refreshTokenManagementError("rotate", "Failed to revoke refresh token family after reuse", cause)));
|
|
229
|
+
const updated = yield* dependencies.tokenStore.findById(record.id).pipe(Effect.mapError((cause) => refreshTokenManagementError("rotate", "Failed to reload reused refresh token", cause)));
|
|
230
|
+
return {
|
|
231
|
+
_tag: "ReuseDetected",
|
|
232
|
+
refreshToken: refreshTokenInfo(Option.isSome(updated) ? updated.value : record),
|
|
233
|
+
revokedAt: now,
|
|
234
|
+
};
|
|
235
|
+
});
|
|
236
|
+
export const makeRefreshTokenManagement = (dependencies) => RefreshTokenManagement.make({
|
|
237
|
+
issueForUser: Effect.fn("auth.refresh_token.management.issue")(function* (input) {
|
|
238
|
+
const now = input.now ?? (yield* currentUnixMillis);
|
|
239
|
+
const id = input.tokenId ?? (yield* makeRefreshTokenId(dependencies, "issue"));
|
|
240
|
+
const familyId = input.familyId ?? (yield* makeRefreshTokenFamilyId(dependencies));
|
|
241
|
+
const token = yield* generateRefreshToken(dependencies, "issue");
|
|
242
|
+
const secretHash = yield* hashRefreshToken(dependencies, "issue", Redacted.make(Redacted.value(token)));
|
|
243
|
+
const row = {
|
|
244
|
+
id,
|
|
245
|
+
familyId,
|
|
246
|
+
userId: input.userId,
|
|
247
|
+
secretHash,
|
|
248
|
+
createdAt: now,
|
|
249
|
+
expiresAt: input.expiresAt,
|
|
250
|
+
...(input.metadata === undefined ? {} : { metadata: input.metadata }),
|
|
251
|
+
};
|
|
252
|
+
yield* dependencies.tokenStore.insert(row).pipe(Effect.mapError((cause) => refreshTokenManagementError("issue", "Failed to store refresh token", cause)));
|
|
253
|
+
return {
|
|
254
|
+
token,
|
|
255
|
+
refreshToken: refreshTokenInfo(row),
|
|
256
|
+
};
|
|
257
|
+
}),
|
|
258
|
+
rotate: Effect.fn("auth.refresh_token.management.rotate")(function* (input) {
|
|
259
|
+
const secretHash = yield* hashRefreshToken(dependencies, "rotate", input.token);
|
|
260
|
+
const existing = yield* dependencies.tokenStore.findBySecretHash(secretHash).pipe(Effect.mapError((cause) => refreshTokenManagementError("rotate", "Failed to load refresh token", cause)));
|
|
261
|
+
if (Option.isNone(existing)) {
|
|
262
|
+
return invalidRotation("not_found");
|
|
263
|
+
}
|
|
264
|
+
const record = existing.value;
|
|
265
|
+
const now = input.now ?? (yield* currentUnixMillis);
|
|
266
|
+
if (record.revokedAt !== undefined) {
|
|
267
|
+
return invalidRotation("revoked", record);
|
|
268
|
+
}
|
|
269
|
+
if (record.rotatedAt !== undefined) {
|
|
270
|
+
return yield* markReuseDetected(dependencies, record, now);
|
|
271
|
+
}
|
|
272
|
+
if (isExpired(record, now)) {
|
|
273
|
+
return invalidRotation("expired", record);
|
|
274
|
+
}
|
|
275
|
+
const nextToken = yield* generateRefreshToken(dependencies, "rotate");
|
|
276
|
+
const nextSecretHash = yield* hashRefreshToken(dependencies, "rotate", Redacted.make(Redacted.value(nextToken)));
|
|
277
|
+
const replacement = {
|
|
278
|
+
id: input.tokenId ?? (yield* makeRefreshTokenId(dependencies, "rotate")),
|
|
279
|
+
familyId: record.familyId,
|
|
280
|
+
userId: record.userId,
|
|
281
|
+
secretHash: nextSecretHash,
|
|
282
|
+
createdAt: now,
|
|
283
|
+
expiresAt: input.expiresAt,
|
|
284
|
+
...(input.metadata === undefined ? {} : { metadata: input.metadata }),
|
|
285
|
+
};
|
|
286
|
+
const rotated = yield* dependencies.tokenStore
|
|
287
|
+
.rotate({ id: record.id, rotatedAt: now, replacement })
|
|
288
|
+
.pipe(Effect.mapError((cause) => refreshTokenManagementError("rotate", "Failed to rotate refresh token", cause)));
|
|
289
|
+
if (Option.isNone(rotated)) {
|
|
290
|
+
return invalidRotation("revoked", record);
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
_tag: "Rotated",
|
|
294
|
+
token: nextToken,
|
|
295
|
+
refreshToken: refreshTokenInfo(rotated.value.replacement),
|
|
296
|
+
previousToken: refreshTokenInfo(rotated.value.previous),
|
|
297
|
+
};
|
|
298
|
+
}),
|
|
299
|
+
listForUser: Effect.fn("auth.refresh_token.management.list")(function* (input) {
|
|
300
|
+
const tokens = yield* dependencies.tokenStore
|
|
301
|
+
.listByUser({
|
|
302
|
+
userId: input.userId,
|
|
303
|
+
...(input.includeRevoked === undefined
|
|
304
|
+
? {}
|
|
305
|
+
: { includeRevoked: input.includeRevoked }),
|
|
306
|
+
})
|
|
307
|
+
.pipe(Effect.mapError((cause) => refreshTokenManagementError("list", "Failed to list refresh tokens", cause)));
|
|
308
|
+
return tokens.map(refreshTokenInfo);
|
|
309
|
+
}),
|
|
310
|
+
revokeForUser: Effect.fn("auth.refresh_token.management.revoke")(function* (input) {
|
|
311
|
+
const token = yield* loadOwnedRefreshToken(dependencies, "revoke", input);
|
|
312
|
+
if (token.revokedAt !== undefined) {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
const revokedAt = input.revokedAt ?? (yield* currentUnixMillis);
|
|
316
|
+
yield* dependencies.tokenStore
|
|
317
|
+
.revoke({
|
|
318
|
+
id: input.tokenId,
|
|
319
|
+
revokedAt,
|
|
320
|
+
...(input.reason === undefined ? {} : { reason: input.reason }),
|
|
321
|
+
})
|
|
322
|
+
.pipe(Effect.mapError((cause) => refreshTokenManagementError("revoke", "Failed to revoke refresh token", cause)));
|
|
323
|
+
}),
|
|
324
|
+
revokeFamilyForUser: Effect.fn("auth.refresh_token.management.revoke_family")(function* (input) {
|
|
325
|
+
yield* loadOwnedRefreshTokenFamily(dependencies, input);
|
|
326
|
+
const revokedAt = input.revokedAt ?? (yield* currentUnixMillis);
|
|
327
|
+
yield* dependencies.tokenStore
|
|
328
|
+
.revokeFamily({
|
|
329
|
+
familyId: input.familyId,
|
|
330
|
+
revokedAt,
|
|
331
|
+
...(input.reason === undefined ? {} : { reason: input.reason }),
|
|
332
|
+
})
|
|
333
|
+
.pipe(Effect.mapError((cause) => refreshTokenManagementError("revoke-family", "Failed to revoke refresh token family", cause)));
|
|
334
|
+
}),
|
|
335
|
+
});
|
|
336
|
+
export const RefreshTokenManagementLive = Layer.effect(RefreshTokenManagement)(Effect.gen(function* () {
|
|
337
|
+
const refreshTokens = yield* RefreshTokens;
|
|
338
|
+
const crypto = yield* Crypto;
|
|
339
|
+
const tokenStore = yield* RefreshTokenStore;
|
|
340
|
+
return makeRefreshTokenManagement({ refreshTokens, crypto, tokenStore });
|
|
341
|
+
}));
|
|
342
|
+
//# sourceMappingURL=RefreshToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RefreshToken.js","sourceRoot":"","sources":["../src/RefreshToken.ts"],"names":[],"mappings":"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"}
|