wrangler 0.0.0-ecc8b172 → 0.0.0-ecded1af1
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 +17 -19
- package/bin/wrangler.js +24 -93
- package/config-schema.json +3115 -0
- package/package.json +197 -190
- package/templates/__tests__/pages-dev-util.test.ts +128 -0
- package/templates/__tests__/tsconfig-sanity.ts +12 -0
- package/templates/__tests__/tsconfig.json +8 -0
- package/templates/checked-fetch.js +19 -6
- package/templates/facade.d.ts +19 -0
- package/templates/gitignore +2 -3
- package/templates/init-tests/test-jest-new-worker.js +3 -5
- package/templates/init-tests/test-vitest-new-worker.js +4 -6
- package/templates/init-tests/test-vitest-new-worker.ts +25 -0
- package/templates/middleware/common.ts +9 -4
- package/templates/middleware/loader-modules.ts +94 -44
- package/templates/middleware/loader-sw.ts +48 -32
- package/templates/middleware/middleware-ensure-req-body-drained.ts +18 -0
- package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
- 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-scheduled.ts +15 -1
- package/templates/middleware/middleware-serve-static-assets.d.ts +6 -0
- package/templates/middleware/middleware-serve-static-assets.ts +56 -0
- package/templates/modules-watch-stub.js +4 -0
- package/templates/new-worker-scheduled.ts +1 -1
- package/templates/new-worker.ts +4 -1
- package/templates/pages-dev-pipeline.ts +10 -13
- package/templates/pages-dev-util.ts +55 -0
- package/templates/pages-shim.ts +1 -1
- package/templates/pages-template-plugin.ts +37 -14
- package/templates/pages-template-worker.ts +33 -7
- package/templates/startDevWorker/InspectorProxyWorker.ts +664 -0
- package/templates/startDevWorker/ProxyWorker.ts +336 -0
- package/templates/tsconfig-sanity.ts +11 -0
- package/templates/tsconfig.init.json +22 -0
- package/templates/tsconfig.json +5 -102
- package/wrangler-dist/InspectorProxyWorker.js +464 -0
- package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
- package/wrangler-dist/ProxyWorker.js +241 -0
- package/wrangler-dist/ProxyWorker.js.map +6 -0
- package/wrangler-dist/cli.d.ts +26095 -471
- package/wrangler-dist/cli.js +178062 -122008
- package/wrangler-dist/wasm-sync.wasm +0 -0
- package/Cloudflare_CA.pem +0 -18
- package/import_meta_url.js +0 -3
- package/miniflare-config-stubs/.env.empty +0 -0
- package/miniflare-config-stubs/package.empty.json +0 -1
- package/miniflare-config-stubs/wrangler.empty.toml +0 -0
- package/miniflare-dist/index.mjs +0 -6310
- package/src/__tests__/api-dev.test.ts +0 -209
- package/src/__tests__/api-devregistry.test.js +0 -56
- package/src/__tests__/api.test.ts +0 -80
- package/src/__tests__/config-cache-without-cache-dir.test.ts +0 -38
- package/src/__tests__/config-cache.test.ts +0 -42
- package/src/__tests__/configuration.test.ts +0 -3864
- package/src/__tests__/d1.test.ts +0 -70
- package/src/__tests__/delete.test.ts +0 -116
- package/src/__tests__/dev.test.tsx +0 -1357
- package/src/__tests__/dialogs.test.tsx +0 -40
- package/src/__tests__/generate.test.ts +0 -235
- package/src/__tests__/get-host-from-url.test.ts +0 -16
- package/src/__tests__/guess-worker-format.test.ts +0 -85
- package/src/__tests__/helpers/clipboardy-mock.js +0 -4
- package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
- package/src/__tests__/helpers/mock-account-id.ts +0 -48
- package/src/__tests__/helpers/mock-bin.ts +0 -36
- package/src/__tests__/helpers/mock-cfetch.ts +0 -333
- package/src/__tests__/helpers/mock-console.ts +0 -106
- package/src/__tests__/helpers/mock-dialogs.ts +0 -153
- package/src/__tests__/helpers/mock-get-zone-from-host.ts +0 -8
- package/src/__tests__/helpers/mock-http-server.ts +0 -46
- package/src/__tests__/helpers/mock-istty.ts +0 -74
- package/src/__tests__/helpers/mock-known-routes.ts +0 -7
- package/src/__tests__/helpers/mock-kv.ts +0 -33
- package/src/__tests__/helpers/mock-oauth-flow.ts +0 -252
- package/src/__tests__/helpers/mock-process.ts +0 -39
- package/src/__tests__/helpers/mock-stdin.ts +0 -108
- package/src/__tests__/helpers/mock-web-socket.ts +0 -29
- package/src/__tests__/helpers/msw/handlers/namespaces.ts +0 -104
- package/src/__tests__/helpers/msw/handlers/oauth.ts +0 -36
- package/src/__tests__/helpers/msw/handlers/r2.ts +0 -80
- package/src/__tests__/helpers/msw/handlers/script.ts +0 -75
- package/src/__tests__/helpers/msw/handlers/user.ts +0 -63
- package/src/__tests__/helpers/msw/index.ts +0 -15
- package/src/__tests__/helpers/run-in-tmp.ts +0 -38
- package/src/__tests__/helpers/run-wrangler.ts +0 -16
- package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +0 -1
- package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +0 -5
- package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +0 -1
- package/src/__tests__/helpers/worker-scripts/parent-worker.js +0 -8
- package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +0 -5
- package/src/__tests__/helpers/write-worker-source.ts +0 -31
- package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
- package/src/__tests__/https-options.test.ts +0 -163
- package/src/__tests__/index.test.ts +0 -251
- package/src/__tests__/init.test.ts +0 -2816
- package/src/__tests__/jest.setup.ts +0 -191
- package/src/__tests__/kv.test.ts +0 -1675
- package/src/__tests__/logger.test.ts +0 -141
- package/src/__tests__/metrics.test.ts +0 -450
- package/src/__tests__/middleware.scheduled.test.ts +0 -135
- package/src/__tests__/middleware.test.ts +0 -726
- package/src/__tests__/package-manager.test.ts +0 -353
- package/src/__tests__/pages.test.ts +0 -2111
- package/src/__tests__/parse.test.ts +0 -330
- package/src/__tests__/paths.test.ts +0 -39
- package/src/__tests__/publish.test.ts +0 -7119
- package/src/__tests__/pubsub.test.ts +0 -367
- package/src/__tests__/r2.test.ts +0 -371
- package/src/__tests__/route.test.ts +0 -45
- package/src/__tests__/secret.test.ts +0 -644
- package/src/__tests__/tail.test.ts +0 -800
- package/src/__tests__/test-old-node-version.js +0 -31
- package/src/__tests__/user.test.ts +0 -155
- package/src/__tests__/utils-collectKeyValues.test.ts +0 -47
- package/src/__tests__/validate-dev-props.test.ts +0 -56
- package/src/__tests__/version.test.ts +0 -35
- package/src/__tests__/whoami.test.tsx +0 -278
- package/src/__tests__/worker-namespace.test.ts +0 -321
- package/src/abort.d.ts +0 -3
- package/src/api/dev.ts +0 -208
- package/src/api/index.ts +0 -2
- package/src/bundle-reporter.tsx +0 -29
- package/src/bundle.ts +0 -756
- package/src/cfetch/index.ts +0 -160
- package/src/cfetch/internal.ts +0 -263
- package/src/cli.ts +0 -29
- package/src/config/README.md +0 -107
- package/src/config/config.ts +0 -275
- package/src/config/diagnostics.ts +0 -80
- package/src/config/environment.ts +0 -505
- package/src/config/index.ts +0 -293
- package/src/config/validation-helpers.ts +0 -597
- package/src/config/validation.ts +0 -1930
- package/src/config-cache.ts +0 -85
- package/src/create-worker-preview.ts +0 -275
- package/src/create-worker-upload-form.ts +0 -301
- package/src/d1/backups.tsx +0 -212
- package/src/d1/create.tsx +0 -54
- package/src/d1/delete.tsx +0 -56
- package/src/d1/execute.tsx +0 -294
- package/src/d1/formatTimeAgo.ts +0 -14
- package/src/d1/index.ts +0 -75
- package/src/d1/list.tsx +0 -48
- package/src/d1/options.ts +0 -12
- package/src/d1/types.tsx +0 -14
- package/src/d1/utils.ts +0 -39
- package/src/delete.ts +0 -86
- package/src/deprecated/index.ts +0 -453
- package/src/dev/dev-vars.ts +0 -36
- package/src/dev/dev.tsx +0 -575
- package/src/dev/get-local-persistence-path.tsx +0 -31
- package/src/dev/local.tsx +0 -686
- package/src/dev/remote.tsx +0 -601
- package/src/dev/start-server.ts +0 -506
- package/src/dev/use-esbuild.ts +0 -197
- package/src/dev/validate-dev-props.ts +0 -31
- package/src/dev-registry.tsx +0 -201
- package/src/dev.tsx +0 -865
- package/src/dialogs.tsx +0 -163
- package/src/dispatch-namespace.ts +0 -206
- package/src/durable.ts +0 -102
- package/src/entry.ts +0 -329
- package/src/environment-variables.ts +0 -50
- package/src/errors.ts +0 -11
- package/src/git-client.ts +0 -124
- package/src/global-wrangler-config-path.ts +0 -26
- package/src/https-options.ts +0 -127
- package/src/index.tsx +0 -582
- package/src/init.ts +0 -970
- package/src/inspect.ts +0 -747
- package/src/intl-polyfill.d.ts +0 -139
- package/src/is-ci.ts +0 -14
- package/src/is-interactive.ts +0 -12
- package/src/kv/helpers.ts +0 -430
- package/src/kv/index.ts +0 -645
- package/src/logger.ts +0 -80
- package/src/metrics/index.ts +0 -5
- package/src/metrics/metrics-config.ts +0 -239
- package/src/metrics/metrics-dispatcher.ts +0 -96
- package/src/metrics/metrics-usage-headers.ts +0 -24
- package/src/metrics/send-event.ts +0 -94
- package/src/miniflare-cli/README.md +0 -30
- package/src/miniflare-cli/assets.ts +0 -215
- package/src/miniflare-cli/index.ts +0 -208
- package/src/miniflare-cli/request-context.ts +0 -40
- package/src/module-collection.ts +0 -267
- package/src/open-in-browser.ts +0 -17
- package/src/package-manager.ts +0 -219
- package/src/pages/build.tsx +0 -238
- package/src/pages/constants.ts +0 -16
- package/src/pages/deployments.tsx +0 -106
- package/src/pages/dev.tsx +0 -689
- package/src/pages/errors.ts +0 -66
- package/src/pages/functions/buildPlugin.ts +0 -110
- package/src/pages/functions/buildWorker.ts +0 -156
- package/src/pages/functions/filepath-routing.test.ts +0 -234
- package/src/pages/functions/filepath-routing.ts +0 -189
- package/src/pages/functions/identifiers.ts +0 -78
- package/src/pages/functions/routes-consolidation.test.ts +0 -250
- package/src/pages/functions/routes-consolidation.ts +0 -73
- package/src/pages/functions/routes-transformation.test.ts +0 -282
- package/src/pages/functions/routes-transformation.ts +0 -115
- package/src/pages/functions/routes-validation.test.ts +0 -403
- package/src/pages/functions/routes-validation.ts +0 -202
- package/src/pages/functions/routes.ts +0 -151
- package/src/pages/functions.tsx +0 -82
- package/src/pages/hash.tsx +0 -13
- package/src/pages/index.tsx +0 -94
- package/src/pages/projects.tsx +0 -169
- package/src/pages/publish.tsx +0 -436
- package/src/pages/types.ts +0 -49
- package/src/pages/upload.tsx +0 -398
- package/src/pages/utils.ts +0 -12
- package/src/parse.ts +0 -286
- package/src/paths.ts +0 -71
- package/src/proxy.ts +0 -657
- package/src/publish/index.ts +0 -267
- package/src/publish/publish.ts +0 -913
- package/src/pubsub/index.ts +0 -286
- package/src/pubsub/pubsub-commands.tsx +0 -623
- package/src/r2/helpers.ts +0 -131
- package/src/r2/index.ts +0 -277
- package/src/routes.ts +0 -140
- package/src/secret/index.ts +0 -403
- package/src/selfsigned.d.ts +0 -29
- package/src/sites.tsx +0 -372
- package/src/tail/createTail.ts +0 -315
- package/src/tail/filters.ts +0 -277
- package/src/tail/index.ts +0 -217
- package/src/tail/printing.ts +0 -107
- package/src/update-check.ts +0 -19
- package/src/user/choose-account.tsx +0 -69
- package/src/user/env-vars.ts +0 -46
- package/src/user/generate-auth-url.ts +0 -33
- package/src/user/generate-random-state.ts +0 -16
- package/src/user/index.ts +0 -3
- package/src/user/user.tsx +0 -1192
- package/src/utils/collectKeyValues.ts +0 -14
- package/src/whoami.tsx +0 -169
- package/src/worker.ts +0 -234
- package/src/yargs-types.ts +0 -7
- package/src/zones.ts +0 -165
- package/templates/d1-beta-facade.js +0 -174
- package/templates/experimental-local-cache-stubs.js +0 -27
- package/templates/first-party-worker-module-facade.ts +0 -18
- package/templates/format-dev-errors.ts +0 -32
- package/templates/serve-static-assets.ts +0 -63
- package/templates/service-bindings-module-facade.js +0 -54
- package/templates/service-bindings-sw-facade.js +0 -42
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param pathname A pathname string, such as `/foo` or `/foo/bar`
|
|
3
|
+
* @param routingRule The routing rule, such as `/foo/*`
|
|
4
|
+
* @returns True if pathname matches the routing rule
|
|
5
|
+
*
|
|
6
|
+
* / -> /
|
|
7
|
+
* /* -> /*
|
|
8
|
+
* /foo -> /foo
|
|
9
|
+
* /foo* -> /foo, /foo-bar, /foo/*
|
|
10
|
+
* /foo/* -> /foo, /foo/bar
|
|
11
|
+
*/
|
|
12
|
+
export function isRoutingRuleMatch(
|
|
13
|
+
pathname: string,
|
|
14
|
+
routingRule: string
|
|
15
|
+
): boolean {
|
|
16
|
+
// sanity checks
|
|
17
|
+
if (!pathname) {
|
|
18
|
+
throw new Error("Pathname is undefined.");
|
|
19
|
+
}
|
|
20
|
+
if (!routingRule) {
|
|
21
|
+
throw new Error("Routing rule is undefined.");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const ruleRegExp = transformRoutingRuleToRegExp(routingRule);
|
|
25
|
+
return pathname.match(ruleRegExp) !== null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function transformRoutingRuleToRegExp(rule: string): RegExp {
|
|
29
|
+
let transformedRule;
|
|
30
|
+
|
|
31
|
+
if (rule === "/" || rule === "/*") {
|
|
32
|
+
transformedRule = rule;
|
|
33
|
+
} else if (rule.endsWith("/*")) {
|
|
34
|
+
// make `/*` an optional group so we can match both /foo/* and /foo
|
|
35
|
+
// /foo/* => /foo(/*)?
|
|
36
|
+
transformedRule = `${rule.substring(0, rule.length - 2)}(/*)?`;
|
|
37
|
+
} else if (rule.endsWith("/")) {
|
|
38
|
+
// make `/` an optional group so we can match both /foo/ and /foo
|
|
39
|
+
// /foo/ => /foo(/)?
|
|
40
|
+
transformedRule = `${rule.substring(0, rule.length - 1)}(/)?`;
|
|
41
|
+
} else if (rule.endsWith("*")) {
|
|
42
|
+
transformedRule = rule;
|
|
43
|
+
} else {
|
|
44
|
+
transformedRule = `${rule}(/)?`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// /foo* => /foo.* => ^/foo.*$
|
|
48
|
+
// /*.* => /*\.* => /.*\..* => ^/.*\..*$
|
|
49
|
+
transformedRule = `^${transformedRule
|
|
50
|
+
.replaceAll(/\./g, "\\.")
|
|
51
|
+
.replaceAll(/\*/g, ".*")}$`;
|
|
52
|
+
|
|
53
|
+
// ^/foo.*$ => /^\/foo.*$/
|
|
54
|
+
return new RegExp(transformedRule);
|
|
55
|
+
}
|
package/templates/pages-shim.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// This Worker is used as a default when no Pages Functions are present.
|
|
2
2
|
// It proxies the request directly on to the asset server binding.
|
|
3
3
|
|
|
4
|
-
export default {
|
|
4
|
+
export default <ExportedHandler<{ ASSETS: Fetcher }>>{
|
|
5
5
|
async fetch(request, env, context) {
|
|
6
6
|
const response = await env.ASSETS.fetch(request.url, request);
|
|
7
7
|
return new Response(response.body, response);
|
|
@@ -19,6 +19,7 @@ type EventContext<Env, P extends string, Data> = {
|
|
|
19
19
|
request: Request;
|
|
20
20
|
functionPath: string;
|
|
21
21
|
waitUntil: (promise: Promise<unknown>) => void;
|
|
22
|
+
passThroughOnException: () => void;
|
|
22
23
|
next: (input?: Request | string, init?: RequestInit) => Promise<Response>;
|
|
23
24
|
env: Env & { ASSETS: { fetch: typeof fetch } };
|
|
24
25
|
params: Params<P>;
|
|
@@ -29,6 +30,7 @@ type EventPluginContext<Env, P extends string, Data, PluginArgs> = {
|
|
|
29
30
|
request: Request;
|
|
30
31
|
functionPath: string;
|
|
31
32
|
waitUntil: (promise: Promise<unknown>) => void;
|
|
33
|
+
passThroughOnException: () => void;
|
|
32
34
|
next: (input?: Request | string, init?: RequestInit) => Promise<Response>;
|
|
33
35
|
env: Env & { ASSETS: { fetch: typeof fetch } };
|
|
34
36
|
params: Params<P>;
|
|
@@ -39,14 +41,14 @@ type EventPluginContext<Env, P extends string, Data, PluginArgs> = {
|
|
|
39
41
|
declare type PagesFunction<
|
|
40
42
|
Env = unknown,
|
|
41
43
|
P extends string = string,
|
|
42
|
-
Data extends Record<string, unknown> = Record<string, unknown
|
|
44
|
+
Data extends Record<string, unknown> = Record<string, unknown>,
|
|
43
45
|
> = (context: EventContext<Env, P, Data>) => Response | Promise<Response>;
|
|
44
46
|
|
|
45
47
|
declare type PagesPluginFunction<
|
|
46
48
|
Env = unknown,
|
|
47
49
|
P extends string = string,
|
|
48
50
|
Data extends Record<string, unknown> = Record<string, unknown>,
|
|
49
|
-
PluginArgs = unknown
|
|
51
|
+
PluginArgs = unknown,
|
|
50
52
|
> = (
|
|
51
53
|
context: EventPluginContext<Env, P, Data, PluginArgs>
|
|
52
54
|
) => Response | Promise<Response>;
|
|
@@ -117,20 +119,26 @@ function* executeRequest(request: Request, relativePathname: string) {
|
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
121
|
|
|
120
|
-
export default function (pluginArgs) {
|
|
122
|
+
export default function (pluginArgs: unknown) {
|
|
121
123
|
const onRequest: PagesPluginFunction = async (workerContext) => {
|
|
122
124
|
let { request } = workerContext;
|
|
123
|
-
const { env, next
|
|
125
|
+
const { env, next } = workerContext;
|
|
126
|
+
let { data } = workerContext;
|
|
124
127
|
|
|
125
128
|
const url = new URL(request.url);
|
|
129
|
+
// TODO: Replace this with something actually legible.
|
|
126
130
|
const relativePathname = `/${
|
|
127
|
-
url.pathname.
|
|
131
|
+
url.pathname.replace(workerContext.functionPath, "") || ""
|
|
128
132
|
}`.replace(/^\/\//, "/");
|
|
129
133
|
|
|
130
134
|
const handlerIterator = executeRequest(request, relativePathname);
|
|
131
135
|
const pluginNext = async (input?: RequestInfo, init?: RequestInit) => {
|
|
132
136
|
if (input !== undefined) {
|
|
133
|
-
|
|
137
|
+
let url = input;
|
|
138
|
+
if (typeof input === "string") {
|
|
139
|
+
url = new URL(input, request.url).toString();
|
|
140
|
+
}
|
|
141
|
+
request = new Request(url, init);
|
|
134
142
|
}
|
|
135
143
|
|
|
136
144
|
const result = handlerIterator.next();
|
|
@@ -138,25 +146,32 @@ export default function (pluginArgs) {
|
|
|
138
146
|
if (result.done === false) {
|
|
139
147
|
const { handler, params, path } = result.value;
|
|
140
148
|
const context = {
|
|
141
|
-
request,
|
|
149
|
+
request: new Request(request.clone()),
|
|
142
150
|
functionPath: workerContext.functionPath + path,
|
|
143
151
|
next: pluginNext,
|
|
144
152
|
params,
|
|
145
|
-
data
|
|
153
|
+
get data() {
|
|
154
|
+
return data;
|
|
155
|
+
},
|
|
156
|
+
set data(value) {
|
|
157
|
+
if (typeof value !== "object" || value === null) {
|
|
158
|
+
throw new Error("context.data must be an object");
|
|
159
|
+
}
|
|
160
|
+
// user has overriden context.data, so we need to merge it with the existing data
|
|
161
|
+
data = value;
|
|
162
|
+
},
|
|
146
163
|
pluginArgs,
|
|
147
164
|
env,
|
|
148
165
|
waitUntil: workerContext.waitUntil.bind(workerContext),
|
|
166
|
+
passThroughOnException:
|
|
167
|
+
workerContext.passThroughOnException.bind(workerContext),
|
|
149
168
|
};
|
|
150
169
|
|
|
151
170
|
const response = await handler(context);
|
|
152
171
|
|
|
153
|
-
|
|
154
|
-
return new Response(
|
|
155
|
-
[101, 204, 205, 304].includes(response.status) ? null : response.body,
|
|
156
|
-
{ ...response, headers: new Headers(response.headers) }
|
|
157
|
-
);
|
|
172
|
+
return cloneResponse(response);
|
|
158
173
|
} else {
|
|
159
|
-
return next();
|
|
174
|
+
return next(request);
|
|
160
175
|
}
|
|
161
176
|
};
|
|
162
177
|
|
|
@@ -165,3 +180,11 @@ export default function (pluginArgs) {
|
|
|
165
180
|
|
|
166
181
|
return onRequest;
|
|
167
182
|
}
|
|
183
|
+
|
|
184
|
+
// This makes a Response mutable
|
|
185
|
+
const cloneResponse = (response: Response) =>
|
|
186
|
+
// https://fetch.spec.whatwg.org/#null-body-status
|
|
187
|
+
new Response(
|
|
188
|
+
[101, 204, 205, 304].includes(response.status) ? null : response.body,
|
|
189
|
+
response
|
|
190
|
+
);
|
|
@@ -19,6 +19,7 @@ type EventContext<Env, P extends string, Data> = {
|
|
|
19
19
|
request: Request;
|
|
20
20
|
functionPath: string;
|
|
21
21
|
waitUntil: (promise: Promise<unknown>) => void;
|
|
22
|
+
passThroughOnException: () => void;
|
|
22
23
|
next: (input?: Request | string, init?: RequestInit) => Promise<Response>;
|
|
23
24
|
env: Env & { ASSETS: { fetch: typeof fetch } };
|
|
24
25
|
params: Params<P>;
|
|
@@ -28,7 +29,7 @@ type EventContext<Env, P extends string, Data> = {
|
|
|
28
29
|
declare type PagesFunction<
|
|
29
30
|
Env = unknown,
|
|
30
31
|
P extends string = string,
|
|
31
|
-
Data extends Record<string, unknown> = Record<string, unknown
|
|
32
|
+
Data extends Record<string, unknown> = Record<string, unknown>,
|
|
32
33
|
> = (context: EventContext<Env, P, Data>) => Response | Promise<Response>;
|
|
33
34
|
/* end @cloudflare/workers-types */
|
|
34
35
|
|
|
@@ -53,6 +54,7 @@ type FetchEnv = {
|
|
|
53
54
|
|
|
54
55
|
type WorkerContext = {
|
|
55
56
|
waitUntil: (promise: Promise<unknown>) => void;
|
|
57
|
+
passThroughOnException: () => void;
|
|
56
58
|
};
|
|
57
59
|
|
|
58
60
|
function* executeRequest(request: Request) {
|
|
@@ -111,9 +113,16 @@ function* executeRequest(request: Request) {
|
|
|
111
113
|
}
|
|
112
114
|
|
|
113
115
|
export default {
|
|
114
|
-
async fetch(
|
|
116
|
+
async fetch(
|
|
117
|
+
originalRequest: Request,
|
|
118
|
+
env: FetchEnv,
|
|
119
|
+
workerContext: WorkerContext
|
|
120
|
+
) {
|
|
121
|
+
let request = originalRequest;
|
|
115
122
|
const handlerIterator = executeRequest(request);
|
|
116
|
-
|
|
123
|
+
let data = {}; // arbitrary data the user can set between functions
|
|
124
|
+
let isFailOpen = false;
|
|
125
|
+
|
|
117
126
|
const next = async (input?: RequestInfo, init?: RequestInit) => {
|
|
118
127
|
if (input !== undefined) {
|
|
119
128
|
let url = input;
|
|
@@ -132,9 +141,21 @@ export default {
|
|
|
132
141
|
functionPath: path,
|
|
133
142
|
next,
|
|
134
143
|
params,
|
|
135
|
-
data
|
|
144
|
+
get data() {
|
|
145
|
+
return data;
|
|
146
|
+
},
|
|
147
|
+
set data(value) {
|
|
148
|
+
if (typeof value !== "object" || value === null) {
|
|
149
|
+
throw new Error("context.data must be an object");
|
|
150
|
+
}
|
|
151
|
+
// user has overriden context.data, so we need to merge it with the existing data
|
|
152
|
+
data = value;
|
|
153
|
+
},
|
|
136
154
|
env,
|
|
137
155
|
waitUntil: workerContext.waitUntil.bind(workerContext),
|
|
156
|
+
passThroughOnException: () => {
|
|
157
|
+
isFailOpen = true;
|
|
158
|
+
},
|
|
138
159
|
};
|
|
139
160
|
|
|
140
161
|
const response = await handler(context);
|
|
@@ -156,9 +177,14 @@ export default {
|
|
|
156
177
|
};
|
|
157
178
|
|
|
158
179
|
try {
|
|
159
|
-
return next();
|
|
160
|
-
} catch (
|
|
161
|
-
|
|
180
|
+
return await next();
|
|
181
|
+
} catch (error) {
|
|
182
|
+
if (isFailOpen) {
|
|
183
|
+
const response = await env[__FALLBACK_SERVICE__].fetch(request);
|
|
184
|
+
return cloneResponse(response);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
throw error;
|
|
162
188
|
}
|
|
163
189
|
},
|
|
164
190
|
};
|