alchemy 0.46.0 → 0.46.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.
Files changed (40) hide show
  1. package/bin/alchemy.mjs +156 -160
  2. package/bin/commands/login.ts +2 -5
  3. package/lib/cloudflare/api.d.ts +9 -5
  4. package/lib/cloudflare/api.d.ts.map +1 -1
  5. package/lib/cloudflare/api.js +6 -46
  6. package/lib/cloudflare/api.js.map +1 -1
  7. package/lib/cloudflare/auth.d.ts +16 -35
  8. package/lib/cloudflare/auth.d.ts.map +1 -1
  9. package/lib/cloudflare/auth.js +54 -24
  10. package/lib/cloudflare/auth.js.map +1 -1
  11. package/lib/cloudflare/{auth-wrangler.d.ts → oauth.d.ts} +11 -14
  12. package/lib/cloudflare/oauth.d.ts.map +1 -0
  13. package/lib/cloudflare/{auth-wrangler.js → oauth.js} +98 -109
  14. package/lib/cloudflare/oauth.js.map +1 -0
  15. package/lib/cloudflare/user.d.ts +1 -1
  16. package/lib/cloudflare/user.d.ts.map +1 -1
  17. package/lib/cloudflare/user.js +20 -29
  18. package/lib/cloudflare/user.js.map +1 -1
  19. package/lib/cloudflare/worker.d.ts +1 -0
  20. package/lib/cloudflare/worker.d.ts.map +1 -1
  21. package/lib/cloudflare/worker.js +4 -3
  22. package/lib/cloudflare/worker.js.map +1 -1
  23. package/lib/util/memoize.d.ts +0 -1
  24. package/lib/util/memoize.d.ts.map +1 -1
  25. package/lib/util/memoize.js +0 -13
  26. package/lib/util/memoize.js.map +1 -1
  27. package/lib/util/neverthrow.d.ts +7 -0
  28. package/lib/util/neverthrow.d.ts.map +1 -1
  29. package/lib/util/neverthrow.js +17 -0
  30. package/lib/util/neverthrow.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/cloudflare/api.ts +18 -57
  33. package/src/cloudflare/auth.ts +84 -68
  34. package/src/cloudflare/{auth-wrangler.ts → oauth.ts} +154 -168
  35. package/src/cloudflare/user.ts +33 -51
  36. package/src/cloudflare/worker.ts +9 -4
  37. package/src/util/memoize.ts +0 -17
  38. package/src/util/neverthrow.ts +28 -0
  39. package/lib/cloudflare/auth-wrangler.d.ts.map +0 -1
  40. package/lib/cloudflare/auth-wrangler.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/cloudflare/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/cloudflare/api.ts"],"names":[],"mappings":"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"}
@@ -1,38 +1,19 @@
1
1
  import type { Secret } from "../secret.ts";
2
- /**
3
- * Authentication options for Cloudflare API
4
- */
5
- export type CloudflareAuthOptions = CloudflareApiKeyAuthOptions | CloudflareApiTokenAuthOptions;
6
- export type CloudflareApiKeyAuthOptions = {
7
- /**
8
- * API Key to use with API Key
9
- */
2
+ import type { CloudflareApiOptions } from "./api.ts";
3
+ export interface CloudflareApiTokenAuthOptions {
4
+ type: "api-token";
5
+ apiToken: Secret<string>;
6
+ }
7
+ export interface CloudflareApiKeyAuthOptions {
8
+ type: "api-key";
10
9
  apiKey: Secret;
11
- /**
12
- * Email to use with API Key
13
- * If not provided, will attempt to discover from Cloudflare API
14
- */
15
- email: string;
16
- /**
17
- * API Token to use with API Key
18
- */
19
- apiToken?: undefined;
20
- };
21
- export declare function isCloudflareApiKeyAuthOptions(options: CloudflareAuthOptions | undefined): options is CloudflareApiKeyAuthOptions;
22
- export type CloudflareApiTokenAuthOptions = {
23
- /**
24
- * API Token to use with API Key
25
- */
26
- apiToken?: Secret;
27
- /**
28
- * API Key to use with API Token
29
- */
30
- apiKey?: undefined;
31
- /**
32
- * Email to use with API Token
33
- */
34
- email?: undefined;
35
- };
36
- export declare function isCloudflareApiTokenAuthOptions(options: CloudflareAuthOptions | undefined): options is CloudflareApiTokenAuthOptions;
37
- export declare function getCloudflareAuthHeaders(options: CloudflareAuthOptions | undefined): Promise<Record<string, string>>;
10
+ apiEmail: string;
11
+ }
12
+ export interface CloudflareWranglerAuthOptions {
13
+ type: "wrangler";
14
+ }
15
+ export type CloudflareAuthOptions = CloudflareApiTokenAuthOptions | CloudflareApiKeyAuthOptions | CloudflareWranglerAuthOptions;
16
+ export declare const isCloudflareAuthOptions: (input?: CloudflareApiOptions | CloudflareAuthOptions) => input is CloudflareAuthOptions;
17
+ export declare function normalizeAuthOptions(input?: CloudflareApiOptions | CloudflareAuthOptions): Promise<CloudflareAuthOptions>;
18
+ export declare function getCloudflareAuthHeaders(authOptions: CloudflareAuthOptions): Promise<Record<string, string>>;
38
19
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloudflare/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,2BAA2B,GAC3B,6BAA6B,CAAC;AAElC,MAAM,MAAM,2BAA2B,GAAG;IACxC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,qBAAqB,GAAG,SAAS,GACzC,OAAO,IAAI,2BAA2B,CAExC;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,qBAAqB,GAAG,SAAS,GACzC,OAAO,IAAI,6BAA6B,CAE1C;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,qBAAqB,GAAG,SAAS,GACzC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2BjC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloudflare/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAIrD,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,MAAM,qBAAqB,GAC7B,6BAA6B,GAC7B,2BAA2B,GAC3B,6BAA6B,CAAC;AAElC,eAAO,MAAM,uBAAuB,GAClC,QAAQ,oBAAoB,GAAG,qBAAqB,KACnD,KAAK,IAAI,qBAQX,CAAC;AAEF,wBAAsB,oBAAoB,CACxC,KAAK,CAAC,EAAE,oBAAoB,GAAG,qBAAqB,GACnD,OAAO,CAAC,qBAAqB,CAAC,CA+BhC;AAED,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,qBAAqB,GACjC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAyBjC"}
@@ -1,34 +1,64 @@
1
- import { getRefreshedWranglerConfig } from "./auth-wrangler.js";
2
- export function isCloudflareApiKeyAuthOptions(options) {
3
- return options !== undefined && options.apiKey !== undefined;
4
- }
5
- export function isCloudflareApiTokenAuthOptions(options) {
6
- return options !== undefined && options.apiToken !== undefined;
7
- }
8
- export async function getCloudflareAuthHeaders(options) {
9
- if (isCloudflareApiKeyAuthOptions(options)) {
10
- // Global API Key
11
- return {
12
- "X-Auth-Key": options.apiKey.unencrypted,
13
- "X-Auth-Email": options.email,
14
- };
1
+ import { alchemy } from "../alchemy.js";
2
+ import { getRefreshedWranglerConfig } from "./oauth.js";
3
+ import { getUserEmailFromApiKey } from "./user.js";
4
+ export const isCloudflareAuthOptions = (input) => {
5
+ return (input !== undefined &&
6
+ "type" in input &&
7
+ (input.type === "api-token" ||
8
+ input.type === "api-key" ||
9
+ input.type === "wrangler"));
10
+ };
11
+ export async function normalizeAuthOptions(input) {
12
+ if (isCloudflareAuthOptions(input)) {
13
+ return input;
15
14
  }
16
- else if (isCloudflareApiTokenAuthOptions(options)) {
17
- // API Token
15
+ const email = async (apiKey) => input?.email ??
16
+ process.env.CLOUDFLARE_EMAIL ??
17
+ (await getUserEmailFromApiKey(apiKey.unencrypted));
18
+ if (input?.apiKey) {
18
19
  return {
19
- Authorization: `Bearer ${options.apiToken?.unencrypted}`,
20
+ type: "api-key",
21
+ apiKey: input.apiKey,
22
+ apiEmail: await email(input.apiKey),
20
23
  };
21
24
  }
22
- // Wrangler OAuth Token
23
- const wranglerConfig = await getRefreshedWranglerConfig();
24
- if (wranglerConfig.isOk() && wranglerConfig.value) {
25
+ if (input?.apiToken) {
26
+ return { type: "api-token", apiToken: input.apiToken };
27
+ }
28
+ if (process.env.CLOUDFLARE_API_KEY) {
29
+ const key = alchemy.secret(process.env.CLOUDFLARE_API_KEY);
30
+ return { type: "api-key", apiKey: key, apiEmail: await email(key) };
31
+ }
32
+ if (process.env.CLOUDFLARE_API_TOKEN) {
25
33
  return {
26
- Authorization: `Bearer ${wranglerConfig.value.oauth_token}`,
34
+ type: "api-token",
35
+ apiToken: alchemy.secret(process.env.CLOUDFLARE_API_TOKEN),
27
36
  };
28
37
  }
29
- else if (wranglerConfig.isErr()) {
30
- throw new Error(`Cloudflare authentication failed: ${wranglerConfig.error.message}`);
38
+ return { type: "wrangler" };
39
+ }
40
+ export async function getCloudflareAuthHeaders(authOptions) {
41
+ switch (authOptions.type) {
42
+ case "api-token":
43
+ return { Authorization: `Bearer ${authOptions.apiToken.unencrypted}` };
44
+ case "api-key":
45
+ return {
46
+ "X-Auth-Key": authOptions.apiKey.unencrypted,
47
+ "X-Auth-Email": authOptions.apiEmail,
48
+ };
49
+ case "wrangler": {
50
+ const wranglerConfig = await getRefreshedWranglerConfig();
51
+ if (wranglerConfig.isErr()) {
52
+ throw new Error([
53
+ wranglerConfig.error.message,
54
+ "Please run `alchemy login`, or set either CLOUDFLARE_API_TOKEN or CLOUDFLARE_API_KEY in your environment.",
55
+ "Learn more: https://alchemy.run/guides/cloudflare/",
56
+ ].join("\n"));
57
+ }
58
+ return {
59
+ Authorization: `Bearer ${wranglerConfig.value.oauth_token}`,
60
+ };
61
+ }
31
62
  }
32
- throw new Error("Cloudflare authentication required. Did you forget to login with `wrangler login` or set CLOUDFLARE_API_TOKEN, CLOUDFLARE_API_KEY?");
33
63
  }
34
64
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloudflare/auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAyBhE,MAAM,UAAU,6BAA6B,CAC3C,OAA0C;IAE1C,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC;AAC/D,CAAC;AAmBD,MAAM,UAAU,+BAA+B,CAC7C,OAA0C;IAE1C,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAA0C;IAE1C,IAAI,6BAA6B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,iBAAiB;QACjB,OAAO;YACL,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW;YACxC,cAAc,EAAE,OAAO,CAAC,KAAK;SAC9B,CAAC;IACJ,CAAC;SAAM,IAAI,+BAA+B,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,YAAY;QACZ,OAAO;YACL,aAAa,EAAE,UAAU,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE;SACzD,CAAC;IACJ,CAAC;IACD,uBAAuB;IACvB,MAAM,cAAc,GAAG,MAAM,0BAA0B,EAAE,CAAC;IAC1D,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,cAAc,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO;YACL,aAAa,EAAE,UAAU,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE;SAC5D,CAAC;IACJ,CAAC;SAAM,IAAI,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,qCAAqC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CACb,oIAAoI,CACrI,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloudflare/auth.ts"],"names":[],"mappings":"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"}
@@ -6,20 +6,17 @@ interface WranglerConfig {
6
6
  expiration_time: Date;
7
7
  scopes: string[];
8
8
  }
9
- export declare const getRefreshedWranglerConfig: () => ResultAsync<WranglerConfig | null, OAuthError>;
9
+ export declare const getRefreshedWranglerConfig: () => ResultAsync<WranglerConfig, OAuthError>;
10
+ export declare const wranglerLogin: (scopes?: string[], log?: (message: string) => void) => ResultAsync<WranglerConfig, OAuthError>;
11
+ interface OAuthErrorParams {
12
+ error: string;
13
+ error_description: string;
14
+ error_verbose?: string;
15
+ error_hint?: string;
16
+ status_code: number;
17
+ }
10
18
  declare class OAuthError extends Error {
11
- readonly error: string;
12
- readonly error_verbose?: string;
13
- readonly error_hint?: string;
14
- readonly status_code: number;
15
- constructor(params: {
16
- error: string;
17
- error_verbose?: string;
18
- error_description: string;
19
- error_hint?: string;
20
- status_code: number;
21
- });
19
+ constructor(params: OAuthErrorParams);
22
20
  }
23
- export declare const wranglerLogin: (scopes?: string[], log?: (message: string) => void) => ResultAsync<WranglerConfig, OAuthError>;
24
21
  export {};
25
- //# sourceMappingURL=auth-wrangler.d.ts.map
22
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/cloudflare/oauth.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAoB3D,eAAO,MAAM,cAAc,UAkB1B,CAAC;AAGF,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAID,eAAO,MAAM,0BAA0B,+CAkBtC,CAAC;AAwDF,eAAO,MAAM,aAAa,GACxB,SAAQ,MAAM,EAAmB,EACjC,MAAK,CAAC,OAAO,EAAE,MAAM,KAAK,IAAkB,4CAgF7C,CAAC;AA6BF,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,cAAM,UAAW,SAAQ,KAAK;gBAChB,MAAM,EAAE,gBAAgB;CAKrC"}
@@ -1,17 +1,17 @@
1
1
  import kleur from "kleur";
2
- import { err, ok, ResultAsync } from "neverthrow";
2
+ import { err, ok, okAsync, ResultAsync } from "neverthrow";
3
+ import assert from "node:assert";
3
4
  import crypto from "node:crypto";
4
5
  import fs from "node:fs/promises";
5
6
  import os from "node:os";
6
7
  import path from "node:path";
7
8
  import open from "open";
8
9
  import { HTTPServer } from "../util/http-server.js";
9
- import { memoize, memoizeSync } from "../util/memoize.js";
10
- import { detached, ensure, singleFlight } from "../util/neverthrow.js";
10
+ import { memoize } from "../util/memoize.js";
11
+ import { detached, ensure, fetchJSON, HTTPError, singleFlight, } from "../util/neverthrow.js";
11
12
  import { createXdgAppPaths } from "../util/xdg-paths.js";
12
13
  const CLIENT_ID = "54d11594-84e4-41aa-b438-e81b8fa78ee7";
13
14
  const REDIRECT_URI = "http://localhost:8976/oauth/callback";
14
- const ALCHEMY_BASE_URL = "https://alchemy.run";
15
15
  export const DEFAULT_SCOPES = [
16
16
  "account:read",
17
17
  "user:read",
@@ -31,6 +31,25 @@ export const DEFAULT_SCOPES = [
31
31
  "containers:write",
32
32
  "cloudchamber:write",
33
33
  ];
34
+ const ALCHEMY_BASE_URL = "https://alchemy.run";
35
+ let cached;
36
+ export const getRefreshedWranglerConfig = singleFlight(() => readWranglerConfig()
37
+ .andThen((config) => {
38
+ if (config.expiration_time.getTime() > Date.now() + 10 * 1000) {
39
+ return ok(config);
40
+ }
41
+ return fetchToken({
42
+ grant_type: "refresh_token",
43
+ refresh_token: config.refresh_token,
44
+ client_id: CLIENT_ID,
45
+ });
46
+ })
47
+ .orElse((error) => {
48
+ if (isInteractive()) {
49
+ return wranglerLogin();
50
+ }
51
+ return err(error);
52
+ }));
34
53
  const getWranglerConfigPath = memoize(async () => {
35
54
  const xdgConfigDir = createXdgAppPaths(".wrangler").config();
36
55
  const legacyConfigDir = path.join(os.homedir(), ".wrangler");
@@ -43,27 +62,27 @@ const getWranglerConfigPath = memoize(async () => {
43
62
  return path.join(configDir, "config", "default.toml");
44
63
  });
45
64
  const readWranglerConfig = () => {
46
- return ResultAsync.fromSafePromise(getWranglerConfigPath())
47
- .andThen((path) => ResultAsync.fromPromise(fs.readFile(path, "utf-8").then(async (text) => {
65
+ if (cached) {
66
+ return okAsync(cached);
67
+ }
68
+ return ResultAsync.fromPromise(getWranglerConfigPath().then(async (path) => {
69
+ const text = await fs.readFile(path, "utf-8");
48
70
  const toml = await import("@iarna/toml");
49
- return toml.parse(text.replace(/\r\n/g, "\n"));
50
- }), () => new Error("Failed to read Wrangler config.")))
51
- .andThen((config) => {
52
- if (typeof config.oauth_token !== "string" ||
53
- typeof config.refresh_token !== "string" ||
54
- !config.expiration_time ||
55
- !Array.isArray(config.scopes)) {
56
- return err(new Error("Invalid Wrangler config."));
57
- }
58
- return ok({
71
+ const config = toml.parse(text.replace(/\r\n/g, "\n"));
72
+ assert(typeof config.oauth_token === "string");
73
+ assert(typeof config.refresh_token === "string");
74
+ assert(config.expiration_time instanceof Date);
75
+ assert(Array.isArray(config.scopes));
76
+ return {
59
77
  oauth_token: config.oauth_token,
60
78
  refresh_token: config.refresh_token,
61
79
  expiration_time: new Date(config.expiration_time),
62
- scopes: Array.from(config.scopes),
63
- });
64
- });
80
+ scopes: config.scopes,
81
+ };
82
+ }), () => new Error("Cloudflare credentials are missing or invalid."));
65
83
  };
66
84
  const writeWranglerConfig = (config) => {
85
+ cached = config;
67
86
  return ResultAsync.fromSafePromise(getWranglerConfigPath()).map(async (configPath) => {
68
87
  const toml = await import("@iarna/toml");
69
88
  await fs.writeFile(configPath, toml.stringify({
@@ -74,89 +93,6 @@ const writeWranglerConfig = (config) => {
74
93
  }));
75
94
  });
76
95
  };
77
- const fetchToken = (body) => {
78
- return ResultAsync.fromPromise(fetch("https://dash.cloudflare.com/oauth2/token", {
79
- method: "POST",
80
- headers: {
81
- "Content-Type": "application/x-www-form-urlencoded",
82
- },
83
- body: new URLSearchParams(body),
84
- }), () => new OAuthError({
85
- error: "fetch_error",
86
- error_description: "Failed to fetch OAuth token.",
87
- status_code: 0,
88
- }))
89
- .andThen((res) => ResultAsync.fromPromise(res.json(), () => new OAuthError({
90
- error: "invalid_response",
91
- error_description: "The server returned an invalid response.",
92
- status_code: res.status,
93
- })).andThen((json) => res.ok ? ok(json) : err(new OAuthError(json))))
94
- .map((tokens) => ({
95
- oauth_token: tokens.access_token,
96
- refresh_token: tokens.refresh_token,
97
- expiration_time: new Date(Date.now() + tokens.expires_in * 1000),
98
- scopes: tokens.scope.split(" "),
99
- }))
100
- .andTee((config) => writeWranglerConfig(config));
101
- };
102
- export const getRefreshedWranglerConfig = singleFlight(memoizeSync(() => {
103
- return readWranglerConfig()
104
- .andThen((config) => {
105
- if (config.expiration_time.getTime() > Date.now() + 10 * 1000) {
106
- return ok(config);
107
- }
108
- return fetchToken({
109
- grant_type: "refresh_token",
110
- refresh_token: config.refresh_token,
111
- client_id: CLIENT_ID,
112
- });
113
- })
114
- .orElse((error) => {
115
- if (isInteractive()) {
116
- return wranglerLogin();
117
- }
118
- if (error instanceof OAuthError) {
119
- return err(error);
120
- }
121
- return ok(null);
122
- });
123
- }, () => Math.floor(Date.now() / 5000).toString()));
124
- const isInteractive = () => {
125
- return process.stdin.isTTY && process.stdout.isTTY && !process.env.CI;
126
- };
127
- const generateAuthorizationURL = (scopes) => {
128
- const state = crypto.randomBytes(32).toString("base64url");
129
- const verifier = crypto.randomBytes(96).toString("base64url");
130
- const challenge = crypto
131
- .createHash("sha256")
132
- .update(verifier)
133
- .digest("base64url");
134
- const url = new URL("https://dash.cloudflare.com/oauth2/auth");
135
- url.search = new URLSearchParams({
136
- response_type: "code",
137
- client_id: CLIENT_ID,
138
- redirect_uri: REDIRECT_URI,
139
- scope: [...scopes, "offline_access"].join(" "),
140
- state,
141
- code_challenge: challenge,
142
- code_challenge_method: "S256",
143
- }).toString();
144
- return { url: url.toString(), state, verifier };
145
- };
146
- class OAuthError extends Error {
147
- error;
148
- error_verbose;
149
- error_hint;
150
- status_code;
151
- constructor(params) {
152
- console.dir(params, { depth: null });
153
- super(params.error_description);
154
- this.error = params.error;
155
- this.error_verbose = params.error_verbose;
156
- this.error_hint = params.error_hint;
157
- this.status_code = params.status_code;
158
- }
159
- }
160
96
  export const wranglerLogin = (scopes = DEFAULT_SCOPES, log = console.log) => {
161
97
  const challenge = generateAuthorizationURL(scopes);
162
98
  log([
@@ -167,6 +103,9 @@ export const wranglerLogin = (scopes = DEFAULT_SCOPES, log = console.log) => {
167
103
  ].join("\n"));
168
104
  open(challenge.url);
169
105
  const { result, ok, err } = detached();
106
+ const renderResponse = async (type) => {
107
+ return Response.redirect(`${ALCHEMY_BASE_URL}/auth/${type}`);
108
+ };
170
109
  const server = new HTTPServer({
171
110
  port: 8976,
172
111
  fetch: async (request) => {
@@ -184,7 +123,7 @@ export const wranglerLogin = (scopes = DEFAULT_SCOPES, log = console.log) => {
184
123
  error_description: error_description ?? "Unknown error",
185
124
  status_code: 400,
186
125
  }));
187
- return Response.redirect(`${ALCHEMY_BASE_URL}/auth/error`);
126
+ return renderResponse("error");
188
127
  }
189
128
  if (!code || !state || state !== challenge.state) {
190
129
  err(new OAuthError({
@@ -192,7 +131,7 @@ export const wranglerLogin = (scopes = DEFAULT_SCOPES, log = console.log) => {
192
131
  error_description: "Invalid request",
193
132
  status_code: 400,
194
133
  }));
195
- return Response.redirect(`${ALCHEMY_BASE_URL}/auth/error`);
134
+ return renderResponse("error");
196
135
  }
197
136
  const tokens = await fetchToken({
198
137
  grant_type: "authorization_code",
@@ -203,10 +142,10 @@ export const wranglerLogin = (scopes = DEFAULT_SCOPES, log = console.log) => {
203
142
  });
204
143
  if (tokens.isErr()) {
205
144
  err(tokens.error);
206
- return Response.redirect(`${ALCHEMY_BASE_URL}/auth/error`);
145
+ return renderResponse("error");
207
146
  }
208
147
  ok(tokens.value);
209
- return Response.redirect(`${ALCHEMY_BASE_URL}/auth/success`);
148
+ return renderResponse("success");
210
149
  },
211
150
  });
212
151
  const timeout = setTimeout(() => {
@@ -216,9 +155,59 @@ export const wranglerLogin = (scopes = DEFAULT_SCOPES, log = console.log) => {
216
155
  status_code: 408,
217
156
  }));
218
157
  }, 1000 * 60 * 5);
219
- return ensure(result, async () => {
158
+ return ensure(result, () => {
220
159
  clearTimeout(timeout);
221
- await server.stop();
160
+ void server.stop();
222
161
  });
223
162
  };
224
- //# sourceMappingURL=auth-wrangler.js.map
163
+ const generateAuthorizationURL = (scopes) => {
164
+ const state = crypto.randomBytes(32).toString("base64url");
165
+ const verifier = crypto.randomBytes(96).toString("base64url");
166
+ const challenge = crypto
167
+ .createHash("sha256")
168
+ .update(verifier)
169
+ .digest("base64url");
170
+ const url = new URL("https://dash.cloudflare.com/oauth2/auth");
171
+ url.search = new URLSearchParams({
172
+ response_type: "code",
173
+ client_id: CLIENT_ID,
174
+ redirect_uri: "http://localhost:8976/oauth/callback",
175
+ scope: [...scopes, "offline_access"].join(" "),
176
+ state,
177
+ code_challenge: challenge,
178
+ code_challenge_method: "S256",
179
+ }).toString();
180
+ return { url: url.toString(), state, verifier };
181
+ };
182
+ class OAuthError extends Error {
183
+ constructor(params) {
184
+ super(`Cloudflare authentication failed with error ${params.error} (${params.status_code}): ${params.error_description}`);
185
+ }
186
+ }
187
+ const fetchToken = (body) => {
188
+ return fetchJSON("https://dash.cloudflare.com/oauth2/token", {
189
+ method: "POST",
190
+ headers: {
191
+ "Content-Type": "application/x-www-form-urlencoded",
192
+ },
193
+ body: new URLSearchParams(body),
194
+ })
195
+ .map((tokens) => ({
196
+ oauth_token: tokens.access_token,
197
+ refresh_token: tokens.refresh_token,
198
+ expiration_time: new Date(Date.now() + tokens.expires_in * 1000),
199
+ scopes: tokens.scope.split(" "),
200
+ }))
201
+ .mapErr((error) => error instanceof HTTPError
202
+ ? new OAuthError({
203
+ error: "http_error",
204
+ error_description: error.message,
205
+ status_code: error.status,
206
+ })
207
+ : new OAuthError(error))
208
+ .andTee((config) => writeWranglerConfig(config));
209
+ };
210
+ const isInteractive = () => {
211
+ return process.stdin.isTTY && process.stdout.isTTY && !process.env.CI;
212
+ };
213
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/cloudflare/oauth.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,6 @@ export interface CloudflareOrganization {
46
46
  permissions: string[];
47
47
  roles: string[];
48
48
  }
49
- export declare const getCloudflareAccounts: (options: CloudflareAuthOptions) => Promise<CloudflareAccount[]>;
49
+ export declare const getCloudflareAccountId: (options: CloudflareAuthOptions) => Promise<string>;
50
50
  export declare const getUserEmailFromApiKey: (apiKey: string) => Promise<string>;
51
51
  //# sourceMappingURL=user.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/cloudflare/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,cAAc,CAAC;IAClD,QAAQ,EAAE;QACR,iBAAiB,EAAE,OAAO,CAAC;QAC3B,kBAAkB,EAAE,IAAI,CAAC;QACzB,sBAAsB,EAAE,IAAI,CAAC;QAC7B,mBAAmB,EAAE,IAAI,CAAC;KAC3B,CAAC;IACF,YAAY,EAAE;QACZ,qBAAqB,EAAE;YACrB,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,EAAE,sBAAsB,EAAE,CAAC;IACxC,gBAAgB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iCAAiC,EAAE,OAAO,CAAC;IAC3C,gCAAgC,EAAE,OAAO,CAAC;IAC1C,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB,kEAkBjC,CAAC;AAEF,eAAO,MAAM,sBAAsB,qCA0ClC,CAAC"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/cloudflare/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,cAAc,CAAC;IAClD,QAAQ,EAAE;QACR,iBAAiB,EAAE,OAAO,CAAC;QAC3B,kBAAkB,EAAE,IAAI,CAAC;QACzB,sBAAsB,EAAE,IAAI,CAAC;QAC7B,mBAAmB,EAAE,IAAI,CAAC;KAC3B,CAAC;IACF,YAAY,EAAE;QACZ,qBAAqB,EAAE;YACrB,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,EAAE,sBAAsB,EAAE,CAAC;IACxC,gBAAgB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,iCAAiC,EAAE,OAAO,CAAC;IAC3C,gCAAgC,EAAE,OAAO,CAAC;IAC1C,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,sBAAsB,qDAyBlC,CAAC;AAEF,eAAO,MAAM,sBAAsB,qCAiBlC,CAAC"}
@@ -1,40 +1,31 @@
1
1
  import { logger } from "../util/logger.js";
2
2
  import { memoize } from "../util/memoize.js";
3
- import { CloudflareApiError } from "./api-error.js";
3
+ import { extractCloudflareResult } from "./api-response.js";
4
4
  import { getCloudflareAuthHeaders, } from "./auth.js";
5
- export const getCloudflareAccounts = memoize(async (options) => {
5
+ export const getCloudflareAccountId = memoize(async (options) => {
6
6
  const headers = await getCloudflareAuthHeaders(options);
7
- const accounts = await fetch("https://api.cloudflare.com/client/v4/accounts", {
7
+ const accounts = await extractCloudflareResult("get accounts for authorized user", fetch("https://api.cloudflare.com/client/v4/accounts", {
8
8
  headers,
9
- });
10
- if (accounts.ok) {
11
- return (await accounts.json()).result;
9
+ }));
10
+ if (!accounts[0]) {
11
+ throw new Error("No accounts found for authorized user. Please make sure you're authenticated (see: https://alchemy.run/guides/cloudflare/) or explicitly set the Cloudflare Account ID (see: https://alchemy.run/guides/cloudflare/#account-id)");
12
12
  }
13
- else {
14
- throw new CloudflareApiError(`Failed to get accounts for authorized user, please make sure you're authenticated (see: https://alchemy.run/guides/cloudflare/) or explicitly set the Cloudflare Account ID (see: https://alchemy.run/guides/cloudflare/#account-id)`, accounts);
13
+ if (accounts.length > 1) {
14
+ logger.warnOnce([
15
+ "Multiple Cloudflare accounts found for authorized user:",
16
+ accounts.map((a, i) => `${i + 1}: ${a.name} (${a.id})`).join("\n"),
17
+ "The first account will be used by default. To use a different account, explicitly set the Cloudflare Account ID (see: https://alchemy.run/guides/cloudflare/#account-id)",
18
+ ].join("\n"));
15
19
  }
20
+ return accounts[0].id;
16
21
  });
17
22
  export const getUserEmailFromApiKey = memoize(async (apiKey) => {
18
- try {
19
- // Call the /user endpoint to get user information
20
- const response = await fetch("https://api.cloudflare.com/client/v4/user", {
21
- headers: {
22
- "Content-Type": "application/json",
23
- "X-Auth-Key": apiKey,
24
- },
25
- });
26
- if (!response.ok) {
27
- throw new Error(`Failed to get user information: ${response.status} ${response.statusText}`);
28
- }
29
- const data = (await response.json());
30
- if (!data.success || !data.result || !data.result.email) {
31
- throw new Error("Cloudflare API did not return valid user information");
32
- }
33
- return data.result.email;
34
- }
35
- catch (error) {
36
- logger.error("Error retrieving email from Cloudflare API:", error);
37
- throw new Error("Failed to automatically discover email for API Key authentication");
38
- }
23
+ const result = await extractCloudflareResult("automatically discover email for API Key authentication", fetch("https://api.cloudflare.com/client/v4/user", {
24
+ headers: {
25
+ "Content-Type": "application/json",
26
+ "X-Auth-Key": apiKey,
27
+ },
28
+ }));
29
+ return result.email;
39
30
  });
40
31
  //# sourceMappingURL=user.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/cloudflare/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EACL,wBAAwB,GAEzB,MAAM,WAAW,CAAC;AAmDnB,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAC1C,KAAK,EAAE,OAA8B,EAAgC,EAAE;IACrE,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,+CAA+C,EAC/C;QACE,OAAO;KACR,CACF,CAAC;IACF,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChB,OAAQ,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAS,CAAC,MAAM,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,kBAAkB,CAC1B,sOAAsO,EACtO,QAAQ,CACT,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAC3C,KAAK,EAAE,MAAc,EAAmB,EAAE;IACxC,IAAI,CAAC;QACH,kDAAkD;QAClD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,2CAA2C,EAC3C;YACE,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,MAAM;aACrB;SACF,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,mCAAmC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC5E,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAQlC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;QACnE,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC"}
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/cloudflare/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,wBAAwB,GAEzB,MAAM,WAAW,CAAC;AAmDnB,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAC3C,KAAK,EAAE,OAA8B,EAAmB,EAAE;IACxD,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAC5C,kCAAkC,EAClC,KAAK,CAAC,+CAA+C,EAAE;QACrD,OAAO;KACR,CAAC,CACH,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,iOAAiO,CAClO,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,QAAQ,CACb;YACE,yDAAyD;YACzD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAClE,0KAA0K;SAC3K,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxB,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAC3C,KAAK,EAAE,MAAc,EAAmB,EAAE;IACxC,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAK1C,yDAAyD,EACzD,KAAK,CAAC,2CAA2C,EAAE;QACjD,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,MAAM;SACrB;KACF,CAAC,CACH,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC,CACF,CAAC"}
@@ -12,6 +12,7 @@ import type { DispatchNamespaceResource } from "./dispatch-namespace.ts";
12
12
  import { type EventSource, type QueueEventSource } from "./event-source.ts";
13
13
  import { type QueueResource } from "./queue.ts";
14
14
  import { Route } from "./route.ts";
15
+ import "../esbuild/bundle.ts";
15
16
  /**
16
17
  * Configuration options for static assets
17
18
  */