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.
Files changed (103) hide show
  1. package/lib/apply.js +1 -1
  2. package/lib/apply.js.map +1 -1
  3. package/lib/cloudflare/assets.d.ts +1 -1
  4. package/lib/cloudflare/assets.d.ts.map +1 -1
  5. package/lib/cloudflare/bindings.d.ts +12 -11
  6. package/lib/cloudflare/bindings.d.ts.map +1 -1
  7. package/lib/cloudflare/bindings.js.map +1 -1
  8. package/lib/cloudflare/bound.d.ts +11 -18
  9. package/lib/cloudflare/bound.d.ts.map +1 -1
  10. package/lib/cloudflare/bucket.d.ts +4 -5
  11. package/lib/cloudflare/bucket.d.ts.map +1 -1
  12. package/lib/cloudflare/bucket.js +1 -16
  13. package/lib/cloudflare/bucket.js.map +1 -1
  14. package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
  15. package/lib/cloudflare/compatibility-date.gen.js +1 -1
  16. package/lib/cloudflare/d1-database.d.ts +85 -26
  17. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  18. package/lib/cloudflare/d1-database.js +66 -47
  19. package/lib/cloudflare/d1-database.js.map +1 -1
  20. package/lib/cloudflare/d1-local-migrations.d.ts +10 -0
  21. package/lib/cloudflare/d1-local-migrations.d.ts.map +1 -0
  22. package/lib/cloudflare/d1-local-migrations.js +39 -0
  23. package/lib/cloudflare/d1-local-migrations.js.map +1 -0
  24. package/lib/cloudflare/dispatch-namespace.d.ts +4 -6
  25. package/lib/cloudflare/dispatch-namespace.d.ts.map +1 -1
  26. package/lib/cloudflare/dispatch-namespace.js +1 -11
  27. package/lib/cloudflare/dispatch-namespace.js.map +1 -1
  28. package/lib/cloudflare/event-source.d.ts +3 -3
  29. package/lib/cloudflare/event-source.d.ts.map +1 -1
  30. package/lib/cloudflare/hyperdrive.d.ts +3 -4
  31. package/lib/cloudflare/hyperdrive.d.ts.map +1 -1
  32. package/lib/cloudflare/hyperdrive.js +1 -9
  33. package/lib/cloudflare/hyperdrive.js.map +1 -1
  34. package/lib/cloudflare/index.d.ts +1 -0
  35. package/lib/cloudflare/index.d.ts.map +1 -1
  36. package/lib/cloudflare/index.js +1 -0
  37. package/lib/cloudflare/index.js.map +1 -1
  38. package/lib/cloudflare/kv-namespace.d.ts +4 -5
  39. package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
  40. package/lib/cloudflare/kv-namespace.js +1 -14
  41. package/lib/cloudflare/kv-namespace.js.map +1 -1
  42. package/lib/cloudflare/pipeline.d.ts +4 -5
  43. package/lib/cloudflare/pipeline.d.ts.map +1 -1
  44. package/lib/cloudflare/pipeline.js +1 -12
  45. package/lib/cloudflare/pipeline.js.map +1 -1
  46. package/lib/cloudflare/queue-consumer.d.ts +3 -3
  47. package/lib/cloudflare/queue-consumer.d.ts.map +1 -1
  48. package/lib/cloudflare/queue.d.ts +3 -4
  49. package/lib/cloudflare/queue.d.ts.map +1 -1
  50. package/lib/cloudflare/queue.js +1 -11
  51. package/lib/cloudflare/queue.js.map +1 -1
  52. package/lib/cloudflare/vectorize-index.d.ts +4 -5
  53. package/lib/cloudflare/vectorize-index.d.ts.map +1 -1
  54. package/lib/cloudflare/vectorize-index.js +1 -15
  55. package/lib/cloudflare/vectorize-index.js.map +1 -1
  56. package/lib/cloudflare/vectorize-metadata-index.d.ts +2 -2
  57. package/lib/cloudflare/vectorize-metadata-index.d.ts.map +1 -1
  58. package/lib/cloudflare/worker-ref.d.ts +41 -0
  59. package/lib/cloudflare/worker-ref.d.ts.map +1 -0
  60. package/lib/cloudflare/worker-ref.js +27 -0
  61. package/lib/cloudflare/worker-ref.js.map +1 -0
  62. package/lib/cloudflare/worker.d.ts +6 -68
  63. package/lib/cloudflare/worker.d.ts.map +1 -1
  64. package/lib/cloudflare/worker.js +5 -198
  65. package/lib/cloudflare/worker.js.map +1 -1
  66. package/lib/cloudflare/wrangler.json.js +1 -0
  67. package/lib/cloudflare/wrangler.json.js.map +1 -1
  68. package/lib/cloudflare/zone.d.ts.map +1 -1
  69. package/lib/cloudflare/zone.js +2 -2
  70. package/lib/cloudflare/zone.js.map +1 -1
  71. package/lib/esbuild/bundle.d.ts +2 -2
  72. package/lib/state/cloudflare-state-store.d.ts +3 -1
  73. package/lib/state/cloudflare-state-store.d.ts.map +1 -1
  74. package/lib/state/cloudflare-state-store.js +11 -2
  75. package/lib/state/cloudflare-state-store.js.map +1 -1
  76. package/lib/state/instrumented-state-store.d.ts +2 -0
  77. package/lib/state/instrumented-state-store.d.ts.map +1 -1
  78. package/lib/state/instrumented-state-store.js +2 -0
  79. package/lib/state/instrumented-state-store.js.map +1 -1
  80. package/package.json +1 -1
  81. package/src/apply.ts +1 -1
  82. package/src/cloudflare/bindings.ts +18 -17
  83. package/src/cloudflare/bound.ts +35 -18
  84. package/src/cloudflare/bucket.ts +5 -27
  85. package/src/cloudflare/compatibility-date.gen.ts +1 -1
  86. package/src/cloudflare/d1-database.ts +107 -100
  87. package/src/cloudflare/d1-local-migrations.ts +52 -0
  88. package/src/cloudflare/dispatch-namespace.ts +6 -25
  89. package/src/cloudflare/event-source.ts +3 -3
  90. package/src/cloudflare/hyperdrive.ts +4 -19
  91. package/src/cloudflare/index.ts +1 -0
  92. package/src/cloudflare/kv-namespace.ts +5 -28
  93. package/src/cloudflare/pipeline.ts +8 -27
  94. package/src/cloudflare/queue-consumer.ts +3 -3
  95. package/src/cloudflare/queue.ts +4 -22
  96. package/src/cloudflare/vectorize-index.ts +5 -27
  97. package/src/cloudflare/vectorize-metadata-index.ts +2 -2
  98. package/src/cloudflare/worker-ref.ts +51 -0
  99. package/src/cloudflare/worker.ts +16 -332
  100. package/src/cloudflare/wrangler.json.ts +1 -0
  101. package/src/cloudflare/zone.ts +9 -8
  102. package/src/state/cloudflare-state-store.ts +73 -54
  103. 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
- constructor(
47
- scope: Scope,
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(async (options: CloudflareStateStoreOptions) => {
91
- const scriptName = options.scriptName ?? "alchemy-state-service";
92
- const token =
93
- options.stateToken ??
94
- (await alchemy.secret.env(
95
- "ALCHEMY_STATE_TOKEN",
96
- undefined,
97
- "Missing token for DOStateStore. Please set ALCHEMY_STATE_TOKEN in the environment or set the `stateToken` option in the DOStateStore constructor.",
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
- const api = await createCloudflareApi(options);
101
- const [bundle, settings, subdomain] = await Promise.all([
102
- getInternalWorkerBundle("cloudflare-state-store"),
103
- getWorkerSettings(api, scriptName),
104
- getWorkerSubdomain(api, scriptName),
105
- ]);
106
- if (!settings || !settings.tags.includes(bundle.tag) || options.forceUpdate) {
107
- logger.log(
108
- `[CloudflareStateStore] ${settings ? "Updating" : "Creating"}...`,
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
- await putWorker(api, {
111
- workerName: scriptName,
112
- compatibilityDate: DEFAULT_COMPATIBILITY_DATE,
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;