@effect-auth/core 0.1.0-alpha.0 → 0.1.0-alpha.10

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.
Files changed (222) hide show
  1. package/README.md +774 -36
  2. package/dist/ApiKey.d.ts +207 -0
  3. package/dist/ApiKey.d.ts.map +1 -0
  4. package/dist/ApiKey.js +275 -0
  5. package/dist/ApiKey.js.map +1 -0
  6. package/dist/AuditLog.d.ts +278 -1
  7. package/dist/AuditLog.d.ts.map +1 -1
  8. package/dist/AuditLog.js +217 -2
  9. package/dist/AuditLog.js.map +1 -1
  10. package/dist/AuthConfig.d.ts +42 -0
  11. package/dist/AuthConfig.d.ts.map +1 -0
  12. package/dist/AuthConfig.js +43 -0
  13. package/dist/AuthConfig.js.map +1 -0
  14. package/dist/AuthFlow.d.ts +465 -36
  15. package/dist/AuthFlow.d.ts.map +1 -1
  16. package/dist/AuthFlow.js +660 -5
  17. package/dist/AuthFlow.js.map +1 -1
  18. package/dist/AuthKernel.d.ts +3 -0
  19. package/dist/AuthKernel.d.ts.map +1 -0
  20. package/dist/AuthKernel.js +9 -0
  21. package/dist/AuthKernel.js.map +1 -0
  22. package/dist/Challenge.d.ts +27 -4
  23. package/dist/Challenge.d.ts.map +1 -1
  24. package/dist/Challenge.js +170 -1
  25. package/dist/Challenge.js.map +1 -1
  26. package/dist/Client.d.ts +378 -0
  27. package/dist/Client.d.ts.map +1 -0
  28. package/dist/Client.js +768 -0
  29. package/dist/Client.js.map +1 -0
  30. package/dist/Crypto.d.ts +9 -1
  31. package/dist/Crypto.d.ts.map +1 -1
  32. package/dist/Crypto.js +65 -1
  33. package/dist/Crypto.js.map +1 -1
  34. package/dist/EffectQbSqliteStorage.d.ts +600 -0
  35. package/dist/EffectQbSqliteStorage.d.ts.map +1 -0
  36. package/dist/EffectQbSqliteStorage.js +1637 -0
  37. package/dist/EffectQbSqliteStorage.js.map +1 -0
  38. package/dist/EmailOtp.d.ts +120 -0
  39. package/dist/EmailOtp.d.ts.map +1 -0
  40. package/dist/EmailOtp.js +286 -0
  41. package/dist/EmailOtp.js.map +1 -0
  42. package/dist/EmailVerification.d.ts +121 -0
  43. package/dist/EmailVerification.d.ts.map +1 -0
  44. package/dist/EmailVerification.js +200 -0
  45. package/dist/EmailVerification.js.map +1 -0
  46. package/dist/HttpApi/Api.d.ts +1956 -0
  47. package/dist/HttpApi/Api.d.ts.map +1 -0
  48. package/dist/HttpApi/Api.js +2325 -0
  49. package/dist/HttpApi/Api.js.map +1 -0
  50. package/dist/HttpApi/Endpoints.d.ts +945 -0
  51. package/dist/HttpApi/Endpoints.d.ts.map +1 -0
  52. package/dist/HttpApi/Endpoints.js +373 -0
  53. package/dist/HttpApi/Endpoints.js.map +1 -0
  54. package/dist/HttpApi/Errors.d.ts +82 -0
  55. package/dist/HttpApi/Errors.d.ts.map +1 -0
  56. package/dist/HttpApi/Errors.js +184 -0
  57. package/dist/HttpApi/Errors.js.map +1 -0
  58. package/dist/HttpApi/Schemas.d.ts +1113 -0
  59. package/dist/HttpApi/Schemas.d.ts.map +1 -0
  60. package/dist/HttpApi/Schemas.js +734 -0
  61. package/dist/HttpApi/Schemas.js.map +1 -0
  62. package/dist/HttpApi/Security.d.ts +159 -0
  63. package/dist/HttpApi/Security.d.ts.map +1 -0
  64. package/dist/HttpApi/Security.js +530 -0
  65. package/dist/HttpApi/Security.js.map +1 -0
  66. package/dist/HttpApi/Transport.d.ts +65 -0
  67. package/dist/HttpApi/Transport.d.ts.map +1 -0
  68. package/dist/HttpApi/Transport.js +311 -0
  69. package/dist/HttpApi/Transport.js.map +1 -0
  70. package/dist/HttpApi/index.d.ts +8 -0
  71. package/dist/HttpApi/index.d.ts.map +1 -0
  72. package/dist/HttpApi/index.js +7 -0
  73. package/dist/HttpApi/index.js.map +1 -0
  74. package/dist/HttpApi.d.ts +2 -0
  75. package/dist/HttpApi.d.ts.map +1 -0
  76. package/dist/HttpApi.js +2 -0
  77. package/dist/HttpApi.js.map +1 -0
  78. package/dist/Identifiers.d.ts.map +1 -1
  79. package/dist/Identifiers.js.map +1 -1
  80. package/dist/Internal.d.ts +7 -0
  81. package/dist/Internal.d.ts.map +1 -0
  82. package/dist/Internal.js +12 -0
  83. package/dist/Internal.js.map +1 -0
  84. package/dist/Jwt.d.ts +271 -0
  85. package/dist/Jwt.d.ts.map +1 -0
  86. package/dist/Jwt.js +512 -0
  87. package/dist/Jwt.js.map +1 -0
  88. package/dist/LoginApproval.d.ts +314 -0
  89. package/dist/LoginApproval.d.ts.map +1 -0
  90. package/dist/LoginApproval.js +551 -0
  91. package/dist/LoginApproval.js.map +1 -0
  92. package/dist/LoginNotification.d.ts +183 -0
  93. package/dist/LoginNotification.d.ts.map +1 -0
  94. package/dist/LoginNotification.js +329 -0
  95. package/dist/LoginNotification.js.map +1 -0
  96. package/dist/LoginRisk.d.ts +73 -0
  97. package/dist/LoginRisk.d.ts.map +1 -0
  98. package/dist/LoginRisk.js +57 -0
  99. package/dist/LoginRisk.js.map +1 -0
  100. package/dist/MagicLink.d.ts +85 -0
  101. package/dist/MagicLink.d.ts.map +1 -0
  102. package/dist/MagicLink.js +206 -0
  103. package/dist/MagicLink.js.map +1 -0
  104. package/dist/Mailer.d.ts +147 -0
  105. package/dist/Mailer.d.ts.map +1 -0
  106. package/dist/Mailer.js +208 -0
  107. package/dist/Mailer.js.map +1 -0
  108. package/dist/OAuth.d.ts +934 -0
  109. package/dist/OAuth.d.ts.map +1 -0
  110. package/dist/OAuth.js +1661 -0
  111. package/dist/OAuth.js.map +1 -0
  112. package/dist/Passkey.d.ts +334 -0
  113. package/dist/Passkey.d.ts.map +1 -0
  114. package/dist/Passkey.js +422 -0
  115. package/dist/Passkey.js.map +1 -0
  116. package/dist/PasskeySimpleWebAuthn.d.ts +11 -0
  117. package/dist/PasskeySimpleWebAuthn.d.ts.map +1 -0
  118. package/dist/PasskeySimpleWebAuthn.js +181 -0
  119. package/dist/PasskeySimpleWebAuthn.js.map +1 -0
  120. package/dist/Password.d.ts +237 -0
  121. package/dist/Password.d.ts.map +1 -0
  122. package/dist/Password.js +641 -0
  123. package/dist/Password.js.map +1 -0
  124. package/dist/Policy.d.ts +7 -4
  125. package/dist/Policy.d.ts.map +1 -1
  126. package/dist/Policy.js +28 -5
  127. package/dist/Policy.js.map +1 -1
  128. package/dist/Privacy.d.ts +18 -0
  129. package/dist/Privacy.d.ts.map +1 -1
  130. package/dist/Privacy.js +63 -3
  131. package/dist/Privacy.js.map +1 -1
  132. package/dist/RateLimiter.d.ts +104 -0
  133. package/dist/RateLimiter.d.ts.map +1 -0
  134. package/dist/RateLimiter.js +118 -0
  135. package/dist/RateLimiter.js.map +1 -0
  136. package/dist/RecoveryCode.d.ts +169 -0
  137. package/dist/RecoveryCode.d.ts.map +1 -0
  138. package/dist/RecoveryCode.js +299 -0
  139. package/dist/RecoveryCode.js.map +1 -0
  140. package/dist/RefreshToken.d.ts +222 -0
  141. package/dist/RefreshToken.d.ts.map +1 -0
  142. package/dist/RefreshToken.js +342 -0
  143. package/dist/RefreshToken.js.map +1 -0
  144. package/dist/SecurityTimeline.d.ts +72 -0
  145. package/dist/SecurityTimeline.d.ts.map +1 -0
  146. package/dist/SecurityTimeline.js +386 -0
  147. package/dist/SecurityTimeline.js.map +1 -0
  148. package/dist/Sessions.d.ts +135 -11
  149. package/dist/Sessions.d.ts.map +1 -1
  150. package/dist/Sessions.js +546 -1
  151. package/dist/Sessions.js.map +1 -1
  152. package/dist/StepUp.d.ts +44 -0
  153. package/dist/StepUp.d.ts.map +1 -0
  154. package/dist/StepUp.js +82 -0
  155. package/dist/StepUp.js.map +1 -0
  156. package/dist/Storage.d.ts +175 -0
  157. package/dist/Storage.d.ts.map +1 -0
  158. package/dist/Storage.js +27 -0
  159. package/dist/Storage.js.map +1 -0
  160. package/dist/StorageMigrations.d.ts +19 -0
  161. package/dist/StorageMigrations.d.ts.map +1 -0
  162. package/dist/StorageMigrations.js +291 -0
  163. package/dist/StorageMigrations.js.map +1 -0
  164. package/dist/Testing.d.ts +9 -1
  165. package/dist/Testing.d.ts.map +1 -1
  166. package/dist/Testing.js +30 -2
  167. package/dist/Testing.js.map +1 -1
  168. package/dist/Totp.d.ts +220 -0
  169. package/dist/Totp.d.ts.map +1 -0
  170. package/dist/Totp.js +477 -0
  171. package/dist/Totp.js.map +1 -0
  172. package/dist/TrustedDevice.d.ts +127 -0
  173. package/dist/TrustedDevice.d.ts.map +1 -0
  174. package/dist/TrustedDevice.js +252 -0
  175. package/dist/TrustedDevice.js.map +1 -0
  176. package/dist/WaitUntil.d.ts +3 -0
  177. package/dist/WaitUntil.d.ts.map +1 -1
  178. package/dist/WaitUntil.js +6 -3
  179. package/dist/WaitUntil.js.map +1 -1
  180. package/dist/Webhook.d.ts +72 -0
  181. package/dist/Webhook.d.ts.map +1 -0
  182. package/dist/Webhook.js +82 -0
  183. package/dist/Webhook.js.map +1 -0
  184. package/dist/alchemy/cloudflare/Email.d.ts +25 -0
  185. package/dist/alchemy/cloudflare/Email.d.ts.map +1 -0
  186. package/dist/alchemy/cloudflare/Email.js +117 -0
  187. package/dist/alchemy/cloudflare/Email.js.map +1 -0
  188. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts +34 -0
  189. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  190. package/dist/alchemy/cloudflare/RateLimitDurableObject.js +30 -0
  191. package/dist/alchemy/cloudflare/RateLimitDurableObject.js.map +1 -0
  192. package/dist/cloudflare/Email.d.ts +25 -0
  193. package/dist/cloudflare/Email.d.ts.map +1 -0
  194. package/dist/cloudflare/Email.js +153 -0
  195. package/dist/cloudflare/Email.js.map +1 -0
  196. package/dist/cloudflare/RateLimitDurableObject.d.ts +50 -0
  197. package/dist/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  198. package/dist/cloudflare/RateLimitDurableObject.js +51 -0
  199. package/dist/cloudflare/RateLimitDurableObject.js.map +1 -0
  200. package/dist/index.d.ts +22 -0
  201. package/dist/index.d.ts.map +1 -1
  202. package/dist/index.js +22 -0
  203. package/dist/index.js.map +1 -1
  204. package/dist/internal/RateLimitDurableObject.d.ts +32 -0
  205. package/dist/internal/RateLimitDurableObject.d.ts.map +1 -0
  206. package/dist/internal/RateLimitDurableObject.js +80 -0
  207. package/dist/internal/RateLimitDurableObject.js.map +1 -0
  208. package/migrations/0001_auth_storage.sql +32 -0
  209. package/migrations/0002_auth_password.sql +25 -0
  210. package/migrations/0003_auth_login_approval_review.sql +22 -0
  211. package/migrations/0004_auth_trusted_device.sql +12 -0
  212. package/migrations/0005_auth_passkey.sql +17 -0
  213. package/migrations/0006_auth_totp_factor.sql +17 -0
  214. package/migrations/0007_auth_recovery_code.sql +13 -0
  215. package/migrations/0008_auth_api_key.sql +17 -0
  216. package/migrations/0009_auth_refresh_token.sql +21 -0
  217. package/migrations/0010_auth_jwt_revocation.sql +8 -0
  218. package/migrations/0011_auth_oauth_account.sql +16 -0
  219. package/migrations/0012_auth_oauth_provider_token_vault.sql +20 -0
  220. package/migrations/0013_auth_security_timeline.sql +16 -0
  221. package/package.json +161 -16
  222. package/LICENSE +0 -21
package/dist/Totp.js ADDED
@@ -0,0 +1,477 @@
1
+ import { Brand, Context, Data, Effect, Layer, Option, Redacted } from "effect";
2
+ import { Crypto } from "./Crypto.js";
3
+ import { CredentialId } from "./Identifiers.js";
4
+ import { currentUnixMillis } from "./Internal.js";
5
+ export const TotpSecret = Brand.nominal();
6
+ export const defaultTotpAlgorithm = "SHA1";
7
+ export const defaultTotpDigits = 6;
8
+ export const defaultTotpPeriod = 30;
9
+ export const defaultTotpSecretBytes = 20;
10
+ export const defaultTotpWindow = 1;
11
+ export class TotpError extends Data.TaggedError("TotpError") {
12
+ }
13
+ export class Totp extends Context.Service()("auth/Totp") {
14
+ }
15
+ (function (Totp) {
16
+ Totp.make = (service) => Totp.of(service);
17
+ })(Totp || (Totp = {}));
18
+ const textEncoder = new TextEncoder();
19
+ const base32Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
20
+ const totpError = (operation, message, cause) => new TotpError({
21
+ operation,
22
+ message,
23
+ ...(cause === undefined ? {} : { cause }),
24
+ });
25
+ const validateSecretBytes = (bytes, operation) => Number.isInteger(bytes) && bytes >= 10 && bytes <= 128
26
+ ? Effect.succeed(bytes)
27
+ : Effect.fail(totpError(operation, "TOTP secret bytes must be an integer between 10 and 128"));
28
+ const validateDigits = (digits, operation) => Number.isInteger(digits) && digits >= 6 && digits <= 10
29
+ ? Effect.succeed(digits)
30
+ : Effect.fail(totpError(operation, "TOTP digits must be an integer between 6 and 10"));
31
+ const validatePeriod = (period, operation) => Number.isInteger(period) && period >= 5 && period <= 600
32
+ ? Effect.succeed(period)
33
+ : Effect.fail(totpError(operation, "TOTP period must be an integer between 5 and 600 seconds"));
34
+ const validateWindow = (window) => Number.isInteger(window) && window >= 0 && window <= 10
35
+ ? Effect.succeed(window)
36
+ : Effect.fail(totpError("verify", "TOTP window must be an integer between 0 and 10"));
37
+ const validateIssuerOrAccount = (value, field) => {
38
+ const trimmed = value.trim();
39
+ return trimmed.length > 0
40
+ ? Effect.succeed(trimmed)
41
+ : Effect.fail(totpError("otpauth-uri", `TOTP ${field} must not be empty`));
42
+ };
43
+ const hashName = (algorithm) => {
44
+ switch (algorithm) {
45
+ case "SHA1": {
46
+ return "SHA-1";
47
+ }
48
+ case "SHA256": {
49
+ return "SHA-256";
50
+ }
51
+ case "SHA512": {
52
+ return "SHA-512";
53
+ }
54
+ }
55
+ };
56
+ const base32Encode = (bytes) => {
57
+ let bits = 0;
58
+ let value = 0;
59
+ let output = "";
60
+ for (const byte of bytes) {
61
+ value = (value << 8) | byte;
62
+ bits += 8;
63
+ while (bits >= 5) {
64
+ output += base32Alphabet[(value >>> (bits - 5)) & 31];
65
+ bits -= 5;
66
+ }
67
+ }
68
+ if (bits > 0) {
69
+ output += base32Alphabet[(value << (5 - bits)) & 31];
70
+ }
71
+ return TotpSecret(output);
72
+ };
73
+ const normalizeSecretValue = (secret, operation) => {
74
+ const withoutGroups = secret.trim().toUpperCase().replaceAll(/[\s-]/g, "");
75
+ const normalized = withoutGroups.replace(/=+$/, "");
76
+ if (normalized.length === 0) {
77
+ return Effect.fail(totpError(operation, "TOTP secret must not be empty"));
78
+ }
79
+ if (normalized.includes("=") || !/^[A-Z2-7]+$/.test(normalized)) {
80
+ return Effect.fail(totpError(operation, "TOTP secret must be base32"));
81
+ }
82
+ return Effect.succeed(TotpSecret(normalized));
83
+ };
84
+ const base32Decode = (secret, operation) => Effect.gen(function* () {
85
+ const normalized = yield* normalizeSecretValue(secret, operation);
86
+ let bits = 0;
87
+ let value = 0;
88
+ const output = [];
89
+ for (const character of normalized) {
90
+ const index = base32Alphabet.indexOf(character);
91
+ if (index === -1) {
92
+ return yield* totpError(operation, "TOTP secret must be base32");
93
+ }
94
+ value = (value << 5) | index;
95
+ bits += 5;
96
+ if (bits >= 8) {
97
+ output.push((value >>> (bits - 8)) & 255);
98
+ bits -= 8;
99
+ }
100
+ }
101
+ return Uint8Array.from(output);
102
+ });
103
+ const counterBytes = (counter) => {
104
+ const bytes = new Uint8Array(8);
105
+ let value = BigInt(counter);
106
+ for (let index = 7; index >= 0; index -= 1) {
107
+ bytes[index] = Number(value & 0xffn);
108
+ value >>= 8n;
109
+ }
110
+ return bytes;
111
+ };
112
+ const getSubtleCrypto = (dependencies, operation) => Effect.try({
113
+ try: () => {
114
+ const webCrypto = dependencies.webCrypto ?? globalThis.crypto;
115
+ if (webCrypto?.subtle === undefined) {
116
+ throw new Error("Web Crypto subtle API is not available");
117
+ }
118
+ return webCrypto.subtle;
119
+ },
120
+ catch: (cause) => totpError(operation, "Failed to access Web Crypto subtle API", cause),
121
+ });
122
+ const generateHotpCode = (dependencies, input, operation) => Effect.gen(function* () {
123
+ const subtle = yield* getSubtleCrypto(dependencies, operation);
124
+ const secretBytes = yield* base32Decode(input.secret, operation);
125
+ const signature = yield* Effect.tryPromise({
126
+ try: async () => {
127
+ const key = await subtle.importKey("raw", secretBytes, { name: "HMAC", hash: hashName(input.algorithm) }, false, ["sign"]);
128
+ return new Uint8Array(await subtle.sign("HMAC", key, counterBytes(input.counter)));
129
+ },
130
+ catch: (cause) => totpError(operation, "Failed to calculate TOTP HMAC", cause),
131
+ });
132
+ const offset = signature.at(-1) & 0x0f;
133
+ const binary = (signature[offset] & 0x7f) * 2 ** 24 +
134
+ signature[offset + 1] * 2 ** 16 +
135
+ signature[offset + 2] * 2 ** 8 +
136
+ signature[offset + 3];
137
+ const modulo = 10 ** input.digits;
138
+ return String(binary % modulo).padStart(input.digits, "0");
139
+ });
140
+ const timeCounter = (now, period) => Math.floor(Number(now) / 1000 / period);
141
+ const normalizeCode = (code) => Redacted.value(code).replaceAll(/\s/g, "");
142
+ export const makeTotp = (dependencies) => Totp.make({
143
+ generateSecret: Effect.fn("auth.totp.generate_secret")(function* (input) {
144
+ const bytes = yield* validateSecretBytes(input?.bytes ?? defaultTotpSecretBytes, "generate-secret");
145
+ const secretBytes = yield* dependencies.crypto.randomBytes(bytes).pipe(Effect.mapError((cause) => totpError("generate-secret", "Failed to generate TOTP secret", cause)));
146
+ return Redacted.make(base32Encode(secretBytes));
147
+ }),
148
+ normalizeSecret: Effect.fn("auth.totp.normalize_secret")(function* (secret) {
149
+ const normalized = yield* normalizeSecretValue(Redacted.value(secret), "normalize-secret");
150
+ return Redacted.make(normalized);
151
+ }),
152
+ otpauthUri: Effect.fn("auth.totp.otpauth_uri")(function* (input) {
153
+ const issuer = yield* validateIssuerOrAccount(input.issuer, "issuer");
154
+ const accountName = yield* validateIssuerOrAccount(input.accountName, "accountName");
155
+ const digits = yield* validateDigits(input.digits ?? defaultTotpDigits, "otpauth-uri");
156
+ const period = yield* validatePeriod(input.period ?? defaultTotpPeriod, "otpauth-uri");
157
+ const algorithm = input.algorithm ?? defaultTotpAlgorithm;
158
+ const secret = yield* normalizeSecretValue(Redacted.value(input.secret), "otpauth-uri");
159
+ const params = new URLSearchParams({
160
+ secret,
161
+ issuer,
162
+ algorithm,
163
+ digits: String(digits),
164
+ period: String(period),
165
+ });
166
+ return Redacted.make(`otpauth://totp/${encodeURIComponent(issuer)}:${encodeURIComponent(accountName)}?${params}`);
167
+ }),
168
+ generateCode: Effect.fn("auth.totp.generate_code")(function* (input) {
169
+ const now = input.now ?? (yield* currentUnixMillis);
170
+ const digits = yield* validateDigits(input.digits ?? defaultTotpDigits, "generate-code");
171
+ const period = yield* validatePeriod(input.period ?? defaultTotpPeriod, "generate-code");
172
+ const secret = yield* normalizeSecretValue(Redacted.value(input.secret), "generate-code");
173
+ const code = yield* generateHotpCode(dependencies, {
174
+ secret,
175
+ counter: timeCounter(now, period),
176
+ algorithm: input.algorithm ?? defaultTotpAlgorithm,
177
+ digits,
178
+ }, "generate-code");
179
+ return Redacted.make(code);
180
+ }),
181
+ verify: Effect.fn("auth.totp.verify")(function* (input) {
182
+ const now = input.now ?? (yield* currentUnixMillis);
183
+ const digits = yield* validateDigits(input.digits ?? defaultTotpDigits, "verify");
184
+ const period = yield* validatePeriod(input.period ?? defaultTotpPeriod, "verify");
185
+ const window = yield* validateWindow(input.window ?? defaultTotpWindow);
186
+ const secret = yield* normalizeSecretValue(Redacted.value(input.secret), "verify");
187
+ const code = normalizeCode(input.code);
188
+ if (!new RegExp(`^\\d{${digits}}$`).test(code)) {
189
+ return { valid: false };
190
+ }
191
+ const counter = timeCounter(now, period);
192
+ const codeBytes = textEncoder.encode(code);
193
+ for (let delta = -window; delta <= window; delta += 1) {
194
+ const candidateCounter = counter + delta;
195
+ if (candidateCounter < 0) {
196
+ continue;
197
+ }
198
+ const expected = yield* generateHotpCode(dependencies, {
199
+ secret,
200
+ counter: candidateCounter,
201
+ algorithm: input.algorithm ?? defaultTotpAlgorithm,
202
+ digits,
203
+ }, "verify");
204
+ const valid = yield* dependencies.crypto
205
+ .timingSafeEqual({
206
+ left: codeBytes,
207
+ right: textEncoder.encode(expected),
208
+ })
209
+ .pipe(Effect.mapError((cause) => totpError("verify", "Failed to compare TOTP codes", cause)));
210
+ if (valid) {
211
+ return {
212
+ valid: true,
213
+ delta: Object.is(delta, -0) ? 0 : delta,
214
+ };
215
+ }
216
+ }
217
+ return { valid: false };
218
+ }),
219
+ });
220
+ export const TotpLive = Layer.effect(Totp)(Effect.gen(function* () {
221
+ const crypto = yield* Crypto;
222
+ return makeTotp({ crypto });
223
+ }));
224
+ export class TotpFactorStoreError extends Data.TaggedError("TotpFactorStoreError") {
225
+ }
226
+ export class TotpFactorStore extends Context.Service()("auth/TotpFactorStore") {
227
+ }
228
+ (function (TotpFactorStore) {
229
+ TotpFactorStore.make = (service) => TotpFactorStore.of(service);
230
+ })(TotpFactorStore || (TotpFactorStore = {}));
231
+ const cloneMetadata = (metadata) => metadata === undefined ? undefined : structuredClone(metadata);
232
+ const cloneTotpFactor = (record) => ({
233
+ ...record,
234
+ secret: Redacted.make(Redacted.value(record.secret)),
235
+ ...(record.metadata === undefined
236
+ ? {}
237
+ : { metadata: cloneMetadata(record.metadata) }),
238
+ });
239
+ export const makeTotpFactorStoreMemory = () => {
240
+ const factors = new Map();
241
+ return TotpFactorStore.make({
242
+ insert: (row) => Effect.sync(() => {
243
+ factors.set(row.id, cloneTotpFactor(row));
244
+ }),
245
+ findById: (id) => Effect.sync(() => {
246
+ const row = factors.get(id);
247
+ return row === undefined ? Option.none() : Option.some(cloneTotpFactor(row));
248
+ }),
249
+ listByUser: (input) => Effect.sync(() => [...factors.values()]
250
+ .filter((row) => row.userId === input.userId &&
251
+ (input.includeRevoked === true || row.revokedAt === undefined) &&
252
+ (input.includeUnconfirmed === true || row.confirmedAt !== undefined))
253
+ .map(cloneTotpFactor)),
254
+ confirm: (input) => Effect.sync(() => {
255
+ const row = factors.get(input.id);
256
+ if (row === undefined || row.revokedAt !== undefined) {
257
+ return Option.none();
258
+ }
259
+ const updated = {
260
+ ...row,
261
+ confirmedAt: input.confirmedAt,
262
+ metadata: input.metadata ?? row.metadata,
263
+ };
264
+ factors.set(input.id, updated);
265
+ return Option.some(cloneTotpFactor(updated));
266
+ }),
267
+ markUsed: (input) => Effect.sync(() => {
268
+ const row = factors.get(input.id);
269
+ if (row === undefined ||
270
+ row.revokedAt !== undefined ||
271
+ row.confirmedAt === undefined) {
272
+ return Option.none();
273
+ }
274
+ const updated = {
275
+ ...row,
276
+ lastUsedAt: input.lastUsedAt,
277
+ metadata: input.metadata ?? row.metadata,
278
+ };
279
+ factors.set(input.id, updated);
280
+ return Option.some(cloneTotpFactor(updated));
281
+ }),
282
+ revoke: (input) => Effect.sync(() => {
283
+ const row = factors.get(input.id);
284
+ if (row !== undefined) {
285
+ factors.set(input.id, {
286
+ ...row,
287
+ revokedAt: input.revokedAt,
288
+ metadata: input.reason === undefined
289
+ ? row.metadata
290
+ : { ...row.metadata, revokeReason: input.reason },
291
+ });
292
+ }
293
+ }),
294
+ });
295
+ };
296
+ export const TotpFactorStoreMemoryLive = Layer.sync(TotpFactorStore)(makeTotpFactorStoreMemory);
297
+ export class TotpFactorManagementError extends Data.TaggedError("TotpFactorManagementError") {
298
+ }
299
+ export class TotpFactorManagement extends Context.Service()("auth/TotpFactorManagement") {
300
+ }
301
+ (function (TotpFactorManagement) {
302
+ TotpFactorManagement.make = (service) => TotpFactorManagement.of(service);
303
+ })(TotpFactorManagement || (TotpFactorManagement = {}));
304
+ const totpFactorInfo = (factor) => ({
305
+ id: factor.id,
306
+ algorithm: factor.algorithm,
307
+ digits: factor.digits,
308
+ period: factor.period,
309
+ createdAt: factor.createdAt,
310
+ ...(factor.confirmedAt === undefined
311
+ ? {}
312
+ : { confirmedAt: factor.confirmedAt }),
313
+ ...(factor.lastUsedAt === undefined
314
+ ? {}
315
+ : { lastUsedAt: factor.lastUsedAt }),
316
+ ...(factor.revokedAt === undefined ? {} : { revokedAt: factor.revokedAt }),
317
+ ...(factor.metadata === undefined ? {} : { metadata: factor.metadata }),
318
+ });
319
+ const totpFactorManagementError = (operation, message, cause) => new TotpFactorManagementError({
320
+ operation,
321
+ message,
322
+ ...(cause === undefined ? {} : { cause }),
323
+ });
324
+ const makeTotpFactorId = (dependencies, operation) => dependencies.crypto.randomToken(dependencies.factorIdBytes ?? 16).pipe(Effect.map(CredentialId), Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to generate TOTP factor id", cause)));
325
+ const loadOwnedTotpFactor = (dependencies, operation, input) => Effect.gen(function* () {
326
+ const factor = yield* dependencies.factorStore.findById(input.factorId).pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to load TOTP factor", cause)));
327
+ if (Option.isNone(factor) || factor.value.userId !== input.userId) {
328
+ return yield* totpFactorManagementError(operation, "TOTP factor not found");
329
+ }
330
+ return factor.value;
331
+ });
332
+ const totpVerifyInput = (factor, input) => ({
333
+ secret: factor.secret,
334
+ code: input.code,
335
+ now: input.now,
336
+ algorithm: factor.algorithm,
337
+ digits: factor.digits,
338
+ period: factor.period,
339
+ ...(input.window === undefined ? {} : { window: input.window }),
340
+ });
341
+ export const makeTotpFactorManagement = (dependencies) => TotpFactorManagement.make({
342
+ startEnrollment: Effect.fn("auth.totp.factor_management.start_enrollment")(function* (input) {
343
+ const operation = "start-enrollment";
344
+ const now = input.now ?? (yield* currentUnixMillis);
345
+ const algorithm = input.algorithm ?? defaultTotpAlgorithm;
346
+ const digits = input.digits ?? defaultTotpDigits;
347
+ const period = input.period ?? defaultTotpPeriod;
348
+ const secret = yield* (input.secretBytes === undefined
349
+ ? dependencies.totp.generateSecret()
350
+ : dependencies.totp.generateSecret({ bytes: input.secretBytes })).pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to generate TOTP secret", cause)));
351
+ const uri = yield* dependencies.totp
352
+ .otpauthUri({
353
+ secret,
354
+ issuer: input.issuer,
355
+ accountName: input.accountName,
356
+ algorithm,
357
+ digits,
358
+ period,
359
+ })
360
+ .pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to build TOTP enrollment URI", cause)));
361
+ const factor = {
362
+ id: input.factorId ?? (yield* makeTotpFactorId(dependencies, operation)),
363
+ userId: input.userId,
364
+ secret,
365
+ algorithm,
366
+ digits,
367
+ period,
368
+ createdAt: now,
369
+ ...(input.metadata === undefined ? {} : { metadata: input.metadata }),
370
+ };
371
+ yield* dependencies.factorStore.insert(factor).pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to store TOTP factor", cause)));
372
+ return {
373
+ factor: totpFactorInfo(factor),
374
+ secret,
375
+ uri,
376
+ };
377
+ }),
378
+ confirmEnrollment: Effect.fn("auth.totp.factor_management.confirm_enrollment")(function* (input) {
379
+ const operation = "confirm-enrollment";
380
+ const now = input.now ?? (yield* currentUnixMillis);
381
+ const factor = yield* loadOwnedTotpFactor(dependencies, operation, input);
382
+ if (factor.revokedAt !== undefined) {
383
+ return yield* totpFactorManagementError(operation, "TOTP factor not found");
384
+ }
385
+ if (factor.confirmedAt !== undefined) {
386
+ return yield* totpFactorManagementError(operation, "TOTP factor already confirmed");
387
+ }
388
+ const verified = yield* dependencies.totp
389
+ .verify(totpVerifyInput(factor, { code: input.code, now, window: input.window }))
390
+ .pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to verify TOTP enrollment code", cause)));
391
+ if (!verified.valid) {
392
+ return yield* totpFactorManagementError(operation, "Invalid TOTP code");
393
+ }
394
+ const confirmed = yield* dependencies.factorStore
395
+ .confirm({
396
+ id: input.factorId,
397
+ confirmedAt: now,
398
+ ...(input.metadata === undefined ? {} : { metadata: input.metadata }),
399
+ })
400
+ .pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to confirm TOTP factor", cause)));
401
+ if (Option.isNone(confirmed)) {
402
+ return yield* totpFactorManagementError(operation, "TOTP factor not found");
403
+ }
404
+ return totpFactorInfo(confirmed.value);
405
+ }),
406
+ verifyForUser: Effect.fn("auth.totp.factor_management.verify")(function* (input) {
407
+ const operation = "verify";
408
+ const now = input.now ?? (yield* currentUnixMillis);
409
+ const factors = yield* dependencies.factorStore
410
+ .listByUser({ userId: input.userId })
411
+ .pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to list TOTP factors", cause)));
412
+ for (const factor of factors) {
413
+ const verified = yield* dependencies.totp
414
+ .verify(totpVerifyInput(factor, {
415
+ code: input.code,
416
+ now,
417
+ window: input.window,
418
+ }))
419
+ .pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to verify TOTP code", cause)));
420
+ if (!verified.valid) {
421
+ continue;
422
+ }
423
+ const updated = yield* dependencies.factorStore
424
+ .markUsed({
425
+ id: factor.id,
426
+ lastUsedAt: now,
427
+ ...(input.metadata === undefined ? {} : { metadata: input.metadata }),
428
+ })
429
+ .pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to mark TOTP factor as used", cause)));
430
+ if (Option.isNone(updated)) {
431
+ return yield* totpFactorManagementError(operation, "TOTP factor not found");
432
+ }
433
+ return {
434
+ valid: true,
435
+ factor: totpFactorInfo(updated.value),
436
+ ...(verified.delta === undefined ? {} : { delta: verified.delta }),
437
+ };
438
+ }
439
+ return { valid: false };
440
+ }),
441
+ listForUser: Effect.fn("auth.totp.factor_management.list")(function* (input) {
442
+ const factors = yield* dependencies.factorStore
443
+ .listByUser({
444
+ userId: input.userId,
445
+ ...(input.includeRevoked === undefined
446
+ ? {}
447
+ : { includeRevoked: input.includeRevoked }),
448
+ ...(input.includeUnconfirmed === undefined
449
+ ? {}
450
+ : { includeUnconfirmed: input.includeUnconfirmed }),
451
+ })
452
+ .pipe(Effect.mapError((cause) => totpFactorManagementError("list", "Failed to list TOTP factors", cause)));
453
+ return factors.map(totpFactorInfo);
454
+ }),
455
+ revokeForUser: Effect.fn("auth.totp.factor_management.revoke")(function* (input) {
456
+ const operation = "revoke";
457
+ const factor = yield* loadOwnedTotpFactor(dependencies, operation, input);
458
+ if (factor.revokedAt !== undefined) {
459
+ return;
460
+ }
461
+ const revokedAt = input.revokedAt ?? (yield* currentUnixMillis);
462
+ yield* dependencies.factorStore
463
+ .revoke({
464
+ id: input.factorId,
465
+ revokedAt,
466
+ ...(input.reason === undefined ? {} : { reason: input.reason }),
467
+ })
468
+ .pipe(Effect.mapError((cause) => totpFactorManagementError(operation, "Failed to revoke TOTP factor", cause)));
469
+ }),
470
+ });
471
+ export const TotpFactorManagementLive = Layer.effect(TotpFactorManagement)(Effect.gen(function* () {
472
+ const totp = yield* Totp;
473
+ const crypto = yield* Crypto;
474
+ const factorStore = yield* TotpFactorStore;
475
+ return makeTotpFactorManagement({ totp, crypto, factorStore });
476
+ }));
477
+ //# sourceMappingURL=Totp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Totp.js","sourceRoot":"","sources":["../src/Totp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ import { Context, Duration, Effect, Layer, Redacted } from "effect";
2
+ import type * as OptionTypes from "effect/Option";
3
+ import { AuthSecrets } from "./AuthConfig.js";
4
+ import { Crypto } from "./Crypto.js";
5
+ import type { CryptoKey, CryptoService } from "./Crypto.js";
6
+ import type { UnixMillis, UserId } from "./Identifiers.js";
7
+ import type { LoginDeviceContext } from "./LoginApproval.js";
8
+ import type { SessionCookieSameSite } from "./Sessions.js";
9
+ export interface TrustedDeviceStatusInput {
10
+ readonly userId: UserId;
11
+ readonly token?: Redacted.Redacted<string>;
12
+ }
13
+ export interface TrustedDeviceTrustInput {
14
+ readonly userId: UserId;
15
+ readonly token?: Redacted.Redacted<string>;
16
+ readonly ttl?: Duration.Duration;
17
+ readonly metadata?: Readonly<Record<string, unknown>>;
18
+ }
19
+ export interface TrustedDeviceToken {
20
+ readonly userId: UserId;
21
+ readonly token: Redacted.Redacted<string>;
22
+ readonly expiresAt: UnixMillis;
23
+ }
24
+ export interface TrustedDeviceRecord {
25
+ readonly userId: UserId;
26
+ readonly tokenHash: string;
27
+ readonly createdAt: UnixMillis;
28
+ readonly lastSeenAt: UnixMillis;
29
+ readonly expiresAt: UnixMillis;
30
+ readonly metadata?: Readonly<Record<string, unknown>>;
31
+ }
32
+ export interface TrustedDeviceStoreFindInput {
33
+ readonly userId: UserId;
34
+ readonly tokenHash: string;
35
+ readonly now: UnixMillis;
36
+ }
37
+ export interface TrustedDeviceStoreUpsertInput {
38
+ readonly userId: UserId;
39
+ readonly tokenHash: string;
40
+ readonly now: UnixMillis;
41
+ readonly expiresAt: UnixMillis;
42
+ readonly metadata?: Readonly<Record<string, unknown>>;
43
+ }
44
+ export interface TrustedDeviceStoreListForUserInput {
45
+ readonly userId: UserId;
46
+ readonly now: UnixMillis;
47
+ readonly limit?: number;
48
+ }
49
+ export interface TrustedDeviceStoreRevokeForUserInput {
50
+ readonly userId: UserId;
51
+ readonly tokenHash: string;
52
+ }
53
+ export type TrustedDeviceErrorOperation = "status" | "trust" | "cookie" | "list" | "revoke";
54
+ declare const TrustedDeviceError_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 & {
55
+ readonly _tag: "TrustedDeviceError";
56
+ } & Readonly<A>;
57
+ export declare class TrustedDeviceError extends TrustedDeviceError_base<{
58
+ readonly operation: TrustedDeviceErrorOperation;
59
+ readonly message: string;
60
+ readonly cause?: unknown;
61
+ }> {
62
+ }
63
+ export interface TrustedDeviceStoreService {
64
+ readonly find: (input: TrustedDeviceStoreFindInput) => Effect.Effect<OptionTypes.Option<TrustedDeviceRecord>, TrustedDeviceError>;
65
+ readonly upsert: (input: TrustedDeviceStoreUpsertInput) => Effect.Effect<TrustedDeviceRecord, TrustedDeviceError>;
66
+ readonly listForUser: (input: TrustedDeviceStoreListForUserInput) => Effect.Effect<readonly TrustedDeviceRecord[], TrustedDeviceError>;
67
+ readonly revokeForUser: (input: TrustedDeviceStoreRevokeForUserInput) => Effect.Effect<void, TrustedDeviceError>;
68
+ }
69
+ declare const TrustedDeviceStore_base: Context.ServiceClass<TrustedDeviceStore, "auth/TrustedDeviceStore", TrustedDeviceStoreService>;
70
+ export declare class TrustedDeviceStore extends TrustedDeviceStore_base {
71
+ }
72
+ export declare namespace TrustedDeviceStore {
73
+ const make: (service: TrustedDeviceStoreService) => TrustedDeviceStoreService;
74
+ }
75
+ export interface TrustedDeviceService {
76
+ readonly status: (input: TrustedDeviceStatusInput) => Effect.Effect<LoginDeviceContext, TrustedDeviceError>;
77
+ readonly trust: (input: TrustedDeviceTrustInput) => Effect.Effect<TrustedDeviceToken, TrustedDeviceError>;
78
+ }
79
+ declare const TrustedDevice_base: Context.ServiceClass<TrustedDevice, "auth/TrustedDevice", TrustedDeviceService>;
80
+ export declare class TrustedDevice extends TrustedDevice_base {
81
+ }
82
+ export declare namespace TrustedDevice {
83
+ const make: (service: TrustedDeviceService) => TrustedDeviceService;
84
+ }
85
+ export interface TrustedDeviceCookieCommitInput {
86
+ readonly token: TrustedDeviceToken;
87
+ }
88
+ export interface TrustedDeviceCookieService {
89
+ readonly read: (request: Request) => Effect.Effect<OptionTypes.Option<Redacted.Redacted<string>>, TrustedDeviceError>;
90
+ readonly commit: (input: TrustedDeviceCookieCommitInput) => Effect.Effect<string, TrustedDeviceError>;
91
+ readonly clear: Effect.Effect<string, TrustedDeviceError>;
92
+ }
93
+ declare const TrustedDeviceCookie_base: Context.ServiceClass<TrustedDeviceCookie, "auth/TrustedDeviceCookie", TrustedDeviceCookieService>;
94
+ export declare class TrustedDeviceCookie extends TrustedDeviceCookie_base {
95
+ }
96
+ export declare namespace TrustedDeviceCookie {
97
+ const make: (service: TrustedDeviceCookieService) => TrustedDeviceCookieService;
98
+ }
99
+ export interface TrustedDeviceOptions {
100
+ readonly secret: CryptoKey;
101
+ readonly ttl?: Duration.Duration;
102
+ readonly tokenBytes?: number;
103
+ }
104
+ export interface TrustedDeviceDependencies extends TrustedDeviceOptions {
105
+ readonly crypto: CryptoService;
106
+ readonly store: TrustedDeviceStoreService;
107
+ }
108
+ export interface TrustedDeviceCookieOptions {
109
+ readonly name?: string;
110
+ readonly secure?: boolean;
111
+ readonly httpOnly?: boolean;
112
+ readonly sameSite?: SessionCookieSameSite;
113
+ readonly path?: string;
114
+ readonly domain?: string;
115
+ }
116
+ export declare const defaultTrustedDeviceTtl: Duration.Duration;
117
+ export declare const defaultTrustedDeviceTokenBytes = 32;
118
+ export declare const filterTrustedDevicesForUser: (devices: Iterable<TrustedDeviceRecord>, input: TrustedDeviceStoreListForUserInput) => readonly TrustedDeviceRecord[];
119
+ export declare const makeTrustedDeviceStoreMemory: () => TrustedDeviceStoreService;
120
+ export declare const TrustedDeviceStoreMemoryLive: Layer.Layer<TrustedDeviceStore, never, never>;
121
+ export declare const makeTrustedDevice: (dependencies: TrustedDeviceDependencies) => TrustedDeviceService;
122
+ export declare function TrustedDeviceLive(options: TrustedDeviceOptions): Layer.Layer<TrustedDevice, never, Crypto | TrustedDeviceStore>;
123
+ export declare function TrustedDeviceLive(): Layer.Layer<TrustedDevice, never, Crypto | TrustedDeviceStore | AuthSecrets>;
124
+ export declare const makeTrustedDeviceCookie: (options?: TrustedDeviceCookieOptions) => TrustedDeviceCookieService;
125
+ export declare const TrustedDeviceCookieLive: (options?: TrustedDeviceCookieOptions) => Layer.Layer<TrustedDeviceCookie, never, never>;
126
+ export {};
127
+ //# sourceMappingURL=TrustedDevice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrustedDevice.d.ts","sourceRoot":"","sources":["../src/TrustedDevice.ts"],"names":[],"mappings":"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"}