Skip to content

Commit

Permalink
Check if middleware is an array (#5703)
Browse files Browse the repository at this point in the history
  • Loading branch information
penalosa authored May 24, 2024
1 parent 5bf0a6b commit a905f31
Show file tree
Hide file tree
Showing 5 changed files with 180 additions and 163 deletions.
5 changes: 5 additions & 0 deletions .changeset/funny-drinks-destroy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"wrangler": patch
---

fix: Don't use `ExportedHandler["middleware"]` for injecting middleware
291 changes: 150 additions & 141 deletions packages/wrangler/src/__tests__/middleware.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,9 @@ describe("middleware", () => {
const text = await response.text();
return new Response(text + ' world');
}
export const __INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__ = [middleware]
export default {
middleware: [middleware],
fetch(request, env, ctx) {
return new Response('Hello');
}
Expand Down Expand Up @@ -72,8 +73,9 @@ describe("middleware", () => {
await middlewareCtx.dispatch("scheduled", { cron: "* * * * *" });
return new Response("OK");
}
export const __INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__ = [middleware]
export default {
middleware: [middleware],
scheduled(controller, env, ctx) {
// Scheduled worker called
}
Expand Down Expand Up @@ -108,8 +110,9 @@ describe("middleware", () => {
return new Response(e.message);
}
}
export const __INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__ = [middleware]
export default {
middleware: [middleware],
scheduled(controller, env, ctx) {
throw new Error("Error in scheduled worker");
}
Expand Down Expand Up @@ -300,8 +303,9 @@ describe("middleware", () => {

it("should return hello world with empty middleware array", async () => {
const scriptContent = `
export const __INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__ = []
export default {
middleware: [],
fetch() {
return new Response("Hello world");
}
Expand Down Expand Up @@ -331,8 +335,9 @@ describe("middleware", () => {
const middleware = async (request, env, _ctx, middlewareCtx) => {
return middlewareCtx.next(request, env);
}
export const __INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__ = [middleware]
export default {
middleware: [middleware],
fetch(request, env, ctx) {
return new Response("Hello world");
}
Expand Down Expand Up @@ -364,8 +369,9 @@ describe("middleware", () => {
const middleware2 = async (request, env, _ctx, middlewareCtx) => {
return middlewareCtx.next(request, env);
}
export const __INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__ = [middleware, middleware2]
export default {
middleware: [middleware, middleware2],
fetch() {
return new Response("Hello world");
}
Expand Down Expand Up @@ -395,8 +401,9 @@ describe("middleware", () => {
const middleware = async (request, env, _ctx, middlewareCtx) => {
return middlewareCtx.next(request, env);
}
export const __INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__ = [middleware]
export default {
middleware: [middleware],
fetch() {
return new Response("Hello world", { status: 500, headers: { "x-test": "test" } });
}
Expand Down Expand Up @@ -430,8 +437,10 @@ describe("middleware", () => {
const middleware = async (request, env, _ctx, middlewareCtx) => {
return middlewareCtx.next(request, env);
}
export const __INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__ = [middleware]
export default {
middleware: [middleware],
async fetch(request, env, ctx) {
let count = 0;
ctx.waitUntil(new Promise(resolve => {
Expand Down Expand Up @@ -852,145 +861,145 @@ describe("middleware", () => {
.replace(/\/\/ .*/g, "")
.trim()
).toMatchInlineSnapshot(`
"var src_default = {
async fetch(request, env) {
return Response.json(env);
}
};
var DurableObjectExample = class {
constructor(state, env) {
}
async fetch(request) {
return new Response(\\"Hello World\\");
}
};
"var src_default = {
async fetch(request, env) {
return Response.json(env);
}
};
var DurableObjectExample = class {
constructor(state, env) {
}
async fetch(request) {
return new Response(\\"Hello World\\");
}
};
src_default.middleware = [
,
...src_default.middleware ?? []
].filter(Boolean);
var middleware_insertion_facade_default = src_default;
var __INTERNAL_WRANGLER_MIDDLEWARE__ = [
...void 0 ?? []
];
var middleware_insertion_facade_default = src_default;
var __facade_middleware__ = [];
function __facade_register__(...args) {
__facade_middleware__.push(...args.flat());
}
function __facade_invokeChain__(request, env, ctx, dispatch, middlewareChain) {
const [head, ...tail] = middlewareChain;
const middlewareCtx = {
dispatch,
next(newRequest, newEnv) {
return __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail);
}
};
return head(request, env, ctx, middlewareCtx);
}
function __facade_invoke__(request, env, ctx, dispatch, finalMiddleware) {
return __facade_invokeChain__(request, env, ctx, dispatch, [
...__facade_middleware__,
finalMiddleware
]);
}
var __facade_middleware__ = [];
function __facade_register__(...args) {
__facade_middleware__.push(...args.flat());
}
function __facade_invokeChain__(request, env, ctx, dispatch, middlewareChain) {
const [head, ...tail] = middlewareChain;
const middlewareCtx = {
dispatch,
next(newRequest, newEnv) {
return __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail);
}
};
return head(request, env, ctx, middlewareCtx);
}
function __facade_invoke__(request, env, ctx, dispatch, finalMiddleware) {
return __facade_invokeChain__(request, env, ctx, dispatch, [
...__facade_middleware__,
finalMiddleware
]);
}
var __Facade_ScheduledController__ = class {
constructor(scheduledTime, cron, noRetry) {
this.scheduledTime = scheduledTime;
this.cron = cron;
this.#noRetry = noRetry;
}
#noRetry;
noRetry() {
if (!(this instanceof __Facade_ScheduledController__)) {
throw new TypeError(\\"Illegal invocation\\");
}
this.#noRetry();
}
};
function wrapExportedHandler(worker) {
if (worker.middleware === void 0 || worker.middleware.length === 0) {
return worker;
}
for (const middleware of worker.middleware) {
__facade_register__(middleware);
}
const fetchDispatcher = function(request, env, ctx) {
if (worker.fetch === void 0) {
throw new Error(\\"Handler does not export a fetch() function.\\");
}
return worker.fetch(request, env, ctx);
};
return {
...worker,
fetch(request, env, ctx) {
const dispatcher = function(type, init) {
if (type === \\"scheduled\\" && worker.scheduled !== void 0) {
const controller = new __Facade_ScheduledController__(
Date.now(),
init.cron ?? \\"\\",
() => {
}
);
return worker.scheduled(controller, env, ctx);
}
};
return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher);
}
};
}
function wrapWorkerEntrypoint(klass) {
if (klass.middleware === void 0 || klass.middleware.length === 0) {
return klass;
}
for (const middleware of klass.middleware) {
__facade_register__(middleware);
}
return class extends klass {
#fetchDispatcher = (request, env, ctx) => {
this.env = env;
this.ctx = ctx;
if (super.fetch === void 0) {
throw new Error(\\"Entrypoint class does not define a fetch() function.\\");
}
return super.fetch(request);
};
#dispatcher = (type, init) => {
if (type === \\"scheduled\\" && super.scheduled !== void 0) {
const controller = new __Facade_ScheduledController__(
Date.now(),
init.cron ?? \\"\\",
() => {
}
);
return super.scheduled(controller);
}
};
fetch(request) {
return __facade_invoke__(
request,
this.env,
this.ctx,
this.#dispatcher,
this.#fetchDispatcher
);
}
};
}
var WRAPPED_ENTRY;
if (typeof middleware_insertion_facade_default === \\"object\\") {
WRAPPED_ENTRY = wrapExportedHandler(middleware_insertion_facade_default);
} else if (typeof middleware_insertion_facade_default === \\"function\\") {
WRAPPED_ENTRY = wrapWorkerEntrypoint(middleware_insertion_facade_default);
}
var middleware_loader_entry_default = WRAPPED_ENTRY;
export {
DurableObjectExample,
middleware_loader_entry_default as default
};
//# sourceMappingURL=index.js.map"
`);
var __Facade_ScheduledController__ = class {
constructor(scheduledTime, cron, noRetry) {
this.scheduledTime = scheduledTime;
this.cron = cron;
this.#noRetry = noRetry;
}
#noRetry;
noRetry() {
if (!(this instanceof __Facade_ScheduledController__)) {
throw new TypeError(\\"Illegal invocation\\");
}
this.#noRetry();
}
};
function wrapExportedHandler(worker) {
if (__INTERNAL_WRANGLER_MIDDLEWARE__ === void 0 || __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0) {
return worker;
}
for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {
__facade_register__(middleware);
}
const fetchDispatcher = function(request, env, ctx) {
if (worker.fetch === void 0) {
throw new Error(\\"Handler does not export a fetch() function.\\");
}
return worker.fetch(request, env, ctx);
};
return {
...worker,
fetch(request, env, ctx) {
const dispatcher = function(type, init) {
if (type === \\"scheduled\\" && worker.scheduled !== void 0) {
const controller = new __Facade_ScheduledController__(
Date.now(),
init.cron ?? \\"\\",
() => {
}
);
return worker.scheduled(controller, env, ctx);
}
};
return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher);
}
};
}
function wrapWorkerEntrypoint(klass) {
if (__INTERNAL_WRANGLER_MIDDLEWARE__ === void 0 || __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0) {
return klass;
}
for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {
__facade_register__(middleware);
}
return class extends klass {
#fetchDispatcher = (request, env, ctx) => {
this.env = env;
this.ctx = ctx;
if (super.fetch === void 0) {
throw new Error(\\"Entrypoint class does not define a fetch() function.\\");
}
return super.fetch(request);
};
#dispatcher = (type, init) => {
if (type === \\"scheduled\\" && super.scheduled !== void 0) {
const controller = new __Facade_ScheduledController__(
Date.now(),
init.cron ?? \\"\\",
() => {
}
);
return super.scheduled(controller);
}
};
fetch(request) {
return __facade_invoke__(
request,
this.env,
this.ctx,
this.#dispatcher,
this.#fetchDispatcher
);
}
};
}
var WRAPPED_ENTRY;
if (typeof middleware_insertion_facade_default === \\"object\\") {
WRAPPED_ENTRY = wrapExportedHandler(middleware_insertion_facade_default);
} else if (typeof middleware_insertion_facade_default === \\"function\\") {
WRAPPED_ENTRY = wrapWorkerEntrypoint(middleware_insertion_facade_default);
}
var middleware_loader_entry_default = WRAPPED_ENTRY;
export {
DurableObjectExample,
__INTERNAL_WRANGLER_MIDDLEWARE__,
middleware_loader_entry_default as default
};
//# sourceMappingURL=index.js.map"
`);
});
it("should respond correctly with D1 databases, scheduled testing, and formatted dev errors", async () => {
// Kitchen sink test to check interaction between multiple middlewares
Expand Down
Loading

0 comments on commit a905f31

Please sign in to comment.