diff --git a/packages/wrangler/templates/startDevWorker/ProxyWorker.ts b/packages/wrangler/templates/startDevWorker/ProxyWorker.ts index 2c9b37ea5086..2900a3a2ace9 100644 --- a/packages/wrangler/templates/startDevWorker/ProxyWorker.ts +++ b/packages/wrangler/templates/startDevWorker/ProxyWorker.ts @@ -39,8 +39,10 @@ export class ProxyWorker implements DurableObject { requestQueue: Array<{ request: Request; deferredResponse: DeferredPromise; + order: number; }> = []; + #counter = 0; fetch(request: Request) { if (isRequestForLiveReloadWebsocket(request)) { // requests for live-reload websocket @@ -57,7 +59,11 @@ export class ProxyWorker implements DurableObject { // regular requests to be proxied const deferredResponse = createDeferred(); - this.requestQueue.push({ request, deferredResponse }); + this.requestQueue.push({ + request, + deferredResponse, + order: this.#counter++, + }); this.processQueue(); return deferredResponse.promise; @@ -101,7 +107,13 @@ export class ProxyWorker implements DurableObject { const { proxyData } = this; // store proxyData at the moment this function was called if (proxyData === undefined) return; - for (const { request, deferredResponse } of this.requestQueue.splice(0)) { + const queue = this.requestQueue.splice(0); + + // we can't guarantee some requests won't get retried in a later batch + // but we can at least order the current batch + queue.sort((a, b) => a.order - b.order); + + for (const { request, deferredResponse, order } of queue) { const userWorkerUrl = new URL(request.url); const headers = new Headers(request.headers); @@ -161,7 +173,7 @@ export class ProxyWorker implements DurableObject { // if the request can be retried (subset of idempotent requests which have no body), requeue it else if (request.method === "GET" || request.method === "HEAD") { - this.requestQueue.unshift({ request, deferredResponse }); + this.requestQueue.unshift({ request, deferredResponse, order }); } // if the request cannot be retried, respond with 503 Service Unavailable