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.
- package/bin/alchemy.mjs +156 -160
- package/bin/commands/login.ts +2 -5
- package/lib/cloudflare/api.d.ts +9 -5
- package/lib/cloudflare/api.d.ts.map +1 -1
- package/lib/cloudflare/api.js +6 -46
- package/lib/cloudflare/api.js.map +1 -1
- package/lib/cloudflare/auth.d.ts +16 -35
- package/lib/cloudflare/auth.d.ts.map +1 -1
- package/lib/cloudflare/auth.js +54 -24
- package/lib/cloudflare/auth.js.map +1 -1
- package/lib/cloudflare/{auth-wrangler.d.ts → oauth.d.ts} +11 -14
- package/lib/cloudflare/oauth.d.ts.map +1 -0
- package/lib/cloudflare/{auth-wrangler.js → oauth.js} +98 -109
- package/lib/cloudflare/oauth.js.map +1 -0
- package/lib/cloudflare/user.d.ts +1 -1
- package/lib/cloudflare/user.d.ts.map +1 -1
- package/lib/cloudflare/user.js +20 -29
- package/lib/cloudflare/user.js.map +1 -1
- package/lib/cloudflare/worker.d.ts +1 -0
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +4 -3
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/util/memoize.d.ts +0 -1
- package/lib/util/memoize.d.ts.map +1 -1
- package/lib/util/memoize.js +0 -13
- package/lib/util/memoize.js.map +1 -1
- package/lib/util/neverthrow.d.ts +7 -0
- package/lib/util/neverthrow.d.ts.map +1 -1
- package/lib/util/neverthrow.js +17 -0
- package/lib/util/neverthrow.js.map +1 -1
- package/package.json +1 -1
- package/src/cloudflare/api.ts +18 -57
- package/src/cloudflare/auth.ts +84 -68
- package/src/cloudflare/{auth-wrangler.ts → oauth.ts} +154 -168
- package/src/cloudflare/user.ts +33 -51
- package/src/cloudflare/worker.ts +9 -4
- package/src/util/memoize.ts +0 -17
- package/src/util/neverthrow.ts +28 -0
- package/lib/cloudflare/auth-wrangler.d.ts.map +0 -1
- 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":"
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/cloudflare/api.ts"],"names":[],"mappings":"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"}
|
package/lib/cloudflare/auth.d.ts
CHANGED
|
@@ -1,38 +1,19 @@
|
|
|
1
1
|
import type { Secret } from "../secret.ts";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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":"
|
|
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"}
|
package/lib/cloudflare/auth.js
CHANGED
|
@@ -1,34 +1,64 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
-
|
|
20
|
+
type: "api-key",
|
|
21
|
+
apiKey: input.apiKey,
|
|
22
|
+
apiEmail: await email(input.apiKey),
|
|
20
23
|
};
|
|
21
24
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
34
|
+
type: "api-token",
|
|
35
|
+
apiToken: alchemy.secret(process.env.CLOUDFLARE_API_TOKEN),
|
|
27
36
|
};
|
|
28
37
|
}
|
|
29
|
-
|
|
30
|
-
|
|
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":"
|
|
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
|
|
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
|
-
|
|
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=
|
|
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
|
|
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
|
-
|
|
47
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
145
|
+
return renderResponse("error");
|
|
207
146
|
}
|
|
208
147
|
ok(tokens.value);
|
|
209
|
-
return
|
|
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,
|
|
158
|
+
return ensure(result, () => {
|
|
220
159
|
clearTimeout(timeout);
|
|
221
|
-
|
|
160
|
+
void server.stop();
|
|
222
161
|
});
|
|
223
162
|
};
|
|
224
|
-
|
|
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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"}
|
package/lib/cloudflare/user.d.ts
CHANGED
|
@@ -46,6 +46,6 @@ export interface CloudflareOrganization {
|
|
|
46
46
|
permissions: string[];
|
|
47
47
|
roles: string[];
|
|
48
48
|
}
|
|
49
|
-
export declare const
|
|
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,
|
|
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"}
|
package/lib/cloudflare/user.js
CHANGED
|
@@ -1,40 +1,31 @@
|
|
|
1
1
|
import { logger } from "../util/logger.js";
|
|
2
2
|
import { memoize } from "../util/memoize.js";
|
|
3
|
-
import {
|
|
3
|
+
import { extractCloudflareResult } from "./api-response.js";
|
|
4
4
|
import { getCloudflareAuthHeaders, } from "./auth.js";
|
|
5
|
-
export const
|
|
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
|
|
11
|
-
|
|
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
|
-
|
|
14
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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,
|
|
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
|
*/
|