@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.
Files changed (95) hide show
  1. package/README.md +3 -3
  2. package/dist/ai/aiManager.d.ts +15 -1
  3. package/dist/ai/aiManager.d.ts.map +1 -1
  4. package/dist/ai/aiManager.js +39 -6
  5. package/dist/analytics/analyticsManager.d.ts +78 -0
  6. package/dist/analytics/analyticsManager.d.ts.map +1 -0
  7. package/dist/analytics/analyticsManager.js +206 -0
  8. package/dist/analytics/datasets.d.ts +26 -0
  9. package/dist/analytics/datasets.d.ts.map +1 -0
  10. package/dist/analytics/datasets.js +26 -0
  11. package/dist/analytics/window.d.ts +50 -0
  12. package/dist/analytics/window.d.ts.map +1 -0
  13. package/dist/analytics/window.js +67 -0
  14. package/dist/artifacts/artifactsManager.d.ts +52 -0
  15. package/dist/artifacts/artifactsManager.d.ts.map +1 -0
  16. package/dist/artifacts/artifactsManager.js +150 -0
  17. package/dist/client/clients.d.ts +13 -1
  18. package/dist/client/clients.d.ts.map +1 -1
  19. package/dist/client/clients.js +22 -1
  20. package/dist/client/manager.d.ts +13 -2
  21. package/dist/client/manager.d.ts.map +1 -1
  22. package/dist/client/manager.js +18 -5
  23. package/dist/d1/d1Manager.d.ts.map +1 -1
  24. package/dist/d1/d1Manager.js +3 -3
  25. package/dist/d1/d1PreparedStatement.d.ts +12 -0
  26. package/dist/d1/d1PreparedStatement.d.ts.map +1 -1
  27. package/dist/d1/d1PreparedStatement.js +13 -3
  28. package/dist/media/imageManager.d.ts +25 -0
  29. package/dist/media/imageManager.d.ts.map +1 -1
  30. package/dist/media/imageManager.js +58 -2
  31. package/dist/media/streamManager.d.ts +15 -0
  32. package/dist/media/streamManager.d.ts.map +1 -1
  33. package/dist/media/streamManager.js +28 -1
  34. package/dist/oauth/callback.d.ts +32 -0
  35. package/dist/oauth/callback.d.ts.map +1 -0
  36. package/dist/oauth/callback.js +58 -0
  37. package/dist/oauth/catalog.d.ts +26 -0
  38. package/dist/oauth/catalog.d.ts.map +1 -0
  39. package/dist/oauth/catalog.js +30 -0
  40. package/dist/oauth/client.d.ts +126 -0
  41. package/dist/oauth/client.d.ts.map +1 -0
  42. package/dist/oauth/client.js +200 -0
  43. package/dist/oauth/scopes.d.ts +62 -0
  44. package/dist/oauth/scopes.d.ts.map +1 -0
  45. package/dist/oauth/scopes.js +79 -0
  46. package/dist/queue/queueProvisioner.d.ts +30 -0
  47. package/dist/queue/queueProvisioner.d.ts.map +1 -0
  48. package/dist/queue/queueProvisioner.js +72 -0
  49. package/dist/r2/r2Manager.d.ts +11 -1
  50. package/dist/r2/r2Manager.d.ts.map +1 -1
  51. package/dist/r2/r2Manager.js +18 -1
  52. package/dist/secrets/secretsStoreManager.d.ts.map +1 -1
  53. package/dist/secrets/secretsStoreManager.js +3 -2
  54. package/dist/test-utils/settle.d.ts +79 -0
  55. package/dist/test-utils/settle.d.ts.map +1 -0
  56. package/dist/test-utils/settle.js +105 -0
  57. package/dist/tokens/accountTokensManager.d.ts +8 -7
  58. package/dist/tokens/accountTokensManager.d.ts.map +1 -1
  59. package/dist/tokens/accountTokensManager.js +2 -1
  60. package/dist/tokens/permissions.d.ts +49 -0
  61. package/dist/tokens/permissions.d.ts.map +1 -1
  62. package/dist/tokens/permissions.js +56 -2
  63. package/dist/tokens/profiles.d.ts +10 -30
  64. package/dist/tokens/profiles.d.ts.map +1 -1
  65. package/dist/tokens/profiles.js +48 -36
  66. package/dist/tokens/runtime.d.ts +16 -0
  67. package/dist/tokens/runtime.d.ts.map +1 -0
  68. package/dist/tokens/runtime.js +18 -0
  69. package/dist/workers/buildsManager.js +1 -1
  70. package/dist/workflows/stepFailure.js +1 -1
  71. package/dist/workflows/workflowsClient.js +1 -1
  72. package/package.json +3 -3
  73. package/src/ai/aiManager.ts +44 -5
  74. package/src/analytics/analyticsManager.ts +311 -0
  75. package/src/analytics/datasets.ts +30 -0
  76. package/src/analytics/window.ts +101 -0
  77. package/src/artifacts/artifactsManager.ts +199 -0
  78. package/src/client/clients.ts +28 -1
  79. package/src/client/manager.ts +24 -6
  80. package/src/d1/d1Manager.ts +7 -3
  81. package/src/d1/d1PreparedStatement.ts +21 -2
  82. package/src/media/imageManager.ts +93 -1
  83. package/src/media/streamManager.ts +34 -0
  84. package/src/oauth/callback.ts +70 -0
  85. package/src/oauth/catalog.ts +39 -0
  86. package/src/oauth/client.ts +265 -0
  87. package/src/oauth/scopes.ts +91 -0
  88. package/src/queue/queueProvisioner.ts +79 -0
  89. package/src/r2/r2Manager.ts +29 -2
  90. package/src/secrets/secretsStoreManager.ts +2 -1
  91. package/src/test-utils/settle.ts +139 -0
  92. package/src/tokens/accountTokensManager.ts +12 -0
  93. package/src/tokens/permissions.ts +81 -0
  94. package/src/tokens/profiles.ts +58 -70
  95. 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 };
@@ -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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"}
@@ -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);
@@ -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
- private readonly client;
26
- private readonly apiToken;
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;CACnB;AAED;;;;;GAKG;AACH,8BAAsB,iBAAiB;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IAEpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAErC,YAAY,MAAM,EAAE,uBAAuB,EAU1C;IAED,4EAA4E;IAC5E,SAAS,CAAC,SAAS,IAAI,UAAU,CAEhC;IAED;;;OAGG;IACH,SAAS,CAAC,WAAW,IAAI,MAAM,CAE9B;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"}
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"}
@@ -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
- apiToken;
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
- this.client = new Cloudflare({ apiToken: config.apiToken });
20
- this.apiToken = config.apiToken;
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
- return this.client;
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
- return this.apiToken;
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,CAKzE;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"}
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"}
@@ -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;AAuC7C,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;YAe5D,YAAY;CAY3B"}
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;AAEtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAoBtD;;;;;;;;;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,cAAc,IAAI,MAAM,CAEvB;IAED,oDAAoD;IAC9C,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO9C;CACF"}
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"}