Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 9b8eb97

Browse files
authored
Use runtime shim for D1 (#628)
1 parent 7d4cab7 commit 9b8eb97

File tree

8 files changed

+763
-595
lines changed

8 files changed

+763
-595
lines changed

packages/miniflare/src/plugins/d1/index.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,27 @@ export const D1_PLUGIN: Plugin<
3030
sharedOptions: D1SharedOptionsSchema,
3131
getBindings(options) {
3232
const databases = namespaceEntries(options.d1Databases);
33-
return databases.map<Worker_Binding>(([name, id]) => ({
34-
name,
35-
service: { name: `${SERVICE_DATABASE_PREFIX}:${id}` },
36-
}));
33+
return databases.map<Worker_Binding>(([name, id]) => {
34+
const binding = name.startsWith("__D1_BETA__")
35+
? // Used before Wrangler 3.3
36+
{
37+
service: { name: `${SERVICE_DATABASE_PREFIX}:${id}` },
38+
}
39+
: // Used after Wrangler 3.3
40+
{
41+
wrapped: {
42+
moduleName: "cloudflare-internal:d1-api",
43+
innerBindings: [
44+
{
45+
name: "fetcher",
46+
service: { name: `${SERVICE_DATABASE_PREFIX}:${id}` },
47+
},
48+
],
49+
},
50+
};
51+
52+
return { name, ...binding };
53+
});
3754
},
3855
getServices({ options, sharedOptions }) {
3956
const persist = sharedOptions.d1Persist;

packages/miniflare/src/runtime/config/workerd.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ export type Worker_Binding_CryptoKey = (
134134
export interface Worker_Binding_WrappedBinding {
135135
moduleName?: string;
136136
entrypoint?: string;
137-
innerBinding?: Worker_Binding[];
137+
innerBindings?: Worker_Binding[];
138138
}
139139

140140
export type Worker_Binding_CryptoKey_Algorithm =
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# D1 Worker Fixture
22

33
Used by `test/plugins/d1/index.spec.ts`. Rebuild `worker.dist.mjs` by running
4-
the following in the `packages/tre` directory:
4+
the following in the `packages/miniflare` directory:
55

66
```shell
7-
$ npx wrangler publish --config test/fixtures/d1/wrangler.toml --dry-run --outdir dist
8-
$ mv test/fixtures/d1/dist/d1-beta-facade.entry.js test/fixtures/d1/worker.dist.mjs
7+
$ npx wrangler@3.2.0 publish --config test/fixtures/d1/wrangler.toml --dry-run --outdir dist
8+
$ mv test/fixtures/d1/dist/worker.js test/fixtures/d1/worker.dist.mjs
99
```
1010

11-
`wrangler` isn't included as a dependency as that would likely cause issues with
11+
`wrangler@3.2.0` isn't included as a dependency as it predates the moving of D1 out of Wrangler and into the runtime, which would have caused issues with
1212
different versions of Miniflare being installed.

packages/miniflare/test/fixtures/d1/worker.dist.mjs

Lines changed: 156 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,25 @@
1+
// ../../../../../../../../.npm/_npx/d6768b39ab4bfa9b/node_modules/wrangler/templates/middleware/common.ts
2+
var __facade_middleware__ = [];
3+
function __facade_register__(...args) {
4+
__facade_middleware__.push(...args.flat());
5+
}
6+
function __facade_invokeChain__(request, env, ctx, dispatch, middlewareChain) {
7+
const [head, ...tail] = middlewareChain;
8+
const middlewareCtx = {
9+
dispatch,
10+
next(newRequest, newEnv) {
11+
return __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail);
12+
}
13+
};
14+
return head(request, env, ctx, middlewareCtx);
15+
}
16+
function __facade_invoke__(request, env, ctx, dispatch, finalMiddleware) {
17+
return __facade_invokeChain__(request, env, ctx, dispatch, [
18+
...__facade_middleware__,
19+
finalMiddleware
20+
]);
21+
}
22+
123
// worker.mjs
224
async function requestJson(request) {
325
const text = await request.text();
@@ -69,8 +91,10 @@ var worker = {
6991
};
7092
var worker_default = worker;
7193

72-
// ../../../../../../../../../private/var/folders/jl/n6qj9gxn54b1yh4mqyxj1wz00000gp/T/tmp-20982-osS2JN1Tqwnq/d1-beta-facade.entry.js
73-
var define_D1_IMPORTS_default = ["__D1_BETA__DB"];
94+
// wrangler-config:config:middleware/d1-beta
95+
var D1_IMPORTS = ["__D1_BETA__DB"];
96+
97+
// ../../../../../../../../.npm/_npx/d6768b39ab4bfa9b/node_modules/wrangler/templates/middleware/middleware-d1-beta.ts
7498
var D1Database = class {
7599
constructor(binding) {
76100
this.binding = binding;
@@ -88,11 +112,11 @@ var D1Database = class {
88112
if (response.status !== 200) {
89113
try {
90114
const err = await response.json();
91-
throw new Error("D1_DUMP_ERROR", {
115+
throw new Error(`D1_DUMP_ERROR: ${err.error}`, {
92116
cause: new Error(err.error)
93117
});
94118
} catch (e) {
95-
throw new Error("D1_DUMP_ERROR", {
119+
throw new Error(`D1_DUMP_ERROR: Status + ${response.status}`, {
96120
cause: new Error("Status " + response.status)
97121
});
98122
}
@@ -115,11 +139,14 @@ var D1Database = class {
115139
return r.error ? 1 : 0;
116140
}).indexOf(1);
117141
if (error !== -1) {
118-
throw new Error("D1_EXEC_ERROR", {
119-
cause: new Error(
120-
"Error in line " + (error + 1) + ": " + lines[error] + ": " + exec[error].error
121-
)
122-
});
142+
throw new Error(
143+
`D1_EXEC_ERROR: Error in line ${error + 1}: ${lines[error]}: ${exec[error].error}`,
144+
{
145+
cause: new Error(
146+
"Error in line " + (error + 1) + ": " + lines[error] + ": " + exec[error].error
147+
)
148+
}
149+
);
123150
} else {
124151
return {
125152
count: exec.length,
@@ -149,50 +176,57 @@ var D1Database = class {
149176
const answer = await response.json();
150177
if (answer.error && dothrow) {
151178
const err = answer;
152-
throw new Error("D1_ERROR", { cause: new Error(err.error) });
179+
throw new Error(`D1_ERROR: ${err.error}`, {
180+
cause: new Error(err.error)
181+
});
153182
} else {
154183
return Array.isArray(answer) ? answer.map((r) => mapD1Result(r)) : mapD1Result(answer);
155184
}
156185
} catch (e) {
157-
throw new Error("D1_ERROR", {
158-
cause: new Error(e.cause || "Something went wrong")
186+
const error = e;
187+
throw new Error(`D1_ERROR: ${error.cause || "Something went wrong"}`, {
188+
cause: new Error(`${error.cause}` || "Something went wrong")
159189
});
160190
}
161191
}
162192
};
163193
var D1PreparedStatement = class {
164-
constructor(database, statement, values) {
194+
constructor(database, statement, params = []) {
165195
this.database = database;
166196
this.statement = statement;
167-
this.params = values || [];
197+
this.params = params;
168198
}
169199
bind(...values) {
170200
for (var r in values) {
171-
switch (typeof values[r]) {
201+
const value = values[r];
202+
switch (typeof value) {
172203
case "number":
173204
case "string":
174205
break;
175206
case "object":
176-
if (values[r] == null)
207+
if (value == null)
177208
break;
178-
if (Array.isArray(values[r]) && values[r].map((b) => {
209+
if (Array.isArray(value) && value.map((b) => {
179210
return typeof b == "number" && b >= 0 && b < 256 ? 1 : 0;
180211
}).indexOf(0) == -1)
181212
break;
182-
if (values[r] instanceof ArrayBuffer) {
183-
values[r] = Array.from(new Uint8Array(values[r]));
213+
if (value instanceof ArrayBuffer) {
214+
values[r] = Array.from(new Uint8Array(value));
184215
break;
185216
}
186-
if (ArrayBuffer.isView(values[r])) {
187-
values[r] = Array.from(values[r]);
217+
if (ArrayBuffer.isView(value)) {
218+
values[r] = Array.from(new Uint8Array(value.buffer));
188219
break;
189220
}
190221
default:
191-
throw new Error("D1_TYPE_ERROR", {
192-
cause: new Error(
193-
"Type '" + typeof values[r] + "' not supported for value '" + values[r] + "'"
194-
)
195-
});
222+
throw new Error(
223+
`D1_TYPE_ERROR: Type '${typeof value}' not supported for value '${value}'`,
224+
{
225+
cause: new Error(
226+
`Type '${typeof value}' not supported for value '${value}'`
227+
)
228+
}
229+
);
196230
}
197231
}
198232
return new D1PreparedStatement(this.database, this.statement, values);
@@ -204,7 +238,7 @@ var D1PreparedStatement = class {
204238
const results = info.results;
205239
if (colName !== void 0) {
206240
if (results.length > 0 && results[0][colName] === void 0) {
207-
throw new Error("D1_COLUMN_NOTFOUND", {
241+
throw new Error(`D1_COLUMN_NOTFOUND: Column not found (${colName})`, {
208242
cause: new Error("Column not found")
209243
});
210244
}
@@ -249,8 +283,6 @@ function mapD1Result(result) {
249283
result.error && (map.error = result.error);
250284
return map;
251285
}
252-
var D1_IMPORTS = define_D1_IMPORTS_default;
253-
var LOCAL_MODE = false;
254286
var D1_BETA_PREFIX = `__D1_BETA__`;
255287
var envMap = /* @__PURE__ */ new Map();
256288
function getMaskedEnv(env) {
@@ -262,29 +294,112 @@ function getMaskedEnv(env) {
262294
).forEach((bindingName) => {
263295
newEnv.delete(bindingName);
264296
const newName = bindingName.slice(D1_BETA_PREFIX.length);
265-
const newBinding = !LOCAL_MODE ? new D1Database(env[bindingName]) : env[bindingName];
297+
const newBinding = new D1Database(env[bindingName]);
266298
newEnv.set(newName, newBinding);
267299
});
268300
const newEnvObj = Object.fromEntries(newEnv.entries());
269301
envMap.set(env, newEnvObj);
270302
return newEnvObj;
271303
}
272-
var shim_default = {
304+
function wrap(env) {
305+
return getMaskedEnv(env);
306+
}
307+
308+
// ../../../../../../../../../../private/var/folders/xn/jl0lmfkx5gd06w3_bl12w1l00000gp/T/tmp-33052-rnZHsh2hk8Bc/middleware-insertion-facade.js
309+
var envWrappers = [wrap].filter(Boolean);
310+
var facade = {
273311
...worker_default,
274-
async fetch(request, env, ctx) {
275-
return worker_default.fetch(request, getMaskedEnv(env), ctx);
312+
envWrappers,
313+
middleware: [
314+
void 0,
315+
...worker_default.middleware ? worker_default.middleware : []
316+
].filter(Boolean)
317+
};
318+
var middleware_insertion_facade_default = facade;
319+
320+
// ../../../../../../../../../../private/var/folders/xn/jl0lmfkx5gd06w3_bl12w1l00000gp/T/tmp-33052-rnZHsh2hk8Bc/middleware-loader.entry.ts
321+
var __Facade_ScheduledController__ = class {
322+
constructor(scheduledTime, cron, noRetry) {
323+
this.scheduledTime = scheduledTime;
324+
this.cron = cron;
325+
this.#noRetry = noRetry;
326+
}
327+
#noRetry;
328+
noRetry() {
329+
if (!(this instanceof __Facade_ScheduledController__)) {
330+
throw new TypeError("Illegal invocation");
331+
}
332+
this.#noRetry();
333+
}
334+
};
335+
var __facade_modules_fetch__ = function(request, env, ctx) {
336+
if (middleware_insertion_facade_default.fetch === void 0)
337+
throw new Error("Handler does not export a fetch() function.");
338+
return middleware_insertion_facade_default.fetch(request, env, ctx);
339+
};
340+
function getMaskedEnv2(rawEnv) {
341+
let env = rawEnv;
342+
if (middleware_insertion_facade_default.envWrappers && middleware_insertion_facade_default.envWrappers.length > 0) {
343+
for (const wrapFn of middleware_insertion_facade_default.envWrappers) {
344+
env = wrapFn(env);
345+
}
346+
}
347+
return env;
348+
}
349+
var registeredMiddleware = false;
350+
var facade2 = {
351+
...middleware_insertion_facade_default.tail && {
352+
tail: maskHandlerEnv(middleware_insertion_facade_default.tail)
276353
},
277-
async queue(batch, env, ctx) {
278-
return worker_default.queue(batch, getMaskedEnv(env), ctx);
354+
...middleware_insertion_facade_default.trace && {
355+
trace: maskHandlerEnv(middleware_insertion_facade_default.trace)
279356
},
280-
async scheduled(controller, env, ctx) {
281-
return worker_default.scheduled(controller, getMaskedEnv(env), ctx);
357+
...middleware_insertion_facade_default.scheduled && {
358+
scheduled: maskHandlerEnv(middleware_insertion_facade_default.scheduled)
282359
},
283-
async trace(traces, env, ctx) {
284-
return worker_default.trace(traces, getMaskedEnv(env), ctx);
360+
...middleware_insertion_facade_default.queue && {
361+
queue: maskHandlerEnv(middleware_insertion_facade_default.queue)
362+
},
363+
...middleware_insertion_facade_default.test && {
364+
test: maskHandlerEnv(middleware_insertion_facade_default.test)
365+
},
366+
fetch(request, rawEnv, ctx) {
367+
const env = getMaskedEnv2(rawEnv);
368+
if (middleware_insertion_facade_default.middleware && middleware_insertion_facade_default.middleware.length > 0) {
369+
if (!registeredMiddleware) {
370+
registeredMiddleware = true;
371+
for (const middleware of middleware_insertion_facade_default.middleware) {
372+
__facade_register__(middleware);
373+
}
374+
}
375+
const __facade_modules_dispatch__ = function(type, init) {
376+
if (type === "scheduled" && middleware_insertion_facade_default.scheduled !== void 0) {
377+
const controller = new __Facade_ScheduledController__(
378+
Date.now(),
379+
init.cron ?? "",
380+
() => {
381+
}
382+
);
383+
return middleware_insertion_facade_default.scheduled(controller, env, ctx);
384+
}
385+
};
386+
return __facade_invoke__(
387+
request,
388+
env,
389+
ctx,
390+
__facade_modules_dispatch__,
391+
__facade_modules_fetch__
392+
);
393+
} else {
394+
return __facade_modules_fetch__(request, env, ctx);
395+
}
285396
}
286397
};
398+
function maskHandlerEnv(handler) {
399+
return (data, env, ctx) => handler(data, getMaskedEnv2(env), ctx);
400+
}
401+
var middleware_loader_entry_default = facade2;
287402
export {
288-
shim_default as default
403+
middleware_loader_entry_default as default
289404
};
290-
//# sourceMappingURL=d1-beta-facade.entry.js.map
405+
//# sourceMappingURL=worker.js.map

0 commit comments

Comments
 (0)