wrangler 0.0.0-e351afcf → 0.0.0-e39e9ff4

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.
Files changed (324) hide show
  1. package/README.md +10 -12
  2. package/bin/wrangler.js +13 -74
  3. package/config-schema.json +2900 -0
  4. package/package.json +224 -199
  5. package/templates/__tests__/tsconfig.json +1 -1
  6. package/templates/checked-fetch.js +10 -3
  7. package/templates/facade.d.ts +7 -2
  8. package/templates/gitignore +0 -5
  9. package/templates/init-tests/test-vitest-new-worker.js +1 -1
  10. package/templates/init-tests/test-vitest-new-worker.ts +1 -1
  11. package/templates/middleware/common.ts +9 -4
  12. package/templates/middleware/loader-modules.ts +93 -44
  13. package/templates/middleware/loader-sw.ts +6 -10
  14. package/templates/middleware/middleware-ensure-req-body-drained.ts +18 -0
  15. package/templates/middleware/middleware-serve-static-assets.d.ts +6 -0
  16. package/templates/middleware/middleware-serve-static-assets.ts +56 -0
  17. package/templates/modules-watch-stub.js +4 -0
  18. package/templates/new-worker-scheduled.ts +1 -1
  19. package/templates/new-worker.ts +1 -1
  20. package/templates/pages-dev-pipeline.ts +2 -1
  21. package/templates/pages-dev-util.ts +4 -1
  22. package/templates/pages-shim.ts +0 -3
  23. package/templates/pages-template-plugin.ts +12 -2
  24. package/templates/pages-template-worker.ts +11 -2
  25. package/templates/startDevWorker/InspectorProxyWorker.ts +661 -0
  26. package/templates/startDevWorker/ProxyWorker.ts +331 -0
  27. package/templates/tsconfig.json +1 -1
  28. package/wrangler-dist/InspectorProxyWorker.js +464 -0
  29. package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
  30. package/wrangler-dist/ProxyWorker.js +240 -0
  31. package/wrangler-dist/ProxyWorker.js.map +6 -0
  32. package/wrangler-dist/cli.d.ts +22636 -297
  33. package/wrangler-dist/cli.js +136177 -115703
  34. package/wrangler-dist/wasm-sync.wasm +0 -0
  35. package/import_meta_url.js +0 -3
  36. package/miniflare-config-stubs/.env.empty +0 -0
  37. package/miniflare-config-stubs/package.empty.json +0 -1
  38. package/miniflare-config-stubs/wrangler.empty.toml +0 -0
  39. package/miniflare-dist/index.mjs +0 -6442
  40. package/src/__tests__/access.test.ts +0 -25
  41. package/src/__tests__/api-dev.test.ts +0 -238
  42. package/src/__tests__/api-devregistry.test.ts +0 -121
  43. package/src/__tests__/api.test.ts +0 -102
  44. package/src/__tests__/config-cache-without-cache-dir.test.ts +0 -38
  45. package/src/__tests__/config-cache.test.ts +0 -42
  46. package/src/__tests__/configuration.test.ts +0 -4509
  47. package/src/__tests__/constellation.test.ts +0 -371
  48. package/src/__tests__/d1/d1.test.ts +0 -82
  49. package/src/__tests__/d1/execute.test.ts +0 -66
  50. package/src/__tests__/d1/migrate.test.ts +0 -257
  51. package/src/__tests__/d1/splitter.test.ts +0 -255
  52. package/src/__tests__/delete.test.ts +0 -272
  53. package/src/__tests__/deployments.test.ts +0 -369
  54. package/src/__tests__/dev.test.tsx +0 -1617
  55. package/src/__tests__/generate.test.ts +0 -237
  56. package/src/__tests__/get-host-from-url.test.ts +0 -16
  57. package/src/__tests__/guess-worker-format.test.ts +0 -120
  58. package/src/__tests__/helpers/clipboardy-mock.js +0 -4
  59. package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
  60. package/src/__tests__/helpers/end-event-loop.ts +0 -6
  61. package/src/__tests__/helpers/mock-account-id.ts +0 -48
  62. package/src/__tests__/helpers/mock-auth-domain.ts +0 -20
  63. package/src/__tests__/helpers/mock-bin.ts +0 -36
  64. package/src/__tests__/helpers/mock-console.ts +0 -112
  65. package/src/__tests__/helpers/mock-dialogs.ts +0 -139
  66. package/src/__tests__/helpers/mock-get-pages-upload-token.ts +0 -25
  67. package/src/__tests__/helpers/mock-get-zone-from-host.ts +0 -11
  68. package/src/__tests__/helpers/mock-http-server.ts +0 -46
  69. package/src/__tests__/helpers/mock-istty.ts +0 -74
  70. package/src/__tests__/helpers/mock-known-routes.ts +0 -12
  71. package/src/__tests__/helpers/mock-kv.ts +0 -46
  72. package/src/__tests__/helpers/mock-oauth-flow.ts +0 -263
  73. package/src/__tests__/helpers/mock-process.ts +0 -34
  74. package/src/__tests__/helpers/mock-set-timeout.ts +0 -16
  75. package/src/__tests__/helpers/mock-stdin.ts +0 -108
  76. package/src/__tests__/helpers/mock-web-socket.ts +0 -29
  77. package/src/__tests__/helpers/msw/blob-worker.cjs +0 -19
  78. package/src/__tests__/helpers/msw/handlers/access.ts +0 -13
  79. package/src/__tests__/helpers/msw/handlers/deployments.ts +0 -160
  80. package/src/__tests__/helpers/msw/handlers/namespaces.ts +0 -81
  81. package/src/__tests__/helpers/msw/handlers/oauth.ts +0 -31
  82. package/src/__tests__/helpers/msw/handlers/r2.ts +0 -60
  83. package/src/__tests__/helpers/msw/handlers/script.ts +0 -56
  84. package/src/__tests__/helpers/msw/handlers/user.ts +0 -52
  85. package/src/__tests__/helpers/msw/handlers/zones.ts +0 -20
  86. package/src/__tests__/helpers/msw/index.ts +0 -52
  87. package/src/__tests__/helpers/msw/read-file-sync.js +0 -61
  88. package/src/__tests__/helpers/run-in-tmp.ts +0 -38
  89. package/src/__tests__/helpers/run-wrangler.ts +0 -16
  90. package/src/__tests__/helpers/string-dynamic-values-matcher.ts +0 -28
  91. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +0 -1
  92. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +0 -5
  93. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +0 -1
  94. package/src/__tests__/helpers/worker-scripts/parent-worker.js +0 -11
  95. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +0 -5
  96. package/src/__tests__/helpers/write-worker-source.ts +0 -31
  97. package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
  98. package/src/__tests__/https-options.test.ts +0 -163
  99. package/src/__tests__/index.test.ts +0 -282
  100. package/src/__tests__/init.test.ts +0 -3196
  101. package/src/__tests__/jest.setup.ts +0 -179
  102. package/src/__tests__/kv.test.ts +0 -1799
  103. package/src/__tests__/logger.test.ts +0 -207
  104. package/src/__tests__/logout.test.ts +0 -47
  105. package/src/__tests__/metrics.test.ts +0 -493
  106. package/src/__tests__/middleware.scheduled.test.ts +0 -145
  107. package/src/__tests__/middleware.test.ts +0 -816
  108. package/src/__tests__/mtls-certificates.test.ts +0 -589
  109. package/src/__tests__/package-manager.test.ts +0 -353
  110. package/src/__tests__/pages/deployment-list.test.ts +0 -80
  111. package/src/__tests__/pages/functions-build.test.ts +0 -522
  112. package/src/__tests__/pages/pages.test.ts +0 -81
  113. package/src/__tests__/pages/project-create.test.ts +0 -63
  114. package/src/__tests__/pages/project-list.test.ts +0 -110
  115. package/src/__tests__/pages/project-upload.test.ts +0 -500
  116. package/src/__tests__/pages/publish.test.ts +0 -2864
  117. package/src/__tests__/pages-deployment-tail.test.ts +0 -955
  118. package/src/__tests__/parse.test.ts +0 -436
  119. package/src/__tests__/paths.test.ts +0 -39
  120. package/src/__tests__/publish.test.ts +0 -8849
  121. package/src/__tests__/pubsub.test.ts +0 -496
  122. package/src/__tests__/queues.test.ts +0 -532
  123. package/src/__tests__/r2.test.ts +0 -374
  124. package/src/__tests__/route.test.ts +0 -45
  125. package/src/__tests__/secret.test.ts +0 -693
  126. package/src/__tests__/tail.test.ts +0 -958
  127. package/src/__tests__/test-old-node-version.js +0 -31
  128. package/src/__tests__/traverse-module-graph.test.ts +0 -220
  129. package/src/__tests__/tsconfig-sanity.ts +0 -12
  130. package/src/__tests__/tsconfig.json +0 -8
  131. package/src/__tests__/tsconfig.tsbuildinfo +0 -1
  132. package/src/__tests__/type-generation.test.ts +0 -234
  133. package/src/__tests__/user.test.ts +0 -118
  134. package/src/__tests__/utils-collectKeyValues.test.ts +0 -47
  135. package/src/__tests__/validate-dev-props.test.ts +0 -56
  136. package/src/__tests__/version.test.ts +0 -35
  137. package/src/__tests__/whoami.test.tsx +0 -172
  138. package/src/__tests__/worker-namespace.test.ts +0 -340
  139. package/src/abort.d.ts +0 -3
  140. package/src/api/dev.ts +0 -321
  141. package/src/api/index.ts +0 -11
  142. package/src/api/mtls-certificate.ts +0 -148
  143. package/src/api/pages/create-worker-bundle-contents.ts +0 -76
  144. package/src/api/pages/index.ts +0 -5
  145. package/src/api/pages/publish.tsx +0 -371
  146. package/src/bundle-reporter.ts +0 -68
  147. package/src/bundle.ts +0 -911
  148. package/src/cfetch/index.ts +0 -158
  149. package/src/cfetch/internal.ts +0 -258
  150. package/src/cli.ts +0 -28
  151. package/src/config/README.md +0 -107
  152. package/src/config/config.ts +0 -282
  153. package/src/config/diagnostics.ts +0 -80
  154. package/src/config/environment.ts +0 -618
  155. package/src/config/index.ts +0 -403
  156. package/src/config/validation-helpers.ts +0 -597
  157. package/src/config/validation.ts +0 -2342
  158. package/src/config-cache.ts +0 -85
  159. package/src/constellation/createProject.tsx +0 -51
  160. package/src/constellation/deleteProject.ts +0 -51
  161. package/src/constellation/deleteProjectModel.ts +0 -68
  162. package/src/constellation/index.ts +0 -75
  163. package/src/constellation/listCatalog.tsx +0 -35
  164. package/src/constellation/listModel.tsx +0 -41
  165. package/src/constellation/listProject.tsx +0 -28
  166. package/src/constellation/listRuntime.tsx +0 -28
  167. package/src/constellation/options.ts +0 -17
  168. package/src/constellation/types.ts +0 -17
  169. package/src/constellation/uploadModel.tsx +0 -64
  170. package/src/constellation/utils.ts +0 -90
  171. package/src/create-worker-preview.ts +0 -293
  172. package/src/create-worker-upload-form.ts +0 -359
  173. package/src/d1/backups.tsx +0 -219
  174. package/src/d1/constants.ts +0 -2
  175. package/src/d1/create.tsx +0 -70
  176. package/src/d1/delete.ts +0 -53
  177. package/src/d1/execute.tsx +0 -357
  178. package/src/d1/formatTimeAgo.ts +0 -14
  179. package/src/d1/index.ts +0 -100
  180. package/src/d1/list.tsx +0 -62
  181. package/src/d1/migrations/apply.tsx +0 -212
  182. package/src/d1/migrations/create.tsx +0 -79
  183. package/src/d1/migrations/helpers.ts +0 -169
  184. package/src/d1/migrations/index.ts +0 -3
  185. package/src/d1/migrations/list.tsx +0 -95
  186. package/src/d1/migrations/options.ts +0 -23
  187. package/src/d1/options.ts +0 -22
  188. package/src/d1/splitter.ts +0 -161
  189. package/src/d1/types.ts +0 -25
  190. package/src/d1/utils.ts +0 -49
  191. package/src/delete.ts +0 -100
  192. package/src/deployments.ts +0 -368
  193. package/src/deprecated/index.ts +0 -144
  194. package/src/dev/dev-vars.ts +0 -39
  195. package/src/dev/dev.tsx +0 -602
  196. package/src/dev/get-local-persistence-path.ts +0 -31
  197. package/src/dev/local.tsx +0 -948
  198. package/src/dev/remote.tsx +0 -632
  199. package/src/dev/start-server.ts +0 -543
  200. package/src/dev/use-esbuild.ts +0 -212
  201. package/src/dev/validate-dev-props.ts +0 -40
  202. package/src/dev-registry.ts +0 -202
  203. package/src/dev.tsx +0 -934
  204. package/src/dialogs.ts +0 -136
  205. package/src/dispatch-namespace.ts +0 -211
  206. package/src/docs/helpers.ts +0 -50
  207. package/src/docs/index.ts +0 -54
  208. package/src/durable.ts +0 -102
  209. package/src/entry.ts +0 -338
  210. package/src/environment-variables/factory.ts +0 -89
  211. package/src/environment-variables/misc-variables.ts +0 -30
  212. package/src/errors.ts +0 -11
  213. package/src/generate/index.ts +0 -298
  214. package/src/git-client.ts +0 -135
  215. package/src/global-wrangler-config-path.ts +0 -26
  216. package/src/https-options.ts +0 -127
  217. package/src/index.ts +0 -768
  218. package/src/init.ts +0 -1032
  219. package/src/inspect.ts +0 -782
  220. package/src/intl-polyfill.d.ts +0 -139
  221. package/src/is-ci.ts +0 -14
  222. package/src/is-interactive.ts +0 -16
  223. package/src/jest.d.ts +0 -4
  224. package/src/kv/helpers.ts +0 -433
  225. package/src/kv/index.ts +0 -594
  226. package/src/logger.ts +0 -123
  227. package/src/metrics/index.ts +0 -5
  228. package/src/metrics/metrics-config.ts +0 -239
  229. package/src/metrics/metrics-dispatcher.ts +0 -96
  230. package/src/metrics/metrics-usage-headers.ts +0 -24
  231. package/src/metrics/send-event.ts +0 -99
  232. package/src/miniflare-cli/README.md +0 -30
  233. package/src/miniflare-cli/assets.ts +0 -251
  234. package/src/miniflare-cli/index.ts +0 -210
  235. package/src/miniflare-cli/request-context.ts +0 -40
  236. package/src/miniflare-cli/tsconfig.json +0 -9
  237. package/src/miniflare-cli/tsconfig.tsbuildinfo +0 -1
  238. package/src/miniflare-cli/types.ts +0 -11
  239. package/src/module-collection.ts +0 -333
  240. package/src/mtls-certificate/cli.ts +0 -155
  241. package/src/open-in-browser.ts +0 -17
  242. package/src/package-manager.ts +0 -219
  243. package/src/pages/build.ts +0 -422
  244. package/src/pages/buildFunctions.ts +0 -140
  245. package/src/pages/constants.ts +0 -18
  246. package/src/pages/deployment-tails.ts +0 -281
  247. package/src/pages/deployments.tsx +0 -84
  248. package/src/pages/dev.ts +0 -734
  249. package/src/pages/errors.ts +0 -67
  250. package/src/pages/functions/buildPlugin.ts +0 -113
  251. package/src/pages/functions/buildWorker.ts +0 -348
  252. package/src/pages/functions/filepath-routing.test.ts +0 -234
  253. package/src/pages/functions/filepath-routing.ts +0 -189
  254. package/src/pages/functions/identifiers.ts +0 -78
  255. package/src/pages/functions/routes-consolidation.test.ts +0 -250
  256. package/src/pages/functions/routes-consolidation.ts +0 -73
  257. package/src/pages/functions/routes-transformation.test.ts +0 -282
  258. package/src/pages/functions/routes-transformation.ts +0 -115
  259. package/src/pages/functions/routes-validation.test.ts +0 -403
  260. package/src/pages/functions/routes-validation.ts +0 -202
  261. package/src/pages/functions/routes.ts +0 -151
  262. package/src/pages/functions/tsconfig.json +0 -8
  263. package/src/pages/functions/tsconfig.tsbuildinfo +0 -1
  264. package/src/pages/functions.ts +0 -86
  265. package/src/pages/hash.ts +0 -13
  266. package/src/pages/index.ts +0 -102
  267. package/src/pages/projects.tsx +0 -159
  268. package/src/pages/prompt-select-project.tsx +0 -31
  269. package/src/pages/publish.tsx +0 -267
  270. package/src/pages/types.ts +0 -46
  271. package/src/pages/upload.tsx +0 -469
  272. package/src/pages/utils.ts +0 -23
  273. package/src/parse.ts +0 -308
  274. package/src/paths.ts +0 -71
  275. package/src/proxy.ts +0 -694
  276. package/src/publish/index.ts +0 -274
  277. package/src/publish/publish.ts +0 -1060
  278. package/src/pubsub/index.ts +0 -286
  279. package/src/pubsub/pubsub-commands.ts +0 -623
  280. package/src/queues/cli/commands/consumer/add.ts +0 -71
  281. package/src/queues/cli/commands/consumer/index.ts +0 -19
  282. package/src/queues/cli/commands/consumer/remove.ts +0 -31
  283. package/src/queues/cli/commands/create.ts +0 -25
  284. package/src/queues/cli/commands/delete.ts +0 -26
  285. package/src/queues/cli/commands/index.ts +0 -35
  286. package/src/queues/cli/commands/list.ts +0 -25
  287. package/src/queues/client.ts +0 -136
  288. package/src/queues/utils.ts +0 -18
  289. package/src/r2/constants.ts +0 -4
  290. package/src/r2/helpers.ts +0 -132
  291. package/src/r2/index.ts +0 -289
  292. package/src/routes.ts +0 -140
  293. package/src/secret/index.ts +0 -376
  294. package/src/selfsigned.d.ts +0 -29
  295. package/src/sites.ts +0 -484
  296. package/src/tail/createTail.ts +0 -406
  297. package/src/tail/filters.ts +0 -277
  298. package/src/tail/index.ts +0 -211
  299. package/src/tail/printing.ts +0 -122
  300. package/src/traverse-module-graph.ts +0 -53
  301. package/src/tsconfig-sanity.ts +0 -16
  302. package/src/type-generation.ts +0 -181
  303. package/src/update-check.ts +0 -19
  304. package/src/user/access.ts +0 -68
  305. package/src/user/auth-variables.ts +0 -113
  306. package/src/user/choose-account.tsx +0 -39
  307. package/src/user/generate-auth-url.ts +0 -33
  308. package/src/user/generate-random-state.ts +0 -16
  309. package/src/user/index.ts +0 -2
  310. package/src/user/user.ts +0 -1234
  311. package/src/utils/collectKeyValues.ts +0 -14
  312. package/src/utils/render.ts +0 -93
  313. package/src/whoami.ts +0 -135
  314. package/src/worker.ts +0 -274
  315. package/src/yargs-types.ts +0 -37
  316. package/src/zones.ts +0 -191
  317. package/templates/__tests__/tsconfig.tsbuildinfo +0 -1
  318. package/templates/d1-beta-facade.js +0 -244
  319. package/templates/first-party-worker-module-facade.ts +0 -19
  320. package/templates/format-dev-errors.ts +0 -34
  321. package/templates/serve-static-assets.ts +0 -66
  322. package/templates/service-bindings-module-facade.js +0 -55
  323. package/templates/service-bindings-sw-facade.js +0 -42
  324. package/templates/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,331 @@
1
+ import {
2
+ createDeferred,
3
+ DeferredPromise,
4
+ urlFromParts,
5
+ } from "../../src/api/startDevWorker/utils";
6
+ import type {
7
+ ProxyData,
8
+ ProxyWorkerIncomingRequestBody,
9
+ ProxyWorkerOutgoingRequestBody,
10
+ } from "../../src/api/startDevWorker/events";
11
+
12
+ interface Env {
13
+ PROXY_CONTROLLER: Fetcher;
14
+ PROXY_CONTROLLER_AUTH_SECRET: string;
15
+ DURABLE_OBJECT: DurableObjectNamespace;
16
+ }
17
+
18
+ // request.cf.hostMetadata is verbose to type using the workers-types Request -- this allows us to have Request correctly typed in this scope
19
+ type Request = Parameters<
20
+ NonNullable<
21
+ ExportedHandler<Env, unknown, ProxyWorkerIncomingRequestBody>["fetch"]
22
+ >
23
+ >[0];
24
+
25
+ const LIVE_RELOAD_PROTOCOL = "WRANGLER_PROXYWORKER_LIVE_RELOAD_PROTOCOL";
26
+ export default {
27
+ fetch(req, env) {
28
+ const singleton = env.DURABLE_OBJECT.idFromName("");
29
+ const inspectorProxy = env.DURABLE_OBJECT.get(singleton);
30
+
31
+ return inspectorProxy.fetch(req);
32
+ },
33
+ } as ExportedHandler<Env, unknown, ProxyWorkerIncomingRequestBody>;
34
+
35
+ export class ProxyWorker implements DurableObject {
36
+ constructor(readonly state: DurableObjectState, readonly env: Env) {}
37
+
38
+ proxyData?: ProxyData;
39
+ requestQueue = new Map<Request, DeferredPromise<Response>>();
40
+ requestRetryQueue = new Map<Request, DeferredPromise<Response>>();
41
+
42
+ fetch(request: Request) {
43
+ if (isRequestForLiveReloadWebsocket(request)) {
44
+ // requests for live-reload websocket
45
+
46
+ return this.handleLiveReloadWebSocket(request);
47
+ }
48
+
49
+ if (isRequestFromProxyController(request, this.env)) {
50
+ // requests from ProxyController
51
+
52
+ return this.processProxyControllerRequest(request);
53
+ }
54
+
55
+ // regular requests to be proxied
56
+ const deferred = createDeferred<Response>();
57
+
58
+ this.requestQueue.set(request, deferred);
59
+ this.processQueue();
60
+
61
+ return deferred.promise;
62
+ }
63
+
64
+ handleLiveReloadWebSocket(request: Request) {
65
+ const { 0: response, 1: liveReload } = new WebSocketPair();
66
+ const websocketProtocol =
67
+ request.headers.get("Sec-WebSocket-Protocol") ?? "";
68
+
69
+ this.state.acceptWebSocket(liveReload, ["live-reload"]);
70
+
71
+ return new Response(null, {
72
+ status: 101,
73
+ webSocket: response,
74
+ headers: { "Sec-WebSocket-Protocol": websocketProtocol },
75
+ });
76
+ }
77
+
78
+ processProxyControllerRequest(request: Request) {
79
+ const event = request.cf?.hostMetadata;
80
+ switch (event?.type) {
81
+ case "pause":
82
+ this.proxyData = undefined;
83
+ break;
84
+
85
+ case "play":
86
+ this.proxyData = event.proxyData;
87
+ this.processQueue();
88
+ this.state
89
+ .getWebSockets("live-reload")
90
+ .forEach((ws) => ws.send("reload"));
91
+
92
+ break;
93
+ }
94
+
95
+ return new Response(null, { status: 204 });
96
+ }
97
+
98
+ /**
99
+ * Process requests that are being retried first, then process newer requests.
100
+ * Requests that are being retried are, by definition, older than requests which haven't been processed yet.
101
+ * We don't need to be more accurate than this re ordering, since the requests are being fired off synchronously.
102
+ */
103
+ *getOrderedQueue() {
104
+ yield* this.requestRetryQueue;
105
+ yield* this.requestQueue;
106
+ }
107
+
108
+ processQueue() {
109
+ const { proxyData } = this; // store proxyData at the moment this function was called
110
+ if (proxyData === undefined) return;
111
+
112
+ for (const [request, deferredResponse] of this.getOrderedQueue()) {
113
+ this.requestRetryQueue.delete(request);
114
+ this.requestQueue.delete(request);
115
+
116
+ const outerUrl = new URL(request.url);
117
+ const headers = new Headers(request.headers);
118
+
119
+ // override url parts for proxying
120
+ const userWorkerUrl = new URL(request.url);
121
+ Object.assign(userWorkerUrl, proxyData.userWorkerUrl);
122
+
123
+ // set request.url in the UserWorker
124
+ const innerUrl = new URL(request.url);
125
+ Object.assign(innerUrl, proxyData.userWorkerInnerUrlOverrides);
126
+ headers.set("MF-Original-URL", innerUrl.href);
127
+ headers.set("MF-Disable-Pretty-Error", "true"); // disables the UserWorker miniflare instance from rendering the pretty error -- instead the ProxyWorker miniflare instance will intercept the json error response and render the pretty error page
128
+
129
+ // Preserve client `Accept-Encoding`, rather than using Worker's default
130
+ // of `Accept-Encoding: br, gzip`
131
+ const encoding = request.cf?.clientAcceptEncoding;
132
+ if (encoding !== undefined) headers.set("Accept-Encoding", encoding);
133
+
134
+ rewriteUrlRelatedHeaders(headers, outerUrl, innerUrl);
135
+
136
+ // merge proxyData headers with the request headers
137
+ for (const [key, value] of Object.entries(proxyData.headers ?? {})) {
138
+ if (value === undefined) continue;
139
+
140
+ if (key.toLowerCase() === "cookie") {
141
+ const existing = request.headers.get("cookie") ?? "";
142
+ headers.set("cookie", `${existing};${value}`);
143
+ } else {
144
+ headers.set(key, value);
145
+ }
146
+ }
147
+
148
+ // explicitly NOT await-ing this promise, we are in a loop and want to process the whole queue quickly + synchronously
149
+ void fetch(userWorkerUrl, new Request(request, { headers }))
150
+ .then((res) => {
151
+ res = new Response(res.body, res);
152
+ rewriteUrlRelatedHeaders(res.headers, innerUrl, outerUrl);
153
+
154
+ if (isHtmlResponse(res)) {
155
+ res = insertLiveReloadScript(request, res, this.env, proxyData);
156
+ }
157
+
158
+ deferredResponse.resolve(res);
159
+ })
160
+ .catch((error: Error) => {
161
+ // errors here are network errors or from response post-processing
162
+ // to catch only network errors, use the 2nd param of the fetch.then()
163
+
164
+ // we have crossed an async boundary, so proxyData may have changed
165
+ // if proxyData.userWorkerUrl has changed, it means there is a new downstream UserWorker
166
+ // and that this error is stale since it was for a request to the old UserWorker
167
+ // so here we construct a newUserWorkerUrl so we can compare it to the (old) userWorkerUrl
168
+ const newUserWorkerUrl =
169
+ this.proxyData && urlFromParts(this.proxyData.userWorkerUrl);
170
+
171
+ // only report errors if the downstream proxy has NOT changed
172
+ if (userWorkerUrl.href === newUserWorkerUrl?.href) {
173
+ void sendMessageToProxyController(this.env, {
174
+ type: "error",
175
+ error: {
176
+ name: error.name,
177
+ message: error.message,
178
+ stack: error.stack,
179
+ cause: error.cause,
180
+ },
181
+ });
182
+
183
+ deferredResponse.reject(error);
184
+ }
185
+
186
+ // if the request can be retried (subset of idempotent requests which have no body), requeue it
187
+ else if (request.method === "GET" || request.method === "HEAD") {
188
+ this.requestRetryQueue.set(request, deferredResponse);
189
+ // we would only end up here if the downstream UserWorker is chang*ing*
190
+ // i.e. we are in a `pause`d state and expecting a `play` message soon
191
+ // this request will be processed (retried) when the `play` message arrives
192
+ // for that reason, we do not need to call `this.processQueue` here
193
+ // (but, also, it can't hurt to call it since it bails when
194
+ // in a `pause`d state i.e. `this.proxyData` is undefined)
195
+ }
196
+
197
+ // if the request cannot be retried, respond with 503 Service Unavailable
198
+ // important to note, this is not an (unexpected) error -- it is an acceptable flow of local development
199
+ // it would be incorrect to retry non-idempotent requests
200
+ // and would require cloning all body streams to avoid stream reuse (which is inefficient but not out of the question in the future)
201
+ // this is a good enough UX for now since it solves the most common GET use-case
202
+ else {
203
+ deferredResponse.resolve(
204
+ new Response(
205
+ "Your worker restarted mid-request. Please try sending the request again. Only GET or HEAD requests are retried automatically.",
206
+ {
207
+ status: 503,
208
+ headers: { "Retry-After": "0" },
209
+ }
210
+ )
211
+ );
212
+ }
213
+ });
214
+ }
215
+ }
216
+ }
217
+
218
+ function isRequestFromProxyController(req: Request, env: Env): boolean {
219
+ return req.headers.get("Authorization") === env.PROXY_CONTROLLER_AUTH_SECRET;
220
+ }
221
+ function isHtmlResponse(res: Response): boolean {
222
+ return res.headers.get("content-type")?.startsWith("text/html") ?? false;
223
+ }
224
+ function isRequestForLiveReloadWebsocket(req: Request): boolean {
225
+ const websocketProtocol = req.headers.get("Sec-WebSocket-Protocol");
226
+ const isWebSocketUpgrade = req.headers.get("Upgrade") === "websocket";
227
+
228
+ return isWebSocketUpgrade && websocketProtocol === LIVE_RELOAD_PROTOCOL;
229
+ }
230
+
231
+ function sendMessageToProxyController(
232
+ env: Env,
233
+ message: ProxyWorkerOutgoingRequestBody
234
+ ) {
235
+ return env.PROXY_CONTROLLER.fetch("http://dummy", {
236
+ method: "POST",
237
+ body: JSON.stringify(message),
238
+ });
239
+ }
240
+
241
+ function insertLiveReloadScript(
242
+ request: Request,
243
+ response: Response,
244
+ env: Env,
245
+ proxyData: ProxyData
246
+ ) {
247
+ const htmlRewriter = new HTMLRewriter();
248
+
249
+ // if preview-token-expired response, errorDetails will contain "Invalid Workers Preview configuration"
250
+ let errorDetails = "";
251
+ htmlRewriter.on("#cf-error-details", {
252
+ text(element) {
253
+ errorDetails += element.text;
254
+ },
255
+ });
256
+
257
+ htmlRewriter.onDocument({
258
+ end(end) {
259
+ if (
260
+ response.status === 400 &&
261
+ errorDetails.includes("Invalid Workers Preview configuration")
262
+ ) {
263
+ void sendMessageToProxyController(env, {
264
+ type: "previewTokenExpired",
265
+ proxyData,
266
+ });
267
+ }
268
+
269
+ // if liveReload enabled, append a script tag
270
+ // TODO: compare to existing nodejs implementation
271
+ if (proxyData.liveReload) {
272
+ const websocketUrl = new URL(request.url);
273
+ websocketUrl.protocol =
274
+ websocketUrl.protocol === "http:" ? "ws:" : "wss:";
275
+
276
+ end.append(
277
+ `
278
+ <script>
279
+ (function() {
280
+ var ws;
281
+ function recover() {
282
+ ws = null;
283
+ setTimeout(initLiveReload, 100);
284
+ }
285
+ function initLiveReload() {
286
+ if (ws) return;
287
+ var origin = (location.protocol === "http:" ? "ws://" : "wss://") + location.host;
288
+ ws = new WebSocket(origin + "/cdn-cgi/live-reload", "${LIVE_RELOAD_PROTOCOL}");
289
+ ws.onclose = recover;
290
+ ws.onerror = recover;
291
+ ws.onmessage = location.reload.bind(location);
292
+ }
293
+ })();
294
+ </script>
295
+ `,
296
+ { html: true }
297
+ );
298
+ }
299
+ },
300
+ });
301
+
302
+ return htmlRewriter.transform(response);
303
+ }
304
+
305
+ /**
306
+ * Rewrite references to URLs in request/response headers.
307
+ *
308
+ * This function is used to map the URLs in headers like Origin and Access-Control-Allow-Origin
309
+ * so that this proxy is transparent to the Client Browser and User Worker.
310
+ */
311
+ function rewriteUrlRelatedHeaders(headers: Headers, from: URL, to: URL) {
312
+ const setCookie = headers.getAll("Set-Cookie");
313
+ headers.delete("Set-Cookie");
314
+ headers.forEach((value, key) => {
315
+ if (typeof value === "string" && value.includes(from.host)) {
316
+ headers.set(
317
+ key,
318
+ value.replaceAll(from.origin, to.origin).replaceAll(from.host, to.host)
319
+ );
320
+ }
321
+ });
322
+ for (const cookie of setCookie) {
323
+ headers.append(
324
+ "Set-Cookie",
325
+ cookie.replace(
326
+ new RegExp(`Domain=${from.hostname}($|;|,)`),
327
+ `Domain=${to.hostname}$1`
328
+ )
329
+ );
330
+ }
331
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "../tsconfig.json",
2
+ "extends": "@cloudflare/workers-tsconfig/tsconfig.json",
3
3
  "compilerOptions": {
4
4
  "types": ["@cloudflare/workers-types"]
5
5
  },