@effect-auth/core 0.1.0-alpha.1 → 0.1.0-alpha.13

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 (255) hide show
  1. package/README.md +790 -73
  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 +335 -1
  7. package/dist/AuditLog.d.ts.map +1 -1
  8. package/dist/AuditLog.js +318 -1
  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 +462 -36
  15. package/dist/AuthFlow.d.ts.map +1 -1
  16. package/dist/AuthFlow.js +657 -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 +24 -4
  23. package/dist/Challenge.d.ts.map +1 -1
  24. package/dist/Challenge.js +167 -1
  25. package/dist/Challenge.js.map +1 -1
  26. package/dist/Client.d.ts +449 -0
  27. package/dist/Client.d.ts.map +1 -0
  28. package/dist/Client.js +985 -0
  29. package/dist/Client.js.map +1 -0
  30. package/dist/Crypto.d.ts +6 -1
  31. package/dist/Crypto.d.ts.map +1 -1
  32. package/dist/Crypto.js +62 -1
  33. package/dist/Crypto.js.map +1 -1
  34. package/dist/DomainVerification.d.ts +200 -0
  35. package/dist/DomainVerification.d.ts.map +1 -0
  36. package/dist/DomainVerification.js +304 -0
  37. package/dist/DomainVerification.js.map +1 -0
  38. package/dist/EffectQbSqliteStorage.d.ts +985 -0
  39. package/dist/EffectQbSqliteStorage.d.ts.map +1 -0
  40. package/dist/EffectQbSqliteStorage.js +2824 -0
  41. package/dist/EffectQbSqliteStorage.js.map +1 -0
  42. package/dist/EmailOtp.d.ts +120 -0
  43. package/dist/EmailOtp.d.ts.map +1 -0
  44. package/dist/EmailOtp.js +286 -0
  45. package/dist/EmailOtp.js.map +1 -0
  46. package/dist/EmailVerification.d.ts +121 -0
  47. package/dist/EmailVerification.d.ts.map +1 -0
  48. package/dist/EmailVerification.js +200 -0
  49. package/dist/EmailVerification.js.map +1 -0
  50. package/dist/HttpApi/Api.d.ts +2410 -0
  51. package/dist/HttpApi/Api.d.ts.map +1 -0
  52. package/dist/HttpApi/Api.js +3026 -0
  53. package/dist/HttpApi/Api.js.map +1 -0
  54. package/dist/HttpApi/Endpoints.d.ts +1073 -0
  55. package/dist/HttpApi/Endpoints.d.ts.map +1 -0
  56. package/dist/HttpApi/Endpoints.js +428 -0
  57. package/dist/HttpApi/Endpoints.js.map +1 -0
  58. package/dist/HttpApi/Errors.d.ts +114 -0
  59. package/dist/HttpApi/Errors.d.ts.map +1 -0
  60. package/dist/HttpApi/Errors.js +230 -0
  61. package/dist/HttpApi/Errors.js.map +1 -0
  62. package/dist/HttpApi/Schemas.d.ts +1254 -0
  63. package/dist/HttpApi/Schemas.d.ts.map +1 -0
  64. package/dist/HttpApi/Schemas.js +862 -0
  65. package/dist/HttpApi/Schemas.js.map +1 -0
  66. package/dist/HttpApi/Security.d.ts +159 -0
  67. package/dist/HttpApi/Security.d.ts.map +1 -0
  68. package/dist/HttpApi/Security.js +530 -0
  69. package/dist/HttpApi/Security.js.map +1 -0
  70. package/dist/HttpApi/Transport.d.ts +65 -0
  71. package/dist/HttpApi/Transport.d.ts.map +1 -0
  72. package/dist/HttpApi/Transport.js +311 -0
  73. package/dist/HttpApi/Transport.js.map +1 -0
  74. package/dist/HttpApi/index.d.ts +8 -0
  75. package/dist/HttpApi/index.d.ts.map +1 -0
  76. package/dist/HttpApi/index.js +7 -0
  77. package/dist/HttpApi/index.js.map +1 -0
  78. package/dist/HttpApi.d.ts +2 -0
  79. package/dist/HttpApi.d.ts.map +1 -0
  80. package/dist/HttpApi.js +2 -0
  81. package/dist/HttpApi.js.map +1 -0
  82. package/dist/Identifiers.d.ts +3 -0
  83. package/dist/Identifiers.d.ts.map +1 -1
  84. package/dist/Identifiers.js +2 -0
  85. package/dist/Identifiers.js.map +1 -1
  86. package/dist/IncidentAction.d.ts +80 -0
  87. package/dist/IncidentAction.d.ts.map +1 -0
  88. package/dist/IncidentAction.js +158 -0
  89. package/dist/IncidentAction.js.map +1 -0
  90. package/dist/Internal.d.ts +7 -0
  91. package/dist/Internal.d.ts.map +1 -0
  92. package/dist/Internal.js +12 -0
  93. package/dist/Internal.js.map +1 -0
  94. package/dist/Jwt.d.ts +281 -0
  95. package/dist/Jwt.d.ts.map +1 -0
  96. package/dist/Jwt.js +721 -0
  97. package/dist/Jwt.js.map +1 -0
  98. package/dist/LoginApproval.d.ts +314 -0
  99. package/dist/LoginApproval.d.ts.map +1 -0
  100. package/dist/LoginApproval.js +551 -0
  101. package/dist/LoginApproval.js.map +1 -0
  102. package/dist/LoginNotification.d.ts +183 -0
  103. package/dist/LoginNotification.d.ts.map +1 -0
  104. package/dist/LoginNotification.js +329 -0
  105. package/dist/LoginNotification.js.map +1 -0
  106. package/dist/LoginRisk.d.ts +344 -0
  107. package/dist/LoginRisk.d.ts.map +1 -0
  108. package/dist/LoginRisk.js +484 -0
  109. package/dist/LoginRisk.js.map +1 -0
  110. package/dist/MachineAuth.d.ts +73 -0
  111. package/dist/MachineAuth.d.ts.map +1 -0
  112. package/dist/MachineAuth.js +147 -0
  113. package/dist/MachineAuth.js.map +1 -0
  114. package/dist/MagicLink.d.ts +85 -0
  115. package/dist/MagicLink.d.ts.map +1 -0
  116. package/dist/MagicLink.js +206 -0
  117. package/dist/MagicLink.js.map +1 -0
  118. package/dist/Mailer.d.ts +147 -0
  119. package/dist/Mailer.d.ts.map +1 -0
  120. package/dist/Mailer.js +208 -0
  121. package/dist/Mailer.js.map +1 -0
  122. package/dist/OAuth.d.ts +1890 -0
  123. package/dist/OAuth.d.ts.map +1 -0
  124. package/dist/OAuth.js +3063 -0
  125. package/dist/OAuth.js.map +1 -0
  126. package/dist/Passkey.d.ts +334 -0
  127. package/dist/Passkey.d.ts.map +1 -0
  128. package/dist/Passkey.js +422 -0
  129. package/dist/Passkey.js.map +1 -0
  130. package/dist/PasskeySimpleWebAuthn.d.ts +11 -0
  131. package/dist/PasskeySimpleWebAuthn.d.ts.map +1 -0
  132. package/dist/PasskeySimpleWebAuthn.js +181 -0
  133. package/dist/PasskeySimpleWebAuthn.js.map +1 -0
  134. package/dist/Password.d.ts +237 -0
  135. package/dist/Password.d.ts.map +1 -0
  136. package/dist/Password.js +641 -0
  137. package/dist/Password.js.map +1 -0
  138. package/dist/Policy.d.ts +7 -4
  139. package/dist/Policy.d.ts.map +1 -1
  140. package/dist/Policy.js +28 -5
  141. package/dist/Policy.js.map +1 -1
  142. package/dist/Privacy.d.ts +15 -0
  143. package/dist/Privacy.d.ts.map +1 -1
  144. package/dist/Privacy.js +58 -1
  145. package/dist/Privacy.js.map +1 -1
  146. package/dist/RateLimiter.d.ts +104 -0
  147. package/dist/RateLimiter.d.ts.map +1 -0
  148. package/dist/RateLimiter.js +118 -0
  149. package/dist/RateLimiter.js.map +1 -0
  150. package/dist/RecoveryCode.d.ts +169 -0
  151. package/dist/RecoveryCode.d.ts.map +1 -0
  152. package/dist/RecoveryCode.js +299 -0
  153. package/dist/RecoveryCode.js.map +1 -0
  154. package/dist/RefreshToken.d.ts +222 -0
  155. package/dist/RefreshToken.d.ts.map +1 -0
  156. package/dist/RefreshToken.js +342 -0
  157. package/dist/RefreshToken.js.map +1 -0
  158. package/dist/Retention.d.ts +98 -0
  159. package/dist/Retention.d.ts.map +1 -0
  160. package/dist/Retention.js +204 -0
  161. package/dist/Retention.js.map +1 -0
  162. package/dist/SecurityTimeline.d.ts +78 -0
  163. package/dist/SecurityTimeline.d.ts.map +1 -0
  164. package/dist/SecurityTimeline.js +461 -0
  165. package/dist/SecurityTimeline.js.map +1 -0
  166. package/dist/Sessions.d.ts +123 -11
  167. package/dist/Sessions.d.ts.map +1 -1
  168. package/dist/Sessions.js +534 -1
  169. package/dist/Sessions.js.map +1 -1
  170. package/dist/StepUp.d.ts +44 -0
  171. package/dist/StepUp.d.ts.map +1 -0
  172. package/dist/StepUp.js +82 -0
  173. package/dist/StepUp.js.map +1 -0
  174. package/dist/Storage.d.ts +73 -5
  175. package/dist/Storage.d.ts.map +1 -1
  176. package/dist/Storage.js +11 -1
  177. package/dist/Storage.js.map +1 -1
  178. package/dist/StorageMigrations.d.ts +23 -1
  179. package/dist/StorageMigrations.d.ts.map +1 -1
  180. package/dist/StorageMigrations.js +462 -2
  181. package/dist/StorageMigrations.js.map +1 -1
  182. package/dist/Testing.d.ts +9 -1
  183. package/dist/Testing.d.ts.map +1 -1
  184. package/dist/Testing.js +30 -2
  185. package/dist/Testing.js.map +1 -1
  186. package/dist/Totp.d.ts +220 -0
  187. package/dist/Totp.d.ts.map +1 -0
  188. package/dist/Totp.js +477 -0
  189. package/dist/Totp.js.map +1 -0
  190. package/dist/TrustedDevice.d.ts +127 -0
  191. package/dist/TrustedDevice.d.ts.map +1 -0
  192. package/dist/TrustedDevice.js +252 -0
  193. package/dist/TrustedDevice.js.map +1 -0
  194. package/dist/WaitUntil.d.ts.map +1 -1
  195. package/dist/WaitUntil.js +1 -1
  196. package/dist/WaitUntil.js.map +1 -1
  197. package/dist/Webhook.d.ts +380 -0
  198. package/dist/Webhook.d.ts.map +1 -0
  199. package/dist/Webhook.js +592 -0
  200. package/dist/Webhook.js.map +1 -0
  201. package/dist/alchemy/cloudflare/Email.d.ts +25 -0
  202. package/dist/alchemy/cloudflare/Email.d.ts.map +1 -0
  203. package/dist/alchemy/cloudflare/Email.js +117 -0
  204. package/dist/alchemy/cloudflare/Email.js.map +1 -0
  205. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts +34 -0
  206. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  207. package/dist/alchemy/cloudflare/RateLimitDurableObject.js +30 -0
  208. package/dist/alchemy/cloudflare/RateLimitDurableObject.js.map +1 -0
  209. package/dist/cloudflare/Email.d.ts +25 -0
  210. package/dist/cloudflare/Email.d.ts.map +1 -0
  211. package/dist/cloudflare/Email.js +153 -0
  212. package/dist/cloudflare/Email.js.map +1 -0
  213. package/dist/cloudflare/RateLimitDurableObject.d.ts +50 -0
  214. package/dist/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  215. package/dist/cloudflare/RateLimitDurableObject.js +51 -0
  216. package/dist/cloudflare/RateLimitDurableObject.js.map +1 -0
  217. package/dist/index.d.ts +25 -0
  218. package/dist/index.d.ts.map +1 -1
  219. package/dist/index.js +25 -0
  220. package/dist/index.js.map +1 -1
  221. package/dist/internal/RateLimitDurableObject.d.ts +32 -0
  222. package/dist/internal/RateLimitDurableObject.d.ts.map +1 -0
  223. package/dist/internal/RateLimitDurableObject.js +80 -0
  224. package/dist/internal/RateLimitDurableObject.js.map +1 -0
  225. package/migrations/0002_auth_password.sql +25 -0
  226. package/migrations/0003_auth_login_approval_review.sql +22 -0
  227. package/migrations/0004_auth_trusted_device.sql +12 -0
  228. package/migrations/0005_auth_passkey.sql +17 -0
  229. package/migrations/0006_auth_totp_factor.sql +17 -0
  230. package/migrations/0007_auth_recovery_code.sql +13 -0
  231. package/migrations/0008_auth_api_key.sql +17 -0
  232. package/migrations/0009_auth_refresh_token.sql +21 -0
  233. package/migrations/0010_auth_jwt_revocation.sql +8 -0
  234. package/migrations/0011_auth_oauth_account.sql +16 -0
  235. package/migrations/0012_auth_oauth_provider_token_vault.sql +20 -0
  236. package/migrations/0013_auth_security_timeline.sql +16 -0
  237. package/migrations/0014_auth_webhook_outbox.sql +16 -0
  238. package/migrations/0015_auth_webhook_replay.sql +7 -0
  239. package/migrations/0016_auth_login_risk_history.sql +23 -0
  240. package/migrations/0017_auth_audit_log.sql +17 -0
  241. package/migrations/0018_auth_domain_verification.sql +18 -0
  242. package/migrations/0019_auth_oauth_authorization_code.sql +17 -0
  243. package/migrations/0020_auth_oauth_provider_mode_token.sql +24 -0
  244. package/migrations/0021_auth_oauth_client_secret.sql +14 -0
  245. package/migrations/0022_auth_oauth_client.sql +15 -0
  246. package/migrations/0023_auth_oauth_consent.sql +15 -0
  247. package/package.json +162 -26
  248. package/dist/D1Kysely.d.ts +0 -40
  249. package/dist/D1Kysely.d.ts.map +0 -1
  250. package/dist/D1Kysely.js +0 -75
  251. package/dist/D1Kysely.js.map +0 -1
  252. package/dist/KyselyStorage.d.ts +0 -41
  253. package/dist/KyselyStorage.d.ts.map +0 -1
  254. package/dist/KyselyStorage.js +0 -176
  255. package/dist/KyselyStorage.js.map +0 -1
@@ -0,0 +1,304 @@
1
+ import { Brand, Context, Data, Duration, Effect, Layer, Option } from "effect";
2
+ import { Crypto } from "./Crypto.js";
3
+ import { addMillis, currentUnixMillis } from "./Internal.js";
4
+ export const DomainVerificationId = Brand.nominal();
5
+ export const DomainName = Brand.nominal();
6
+ export const DomainVerificationProofToken = Brand.nominal();
7
+ export const defaultDomainVerificationIdBytes = 16;
8
+ export const defaultDomainVerificationTokenBytes = 32;
9
+ export const defaultDomainVerificationTtl = Duration.days(7);
10
+ export const domainVerificationDnsTxtLabel = "_effect-auth-domain-verification";
11
+ export const domainVerificationDnsTxtValuePrefix = "effect-auth-domain-verification=";
12
+ export const domainVerificationHttpPath = "/.well-known/effect-auth/domain-verification.txt";
13
+ export const domainVerificationMetaName = "effect-auth-domain-verification";
14
+ export class DomainVerificationError extends Data.TaggedError("DomainVerificationError") {
15
+ }
16
+ export class DomainVerificationProofCheckError extends Data.TaggedError("DomainVerificationProofCheckError") {
17
+ }
18
+ export class DomainVerificationProofChecker extends Context.Service()("auth/DomainVerificationProofChecker") {
19
+ }
20
+ (function (DomainVerificationProofChecker) {
21
+ DomainVerificationProofChecker.make = (service) => DomainVerificationProofChecker.of(service);
22
+ })(DomainVerificationProofChecker || (DomainVerificationProofChecker = {}));
23
+ export class DomainVerificationStoreError extends Data.TaggedError("DomainVerificationStoreError") {
24
+ }
25
+ export class DomainVerificationStore extends Context.Service()("auth/DomainVerificationStore") {
26
+ }
27
+ (function (DomainVerificationStore) {
28
+ DomainVerificationStore.make = (service) => DomainVerificationStore.of(service);
29
+ })(DomainVerificationStore || (DomainVerificationStore = {}));
30
+ export class DomainVerification extends Context.Service()("auth/DomainVerification") {
31
+ }
32
+ (function (DomainVerification) {
33
+ DomainVerification.make = (service) => DomainVerification.of(service);
34
+ })(DomainVerification || (DomainVerification = {}));
35
+ const cloneMetadata = (metadata) => metadata === undefined ? undefined : structuredClone(metadata);
36
+ const cloneRecord = (record) => ({
37
+ ...record,
38
+ ...(record.metadata === undefined
39
+ ? {}
40
+ : { metadata: cloneMetadata(record.metadata) }),
41
+ });
42
+ const ownerDomainKey = (ownerId, domain) => `${ownerId}\u0000${domain}`;
43
+ const isValidDomainLabel = (label) => label.length > 0 &&
44
+ label.length <= 63 &&
45
+ /^[a-z0-9-]+$/.test(label) &&
46
+ !label.startsWith("-") &&
47
+ !label.endsWith("-");
48
+ export const normalizeDomainName = (value) => {
49
+ const normalized = value.trim().toLowerCase().replace(/\.+$/, "");
50
+ if (normalized.length === 0 || normalized.length > 253) {
51
+ return Option.none();
52
+ }
53
+ const labels = normalized.split(".");
54
+ if (labels.length < 2 || !labels.every(isValidDomainLabel)) {
55
+ return Option.none();
56
+ }
57
+ return Option.some(DomainName(normalized));
58
+ };
59
+ export const domainVerificationDnsTxtName = (domain) => `${domainVerificationDnsTxtLabel}.${domain}`;
60
+ export const domainVerificationDnsTxtValue = (token) => `${domainVerificationDnsTxtValuePrefix}${token}`;
61
+ export const makeDomainVerificationProof = (record) => {
62
+ switch (record.proofMethod) {
63
+ case "dns-txt": {
64
+ return {
65
+ method: "dns-txt",
66
+ token: record.proofToken,
67
+ name: domainVerificationDnsTxtName(record.domain),
68
+ value: domainVerificationDnsTxtValue(record.proofToken),
69
+ };
70
+ }
71
+ case "http-file": {
72
+ return {
73
+ method: "http-file",
74
+ token: record.proofToken,
75
+ path: domainVerificationHttpPath,
76
+ body: record.proofToken,
77
+ };
78
+ }
79
+ case "meta-tag": {
80
+ return {
81
+ method: "meta-tag",
82
+ token: record.proofToken,
83
+ name: domainVerificationMetaName,
84
+ content: record.proofToken,
85
+ };
86
+ }
87
+ }
88
+ };
89
+ const domainVerificationError = (operation, message, cause) => new DomainVerificationError({
90
+ operation,
91
+ message,
92
+ ...(cause === undefined ? {} : { cause }),
93
+ });
94
+ const parseDomain = (operation, value) => {
95
+ const normalized = normalizeDomainName(value);
96
+ return Option.isNone(normalized)
97
+ ? Effect.fail(domainVerificationError(operation, "Domain must be a valid lower-case DNS name; pass IDNs in punycode form"))
98
+ : Effect.succeed(normalized.value);
99
+ };
100
+ const activePending = (record, now) => record.status === "pending" && Number(record.expiresAt) > Number(now);
101
+ const generateId = (dependencies) => dependencies.crypto
102
+ .randomToken(dependencies.idBytes ?? defaultDomainVerificationIdBytes)
103
+ .pipe(Effect.map(DomainVerificationId), Effect.mapError((cause) => domainVerificationError("start", "Failed to generate domain verification id", cause)));
104
+ const generateToken = (dependencies) => dependencies.crypto
105
+ .randomToken(dependencies.tokenBytes ?? defaultDomainVerificationTokenBytes)
106
+ .pipe(Effect.map(DomainVerificationProofToken), Effect.mapError((cause) => domainVerificationError("start", "Failed to generate domain verification proof token", cause)));
107
+ export const makeDomainVerificationStoreMemory = () => {
108
+ const recordsById = new Map();
109
+ const idsByOwnerDomain = new Map();
110
+ return DomainVerificationStore.make({
111
+ upsert: (record) => Effect.sync(() => {
112
+ const key = ownerDomainKey(record.ownerId, record.domain);
113
+ const existingId = idsByOwnerDomain.get(key);
114
+ if (existingId !== undefined && existingId !== record.id) {
115
+ recordsById.delete(existingId);
116
+ }
117
+ recordsById.set(record.id, cloneRecord(record));
118
+ idsByOwnerDomain.set(key, record.id);
119
+ }),
120
+ findById: (id) => Effect.sync(() => {
121
+ const record = recordsById.get(id);
122
+ return record === undefined ? Option.none() : Option.some(cloneRecord(record));
123
+ }),
124
+ findByOwnerAndDomain: (input) => Effect.sync(() => {
125
+ const id = idsByOwnerDomain.get(ownerDomainKey(input.ownerId, input.domain));
126
+ const record = id === undefined ? undefined : recordsById.get(id);
127
+ return record === undefined ? Option.none() : Option.some(cloneRecord(record));
128
+ }),
129
+ listByOwner: (input) => Effect.sync(() => [...recordsById.values()]
130
+ .filter((record) => record.ownerId === input.ownerId &&
131
+ (input.includeRevoked === true || record.status !== "revoked"))
132
+ .map(cloneRecord)),
133
+ markVerified: (input) => Effect.sync(() => {
134
+ const record = recordsById.get(input.id);
135
+ if (record === undefined || record.status === "revoked") {
136
+ return Option.none();
137
+ }
138
+ const updated = {
139
+ ...record,
140
+ status: "verified",
141
+ verifiedAt: input.verifiedAt,
142
+ lastCheckedAt: input.verifiedAt,
143
+ metadata: input.metadata ?? record.metadata,
144
+ };
145
+ recordsById.set(input.id, updated);
146
+ return Option.some(cloneRecord(updated));
147
+ }),
148
+ revoke: (input) => Effect.sync(() => {
149
+ const record = recordsById.get(input.id);
150
+ if (record !== undefined) {
151
+ recordsById.set(input.id, {
152
+ ...record,
153
+ status: "revoked",
154
+ revokedAt: input.revokedAt,
155
+ metadata: input.reason === undefined
156
+ ? record.metadata
157
+ : { ...record.metadata, revokeReason: input.reason },
158
+ });
159
+ }
160
+ }),
161
+ });
162
+ };
163
+ export const DomainVerificationStoreMemoryLive = Layer.sync(DomainVerificationStore)(makeDomainVerificationStoreMemory);
164
+ export const makeDomainVerification = (dependencies) => DomainVerification.make({
165
+ start: Effect.fn("auth.domain_verification.start")(function* (input) {
166
+ const ownerId = input.ownerId.trim();
167
+ if (ownerId === "") {
168
+ return yield* domainVerificationError("start", "Owner id is required");
169
+ }
170
+ const domain = yield* parseDomain("start", input.domain);
171
+ const now = input.now ?? (yield* currentUnixMillis);
172
+ const existing = yield* dependencies.store
173
+ .findByOwnerAndDomain({ ownerId, domain })
174
+ .pipe(Effect.mapError((cause) => domainVerificationError("start", "Failed to load existing domain verification", cause)));
175
+ if (Option.isSome(existing)) {
176
+ if (existing.value.status === "verified") {
177
+ return yield* domainVerificationError("start", "Domain is already verified");
178
+ }
179
+ if (activePending(existing.value, now)) {
180
+ return {
181
+ record: existing.value,
182
+ proof: makeDomainVerificationProof(existing.value),
183
+ };
184
+ }
185
+ }
186
+ const ttl = input.ttl ?? dependencies.ttl ?? defaultDomainVerificationTtl;
187
+ const record = {
188
+ id: input.id ?? (yield* generateId(dependencies)),
189
+ ownerId,
190
+ domain,
191
+ proofMethod: input.method ?? "dns-txt",
192
+ proofToken: input.proofToken ?? (yield* generateToken(dependencies)),
193
+ status: "pending",
194
+ createdAt: now,
195
+ expiresAt: input.expiresAt ?? addMillis(now, Duration.toMillis(ttl)),
196
+ ...(input.metadata === undefined ? {} : { metadata: input.metadata }),
197
+ };
198
+ yield* dependencies.store.upsert(record).pipe(Effect.mapError((cause) => domainVerificationError("start", "Failed to store domain verification", cause)));
199
+ return {
200
+ record,
201
+ proof: makeDomainVerificationProof(record),
202
+ };
203
+ }),
204
+ verify: Effect.fn("auth.domain_verification.verify")(function* (input) {
205
+ const recordOption = yield* dependencies.store.findById(input.id).pipe(Effect.mapError((cause) => domainVerificationError("verify", "Failed to load domain verification", cause)));
206
+ if (Option.isNone(recordOption)) {
207
+ return yield* domainVerificationError("verify", "Domain verification not found");
208
+ }
209
+ const record = recordOption.value;
210
+ const proof = makeDomainVerificationProof(record);
211
+ const checkedAt = input.now ?? (yield* currentUnixMillis);
212
+ if (record.status === "verified") {
213
+ return {
214
+ verified: true,
215
+ record,
216
+ proof,
217
+ checkedAt,
218
+ };
219
+ }
220
+ if (record.status === "revoked") {
221
+ return yield* domainVerificationError("verify", "Domain verification is revoked");
222
+ }
223
+ if (Number(record.expiresAt) <= Number(checkedAt)) {
224
+ return yield* domainVerificationError("verify", "Domain verification has expired");
225
+ }
226
+ const check = yield* dependencies.proofChecker
227
+ .check({
228
+ domain: record.domain,
229
+ method: record.proofMethod,
230
+ proof,
231
+ ...(record.metadata === undefined ? {} : { metadata: record.metadata }),
232
+ })
233
+ .pipe(Effect.mapError((cause) => domainVerificationError("verify", "Failed to check domain proof", cause)));
234
+ if (!check.matched) {
235
+ return {
236
+ verified: false,
237
+ record,
238
+ proof,
239
+ checkedAt,
240
+ check,
241
+ };
242
+ }
243
+ const verified = yield* dependencies.store
244
+ .markVerified({
245
+ id: record.id,
246
+ verifiedAt: checkedAt,
247
+ ...(input.metadata === undefined ? {} : { metadata: input.metadata }),
248
+ })
249
+ .pipe(Effect.mapError((cause) => domainVerificationError("verify", "Failed to mark domain as verified", cause)));
250
+ if (Option.isNone(verified)) {
251
+ return yield* domainVerificationError("verify", "Domain verification not found");
252
+ }
253
+ return {
254
+ verified: true,
255
+ record: verified.value,
256
+ proof,
257
+ checkedAt,
258
+ check,
259
+ };
260
+ }),
261
+ listByOwner: Effect.fn("auth.domain_verification.list")(function* (input) {
262
+ return yield* dependencies.store.listByOwner(input).pipe(Effect.mapError((cause) => domainVerificationError("list", "Failed to list domain verifications", cause)));
263
+ }),
264
+ revoke: Effect.fn("auth.domain_verification.revoke")(function* (input) {
265
+ const ownerId = input.ownerId.trim();
266
+ if (ownerId === "") {
267
+ return yield* domainVerificationError("revoke", "Owner id is required");
268
+ }
269
+ const domain = yield* parseDomain("revoke", input.domain);
270
+ const record = yield* dependencies.store
271
+ .findByOwnerAndDomain({ ownerId, domain })
272
+ .pipe(Effect.mapError((cause) => domainVerificationError("revoke", "Failed to load domain verification", cause)));
273
+ if (Option.isNone(record)) {
274
+ return yield* domainVerificationError("revoke", "Domain verification not found");
275
+ }
276
+ if (record.value.status === "revoked") {
277
+ return;
278
+ }
279
+ const revokedAt = input.revokedAt ?? (yield* currentUnixMillis);
280
+ yield* dependencies.store
281
+ .revoke({
282
+ id: record.value.id,
283
+ revokedAt,
284
+ ...(input.reason === undefined ? {} : { reason: input.reason }),
285
+ })
286
+ .pipe(Effect.mapError((cause) => domainVerificationError("revoke", "Failed to revoke domain verification", cause)));
287
+ }),
288
+ });
289
+ export const DomainVerificationLive = (options) => Layer.effect(DomainVerification)(Effect.gen(function* () {
290
+ const crypto = yield* Crypto;
291
+ const store = yield* DomainVerificationStore;
292
+ const proofChecker = yield* DomainVerificationProofChecker;
293
+ return makeDomainVerification({
294
+ crypto,
295
+ store,
296
+ proofChecker,
297
+ ...options,
298
+ });
299
+ }));
300
+ export const startDomainVerification = (input) => Effect.flatMap(DomainVerification, (service) => service.start(input));
301
+ export const verifyDomainVerification = (input) => Effect.flatMap(DomainVerification, (service) => service.verify(input));
302
+ export const listDomainVerificationsByOwner = (input) => Effect.flatMap(DomainVerification, (service) => service.listByOwner(input));
303
+ export const revokeDomainVerification = (input) => Effect.flatMap(DomainVerification, (service) => service.revoke(input));
304
+ //# sourceMappingURL=DomainVerification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DomainVerification.js","sourceRoot":"","sources":["../src/DomainVerification.ts"],"names":[],"mappings":"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"}