alchemy 0.51.2 → 0.52.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/lib/apply.js +1 -1
- package/lib/apply.js.map +1 -1
- package/lib/cloudflare/assets.d.ts +1 -1
- package/lib/cloudflare/assets.d.ts.map +1 -1
- package/lib/cloudflare/bindings.d.ts +12 -11
- package/lib/cloudflare/bindings.d.ts.map +1 -1
- package/lib/cloudflare/bindings.js.map +1 -1
- package/lib/cloudflare/bound.d.ts +11 -18
- package/lib/cloudflare/bound.d.ts.map +1 -1
- package/lib/cloudflare/bucket.d.ts +4 -5
- package/lib/cloudflare/bucket.d.ts.map +1 -1
- package/lib/cloudflare/bucket.js +1 -16
- package/lib/cloudflare/bucket.js.map +1 -1
- package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
- package/lib/cloudflare/compatibility-date.gen.js +1 -1
- package/lib/cloudflare/d1-database.d.ts +85 -26
- package/lib/cloudflare/d1-database.d.ts.map +1 -1
- package/lib/cloudflare/d1-database.js +66 -47
- package/lib/cloudflare/d1-database.js.map +1 -1
- package/lib/cloudflare/d1-local-migrations.d.ts +10 -0
- package/lib/cloudflare/d1-local-migrations.d.ts.map +1 -0
- package/lib/cloudflare/d1-local-migrations.js +39 -0
- package/lib/cloudflare/d1-local-migrations.js.map +1 -0
- package/lib/cloudflare/dispatch-namespace.d.ts +4 -6
- package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
- package/lib/cloudflare/dispatch-namespace.js +1 -11
- package/lib/cloudflare/dispatch-namespace.js.map +1 -1
- package/lib/cloudflare/event-source.d.ts +3 -3
- package/lib/cloudflare/event-source.d.ts.map +1 -1
- package/lib/cloudflare/hyperdrive.d.ts +3 -4
- package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
- package/lib/cloudflare/hyperdrive.js +1 -9
- package/lib/cloudflare/hyperdrive.js.map +1 -1
- package/lib/cloudflare/index.d.ts +1 -0
- package/lib/cloudflare/index.d.ts.map +1 -1
- package/lib/cloudflare/index.js +1 -0
- package/lib/cloudflare/index.js.map +1 -1
- package/lib/cloudflare/kv-namespace.d.ts +4 -5
- package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
- package/lib/cloudflare/kv-namespace.js +1 -14
- package/lib/cloudflare/kv-namespace.js.map +1 -1
- package/lib/cloudflare/pipeline.d.ts +4 -5
- package/lib/cloudflare/pipeline.d.ts.map +1 -1
- package/lib/cloudflare/pipeline.js +1 -12
- package/lib/cloudflare/pipeline.js.map +1 -1
- package/lib/cloudflare/queue-consumer.d.ts +3 -3
- package/lib/cloudflare/queue-consumer.d.ts.map +1 -1
- package/lib/cloudflare/queue.d.ts +3 -4
- package/lib/cloudflare/queue.d.ts.map +1 -1
- package/lib/cloudflare/queue.js +1 -11
- package/lib/cloudflare/queue.js.map +1 -1
- package/lib/cloudflare/vectorize-index.d.ts +4 -5
- package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
- package/lib/cloudflare/vectorize-index.js +1 -15
- package/lib/cloudflare/vectorize-index.js.map +1 -1
- package/lib/cloudflare/vectorize-metadata-index.d.ts +2 -2
- package/lib/cloudflare/vectorize-metadata-index.d.ts.map +1 -1
- package/lib/cloudflare/worker-ref.d.ts +41 -0
- package/lib/cloudflare/worker-ref.d.ts.map +1 -0
- package/lib/cloudflare/worker-ref.js +27 -0
- package/lib/cloudflare/worker-ref.js.map +1 -0
- package/lib/cloudflare/worker.d.ts +6 -68
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +5 -198
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/cloudflare/wrangler.json.js +1 -0
- package/lib/cloudflare/wrangler.json.js.map +1 -1
- package/lib/cloudflare/zone.d.ts.map +1 -1
- package/lib/cloudflare/zone.js +2 -2
- package/lib/cloudflare/zone.js.map +1 -1
- package/lib/esbuild/bundle.d.ts +2 -2
- package/lib/state/cloudflare-state-store.d.ts +3 -1
- package/lib/state/cloudflare-state-store.d.ts.map +1 -1
- package/lib/state/cloudflare-state-store.js +11 -2
- package/lib/state/cloudflare-state-store.js.map +1 -1
- package/lib/state/instrumented-state-store.d.ts +2 -0
- package/lib/state/instrumented-state-store.d.ts.map +1 -1
- package/lib/state/instrumented-state-store.js +2 -0
- package/lib/state/instrumented-state-store.js.map +1 -1
- package/package.json +1 -1
- package/src/apply.ts +1 -1
- package/src/cloudflare/bindings.ts +18 -17
- package/src/cloudflare/bound.ts +35 -18
- package/src/cloudflare/bucket.ts +5 -27
- package/src/cloudflare/compatibility-date.gen.ts +1 -1
- package/src/cloudflare/d1-database.ts +107 -100
- package/src/cloudflare/d1-local-migrations.ts +52 -0
- package/src/cloudflare/dispatch-namespace.ts +6 -25
- package/src/cloudflare/event-source.ts +3 -3
- package/src/cloudflare/hyperdrive.ts +4 -19
- package/src/cloudflare/index.ts +1 -0
- package/src/cloudflare/kv-namespace.ts +5 -28
- package/src/cloudflare/pipeline.ts +8 -27
- package/src/cloudflare/queue-consumer.ts +3 -3
- package/src/cloudflare/queue.ts +4 -22
- package/src/cloudflare/vectorize-index.ts +5 -27
- package/src/cloudflare/vectorize-metadata-index.ts +2 -2
- package/src/cloudflare/worker-ref.ts +51 -0
- package/src/cloudflare/worker.ts +16 -332
- package/src/cloudflare/wrangler.json.ts +1 -0
- package/src/cloudflare/zone.ts +9 -8
- package/src/state/cloudflare-state-store.ts +73 -54
- package/src/state/instrumented-state-store.ts +2 -0
|
@@ -43,11 +43,20 @@ export interface CloudflareStateStoreOptions extends CloudflareApiOptions {
|
|
|
43
43
|
* @see {@link https://alchemy.run/guides/do-state-store DOStateStore}
|
|
44
44
|
*/
|
|
45
45
|
export class CloudflareStateStore extends StateStoreProxy {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
private readonly options: CloudflareStateStoreOptions = {},
|
|
49
|
-
) {
|
|
46
|
+
options: CloudflareStateStoreOptions & { stateToken: Secret<string> };
|
|
47
|
+
constructor(scope: Scope, options: CloudflareStateStoreOptions = {}) {
|
|
50
48
|
super(scope);
|
|
49
|
+
const stateToken =
|
|
50
|
+
options.stateToken ?? alchemy.secret(process.env.ALCHEMY_STATE_TOKEN);
|
|
51
|
+
if (!stateToken) {
|
|
52
|
+
throw new Error(
|
|
53
|
+
"Missing token for DOStateStore. Please set ALCHEMY_STATE_TOKEN in the environment or set the `stateToken` option in the DOStateStore constructor.",
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
this.options = {
|
|
57
|
+
...options,
|
|
58
|
+
stateToken: stateToken,
|
|
59
|
+
};
|
|
51
60
|
}
|
|
52
61
|
|
|
53
62
|
async provision(): Promise<StateStoreProxy.Dispatch> {
|
|
@@ -87,58 +96,68 @@ export class CloudflareStateStore extends StateStoreProxy {
|
|
|
87
96
|
}
|
|
88
97
|
}
|
|
89
98
|
|
|
90
|
-
const provision = memoize(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
const provision = memoize(
|
|
100
|
+
async (
|
|
101
|
+
options: CloudflareStateStoreOptions & {
|
|
102
|
+
stateToken: Secret<string>;
|
|
103
|
+
},
|
|
104
|
+
) => {
|
|
105
|
+
const scriptName = options.scriptName ?? "alchemy-state-service";
|
|
106
|
+
const token =
|
|
107
|
+
options.stateToken ??
|
|
108
|
+
(await alchemy.secret.env(
|
|
109
|
+
"ALCHEMY_STATE_TOKEN",
|
|
110
|
+
undefined,
|
|
111
|
+
"Missing token for DOStateStore. Please set ALCHEMY_STATE_TOKEN in the environment or set the `stateToken` option in the DOStateStore constructor.",
|
|
112
|
+
));
|
|
99
113
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
114
|
+
const api = await createCloudflareApi(options);
|
|
115
|
+
const [bundle, settings, subdomain] = await Promise.all([
|
|
116
|
+
getInternalWorkerBundle("cloudflare-state-store"),
|
|
117
|
+
getWorkerSettings(api, scriptName),
|
|
118
|
+
getWorkerSubdomain(api, scriptName),
|
|
119
|
+
]);
|
|
120
|
+
if (
|
|
121
|
+
!settings ||
|
|
122
|
+
!settings.tags.includes(bundle.tag) ||
|
|
123
|
+
options.forceUpdate
|
|
124
|
+
) {
|
|
125
|
+
logger.log(
|
|
126
|
+
`[CloudflareStateStore] ${settings ? "Updating" : "Creating"}...`,
|
|
127
|
+
);
|
|
128
|
+
await putWorker(api, {
|
|
129
|
+
workerName: scriptName,
|
|
130
|
+
compatibilityDate: DEFAULT_COMPATIBILITY_DATE,
|
|
131
|
+
format: "esm",
|
|
132
|
+
scriptBundle: {
|
|
133
|
+
entrypoint: bundle.file.name,
|
|
134
|
+
files: [bundle.file],
|
|
135
|
+
hash: bundle.tag,
|
|
136
|
+
},
|
|
137
|
+
compatibilityFlags: [],
|
|
138
|
+
bindings: {
|
|
139
|
+
STORE: DurableObjectNamespace(scriptName, {
|
|
140
|
+
className: "Store",
|
|
141
|
+
sqlite: true,
|
|
142
|
+
}),
|
|
143
|
+
STATE_TOKEN: token,
|
|
144
|
+
},
|
|
145
|
+
tags: [bundle.tag],
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
if (!subdomain.enabled) {
|
|
149
|
+
await enableWorkerSubdomain(api, scriptName);
|
|
150
|
+
}
|
|
151
|
+
const url = `https://${scriptName}.${await getAccountSubdomain(api)}.workers.dev`;
|
|
152
|
+
await pollUntilReady(() =>
|
|
153
|
+
fetch(url, {
|
|
154
|
+
method: "HEAD",
|
|
155
|
+
headers: { Authorization: `Bearer ${token.unencrypted}` },
|
|
156
|
+
}),
|
|
109
157
|
);
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
format: "esm",
|
|
114
|
-
scriptBundle: {
|
|
115
|
-
entrypoint: bundle.file.name,
|
|
116
|
-
files: [bundle.file],
|
|
117
|
-
hash: bundle.tag,
|
|
118
|
-
},
|
|
119
|
-
compatibilityFlags: [],
|
|
120
|
-
bindings: {
|
|
121
|
-
STORE: DurableObjectNamespace(scriptName, {
|
|
122
|
-
className: "Store",
|
|
123
|
-
sqlite: true,
|
|
124
|
-
}),
|
|
125
|
-
STATE_TOKEN: token,
|
|
126
|
-
},
|
|
127
|
-
tags: [bundle.tag],
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
if (!subdomain.enabled) {
|
|
131
|
-
await enableWorkerSubdomain(api, scriptName);
|
|
132
|
-
}
|
|
133
|
-
const url = `https://${scriptName}.${await getAccountSubdomain(api)}.workers.dev`;
|
|
134
|
-
await pollUntilReady(() =>
|
|
135
|
-
fetch(url, {
|
|
136
|
-
method: "HEAD",
|
|
137
|
-
headers: { Authorization: `Bearer ${token.unencrypted}` },
|
|
138
|
-
}),
|
|
139
|
-
);
|
|
140
|
-
return { url, token: token.unencrypted };
|
|
141
|
-
});
|
|
158
|
+
return { url, token: token.unencrypted };
|
|
159
|
+
},
|
|
160
|
+
);
|
|
142
161
|
|
|
143
162
|
async function pollUntilReady(fn: () => Promise<Response>) {
|
|
144
163
|
// This ensures the token is correct and the worker is ready to use.
|
|
@@ -6,6 +6,8 @@ import type { Telemetry } from "../util/telemetry/types.ts";
|
|
|
6
6
|
export class InstrumentedStateStore<T extends StateStore>
|
|
7
7
|
implements StateStore
|
|
8
8
|
{
|
|
9
|
+
/** @internal */
|
|
10
|
+
__phantom?: T;
|
|
9
11
|
private readonly stateStore: StateStore;
|
|
10
12
|
private readonly telemetryClient: ITelemetryClient;
|
|
11
13
|
private readonly stateStoreClass: string;
|