@effect-auth/core 0.1.0-alpha.10 → 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 (93) hide show
  1. package/README.md +65 -4
  2. package/dist/AuditLog.d.ts +60 -0
  3. package/dist/AuditLog.d.ts.map +1 -1
  4. package/dist/AuditLog.js +105 -0
  5. package/dist/AuditLog.js.map +1 -1
  6. package/dist/AuthKernel.d.ts +1 -1
  7. package/dist/Client.d.ts +72 -1
  8. package/dist/Client.d.ts.map +1 -1
  9. package/dist/Client.js +218 -1
  10. package/dist/Client.js.map +1 -1
  11. package/dist/DomainVerification.d.ts +200 -0
  12. package/dist/DomainVerification.d.ts.map +1 -0
  13. package/dist/DomainVerification.js +304 -0
  14. package/dist/DomainVerification.js.map +1 -0
  15. package/dist/EffectQbSqliteStorage.d.ts +389 -4
  16. package/dist/EffectQbSqliteStorage.d.ts.map +1 -1
  17. package/dist/EffectQbSqliteStorage.js +1191 -4
  18. package/dist/EffectQbSqliteStorage.js.map +1 -1
  19. package/dist/EmailOtp.d.ts +2 -2
  20. package/dist/HttpApi/Api.d.ts +477 -23
  21. package/dist/HttpApi/Api.d.ts.map +1 -1
  22. package/dist/HttpApi/Api.js +705 -4
  23. package/dist/HttpApi/Api.js.map +1 -1
  24. package/dist/HttpApi/Endpoints.d.ts +133 -5
  25. package/dist/HttpApi/Endpoints.d.ts.map +1 -1
  26. package/dist/HttpApi/Endpoints.js +57 -2
  27. package/dist/HttpApi/Endpoints.js.map +1 -1
  28. package/dist/HttpApi/Errors.d.ts +32 -0
  29. package/dist/HttpApi/Errors.d.ts.map +1 -1
  30. package/dist/HttpApi/Errors.js +46 -0
  31. package/dist/HttpApi/Errors.js.map +1 -1
  32. package/dist/HttpApi/Schemas.d.ts +149 -8
  33. package/dist/HttpApi/Schemas.d.ts.map +1 -1
  34. package/dist/HttpApi/Schemas.js +128 -0
  35. package/dist/HttpApi/Schemas.js.map +1 -1
  36. package/dist/Identifiers.d.ts +3 -0
  37. package/dist/Identifiers.d.ts.map +1 -1
  38. package/dist/Identifiers.js +2 -0
  39. package/dist/Identifiers.js.map +1 -1
  40. package/dist/IncidentAction.d.ts +80 -0
  41. package/dist/IncidentAction.d.ts.map +1 -0
  42. package/dist/IncidentAction.js +158 -0
  43. package/dist/IncidentAction.js.map +1 -0
  44. package/dist/Jwt.d.ts +10 -0
  45. package/dist/Jwt.d.ts.map +1 -1
  46. package/dist/Jwt.js +209 -0
  47. package/dist/Jwt.js.map +1 -1
  48. package/dist/LoginNotification.d.ts +1 -1
  49. package/dist/LoginRisk.d.ts +272 -1
  50. package/dist/LoginRisk.d.ts.map +1 -1
  51. package/dist/LoginRisk.js +427 -0
  52. package/dist/LoginRisk.js.map +1 -1
  53. package/dist/MachineAuth.d.ts +73 -0
  54. package/dist/MachineAuth.d.ts.map +1 -0
  55. package/dist/MachineAuth.js +147 -0
  56. package/dist/MachineAuth.js.map +1 -0
  57. package/dist/MagicLink.d.ts +2 -2
  58. package/dist/OAuth.d.ts +957 -1
  59. package/dist/OAuth.d.ts.map +1 -1
  60. package/dist/OAuth.js +1403 -1
  61. package/dist/OAuth.js.map +1 -1
  62. package/dist/Password.d.ts +2 -2
  63. package/dist/Retention.d.ts +98 -0
  64. package/dist/Retention.d.ts.map +1 -0
  65. package/dist/Retention.js +204 -0
  66. package/dist/Retention.js.map +1 -0
  67. package/dist/SecurityTimeline.d.ts +8 -2
  68. package/dist/SecurityTimeline.d.ts.map +1 -1
  69. package/dist/SecurityTimeline.js +75 -0
  70. package/dist/SecurityTimeline.js.map +1 -1
  71. package/dist/StorageMigrations.d.ts +11 -1
  72. package/dist/StorageMigrations.d.ts.map +1 -1
  73. package/dist/StorageMigrations.js +206 -0
  74. package/dist/StorageMigrations.js.map +1 -1
  75. package/dist/Webhook.d.ts +310 -2
  76. package/dist/Webhook.d.ts.map +1 -1
  77. package/dist/Webhook.js +511 -1
  78. package/dist/Webhook.js.map +1 -1
  79. package/dist/index.d.ts +4 -0
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +4 -0
  82. package/dist/index.js.map +1 -1
  83. package/migrations/0014_auth_webhook_outbox.sql +16 -0
  84. package/migrations/0015_auth_webhook_replay.sql +7 -0
  85. package/migrations/0016_auth_login_risk_history.sql +23 -0
  86. package/migrations/0017_auth_audit_log.sql +17 -0
  87. package/migrations/0018_auth_domain_verification.sql +18 -0
  88. package/migrations/0019_auth_oauth_authorization_code.sql +17 -0
  89. package/migrations/0020_auth_oauth_provider_mode_token.sql +24 -0
  90. package/migrations/0021_auth_oauth_client_secret.sql +14 -0
  91. package/migrations/0022_auth_oauth_client.sql +15 -0
  92. package/migrations/0023_auth_oauth_consent.sql +15 -0
  93. package/package.json +17 -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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"}