@pithy-sh/cloudflare 0.4.2 → 0.6.0
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 +3 -3
- package/dist/ai/aiManager.d.ts +15 -1
- package/dist/ai/aiManager.d.ts.map +1 -1
- package/dist/ai/aiManager.js +39 -6
- package/dist/analytics/analyticsManager.d.ts +78 -0
- package/dist/analytics/analyticsManager.d.ts.map +1 -0
- package/dist/analytics/analyticsManager.js +206 -0
- package/dist/analytics/datasets.d.ts +26 -0
- package/dist/analytics/datasets.d.ts.map +1 -0
- package/dist/analytics/datasets.js +26 -0
- package/dist/analytics/window.d.ts +50 -0
- package/dist/analytics/window.d.ts.map +1 -0
- package/dist/analytics/window.js +67 -0
- package/dist/artifacts/artifactsManager.d.ts +52 -0
- package/dist/artifacts/artifactsManager.d.ts.map +1 -0
- package/dist/artifacts/artifactsManager.js +150 -0
- package/dist/client/clients.d.ts +13 -1
- package/dist/client/clients.d.ts.map +1 -1
- package/dist/client/clients.js +22 -1
- package/dist/client/manager.d.ts +13 -2
- package/dist/client/manager.d.ts.map +1 -1
- package/dist/client/manager.js +18 -5
- package/dist/d1/d1Manager.d.ts.map +1 -1
- package/dist/d1/d1Manager.js +3 -3
- package/dist/d1/d1PreparedStatement.d.ts +12 -0
- package/dist/d1/d1PreparedStatement.d.ts.map +1 -1
- package/dist/d1/d1PreparedStatement.js +13 -3
- package/dist/media/imageManager.d.ts +25 -0
- package/dist/media/imageManager.d.ts.map +1 -1
- package/dist/media/imageManager.js +58 -2
- package/dist/media/streamManager.d.ts +15 -0
- package/dist/media/streamManager.d.ts.map +1 -1
- package/dist/media/streamManager.js +28 -1
- package/dist/oauth/callback.d.ts +32 -0
- package/dist/oauth/callback.d.ts.map +1 -0
- package/dist/oauth/callback.js +58 -0
- package/dist/oauth/catalog.d.ts +26 -0
- package/dist/oauth/catalog.d.ts.map +1 -0
- package/dist/oauth/catalog.js +30 -0
- package/dist/oauth/client.d.ts +126 -0
- package/dist/oauth/client.d.ts.map +1 -0
- package/dist/oauth/client.js +200 -0
- package/dist/oauth/scopes.d.ts +62 -0
- package/dist/oauth/scopes.d.ts.map +1 -0
- package/dist/oauth/scopes.js +79 -0
- package/dist/queue/queueProvisioner.d.ts +30 -0
- package/dist/queue/queueProvisioner.d.ts.map +1 -0
- package/dist/queue/queueProvisioner.js +72 -0
- package/dist/r2/r2Manager.d.ts +11 -1
- package/dist/r2/r2Manager.d.ts.map +1 -1
- package/dist/r2/r2Manager.js +18 -1
- package/dist/secrets/secretsStoreManager.d.ts.map +1 -1
- package/dist/secrets/secretsStoreManager.js +3 -2
- package/dist/test-utils/settle.d.ts +79 -0
- package/dist/test-utils/settle.d.ts.map +1 -0
- package/dist/test-utils/settle.js +105 -0
- package/dist/tokens/accountTokensManager.d.ts +8 -7
- package/dist/tokens/accountTokensManager.d.ts.map +1 -1
- package/dist/tokens/accountTokensManager.js +2 -1
- package/dist/tokens/permissions.d.ts +49 -0
- package/dist/tokens/permissions.d.ts.map +1 -1
- package/dist/tokens/permissions.js +56 -2
- package/dist/tokens/profiles.d.ts +10 -30
- package/dist/tokens/profiles.d.ts.map +1 -1
- package/dist/tokens/profiles.js +48 -36
- package/dist/tokens/runtime.d.ts +16 -0
- package/dist/tokens/runtime.d.ts.map +1 -0
- package/dist/tokens/runtime.js +18 -0
- package/dist/workers/buildsManager.js +1 -1
- package/dist/workflows/stepFailure.js +1 -1
- package/dist/workflows/workflowsClient.js +1 -1
- package/package.json +3 -3
- package/src/ai/aiManager.ts +44 -5
- package/src/analytics/analyticsManager.ts +311 -0
- package/src/analytics/datasets.ts +30 -0
- package/src/analytics/window.ts +101 -0
- package/src/artifacts/artifactsManager.ts +199 -0
- package/src/client/clients.ts +28 -1
- package/src/client/manager.ts +24 -6
- package/src/d1/d1Manager.ts +7 -3
- package/src/d1/d1PreparedStatement.ts +21 -2
- package/src/media/imageManager.ts +93 -1
- package/src/media/streamManager.ts +34 -0
- package/src/oauth/callback.ts +70 -0
- package/src/oauth/catalog.ts +39 -0
- package/src/oauth/client.ts +265 -0
- package/src/oauth/scopes.ts +91 -0
- package/src/queue/queueProvisioner.ts +79 -0
- package/src/r2/r2Manager.ts +29 -2
- package/src/secrets/secretsStoreManager.ts +2 -1
- package/src/test-utils/settle.ts +139 -0
- package/src/tokens/accountTokensManager.ts +12 -0
- package/src/tokens/permissions.ts +81 -0
- package/src/tokens/profiles.ts +58 -70
- package/src/tokens/runtime.ts +18 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 Pithy
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
import { CloudflareManager } from "../client/manager";
|
|
4
|
+
/**
|
|
5
|
+
* Account-level Artifacts control plane: **list and delete the repos in a namespace, then the namespace** (#673).
|
|
6
|
+
*
|
|
7
|
+
* Inside a Worker a repo is reached through the `artifacts` binding. This is the other side of that: `pithy feature
|
|
8
|
+
* destroy` reaps every repo in a feature's namespace, because repos cost storage and nothing else ever deletes one.
|
|
9
|
+
* There is no create here, because Cloudflare creates a namespace the first time a repo is created in it and the kit
|
|
10
|
+
* creates repos only from the Worker. There is a namespace delete, because nothing else removes one.
|
|
11
|
+
*
|
|
12
|
+
* The SDK this package targets exposes no Artifacts resource, so this uses the documented escape hatch — the raw
|
|
13
|
+
* token and `fetch` — against the paths [the REST API](https://developers.cloudflare.com/artifacts/api/rest-api/)
|
|
14
|
+
* publishes, and validates what comes back.
|
|
15
|
+
*/
|
|
16
|
+
export declare class CloudflareArtifactsManager extends CloudflareManager {
|
|
17
|
+
getServiceType(): string;
|
|
18
|
+
/** Prove access by listing namespaces — a read, never a write. Never throws. */
|
|
19
|
+
validateServiceAccess(): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Every repo name in a namespace, across every page. **A namespace that does not exist has none**: Cloudflare
|
|
22
|
+
* makes one on its first repo, so a feature that never created a repo has no namespace, and teardown of it is a
|
|
23
|
+
* clean no-op rather than a failure.
|
|
24
|
+
*/
|
|
25
|
+
listRepos(namespace: string): Promise<string[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Delete one repo and every token on it. **Resolves whether one was there**, so teardown re-runs safely: a repo
|
|
28
|
+
* already gone is `false`, not an error. Cloudflare answers `202 Accepted`, so the storage may take a moment to
|
|
29
|
+
* be released after this returns.
|
|
30
|
+
*/
|
|
31
|
+
deleteRepo(namespace: string, name: string): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Delete a namespace, once it is empty. Cloudflare makes one on the first repo and nothing else ever deletes it,
|
|
34
|
+
* so a feature's would outlive the feature. `DELETE /accounts/{id}/artifacts/namespaces/{namespace}` is in
|
|
35
|
+
* Cloudflare's published API schema, not on the Artifacts REST page: it deletes an empty namespace, answers `204`,
|
|
36
|
+
* and answers `409` while a repo remains.
|
|
37
|
+
*
|
|
38
|
+
* **Three answers, none of them a failure of teardown.** `deleted` it was there; `absent` it is already gone or was
|
|
39
|
+
* never created, so a re-run is a clean no-op; `occupied` a repo is still in it — a repo delete is `202 Accepted`,
|
|
40
|
+
* so one just reaped can hold the namespace a moment longer, and the caller decides how long to wait.
|
|
41
|
+
*/
|
|
42
|
+
deleteNamespace(namespace: string): Promise<"deleted" | "absent" | "occupied">;
|
|
43
|
+
private namespacePath;
|
|
44
|
+
private send;
|
|
45
|
+
/**
|
|
46
|
+
* One REST call, its envelope unwrapped. `null` for a 404 — the namespace or the repo is not there, which every
|
|
47
|
+
* caller here reads as nothing to do. {@link OCCUPIED} for a 409 when the caller asks for it — a namespace that
|
|
48
|
+
* still holds a repo. Any other failure is Cloudflare's refusal, in Cloudflare's words.
|
|
49
|
+
*/
|
|
50
|
+
private call;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=artifactsManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifactsManager.d.ts","sourceRoot":"","sources":["../../src/artifacts/artifactsManager.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAoCtD;;;;;;;;;;;GAWG;AACH,qBAAa,0BAA2B,SAAQ,iBAAiB;IAC/D,cAAc,IAAI,MAAM,CAEvB;IAED,gFAAgF;IAC1E,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO9C;IAED;;;;OAIG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBpD;IAED;;;;OAIG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlE;IAED;;;;;;;;;OASG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC,CAOnF;IAED,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,IAAI;IAIZ;;;;OAIG;YACW,IAAI;CAwCnB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 Pithy
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
import { CloudflareInvalidResponseError, cloudflareApiErrors, cloudflareRefusal, cloudflareRequest, decodeResponse, messageOf } from "../client/errors.js";
|
|
4
|
+
import { CloudflareManager } from "../client/manager.js";
|
|
5
|
+
import { ValidationError } from "@pithy-sh/core/src/error/pithyError";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
//#region src/artifacts/artifactsManager.ts
|
|
8
|
+
/** The Cloudflare REST API v4 base URL. Artifacts lives under `/accounts/{id}/artifacts`. */
|
|
9
|
+
const CF_API_BASE = "https://api.cloudflare.com/client/v4";
|
|
10
|
+
/** The most repos one page of `GET …/repos` returns. Cloudflare's own maximum. */
|
|
11
|
+
const PAGE_LIMIT = 200;
|
|
12
|
+
/**
|
|
13
|
+
* A namespace or repo name, as Cloudflare's limits page states it: a letter or digit, then letters, digits, `.`,
|
|
14
|
+
* `_` and `-`. Asserted before either reaches a path, because a `/` or a `..` there addresses another endpoint.
|
|
15
|
+
*/
|
|
16
|
+
const ARTIFACTS_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
17
|
+
/** What {@link CloudflareArtifactsManager.deleteNamespace} is told by a `409`: a repo is still in the namespace. */
|
|
18
|
+
const OCCUPIED = Symbol("occupied");
|
|
19
|
+
/** The standard `{ result, success, errors, result_info }` envelope, as far as this reads it. */
|
|
20
|
+
const Envelope = z.object({
|
|
21
|
+
result: z.unknown().describe("The payload."),
|
|
22
|
+
success: z.boolean().optional().describe("Whether Cloudflare reports the call succeeded."),
|
|
23
|
+
errors: z.array(z.unknown()).optional().describe("Cloudflare's own error entries."),
|
|
24
|
+
result_info: z.object({ cursor: z.string().nullable().optional().describe("The next page's cursor, when there is one.") }).loose().optional().describe("Pagination, for a listing.")
|
|
25
|
+
}).describe("A Cloudflare REST envelope.");
|
|
26
|
+
/** One page of `GET …/repos`: only the name of each repo is read. */
|
|
27
|
+
const RepoPage = z.array(z.object({ name: z.string().describe("The repo's name in the namespace.") }).loose()).describe("One page of an Artifacts namespace's repos.");
|
|
28
|
+
/**
|
|
29
|
+
* Account-level Artifacts control plane: **list and delete the repos in a namespace, then the namespace** (#673).
|
|
30
|
+
*
|
|
31
|
+
* Inside a Worker a repo is reached through the `artifacts` binding. This is the other side of that: `pithy feature
|
|
32
|
+
* destroy` reaps every repo in a feature's namespace, because repos cost storage and nothing else ever deletes one.
|
|
33
|
+
* There is no create here, because Cloudflare creates a namespace the first time a repo is created in it and the kit
|
|
34
|
+
* creates repos only from the Worker. There is a namespace delete, because nothing else removes one.
|
|
35
|
+
*
|
|
36
|
+
* The SDK this package targets exposes no Artifacts resource, so this uses the documented escape hatch — the raw
|
|
37
|
+
* token and `fetch` — against the paths [the REST API](https://developers.cloudflare.com/artifacts/api/rest-api/)
|
|
38
|
+
* publishes, and validates what comes back.
|
|
39
|
+
*/
|
|
40
|
+
var CloudflareArtifactsManager = class extends CloudflareManager {
|
|
41
|
+
getServiceType() {
|
|
42
|
+
return "Cloudflare Artifacts (control plane)";
|
|
43
|
+
}
|
|
44
|
+
/** Prove access by listing namespaces — a read, never a write. Never throws. */
|
|
45
|
+
async validateServiceAccess() {
|
|
46
|
+
try {
|
|
47
|
+
return (await this.send("GET", `/accounts/${this.getAccountId()}/artifacts/namespaces?limit=1`)).ok;
|
|
48
|
+
} catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Every repo name in a namespace, across every page. **A namespace that does not exist has none**: Cloudflare
|
|
54
|
+
* makes one on its first repo, so a feature that never created a repo has no namespace, and teardown of it is a
|
|
55
|
+
* clean no-op rather than a failure.
|
|
56
|
+
*/
|
|
57
|
+
async listRepos(namespace) {
|
|
58
|
+
assertName(namespace, "namespace");
|
|
59
|
+
return cloudflareRequest(`list Artifacts repos in ${namespace}`, async () => {
|
|
60
|
+
const names = /* @__PURE__ */ new Set();
|
|
61
|
+
const followed = /* @__PURE__ */ new Set();
|
|
62
|
+
let cursor;
|
|
63
|
+
for (;;) {
|
|
64
|
+
const query = `limit=${PAGE_LIMIT}${cursor ? `&cursor=${encodeURIComponent(cursor)}` : ""}`;
|
|
65
|
+
const page = await this.call("GET", `${this.namespacePath(namespace)}/repos?${query}`);
|
|
66
|
+
if (page === null) return [...names];
|
|
67
|
+
for (const repo of decodeResponse(RepoPage, page.result, "Artifacts repo list")) names.add(repo.name);
|
|
68
|
+
const next = page.result_info?.cursor ?? void 0;
|
|
69
|
+
if (!next || followed.has(next)) return [...names];
|
|
70
|
+
followed.add(next);
|
|
71
|
+
cursor = next;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Delete one repo and every token on it. **Resolves whether one was there**, so teardown re-runs safely: a repo
|
|
77
|
+
* already gone is `false`, not an error. Cloudflare answers `202 Accepted`, so the storage may take a moment to
|
|
78
|
+
* be released after this returns.
|
|
79
|
+
*/
|
|
80
|
+
async deleteRepo(namespace, name) {
|
|
81
|
+
assertName(namespace, "namespace");
|
|
82
|
+
assertName(name, "repo");
|
|
83
|
+
return cloudflareRequest(`delete Artifacts repo ${namespace}/${name}`, async () => {
|
|
84
|
+
return await this.call("DELETE", `${this.namespacePath(namespace)}/repos/${name}`) !== null;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Delete a namespace, once it is empty. Cloudflare makes one on the first repo and nothing else ever deletes it,
|
|
89
|
+
* so a feature's would outlive the feature. `DELETE /accounts/{id}/artifacts/namespaces/{namespace}` is in
|
|
90
|
+
* Cloudflare's published API schema, not on the Artifacts REST page: it deletes an empty namespace, answers `204`,
|
|
91
|
+
* and answers `409` while a repo remains.
|
|
92
|
+
*
|
|
93
|
+
* **Three answers, none of them a failure of teardown.** `deleted` it was there; `absent` it is already gone or was
|
|
94
|
+
* never created, so a re-run is a clean no-op; `occupied` a repo is still in it — a repo delete is `202 Accepted`,
|
|
95
|
+
* so one just reaped can hold the namespace a moment longer, and the caller decides how long to wait.
|
|
96
|
+
*/
|
|
97
|
+
async deleteNamespace(namespace) {
|
|
98
|
+
assertName(namespace, "namespace");
|
|
99
|
+
return cloudflareRequest(`delete Artifacts namespace ${namespace}`, async () => {
|
|
100
|
+
const result = await this.call("DELETE", this.namespacePath(namespace), { occupied: true });
|
|
101
|
+
if (result === OCCUPIED) return "occupied";
|
|
102
|
+
return result === null ? "absent" : "deleted";
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
namespacePath(namespace) {
|
|
106
|
+
return `/accounts/${this.getAccountId()}/artifacts/namespaces/${namespace}`;
|
|
107
|
+
}
|
|
108
|
+
send(method, path) {
|
|
109
|
+
return fetch(`${CF_API_BASE}${path}`, {
|
|
110
|
+
method,
|
|
111
|
+
headers: { authorization: `Bearer ${this.getApiToken()}` }
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async call(method, path, options = {}) {
|
|
115
|
+
const response = await this.send(method, path);
|
|
116
|
+
if (response.status === 404) return null;
|
|
117
|
+
if (response.status === 409 && options.occupied) return OCCUPIED;
|
|
118
|
+
const text = await response.text();
|
|
119
|
+
if (response.ok && text.length === 0) return { result: null };
|
|
120
|
+
let parsed = {};
|
|
121
|
+
if (text.length > 0) try {
|
|
122
|
+
parsed = JSON.parse(text);
|
|
123
|
+
} catch (error) {
|
|
124
|
+
throw new CloudflareInvalidResponseError({
|
|
125
|
+
message: "A Cloudflare Artifacts response was not valid JSON.",
|
|
126
|
+
detail: `${method} ${path}: ${messageOf(error)}`
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
const envelope = Envelope.safeParse(parsed);
|
|
130
|
+
if (!response.ok || envelope.success && envelope.data.success === false) throw cloudflareRefusal({
|
|
131
|
+
problem: `Cloudflare Artifacts returned ${response.status}.`,
|
|
132
|
+
apiErrors: cloudflareApiErrors(envelope.success ? envelope.data.errors : []),
|
|
133
|
+
status: response.status,
|
|
134
|
+
permission: "Artifacts Write",
|
|
135
|
+
detail: `${method} ${path} → ${response.status}: ${text}`.slice(0, 2e3)
|
|
136
|
+
});
|
|
137
|
+
return decodeResponse(Envelope, parsed, `Artifacts ${method}`);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
/** Refuse a name outside Cloudflare's charset before it is put in a path. */
|
|
141
|
+
function assertName(value, what) {
|
|
142
|
+
if (ARTIFACTS_NAME.test(value)) return;
|
|
143
|
+
throw new ValidationError({
|
|
144
|
+
message: `"${value}" is not an Artifacts ${what} name.`,
|
|
145
|
+
action: "Use a letter or digit, then letters, digits, `.`, `_` and `-`.",
|
|
146
|
+
detail: `An Artifacts ${what} name is interpolated into a REST path, so anything outside the charset is refused.`
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
//#endregion
|
|
150
|
+
export { CloudflareArtifactsManager };
|
package/dist/client/clients.d.ts
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
import { CloudflareAIManager } from "../ai/aiManager";
|
|
4
4
|
import { CloudflareVectorizeManager } from "../ai/vectorizeManager";
|
|
5
5
|
import { CloudflareVectorizeProvisioner } from "../ai/vectorizeProvisioner";
|
|
6
|
+
import { CloudflareAnalyticsManager } from "../analytics/analyticsManager";
|
|
7
|
+
import { CloudflareArtifactsManager } from "../artifacts/artifactsManager";
|
|
6
8
|
import { CloudflareD1Manager } from "../d1/d1Manager";
|
|
7
9
|
import { CloudflareD1Provisioner } from "../d1/d1Provisioner";
|
|
8
10
|
import { CloudflareEmailRoutingManager } from "../email/emailRoutingManager";
|
|
@@ -13,6 +15,7 @@ import { CloudflareKVProvisioner } from "../kv/kvProvisioner";
|
|
|
13
15
|
import { CloudflareImageManager } from "../media/imageManager";
|
|
14
16
|
import { CloudflareStreamManager } from "../media/streamManager";
|
|
15
17
|
import { CloudflareQueueManager } from "../queue/queueManager";
|
|
18
|
+
import { CloudflareQueueProvisioner } from "../queue/queueProvisioner";
|
|
16
19
|
import type { R2Credentials } from "../r2/r2Credentials";
|
|
17
20
|
import { CloudflareR2Manager } from "../r2/r2Manager";
|
|
18
21
|
import { CloudflareR2Provisioner } from "../r2/r2Provisioner";
|
|
@@ -33,7 +36,7 @@ import type { CloudflareManagerConfig } from "./manager";
|
|
|
33
36
|
*
|
|
34
37
|
* Resource-scoped managers (KV, D1, queues, Vectorize indexes, secret stores, hostname zones, R2
|
|
35
38
|
* buckets) are keyed by their resource id, so repeated calls for the same id return one shared
|
|
36
|
-
* instance. Account-scoped managers (AI, Images, Stream, Workers, Builds, Turnstile) are singletons.
|
|
39
|
+
* instance. Account-scoped managers (AI, Images, Stream, Analytics, Workers, Builds, Turnstile) are singletons.
|
|
37
40
|
*/
|
|
38
41
|
export declare class CloudflareClients {
|
|
39
42
|
private readonly config;
|
|
@@ -49,6 +52,7 @@ export declare class CloudflareClients {
|
|
|
49
52
|
private emailRoutingManager?;
|
|
50
53
|
private imageManager?;
|
|
51
54
|
private streamManager?;
|
|
55
|
+
private analyticsManager?;
|
|
52
56
|
private workersManager?;
|
|
53
57
|
private buildsManager?;
|
|
54
58
|
private turnstileManager?;
|
|
@@ -59,6 +63,8 @@ export declare class CloudflareClients {
|
|
|
59
63
|
private d1ProvisionerManager?;
|
|
60
64
|
private kvProvisionerManager?;
|
|
61
65
|
private r2ProvisionerManager?;
|
|
66
|
+
private queueProvisionerManager?;
|
|
67
|
+
private artifactsManager?;
|
|
62
68
|
private vectorizeProvisionerManager?;
|
|
63
69
|
constructor(config: CloudflareManagerConfig);
|
|
64
70
|
/** The KV manager for a namespace id. */
|
|
@@ -98,6 +104,8 @@ export declare class CloudflareClients {
|
|
|
98
104
|
images(): CloudflareImageManager;
|
|
99
105
|
/** The account-scoped Stream manager. */
|
|
100
106
|
stream(): CloudflareStreamManager;
|
|
107
|
+
/** The account-scoped GraphQL Analytics manager. */
|
|
108
|
+
analytics(): CloudflareAnalyticsManager;
|
|
101
109
|
/** The account-scoped Workers (scripts/deployments) manager. */
|
|
102
110
|
workers(): CloudflareWorkersManager;
|
|
103
111
|
/** The account-scoped Workers Builds manager. */
|
|
@@ -112,6 +120,10 @@ export declare class CloudflareClients {
|
|
|
112
120
|
kvProvisioner(): CloudflareKVProvisioner;
|
|
113
121
|
/** The account-scoped R2 control plane — create, find, list, and delete buckets. */
|
|
114
122
|
r2Provisioner(): CloudflareR2Provisioner;
|
|
123
|
+
/** The account-scoped Queues control plane — create, find, and delete queues. */
|
|
124
|
+
queueProvisioner(): CloudflareQueueProvisioner;
|
|
125
|
+
/** The account-scoped Artifacts control plane — list and delete the repos in a namespace (#673). */
|
|
126
|
+
artifacts(): CloudflareArtifactsManager;
|
|
115
127
|
/** The account-scoped Vectorize control plane — create, find, list, and delete indexes and their metadata indexes. */
|
|
116
128
|
vectorizeProvisioner(): CloudflareVectorizeProvisioner;
|
|
117
129
|
/** The account-scoped API-token control plane — mint, find, and delete account-owned tokens. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../src/client/clients.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../src/client/clients.ts"],"names":[],"mappings":"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"}
|
package/dist/client/clients.js
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
import { CloudflareAIManager } from "../ai/aiManager.js";
|
|
4
4
|
import { CloudflareVectorizeManager } from "../ai/vectorizeManager.js";
|
|
5
5
|
import { CloudflareVectorizeProvisioner } from "../ai/vectorizeProvisioner.js";
|
|
6
|
+
import { CloudflareAnalyticsManager } from "../analytics/analyticsManager.js";
|
|
7
|
+
import { CloudflareArtifactsManager } from "../artifacts/artifactsManager.js";
|
|
6
8
|
import { CloudflareD1Manager } from "../d1/d1Manager.js";
|
|
7
9
|
import { CloudflareD1Provisioner } from "../d1/d1Provisioner.js";
|
|
8
10
|
import { CloudflareEmailRoutingManager } from "../email/emailRoutingManager.js";
|
|
@@ -13,6 +15,7 @@ import { CloudflareKVProvisioner } from "../kv/kvProvisioner.js";
|
|
|
13
15
|
import { CloudflareImageManager } from "../media/imageManager.js";
|
|
14
16
|
import { CloudflareStreamManager } from "../media/streamManager.js";
|
|
15
17
|
import { CloudflareQueueManager } from "../queue/queueManager.js";
|
|
18
|
+
import { CloudflareQueueProvisioner } from "../queue/queueProvisioner.js";
|
|
16
19
|
import { CloudflareR2Manager } from "../r2/r2Manager.js";
|
|
17
20
|
import { CloudflareR2Provisioner } from "../r2/r2Provisioner.js";
|
|
18
21
|
import { CloudflareSecretsStoreManager } from "../secrets/secretsStoreManager.js";
|
|
@@ -32,7 +35,7 @@ import { CloudflareZonesManager } from "../zones/zonesManager.js";
|
|
|
32
35
|
*
|
|
33
36
|
* Resource-scoped managers (KV, D1, queues, Vectorize indexes, secret stores, hostname zones, R2
|
|
34
37
|
* buckets) are keyed by their resource id, so repeated calls for the same id return one shared
|
|
35
|
-
* instance. Account-scoped managers (AI, Images, Stream, Workers, Builds, Turnstile) are singletons.
|
|
38
|
+
* instance. Account-scoped managers (AI, Images, Stream, Analytics, Workers, Builds, Turnstile) are singletons.
|
|
36
39
|
*/
|
|
37
40
|
var CloudflareClients = class {
|
|
38
41
|
config;
|
|
@@ -48,6 +51,7 @@ var CloudflareClients = class {
|
|
|
48
51
|
emailRoutingManager;
|
|
49
52
|
imageManager;
|
|
50
53
|
streamManager;
|
|
54
|
+
analyticsManager;
|
|
51
55
|
workersManager;
|
|
52
56
|
buildsManager;
|
|
53
57
|
turnstileManager;
|
|
@@ -58,6 +62,8 @@ var CloudflareClients = class {
|
|
|
58
62
|
d1ProvisionerManager;
|
|
59
63
|
kvProvisionerManager;
|
|
60
64
|
r2ProvisionerManager;
|
|
65
|
+
queueProvisionerManager;
|
|
66
|
+
artifactsManager;
|
|
61
67
|
vectorizeProvisionerManager;
|
|
62
68
|
constructor(config) {
|
|
63
69
|
this.config = config;
|
|
@@ -150,6 +156,11 @@ var CloudflareClients = class {
|
|
|
150
156
|
this.streamManager ??= new CloudflareStreamManager(this.config);
|
|
151
157
|
return this.streamManager;
|
|
152
158
|
}
|
|
159
|
+
/** The account-scoped GraphQL Analytics manager. */
|
|
160
|
+
analytics() {
|
|
161
|
+
this.analyticsManager ??= new CloudflareAnalyticsManager(this.config);
|
|
162
|
+
return this.analyticsManager;
|
|
163
|
+
}
|
|
153
164
|
/** The account-scoped Workers (scripts/deployments) manager. */
|
|
154
165
|
workers() {
|
|
155
166
|
this.workersManager ??= new CloudflareWorkersManager(this.config);
|
|
@@ -185,6 +196,16 @@ var CloudflareClients = class {
|
|
|
185
196
|
this.r2ProvisionerManager ??= new CloudflareR2Provisioner(this.config);
|
|
186
197
|
return this.r2ProvisionerManager;
|
|
187
198
|
}
|
|
199
|
+
/** The account-scoped Queues control plane — create, find, and delete queues. */
|
|
200
|
+
queueProvisioner() {
|
|
201
|
+
this.queueProvisionerManager ??= new CloudflareQueueProvisioner(this.config);
|
|
202
|
+
return this.queueProvisionerManager;
|
|
203
|
+
}
|
|
204
|
+
/** The account-scoped Artifacts control plane — list and delete the repos in a namespace (#673). */
|
|
205
|
+
artifacts() {
|
|
206
|
+
this.artifactsManager ??= new CloudflareArtifactsManager(this.config);
|
|
207
|
+
return this.artifactsManager;
|
|
208
|
+
}
|
|
188
209
|
/** The account-scoped Vectorize control plane — create, find, list, and delete indexes and their metadata indexes. */
|
|
189
210
|
vectorizeProvisioner() {
|
|
190
211
|
this.vectorizeProvisionerManager ??= new CloudflareVectorizeProvisioner(this.config);
|
package/dist/client/manager.d.ts
CHANGED
|
@@ -14,6 +14,15 @@ export interface CloudflareManagerConfig {
|
|
|
14
14
|
apiToken: string;
|
|
15
15
|
/** The Cloudflare account id all operations target (`CLOUDFLARE_ACCOUNT_ID`). */
|
|
16
16
|
accountId: string;
|
|
17
|
+
/**
|
|
18
|
+
* The token to call with *now*, read at every call, when it can change during the manager's life (#759).
|
|
19
|
+
*
|
|
20
|
+
* A signed-in session's access token lasts an hour and is renewed on disk ahead of that, so a manager
|
|
21
|
+
* built at the start of a long run would otherwise keep sending the token it was constructed with.
|
|
22
|
+
* Absent, {@link apiToken} is the token for good — which is every command that finishes inside the hour
|
|
23
|
+
* dispatch guarantees it.
|
|
24
|
+
*/
|
|
25
|
+
tokenProvider?: () => string;
|
|
17
26
|
}
|
|
18
27
|
/**
|
|
19
28
|
* Base for every Cloudflare resource manager. Holds the configured SDK client and account id, and
|
|
@@ -22,8 +31,9 @@ export interface CloudflareManagerConfig {
|
|
|
22
31
|
* (`validateServiceAccess`).
|
|
23
32
|
*/
|
|
24
33
|
export declare abstract class CloudflareManager {
|
|
25
|
-
|
|
26
|
-
private
|
|
34
|
+
/** The SDK client, and the token it was built for — rebuilt when {@link getApiToken} answers another. */
|
|
35
|
+
private client;
|
|
36
|
+
private readonly token;
|
|
27
37
|
protected readonly accountId: string;
|
|
28
38
|
constructor(config: CloudflareManagerConfig);
|
|
29
39
|
/** The configured SDK client. Subclasses route typed calls through this. */
|
|
@@ -31,6 +41,7 @@ export declare abstract class CloudflareManager {
|
|
|
31
41
|
/**
|
|
32
42
|
* The raw API token, for subclasses that fall back to direct `fetch()` for endpoints the typed
|
|
33
43
|
* SDK does not cover (e.g. Workers Builds, event subscriptions). The documented escape hatch.
|
|
44
|
+
* Read through the provider at every call, so it is the current token, never the constructed one.
|
|
34
45
|
*/
|
|
35
46
|
protected getApiToken(): string;
|
|
36
47
|
/** The account id all operations target. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/client/manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAGtE;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,oGAAoG;IACpG,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/client/manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAGtE;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,oGAAoG;IACpG,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,8BAAsB,iBAAiB;IACrC,yGAAyG;IACzG,OAAO,CAAC,MAAM,CAAqC;IAEnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IAErC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAErC,YAAY,MAAM,EAAE,uBAAuB,EAW1C;IAED,4EAA4E;IAC5E,SAAS,CAAC,SAAS,IAAI,UAAU,CAIhC;IAED;;;;OAIG;IACH,SAAS,CAAC,WAAW,IAAI,MAAM,CAM9B;IAED,4CAA4C;IAC5C,SAAS,CAAC,YAAY,IAAI,MAAM,CAE/B;IAED,wFAAwF;IAClF,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAEvC;IAED,wFAAwF;IAClF,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO5C;IAED,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,IAAI,MAAM,CAAC;IAElC,kGAAkG;IAClG,QAAQ,CAAC,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACpD"}
|
package/dist/client/manager.js
CHANGED
|
@@ -10,26 +10,39 @@ import { Cloudflare } from "cloudflare";
|
|
|
10
10
|
* (`validateServiceAccess`).
|
|
11
11
|
*/
|
|
12
12
|
var CloudflareManager = class {
|
|
13
|
+
/** The SDK client, and the token it was built for — rebuilt when {@link getApiToken} answers another. */
|
|
13
14
|
client;
|
|
14
|
-
|
|
15
|
+
token;
|
|
15
16
|
accountId;
|
|
16
17
|
constructor(config) {
|
|
17
18
|
if (!config.apiToken) throw new CloudflareNotConfiguredError({ detail: "Missing apiToken in CloudflareManagerConfig." });
|
|
18
19
|
if (!config.accountId) throw new CloudflareNotConfiguredError({ detail: "Missing accountId in CloudflareManagerConfig." });
|
|
19
|
-
|
|
20
|
-
this.
|
|
20
|
+
const initial = config.apiToken;
|
|
21
|
+
this.token = config.tokenProvider ?? (() => initial);
|
|
22
|
+
this.client = {
|
|
23
|
+
token: initial,
|
|
24
|
+
sdk: new Cloudflare({ apiToken: initial })
|
|
25
|
+
};
|
|
21
26
|
this.accountId = config.accountId;
|
|
22
27
|
}
|
|
23
28
|
/** The configured SDK client. Subclasses route typed calls through this. */
|
|
24
29
|
getClient() {
|
|
25
|
-
|
|
30
|
+
const token = this.getApiToken();
|
|
31
|
+
if (token !== this.client.token) this.client = {
|
|
32
|
+
token,
|
|
33
|
+
sdk: new Cloudflare({ apiToken: token })
|
|
34
|
+
};
|
|
35
|
+
return this.client.sdk;
|
|
26
36
|
}
|
|
27
37
|
/**
|
|
28
38
|
* The raw API token, for subclasses that fall back to direct `fetch()` for endpoints the typed
|
|
29
39
|
* SDK does not cover (e.g. Workers Builds, event subscriptions). The documented escape hatch.
|
|
40
|
+
* Read through the provider at every call, so it is the current token, never the constructed one.
|
|
30
41
|
*/
|
|
31
42
|
getApiToken() {
|
|
32
|
-
|
|
43
|
+
const token = this.token();
|
|
44
|
+
if (!token) throw new CloudflareNotConfiguredError({ detail: "The tokenProvider answered no apiToken." });
|
|
45
|
+
return token;
|
|
33
46
|
}
|
|
34
47
|
/** The account id all operations target. */
|
|
35
48
|
getAccountId() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1Manager.d.ts","sourceRoot":"","sources":["../../src/d1/d1Manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE3F,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAGpF,wFAAwF;AACxF,MAAM,WAAW,eAAgB,SAAQ,uBAAuB;IAC9D,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,+FAA+F;AAC/F,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,qBAAa,mBAAoB,SAAQ,iBAAkB,YAAW,UAAU;IAC9E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,YAAY,MAAM,EAAE,eAAe,EAMlC;IAID,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAE1C;IAED;;;;;;OAMG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAMlF;IAEK,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAM/C;IAED,6FAA6F;IACvF,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAEjC;IAED,8EAA8E;IAC9E,WAAW,IAAI,KAAK,CAEnB;IAID,iEAAiE;IAC3D,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"d1Manager.d.ts","sourceRoot":"","sources":["../../src/d1/d1Manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE3F,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAGpF,wFAAwF;AACxF,MAAM,WAAW,eAAgB,SAAQ,uBAAuB;IAC9D,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,+FAA+F;AAC/F,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,qBAAa,mBAAoB,SAAQ,iBAAkB,YAAW,UAAU;IAC9E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,YAAY,MAAM,EAAE,eAAe,EAMlC;IAID,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAE1C;IAED;;;;;;OAMG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAMlF;IAEK,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAM/C;IAED,6FAA6F;IACvF,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAEjC;IAED,8EAA8E;IAC9E,WAAW,IAAI,KAAK,CAEnB;IAID,iEAAiE;IAC3D,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CASzE;IAED;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAW/F;IAED,oCAAoC;IAC9B,eAAe,IAAI,OAAO,CAAC,EAAE,CAAC,CAInC;IAED,4CAA4C;IACtC,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAMpC;IAED;;;;OAIG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAS1D;IAED,qEAAqE;IACrE,SAAS,IAAI;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAErD;IAED,cAAc,IAAI,MAAM,CAEvB;IAED,iEAAiE;IAC3D,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO9C;CACF"}
|
package/dist/d1/d1Manager.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
import { CloudflareNotConfiguredError, cloudflareRequest, reasonOf } from "../client/errors.js";
|
|
4
4
|
import { CloudflareManager } from "../client/manager.js";
|
|
5
|
-
import { D1PreparedStatementREST } from "./d1PreparedStatement.js";
|
|
5
|
+
import { D1PreparedStatementREST, D1_QUERY_REQUEST } from "./d1PreparedStatement.js";
|
|
6
6
|
import { InternalError, ValidationError } from "@pithy-sh/core/src/error/pithyError";
|
|
7
7
|
//#region src/d1/d1Manager.ts
|
|
8
8
|
/**
|
|
@@ -38,7 +38,7 @@ var CloudflareD1Manager = class extends CloudflareManager {
|
|
|
38
38
|
const result = (await cloudflareRequest("D1 exec", () => this.getClient().d1.database.query(this.databaseId, {
|
|
39
39
|
account_id: this.accountId,
|
|
40
40
|
sql: query
|
|
41
|
-
}))).result[0];
|
|
41
|
+
}, D1_QUERY_REQUEST))).result[0];
|
|
42
42
|
return {
|
|
43
43
|
count: result?.results?.length ?? 0,
|
|
44
44
|
duration: result?.meta?.duration ?? 0
|
|
@@ -58,7 +58,7 @@ var CloudflareD1Manager = class extends CloudflareManager {
|
|
|
58
58
|
account_id: this.accountId,
|
|
59
59
|
sql,
|
|
60
60
|
params
|
|
61
|
-
}))).result;
|
|
61
|
+
}, D1_QUERY_REQUEST))).result;
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
64
|
* Run many independent queries, collecting a per-query result instead of failing the whole batch
|
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
import type { D1PreparedStatement, D1Result } from "@cloudflare/workers-types";
|
|
4
4
|
import type { Cloudflare } from "cloudflare";
|
|
5
|
+
/**
|
|
6
|
+
* The request options every D1 query is sent with: **no retries** (#709).
|
|
7
|
+
*
|
|
8
|
+
* The SDK retries a request twice by default, on a connection timeout, a 408, a 409, a 429 or a 5xx. That is
|
|
9
|
+
* safe for a read of a resource and wrong for a query, which is not idempotent: D1 can apply a statement and
|
|
10
|
+
* answer slowly, and the resent copy then runs against the changed database. A migration's `CREATE TABLE` did
|
|
11
|
+
* exactly that and failed `table already exists`, on a step that had succeeded. Sent once, a slow answer
|
|
12
|
+
* surfaces as the timeout it was, and `cloudflareRequest` already tells the operator to check before retrying.
|
|
13
|
+
*/
|
|
14
|
+
export declare const D1_QUERY_REQUEST: {
|
|
15
|
+
readonly maxRetries: 0;
|
|
16
|
+
};
|
|
5
17
|
export declare class D1PreparedStatementREST<T = Record<string, unknown>> implements D1PreparedStatement {
|
|
6
18
|
private readonly sql;
|
|
7
19
|
private readonly boundParams;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1PreparedStatement.d.ts","sourceRoot":"","sources":["../../src/d1/d1PreparedStatement.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,mBAAmB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"d1PreparedStatement.d.ts","sourceRoot":"","sources":["../../src/d1/d1PreparedStatement.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,mBAAmB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA6B7C;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB;aAAK,UAAU,EAAE,CAAC;CAAW,CAAC;AAY3D,qBAAa,uBAAuB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,YAAW,mBAAmB;IAC9F,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAY;IAExC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IAEpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,YAAY,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAE,OAAO,EAAO,EAM9G;IAED,gGAAgG;IAChG,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAErD;IAED,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAEjC;IAED,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAEjC;IAEK,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvD,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IASlC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,OAAO,EAAE;QAAE,WAAW,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,KAAK,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;YAmB5D,YAAY;CAgB3B"}
|
|
@@ -26,6 +26,16 @@ function mapMeta(restMeta) {
|
|
|
26
26
|
changes: restMeta?.changes ?? 0
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* The request options every D1 query is sent with: **no retries** (#709).
|
|
31
|
+
*
|
|
32
|
+
* The SDK retries a request twice by default, on a connection timeout, a 408, a 409, a 429 or a 5xx. That is
|
|
33
|
+
* safe for a read of a resource and wrong for a query, which is not idempotent: D1 can apply a statement and
|
|
34
|
+
* answer slowly, and the resent copy then runs against the changed database. A migration's `CREATE TABLE` did
|
|
35
|
+
* exactly that and failed `table already exists`, on a step that had succeeded. Sent once, a slow answer
|
|
36
|
+
* surfaces as the timeout it was, and `cloudflareRequest` already tells the operator to check before retrying.
|
|
37
|
+
*/
|
|
38
|
+
const D1_QUERY_REQUEST = { maxRetries: 0 };
|
|
29
39
|
/** The REST `params` array is strings; coerce each bound value the way the D1 REST API expects. */
|
|
30
40
|
function toStringParams(params) {
|
|
31
41
|
return params.map((value) => {
|
|
@@ -70,7 +80,7 @@ var D1PreparedStatementREST = class D1PreparedStatementREST {
|
|
|
70
80
|
account_id: this.accountId,
|
|
71
81
|
sql: this.sql,
|
|
72
82
|
params
|
|
73
|
-
}))).result[0];
|
|
83
|
+
}, D1_QUERY_REQUEST))).result[0];
|
|
74
84
|
const rows = rawResult?.results?.rows ?? [];
|
|
75
85
|
if (options?.columnNames) return [rawResult?.results?.columns ?? [], ...rows];
|
|
76
86
|
return rows;
|
|
@@ -81,7 +91,7 @@ var D1PreparedStatementREST = class D1PreparedStatementREST {
|
|
|
81
91
|
account_id: this.accountId,
|
|
82
92
|
sql: this.sql,
|
|
83
93
|
params
|
|
84
|
-
}))).result[0];
|
|
94
|
+
}, D1_QUERY_REQUEST))).result[0];
|
|
85
95
|
return {
|
|
86
96
|
success: true,
|
|
87
97
|
meta: mapMeta(queryResult?.meta),
|
|
@@ -90,4 +100,4 @@ var D1PreparedStatementREST = class D1PreparedStatementREST {
|
|
|
90
100
|
}
|
|
91
101
|
};
|
|
92
102
|
//#endregion
|
|
93
|
-
export { D1PreparedStatementREST };
|
|
103
|
+
export { D1PreparedStatementREST, D1_QUERY_REQUEST };
|
|
@@ -3,7 +3,20 @@
|
|
|
3
3
|
import type { Image, V1CreateParams, V1EditParams } from "cloudflare/resources/images/v1/v1";
|
|
4
4
|
import type { DirectUploadCreateParams, DirectUploadCreateResponse } from "cloudflare/resources/images/v2/direct-uploads";
|
|
5
5
|
import type { V2ListParams } from "cloudflare/resources/images/v2/v2";
|
|
6
|
+
import { z } from "zod";
|
|
6
7
|
import { CloudflareManager } from "../client/manager";
|
|
8
|
+
/** One of the account's Images URL-signing keys. The value is the HMAC secret signed URLs are minted with. */
|
|
9
|
+
export declare const ImagesSigningKey: z.ZodObject<{
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
value: z.ZodString;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
export type ImagesSigningKey = z.infer<typeof ImagesSigningKey>;
|
|
14
|
+
/** One Images variant, and whether it serves an image without a signature whatever the image requires. */
|
|
15
|
+
export declare const ImagesVariant: z.ZodObject<{
|
|
16
|
+
id: z.ZodString;
|
|
17
|
+
neverRequireSignedURLs: z.ZodBoolean;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export type ImagesVariant = z.infer<typeof ImagesVariant>;
|
|
7
20
|
/**
|
|
8
21
|
* Out-of-Worker Cloudflare Images access over the REST API: upload, fetch, edit, delete, list, and
|
|
9
22
|
* direct-upload URLs from a CLI/CI/provisioning context. Image metadata is an arbitrary
|
|
@@ -29,6 +42,18 @@ export declare class CloudflareImageManager extends CloudflareManager {
|
|
|
29
42
|
listImages(params?: Omit<V2ListParams, "account_id">): Promise<Image[]>;
|
|
30
43
|
/** List all images across every page, following the V2 continuation token. */
|
|
31
44
|
listAllImages(params?: Omit<V2ListParams, "account_id">): Promise<Image[]>;
|
|
45
|
+
/**
|
|
46
|
+
* The account's URL-signing keys — what a signed delivery URL for an image uploaded with
|
|
47
|
+
* `requireSignedURLs` is minted with. Cloudflare provisions a `default` key per account.
|
|
48
|
+
*/
|
|
49
|
+
signingKeys(): Promise<ImagesSigningKey[]>;
|
|
50
|
+
/** Create a named signing key, or roll it if it exists. Answers with every key the account then holds. */
|
|
51
|
+
createSigningKey(name: string): Promise<ImagesSigningKey[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Every variant, with whether it serves unsigned. A variant set to `neverRequireSignedURLs` delivers a
|
|
54
|
+
* private image to anyone holding its URL, which is why media's provisioning reads this.
|
|
55
|
+
*/
|
|
56
|
+
listVariants(): Promise<ImagesVariant[]>;
|
|
32
57
|
getServiceType(): string;
|
|
33
58
|
/** Prove access by listing images. Never throws. */
|
|
34
59
|
validateServiceAccess(): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"imageManager.d.ts","sourceRoot":"","sources":["../../src/media/imageManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAC7F,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"imageManager.d.ts","sourceRoot":"","sources":["../../src/media/imageManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAC7F,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAoBtD,8GAA8G;AAC9G,eAAO,MAAM,gBAAgB;;;iBAKwB,CAAC;AACtD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAMhE,0GAA0G;AAC1G,eAAO,MAAM,aAAa;;;iBAOqC,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AA+B1D;;;;;;;;;GASG;AACH,qBAAa,sBAAuB,SAAQ,iBAAiB;IAC3D,qFAAqF;IAC/E,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAO5E;IAED,yCAAyC;IACnC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAIlD;IAED,+CAA+C;IACzC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAI3F;IAED,6BAA6B;IACvB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhD;IAED,oEAAoE;IAC9D,qBAAqB,CACzB,MAAM,EAAE,IAAI,CAAC,wBAAwB,EAAE,YAAY,CAAC,GACnD,OAAO,CAAC,0BAA0B,CAAC,CAOrC;IAED,oFAAoF;IAC9E,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAK5E;IAED,8EAA8E;IACxE,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAe/E;IAED;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAK/C;IAED,0GAA0G;IACpG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAShE;IAED;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAS7C;IAED,cAAc,IAAI,MAAM,CAEvB;IAED,oDAAoD;IAC9C,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO9C;CACF"}
|