wrangler 0.0.0-e1d50407 → 0.0.0-e1e76ce2
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/config-schema.json +2915 -0
- package/package.json +30 -19
- package/templates/facade.d.ts +7 -5
- package/templates/gitignore +0 -5
- package/templates/init-tests/test-vitest-new-worker.js +1 -1
- package/templates/init-tests/test-vitest-new-worker.ts +1 -1
- package/templates/middleware/loader-modules.ts +93 -97
- package/templates/middleware/loader-sw.ts +4 -3
- package/templates/middleware/middleware-dispatchee.ts +53 -0
- 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-outbound.ts +35 -0
- package/templates/middleware/middleware-serve-static-assets.ts +5 -5
- package/templates/pages-dev-pipeline.ts +2 -1
- package/templates/startDevWorker/InspectorProxyWorker.ts +13 -4
- package/templates/startDevWorker/ProxyWorker.ts +118 -39
- package/wrangler-dist/InspectorProxyWorker.js +4 -0
- package/wrangler-dist/InspectorProxyWorker.js.map +1 -1
- package/wrangler-dist/ProxyWorker.js +78 -24
- package/wrangler-dist/ProxyWorker.js.map +1 -1
- package/wrangler-dist/cli.d.ts +709 -215
- package/wrangler-dist/cli.js +34557 -21949
- 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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wrangler",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-e1e76ce2",
|
|
4
4
|
"description": "Command-line interface for all things Cloudflare Workers",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"wrangler",
|
|
@@ -47,15 +47,10 @@
|
|
|
47
47
|
"wrangler-dist",
|
|
48
48
|
"templates",
|
|
49
49
|
"kv-asset-handler.js",
|
|
50
|
-
"Cloudflare_CA.pem"
|
|
50
|
+
"Cloudflare_CA.pem",
|
|
51
|
+
"config-schema.json"
|
|
51
52
|
],
|
|
52
53
|
"jest": {
|
|
53
|
-
"coverageReporters": [
|
|
54
|
-
"json",
|
|
55
|
-
"html",
|
|
56
|
-
"text",
|
|
57
|
-
"cobertura"
|
|
58
|
-
],
|
|
59
54
|
"moduleNameMapper": {
|
|
60
55
|
"clipboardy": "<rootDir>/src/__tests__/helpers/clipboardy-mock.js",
|
|
61
56
|
"miniflare/cli": "<rootDir>/../../node_modules/miniflare/dist/src/cli.js"
|
|
@@ -75,7 +70,7 @@
|
|
|
75
70
|
]
|
|
76
71
|
},
|
|
77
72
|
"transformIgnorePatterns": [
|
|
78
|
-
"node_modules/.pnpm/(?!find-up|locate-path|p-locate|p-limit|p-timeout|p-queue|yocto-queue|path-exists|execa|strip-final-newline|npm-run-path|path-key|onetime|mimic-fn|human-signals|is-stream|get-port|supports-color|pretty-bytes)"
|
|
73
|
+
"node_modules/.pnpm/(?!find-up|locate-path|p-locate|p-limit|p-timeout|p-queue|yocto-queue|path-exists|execa|strip-final-newline|npm-run-path|path-key|onetime|mimic-fn|human-signals|is-stream|get-port|supports-color|pretty-bytes|strip-ansi|ansi-regex)"
|
|
79
74
|
],
|
|
80
75
|
"snapshotFormat": {
|
|
81
76
|
"escapeString": true,
|
|
@@ -83,8 +78,6 @@
|
|
|
83
78
|
}
|
|
84
79
|
},
|
|
85
80
|
"dependencies": {
|
|
86
|
-
"@cloudflare/kv-asset-handler": "^0.2.0",
|
|
87
|
-
"@cspotcode/source-map-support": "0.8.1",
|
|
88
81
|
"@esbuild-plugins/node-globals-polyfill": "^0.2.3",
|
|
89
82
|
"@esbuild-plugins/node-modules-polyfill": "^0.2.2",
|
|
90
83
|
"blake3-wasm": "^2.1.5",
|
|
@@ -92,17 +85,21 @@
|
|
|
92
85
|
"esbuild": "0.17.19",
|
|
93
86
|
"nanoid": "^3.3.3",
|
|
94
87
|
"path-to-regexp": "^6.2.0",
|
|
88
|
+
"resolve": "^1.22.8",
|
|
95
89
|
"resolve.exports": "^2.0.2",
|
|
96
90
|
"selfsigned": "^2.0.1",
|
|
97
91
|
"source-map": "0.6.1",
|
|
92
|
+
"ts-json-schema-generator": "^1.5.0",
|
|
98
93
|
"xxhash-wasm": "^1.0.1",
|
|
99
|
-
"
|
|
94
|
+
"@cloudflare/kv-asset-handler": "0.3.1",
|
|
95
|
+
"miniflare": "3.20240405.1"
|
|
100
96
|
},
|
|
101
97
|
"devDependencies": {
|
|
102
98
|
"@cloudflare/ai": "^1.0.35",
|
|
103
99
|
"@cloudflare/eslint-config-worker": "*",
|
|
104
100
|
"@cloudflare/types": "^6.18.4",
|
|
105
|
-
"@cloudflare/workers-types": "^4.
|
|
101
|
+
"@cloudflare/workers-types": "^4.20240405.0",
|
|
102
|
+
"@cspotcode/source-map-support": "0.8.1",
|
|
106
103
|
"@iarna/toml": "^3.0.0",
|
|
107
104
|
"@microsoft/api-extractor": "^7.28.3",
|
|
108
105
|
"@sentry/node": "^7.86.0",
|
|
@@ -120,6 +117,7 @@
|
|
|
120
117
|
"@types/minimatch": "^5.1.2",
|
|
121
118
|
"@types/prompts": "^2.0.14",
|
|
122
119
|
"@types/react": "^17.0.37",
|
|
120
|
+
"@types/resolve": "^1.20.6",
|
|
123
121
|
"@types/serve-static": "^1.13.10",
|
|
124
122
|
"@types/shell-quote": "^1.7.2",
|
|
125
123
|
"@types/signal-exit": "^3.0.1",
|
|
@@ -137,6 +135,7 @@
|
|
|
137
135
|
"concurrently": "^7.2.2",
|
|
138
136
|
"devtools-protocol": "^0.0.955664",
|
|
139
137
|
"dotenv": "^16.0.0",
|
|
138
|
+
"es-module-lexer": "^1.3.0",
|
|
140
139
|
"esbuild-jest": "0.5.0",
|
|
141
140
|
"execa": "^6.1.0",
|
|
142
141
|
"express": "^4.18.1",
|
|
@@ -178,36 +177,48 @@
|
|
|
178
177
|
"supports-color": "^9.2.2",
|
|
179
178
|
"timeago.js": "^4.0.2",
|
|
180
179
|
"ts-dedent": "^2.2.0",
|
|
181
|
-
"undici": "5.
|
|
180
|
+
"undici": "5.28.3",
|
|
182
181
|
"update-check": "^1.5.4",
|
|
183
182
|
"ws": "^8.5.0",
|
|
184
183
|
"xdg-app-paths": "^8.3.0",
|
|
185
184
|
"yargs": "^17.7.2",
|
|
186
185
|
"yoga-layout": "file:../../vendor/yoga-layout-2.0.0-beta.1.tgz",
|
|
187
|
-
"@cloudflare/cli": "1.
|
|
188
|
-
"@cloudflare/pages-shared": "^0.11.
|
|
186
|
+
"@cloudflare/cli": "1.1.1",
|
|
187
|
+
"@cloudflare/pages-shared": "^0.11.28",
|
|
189
188
|
"@cloudflare/workers-tsconfig": "0.0.0"
|
|
190
189
|
},
|
|
191
190
|
"optionalDependencies": {
|
|
192
191
|
"fsevents": "~2.3.2"
|
|
193
192
|
},
|
|
193
|
+
"peerDependencies": {
|
|
194
|
+
"@cloudflare/workers-types": "^4.20240405.0"
|
|
195
|
+
},
|
|
196
|
+
"peerDependenciesMeta": {
|
|
197
|
+
"@cloudflare/workers-types": {
|
|
198
|
+
"optional": true
|
|
199
|
+
}
|
|
200
|
+
},
|
|
194
201
|
"engines": {
|
|
195
202
|
"node": ">=16.17.0"
|
|
196
203
|
},
|
|
204
|
+
"workers-sdk": {
|
|
205
|
+
"prerelease": true
|
|
206
|
+
},
|
|
197
207
|
"scripts": {
|
|
198
208
|
"assert-git-version": "node -r esbuild-register scripts/assert-git-version.ts",
|
|
199
|
-
"build": "pnpm run clean && pnpm run bundle && pnpm run emit-types",
|
|
209
|
+
"build": "pnpm run clean && pnpm run bundle && pnpm run emit-types && pnpm run generate-json-schema",
|
|
200
210
|
"bundle": "node -r esbuild-register scripts/bundle.ts",
|
|
201
211
|
"check:lint": "eslint .",
|
|
202
212
|
"check:type": "tsc",
|
|
203
213
|
"clean": "rimraf wrangler-dist miniflare-dist emitted-types",
|
|
204
214
|
"dev": "pnpm run clean && concurrently -c black,blue --kill-others-on-fail false \"pnpm run bundle --watch\" \"pnpm run check:type --watch --preserveWatchOutput\"",
|
|
205
215
|
"emit-types": "tsc -p tsconfig.emit.json && node -r esbuild-register scripts/emit-types.ts",
|
|
216
|
+
"generate-json-schema": "pnpm exec ts-json-schema-generator --no-type-check --path src/config/config.ts --type RawConfig --out config-schema.json",
|
|
206
217
|
"start": "pnpm run bundle && cross-env NODE_OPTIONS=--enable-source-maps ./bin/wrangler.js",
|
|
207
218
|
"test": "pnpm run assert-git-version && jest",
|
|
208
|
-
"test:ci": "pnpm run test
|
|
219
|
+
"test:ci": "pnpm run test",
|
|
209
220
|
"test:debug": "pnpm run test --silent=false --verbose=true",
|
|
210
|
-
"test:e2e": "vitest
|
|
221
|
+
"test:e2e": "vitest -c ./e2e/vitest.config.ts",
|
|
211
222
|
"test:watch": "pnpm run test --testTimeout=50000 --watch",
|
|
212
223
|
"type:tests": "tsc -p ./src/__tests__/tsconfig.json && tsc -p ./e2e/tsconfig.json"
|
|
213
224
|
}
|
package/templates/facade.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
declare module "__ENTRY_POINT__" {
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
2
|
+
import { Middleware } from "./middleware/common";
|
|
3
|
+
import { WorkerEntrypoint } from "cloudflare:workers";
|
|
4
|
+
|
|
5
|
+
export type WorkerEntrypointConstructor = typeof WorkerEntrypoint;
|
|
6
|
+
export type WithMiddleware<T> = T & { middleware?: Middleware[] };
|
|
7
|
+
|
|
8
|
+
const worker: WithMiddleware<ExportedHandler | WorkerEntrypointConstructor>;
|
|
7
9
|
export default worker;
|
|
8
10
|
}
|
|
9
11
|
|
package/templates/gitignore
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
1
2
|
import { unstable_dev } from "wrangler";
|
|
2
3
|
import type { UnstableDevWorker } from "wrangler";
|
|
3
|
-
import { describe, expect, it, beforeAll, afterAll } from "vitest";
|
|
4
4
|
|
|
5
5
|
describe("Worker", () => {
|
|
6
6
|
let worker: UnstableDevWorker;
|
|
@@ -1,23 +1,20 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import worker from "__ENTRY_POINT__";
|
|
15
|
-
|
|
16
|
-
// We need to preserve all of the exports from the worker
|
|
1
|
+
// This loads all middlewares exposed on the middleware object and then starts
|
|
2
|
+
// the invocation chain. The big idea is that we can add these to the middleware
|
|
3
|
+
// export dynamically through wrangler, or we can potentially let users directly
|
|
4
|
+
// add them as a sort of "plugin" system.
|
|
5
|
+
|
|
6
|
+
import ENTRY from "__ENTRY_POINT__";
|
|
7
|
+
import { __facade_invoke__, __facade_register__, Dispatcher } from "./common";
|
|
8
|
+
import type {
|
|
9
|
+
WithMiddleware,
|
|
10
|
+
WorkerEntrypointConstructor,
|
|
11
|
+
} from "__ENTRY_POINT__";
|
|
12
|
+
|
|
13
|
+
// Preserve all the exports from the worker
|
|
17
14
|
export * from "__ENTRY_POINT__";
|
|
18
15
|
|
|
19
16
|
class __Facade_ScheduledController__ implements ScheduledController {
|
|
20
|
-
#noRetry: ScheduledController["noRetry"];
|
|
17
|
+
readonly #noRetry: ScheduledController["noRetry"];
|
|
21
18
|
|
|
22
19
|
constructor(
|
|
23
20
|
readonly scheduledTime: number,
|
|
@@ -36,71 +33,33 @@ class __Facade_ScheduledController__ implements ScheduledController {
|
|
|
36
33
|
}
|
|
37
34
|
}
|
|
38
35
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
function getMaskedEnv(rawEnv: unknown) {
|
|
50
|
-
let env = rawEnv as Record<string, unknown>;
|
|
51
|
-
if (worker.envWrappers && worker.envWrappers.length > 0) {
|
|
52
|
-
for (const wrapFn of worker.envWrappers) {
|
|
53
|
-
env = wrapFn(env);
|
|
54
|
-
}
|
|
36
|
+
function wrapExportedHandler(
|
|
37
|
+
worker: WithMiddleware<ExportedHandler>
|
|
38
|
+
): ExportedHandler {
|
|
39
|
+
// If we don't have any middleware defined, just return the handler as is
|
|
40
|
+
if (worker.middleware === undefined || worker.middleware.length === 0) {
|
|
41
|
+
return worker;
|
|
42
|
+
}
|
|
43
|
+
// Otherwise, register all middleware once
|
|
44
|
+
for (const middleware of worker.middleware) {
|
|
45
|
+
__facade_register__(middleware);
|
|
55
46
|
}
|
|
56
|
-
return env;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* This type is here to cause a type error if a new export handler is added to
|
|
61
|
-
* `ExportHandler` without it being included in the `facade` below.
|
|
62
|
-
*/
|
|
63
|
-
type MissingExportHandlers = Omit<
|
|
64
|
-
Required<ExportedHandler>,
|
|
65
|
-
"tail" | "trace" | "scheduled" | "queue" | "test" | "email" | "fetch"
|
|
66
|
-
>;
|
|
67
|
-
|
|
68
|
-
let registeredMiddleware = false;
|
|
69
|
-
|
|
70
|
-
const facade: ExportedHandler<unknown> & MissingExportHandlers = {
|
|
71
|
-
...(worker.tail && {
|
|
72
|
-
tail: maskHandlerEnv(worker.tail),
|
|
73
|
-
}),
|
|
74
|
-
...(worker.trace && {
|
|
75
|
-
trace: maskHandlerEnv(worker.trace),
|
|
76
|
-
}),
|
|
77
|
-
...(worker.scheduled && {
|
|
78
|
-
scheduled: maskHandlerEnv(worker.scheduled),
|
|
79
|
-
}),
|
|
80
|
-
...(worker.queue && {
|
|
81
|
-
queue: maskHandlerEnv(worker.queue),
|
|
82
|
-
}),
|
|
83
|
-
...(worker.test && {
|
|
84
|
-
test: maskHandlerEnv(worker.test),
|
|
85
|
-
}),
|
|
86
|
-
...(worker.email && {
|
|
87
|
-
email: maskHandlerEnv(worker.email),
|
|
88
|
-
}),
|
|
89
47
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
}
|
|
48
|
+
const fetchDispatcher: ExportedHandlerFetchHandler = function (
|
|
49
|
+
request,
|
|
50
|
+
env,
|
|
51
|
+
ctx
|
|
52
|
+
) {
|
|
53
|
+
if (worker.fetch === undefined) {
|
|
54
|
+
throw new Error("Handler does not export a fetch() function.");
|
|
55
|
+
}
|
|
56
|
+
return worker.fetch(request, env, ctx);
|
|
57
|
+
};
|
|
102
58
|
|
|
103
|
-
|
|
59
|
+
return {
|
|
60
|
+
...worker,
|
|
61
|
+
fetch(request, env, ctx) {
|
|
62
|
+
const dispatcher: Dispatcher = function (type, init) {
|
|
104
63
|
if (type === "scheduled" && worker.scheduled !== undefined) {
|
|
105
64
|
const controller = new __Facade_ScheduledController__(
|
|
106
65
|
Date.now(),
|
|
@@ -110,28 +69,65 @@ const facade: ExportedHandler<unknown> & MissingExportHandlers = {
|
|
|
110
69
|
return worker.scheduled(controller, env, ctx);
|
|
111
70
|
}
|
|
112
71
|
};
|
|
72
|
+
return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher);
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function wrapWorkerEntrypoint(
|
|
78
|
+
klass: WithMiddleware<WorkerEntrypointConstructor>
|
|
79
|
+
): WorkerEntrypointConstructor {
|
|
80
|
+
// If we don't have any middleware defined, just return the handler as is
|
|
81
|
+
if (klass.middleware === undefined || klass.middleware.length === 0) {
|
|
82
|
+
return klass;
|
|
83
|
+
}
|
|
84
|
+
// Otherwise, register all middleware once
|
|
85
|
+
for (const middleware of klass.middleware) {
|
|
86
|
+
__facade_register__(middleware);
|
|
87
|
+
}
|
|
113
88
|
|
|
89
|
+
// `extend`ing `klass` here so other RPC methods remain callable
|
|
90
|
+
return class extends klass {
|
|
91
|
+
#fetchDispatcher: ExportedHandlerFetchHandler<Record<string, unknown>> = (
|
|
92
|
+
request,
|
|
93
|
+
env,
|
|
94
|
+
ctx
|
|
95
|
+
) => {
|
|
96
|
+
this.env = env;
|
|
97
|
+
this.ctx = ctx;
|
|
98
|
+
if (super.fetch === undefined) {
|
|
99
|
+
throw new Error("Entrypoint class does not define a fetch() function.");
|
|
100
|
+
}
|
|
101
|
+
return super.fetch(request);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
#dispatcher: Dispatcher = (type, init) => {
|
|
105
|
+
if (type === "scheduled" && super.scheduled !== undefined) {
|
|
106
|
+
const controller = new __Facade_ScheduledController__(
|
|
107
|
+
Date.now(),
|
|
108
|
+
init.cron ?? "",
|
|
109
|
+
() => {}
|
|
110
|
+
);
|
|
111
|
+
return super.scheduled(controller);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
fetch(request: Request<unknown, IncomingRequestCfProperties>) {
|
|
114
116
|
return __facade_invoke__(
|
|
115
117
|
request,
|
|
116
|
-
env,
|
|
117
|
-
ctx,
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
this.env,
|
|
119
|
+
this.ctx,
|
|
120
|
+
this.#dispatcher,
|
|
121
|
+
this.#fetchDispatcher
|
|
120
122
|
);
|
|
121
|
-
} else {
|
|
122
|
-
// We didn't have any middleware so we can skip the invocation chain,
|
|
123
|
-
// and just call the fetch handler directly
|
|
124
|
-
|
|
125
|
-
// We "don't care" if this is undefined as we want to have the same behavior
|
|
126
|
-
// as if the worker completely bypassed middleware.
|
|
127
|
-
return __facade_modules_fetch__(request, env, ctx);
|
|
128
123
|
}
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
type HandlerFn<D, R> = (data: D, env: unknown, ctx: ExecutionContext) => R;
|
|
133
|
-
function maskHandlerEnv<D, R>(handler: HandlerFn<D, R>): HandlerFn<D, R> {
|
|
134
|
-
return (data, env, ctx) => handler(data, getMaskedEnv(env), ctx);
|
|
124
|
+
};
|
|
135
125
|
}
|
|
136
126
|
|
|
137
|
-
|
|
127
|
+
let WRAPPED_ENTRY: ExportedHandler | WorkerEntrypointConstructor | undefined;
|
|
128
|
+
if (typeof ENTRY === "object") {
|
|
129
|
+
WRAPPED_ENTRY = wrapExportedHandler(ENTRY);
|
|
130
|
+
} else if (typeof ENTRY === "function") {
|
|
131
|
+
WRAPPED_ENTRY = wrapWorkerEntrypoint(ENTRY);
|
|
132
|
+
}
|
|
133
|
+
export default WRAPPED_ENTRY;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
|
+
__facade_invoke__,
|
|
3
|
+
__facade_register__,
|
|
4
|
+
__facade_registerInternal__,
|
|
2
5
|
Awaitable,
|
|
3
6
|
Dispatcher,
|
|
4
7
|
IncomingRequest,
|
|
5
8
|
Middleware,
|
|
6
|
-
__facade_invoke__,
|
|
7
|
-
__facade_register__,
|
|
8
|
-
__facade_registerInternal__,
|
|
9
9
|
} from "./common";
|
|
10
|
+
|
|
10
11
|
export { __facade_register__, __facade_registerInternal__ };
|
|
11
12
|
|
|
12
13
|
// Miniflare 2's `EventTarget` follows the spec and doesn't allow exceptions to
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Middleware } from "./common";
|
|
2
|
+
|
|
3
|
+
const HEADER_OUTBOUND_URL = "X-Miniflare-Dispatch-Outbound-URL";
|
|
4
|
+
const HEADER_URL = "X-Miniflare-Dispatch-URL";
|
|
5
|
+
const HEADER_OUTBOUND_PROXY_URL = "X-Miniflare-Dispatch-Outbound-Proxy-URL";
|
|
6
|
+
const HEADER_PARAMETERS = "X-Miniflare-Dispatch-Outbound-Parameters";
|
|
7
|
+
const HEADER_CF_BLOB = "X-Miniflare-Dispatch-Cf-Blob";
|
|
8
|
+
|
|
9
|
+
// A middleware has to be a function of type Middleware
|
|
10
|
+
const dispatchee: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
11
|
+
const url = request.headers.get(HEADER_URL);
|
|
12
|
+
if (!url) {
|
|
13
|
+
throw new Error(
|
|
14
|
+
`This Worker is configured to belong to a dispatch namespace and cannot be access directly. Instead, fetch it from a dispatch namespace binding.`
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
const cfString = request.headers.get(HEADER_CF_BLOB);
|
|
18
|
+
if (!cfString) {
|
|
19
|
+
throw new Error(`Missing ${HEADER_CF_BLOB} header`);
|
|
20
|
+
}
|
|
21
|
+
const cf = JSON.parse(cfString);
|
|
22
|
+
|
|
23
|
+
const outboundProxyUrl = request.headers.get(HEADER_OUTBOUND_PROXY_URL);
|
|
24
|
+
const parameters = request.headers.get(HEADER_PARAMETERS);
|
|
25
|
+
|
|
26
|
+
request = new Request(url, { ...request, cf });
|
|
27
|
+
|
|
28
|
+
request.headers.delete(HEADER_URL);
|
|
29
|
+
request.headers.delete(HEADER_OUTBOUND_PROXY_URL);
|
|
30
|
+
request.headers.delete(HEADER_PARAMETERS);
|
|
31
|
+
request.headers.delete(HEADER_CF_BLOB);
|
|
32
|
+
|
|
33
|
+
if (outboundProxyUrl) {
|
|
34
|
+
const originalFetch = globalThis.fetch;
|
|
35
|
+
globalThis.fetch = (outboundRequestInit, outboundRequestInfo) => {
|
|
36
|
+
const outboundRequest = new Request(
|
|
37
|
+
outboundRequestInit,
|
|
38
|
+
outboundRequestInfo
|
|
39
|
+
);
|
|
40
|
+
outboundRequest.headers.set(HEADER_OUTBOUND_URL, outboundRequest.url);
|
|
41
|
+
outboundRequest.headers.set(HEADER_CF_BLOB, cfString); // cfString here, or outboundRequest.cf?
|
|
42
|
+
if (parameters) {
|
|
43
|
+
outboundRequest.headers.set(HEADER_PARAMETERS, parameters);
|
|
44
|
+
}
|
|
45
|
+
console.log(outboundProxyUrl);
|
|
46
|
+
return originalFetch(outboundProxyUrl, outboundRequest);
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return middlewareCtx.next(request, env);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export default dispatchee;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Middleware } from "./common";
|
|
2
|
+
|
|
3
|
+
const drainBody: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
4
|
+
try {
|
|
5
|
+
return await middlewareCtx.next(request, env);
|
|
6
|
+
} finally {
|
|
7
|
+
try {
|
|
8
|
+
if (request.body !== null && !request.bodyUsed) {
|
|
9
|
+
const reader = request.body.getReader();
|
|
10
|
+
while (!(await reader.read()).done) {}
|
|
11
|
+
}
|
|
12
|
+
} catch (e) {
|
|
13
|
+
console.error("Failed to drain the unused request body.", e);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export default drainBody;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Middleware } from "./common";
|
|
2
|
+
|
|
3
|
+
const HEADER_OUTBOUND_URL = "X-Miniflare-Dispatch-Outbound-URL";
|
|
4
|
+
const HEADER_PARAMETERS = "X-Miniflare-Dispatch-Outbound-Parameters";
|
|
5
|
+
const HEADER_CF_BLOB = "X-Miniflare-Dispatch-Cf-Blob";
|
|
6
|
+
|
|
7
|
+
// A middleware has to be a function of type Middleware
|
|
8
|
+
const outbound: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
9
|
+
const url = request.headers.get(HEADER_OUTBOUND_URL);
|
|
10
|
+
if (!url) {
|
|
11
|
+
return middlewareCtx.next(request, env);
|
|
12
|
+
}
|
|
13
|
+
const cfString = request.headers.get(HEADER_CF_BLOB);
|
|
14
|
+
if (!cfString) {
|
|
15
|
+
throw new Error(`Missing ${HEADER_CF_BLOB} header`);
|
|
16
|
+
}
|
|
17
|
+
const cf = JSON.parse(cfString);
|
|
18
|
+
|
|
19
|
+
const parametersString = request.headers.get(HEADER_PARAMETERS);
|
|
20
|
+
const parameters = parametersString ? JSON.parse(parametersString) : {};
|
|
21
|
+
|
|
22
|
+
for (const [key, value] of Object.entries(parameters)) {
|
|
23
|
+
env[key] = value;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
request = new Request(url, { ...request, cf });
|
|
27
|
+
|
|
28
|
+
request.headers.delete(HEADER_OUTBOUND_URL);
|
|
29
|
+
request.headers.delete(HEADER_CF_BLOB);
|
|
30
|
+
request.headers.delete(HEADER_PARAMETERS);
|
|
31
|
+
|
|
32
|
+
return middlewareCtx.next(request, env);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export default outbound;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/// <reference path="middleware-serve-static-assets.d.ts"/>
|
|
2
2
|
|
|
3
|
+
import manifest from "__STATIC_CONTENT_MANIFEST";
|
|
3
4
|
import {
|
|
4
5
|
getAssetFromKV,
|
|
5
|
-
NotFoundError,
|
|
6
6
|
MethodNotAllowedError,
|
|
7
|
+
NotFoundError,
|
|
7
8
|
serveSinglePageApp,
|
|
8
9
|
} from "@cloudflare/kv-asset-handler";
|
|
10
|
+
import { cacheControl, spaMode } from "config:middleware/serve-static-assets";
|
|
11
|
+
import type { Middleware } from "./common";
|
|
9
12
|
import type { Options } from "@cloudflare/kv-asset-handler";
|
|
10
|
-
import { spaMode, cacheControl } from "config:middleware/serve-static-assets";
|
|
11
13
|
import type * as kvAssetHandler from "@cloudflare/kv-asset-handler";
|
|
12
|
-
import manifest from "__STATIC_CONTENT_MANIFEST";
|
|
13
|
-
const ASSET_MANIFEST = JSON.parse(manifest);
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
const ASSET_MANIFEST = JSON.parse(manifest);
|
|
16
16
|
|
|
17
17
|
const staticAssets: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
18
18
|
let options: Partial<Options> = {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// @ts-ignore entry point will get replaced
|
|
2
2
|
import worker from "__ENTRY_POINT__";
|
|
3
|
+
import { isRoutingRuleMatch } from "./pages-dev-util";
|
|
4
|
+
|
|
3
5
|
// @ts-ignore entry point will get replaced
|
|
4
6
|
export * from "__ENTRY_POINT__";
|
|
5
|
-
import { isRoutingRuleMatch } from "./pages-dev-util";
|
|
6
7
|
|
|
7
8
|
// @ts-ignore routes are injected
|
|
8
9
|
const routes = __ROUTES__;
|
|
@@ -5,10 +5,6 @@ import {
|
|
|
5
5
|
DevToolsCommandResponses,
|
|
6
6
|
DevToolsEvent,
|
|
7
7
|
DevToolsEvents,
|
|
8
|
-
type InspectorProxyWorkerIncomingWebSocketMessage,
|
|
9
|
-
type InspectorProxyWorkerOutgoingRequestBody,
|
|
10
|
-
type InspectorProxyWorkerOutgoingWebsocketMessage,
|
|
11
|
-
type ProxyData,
|
|
12
8
|
serialiseError,
|
|
13
9
|
} from "../../src/api/startDevWorker/events";
|
|
14
10
|
import {
|
|
@@ -18,6 +14,12 @@ import {
|
|
|
18
14
|
MaybePromise,
|
|
19
15
|
urlFromParts,
|
|
20
16
|
} from "../../src/api/startDevWorker/utils";
|
|
17
|
+
import type {
|
|
18
|
+
InspectorProxyWorkerIncomingWebSocketMessage,
|
|
19
|
+
InspectorProxyWorkerOutgoingRequestBody,
|
|
20
|
+
InspectorProxyWorkerOutgoingWebsocketMessage,
|
|
21
|
+
ProxyData,
|
|
22
|
+
} from "../../src/api/startDevWorker/events";
|
|
21
23
|
|
|
22
24
|
const ALLOWED_HOST_HOSTNAMES = ["127.0.0.1", "[::1]", "localhost"];
|
|
23
25
|
const ALLOWED_ORIGIN_HOSTNAMES = [
|
|
@@ -291,6 +293,13 @@ export class InspectorProxyWorker implements DurableObject {
|
|
|
291
293
|
|
|
292
294
|
this.sendDebugLog("NEW RUNTIME WEBSOCKET", runtimeWebSocketUrl);
|
|
293
295
|
|
|
296
|
+
// Make sure DevTools re-fetches script contents,
|
|
297
|
+
// and uses the newly created execution context
|
|
298
|
+
this.sendDevToolsMessage({
|
|
299
|
+
method: "Runtime.executionContextsCleared",
|
|
300
|
+
params: undefined,
|
|
301
|
+
});
|
|
302
|
+
|
|
294
303
|
const upgrade = await fetch(runtimeWebSocketUrl, {
|
|
295
304
|
headers: {
|
|
296
305
|
...this.proxyData.headers,
|