wrangler 0.0.0-e8a2a1d9 → 0.0.0-e8aaa3930
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/README.md +26 -38
- package/bin/wrangler.js +0 -28
- package/config-schema.json +3297 -0
- package/package.json +69 -103
- package/templates/checked-fetch.js +1 -1
- package/templates/facade.d.ts +7 -5
- package/templates/gitignore +2 -4
- package/templates/init-tests/test-vitest-new-worker.js +1 -1
- package/templates/init-tests/test-vitest-new-worker.ts +3 -3
- package/templates/middleware/loader-modules.ts +92 -95
- package/templates/middleware/loader-sw.ts +4 -3
- package/templates/middleware/middleware-ensure-req-body-drained.ts +18 -0
- package/templates/middleware/middleware-miniflare3-json-error.ts +0 -1
- package/templates/middleware/middleware-mock-analytics-engine.d.ts +3 -0
- package/templates/middleware/middleware-mock-analytics-engine.ts +30 -0
- package/templates/middleware/middleware-patch-console-prefix.d.ts +3 -0
- package/templates/middleware/middleware-patch-console-prefix.ts +21 -0
- package/templates/middleware/middleware-scheduled.ts +15 -1
- package/templates/middleware/middleware-serve-static-assets.ts +7 -7
- package/templates/pages-dev-pipeline.ts +2 -1
- package/templates/pages-template-plugin.ts +2 -2
- package/templates/pages-template-worker.ts +1 -1
- package/templates/startDevWorker/InspectorProxyWorker.ts +17 -5
- package/templates/startDevWorker/ProxyWorker.ts +148 -64
- package/templates/tsconfig.init.json +4 -87
- package/wrangler-dist/InspectorProxyWorker.js +4 -0
- package/wrangler-dist/InspectorProxyWorker.js.map +1 -1
- package/wrangler-dist/ProxyWorker.js +103 -48
- package/wrangler-dist/ProxyWorker.js.map +1 -1
- package/wrangler-dist/cli.d.ts +3983 -787
- package/wrangler-dist/cli.js +151565 -142032
- package/Cloudflare_CA.pem +0 -18
- package/templates/middleware/middleware-d1-beta.d.ts +0 -3
- package/templates/middleware/middleware-multiworker-dev.d.ts +0 -4
- package/templates/middleware/middleware-multiworker-dev.ts +0 -68
- package/wrangler-dist/wasm-sync.wasm +0 -0
|
@@ -15,6 +15,11 @@ function createDeferred(previousDeferred) {
|
|
|
15
15
|
reject
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
+
function urlFromParts(parts, base = "http://localhost") {
|
|
19
|
+
const url = new URL(base);
|
|
20
|
+
Object.assign(url, parts);
|
|
21
|
+
return url;
|
|
22
|
+
}
|
|
18
23
|
|
|
19
24
|
// templates/startDevWorker/ProxyWorker.ts
|
|
20
25
|
var LIVE_RELOAD_PROTOCOL = "WRANGLER_PROXYWORKER_LIVE_RELOAD_PROTOCOL";
|
|
@@ -32,6 +37,7 @@ var ProxyWorker = class {
|
|
|
32
37
|
}
|
|
33
38
|
proxyData;
|
|
34
39
|
requestQueue = /* @__PURE__ */ new Map();
|
|
40
|
+
requestRetryQueue = /* @__PURE__ */ new Map();
|
|
35
41
|
fetch(request) {
|
|
36
42
|
if (isRequestForLiveReloadWebsocket(request)) {
|
|
37
43
|
return this.handleLiveReloadWebSocket(request);
|
|
@@ -68,20 +74,39 @@ var ProxyWorker = class {
|
|
|
68
74
|
}
|
|
69
75
|
return new Response(null, { status: 204 });
|
|
70
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Process requests that are being retried first, then process newer requests.
|
|
79
|
+
* Requests that are being retried are, by definition, older than requests which haven't been processed yet.
|
|
80
|
+
* We don't need to be more accurate than this re ordering, since the requests are being fired off synchronously.
|
|
81
|
+
*/
|
|
82
|
+
*getOrderedQueue() {
|
|
83
|
+
yield* this.requestRetryQueue;
|
|
84
|
+
yield* this.requestQueue;
|
|
85
|
+
}
|
|
71
86
|
processQueue() {
|
|
72
87
|
const { proxyData } = this;
|
|
73
88
|
if (proxyData === void 0)
|
|
74
89
|
return;
|
|
75
|
-
for (const [request, deferredResponse] of this.
|
|
90
|
+
for (const [request, deferredResponse] of this.getOrderedQueue()) {
|
|
91
|
+
this.requestRetryQueue.delete(request);
|
|
76
92
|
this.requestQueue.delete(request);
|
|
77
|
-
const
|
|
93
|
+
const outerUrl = new URL(request.url);
|
|
78
94
|
const headers = new Headers(request.headers);
|
|
95
|
+
const userWorkerUrl = new URL(request.url);
|
|
79
96
|
Object.assign(userWorkerUrl, proxyData.userWorkerUrl);
|
|
80
|
-
const innerUrl =
|
|
81
|
-
|
|
97
|
+
const innerUrl = urlFromParts(
|
|
98
|
+
proxyData.userWorkerInnerUrlOverrides ?? {},
|
|
99
|
+
request.url
|
|
100
|
+
);
|
|
82
101
|
headers.set("MF-Original-URL", innerUrl.href);
|
|
83
102
|
headers.set("MF-Disable-Pretty-Error", "true");
|
|
103
|
+
const encoding = request.cf?.clientAcceptEncoding;
|
|
104
|
+
if (encoding !== void 0)
|
|
105
|
+
headers.set("Accept-Encoding", encoding);
|
|
106
|
+
rewriteUrlRelatedHeaders(headers, outerUrl, innerUrl);
|
|
84
107
|
for (const [key, value] of Object.entries(proxyData.headers ?? {})) {
|
|
108
|
+
if (value === void 0)
|
|
109
|
+
continue;
|
|
85
110
|
if (key.toLowerCase() === "cookie") {
|
|
86
111
|
const existing = request.headers.get("cookie") ?? "";
|
|
87
112
|
headers.set("cookie", `${existing};${value}`);
|
|
@@ -90,21 +115,38 @@ var ProxyWorker = class {
|
|
|
90
115
|
}
|
|
91
116
|
}
|
|
92
117
|
void fetch(userWorkerUrl, new Request(request, { headers })).then((res) => {
|
|
118
|
+
res = new Response(res.body, res);
|
|
119
|
+
rewriteUrlRelatedHeaders(res.headers, innerUrl, outerUrl);
|
|
93
120
|
if (isHtmlResponse(res)) {
|
|
94
121
|
res = insertLiveReloadScript(request, res, this.env, proxyData);
|
|
95
122
|
}
|
|
96
123
|
deferredResponse.resolve(res);
|
|
97
124
|
}).catch((error) => {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
125
|
+
const newUserWorkerUrl = this.proxyData && urlFromParts(this.proxyData.userWorkerUrl);
|
|
126
|
+
if (userWorkerUrl.href === newUserWorkerUrl?.href) {
|
|
127
|
+
void sendMessageToProxyController(this.env, {
|
|
128
|
+
type: "error",
|
|
129
|
+
error: {
|
|
130
|
+
name: error.name,
|
|
131
|
+
message: error.message,
|
|
132
|
+
stack: error.stack,
|
|
133
|
+
cause: error.cause
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
deferredResponse.reject(error);
|
|
137
|
+
} else if (request.method === "GET" || request.method === "HEAD") {
|
|
138
|
+
this.requestRetryQueue.set(request, deferredResponse);
|
|
139
|
+
} else {
|
|
140
|
+
deferredResponse.resolve(
|
|
141
|
+
new Response(
|
|
142
|
+
"Your worker restarted mid-request. Please try sending the request again. Only GET or HEAD requests are retried automatically.",
|
|
143
|
+
{
|
|
144
|
+
status: 503,
|
|
145
|
+
headers: { "Retry-After": "0" }
|
|
146
|
+
}
|
|
147
|
+
)
|
|
148
|
+
);
|
|
149
|
+
}
|
|
108
150
|
});
|
|
109
151
|
}
|
|
110
152
|
}
|
|
@@ -120,18 +162,11 @@ function isRequestForLiveReloadWebsocket(req) {
|
|
|
120
162
|
const isWebSocketUpgrade = req.headers.get("Upgrade") === "websocket";
|
|
121
163
|
return isWebSocketUpgrade && websocketProtocol === LIVE_RELOAD_PROTOCOL;
|
|
122
164
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
});
|
|
129
|
-
} catch (cause) {
|
|
130
|
-
if (retries > 0) {
|
|
131
|
-
return sendMessageToProxyController(env, message, retries - 1);
|
|
132
|
-
}
|
|
133
|
-
throw cause;
|
|
134
|
-
}
|
|
165
|
+
function sendMessageToProxyController(env, message) {
|
|
166
|
+
return env.PROXY_CONTROLLER.fetch("http://dummy", {
|
|
167
|
+
method: "POST",
|
|
168
|
+
body: JSON.stringify(message)
|
|
169
|
+
});
|
|
135
170
|
}
|
|
136
171
|
function insertLiveReloadScript(request, response, env, proxyData) {
|
|
137
172
|
const htmlRewriter = new HTMLRewriter();
|
|
@@ -152,33 +187,53 @@ function insertLiveReloadScript(request, response, env, proxyData) {
|
|
|
152
187
|
if (proxyData.liveReload) {
|
|
153
188
|
const websocketUrl = new URL(request.url);
|
|
154
189
|
websocketUrl.protocol = websocketUrl.protocol === "http:" ? "ws:" : "wss:";
|
|
155
|
-
end.append(
|
|
156
|
-
`
|
|
157
|
-
<script>
|
|
158
|
-
(function() {
|
|
159
|
-
var ws;
|
|
160
|
-
function recover() {
|
|
161
|
-
ws = null;
|
|
162
|
-
setTimeout(initLiveReload, 100);
|
|
163
|
-
}
|
|
164
|
-
function initLiveReload() {
|
|
165
|
-
if (ws) return;
|
|
166
|
-
var origin = (location.protocol === "http:" ? "ws://" : "wss://") + location.host;
|
|
167
|
-
ws = new WebSocket(origin + "/cdn-cgi/live-reload", "${LIVE_RELOAD_PROTOCOL}");
|
|
168
|
-
ws.onclose = recover;
|
|
169
|
-
ws.onerror = recover;
|
|
170
|
-
ws.onmessage = location.reload.bind(location);
|
|
171
|
-
}
|
|
172
|
-
})();
|
|
173
|
-
</script>
|
|
174
|
-
`,
|
|
175
|
-
{ html: true }
|
|
176
|
-
);
|
|
190
|
+
end.append(liveReloadScript, { html: true });
|
|
177
191
|
}
|
|
178
192
|
}
|
|
179
193
|
});
|
|
180
194
|
return htmlRewriter.transform(response);
|
|
181
195
|
}
|
|
196
|
+
var liveReloadScript = `
|
|
197
|
+
<script defer type="application/javascript">
|
|
198
|
+
(function() {
|
|
199
|
+
var ws;
|
|
200
|
+
function recover() {
|
|
201
|
+
ws = null;
|
|
202
|
+
setTimeout(initLiveReload, 100);
|
|
203
|
+
}
|
|
204
|
+
function initLiveReload() {
|
|
205
|
+
if (ws) return;
|
|
206
|
+
var origin = (location.protocol === "http:" ? "ws://" : "wss://") + location.host;
|
|
207
|
+
ws = new WebSocket(origin + "/cdn-cgi/live-reload", "${LIVE_RELOAD_PROTOCOL}");
|
|
208
|
+
ws.onclose = recover;
|
|
209
|
+
ws.onerror = recover;
|
|
210
|
+
ws.onmessage = location.reload.bind(location);
|
|
211
|
+
}
|
|
212
|
+
initLiveReload();
|
|
213
|
+
})();
|
|
214
|
+
</script>
|
|
215
|
+
`;
|
|
216
|
+
function rewriteUrlRelatedHeaders(headers, from, to) {
|
|
217
|
+
const setCookie = headers.getAll("Set-Cookie");
|
|
218
|
+
headers.delete("Set-Cookie");
|
|
219
|
+
headers.forEach((value, key) => {
|
|
220
|
+
if (typeof value === "string" && value.includes(from.host)) {
|
|
221
|
+
headers.set(
|
|
222
|
+
key,
|
|
223
|
+
value.replaceAll(from.origin, to.origin).replaceAll(from.host, to.host)
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
for (const cookie of setCookie) {
|
|
228
|
+
headers.append(
|
|
229
|
+
"Set-Cookie",
|
|
230
|
+
cookie.replace(
|
|
231
|
+
new RegExp(`Domain=${from.hostname}($|;|,)`),
|
|
232
|
+
`Domain=${to.hostname}$1`
|
|
233
|
+
)
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
182
237
|
export {
|
|
183
238
|
ProxyWorker,
|
|
184
239
|
ProxyWorker_default as default
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/api/startDevWorker/utils.ts", "../templates/startDevWorker/ProxyWorker.ts"],
|
|
4
|
-
"mappings": ";AAAA,OAAO,YAAY;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|