domainkit 0.1.1 → 0.2.1
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.
- package/README.md +87 -83
- package/dist/{client-BnD7QLRF.mjs → auth-6-KRy1gN.mjs} +235 -131
- package/dist/auth-6-KRy1gN.mjs.map +1 -0
- package/dist/{auth-B0owkrpk.mjs → auth-B4jq3yk3.mjs} +212 -20
- package/dist/auth-B4jq3yk3.mjs.map +1 -0
- package/dist/authorization-CQSKKMrW.mjs +255 -0
- package/dist/authorization-CQSKKMrW.mjs.map +1 -0
- package/dist/canonical-json-CpvqGMcr.mjs +57 -0
- package/dist/canonical-json-CpvqGMcr.mjs.map +1 -0
- package/dist/{cloudflare-D0-J2MfP.mjs → cloudflare-Bg_p-M2c.mjs} +26 -3
- package/dist/cloudflare-Bg_p-M2c.mjs.map +1 -0
- package/dist/cloudflare-FDl5q7Dm.d.mts +32 -0
- package/dist/cloudflare.d.mts +3 -3
- package/dist/cloudflare.mjs +2 -2
- package/dist/connection-BXoSrhZs.mjs +58 -0
- package/dist/connection-BXoSrhZs.mjs.map +1 -0
- package/dist/connection-CEqadXSm.d.mts +182 -0
- package/dist/connection-X3rZhrBZ.mjs +186 -0
- package/dist/connection-X3rZhrBZ.mjs.map +1 -0
- package/dist/connection-api-DftK7eHo.d.mts +7 -0
- package/dist/{dns-record-C_KwGPLf.mjs → dns-record-BLeqo56C.mjs} +23 -3
- package/dist/dns-record-BLeqo56C.mjs.map +1 -0
- package/dist/effect-cloudflare.d.mts +2 -2
- package/dist/effect-cloudflare.mjs +2 -2
- package/dist/effect-vercel.d.mts +2 -2
- package/dist/effect-vercel.mjs +2 -2
- package/dist/effect.d.mts +9 -46
- package/dist/effect.mjs +29 -7
- package/dist/effect.mjs.map +1 -1
- package/dist/{index-D2howbNz.d.mts → index-B1opsgls.d.mts} +53 -6
- package/dist/{index-CEzk2gbZ.d.mts → index-Ewc__bQu.d.mts} +58 -7
- package/dist/index.d.mts +169 -113
- package/dist/index.mjs +201 -139
- package/dist/index.mjs.map +1 -1
- package/dist/{resolver-BHPsADzE.d.mts → resolver-BbVzTbCX.d.mts} +630 -273
- package/dist/resolver-CxE-VDw4.mjs +598 -0
- package/dist/resolver-CxE-VDw4.mjs.map +1 -0
- package/dist/testing.d.mts +53 -44
- package/dist/testing.mjs +379 -107
- package/dist/testing.mjs.map +1 -1
- package/dist/{vercel-DD89DCqH.mjs → vercel-BIFpZRPu.mjs} +23 -3
- package/dist/vercel-BIFpZRPu.mjs.map +1 -0
- package/dist/vercel-DgJaUX9D.d.mts +31 -0
- package/dist/vercel.d.mts +3 -3
- package/dist/vercel.mjs +2 -2
- package/dist/verify-7_EbKbFM.d.mts +805 -0
- package/dist/verify-Q5RYpnuw.mjs +642 -0
- package/dist/verify-Q5RYpnuw.mjs.map +1 -0
- package/dist/zone-discovery-BA5I24vu.d.mts +1390 -0
- package/dist/zones-DKHTpX9C.mjs +19 -0
- package/dist/zones-DKHTpX9C.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/auth-B0owkrpk.mjs.map +0 -1
- package/dist/client-BnD7QLRF.mjs.map +0 -1
- package/dist/cloudflare-CprjjXfm.d.mts +0 -23
- package/dist/cloudflare-D0-J2MfP.mjs.map +0 -1
- package/dist/dns-record-C_KwGPLf.mjs.map +0 -1
- package/dist/manifest-CP85ePFn.d.mts +0 -583
- package/dist/receipt-CGSnfZQ6.mjs +0 -28
- package/dist/receipt-CGSnfZQ6.mjs.map +0 -1
- package/dist/resolver-tEXpKxmH.mjs +0 -200
- package/dist/resolver-tEXpKxmH.mjs.map +0 -1
- package/dist/vercel-D-E2aqb1.d.mts +0 -22
- package/dist/vercel-DD89DCqH.mjs.map +0 -1
- package/dist/verify-B80xCBh2.d.mts +0 -1407
- package/dist/verify-BXOvXE20.mjs +0 -1388
- package/dist/verify-BXOvXE20.mjs.map +0 -1
|
@@ -1,18 +1,108 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
2
|
+
import { E as decode$2, c as Opaque, h as decode$3, y as Error } from "./dns-record-BLeqo56C.mjs";
|
|
3
|
+
import { f as Value, g as Method, h as Error$1, p as make$1, r as Evidence, u as codec } from "./authorization-CQSKKMrW.mjs";
|
|
4
|
+
import { t as candidates } from "./zones-DKHTpX9C.mjs";
|
|
5
|
+
import { Clock, Crypto, Effect, Schema } from "effect";
|
|
6
|
+
import * as oauth from "oauth4webapi";
|
|
7
|
+
//#region src/auth/authorization-code.ts
|
|
8
|
+
const start = Effect.fn("AuthorizationCode.start")(function* (input) {
|
|
9
|
+
const crypto = yield* Crypto.Crypto;
|
|
10
|
+
const codeVerifier = base64Url(yield* randomBytes(crypto, 32));
|
|
11
|
+
const challenge = base64Url(yield* digest(crypto, codeVerifier));
|
|
12
|
+
const authorizationUrl = new URL(input.method.authorizationServer.authorization_endpoint);
|
|
13
|
+
authorizationUrl.search = new URLSearchParams({
|
|
14
|
+
client_id: input.client.clientId,
|
|
15
|
+
code_challenge: challenge,
|
|
16
|
+
code_challenge_method: "S256",
|
|
17
|
+
redirect_uri: input.redirectUri,
|
|
18
|
+
response_type: "code",
|
|
19
|
+
scope: input.method.scopes.join(" "),
|
|
20
|
+
state: input.state
|
|
21
|
+
}).toString();
|
|
22
|
+
return {
|
|
23
|
+
authorizationUrl,
|
|
24
|
+
payload: make$1(JSON.stringify({
|
|
25
|
+
codeVerifier,
|
|
26
|
+
redirectUri: input.redirectUri,
|
|
27
|
+
state: input.state
|
|
28
|
+
}))
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
const complete = Effect.fn("AuthorizationCode.complete")(function* (input) {
|
|
32
|
+
const payload = yield* decodePayload(input.payload);
|
|
33
|
+
if (input.callbackUrl.searchParams.get("state") !== payload.state) return yield* failure$2("Authorization callback state does not match its continuation");
|
|
34
|
+
const server = input.method.authorizationServer;
|
|
35
|
+
const client = { client_id: input.client.clientId };
|
|
36
|
+
const authentication = yield* clientAuthentication(input.method, input.client);
|
|
37
|
+
return yield* Effect.tryPromise({
|
|
38
|
+
try: async (signal) => {
|
|
39
|
+
const callback = oauth.validateAuthResponse(server, client, input.callbackUrl, payload.state);
|
|
40
|
+
const response = await oauth.authorizationCodeGrantRequest(server, client, authentication, callback, payload.redirectUri, payload.codeVerifier, requestOptions(input.fetch, signal));
|
|
41
|
+
return oauth.processAuthorizationCodeResponse(server, client, response);
|
|
42
|
+
},
|
|
43
|
+
catch: (cause) => new Error$1({
|
|
44
|
+
category: "provider",
|
|
45
|
+
message: cause instanceof globalThis.Error ? cause.name : "OAuth provider request failed",
|
|
46
|
+
operation: "AuthorizationCode.complete",
|
|
47
|
+
retry: "unknown"
|
|
48
|
+
})
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
const PayloadSchema = Schema.Struct({
|
|
52
|
+
codeVerifier: Schema.String,
|
|
53
|
+
redirectUri: Schema.String,
|
|
54
|
+
state: Schema.String
|
|
55
|
+
});
|
|
56
|
+
function decodePayload(payload) {
|
|
57
|
+
return Schema.decodeUnknownEffect(Schema.fromJsonString(PayloadSchema))(payload.expose()).pipe(Effect.mapError(() => new Error$1({
|
|
58
|
+
category: "authorization",
|
|
59
|
+
message: "OAuth continuation payload is invalid",
|
|
60
|
+
operation: "AuthorizationCode",
|
|
61
|
+
retry: "after-user-action"
|
|
62
|
+
})));
|
|
63
|
+
}
|
|
64
|
+
function clientAuthentication(method, client) {
|
|
65
|
+
switch (method.clientAuth) {
|
|
66
|
+
case "none": return Effect.succeed(oauth.None());
|
|
67
|
+
case "client_secret_basic": return client.clientSecret === void 0 ? failure$2("OAuth client secret is required") : Effect.succeed(oauth.ClientSecretBasic(client.clientSecret.expose()));
|
|
68
|
+
case "client_secret_post": return client.clientSecret === void 0 ? failure$2("OAuth client secret is required") : Effect.succeed(oauth.ClientSecretPost(client.clientSecret.expose()));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function requestOptions(fetchImplementation, signal) {
|
|
72
|
+
return fetchImplementation === void 0 ? { signal } : {
|
|
73
|
+
signal,
|
|
74
|
+
[oauth.customFetch]: (url, options) => fetchImplementation(url, {
|
|
75
|
+
...options,
|
|
76
|
+
body: options.body
|
|
77
|
+
})
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const failure$2 = (message) => Effect.fail(new Error$1({
|
|
81
|
+
category: "authorization",
|
|
82
|
+
message,
|
|
83
|
+
operation: "AuthorizationCode",
|
|
84
|
+
retry: "after-user-action"
|
|
85
|
+
}));
|
|
86
|
+
function randomBytes(crypto, size) {
|
|
87
|
+
return crypto.randomBytes(size).pipe(Effect.mapError((cause) => new Error$1({
|
|
88
|
+
category: "validation",
|
|
89
|
+
message: cause.message,
|
|
90
|
+
operation: "AuthorizationCode.start",
|
|
91
|
+
retry: "safe"
|
|
92
|
+
})));
|
|
93
|
+
}
|
|
94
|
+
function digest(crypto, value) {
|
|
95
|
+
return crypto.digest("SHA-256", new TextEncoder().encode(value)).pipe(Effect.mapError((cause) => new Error$1({
|
|
96
|
+
category: "validation",
|
|
97
|
+
message: cause.message,
|
|
98
|
+
operation: "AuthorizationCode.start",
|
|
99
|
+
retry: "safe"
|
|
100
|
+
})));
|
|
101
|
+
}
|
|
102
|
+
function base64Url(bytes) {
|
|
103
|
+
let binary = "";
|
|
104
|
+
for (const byte of bytes) binary += String.fromCharCode(byte);
|
|
105
|
+
return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
|
|
16
106
|
}
|
|
17
107
|
//#endregion
|
|
18
108
|
//#region src/providers/cloudflare/protocol.ts
|
|
@@ -95,7 +185,7 @@ const TokenEnvelope = Schema.Struct({
|
|
|
95
185
|
});
|
|
96
186
|
//#endregion
|
|
97
187
|
//#region src/providers/cloudflare/records.ts
|
|
98
|
-
const Data = Schema.Struct({
|
|
188
|
+
const Data$1 = Schema.Struct({
|
|
99
189
|
flags: Schema.optionalKey(Schema.Number),
|
|
100
190
|
port: Schema.optionalKey(Schema.Number),
|
|
101
191
|
priority: Schema.optionalKey(Schema.Number),
|
|
@@ -216,9 +306,9 @@ function encode(record) {
|
|
|
216
306
|
};
|
|
217
307
|
}
|
|
218
308
|
}
|
|
219
|
-
const decodeData = Effect.fn("CloudflareRecords.decodeData")((record) => Schema.decodeUnknownEffect(Data)(record.data).pipe(Effect.mapError((cause) => failure$1("decodeRecord", cause.message))));
|
|
309
|
+
const decodeData = Effect.fn("CloudflareRecords.decodeData")((record) => Schema.decodeUnknownEffect(Data$1)(record.data).pipe(Effect.mapError((cause) => failure$1("decodeRecord", cause.message))));
|
|
220
310
|
function failure$1(operation, message, fields = {}) {
|
|
221
|
-
return new Error
|
|
311
|
+
return new Error({
|
|
222
312
|
message,
|
|
223
313
|
operation,
|
|
224
314
|
providerId: "cloudflare",
|
|
@@ -229,9 +319,20 @@ function failure$1(operation, message, fields = {}) {
|
|
|
229
319
|
//#region src/providers/cloudflare/client.ts
|
|
230
320
|
var client_exports = /* @__PURE__ */ __exportAll({
|
|
231
321
|
discoverAuthorizationAccount: () => discoverAuthorizationAccount,
|
|
322
|
+
discovery: () => discovery,
|
|
232
323
|
make: () => make,
|
|
233
324
|
validateDomainToken: () => validateDomainToken
|
|
234
325
|
});
|
|
326
|
+
/** Exposes Cloudflare zone lookup as the optional provider discovery capability. */
|
|
327
|
+
function discovery(client) {
|
|
328
|
+
return {
|
|
329
|
+
listZones: (name) => client.listZones({ name }).pipe(Effect.map((zones) => zones.map((zone) => ({
|
|
330
|
+
...zone,
|
|
331
|
+
status: zone.status === "active" || zone.status === "pending" ? zone.status : "unknown"
|
|
332
|
+
})))),
|
|
333
|
+
provider: client
|
|
334
|
+
};
|
|
335
|
+
}
|
|
235
336
|
const makeTransport = (options) => {
|
|
236
337
|
const fetch = options.fetch ?? globalThis.fetch;
|
|
237
338
|
const baseUrl = (options.baseUrl ?? "https://api.cloudflare.com/client/v4").replace(/\/$/, "");
|
|
@@ -451,7 +552,7 @@ function retryAfter(value) {
|
|
|
451
552
|
return Number.isNaN(date) ? void 0 : Math.max(0, date - Date.now());
|
|
452
553
|
}
|
|
453
554
|
function failure(operation, message, fields = {}) {
|
|
454
|
-
return new Error
|
|
555
|
+
return new Error({
|
|
455
556
|
...fields,
|
|
456
557
|
message,
|
|
457
558
|
operation,
|
|
@@ -461,9 +562,13 @@ function failure(operation, message, fields = {}) {
|
|
|
461
562
|
//#endregion
|
|
462
563
|
//#region src/providers/cloudflare/auth.ts
|
|
463
564
|
var auth_exports = /* @__PURE__ */ __exportAll({
|
|
565
|
+
contextCodec: () => contextCodec,
|
|
464
566
|
manifest: () => manifest,
|
|
567
|
+
oauthAuthentication: () => oauthAuthentication,
|
|
568
|
+
oauthFlow: () => oauthFlow,
|
|
465
569
|
oauthMethod: () => oauthMethod,
|
|
466
570
|
subjectResolver: () => subjectResolver,
|
|
571
|
+
tokenConnectionMethod: () => tokenConnectionMethod,
|
|
467
572
|
tokenMethod: () => tokenMethod,
|
|
468
573
|
tokenValidator: () => tokenValidator
|
|
469
574
|
});
|
|
@@ -473,6 +578,8 @@ const authorizationServer = {
|
|
|
473
578
|
revocation_endpoint: "https://dash.cloudflare.com/oauth2/revoke",
|
|
474
579
|
token_endpoint: "https://dash.cloudflare.com/oauth2/token"
|
|
475
580
|
};
|
|
581
|
+
const Context$1 = Schema.Struct({ tokenKind: Schema.Literals(["account", "user"]) });
|
|
582
|
+
const contextCodec = codec("cloudflare.v1", Context$1);
|
|
476
583
|
/** Describes Cloudflare's caller-created API-token authorization method. */
|
|
477
584
|
function tokenMethod(capabilities) {
|
|
478
585
|
return {
|
|
@@ -540,7 +647,92 @@ function tokenValidator(options) {
|
|
|
540
647
|
...options.tokenKind === void 0 ? {} : { tokenKind: options.tokenKind }
|
|
541
648
|
}).validateToken();
|
|
542
649
|
}
|
|
650
|
+
/** Creates a provider-independent token connection method backed by Cloudflare validation. */
|
|
651
|
+
function tokenConnectionMethod(options) {
|
|
652
|
+
const requiredCapabilities = [...options.capabilities];
|
|
653
|
+
return Method.Token({
|
|
654
|
+
authenticate: Effect.fn("CloudflareAuth.authenticateToken")(function* (token) {
|
|
655
|
+
const validated = yield* tokenValidator(options)(token);
|
|
656
|
+
const observedAt = new Date(yield* Clock.currentTimeMillis);
|
|
657
|
+
return {
|
|
658
|
+
capabilityEvidence: validated.capabilities.map((capability) => ({
|
|
659
|
+
capability,
|
|
660
|
+
evidence: Evidence.Introspected({ observedAt })
|
|
661
|
+
})),
|
|
662
|
+
credential: {
|
|
663
|
+
accessToken: token,
|
|
664
|
+
refreshToken: null,
|
|
665
|
+
tokenType: "bearer"
|
|
666
|
+
},
|
|
667
|
+
expiresAt: validated.expiresAt,
|
|
668
|
+
providerAccountId: validated.accountId,
|
|
669
|
+
providerContext: yield* contextCodec.encode({ tokenKind: options.tokenKind ?? "user" }),
|
|
670
|
+
scopes: [...validated.scopes]
|
|
671
|
+
};
|
|
672
|
+
}),
|
|
673
|
+
providerId: "cloudflare",
|
|
674
|
+
requiredCapabilities,
|
|
675
|
+
token: options.token
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
/** Converts a completed Cloudflare OAuth grant into the canonical connection authentication. */
|
|
679
|
+
const oauthAuthentication = Effect.fn("CloudflareAuth.oauthAuthentication")(function* (options) {
|
|
680
|
+
const resolved = yield* subjectResolver(options)(options.tokens, options.accessToken);
|
|
681
|
+
const observedAt = new Date(yield* Clock.currentTimeMillis);
|
|
682
|
+
return {
|
|
683
|
+
capabilityEvidence: options.capabilities.map((capability) => ({
|
|
684
|
+
capability,
|
|
685
|
+
evidence: Evidence.Introspected({ observedAt })
|
|
686
|
+
})),
|
|
687
|
+
credential: {
|
|
688
|
+
accessToken: options.accessToken,
|
|
689
|
+
refreshToken: options.tokens.refresh_token === void 0 ? null : Value.from(options.tokens.refresh_token),
|
|
690
|
+
tokenType: options.tokens.token_type
|
|
691
|
+
},
|
|
692
|
+
expiresAt: resolved.expiresAt,
|
|
693
|
+
providerAccountId: resolved.accountId,
|
|
694
|
+
providerContext: yield* contextCodec.encode({ tokenKind: "user" }),
|
|
695
|
+
scopes: (options.tokens.scope ?? "").split(" ").filter(Boolean)
|
|
696
|
+
};
|
|
697
|
+
});
|
|
698
|
+
/** Creates Cloudflare's OAuth implementation of the common interactive connection capability. */
|
|
699
|
+
function oauthFlow(options) {
|
|
700
|
+
const method = oauthMethod({
|
|
701
|
+
capabilities: options.capabilities,
|
|
702
|
+
clientAuth: options.clientAuth,
|
|
703
|
+
scopes: options.scopes
|
|
704
|
+
});
|
|
705
|
+
return {
|
|
706
|
+
complete: Effect.fn("CloudflareAuth.oauthFlow.complete")(function* (payload, callbackUrl) {
|
|
707
|
+
const tokens = yield* complete({
|
|
708
|
+
callbackUrl,
|
|
709
|
+
client: options.client,
|
|
710
|
+
...options.fetch === void 0 ? {} : { fetch: options.fetch },
|
|
711
|
+
method,
|
|
712
|
+
payload,
|
|
713
|
+
providerId: "cloudflare"
|
|
714
|
+
});
|
|
715
|
+
return yield* oauthAuthentication({
|
|
716
|
+
...options.accountId === void 0 ? { domain: options.domain } : { accountId: options.accountId },
|
|
717
|
+
...options.baseUrl === void 0 ? {} : { baseUrl: options.baseUrl },
|
|
718
|
+
capabilities: options.capabilities,
|
|
719
|
+
...options.fetch === void 0 ? {} : { fetch: options.fetch },
|
|
720
|
+
accessToken: make$1(tokens.access_token),
|
|
721
|
+
tokens
|
|
722
|
+
});
|
|
723
|
+
}),
|
|
724
|
+
method: "oauth2",
|
|
725
|
+
providerId: "cloudflare",
|
|
726
|
+
requiredCapabilities: [...options.capabilities],
|
|
727
|
+
start: (continuationId) => start({
|
|
728
|
+
client: options.client,
|
|
729
|
+
method,
|
|
730
|
+
redirectUri: options.redirectUri,
|
|
731
|
+
state: continuationId
|
|
732
|
+
})
|
|
733
|
+
};
|
|
734
|
+
}
|
|
543
735
|
//#endregion
|
|
544
|
-
export {
|
|
736
|
+
export { subjectResolver as a, tokenValidator as c, make as d, oauthMethod as i, client_exports as l, manifest as n, tokenConnectionMethod as o, oauthFlow as r, tokenMethod as s, auth_exports as t, discovery as u };
|
|
545
737
|
|
|
546
|
-
//# sourceMappingURL=auth-
|
|
738
|
+
//# sourceMappingURL=auth-B4jq3yk3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-B4jq3yk3.mjs","names":["Secret.make","failure","Connection.Error","S","Data","S","decode","DomainName.decode","failure","DnsRecord.decode","DnsRecord.Opaque","DnsProvider.Error","Protocol.ZoneListEnvelope","Protocol.TokenEnvelope","Zones.candidates","Protocol.RecordListEnvelope","Records.decode","Records.encode","Protocol.RecordEnvelope","DomainName.decode","S","Protocol.BaseEnvelope","DnsProvider.Error","Context","ProviderContext.codec","Client.discoverAuthorizationAccount","Client.make","Client.validateDomainToken","AuthorizationCode.complete","Secret.make","AuthorizationCode.start"],"sources":["../src/auth/authorization-code.ts","../src/providers/cloudflare/protocol.ts","../src/providers/cloudflare/records.ts","../src/providers/cloudflare/client.ts","../src/providers/cloudflare/auth.ts"],"sourcesContent":["import { Crypto, Effect, Schema } from \"effect\";\nimport * as oauth from \"oauth4webapi\";\n\nimport type * as ProviderAuth from \"./manifest.ts\";\nimport * as Connection from \"./connect.ts\";\nimport * as Secret from \"./secret.ts\";\n\nexport type Fetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\nexport interface Payload {\n readonly codeVerifier: string;\n readonly redirectUri: string;\n readonly state: string;\n}\n\nexport const start = Effect.fn(\"AuthorizationCode.start\")(function* (input: {\n readonly client: ProviderAuth.OAuthClientConfiguration;\n readonly method: ProviderAuth.OAuthMethod;\n readonly redirectUri: string;\n readonly state: string;\n}) {\n const crypto = yield* Crypto.Crypto;\n const codeVerifier = base64Url(yield* randomBytes(crypto, 32));\n const challenge = base64Url(yield* digest(crypto, codeVerifier));\n const authorizationUrl = new URL(input.method.authorizationServer.authorization_endpoint);\n authorizationUrl.search = new URLSearchParams({\n client_id: input.client.clientId,\n code_challenge: challenge,\n code_challenge_method: \"S256\",\n redirect_uri: input.redirectUri,\n response_type: \"code\",\n scope: input.method.scopes.join(\" \"),\n state: input.state,\n }).toString();\n return {\n authorizationUrl,\n payload: Secret.make(\n JSON.stringify({ codeVerifier, redirectUri: input.redirectUri, state: input.state }),\n ),\n };\n});\n\nexport const complete = Effect.fn(\"AuthorizationCode.complete\")(function* (input: {\n readonly callbackUrl: URL;\n readonly client: ProviderAuth.OAuthClientConfiguration;\n readonly fetch?: Fetch;\n readonly method: ProviderAuth.OAuthMethod;\n readonly payload: Secret.Value;\n readonly providerId: string;\n}) {\n const payload = yield* decodePayload(input.payload);\n if (input.callbackUrl.searchParams.get(\"state\") !== payload.state) {\n return yield* failure(\"Authorization callback state does not match its continuation\");\n }\n const server = input.method.authorizationServer as oauth.AuthorizationServer;\n const client: oauth.Client = { client_id: input.client.clientId };\n const authentication = yield* clientAuthentication(input.method, input.client);\n return yield* Effect.tryPromise({\n try: async (signal) => {\n const callback = oauth.validateAuthResponse(server, client, input.callbackUrl, payload.state);\n const response = await oauth.authorizationCodeGrantRequest(\n server,\n client,\n authentication,\n callback,\n payload.redirectUri,\n payload.codeVerifier,\n requestOptions(input.fetch, signal),\n );\n return oauth.processAuthorizationCodeResponse(server, client, response);\n },\n catch: (cause) =>\n new Connection.Error({\n category: \"provider\",\n message: cause instanceof globalThis.Error ? cause.name : \"OAuth provider request failed\",\n operation: \"AuthorizationCode.complete\",\n retry: \"unknown\",\n }),\n });\n});\n\nconst PayloadSchema = Schema.Struct({\n codeVerifier: Schema.String,\n redirectUri: Schema.String,\n state: Schema.String,\n});\n\nfunction decodePayload(payload: Secret.Value): Effect.Effect<Payload, Connection.Error> {\n return Schema.decodeUnknownEffect(Schema.fromJsonString(PayloadSchema))(payload.expose()).pipe(\n Effect.mapError(\n () =>\n new Connection.Error({\n category: \"authorization\",\n message: \"OAuth continuation payload is invalid\",\n operation: \"AuthorizationCode\",\n retry: \"after-user-action\",\n }),\n ),\n );\n}\n\nfunction clientAuthentication(\n method: ProviderAuth.OAuthMethod,\n client: ProviderAuth.OAuthClientConfiguration,\n): Effect.Effect<oauth.ClientAuth, Connection.Error> {\n switch (method.clientAuth) {\n case \"none\":\n return Effect.succeed(oauth.None());\n case \"client_secret_basic\":\n return client.clientSecret === undefined\n ? failure(\"OAuth client secret is required\")\n : Effect.succeed(oauth.ClientSecretBasic(client.clientSecret.expose()));\n case \"client_secret_post\":\n return client.clientSecret === undefined\n ? failure(\"OAuth client secret is required\")\n : Effect.succeed(oauth.ClientSecretPost(client.clientSecret.expose()));\n }\n}\n\nfunction requestOptions(\n fetchImplementation: Fetch | undefined,\n signal: AbortSignal,\n): oauth.TokenEndpointRequestOptions {\n return fetchImplementation === undefined\n ? { signal }\n : {\n signal,\n [oauth.customFetch]: (url, options) =>\n fetchImplementation(url, { ...options, body: options.body }),\n };\n}\n\nconst failure = (message: string): Effect.Effect<never, Connection.Error> =>\n Effect.fail(\n new Connection.Error({\n category: \"authorization\",\n message,\n operation: \"AuthorizationCode\",\n retry: \"after-user-action\",\n }),\n );\n\nfunction randomBytes(\n crypto: Crypto.Crypto,\n size: number,\n): Effect.Effect<Uint8Array, Connection.Error> {\n return crypto.randomBytes(size).pipe(\n Effect.mapError(\n (cause) =>\n new Connection.Error({\n category: \"validation\",\n message: cause.message,\n operation: \"AuthorizationCode.start\",\n retry: \"safe\",\n }),\n ),\n );\n}\n\nfunction digest(crypto: Crypto.Crypto, value: string): Effect.Effect<Uint8Array, Connection.Error> {\n return crypto.digest(\"SHA-256\", new TextEncoder().encode(value)).pipe(\n Effect.mapError(\n (cause) =>\n new Connection.Error({\n category: \"validation\",\n message: cause.message,\n operation: \"AuthorizationCode.start\",\n retry: \"safe\",\n }),\n ),\n );\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replaceAll(\"=\", \"\");\n}\n","import { Schema as S } from \"effect\";\n\nexport const ErrorDetail = S.Struct({\n code: S.Number,\n message: S.String,\n});\nexport interface ErrorDetail extends S.Schema.Type<typeof ErrorDetail> {}\n\nexport const ResultInfo = S.Struct({\n count: S.optionalKey(S.Number),\n page: S.optionalKey(S.Number),\n per_page: S.optionalKey(S.Number),\n total_count: S.optionalKey(S.Number),\n total_pages: S.optionalKey(S.Number),\n});\n\nconst Message = S.Struct({\n code: S.optionalKey(S.Number),\n message: S.String,\n});\n\nexport const BaseEnvelope = S.Struct({\n errors: S.Array(ErrorDetail),\n messages: S.Array(Message),\n success: S.Boolean,\n});\n\nexport const Account = S.Struct({\n id: S.String,\n name: S.String,\n});\nexport interface Account extends S.Schema.Type<typeof Account> {}\n\nexport const Zone = S.Struct({\n account: Account,\n id: S.String,\n name: S.String,\n name_servers: S.Array(S.String),\n status: S.optionalKey(S.String),\n});\nexport interface Zone extends S.Schema.Type<typeof Zone> {}\n\nexport const Record = S.Struct({\n content: S.optionalKey(S.String),\n data: S.optionalKey(S.Unknown),\n id: S.String,\n name: S.String,\n priority: S.optionalKey(S.Number),\n proxied: S.optionalKey(S.Boolean),\n ttl: S.Number,\n type: S.String,\n});\nexport interface Record extends S.Schema.Type<typeof Record> {}\n\nexport const Token = S.Struct({\n expires_on: S.optionalKey(S.String),\n id: S.String,\n not_before: S.optionalKey(S.String),\n status: S.Literals([\"active\", \"disabled\", \"expired\"]),\n});\nexport interface Token extends S.Schema.Type<typeof Token> {}\n\nexport const ZoneListEnvelope = S.Struct({\n errors: S.Array(ErrorDetail),\n messages: S.Array(Message),\n result: S.Array(Zone),\n result_info: S.optionalKey(ResultInfo),\n success: S.Boolean,\n});\nexport const RecordListEnvelope = S.Struct({\n errors: S.Array(ErrorDetail),\n messages: S.Array(Message),\n result: S.Array(Record),\n result_info: S.optionalKey(ResultInfo),\n success: S.Boolean,\n});\nexport const RecordEnvelope = S.Struct({\n errors: S.Array(ErrorDetail),\n messages: S.Array(Message),\n result: Record,\n success: S.Boolean,\n});\nexport const TokenEnvelope = S.Struct({\n errors: S.Array(ErrorDetail),\n messages: S.Array(Message),\n result: Token,\n success: S.Boolean,\n});\n","import { Effect, Schema as S } from \"effect\";\n\nimport * as DomainName from \"../../domain/domain-name.ts\";\nimport * as DnsRecord from \"../../domain/dns-record.ts\";\nimport * as DnsProvider from \"../../provider/provider.ts\";\nimport type * as Protocol from \"./protocol.ts\";\n\nconst Data = S.Struct({\n flags: S.optionalKey(S.Number),\n port: S.optionalKey(S.Number),\n priority: S.optionalKey(S.Number),\n tag: S.optionalKey(S.String),\n target: S.optionalKey(S.String),\n value: S.optionalKey(S.String),\n weight: S.optionalKey(S.Number),\n});\n\nexport type CreateBody = Readonly<Record<string, unknown>>;\n\nexport const decode = Effect.fn(\"CloudflareRecords.decode\")((record: Protocol.Record) =>\n Effect.gen(function* () {\n const name = yield* DomainName.decode(record.name).pipe(\n Effect.match({ onFailure: () => null, onSuccess: (value) => value }),\n );\n if (name === null) return yield* decodeOpaque(record);\n const common = {\n metadata: {\n ownership: \"provider\",\n provenance: record.proxied === true ? \"cloudflare:proxied\" : \"cloudflare\",\n purpose: \"existing DNS record\",\n },\n name,\n policy: record.type === \"CNAME\" ? \"exclusive\" : \"append\",\n ttl: record.ttl === 1 ? null : record.ttl,\n } as const;\n const content = () =>\n record.content === undefined\n ? Effect.fail(failure(\"decodeRecord\", `Cloudflare ${record.type} record has no content`))\n : Effect.succeed(record.content);\n\n switch (record.type) {\n case \"A\":\n case \"AAAA\":\n return yield* DnsRecord.decode({\n ...common,\n _tag: record.type,\n address: yield* content(),\n }).pipe(Effect.mapError((cause) => failure(\"decodeRecord\", cause.message)));\n case \"CNAME\":\n case \"NS\":\n return yield* DnsRecord.decode({\n ...common,\n _tag: record.type,\n target: yield* content(),\n }).pipe(Effect.mapError((cause) => failure(\"decodeRecord\", cause.message)));\n case \"TXT\":\n return yield* DnsRecord.decode({\n ...common,\n _tag: \"TXT\",\n value: yield* content(),\n }).pipe(Effect.mapError((cause) => failure(\"decodeRecord\", cause.message)));\n case \"MX\":\n return yield* DnsRecord.decode({\n ...common,\n _tag: \"MX\",\n exchange: yield* content(),\n priority: record.priority,\n }).pipe(Effect.mapError((cause) => failure(\"decodeRecord\", cause.message)));\n case \"CAA\": {\n const data = yield* decodeData(record);\n return yield* DnsRecord.decode({ ...common, _tag: \"CAA\", ...data }).pipe(\n Effect.mapError((cause) => failure(\"decodeRecord\", cause.message)),\n );\n }\n case \"SRV\": {\n const data = yield* decodeData(record);\n return yield* DnsRecord.decode({ ...common, _tag: \"SRV\", ...data }).pipe(\n Effect.mapError((cause) => failure(\"decodeRecord\", cause.message)),\n );\n }\n default:\n return yield* decodeOpaque(record);\n }\n }),\n);\n\nconst decodeOpaque = Effect.fn(\"CloudflareRecords.decodeOpaque\")((record: Protocol.Record) =>\n S.decodeUnknownEffect(DnsRecord.Opaque)({\n _tag: \"Opaque\",\n name: record.name,\n providerRecordId: record.id,\n providerType: record.type,\n }).pipe(Effect.mapError((cause) => failure(\"decodeRecord\", cause.message))),\n);\n\nexport function encode(record: DnsRecord.DnsRecord): CreateBody {\n const common = {\n name: record.name,\n proxied: false,\n ttl: record.ttl ?? 1,\n type: record._tag,\n };\n switch (record._tag) {\n case \"A\":\n case \"AAAA\":\n return { ...common, content: record.address };\n case \"CNAME\":\n case \"NS\":\n return { ...common, content: record.target };\n case \"TXT\":\n return { ...common, content: record.value };\n case \"MX\":\n return { ...common, content: record.exchange, priority: record.priority };\n case \"CAA\":\n return {\n ...common,\n data: { flags: record.flags, tag: record.tag, value: record.value },\n };\n case \"SRV\":\n return {\n ...common,\n data: {\n port: record.port,\n priority: record.priority,\n target: record.target,\n weight: record.weight,\n },\n };\n }\n}\n\nconst decodeData = Effect.fn(\"CloudflareRecords.decodeData\")((record: Protocol.Record) =>\n S.decodeUnknownEffect(Data)(record.data).pipe(\n Effect.mapError((cause) => failure(\"decodeRecord\", cause.message)),\n ),\n);\n\nfunction failure(\n operation: string,\n message: string,\n fields: Partial<Pick<DnsProvider.Error, \"reason\">> = {},\n): DnsProvider.Error {\n return new DnsProvider.Error({\n message,\n operation,\n providerId: \"cloudflare\",\n reason: fields.reason ?? \"response\",\n });\n}\n","import { Effect, Schema as S } from \"effect\";\n\nimport type * as ProviderAuth from \"../../auth/manifest.ts\";\nimport type * as Secret from \"../../auth/secret.ts\";\nimport * as DomainName from \"../../domain/domain-name.ts\";\nimport type * as DnsRecord from \"../../domain/dns-record.ts\";\nimport type * as ZoneDiscovery from \"../../discovery/zone-discovery.ts\";\nimport * as Zones from \"../../discovery/zones.ts\";\nimport * as DnsProvider from \"../../provider/provider.ts\";\nimport * as Protocol from \"./protocol.ts\";\nimport * as Records from \"./records.ts\";\n\nexport type Fetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\n/** Configuration for an Effect-native Cloudflare authoritative-DNS client. */\nexport interface Options {\n readonly accountId: string;\n readonly baseUrl?: string;\n /** Capabilities the host required when issuing or authorizing this credential. */\n readonly capabilities: ProviderAuth.TokenValidation[\"capabilities\"];\n readonly fetch?: Fetch;\n readonly token: Secret.Value;\n readonly tokenKind?: \"account\" | \"user\";\n}\n\nexport interface ListZonesInput {\n readonly accountId?: string;\n readonly name?: DomainName.DomainName;\n}\n\nexport type Account = Protocol.Account;\n\n/** A portable Cloudflare authoritative zone with normalized nameserver evidence. */\nexport interface Zone {\n readonly accountId: string;\n readonly id: string;\n readonly name: DomainName.DomainName;\n readonly nameservers: ReadonlyArray<DomainName.DomainName>;\n readonly status: string | null;\n}\n\nexport interface Interface extends DnsProvider.Interface {\n readonly listAccounts: () => Effect.Effect<ReadonlyArray<Account>, DnsProvider.Error>;\n readonly listZones: (\n input?: ListZonesInput,\n ) => Effect.Effect<ReadonlyArray<Zone>, DnsProvider.Error>;\n readonly validateToken: () => Effect.Effect<ProviderAuth.TokenValidation, DnsProvider.Error>;\n}\n\n/** Exposes Cloudflare zone lookup as the optional provider discovery capability. */\nexport function discovery(client: Interface): ZoneDiscovery.Source {\n return {\n listZones: (name) =>\n client.listZones({ name }).pipe(\n Effect.map((zones) =>\n zones.map((zone) => ({\n ...zone,\n status: zone.status === \"active\" || zone.status === \"pending\" ? zone.status : \"unknown\",\n })),\n ),\n ),\n provider: client,\n };\n}\n\ninterface CredentialOptions {\n readonly baseUrl?: string;\n readonly fetch?: Fetch;\n readonly token: Secret.Value;\n}\n\ninterface DomainCredentialOptions extends CredentialOptions {\n readonly capabilities: ProviderAuth.TokenValidation[\"capabilities\"];\n readonly domain: DomainName.DomainName;\n readonly tokenKind?: \"account\" | \"user\";\n}\n\nconst makeTransport = (options: CredentialOptions) => {\n const fetch = options.fetch ?? globalThis.fetch;\n const baseUrl = (options.baseUrl ?? \"https://api.cloudflare.com/client/v4\").replace(/\\/$/, \"\");\n\n const request = Effect.fn(\"CloudflareClient.request\")(\n (path: string, operation: string, init?: RequestInit) =>\n Effect.gen(function* () {\n const response = yield* Effect.tryPromise({\n try: () =>\n fetch(`${baseUrl}${path}`, {\n ...init,\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${options.token.expose()}`,\n ...(init?.body === undefined ? {} : { \"Content-Type\": \"application/json\" }),\n ...init?.headers,\n },\n }),\n catch: () =>\n failure(operation, \"Cloudflare request failed\", {\n reason: \"transport\",\n }),\n });\n const body = yield* Effect.tryPromise({\n try: () => response.json() as Promise<unknown>,\n catch: () => {\n const retryAfterMs = retryAfter(response.headers.get(\"retry-after\"));\n return failure(\n operation,\n response.ok\n ? \"Cloudflare returned a non-JSON response\"\n : `Cloudflare request failed with HTTP ${response.status}`,\n {\n reason: response.ok ? \"response\" : reason(response.status),\n ...(retryAfterMs === undefined ? {} : { retryAfterMs }),\n status: response.status,\n },\n );\n },\n });\n return { body, response } as const;\n }),\n );\n\n const listZonesPage = Effect.fn(\"CloudflareClient.listZonesPage\")(\n (accountId: string | undefined, name: DomainName.DomainName | undefined, page: number) =>\n Effect.gen(function* () {\n const query = new URLSearchParams({ page: String(page), per_page: \"50\" });\n query.set(\"type\", \"full,partial,secondary,internal\");\n if (accountId !== undefined) query.set(\"account.id\", accountId);\n if (name !== undefined) query.set(\"name\", name);\n const { body, response } = yield* request(`/zones?${query}`, \"listZones\");\n yield* ensureSuccess(body, \"listZones\", response);\n return yield* decode(Protocol.ZoneListEnvelope, body, \"listZones\", response);\n }),\n );\n\n const allZones = Effect.fn(\"CloudflareClient.allZones\")(\n (accountId?: string, name?: DomainName.DomainName) =>\n Effect.gen(function* () {\n const zones: Array<Protocol.Zone> = [];\n let page = 1;\n while (true) {\n const envelope = yield* listZonesPage(accountId, name, page);\n zones.push(...envelope.result);\n const totalPages = envelope.result_info?.total_pages;\n if (\n (totalPages !== undefined && page >= totalPages) ||\n (totalPages === undefined && envelope.result.length < 50)\n ) {\n return zones;\n }\n page += 1;\n }\n }),\n );\n\n const inspectToken = Effect.fn(\"CloudflareClient.inspectToken\")((path: string) =>\n Effect.gen(function* () {\n const { body, response } = yield* request(path, \"validateToken\");\n yield* ensureSuccess(body, \"validateToken\", response);\n const envelope = yield* decode(Protocol.TokenEnvelope, body, \"validateToken\", response);\n if (envelope.result.status !== \"active\") {\n return yield* Effect.fail(\n failure(\"validateToken\", `Cloudflare token is ${envelope.result.status}`, {\n reason: \"authentication\",\n status: response.status,\n }),\n );\n }\n const expiresAt =\n envelope.result.expires_on === undefined ? null : new Date(envelope.result.expires_on);\n if (expiresAt !== null && Number.isNaN(expiresAt.valueOf())) {\n return yield* Effect.fail(\n failure(\"validateToken\", \"Cloudflare token expiry is not a valid timestamp\", {\n reason: \"response\",\n status: response.status,\n }),\n );\n }\n return expiresAt;\n }),\n );\n\n return { allZones, inspectToken, request } as const;\n};\n\nconst discoverAccount = Effect.fn(\"CloudflareClient.discoverAccount\")(\n (options: CredentialOptions & { readonly domain: DomainName.DomainName }) =>\n Effect.gen(function* () {\n const { allZones } = makeTransport(options);\n for (const candidate of Zones.candidates(options.domain)) {\n const matches = yield* allZones(undefined, candidate);\n const match = matches[0];\n if (matches.length === 0) continue;\n if (matches.length === 1 && match !== undefined) return match.account;\n return yield* Effect.fail(\n failure(\n \"discoverAccount\",\n `Cloudflare returned multiple accessible zones named ${candidate}`,\n { reason: \"conflict\" },\n ),\n );\n }\n return yield* Effect.fail(\n failure(\n \"discoverAccount\",\n `Cloudflare did not expose an accessible zone for ${options.domain}`,\n { reason: \"not_found\" },\n ),\n );\n }),\n);\n\nexport const discoverAuthorizationAccount = discoverAccount;\n\nexport const validateDomainToken = Effect.fn(\"CloudflareClient.validateDomainToken\")(\n (options: DomainCredentialOptions) =>\n Effect.gen(function* () {\n const transport = makeTransport(options);\n const account = options.tokenKind === \"account\" ? yield* discoverAccount(options) : undefined;\n const expiresAt = yield* transport.inspectToken(\n account === undefined\n ? \"/user/tokens/verify\"\n : `/accounts/${encodeURIComponent(account.id)}/tokens/verify`,\n );\n const discoveredAccount = account ?? (yield* discoverAccount(options));\n return {\n accountId: discoveredAccount.id,\n capabilities: options.capabilities,\n expiresAt,\n scopes: [],\n } satisfies ProviderAuth.TokenValidation;\n }),\n);\n\n/** Creates an Effect-native Cloudflare client without owning the credential lifecycle. */\nexport function make(options: Options): Interface {\n const { allZones, inspectToken, request } = makeTransport(options);\n\n const resolveZone = Effect.fn(\"CloudflareClient.resolveZone\")((name: DomainName.DomainName) =>\n Effect.gen(function* () {\n const matches = yield* allZones(options.accountId, name);\n const match = matches[0];\n if (matches.length === 1 && match !== undefined) return match;\n return yield* Effect.fail(\n failure(\n \"resolveZone\",\n matches.length === 0\n ? `Cloudflare zone ${name} was not found in account ${options.accountId}`\n : `Cloudflare returned multiple zones named ${name} in account ${options.accountId}`,\n { reason: matches.length === 0 ? \"not_found\" : \"response\" },\n ),\n );\n }),\n );\n\n const listRecords = Effect.fn(\"CloudflareClient.listRecords\")((zoneName: DomainName.DomainName) =>\n Effect.gen(function* () {\n const zone = yield* resolveZone(zoneName);\n const records: Array<DnsRecord.Observed> = [];\n let page = 1;\n while (true) {\n const query = new URLSearchParams({ page: String(page), per_page: \"100\" });\n const { body, response } = yield* request(\n `/zones/${encodeURIComponent(zone.id)}/dns_records?${query}`,\n \"listRecords\",\n );\n yield* ensureSuccess(body, \"listRecords\", response);\n const envelope = yield* decode(Protocol.RecordListEnvelope, body, \"listRecords\", response);\n records.push(...(yield* Effect.forEach(envelope.result, Records.decode)));\n const totalPages = envelope.result_info?.total_pages;\n if (\n (totalPages !== undefined && page >= totalPages) ||\n (totalPages === undefined && envelope.result.length < 100)\n ) {\n return records;\n }\n page += 1;\n }\n }),\n );\n\n const createRecord = Effect.fn(\"CloudflareClient.createRecord\")(\n (zoneName: DomainName.DomainName, record: DnsRecord.DnsRecord) =>\n Effect.gen(function* () {\n const zone = yield* resolveZone(zoneName);\n const { body, response } = yield* request(\n `/zones/${encodeURIComponent(zone.id)}/dns_records`,\n \"createRecord\",\n { body: JSON.stringify(Records.encode(record)), method: \"POST\" },\n );\n yield* ensureSuccess(body, \"createRecord\", response);\n const envelope = yield* decode(Protocol.RecordEnvelope, body, \"createRecord\", response);\n return { providerRecordId: envelope.result.id };\n }),\n );\n\n const getRecord = Effect.fn(\"CloudflareClient.getRecord\")(\n (zoneName: DomainName.DomainName, providerRecordId: string) =>\n Effect.gen(function* () {\n const zone = yield* resolveZone(zoneName);\n const { body, response } = yield* request(\n `/zones/${encodeURIComponent(zone.id)}/dns_records/${encodeURIComponent(providerRecordId)}`,\n \"getRecord\",\n );\n if (response.status === 404) return null;\n yield* ensureSuccess(body, \"getRecord\", response);\n const envelope = yield* decode(Protocol.RecordEnvelope, body, \"getRecord\", response);\n return yield* Records.decode(envelope.result);\n }),\n );\n\n const deleteRecord = Effect.fn(\"CloudflareClient.deleteRecord\")(\n (zoneName: DomainName.DomainName, providerRecordId: string) =>\n Effect.gen(function* () {\n const zone = yield* resolveZone(zoneName);\n const { body, response } = yield* request(\n `/zones/${encodeURIComponent(zone.id)}/dns_records/${encodeURIComponent(providerRecordId)}`,\n \"deleteRecord\",\n { method: \"DELETE\" },\n );\n yield* ensureSuccess(body, \"deleteRecord\", response);\n }),\n );\n\n const listAccounts = Effect.fn(\"CloudflareClient.listAccounts\")(() =>\n allZones().pipe(\n Effect.map((zones) => {\n const accounts = new Map<string, Protocol.Account>();\n for (const zone of zones) accounts.set(zone.account.id, zone.account);\n return [...accounts.values()].sort((left, right) => left.name.localeCompare(right.name));\n }),\n ),\n );\n\n const listZones = Effect.fn(\"CloudflareClient.listZones\")((input: ListZonesInput = {}) =>\n allZones(input.accountId ?? options.accountId, input.name).pipe(\n Effect.flatMap((zones) => Effect.forEach(zones, projectZone)),\n ),\n );\n\n const validateToken = Effect.fn(\"CloudflareClient.validateToken\")(() =>\n Effect.gen(function* () {\n const path =\n options.tokenKind === \"account\"\n ? `/accounts/${encodeURIComponent(options.accountId)}/tokens/verify`\n : \"/user/tokens/verify\";\n const expiresAt = yield* inspectToken(path);\n yield* allZones(options.accountId);\n return {\n accountId: options.accountId,\n capabilities: options.capabilities,\n expiresAt,\n scopes: [],\n };\n }),\n );\n\n return {\n id: \"cloudflare\",\n createRecord,\n deleteRecord,\n getRecord,\n listAccounts,\n listRecords,\n listZones,\n validateToken,\n };\n}\n\nconst projectZone = Effect.fn(\"CloudflareClient.projectZone\")((zone: Protocol.Zone) =>\n Effect.gen(function* () {\n const name = yield* DomainName.decode(zone.name).pipe(\n Effect.mapError((cause) => failure(\"listZones\", cause.message, { reason: \"response\" })),\n );\n const nameservers = yield* Effect.forEach(zone.name_servers, (nameserver) =>\n DomainName.decode(nameserver).pipe(\n Effect.mapError((cause) => failure(\"listZones\", cause.message, { reason: \"response\" })),\n ),\n );\n return {\n accountId: zone.account.id,\n id: zone.id,\n name,\n nameservers,\n status: zone.status ?? null,\n };\n }),\n);\n\nfunction decode<A>(\n schema: S.ConstraintCodec<A, unknown, never, unknown>,\n input: unknown,\n operation: string,\n response: Response,\n): Effect.Effect<A, DnsProvider.Error> {\n return S.decodeUnknownEffect(schema)(input).pipe(\n Effect.mapError((cause) =>\n failure(operation, `Cloudflare response did not match its API contract: ${cause.message}`, {\n reason: \"response\",\n status: response.status,\n }),\n ),\n );\n}\n\nfunction ensureSuccess(\n input: unknown,\n operation: string,\n response: Response,\n): Effect.Effect<void, DnsProvider.Error> {\n return S.decodeUnknownEffect(Protocol.BaseEnvelope)(input).pipe(\n Effect.mapError(() =>\n failure(operation, \"Cloudflare response did not contain a valid API envelope\", {\n reason: \"response\",\n status: response.status,\n }),\n ),\n Effect.flatMap((envelope) => {\n if (response.ok && envelope.success) return Effect.void;\n const detail = envelope.errors[0];\n const retryAfterMs = retryAfter(response.headers.get(\"retry-after\"));\n return Effect.fail(\n failure(\n operation,\n detail?.message ?? `Cloudflare request failed with HTTP ${response.status}`,\n {\n ...(detail === undefined ? {} : { code: detail.code }),\n reason: reason(response.status, detail?.code),\n ...(retryAfterMs === undefined ? {} : { retryAfterMs }),\n status: response.status,\n },\n ),\n );\n }),\n );\n}\n\nfunction reason(status: number, code?: number): DnsProvider.ErrorReason {\n if (status === 401) return \"authentication\";\n if (status === 403) return \"authorization\";\n if (status === 404) return \"not_found\";\n if (status === 409 || code === 81056 || code === 81057 || code === 81058) return \"conflict\";\n if (status === 429) return \"rate_limit\";\n if (status >= 500) return \"response\";\n return \"request\";\n}\n\nfunction retryAfter(value: string | null): number | undefined {\n if (value === null) return undefined;\n const seconds = Number(value);\n if (Number.isFinite(seconds)) return Math.max(0, seconds * 1_000);\n const date = Date.parse(value);\n return Number.isNaN(date) ? undefined : Math.max(0, date - Date.now());\n}\n\nfunction failure(\n operation: string,\n message: string,\n fields: Partial<Pick<DnsProvider.Error, \"code\" | \"reason\" | \"retryAfterMs\" | \"status\">> = {},\n): DnsProvider.Error {\n return new DnsProvider.Error({\n ...fields,\n message,\n operation,\n providerId: \"cloudflare\",\n });\n}\n","import type * as oauth from \"oauth4webapi\";\nimport { Clock, Effect, Schema } from \"effect\";\n\nimport * as AuthorizationCode from \"../../auth/authorization-code.ts\";\nimport * as Connection from \"../../auth/connect.ts\";\nimport * as ProviderAuthorization from \"../../auth/authorization.ts\";\nimport type * as ProviderAuth from \"../../auth/manifest.ts\";\nimport * as ProviderContext from \"../../auth/provider-context.ts\";\nimport * as Secret from \"../../auth/secret.ts\";\nimport type * as DomainName from \"../../domain/domain-name.ts\";\nimport * as Client from \"./client.ts\";\n\nconst authorizationServer = {\n authorization_endpoint: \"https://dash.cloudflare.com/oauth2/auth\",\n issuer: \"https://dash.cloudflare.com\",\n revocation_endpoint: \"https://dash.cloudflare.com/oauth2/revoke\",\n token_endpoint: \"https://dash.cloudflare.com/oauth2/token\",\n} as const;\n\nconst Context = Schema.Struct({ tokenKind: Schema.Literals([\"account\", \"user\"]) });\nexport type Context = typeof Context.Type;\nexport const contextCodec = ProviderContext.codec(\"cloudflare.v1\", Context);\n\n/** Describes Cloudflare's caller-created API-token authorization method. */\nexport function tokenMethod(\n capabilities: ProviderAuth.TokenValidation[\"capabilities\"],\n): Extract<ProviderAuth.Manifest[\"methods\"][number], { readonly _tag: \"token\" }> {\n return {\n _tag: \"token\",\n capabilities: [...capabilities],\n instructionsUrl: \"https://developers.cloudflare.com/fundamentals/api/get-started/create-token/\",\n };\n}\n\nexport interface OAuthMethodOptions {\n /** Scope IDs assigned to the OAuth client by Cloudflare. */\n readonly scopes: ReadonlyArray<string>;\n /** Capabilities represented by those assigned scope IDs. */\n readonly capabilities: ProviderAuth.TokenValidation[\"capabilities\"];\n readonly clientAuth: ProviderAuth.OAuthMethod[\"clientAuth\"];\n}\n\n/** Describes a registered Cloudflare OAuth client and its assigned scope IDs. */\nexport function oauthMethod(options: OAuthMethodOptions): ProviderAuth.OAuthMethod {\n return {\n _tag: \"oauth2\",\n authorizationServer,\n capabilities: [...options.capabilities],\n clientAuth: options.clientAuth,\n scopes: [...options.scopes],\n };\n}\n\n/** Creates the Cloudflare token and OAuth authorization manifest. */\nexport function manifest(options: OAuthMethodOptions): ProviderAuth.Manifest {\n return {\n methods: [tokenMethod(options.capabilities), oauthMethod(options)],\n providerId: \"cloudflare\",\n };\n}\n\ntype CredentialOptions = Omit<Client.Options, \"accountId\" | \"token\" | \"tokenKind\">;\n\n/** Selects an explicit Cloudflare account or discovers it from an authorized domain. */\nexport type CredentialTarget =\n | {\n readonly accountId: string;\n readonly domain?: never;\n }\n | {\n readonly accountId?: never;\n readonly domain: DomainName.DomainName;\n };\n\nexport type SubjectResolverOptions = CredentialOptions & CredentialTarget;\n\n/** Configuration for validating a Cloudflare token against an account or authorized domain. */\nexport type TokenValidatorOptions = CredentialOptions &\n (\n | {\n readonly accountId: string;\n readonly domain?: never;\n readonly tokenKind?: \"account\" | \"user\";\n }\n | {\n readonly accountId?: never;\n readonly domain: DomainName.DomainName;\n readonly tokenKind?: \"account\" | \"user\";\n }\n );\n\n/** Resolves the Cloudflare account selected by a completed OAuth grant. */\nexport function subjectResolver(\n options: SubjectResolverOptions,\n): ProviderAuth.OAuthSubjectResolver {\n return (tokens: oauth.TokenEndpointResponse, accessToken: Secret.Value) =>\n Effect.gen(function* () {\n const accountId =\n options.accountId ??\n (yield* Client.discoverAuthorizationAccount({\n ...(options.baseUrl === undefined ? {} : { baseUrl: options.baseUrl }),\n domain: options.domain,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n token: accessToken,\n }).pipe(Effect.map((account) => account.id)));\n if (options.accountId !== undefined) {\n yield* Client.make({\n accountId: options.accountId,\n ...(options.baseUrl === undefined ? {} : { baseUrl: options.baseUrl }),\n capabilities: options.capabilities,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n token: accessToken,\n tokenKind: \"user\",\n }).listZones();\n }\n const now = yield* Clock.currentTimeMillis;\n return {\n accountId,\n expiresAt:\n typeof tokens.expires_in === \"number\" ? new Date(now + tokens.expires_in * 1_000) : null,\n };\n });\n}\n\n/** Creates a host callback that validates a Cloudflare API token. */\nexport function tokenValidator(\n options: TokenValidatorOptions,\n): (token: Secret.Value) => ReturnType<Client.Interface[\"validateToken\"]> {\n return (token) =>\n options.accountId === undefined\n ? Client.validateDomainToken({\n ...(options.baseUrl === undefined ? {} : { baseUrl: options.baseUrl }),\n capabilities: options.capabilities,\n domain: options.domain,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n token,\n ...(options.tokenKind === undefined ? {} : { tokenKind: options.tokenKind }),\n })\n : Client.make({\n accountId: options.accountId,\n ...(options.baseUrl === undefined ? {} : { baseUrl: options.baseUrl }),\n capabilities: options.capabilities,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n token,\n ...(options.tokenKind === undefined ? {} : { tokenKind: options.tokenKind }),\n }).validateToken();\n}\n\nexport type TokenConnectionOptions = TokenValidatorOptions & {\n readonly token: Secret.Value;\n};\n\n/** Creates a provider-independent token connection method backed by Cloudflare validation. */\nexport function tokenConnectionMethod(\n options: TokenConnectionOptions,\n): Extract<Connection.Method, { readonly _tag: \"Token\" }> {\n const requiredCapabilities = [...options.capabilities];\n return Connection.Method.Token({\n authenticate: Effect.fn(\"CloudflareAuth.authenticateToken\")(function* (token) {\n const validated = yield* tokenValidator(options)(token);\n const observedAt = new Date(yield* Clock.currentTimeMillis);\n return {\n capabilityEvidence: validated.capabilities.map((capability) => ({\n capability,\n evidence: ProviderAuthorization.Evidence.Introspected({ observedAt }),\n })),\n credential: { accessToken: token, refreshToken: null, tokenType: \"bearer\" },\n expiresAt: validated.expiresAt,\n providerAccountId: validated.accountId,\n providerContext: yield* contextCodec.encode({ tokenKind: options.tokenKind ?? \"user\" }),\n scopes: [...validated.scopes],\n } satisfies Connection.Authentication;\n }),\n providerId: \"cloudflare\",\n requiredCapabilities,\n token: options.token,\n });\n}\n\n/** Converts a completed Cloudflare OAuth grant into the canonical connection authentication. */\nexport const oauthAuthentication = Effect.fn(\"CloudflareAuth.oauthAuthentication\")(function* (\n options: SubjectResolverOptions & {\n readonly accessToken: Secret.Value;\n readonly tokens: oauth.TokenEndpointResponse;\n },\n) {\n const resolved = yield* subjectResolver(options)(options.tokens, options.accessToken);\n const observedAt = new Date(yield* Clock.currentTimeMillis);\n return {\n capabilityEvidence: options.capabilities.map((capability) => ({\n capability,\n evidence: ProviderAuthorization.Evidence.Introspected({ observedAt }),\n })),\n credential: {\n accessToken: options.accessToken,\n refreshToken:\n options.tokens.refresh_token === undefined\n ? null\n : Secret.Value.from(options.tokens.refresh_token),\n tokenType: options.tokens.token_type,\n },\n expiresAt: resolved.expiresAt,\n providerAccountId: resolved.accountId,\n providerContext: yield* contextCodec.encode({ tokenKind: \"user\" }),\n scopes: (options.tokens.scope ?? \"\").split(\" \").filter(Boolean),\n } satisfies Connection.Authentication;\n});\n\nexport type OAuthFlowOptions = SubjectResolverOptions & {\n readonly client: ProviderAuth.OAuthClientConfiguration;\n readonly clientAuth: ProviderAuth.OAuthMethod[\"clientAuth\"];\n readonly redirectUri: string;\n readonly scopes: ReadonlyArray<string>;\n};\n\n/** Creates Cloudflare's OAuth implementation of the common interactive connection capability. */\nexport function oauthFlow(options: OAuthFlowOptions): Connection.InteractiveFlow {\n const method = oauthMethod({\n capabilities: options.capabilities,\n clientAuth: options.clientAuth,\n scopes: options.scopes,\n });\n return {\n complete: Effect.fn(\"CloudflareAuth.oauthFlow.complete\")(function* (payload, callbackUrl) {\n const tokens = yield* AuthorizationCode.complete({\n callbackUrl,\n client: options.client,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n method,\n payload,\n providerId: \"cloudflare\",\n });\n return yield* oauthAuthentication({\n ...(options.accountId === undefined\n ? { domain: options.domain }\n : { accountId: options.accountId }),\n ...(options.baseUrl === undefined ? {} : { baseUrl: options.baseUrl }),\n capabilities: options.capabilities,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n accessToken: Secret.make(tokens.access_token),\n tokens,\n });\n }),\n method: \"oauth2\",\n providerId: \"cloudflare\",\n requiredCapabilities: [...options.capabilities],\n start: (continuationId) =>\n AuthorizationCode.start({\n client: options.client,\n method,\n redirectUri: options.redirectUri,\n state: continuationId,\n }),\n };\n}\n"],"mappings":"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"}
|