@effect-auth/core 0.1.0-alpha.1 → 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 (227) hide show
  1. package/README.md +728 -72
  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 +275 -1
  7. package/dist/AuditLog.d.ts.map +1 -1
  8. package/dist/AuditLog.js +213 -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 +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 +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/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 +15 -0
  129. package/dist/Privacy.d.ts.map +1 -1
  130. package/dist/Privacy.js +58 -1
  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 +123 -11
  149. package/dist/Sessions.d.ts.map +1 -1
  150. package/dist/Sessions.js +534 -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 +73 -5
  157. package/dist/Storage.d.ts.map +1 -1
  158. package/dist/Storage.js +11 -1
  159. package/dist/Storage.js.map +1 -1
  160. package/dist/StorageMigrations.d.ts +13 -1
  161. package/dist/StorageMigrations.d.ts.map +1 -1
  162. package/dist/StorageMigrations.js +256 -2
  163. package/dist/StorageMigrations.js.map +1 -1
  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.map +1 -1
  177. package/dist/WaitUntil.js +1 -1
  178. package/dist/WaitUntil.js.map +1 -1
  179. package/dist/Webhook.d.ts +72 -0
  180. package/dist/Webhook.d.ts.map +1 -0
  181. package/dist/Webhook.js +82 -0
  182. package/dist/Webhook.js.map +1 -0
  183. package/dist/alchemy/cloudflare/Email.d.ts +25 -0
  184. package/dist/alchemy/cloudflare/Email.d.ts.map +1 -0
  185. package/dist/alchemy/cloudflare/Email.js +117 -0
  186. package/dist/alchemy/cloudflare/Email.js.map +1 -0
  187. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts +34 -0
  188. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  189. package/dist/alchemy/cloudflare/RateLimitDurableObject.js +30 -0
  190. package/dist/alchemy/cloudflare/RateLimitDurableObject.js.map +1 -0
  191. package/dist/cloudflare/Email.d.ts +25 -0
  192. package/dist/cloudflare/Email.d.ts.map +1 -0
  193. package/dist/cloudflare/Email.js +153 -0
  194. package/dist/cloudflare/Email.js.map +1 -0
  195. package/dist/cloudflare/RateLimitDurableObject.d.ts +50 -0
  196. package/dist/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  197. package/dist/cloudflare/RateLimitDurableObject.js +51 -0
  198. package/dist/cloudflare/RateLimitDurableObject.js.map +1 -0
  199. package/dist/index.d.ts +21 -0
  200. package/dist/index.d.ts.map +1 -1
  201. package/dist/index.js +21 -0
  202. package/dist/index.js.map +1 -1
  203. package/dist/internal/RateLimitDurableObject.d.ts +32 -0
  204. package/dist/internal/RateLimitDurableObject.d.ts.map +1 -0
  205. package/dist/internal/RateLimitDurableObject.js +80 -0
  206. package/dist/internal/RateLimitDurableObject.js.map +1 -0
  207. package/migrations/0002_auth_password.sql +25 -0
  208. package/migrations/0003_auth_login_approval_review.sql +22 -0
  209. package/migrations/0004_auth_trusted_device.sql +12 -0
  210. package/migrations/0005_auth_passkey.sql +17 -0
  211. package/migrations/0006_auth_totp_factor.sql +17 -0
  212. package/migrations/0007_auth_recovery_code.sql +13 -0
  213. package/migrations/0008_auth_api_key.sql +17 -0
  214. package/migrations/0009_auth_refresh_token.sql +21 -0
  215. package/migrations/0010_auth_jwt_revocation.sql +8 -0
  216. package/migrations/0011_auth_oauth_account.sql +16 -0
  217. package/migrations/0012_auth_oauth_provider_token_vault.sql +20 -0
  218. package/migrations/0013_auth_security_timeline.sql +16 -0
  219. package/package.json +146 -26
  220. package/dist/D1Kysely.d.ts +0 -40
  221. package/dist/D1Kysely.d.ts.map +0 -1
  222. package/dist/D1Kysely.js +0 -75
  223. package/dist/D1Kysely.js.map +0 -1
  224. package/dist/KyselyStorage.d.ts +0 -41
  225. package/dist/KyselyStorage.d.ts.map +0 -1
  226. package/dist/KyselyStorage.js +0 -176
  227. package/dist/KyselyStorage.js.map +0 -1
@@ -0,0 +1,252 @@
1
+ import { Context, Data, Duration, Effect, Layer, Option, Redacted, } from "effect";
2
+ import { AuthSecrets } from "./AuthConfig.js";
3
+ import { Crypto } from "./Crypto.js";
4
+ import { addMillis, currentUnixMillis } from "./Internal.js";
5
+ export class TrustedDeviceError extends Data.TaggedError("TrustedDeviceError") {
6
+ }
7
+ export class TrustedDeviceStore extends Context.Service()("auth/TrustedDeviceStore") {
8
+ }
9
+ (function (TrustedDeviceStore) {
10
+ TrustedDeviceStore.make = (service) => TrustedDeviceStore.of(service);
11
+ })(TrustedDeviceStore || (TrustedDeviceStore = {}));
12
+ export class TrustedDevice extends Context.Service()("auth/TrustedDevice") {
13
+ }
14
+ (function (TrustedDevice) {
15
+ TrustedDevice.make = (service) => TrustedDevice.of(service);
16
+ })(TrustedDevice || (TrustedDevice = {}));
17
+ export class TrustedDeviceCookie extends Context.Service()("auth/TrustedDeviceCookie") {
18
+ }
19
+ (function (TrustedDeviceCookie) {
20
+ TrustedDeviceCookie.make = (service) => TrustedDeviceCookie.of(service);
21
+ })(TrustedDeviceCookie || (TrustedDeviceCookie = {}));
22
+ export const defaultTrustedDeviceTtl = Duration.days(90);
23
+ export const defaultTrustedDeviceTokenBytes = 32;
24
+ const defaultTrustedDeviceCookieOptions = {
25
+ name: "__Host-auth-device",
26
+ secure: true,
27
+ httpOnly: true,
28
+ sameSite: "lax",
29
+ path: "/",
30
+ };
31
+ const trustedDeviceHashNamespace = "auth.trusted_device.v1";
32
+ const trustedDeviceKey = (userId, tokenHash) => `${userId}:${tokenHash}`;
33
+ const trustedDeviceHash = (dependencies, userId, token, operation) => dependencies.crypto
34
+ .hmacSha256({
35
+ key: dependencies.secret,
36
+ data: `${trustedDeviceHashNamespace}:${userId}:${Redacted.value(token)}`,
37
+ })
38
+ .pipe(Effect.mapError((cause) => new TrustedDeviceError({
39
+ operation,
40
+ message: "Failed to hash trusted device token",
41
+ cause,
42
+ })));
43
+ const deviceContext = (status) => ({
44
+ status,
45
+ });
46
+ const cloneRecord = (record) => ({
47
+ ...record,
48
+ ...(record.metadata === undefined
49
+ ? {}
50
+ : { metadata: { ...record.metadata } }),
51
+ });
52
+ const compareTrustedDeviceRecords = (left, right) => {
53
+ const lastSeenAt = Number(right.lastSeenAt) - Number(left.lastSeenAt);
54
+ return lastSeenAt === 0
55
+ ? right.tokenHash.localeCompare(left.tokenHash)
56
+ : lastSeenAt;
57
+ };
58
+ const insertSortedTrustedDeviceRecord = (devices, device) => {
59
+ const index = devices.findIndex((existing) => compareTrustedDeviceRecords(device, existing) < 0);
60
+ return index === -1
61
+ ? [...devices, device]
62
+ : [...devices.slice(0, index), device, ...devices.slice(index)];
63
+ };
64
+ const sortTrustedDeviceRecords = (devices) => {
65
+ let sorted = [];
66
+ for (const device of devices) {
67
+ sorted = insertSortedTrustedDeviceRecord(sorted, device);
68
+ }
69
+ return sorted;
70
+ };
71
+ export const filterTrustedDevicesForUser = (devices, input) => {
72
+ const limit = input.limit === undefined ? undefined : Math.max(0, Math.floor(input.limit));
73
+ const filtered = sortTrustedDeviceRecords([...devices]
74
+ .filter((device) => device.userId === input.userId)
75
+ .filter((device) => Number(device.expiresAt) > Number(input.now))).map(cloneRecord);
76
+ return limit === undefined ? filtered : filtered.slice(0, limit);
77
+ };
78
+ export const makeTrustedDeviceStoreMemory = () => {
79
+ const devices = new Map();
80
+ return TrustedDeviceStore.make({
81
+ find: (input) => Effect.sync(() => {
82
+ const row = devices.get(trustedDeviceKey(input.userId, input.tokenHash));
83
+ if (row === undefined || Number(row.expiresAt) <= Number(input.now)) {
84
+ return Option.none();
85
+ }
86
+ return Option.some(cloneRecord(row));
87
+ }),
88
+ upsert: (input) => Effect.sync(() => {
89
+ const key = trustedDeviceKey(input.userId, input.tokenHash);
90
+ const existing = devices.get(key);
91
+ const row = {
92
+ userId: input.userId,
93
+ tokenHash: input.tokenHash,
94
+ createdAt: existing?.createdAt ?? input.now,
95
+ lastSeenAt: input.now,
96
+ expiresAt: input.expiresAt,
97
+ metadata: input.metadata ?? existing?.metadata,
98
+ };
99
+ devices.set(key, row);
100
+ return cloneRecord(row);
101
+ }),
102
+ listForUser: (input) => Effect.sync(() => filterTrustedDevicesForUser(devices.values(), input)),
103
+ revokeForUser: (input) => Effect.sync(() => {
104
+ devices.delete(trustedDeviceKey(input.userId, input.tokenHash));
105
+ }),
106
+ });
107
+ };
108
+ export const TrustedDeviceStoreMemoryLive = Layer.sync(TrustedDeviceStore)(makeTrustedDeviceStoreMemory);
109
+ export const makeTrustedDevice = (dependencies) => {
110
+ const ttl = dependencies.ttl ?? defaultTrustedDeviceTtl;
111
+ const tokenBytes = dependencies.tokenBytes ?? defaultTrustedDeviceTokenBytes;
112
+ return TrustedDevice.make({
113
+ status: Effect.fn("auth.trusted_device.status")(function* (input) {
114
+ if (input.token === undefined) {
115
+ return deviceContext("unknown");
116
+ }
117
+ const now = yield* currentUnixMillis;
118
+ const tokenHash = yield* trustedDeviceHash(dependencies, input.userId, input.token, "status");
119
+ const row = yield* dependencies.store.find({
120
+ userId: input.userId,
121
+ tokenHash,
122
+ now,
123
+ });
124
+ return deviceContext(Option.isSome(row) ? "known" : "new");
125
+ }),
126
+ trust: Effect.fn("auth.trusted_device.trust")(function* (input) {
127
+ const now = yield* currentUnixMillis;
128
+ const token = input.token ??
129
+ Redacted.make(yield* dependencies.crypto.randomToken(tokenBytes).pipe(Effect.mapError((cause) => new TrustedDeviceError({
130
+ operation: "trust",
131
+ message: "Failed to create trusted device token",
132
+ cause,
133
+ }))));
134
+ const tokenHash = yield* trustedDeviceHash(dependencies, input.userId, token, "trust");
135
+ const expiresAt = addMillis(now, Duration.toMillis(input.ttl ?? ttl));
136
+ yield* dependencies.store.upsert({
137
+ userId: input.userId,
138
+ tokenHash,
139
+ now,
140
+ expiresAt,
141
+ metadata: input.metadata,
142
+ });
143
+ return {
144
+ userId: input.userId,
145
+ token,
146
+ expiresAt,
147
+ };
148
+ }),
149
+ });
150
+ };
151
+ export function TrustedDeviceLive(options) {
152
+ return Layer.effect(TrustedDevice)(Effect.gen(function* () {
153
+ const crypto = yield* Crypto;
154
+ const store = yield* TrustedDeviceStore;
155
+ const resolvedOptions = options ??
156
+ {
157
+ secret: (yield* AuthSecrets).privacy,
158
+ };
159
+ return makeTrustedDevice({
160
+ ...resolvedOptions,
161
+ crypto,
162
+ store,
163
+ });
164
+ }));
165
+ }
166
+ const resolveTrustedDeviceCookieOptions = (options = {}) => {
167
+ const resolved = {
168
+ ...defaultTrustedDeviceCookieOptions,
169
+ ...options,
170
+ };
171
+ if (resolved.name.startsWith("__Host-")) {
172
+ return {
173
+ ...resolved,
174
+ secure: true,
175
+ path: "/",
176
+ domain: undefined,
177
+ };
178
+ }
179
+ return resolved;
180
+ };
181
+ const sameSiteHeaderValue = (sameSite) => {
182
+ switch (sameSite) {
183
+ case "strict": {
184
+ return "Strict";
185
+ }
186
+ case "none": {
187
+ return "None";
188
+ }
189
+ case "lax": {
190
+ return "Lax";
191
+ }
192
+ }
193
+ };
194
+ const appendCookieAttributes = (parts, options) => {
195
+ if (options.httpOnly) {
196
+ parts.push("HttpOnly");
197
+ }
198
+ if (options.secure) {
199
+ parts.push("Secure");
200
+ }
201
+ parts.push(`SameSite=${sameSiteHeaderValue(options.sameSite)}`);
202
+ parts.push(`Path=${options.path}`);
203
+ if (options.domain !== undefined) {
204
+ parts.push(`Domain=${options.domain}`);
205
+ }
206
+ return parts;
207
+ };
208
+ const parseCookieValue = (header, name) => {
209
+ if (header === null) {
210
+ return undefined;
211
+ }
212
+ for (const part of header.split(";")) {
213
+ const trimmed = part.trim();
214
+ const separator = trimmed.indexOf("=");
215
+ if (separator <= 0) {
216
+ continue;
217
+ }
218
+ if (trimmed.slice(0, separator) !== name) {
219
+ continue;
220
+ }
221
+ try {
222
+ return decodeURIComponent(trimmed.slice(separator + 1));
223
+ }
224
+ catch {
225
+ return undefined;
226
+ }
227
+ }
228
+ return undefined;
229
+ };
230
+ const serializeCookie = (options, value, expiresAt) => {
231
+ const parts = [`${options.name}=${encodeURIComponent(value)}`];
232
+ if (expiresAt !== undefined) {
233
+ parts.push(`Expires=${new Date(Number(expiresAt)).toUTCString()}`);
234
+ }
235
+ return appendCookieAttributes(parts, options).join("; ");
236
+ };
237
+ const serializeClearCookie = (options) => appendCookieAttributes([`${options.name}=`, "Max-Age=0", "Expires=Thu, 01 Jan 1970 00:00:00 GMT"], options).join("; ");
238
+ export const makeTrustedDeviceCookie = (options) => {
239
+ const resolved = resolveTrustedDeviceCookieOptions(options);
240
+ return TrustedDeviceCookie.make({
241
+ read: (request) => Effect.succeed((() => {
242
+ const value = parseCookieValue(request.headers.get("Cookie"), resolved.name);
243
+ return value === undefined
244
+ ? Option.none()
245
+ : Option.some(Redacted.make(value));
246
+ })()),
247
+ commit: (input) => Effect.succeed(serializeCookie(resolved, Redacted.value(input.token.token), input.token.expiresAt)),
248
+ clear: Effect.succeed(serializeClearCookie(resolved)),
249
+ });
250
+ };
251
+ export const TrustedDeviceCookieLive = (options) => Layer.succeed(TrustedDeviceCookie)(makeTrustedDeviceCookie(options));
252
+ //# sourceMappingURL=TrustedDevice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrustedDevice.js","sourceRoot":"","sources":["../src/TrustedDevice.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"WaitUntil.d.ts","sourceRoot":"","sources":["../src/WaitUntil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAQ,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;;;;AAErD,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC;CAAG;AAEL,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAA;CACxG;;AAED,qBAAa,SAAU,SAAQ,cAAmE;CAAG;AAErG,yBAAiB,SAAS,CAAC;IAClB,MAAM,IAAI,GAAI,SAAS,gBAAgB,KAAG,gBAAyC,CAAA;CAC3F;AAED,eAAO,MAAM,iBAAiB,sCAE3B,CAAA"}
1
+ {"version":3,"file":"WaitUntil.d.ts","sourceRoot":"","sources":["../src/WaitUntil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAQ,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;;;;AAEtD,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;CAAG;AAEL,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;CAC7C;;AAED,qBAAa,SAAU,SAAQ,cAE9B;CAAG;AAEJ,yBAAiB,SAAS,CAAC;IAClB,MAAM,IAAI,GAAI,SAAS,gBAAgB,KAAG,gBAC1B,CAAC;CACzB;AAED,eAAO,MAAM,iBAAiB,sCAK7B,CAAC"}
package/dist/WaitUntil.js CHANGED
@@ -7,6 +7,6 @@ export class WaitUntil extends Context.Service()("runtime/WaitUntil") {
7
7
  WaitUntil.make = (service) => WaitUntil.of(service);
8
8
  })(WaitUntil || (WaitUntil = {}));
9
9
  export const WaitUntilNoopLive = Layer.succeed(WaitUntil)(WaitUntil.make({
10
- waitUntil: (_effect) => Effect.asVoid(Effect.context())
10
+ waitUntil: (_effect) => Effect.asVoid(Effect.context()),
11
11
  }));
12
12
  //# sourceMappingURL=WaitUntil.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WaitUntil.js","sourceRoot":"","sources":["../src/WaitUntil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAErD,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAGnE;CAAG;AAML,MAAM,OAAO,SAAU,SAAQ,OAAO,CAAC,OAAO,EAA+B,CAAC,mBAAmB,CAAC;CAAG;AAErG,WAAiB,SAAS;IACX,cAAI,GAAG,CAAC,OAAyB,EAAoB,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;AAC5F,CAAC,EAFgB,SAAS,KAAT,SAAS,QAEzB;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;IACvE,SAAS,EAAE,CAAU,OAA+B,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAK,CAAC;CAC5F,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"WaitUntil.js","sourceRoot":"","sources":["../src/WaitUntil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEtD,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAGnE;CAAG;AAQL,MAAM,OAAO,SAAU,SAAQ,OAAO,CAAC,OAAO,EAA+B,CAC3E,mBAAmB,CACpB;CAAG;AAEJ,WAAiB,SAAS;IACX,cAAI,GAAG,CAAC,OAAyB,EAAoB,EAAE,CAClE,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC,EAHgB,SAAS,KAAT,SAAS,QAGzB;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CACvD,SAAS,CAAC,IAAI,CAAC;IACb,SAAS,EAAE,CAAU,OAA+B,EAAE,EAAE,CACtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAK,CAAC;CACrC,CAAC,CACH,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { Crypto, type CryptoKey } from "./Crypto.js";
3
+ import type { UnixMillis } from "./Identifiers.js";
4
+ export type WebhookOperation = "encode" | "sign" | "verify" | "deliver";
5
+ declare const WebhookError_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 & {
6
+ readonly _tag: "WebhookError";
7
+ } & Readonly<A>;
8
+ export declare class WebhookError extends WebhookError_base<{
9
+ readonly operation: WebhookOperation;
10
+ readonly message: string;
11
+ readonly cause?: unknown;
12
+ }> {
13
+ }
14
+ export interface WebhookEvent<Type extends string = string, Payload = unknown> {
15
+ readonly id: string;
16
+ readonly type: Type;
17
+ readonly payload: Payload;
18
+ readonly occurredAt: UnixMillis;
19
+ }
20
+ export type WebhookEventInput<Type extends string = string, Payload = unknown> = Omit<WebhookEvent<Type, Payload>, "occurredAt"> & {
21
+ readonly occurredAt?: UnixMillis;
22
+ };
23
+ export interface WebhookEndpoint {
24
+ readonly url: string;
25
+ readonly secret: CryptoKey;
26
+ readonly headers?: Readonly<Record<string, string>>;
27
+ }
28
+ export interface WebhookSignedRequest {
29
+ readonly url: string;
30
+ readonly method: "POST";
31
+ readonly headers: Readonly<Record<string, string>>;
32
+ readonly body: string;
33
+ }
34
+ export interface WebhookSignatureInput {
35
+ readonly id: string;
36
+ readonly timestamp: UnixMillis;
37
+ readonly body: string;
38
+ readonly secret: CryptoKey;
39
+ }
40
+ export interface WebhookVerifyInput extends WebhookSignatureInput {
41
+ readonly signatureHeader: string;
42
+ }
43
+ export interface MakeWebhookRequestInput<Type extends string = string, Payload = unknown> {
44
+ readonly endpoint: WebhookEndpoint;
45
+ readonly event: WebhookEvent<Type, Payload>;
46
+ }
47
+ export interface WebhookDeliveryService {
48
+ readonly deliver: (request: WebhookSignedRequest) => Effect.Effect<void, WebhookError>;
49
+ }
50
+ declare const WebhookDelivery_base: Context.ServiceClass<WebhookDelivery, "auth/WebhookDelivery", WebhookDeliveryService>;
51
+ export declare class WebhookDelivery extends WebhookDelivery_base {
52
+ }
53
+ export declare namespace WebhookDelivery {
54
+ const make: (service: WebhookDeliveryService) => WebhookDeliveryService;
55
+ }
56
+ export declare const WebhookHeaders: {
57
+ readonly id: "effect-auth-webhook-id";
58
+ readonly timestamp: "effect-auth-webhook-timestamp";
59
+ readonly signature: "effect-auth-webhook-signature";
60
+ readonly eventType: "effect-auth-webhook-event";
61
+ };
62
+ export declare const formatWebhookSignatureHeader: (signature: string) => string;
63
+ export declare const makeWebhookEvent: <Type extends string, Payload>(input: WebhookEventInput<Type, Payload>) => Effect.Effect<WebhookEvent<Type, Payload>>;
64
+ export declare const encodeWebhookEvent: (event: WebhookEvent) => Effect.Effect<string, WebhookError>;
65
+ export declare const signWebhookBody: (input: WebhookSignatureInput) => Effect.Effect<string, WebhookError, Crypto>;
66
+ export declare const verifyWebhookSignature: (input: WebhookVerifyInput) => Effect.Effect<boolean, WebhookError, Crypto>;
67
+ export declare const makeWebhookRequest: <Type extends string, Payload>(input: MakeWebhookRequestInput<Type, Payload>) => Effect.Effect<WebhookSignedRequest, WebhookError, Crypto>;
68
+ export declare const deliverWebhook: (request: WebhookSignedRequest) => Effect.Effect<void, WebhookError, WebhookDelivery>;
69
+ export declare const dispatchWebhook: <Type extends string, Payload>(input: MakeWebhookRequestInput<Type, Payload>) => Effect.Effect<void, WebhookError, Crypto | WebhookDelivery>;
70
+ export declare const WebhookDeliveryNoopLive: Layer.Layer<WebhookDelivery, never, never>;
71
+ export {};
72
+ //# sourceMappingURL=Webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Webhook.d.ts","sourceRoot":"","sources":["../src/Webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { Context, Data, Effect, Encoding, Layer, Result } from "effect";
2
+ import { Crypto } from "./Crypto.js";
3
+ import { currentUnixMillis } from "./Internal.js";
4
+ export class WebhookError extends Data.TaggedError("WebhookError") {
5
+ }
6
+ export class WebhookDelivery extends Context.Service()("auth/WebhookDelivery") {
7
+ }
8
+ (function (WebhookDelivery) {
9
+ WebhookDelivery.make = (service) => WebhookDelivery.of(service);
10
+ })(WebhookDelivery || (WebhookDelivery = {}));
11
+ export const WebhookHeaders = {
12
+ id: "effect-auth-webhook-id",
13
+ timestamp: "effect-auth-webhook-timestamp",
14
+ signature: "effect-auth-webhook-signature",
15
+ eventType: "effect-auth-webhook-event",
16
+ };
17
+ const webhookError = (operation, message, cause) => new WebhookError({ operation, message, cause });
18
+ const signaturePayload = (input) => `${input.id}.${input.timestamp}.${input.body}`;
19
+ const decodeBase64Url = (value, operation) => Result.match(Encoding.decodeBase64Url(value), {
20
+ onSuccess: Effect.succeed,
21
+ onFailure: (cause) => Effect.fail(webhookError(operation, "Invalid webhook signature encoding", cause)),
22
+ });
23
+ const parseSignatureHeader = (value) => value.startsWith("v1=") && value.length > 3
24
+ ? Effect.succeed(value.slice(3))
25
+ : Effect.fail(webhookError("verify", "Invalid webhook signature header format"));
26
+ export const formatWebhookSignatureHeader = (signature) => `v1=${signature}`;
27
+ export const makeWebhookEvent = (input) => Effect.gen(function* () {
28
+ return {
29
+ ...input,
30
+ occurredAt: input.occurredAt ?? (yield* currentUnixMillis),
31
+ };
32
+ });
33
+ export const encodeWebhookEvent = (event) => Effect.try({
34
+ try: () => JSON.stringify(event),
35
+ catch: (cause) => webhookError("encode", "Failed to encode webhook event", cause),
36
+ });
37
+ export const signWebhookBody = (input) => Crypto.use((crypto) => crypto
38
+ .hmacSha256({
39
+ key: input.secret,
40
+ data: signaturePayload(input),
41
+ })
42
+ .pipe(Effect.mapError((cause) => webhookError("sign", "Failed to sign webhook body", cause))));
43
+ export const verifyWebhookSignature = (input) => Effect.gen(function* () {
44
+ const receivedSignature = yield* parseSignatureHeader(input.signatureHeader);
45
+ const expectedSignature = yield* signWebhookBody(input);
46
+ const received = yield* decodeBase64Url(receivedSignature, "verify");
47
+ const expected = yield* decodeBase64Url(expectedSignature, "verify");
48
+ return yield* Crypto.use((crypto) => crypto
49
+ .timingSafeEqual({ left: received, right: expected })
50
+ .pipe(Effect.mapError((cause) => webhookError("verify", "Failed to verify webhook signature", cause))));
51
+ });
52
+ export const makeWebhookRequest = (input) => Effect.gen(function* () {
53
+ const body = yield* encodeWebhookEvent(input.event);
54
+ const signature = yield* signWebhookBody({
55
+ id: input.event.id,
56
+ timestamp: input.event.occurredAt,
57
+ body,
58
+ secret: input.endpoint.secret,
59
+ });
60
+ return {
61
+ url: input.endpoint.url,
62
+ method: "POST",
63
+ body,
64
+ headers: {
65
+ "content-type": "application/json",
66
+ ...input.endpoint.headers,
67
+ [WebhookHeaders.id]: input.event.id,
68
+ [WebhookHeaders.timestamp]: String(input.event.occurredAt),
69
+ [WebhookHeaders.signature]: formatWebhookSignatureHeader(signature),
70
+ [WebhookHeaders.eventType]: input.event.type,
71
+ },
72
+ };
73
+ });
74
+ export const deliverWebhook = (request) => WebhookDelivery.use((delivery) => delivery.deliver(request));
75
+ export const dispatchWebhook = (input) => Effect.gen(function* () {
76
+ const request = yield* makeWebhookRequest(input);
77
+ return yield* deliverWebhook(request);
78
+ });
79
+ export const WebhookDeliveryNoopLive = Layer.succeed(WebhookDelivery)(WebhookDelivery.make({
80
+ deliver: () => Effect.void,
81
+ }));
82
+ //# sourceMappingURL=Webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Webhook.js","sourceRoot":"","sources":["../src/Webhook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { RuntimeContext } from "alchemy";
2
+ import * as Cloudflare from "alchemy/Cloudflare";
3
+ import { Effect, Layer } from "effect";
4
+ import { EmailSendError, Mailer, type EmailAddress, type EmailMessage, type MailerService } from "../../Mailer.js";
5
+ export interface AlchemyCloudflareSendEmailClient {
6
+ readonly send: (message: Cloudflare.SendEmailMessage) => Effect.Effect<unknown, unknown>;
7
+ }
8
+ export interface AlchemyCloudflareMailerOptions {
9
+ readonly email: AlchemyCloudflareSendEmailClient;
10
+ readonly from: EmailAddress;
11
+ readonly provider?: string;
12
+ }
13
+ export type AlchemyCloudflareSendEmailDescriptor<R = never> = Cloudflare.SendEmail | Effect.Effect<Cloudflare.SendEmail, never, R>;
14
+ export interface AlchemyCloudflareMailerLayerOptions<R = never> {
15
+ readonly sender: AlchemyCloudflareSendEmailDescriptor<R>;
16
+ readonly from: EmailAddress;
17
+ readonly provider?: string;
18
+ }
19
+ export declare const renderAlchemyCloudflareEmail: (options: Omit<AlchemyCloudflareMailerOptions, "email">, message: EmailMessage) => Effect.Effect<Cloudflare.SendEmailMessage, EmailSendError>;
20
+ export declare const makeAlchemyCloudflareMailer: (options: AlchemyCloudflareMailerOptions) => MailerService;
21
+ export declare const AlchemyCloudflareMailer: {
22
+ readonly make: (options: AlchemyCloudflareMailerOptions) => MailerService;
23
+ readonly layer: <R = never>(options: AlchemyCloudflareMailerLayerOptions<R>) => Layer.Layer<Mailer, never, RuntimeContext | Cloudflare.SendEmailBinding | R>;
24
+ };
25
+ //# sourceMappingURL=Email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Email.d.ts","sourceRoot":"","sources":["../../../src/alchemy/cloudflare/Email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,UAAU,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAGvC,OAAO,EACL,cAAc,EACd,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,IAAI,EAAE,CACb,OAAO,EAAE,UAAU,CAAC,gBAAgB,KACjC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,KAAK,EAAE,gCAAgC,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,oCAAoC,CAAC,CAAC,GAAG,KAAK,IACtD,UAAU,CAAC,SAAS,GACpB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAElD,MAAM,WAAW,mCAAmC,CAAC,CAAC,GAAG,KAAK;IAC5D,QAAQ,CAAC,MAAM,EAAE,oCAAoC,CAAC,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AA0HD,eAAO,MAAM,4BAA4B,GACvC,SAAS,IAAI,CAAC,8BAA8B,EAAE,OAAO,CAAC,EACtD,SAAS,YAAY,KACpB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,cAAc,CA0DxD,CAAC;AAEL,eAAO,MAAM,2BAA2B,GACtC,SAAS,8BAA8B,KACtC,aAiBC,CAAC;AAcL,eAAO,MAAM,uBAAuB;6BAhCzB,8BAA8B,KACtC,aAAa;qBAiCN,CAAC,mBACE,mCAAmC,CAAC,CAAC,CAAC,KAC9C,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,UAAU,CAAC,gBAAgB,GAAG,CAAC,CAAC;CAkBvE,CAAC"}
@@ -0,0 +1,117 @@
1
+ import { RuntimeContext } from "alchemy";
2
+ import * as Cloudflare from "alchemy/Cloudflare";
3
+ import { Effect, Layer } from "effect";
4
+ import { EmailSendError, Mailer, } from "../../Mailer.js";
5
+ const reservedHeaderNames = new Set([
6
+ "bcc",
7
+ "cc",
8
+ "content-transfer-encoding",
9
+ "content-type",
10
+ "from",
11
+ "mime-version",
12
+ "reply-to",
13
+ "subject",
14
+ "to",
15
+ ]);
16
+ const sendError = (message, cause, provider = "alchemy-cloudflare") => new EmailSendError({ provider, message, cause });
17
+ const addressEmail = (address) => typeof address === "string" ? address : address.email;
18
+ const addressList = (address) => {
19
+ if (address === undefined) {
20
+ return [];
21
+ }
22
+ return Array.isArray(address) ? address : [address];
23
+ };
24
+ const validateHeaderName = (name, provider) => {
25
+ if (!/^[A-Za-z0-9-]+$/.test(name)) {
26
+ return Effect.fail(sendError(`Invalid email header name: ${name}`, undefined, provider));
27
+ }
28
+ if (reservedHeaderNames.has(name.toLowerCase())) {
29
+ return Effect.fail(sendError(`Email header is managed by AlchemyCloudflareMailer: ${name}`, undefined, provider));
30
+ }
31
+ return Effect.succeed(name);
32
+ };
33
+ const validateHeaderValue = (value, provider) => value.includes("\r") || value.includes("\n")
34
+ ? Effect.fail(sendError("Email header values must not contain newlines", undefined, provider))
35
+ : Effect.succeed(value);
36
+ const alchemyAddress = (address, provider, options) => Effect.gen(function* () {
37
+ const email = yield* validateHeaderValue(addressEmail(address), provider);
38
+ if (typeof address === "string") {
39
+ return email;
40
+ }
41
+ if (address.name === undefined || address.name.length === 0) {
42
+ return email;
43
+ }
44
+ if (!options.allowName) {
45
+ return yield* Effect.fail(sendError(`Alchemy Cloudflare SendEmail does not support named ${options.field} addresses`, undefined, provider));
46
+ }
47
+ return {
48
+ name: yield* validateHeaderValue(address.name, provider),
49
+ email,
50
+ };
51
+ });
52
+ const alchemyRecipients = (addresses, field, provider) => Effect.forEach(addresses, (address) => alchemyAddress(address, provider, { allowName: false, field }).pipe(Effect.map((recipient) => recipient)));
53
+ const optionalRecipients = (addresses) => {
54
+ if (addresses.length === 0) {
55
+ return undefined;
56
+ }
57
+ return addresses.length === 1 ? addresses[0] : [...addresses];
58
+ };
59
+ export const renderAlchemyCloudflareEmail = (options, message) => Effect.gen(function* () {
60
+ const provider = options.provider ?? "alchemy-cloudflare";
61
+ if (message.text === undefined && message.html === undefined) {
62
+ return yield* Effect.fail(sendError("Email message must include text or html content", undefined, provider));
63
+ }
64
+ const to = yield* alchemyRecipients(addressList(message.to), "to", provider);
65
+ if (to.length === 0) {
66
+ return yield* Effect.fail(sendError("Email message must include at least one to recipient", undefined, provider));
67
+ }
68
+ const cc = yield* alchemyRecipients(addressList(message.cc), "cc", provider);
69
+ const bcc = yield* alchemyRecipients(addressList(message.bcc), "bcc", provider);
70
+ const headers = {};
71
+ for (const [name, value] of Object.entries(message.headers ?? {})) {
72
+ headers[yield* validateHeaderName(name, provider)] = yield* validateHeaderValue(value, provider);
73
+ }
74
+ return {
75
+ from: yield* alchemyAddress(message.from ?? options.from, provider, {
76
+ allowName: true,
77
+ field: "from",
78
+ }),
79
+ to: optionalRecipients(to) ?? [],
80
+ subject: yield* validateHeaderValue(message.subject, provider),
81
+ ...(message.replyTo === undefined
82
+ ? {}
83
+ : {
84
+ replyTo: yield* alchemyAddress(message.replyTo, provider, {
85
+ allowName: true,
86
+ field: "reply-to",
87
+ }),
88
+ }),
89
+ ...(cc.length === 0 ? {} : { cc: optionalRecipients(cc) }),
90
+ ...(bcc.length === 0 ? {} : { bcc: optionalRecipients(bcc) }),
91
+ ...(Object.keys(headers).length === 0 ? {} : { headers }),
92
+ ...(message.text === undefined ? {} : { text: message.text }),
93
+ ...(message.html === undefined ? {} : { html: message.html }),
94
+ };
95
+ });
96
+ export const makeAlchemyCloudflareMailer = (options) => Mailer.make({
97
+ send: Effect.fn("auth.alchemy_cloudflare_email.send")(function* (message) {
98
+ const rendered = yield* renderAlchemyCloudflareEmail(options, message);
99
+ yield* options.email.send(rendered).pipe(Effect.mapError((cause) => sendError("Alchemy Cloudflare failed to send email", cause, options.provider)));
100
+ }),
101
+ });
102
+ const bindSendEmail = (sender) => Cloudflare.SendEmail.bind(sender);
103
+ export const AlchemyCloudflareMailer = {
104
+ make: makeAlchemyCloudflareMailer,
105
+ layer: (options) => Layer.effect(Mailer)(Effect.gen(function* () {
106
+ const runtimeContext = yield* RuntimeContext;
107
+ const email = yield* bindSendEmail(options.sender);
108
+ return makeAlchemyCloudflareMailer({
109
+ email: {
110
+ send: (message) => email.send(message).pipe(Effect.provideService(RuntimeContext, runtimeContext)),
111
+ },
112
+ from: options.from,
113
+ provider: options.provider,
114
+ });
115
+ })),
116
+ };
117
+ //# sourceMappingURL=Email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Email.js","sourceRoot":"","sources":["../../../src/alchemy/cloudflare/Email.ts"],"names":[],"mappings":"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"}