wrangler 0.0.0-e5cdd7fa → 0.0.0-e5dbedd78
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 +30 -38
- package/bin/wrangler.js +1 -35
- package/config-schema.json +2278 -0
- package/package.json +71 -107
- 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.ts +2 -2
- package/templates/middleware/loader-modules.ts +92 -94
- 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/pages-dev-pipeline.ts +3 -2
- package/templates/pages-template-plugin.ts +2 -2
- package/templates/pages-template-worker.ts +1 -1
- package/templates/startDevWorker/InspectorProxyWorker.ts +4 -1
- package/templates/startDevWorker/ProxyWorker.ts +143 -59
- package/templates/tsconfig.init.json +4 -87
- package/templates/tsconfig.json +8 -1
- package/templates/tsconfig.tsbuildinfo +1 -0
- package/wrangler-dist/InspectorProxyWorker.js +4 -8
- package/wrangler-dist/InspectorProxyWorker.js.map +1 -1
- package/wrangler-dist/ProxyWorker.js +102 -50
- package/wrangler-dist/ProxyWorker.js.map +1 -1
- package/wrangler-dist/cli.d.ts +3896 -1053
- package/wrangler-dist/cli.js +131879 -146752
- 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/templates/middleware/middleware-serve-static-assets.d.ts +0 -6
- package/templates/middleware/middleware-serve-static-assets.ts +0 -56
- 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,36 @@ 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
|
-
if (proxyData === void 0)
|
|
74
|
-
|
|
75
|
-
|
|
88
|
+
if (proxyData === void 0) return;
|
|
89
|
+
for (const [request, deferredResponse] of this.getOrderedQueue()) {
|
|
90
|
+
this.requestRetryQueue.delete(request);
|
|
76
91
|
this.requestQueue.delete(request);
|
|
77
|
-
const
|
|
92
|
+
const outerUrl = new URL(request.url);
|
|
78
93
|
const headers = new Headers(request.headers);
|
|
94
|
+
const userWorkerUrl = new URL(request.url);
|
|
79
95
|
Object.assign(userWorkerUrl, proxyData.userWorkerUrl);
|
|
80
|
-
const innerUrl =
|
|
81
|
-
|
|
96
|
+
const innerUrl = urlFromParts(
|
|
97
|
+
proxyData.userWorkerInnerUrlOverrides ?? {},
|
|
98
|
+
request.url
|
|
99
|
+
);
|
|
82
100
|
headers.set("MF-Original-URL", innerUrl.href);
|
|
83
101
|
headers.set("MF-Disable-Pretty-Error", "true");
|
|
102
|
+
const encoding = request.cf?.clientAcceptEncoding;
|
|
103
|
+
if (encoding !== void 0) headers.set("Accept-Encoding", encoding);
|
|
104
|
+
rewriteUrlRelatedHeaders(headers, outerUrl, innerUrl);
|
|
84
105
|
for (const [key, value] of Object.entries(proxyData.headers ?? {})) {
|
|
106
|
+
if (value === void 0) continue;
|
|
85
107
|
if (key.toLowerCase() === "cookie") {
|
|
86
108
|
const existing = request.headers.get("cookie") ?? "";
|
|
87
109
|
headers.set("cookie", `${existing};${value}`);
|
|
@@ -90,21 +112,38 @@ var ProxyWorker = class {
|
|
|
90
112
|
}
|
|
91
113
|
}
|
|
92
114
|
void fetch(userWorkerUrl, new Request(request, { headers })).then((res) => {
|
|
115
|
+
res = new Response(res.body, res);
|
|
116
|
+
rewriteUrlRelatedHeaders(res.headers, innerUrl, outerUrl);
|
|
93
117
|
if (isHtmlResponse(res)) {
|
|
94
118
|
res = insertLiveReloadScript(request, res, this.env, proxyData);
|
|
95
119
|
}
|
|
96
120
|
deferredResponse.resolve(res);
|
|
97
121
|
}).catch((error) => {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
122
|
+
const newUserWorkerUrl = this.proxyData && urlFromParts(this.proxyData.userWorkerUrl);
|
|
123
|
+
if (userWorkerUrl.href === newUserWorkerUrl?.href) {
|
|
124
|
+
void sendMessageToProxyController(this.env, {
|
|
125
|
+
type: "error",
|
|
126
|
+
error: {
|
|
127
|
+
name: error.name,
|
|
128
|
+
message: error.message,
|
|
129
|
+
stack: error.stack,
|
|
130
|
+
cause: error.cause
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
deferredResponse.reject(error);
|
|
134
|
+
} else if (request.method === "GET" || request.method === "HEAD") {
|
|
135
|
+
this.requestRetryQueue.set(request, deferredResponse);
|
|
136
|
+
} else {
|
|
137
|
+
deferredResponse.resolve(
|
|
138
|
+
new Response(
|
|
139
|
+
"Your worker restarted mid-request. Please try sending the request again. Only GET or HEAD requests are retried automatically.",
|
|
140
|
+
{
|
|
141
|
+
status: 503,
|
|
142
|
+
headers: { "Retry-After": "0" }
|
|
143
|
+
}
|
|
144
|
+
)
|
|
145
|
+
);
|
|
146
|
+
}
|
|
108
147
|
});
|
|
109
148
|
}
|
|
110
149
|
}
|
|
@@ -120,18 +159,11 @@ function isRequestForLiveReloadWebsocket(req) {
|
|
|
120
159
|
const isWebSocketUpgrade = req.headers.get("Upgrade") === "websocket";
|
|
121
160
|
return isWebSocketUpgrade && websocketProtocol === LIVE_RELOAD_PROTOCOL;
|
|
122
161
|
}
|
|
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
|
-
}
|
|
162
|
+
function sendMessageToProxyController(env, message) {
|
|
163
|
+
return env.PROXY_CONTROLLER.fetch("http://dummy", {
|
|
164
|
+
method: "POST",
|
|
165
|
+
body: JSON.stringify(message)
|
|
166
|
+
});
|
|
135
167
|
}
|
|
136
168
|
function insertLiveReloadScript(request, response, env, proxyData) {
|
|
137
169
|
const htmlRewriter = new HTMLRewriter();
|
|
@@ -152,33 +184,53 @@ function insertLiveReloadScript(request, response, env, proxyData) {
|
|
|
152
184
|
if (proxyData.liveReload) {
|
|
153
185
|
const websocketUrl = new URL(request.url);
|
|
154
186
|
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
|
-
);
|
|
187
|
+
end.append(liveReloadScript, { html: true });
|
|
177
188
|
}
|
|
178
189
|
}
|
|
179
190
|
});
|
|
180
191
|
return htmlRewriter.transform(response);
|
|
181
192
|
}
|
|
193
|
+
var liveReloadScript = `
|
|
194
|
+
<script defer type="application/javascript">
|
|
195
|
+
(function() {
|
|
196
|
+
var ws;
|
|
197
|
+
function recover() {
|
|
198
|
+
ws = null;
|
|
199
|
+
setTimeout(initLiveReload, 100);
|
|
200
|
+
}
|
|
201
|
+
function initLiveReload() {
|
|
202
|
+
if (ws) return;
|
|
203
|
+
var origin = (location.protocol === "http:" ? "ws://" : "wss://") + location.host;
|
|
204
|
+
ws = new WebSocket(origin + "/cdn-cgi/live-reload", "${LIVE_RELOAD_PROTOCOL}");
|
|
205
|
+
ws.onclose = recover;
|
|
206
|
+
ws.onerror = recover;
|
|
207
|
+
ws.onmessage = location.reload.bind(location);
|
|
208
|
+
}
|
|
209
|
+
initLiveReload();
|
|
210
|
+
})();
|
|
211
|
+
</script>
|
|
212
|
+
`;
|
|
213
|
+
function rewriteUrlRelatedHeaders(headers, from, to) {
|
|
214
|
+
const setCookie = headers.getAll("Set-Cookie");
|
|
215
|
+
headers.delete("Set-Cookie");
|
|
216
|
+
headers.forEach((value, key) => {
|
|
217
|
+
if (typeof value === "string" && value.includes(from.host)) {
|
|
218
|
+
headers.set(
|
|
219
|
+
key,
|
|
220
|
+
value.replaceAll(from.origin, to.origin).replaceAll(from.host, to.host)
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
for (const cookie of setCookie) {
|
|
225
|
+
headers.append(
|
|
226
|
+
"Set-Cookie",
|
|
227
|
+
cookie.replace(
|
|
228
|
+
new RegExp(`Domain=${from.hostname}($|;|,)`),
|
|
229
|
+
`Domain=${to.hostname}$1`
|
|
230
|
+
)
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
182
234
|
export {
|
|
183
235
|
ProxyWorker,
|
|
184
236
|
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
|
}
|