@effect-auth/core 0.1.0-alpha.3 → 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.
Files changed (149) hide show
  1. package/README.md +148 -13
  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 +204 -1
  7. package/dist/AuditLog.d.ts.map +1 -1
  8. package/dist/AuditLog.js +170 -0
  9. package/dist/AuditLog.js.map +1 -1
  10. package/dist/AuthConfig.d.ts +0 -9
  11. package/dist/AuthConfig.d.ts.map +1 -1
  12. package/dist/AuthConfig.js +1 -14
  13. package/dist/AuthConfig.js.map +1 -1
  14. package/dist/AuthFlow.d.ts +220 -51
  15. package/dist/AuthFlow.d.ts.map +1 -1
  16. package/dist/AuthFlow.js +550 -22
  17. package/dist/AuthFlow.js.map +1 -1
  18. package/dist/AuthKernel.d.ts +1 -1
  19. package/dist/Challenge.d.ts +5 -1
  20. package/dist/Challenge.d.ts.map +1 -1
  21. package/dist/Challenge.js +58 -48
  22. package/dist/Challenge.js.map +1 -1
  23. package/dist/Client.d.ts +242 -1
  24. package/dist/Client.d.ts.map +1 -1
  25. package/dist/Client.js +489 -1
  26. package/dist/Client.js.map +1 -1
  27. package/dist/D1Kysely.d.ts +1 -1
  28. package/dist/D1Kysely.d.ts.map +1 -1
  29. package/dist/EffectQbSqliteStorage.d.ts +115 -3
  30. package/dist/EffectQbSqliteStorage.d.ts.map +1 -1
  31. package/dist/EffectQbSqliteStorage.js +314 -4
  32. package/dist/EffectQbSqliteStorage.js.map +1 -1
  33. package/dist/EmailOtp.d.ts +5 -2
  34. package/dist/EmailOtp.d.ts.map +1 -1
  35. package/dist/EmailOtp.js +11 -4
  36. package/dist/EmailOtp.js.map +1 -1
  37. package/dist/EmailVerification.d.ts +2 -2
  38. package/dist/EmailVerification.d.ts.map +1 -1
  39. package/dist/EmailVerification.js +2 -3
  40. package/dist/EmailVerification.js.map +1 -1
  41. package/dist/HttpApi/Api.d.ts +1161 -19
  42. package/dist/HttpApi/Api.d.ts.map +1 -1
  43. package/dist/HttpApi/Api.js +1433 -20
  44. package/dist/HttpApi/Api.js.map +1 -1
  45. package/dist/HttpApi/Endpoints.d.ts +611 -0
  46. package/dist/HttpApi/Endpoints.d.ts.map +1 -1
  47. package/dist/HttpApi/Endpoints.js +242 -1
  48. package/dist/HttpApi/Endpoints.js.map +1 -1
  49. package/dist/HttpApi/Schemas.d.ts +704 -0
  50. package/dist/HttpApi/Schemas.d.ts.map +1 -1
  51. package/dist/HttpApi/Schemas.js +435 -1
  52. package/dist/HttpApi/Schemas.js.map +1 -1
  53. package/dist/HttpApi/Security.d.ts +13 -1
  54. package/dist/HttpApi/Security.d.ts.map +1 -1
  55. package/dist/HttpApi/Security.js +107 -16
  56. package/dist/HttpApi/Security.js.map +1 -1
  57. package/dist/HttpApi/Transport.d.ts +36 -2
  58. package/dist/HttpApi/Transport.d.ts.map +1 -1
  59. package/dist/HttpApi/Transport.js +151 -9
  60. package/dist/HttpApi/Transport.js.map +1 -1
  61. package/dist/Jwt.d.ts +271 -0
  62. package/dist/Jwt.d.ts.map +1 -0
  63. package/dist/Jwt.js +512 -0
  64. package/dist/Jwt.js.map +1 -0
  65. package/dist/KyselyStorage.d.ts +134 -1
  66. package/dist/KyselyStorage.d.ts.map +1 -1
  67. package/dist/KyselyStorage.js +918 -4
  68. package/dist/KyselyStorage.js.map +1 -1
  69. package/dist/LoginApproval.d.ts +314 -0
  70. package/dist/LoginApproval.d.ts.map +1 -0
  71. package/dist/LoginApproval.js +551 -0
  72. package/dist/LoginApproval.js.map +1 -0
  73. package/dist/LoginNotification.d.ts +183 -0
  74. package/dist/LoginNotification.d.ts.map +1 -0
  75. package/dist/LoginNotification.js +329 -0
  76. package/dist/LoginNotification.js.map +1 -0
  77. package/dist/LoginRisk.d.ts +73 -0
  78. package/dist/LoginRisk.d.ts.map +1 -0
  79. package/dist/LoginRisk.js +57 -0
  80. package/dist/LoginRisk.js.map +1 -0
  81. package/dist/MagicLink.d.ts +85 -0
  82. package/dist/MagicLink.d.ts.map +1 -0
  83. package/dist/MagicLink.js +206 -0
  84. package/dist/MagicLink.js.map +1 -0
  85. package/dist/Mailer.d.ts +33 -2
  86. package/dist/Mailer.d.ts.map +1 -1
  87. package/dist/Mailer.js +107 -0
  88. package/dist/Mailer.js.map +1 -1
  89. package/dist/Passkey.d.ts +334 -0
  90. package/dist/Passkey.d.ts.map +1 -0
  91. package/dist/Passkey.js +422 -0
  92. package/dist/Passkey.js.map +1 -0
  93. package/dist/Password.d.ts +138 -8
  94. package/dist/Password.d.ts.map +1 -1
  95. package/dist/Password.js +397 -8
  96. package/dist/Password.js.map +1 -1
  97. package/dist/RecoveryCode.d.ts +169 -0
  98. package/dist/RecoveryCode.d.ts.map +1 -0
  99. package/dist/RecoveryCode.js +299 -0
  100. package/dist/RecoveryCode.js.map +1 -0
  101. package/dist/RefreshToken.d.ts +222 -0
  102. package/dist/RefreshToken.d.ts.map +1 -0
  103. package/dist/RefreshToken.js +342 -0
  104. package/dist/RefreshToken.js.map +1 -0
  105. package/dist/Sessions.d.ts +52 -2
  106. package/dist/Sessions.d.ts.map +1 -1
  107. package/dist/Sessions.js +123 -1
  108. package/dist/Sessions.js.map +1 -1
  109. package/dist/StepUp.d.ts +44 -0
  110. package/dist/StepUp.d.ts.map +1 -0
  111. package/dist/StepUp.js +82 -0
  112. package/dist/StepUp.js.map +1 -0
  113. package/dist/Storage.d.ts +14 -1
  114. package/dist/Storage.d.ts.map +1 -1
  115. package/dist/Storage.js.map +1 -1
  116. package/dist/StorageMigrations.d.ts +9 -1
  117. package/dist/StorageMigrations.d.ts.map +1 -1
  118. package/dist/StorageMigrations.js +159 -0
  119. package/dist/StorageMigrations.js.map +1 -1
  120. package/dist/Testing.d.ts +1 -1
  121. package/dist/Totp.d.ts +220 -0
  122. package/dist/Totp.d.ts.map +1 -0
  123. package/dist/Totp.js +477 -0
  124. package/dist/Totp.js.map +1 -0
  125. package/dist/TrustedDevice.d.ts +115 -0
  126. package/dist/TrustedDevice.d.ts.map +1 -0
  127. package/dist/TrustedDevice.js +222 -0
  128. package/dist/TrustedDevice.js.map +1 -0
  129. package/dist/alchemy/cloudflare/Email.d.ts +25 -0
  130. package/dist/alchemy/cloudflare/Email.d.ts.map +1 -0
  131. package/dist/alchemy/cloudflare/Email.js +117 -0
  132. package/dist/alchemy/cloudflare/Email.js.map +1 -0
  133. package/dist/cloudflare/Email.d.ts +25 -0
  134. package/dist/cloudflare/Email.d.ts.map +1 -0
  135. package/dist/cloudflare/Email.js +153 -0
  136. package/dist/cloudflare/Email.js.map +1 -0
  137. package/dist/index.d.ts +12 -0
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +12 -0
  140. package/dist/index.js.map +1 -1
  141. package/migrations/0003_auth_login_approval_review.sql +22 -0
  142. package/migrations/0004_auth_trusted_device.sql +12 -0
  143. package/migrations/0005_auth_passkey.sql +17 -0
  144. package/migrations/0006_auth_totp_factor.sql +17 -0
  145. package/migrations/0007_auth_recovery_code.sql +13 -0
  146. package/migrations/0008_auth_api_key.sql +17 -0
  147. package/migrations/0009_auth_refresh_token.sql +21 -0
  148. package/migrations/0010_auth_jwt_revocation.sql +8 -0
  149. package/package.json +57 -1
@@ -0,0 +1,169 @@
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 { CredentialId } from "./Identifiers.js";
6
+ import type { UnixMillis, UserId } from "./Identifiers.js";
7
+ export type RecoveryCode = Brand.Branded<string, "auth/RecoveryCode">;
8
+ export declare const RecoveryCode: Brand.Constructor<RecoveryCode>;
9
+ export type RecoveryCodeHash = Brand.Branded<string, "auth/RecoveryCodeHash">;
10
+ export declare const RecoveryCodeHash: Brand.Constructor<RecoveryCodeHash>;
11
+ export declare const defaultRecoveryCodeCount = 10;
12
+ export declare const defaultRecoveryCodeLength = 16;
13
+ export declare const defaultRecoveryCodeGroupSize = 4;
14
+ export type RecoveryCodeOperation = "generate" | "normalize" | "hash" | "verify";
15
+ declare const RecoveryCodeError_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 & {
16
+ readonly _tag: "RecoveryCodeError";
17
+ } & Readonly<A>;
18
+ export declare class RecoveryCodeError extends RecoveryCodeError_base<{
19
+ readonly operation: RecoveryCodeOperation;
20
+ readonly message: string;
21
+ readonly cause?: unknown;
22
+ }> {
23
+ }
24
+ export interface RecoveryCodeGenerateInput {
25
+ readonly count?: number;
26
+ readonly length?: number;
27
+ readonly groupSize?: number;
28
+ }
29
+ export interface RecoveryCodeHashInput {
30
+ readonly code: Redacted.Redacted<string>;
31
+ }
32
+ export interface RecoveryCodeVerifyInput extends RecoveryCodeHashInput {
33
+ readonly hash: RecoveryCodeHash;
34
+ }
35
+ export interface RecoveryCodesService {
36
+ readonly generate: (input?: RecoveryCodeGenerateInput) => Effect.Effect<readonly Redacted.Redacted<RecoveryCode>[], RecoveryCodeError>;
37
+ readonly normalize: (code: Redacted.Redacted<string>) => Effect.Effect<Redacted.Redacted<RecoveryCode>, RecoveryCodeError>;
38
+ readonly hash: (input: RecoveryCodeHashInput) => Effect.Effect<RecoveryCodeHash, RecoveryCodeError>;
39
+ readonly verify: (input: RecoveryCodeVerifyInput) => Effect.Effect<boolean, RecoveryCodeError>;
40
+ }
41
+ declare const RecoveryCodes_base: Context.ServiceClass<RecoveryCodes, "auth/RecoveryCodes", RecoveryCodesService>;
42
+ export declare class RecoveryCodes extends RecoveryCodes_base {
43
+ }
44
+ export declare namespace RecoveryCodes {
45
+ const make: (service: RecoveryCodesService) => RecoveryCodesService;
46
+ }
47
+ export interface RecoveryCodesDependencies {
48
+ readonly crypto: CryptoService;
49
+ }
50
+ export declare const makeRecoveryCodes: (dependencies: RecoveryCodesDependencies) => RecoveryCodesService;
51
+ export declare const RecoveryCodesLive: Layer.Layer<RecoveryCodes, never, Crypto>;
52
+ export interface RecoveryCodeRecord {
53
+ readonly id: CredentialId;
54
+ readonly userId: UserId;
55
+ readonly codeHash: RecoveryCodeHash;
56
+ readonly createdAt: UnixMillis;
57
+ readonly usedAt?: UnixMillis;
58
+ readonly revokedAt?: UnixMillis;
59
+ readonly metadata?: Readonly<Record<string, unknown>>;
60
+ }
61
+ export interface RecoveryCodeListByUserInput {
62
+ readonly userId: UserId;
63
+ readonly includeUsed?: boolean;
64
+ readonly includeRevoked?: boolean;
65
+ }
66
+ export interface RecoveryCodeMarkUsedInput {
67
+ readonly id: CredentialId;
68
+ readonly usedAt: UnixMillis;
69
+ readonly metadata?: Readonly<Record<string, unknown>>;
70
+ }
71
+ export interface RecoveryCodeRevokeInput {
72
+ readonly id: CredentialId;
73
+ readonly revokedAt: UnixMillis;
74
+ readonly reason?: string;
75
+ }
76
+ export type RecoveryCodeStoreOperation = "insert" | "find" | "list" | "mark-used" | "revoke";
77
+ declare const RecoveryCodeStoreError_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 & {
78
+ readonly _tag: "RecoveryCodeStoreError";
79
+ } & Readonly<A>;
80
+ export declare class RecoveryCodeStoreError extends RecoveryCodeStoreError_base<{
81
+ readonly operation: RecoveryCodeStoreOperation;
82
+ readonly message: string;
83
+ readonly cause?: unknown;
84
+ }> {
85
+ }
86
+ export interface RecoveryCodeStoreService {
87
+ readonly insertMany: (rows: readonly RecoveryCodeRecord[]) => Effect.Effect<void, RecoveryCodeStoreError>;
88
+ readonly findById: (id: CredentialId) => Effect.Effect<OptionTypes.Option<RecoveryCodeRecord>, RecoveryCodeStoreError>;
89
+ readonly listByUser: (input: RecoveryCodeListByUserInput) => Effect.Effect<readonly RecoveryCodeRecord[], RecoveryCodeStoreError>;
90
+ readonly markUsed: (input: RecoveryCodeMarkUsedInput) => Effect.Effect<OptionTypes.Option<RecoveryCodeRecord>, RecoveryCodeStoreError>;
91
+ readonly revoke: (input: RecoveryCodeRevokeInput) => Effect.Effect<void, RecoveryCodeStoreError>;
92
+ }
93
+ declare const RecoveryCodeStore_base: Context.ServiceClass<RecoveryCodeStore, "auth/RecoveryCodeStore", RecoveryCodeStoreService>;
94
+ export declare class RecoveryCodeStore extends RecoveryCodeStore_base {
95
+ }
96
+ export declare namespace RecoveryCodeStore {
97
+ const make: (service: RecoveryCodeStoreService) => RecoveryCodeStoreService;
98
+ }
99
+ export declare const makeRecoveryCodeStoreMemory: () => RecoveryCodeStoreService;
100
+ export declare const RecoveryCodeStoreMemoryLive: Layer.Layer<RecoveryCodeStore, never, never>;
101
+ export interface RecoveryCodeInfo {
102
+ readonly id: CredentialId;
103
+ readonly createdAt: UnixMillis;
104
+ readonly usedAt?: UnixMillis;
105
+ readonly revokedAt?: UnixMillis;
106
+ readonly metadata?: Readonly<Record<string, unknown>>;
107
+ }
108
+ export interface RecoveryCodeGenerateForUserInput extends RecoveryCodeGenerateInput {
109
+ readonly userId: UserId;
110
+ readonly now?: UnixMillis;
111
+ readonly metadata?: Readonly<Record<string, unknown>>;
112
+ }
113
+ export interface GeneratedRecoveryCodes {
114
+ readonly codes: readonly Redacted.Redacted<RecoveryCode>[];
115
+ readonly records: readonly RecoveryCodeInfo[];
116
+ }
117
+ export interface RecoveryCodeVerifyForUserInput {
118
+ readonly userId: UserId;
119
+ readonly code: Redacted.Redacted<string>;
120
+ readonly now?: UnixMillis;
121
+ readonly metadata?: Readonly<Record<string, unknown>>;
122
+ }
123
+ export interface RecoveryCodeVerifyForUserResult {
124
+ readonly valid: boolean;
125
+ readonly code?: RecoveryCodeInfo;
126
+ }
127
+ export interface RecoveryCodeManagementListInput {
128
+ readonly userId: UserId;
129
+ readonly includeUsed?: boolean;
130
+ readonly includeRevoked?: boolean;
131
+ }
132
+ export interface RecoveryCodeManagementRevokeInput {
133
+ readonly userId: UserId;
134
+ readonly codeId: CredentialId;
135
+ readonly revokedAt?: UnixMillis;
136
+ readonly reason?: string;
137
+ }
138
+ export type RecoveryCodeManagementOperation = "generate" | "verify" | "list" | "revoke";
139
+ declare const RecoveryCodeManagementError_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 & {
140
+ readonly _tag: "RecoveryCodeManagementError";
141
+ } & Readonly<A>;
142
+ export declare class RecoveryCodeManagementError extends RecoveryCodeManagementError_base<{
143
+ readonly operation: RecoveryCodeManagementOperation;
144
+ readonly message: string;
145
+ readonly cause?: unknown;
146
+ }> {
147
+ }
148
+ export interface RecoveryCodeManagementService {
149
+ readonly generateForUser: (input: RecoveryCodeGenerateForUserInput) => Effect.Effect<GeneratedRecoveryCodes, RecoveryCodeManagementError>;
150
+ readonly verifyForUser: (input: RecoveryCodeVerifyForUserInput) => Effect.Effect<RecoveryCodeVerifyForUserResult, RecoveryCodeManagementError>;
151
+ readonly listForUser: (input: RecoveryCodeManagementListInput) => Effect.Effect<readonly RecoveryCodeInfo[], RecoveryCodeManagementError>;
152
+ readonly revokeForUser: (input: RecoveryCodeManagementRevokeInput) => Effect.Effect<void, RecoveryCodeManagementError>;
153
+ }
154
+ declare const RecoveryCodeManagement_base: Context.ServiceClass<RecoveryCodeManagement, "auth/RecoveryCodeManagement", RecoveryCodeManagementService>;
155
+ export declare class RecoveryCodeManagement extends RecoveryCodeManagement_base {
156
+ }
157
+ export declare namespace RecoveryCodeManagement {
158
+ const make: (service: RecoveryCodeManagementService) => RecoveryCodeManagementService;
159
+ }
160
+ export interface RecoveryCodeManagementDependencies {
161
+ readonly recoveryCodes: RecoveryCodesService;
162
+ readonly crypto: CryptoService;
163
+ readonly codeStore: RecoveryCodeStoreService;
164
+ readonly codeIdBytes?: number;
165
+ }
166
+ export declare const makeRecoveryCodeManagement: (dependencies: RecoveryCodeManagementDependencies) => RecoveryCodeManagementService;
167
+ export declare const RecoveryCodeManagementLive: Layer.Layer<RecoveryCodeManagement, never, Crypto | RecoveryCodes | RecoveryCodeStore>;
168
+ export {};
169
+ //# sourceMappingURL=RecoveryCode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecoveryCode.d.ts","sourceRoot":"","sources":["../src/RecoveryCode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,299 @@
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 RecoveryCode = Brand.nominal();
6
+ export const RecoveryCodeHash = Brand.nominal();
7
+ export const defaultRecoveryCodeCount = 10;
8
+ export const defaultRecoveryCodeLength = 16;
9
+ export const defaultRecoveryCodeGroupSize = 4;
10
+ export class RecoveryCodeError extends Data.TaggedError("RecoveryCodeError") {
11
+ }
12
+ export class RecoveryCodes extends Context.Service()("auth/RecoveryCodes") {
13
+ }
14
+ (function (RecoveryCodes) {
15
+ RecoveryCodes.make = (service) => RecoveryCodes.of(service);
16
+ })(RecoveryCodes || (RecoveryCodes = {}));
17
+ const textEncoder = new TextEncoder();
18
+ const recoveryCodeAlphabet = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
19
+ const recoveryCodeError = (operation, message, cause) => new RecoveryCodeError({
20
+ operation,
21
+ message,
22
+ ...(cause === undefined ? {} : { cause }),
23
+ });
24
+ const validateCount = (count) => Number.isInteger(count) && count >= 1 && count <= 100
25
+ ? Effect.succeed(count)
26
+ : Effect.fail(recoveryCodeError("generate", "Recovery code count must be an integer between 1 and 100"));
27
+ const validateLength = (length, operation) => Number.isInteger(length) && length >= 8 && length <= 64
28
+ ? Effect.succeed(length)
29
+ : Effect.fail(recoveryCodeError(operation, "Recovery code length must be an integer between 8 and 64"));
30
+ const validateGroupSize = (groupSize) => Number.isInteger(groupSize) && groupSize >= 1 && groupSize <= 16
31
+ ? Effect.succeed(groupSize)
32
+ : Effect.fail(recoveryCodeError("generate", "Recovery code group size must be an integer between 1 and 16"));
33
+ const base32Encode = (bytes) => {
34
+ let bits = 0;
35
+ let value = 0;
36
+ let output = "";
37
+ for (const byte of bytes) {
38
+ value = (value << 8) | byte;
39
+ bits += 8;
40
+ while (bits >= 5) {
41
+ output += recoveryCodeAlphabet[(value >>> (bits - 5)) & 31];
42
+ bits -= 5;
43
+ }
44
+ }
45
+ if (bits > 0) {
46
+ output += recoveryCodeAlphabet[(value << (5 - bits)) & 31];
47
+ }
48
+ return output;
49
+ };
50
+ const groupRecoveryCode = (code, groupSize) => RecoveryCode(code
51
+ .match(new RegExp(`.{1,${groupSize}}`, "g"))
52
+ ?.join("-") ?? code);
53
+ const cleanRecoveryCodeValue = (code, operation) => {
54
+ const cleaned = code.trim().toUpperCase().replaceAll(/[\s-]/g, "");
55
+ if (cleaned.length === 0) {
56
+ return Effect.fail(recoveryCodeError(operation, "Recovery code must not be empty"));
57
+ }
58
+ if (!new RegExp(`^[${recoveryCodeAlphabet}]+$`).test(cleaned)) {
59
+ return Effect.fail(recoveryCodeError(operation, "Recovery code contains unsupported characters"));
60
+ }
61
+ return Effect.succeed(cleaned);
62
+ };
63
+ const normalizeRecoveryCodeValue = (code, operation) => Effect.gen(function* () {
64
+ const cleaned = yield* cleanRecoveryCodeValue(code, operation);
65
+ const length = yield* validateLength(cleaned.length, operation);
66
+ return groupRecoveryCode(cleaned, Math.min(defaultRecoveryCodeGroupSize, length));
67
+ });
68
+ const hashRecoveryCodeValue = (dependencies, code, operation) => dependencies.crypto.digestSha256({ data: `recovery-code:${code}` }).pipe(Effect.map((hash) => RecoveryCodeHash(`sha256:${hash}`)), Effect.mapError((cause) => recoveryCodeError(operation, "Failed to hash recovery code", cause)));
69
+ export const makeRecoveryCodes = (dependencies) => RecoveryCodes.make({
70
+ generate: Effect.fn("auth.recovery_code.generate")(function* (input) {
71
+ const count = yield* validateCount(input?.count ?? defaultRecoveryCodeCount);
72
+ const length = yield* validateLength(input?.length ?? defaultRecoveryCodeLength, "generate");
73
+ const groupSize = yield* validateGroupSize(input?.groupSize ?? defaultRecoveryCodeGroupSize);
74
+ const bytes = Math.ceil((length * 5) / 8);
75
+ const codes = [];
76
+ for (let index = 0; index < count; index += 1) {
77
+ const random = yield* dependencies.crypto.randomBytes(bytes).pipe(Effect.mapError((cause) => recoveryCodeError("generate", "Failed to generate recovery code", cause)));
78
+ const code = base32Encode(random).slice(0, length);
79
+ codes.push(Redacted.make(groupRecoveryCode(code, groupSize)));
80
+ }
81
+ return codes;
82
+ }),
83
+ normalize: Effect.fn("auth.recovery_code.normalize")(function* (code) {
84
+ const normalized = yield* normalizeRecoveryCodeValue(Redacted.value(code), "normalize");
85
+ return Redacted.make(normalized);
86
+ }),
87
+ hash: Effect.fn("auth.recovery_code.hash")(function* (input) {
88
+ const cleaned = yield* cleanRecoveryCodeValue(Redacted.value(input.code), "hash");
89
+ yield* validateLength(cleaned.length, "hash");
90
+ return yield* hashRecoveryCodeValue(dependencies, cleaned, "hash");
91
+ }),
92
+ verify: Effect.fn("auth.recovery_code.verify")(function* (input) {
93
+ const cleaned = yield* cleanRecoveryCodeValue(Redacted.value(input.code), "verify").pipe(Effect.catchTag("RecoveryCodeError", () => Effect.succeed(undefined)));
94
+ if (cleaned === undefined) {
95
+ return false;
96
+ }
97
+ const length = yield* validateLength(cleaned.length, "verify").pipe(Effect.catchTag("RecoveryCodeError", () => Effect.succeed(undefined)));
98
+ if (length === undefined) {
99
+ return false;
100
+ }
101
+ const hash = yield* hashRecoveryCodeValue(dependencies, cleaned, "verify");
102
+ return yield* dependencies.crypto
103
+ .timingSafeEqual({
104
+ left: textEncoder.encode(hash),
105
+ right: textEncoder.encode(input.hash),
106
+ })
107
+ .pipe(Effect.mapError((cause) => recoveryCodeError("verify", "Failed to compare recovery code hashes", cause)));
108
+ }),
109
+ });
110
+ export const RecoveryCodesLive = Layer.effect(RecoveryCodes)(Effect.gen(function* () {
111
+ const crypto = yield* Crypto;
112
+ return makeRecoveryCodes({ crypto });
113
+ }));
114
+ export class RecoveryCodeStoreError extends Data.TaggedError("RecoveryCodeStoreError") {
115
+ }
116
+ export class RecoveryCodeStore extends Context.Service()("auth/RecoveryCodeStore") {
117
+ }
118
+ (function (RecoveryCodeStore) {
119
+ RecoveryCodeStore.make = (service) => RecoveryCodeStore.of(service);
120
+ })(RecoveryCodeStore || (RecoveryCodeStore = {}));
121
+ const cloneMetadata = (metadata) => metadata === undefined ? undefined : structuredClone(metadata);
122
+ const cloneRecoveryCodeRecord = (record) => ({
123
+ ...record,
124
+ ...(record.metadata === undefined
125
+ ? {}
126
+ : { metadata: cloneMetadata(record.metadata) }),
127
+ });
128
+ export const makeRecoveryCodeStoreMemory = () => {
129
+ const codes = new Map();
130
+ return RecoveryCodeStore.make({
131
+ insertMany: (rows) => Effect.sync(() => {
132
+ for (const row of rows) {
133
+ codes.set(row.id, cloneRecoveryCodeRecord(row));
134
+ }
135
+ }),
136
+ findById: (id) => Effect.sync(() => {
137
+ const row = codes.get(id);
138
+ return row === undefined
139
+ ? Option.none()
140
+ : Option.some(cloneRecoveryCodeRecord(row));
141
+ }),
142
+ listByUser: (input) => Effect.sync(() => [...codes.values()]
143
+ .filter((row) => row.userId === input.userId &&
144
+ (input.includeUsed === true || row.usedAt === undefined) &&
145
+ (input.includeRevoked === true || row.revokedAt === undefined))
146
+ .map(cloneRecoveryCodeRecord)),
147
+ markUsed: (input) => Effect.sync(() => {
148
+ const row = codes.get(input.id);
149
+ if (row === undefined ||
150
+ row.usedAt !== undefined ||
151
+ row.revokedAt !== undefined) {
152
+ return Option.none();
153
+ }
154
+ const updated = {
155
+ ...row,
156
+ usedAt: input.usedAt,
157
+ metadata: input.metadata ?? row.metadata,
158
+ };
159
+ codes.set(input.id, updated);
160
+ return Option.some(cloneRecoveryCodeRecord(updated));
161
+ }),
162
+ revoke: (input) => Effect.sync(() => {
163
+ const row = codes.get(input.id);
164
+ if (row !== undefined) {
165
+ codes.set(input.id, {
166
+ ...row,
167
+ revokedAt: input.revokedAt,
168
+ metadata: input.reason === undefined
169
+ ? row.metadata
170
+ : { ...row.metadata, revokeReason: input.reason },
171
+ });
172
+ }
173
+ }),
174
+ });
175
+ };
176
+ export const RecoveryCodeStoreMemoryLive = Layer.sync(RecoveryCodeStore)(makeRecoveryCodeStoreMemory);
177
+ export class RecoveryCodeManagementError extends Data.TaggedError("RecoveryCodeManagementError") {
178
+ }
179
+ export class RecoveryCodeManagement extends Context.Service()("auth/RecoveryCodeManagement") {
180
+ }
181
+ (function (RecoveryCodeManagement) {
182
+ RecoveryCodeManagement.make = (service) => RecoveryCodeManagement.of(service);
183
+ })(RecoveryCodeManagement || (RecoveryCodeManagement = {}));
184
+ const recoveryCodeInfo = (record) => ({
185
+ id: record.id,
186
+ createdAt: record.createdAt,
187
+ ...(record.usedAt === undefined ? {} : { usedAt: record.usedAt }),
188
+ ...(record.revokedAt === undefined ? {} : { revokedAt: record.revokedAt }),
189
+ ...(record.metadata === undefined ? {} : { metadata: record.metadata }),
190
+ });
191
+ const recoveryCodeManagementError = (operation, message, cause) => new RecoveryCodeManagementError({
192
+ operation,
193
+ message,
194
+ ...(cause === undefined ? {} : { cause }),
195
+ });
196
+ const makeRecoveryCodeId = (dependencies, operation) => dependencies.crypto.randomToken(dependencies.codeIdBytes ?? 16).pipe(Effect.map(CredentialId), Effect.mapError((cause) => recoveryCodeManagementError(operation, "Failed to generate recovery code id", cause)));
197
+ const loadOwnedRecoveryCode = (dependencies, operation, input) => Effect.gen(function* () {
198
+ const code = yield* dependencies.codeStore.findById(input.codeId).pipe(Effect.mapError((cause) => recoveryCodeManagementError(operation, "Failed to load recovery code", cause)));
199
+ if (Option.isNone(code) || code.value.userId !== input.userId) {
200
+ return yield* recoveryCodeManagementError(operation, "Recovery code not found");
201
+ }
202
+ return code.value;
203
+ });
204
+ export const makeRecoveryCodeManagement = (dependencies) => RecoveryCodeManagement.make({
205
+ generateForUser: Effect.fn("auth.recovery_code.management.generate")(function* (input) {
206
+ const operation = "generate";
207
+ const now = input.now ?? (yield* currentUnixMillis);
208
+ const codes = yield* dependencies.recoveryCodes
209
+ .generate({
210
+ ...(input.count === undefined ? {} : { count: input.count }),
211
+ ...(input.length === undefined ? {} : { length: input.length }),
212
+ ...(input.groupSize === undefined ? {} : { groupSize: input.groupSize }),
213
+ })
214
+ .pipe(Effect.mapError((cause) => recoveryCodeManagementError(operation, "Failed to generate recovery codes", cause)));
215
+ const rows = [];
216
+ for (const code of codes) {
217
+ const codeHash = yield* dependencies.recoveryCodes
218
+ .hash({ code: Redacted.make(Redacted.value(code)) })
219
+ .pipe(Effect.mapError((cause) => recoveryCodeManagementError(operation, "Failed to hash recovery code", cause)));
220
+ rows.push({
221
+ id: yield* makeRecoveryCodeId(dependencies, operation),
222
+ userId: input.userId,
223
+ codeHash,
224
+ createdAt: now,
225
+ ...(input.metadata === undefined ? {} : { metadata: input.metadata }),
226
+ });
227
+ }
228
+ yield* dependencies.codeStore.insertMany(rows).pipe(Effect.mapError((cause) => recoveryCodeManagementError(operation, "Failed to store recovery codes", cause)));
229
+ return {
230
+ codes,
231
+ records: rows.map(recoveryCodeInfo),
232
+ };
233
+ }),
234
+ verifyForUser: Effect.fn("auth.recovery_code.management.verify")(function* (input) {
235
+ const operation = "verify";
236
+ const now = input.now ?? (yield* currentUnixMillis);
237
+ const codes = yield* dependencies.codeStore
238
+ .listByUser({ userId: input.userId })
239
+ .pipe(Effect.mapError((cause) => recoveryCodeManagementError(operation, "Failed to list recovery codes", cause)));
240
+ for (const code of codes) {
241
+ const valid = yield* dependencies.recoveryCodes
242
+ .verify({ code: input.code, hash: code.codeHash })
243
+ .pipe(Effect.mapError((cause) => recoveryCodeManagementError(operation, "Failed to verify recovery code", cause)));
244
+ if (!valid) {
245
+ continue;
246
+ }
247
+ const updated = yield* dependencies.codeStore
248
+ .markUsed({
249
+ id: code.id,
250
+ usedAt: now,
251
+ ...(input.metadata === undefined ? {} : { metadata: input.metadata }),
252
+ })
253
+ .pipe(Effect.mapError((cause) => recoveryCodeManagementError(operation, "Failed to mark recovery code as used", cause)));
254
+ if (Option.isSome(updated)) {
255
+ return {
256
+ valid: true,
257
+ code: recoveryCodeInfo(updated.value),
258
+ };
259
+ }
260
+ }
261
+ return { valid: false };
262
+ }),
263
+ listForUser: Effect.fn("auth.recovery_code.management.list")(function* (input) {
264
+ const codes = yield* dependencies.codeStore
265
+ .listByUser({
266
+ userId: input.userId,
267
+ ...(input.includeUsed === undefined
268
+ ? {}
269
+ : { includeUsed: input.includeUsed }),
270
+ ...(input.includeRevoked === undefined
271
+ ? {}
272
+ : { includeRevoked: input.includeRevoked }),
273
+ })
274
+ .pipe(Effect.mapError((cause) => recoveryCodeManagementError("list", "Failed to list recovery codes", cause)));
275
+ return codes.map(recoveryCodeInfo);
276
+ }),
277
+ revokeForUser: Effect.fn("auth.recovery_code.management.revoke")(function* (input) {
278
+ const operation = "revoke";
279
+ const code = yield* loadOwnedRecoveryCode(dependencies, operation, input);
280
+ if (code.revokedAt !== undefined) {
281
+ return;
282
+ }
283
+ const revokedAt = input.revokedAt ?? (yield* currentUnixMillis);
284
+ yield* dependencies.codeStore
285
+ .revoke({
286
+ id: input.codeId,
287
+ revokedAt,
288
+ ...(input.reason === undefined ? {} : { reason: input.reason }),
289
+ })
290
+ .pipe(Effect.mapError((cause) => recoveryCodeManagementError(operation, "Failed to revoke recovery code", cause)));
291
+ }),
292
+ });
293
+ export const RecoveryCodeManagementLive = Layer.effect(RecoveryCodeManagement)(Effect.gen(function* () {
294
+ const recoveryCodes = yield* RecoveryCodes;
295
+ const crypto = yield* Crypto;
296
+ const codeStore = yield* RecoveryCodeStore;
297
+ return makeRecoveryCodeManagement({ recoveryCodes, crypto, codeStore });
298
+ }));
299
+ //# sourceMappingURL=RecoveryCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecoveryCode.js","sourceRoot":"","sources":["../src/RecoveryCode.ts"],"names":[],"mappings":"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"}