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
|
@@ -1,15 +1,13 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
1
2
|
import { unstable_dev } from "wrangler";
|
|
2
|
-
import { describe, expect, it, beforeAll, afterAll } from "vitest";
|
|
3
3
|
|
|
4
4
|
describe("Worker", () => {
|
|
5
5
|
let worker;
|
|
6
6
|
|
|
7
7
|
beforeAll(async () => {
|
|
8
|
-
worker = await unstable_dev(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
{ disableExperimentalWarning: true }
|
|
12
|
-
);
|
|
8
|
+
worker = await unstable_dev("src/index.js", {
|
|
9
|
+
experimental: { disableExperimentalWarning: true },
|
|
10
|
+
});
|
|
13
11
|
});
|
|
14
12
|
|
|
15
13
|
afterAll(async () => {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
2
|
+
import { unstable_dev } from "wrangler";
|
|
3
|
+
import type { UnstableDevWorker } from "wrangler";
|
|
4
|
+
|
|
5
|
+
describe("Worker", () => {
|
|
6
|
+
let worker: UnstableDevWorker;
|
|
7
|
+
|
|
8
|
+
beforeAll(async () => {
|
|
9
|
+
worker = await unstable_dev("src/index.ts", {
|
|
10
|
+
experimental: { disableExperimentalWarning: true },
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
afterAll(async () => {
|
|
15
|
+
await worker.stop();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("should return Hello World", async () => {
|
|
19
|
+
const resp = await worker.fetch();
|
|
20
|
+
if (resp) {
|
|
21
|
+
const text = await resp.text();
|
|
22
|
+
expect(text).toMatchInlineSnapshot(`"Hello World!"`);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
});
|
|
@@ -5,13 +5,18 @@ export type Dispatcher = (
|
|
|
5
5
|
init: { cron?: string }
|
|
6
6
|
) => Awaitable<void>;
|
|
7
7
|
|
|
8
|
+
export type IncomingRequest = Request<
|
|
9
|
+
unknown,
|
|
10
|
+
IncomingRequestCfProperties<unknown>
|
|
11
|
+
>;
|
|
12
|
+
|
|
8
13
|
export interface MiddlewareContext {
|
|
9
14
|
dispatch: Dispatcher;
|
|
10
|
-
next(request:
|
|
15
|
+
next(request: IncomingRequest, env: any): Awaitable<Response>;
|
|
11
16
|
}
|
|
12
17
|
|
|
13
18
|
export type Middleware = (
|
|
14
|
-
request:
|
|
19
|
+
request: IncomingRequest,
|
|
15
20
|
env: any,
|
|
16
21
|
ctx: ExecutionContext,
|
|
17
22
|
middlewareCtx: MiddlewareContext
|
|
@@ -32,7 +37,7 @@ export function __facade_registerInternal__(
|
|
|
32
37
|
}
|
|
33
38
|
|
|
34
39
|
function __facade_invokeChain__(
|
|
35
|
-
request:
|
|
40
|
+
request: IncomingRequest,
|
|
36
41
|
env: any,
|
|
37
42
|
ctx: ExecutionContext,
|
|
38
43
|
dispatch: Dispatcher,
|
|
@@ -49,7 +54,7 @@ function __facade_invokeChain__(
|
|
|
49
54
|
}
|
|
50
55
|
|
|
51
56
|
export function __facade_invoke__(
|
|
52
|
-
request:
|
|
57
|
+
request: IncomingRequest,
|
|
53
58
|
env: any,
|
|
54
59
|
ctx: ExecutionContext,
|
|
55
60
|
dispatch: Dispatcher,
|
|
@@ -1,25 +1,17 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// // of "plugin" system.
|
|
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.
|
|
6
5
|
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
__facade_invoke__,
|
|
11
|
-
__facade_register__,
|
|
12
|
-
} from "./common";
|
|
6
|
+
import ENTRY, { __INTERNAL_WRANGLER_MIDDLEWARE__ } from "__ENTRY_POINT__";
|
|
7
|
+
import { __facade_invoke__, __facade_register__, Dispatcher } from "./common";
|
|
8
|
+
import type { WorkerEntrypointConstructor } from "__ENTRY_POINT__";
|
|
13
9
|
|
|
14
|
-
//
|
|
15
|
-
import worker from "__ENTRY_POINT__";
|
|
16
|
-
|
|
17
|
-
// We need to preserve all of the exports from the worker
|
|
18
|
-
// @ts-expect-error We'll swap in the entry point during build
|
|
10
|
+
// Preserve all the exports from the worker
|
|
19
11
|
export * from "__ENTRY_POINT__";
|
|
20
12
|
|
|
21
13
|
class __Facade_ScheduledController__ implements ScheduledController {
|
|
22
|
-
#noRetry: ScheduledController["noRetry"];
|
|
14
|
+
readonly #noRetry: ScheduledController["noRetry"];
|
|
23
15
|
|
|
24
16
|
constructor(
|
|
25
17
|
readonly scheduledTime: number,
|
|
@@ -38,20 +30,34 @@ class __Facade_ScheduledController__ implements ScheduledController {
|
|
|
38
30
|
}
|
|
39
31
|
}
|
|
40
32
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
33
|
+
function wrapExportedHandler(worker: ExportedHandler): ExportedHandler {
|
|
34
|
+
// If we don't have any middleware defined, just return the handler as is
|
|
35
|
+
if (
|
|
36
|
+
__INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||
|
|
37
|
+
__INTERNAL_WRANGLER_MIDDLEWARE__.length === 0
|
|
38
|
+
) {
|
|
39
|
+
return worker;
|
|
40
|
+
}
|
|
41
|
+
// Otherwise, register all middleware once
|
|
42
|
+
for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {
|
|
43
|
+
__facade_register__(middleware);
|
|
44
|
+
}
|
|
45
45
|
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
46
|
+
const fetchDispatcher: ExportedHandlerFetchHandler = function (
|
|
47
|
+
request,
|
|
48
|
+
env,
|
|
49
|
+
ctx
|
|
50
|
+
) {
|
|
51
|
+
if (worker.fetch === undefined) {
|
|
52
|
+
throw new Error("Handler does not export a fetch() function.");
|
|
53
|
+
}
|
|
54
|
+
return worker.fetch(request, env, ctx);
|
|
55
|
+
};
|
|
53
56
|
|
|
54
|
-
|
|
57
|
+
return {
|
|
58
|
+
...worker,
|
|
59
|
+
fetch(request, env, ctx) {
|
|
60
|
+
const dispatcher: Dispatcher = function (type, init) {
|
|
55
61
|
if (type === "scheduled" && worker.scheduled !== undefined) {
|
|
56
62
|
const controller = new __Facade_ScheduledController__(
|
|
57
63
|
Date.now(),
|
|
@@ -61,24 +67,68 @@ const facade: ExportedHandler<unknown> = {
|
|
|
61
67
|
return worker.scheduled(controller, env, ctx);
|
|
62
68
|
}
|
|
63
69
|
};
|
|
70
|
+
return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
64
74
|
|
|
75
|
+
function wrapWorkerEntrypoint(
|
|
76
|
+
klass: WorkerEntrypointConstructor
|
|
77
|
+
): WorkerEntrypointConstructor {
|
|
78
|
+
// If we don't have any middleware defined, just return the handler as is
|
|
79
|
+
if (
|
|
80
|
+
__INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||
|
|
81
|
+
__INTERNAL_WRANGLER_MIDDLEWARE__.length === 0
|
|
82
|
+
) {
|
|
83
|
+
return klass;
|
|
84
|
+
}
|
|
85
|
+
// Otherwise, register all middleware once
|
|
86
|
+
for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {
|
|
87
|
+
__facade_register__(middleware);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// `extend`ing `klass` here so other RPC methods remain callable
|
|
91
|
+
return class extends klass {
|
|
92
|
+
#fetchDispatcher: ExportedHandlerFetchHandler<Record<string, unknown>> = (
|
|
93
|
+
request,
|
|
94
|
+
env,
|
|
95
|
+
ctx
|
|
96
|
+
) => {
|
|
97
|
+
this.env = env;
|
|
98
|
+
this.ctx = ctx;
|
|
99
|
+
if (super.fetch === undefined) {
|
|
100
|
+
throw new Error("Entrypoint class does not define a fetch() function.");
|
|
101
|
+
}
|
|
102
|
+
return super.fetch(request);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
#dispatcher: Dispatcher = (type, init) => {
|
|
106
|
+
if (type === "scheduled" && super.scheduled !== undefined) {
|
|
107
|
+
const controller = new __Facade_ScheduledController__(
|
|
108
|
+
Date.now(),
|
|
109
|
+
init.cron ?? "",
|
|
110
|
+
() => {}
|
|
111
|
+
);
|
|
112
|
+
return super.scheduled(controller);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
fetch(request: Request<unknown, IncomingRequestCfProperties>) {
|
|
65
117
|
return __facade_invoke__(
|
|
66
118
|
request,
|
|
67
|
-
env,
|
|
68
|
-
ctx,
|
|
69
|
-
|
|
70
|
-
|
|
119
|
+
this.env,
|
|
120
|
+
this.ctx,
|
|
121
|
+
this.#dispatcher,
|
|
122
|
+
this.#fetchDispatcher
|
|
71
123
|
);
|
|
72
|
-
} else {
|
|
73
|
-
// We didn't have any middleware so we can skip the invocation chain,
|
|
74
|
-
// and just call the fetch handler directly
|
|
75
|
-
|
|
76
|
-
// We "don't care" if this is undefined as we want to have the same behaviour
|
|
77
|
-
// as if the worker completely bypassed middleware.
|
|
78
|
-
return worker.fetch!(request, env, ctx);
|
|
79
124
|
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
};
|
|
125
|
+
};
|
|
126
|
+
}
|
|
83
127
|
|
|
84
|
-
|
|
128
|
+
let WRAPPED_ENTRY: ExportedHandler | WorkerEntrypointConstructor | undefined;
|
|
129
|
+
if (typeof ENTRY === "object") {
|
|
130
|
+
WRAPPED_ENTRY = wrapExportedHandler(ENTRY);
|
|
131
|
+
} else if (typeof ENTRY === "function") {
|
|
132
|
+
WRAPPED_ENTRY = wrapWorkerEntrypoint(ENTRY);
|
|
133
|
+
}
|
|
134
|
+
export default WRAPPED_ENTRY;
|
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import {
|
|
2
|
+
__facade_invoke__,
|
|
3
|
+
__facade_register__,
|
|
4
|
+
__facade_registerInternal__,
|
|
5
|
+
Awaitable,
|
|
6
|
+
Dispatcher,
|
|
7
|
+
IncomingRequest,
|
|
8
|
+
Middleware,
|
|
9
|
+
} from "./common";
|
|
10
|
+
|
|
11
|
+
export { __facade_register__, __facade_registerInternal__ };
|
|
12
|
+
|
|
13
|
+
// Miniflare 2's `EventTarget` follows the spec and doesn't allow exceptions to
|
|
14
|
+
// be caught by `dispatchEvent`. Instead it has a custom `ThrowingEventTarget`
|
|
6
15
|
// class that rethrows errors from event listeners in `dispatchEvent`.
|
|
7
16
|
// We'd like errors to be propagated to the top-level `addEventListener`, so
|
|
8
17
|
// we'd like to use `ThrowingEventTarget`. Unfortunately, `ThrowingEventTarget`
|
|
@@ -15,45 +24,52 @@ if ((globalThis as any).MINIFLARE) {
|
|
|
15
24
|
__FACADE_EVENT_TARGET__ = new EventTarget();
|
|
16
25
|
}
|
|
17
26
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
listener: EventListenerOrEventListenerObject,
|
|
22
|
-
options?: EventTargetAddEventListenerOptions | boolean
|
|
23
|
-
) => void;
|
|
24
|
-
var __facade_removeEventListener__: (
|
|
25
|
-
type: string,
|
|
26
|
-
listener: EventListenerOrEventListenerObject,
|
|
27
|
-
options?: EventTargetEventListenerOptions | boolean
|
|
28
|
-
) => void;
|
|
29
|
-
var __facade_dispatchEvent__: (event: Event) => void;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function __facade_isSpecialEvent__(type: string) {
|
|
27
|
+
function __facade_isSpecialEvent__(
|
|
28
|
+
type: string
|
|
29
|
+
): type is "fetch" | "scheduled" {
|
|
33
30
|
return type === "fetch" || type === "scheduled";
|
|
34
31
|
}
|
|
35
|
-
|
|
32
|
+
const __facade__originalAddEventListener__ = globalThis.addEventListener;
|
|
33
|
+
const __facade__originalRemoveEventListener__ = globalThis.removeEventListener;
|
|
34
|
+
const __facade__originalDispatchEvent__ = globalThis.dispatchEvent;
|
|
35
|
+
|
|
36
|
+
globalThis.addEventListener = function (type, listener, options) {
|
|
36
37
|
if (__facade_isSpecialEvent__(type)) {
|
|
37
|
-
__FACADE_EVENT_TARGET__.addEventListener(
|
|
38
|
+
__FACADE_EVENT_TARGET__.addEventListener(
|
|
39
|
+
type,
|
|
40
|
+
listener as EventListenerOrEventListenerObject,
|
|
41
|
+
options
|
|
42
|
+
);
|
|
38
43
|
} else {
|
|
39
|
-
|
|
44
|
+
__facade__originalAddEventListener__(type, listener, options);
|
|
40
45
|
}
|
|
41
46
|
};
|
|
42
|
-
globalThis.
|
|
47
|
+
globalThis.removeEventListener = function (type, listener, options) {
|
|
43
48
|
if (__facade_isSpecialEvent__(type)) {
|
|
44
|
-
__FACADE_EVENT_TARGET__.removeEventListener(
|
|
49
|
+
__FACADE_EVENT_TARGET__.removeEventListener(
|
|
50
|
+
type,
|
|
51
|
+
listener as EventListenerOrEventListenerObject,
|
|
52
|
+
options
|
|
53
|
+
);
|
|
45
54
|
} else {
|
|
46
|
-
|
|
55
|
+
__facade__originalRemoveEventListener__(type, listener, options);
|
|
47
56
|
}
|
|
48
57
|
};
|
|
49
|
-
globalThis.
|
|
58
|
+
globalThis.dispatchEvent = function (event) {
|
|
50
59
|
if (__facade_isSpecialEvent__(event.type)) {
|
|
51
|
-
__FACADE_EVENT_TARGET__.dispatchEvent(event);
|
|
60
|
+
return __FACADE_EVENT_TARGET__.dispatchEvent(event);
|
|
52
61
|
} else {
|
|
53
|
-
|
|
62
|
+
return __facade__originalDispatchEvent__(event);
|
|
54
63
|
}
|
|
55
64
|
};
|
|
56
65
|
|
|
66
|
+
declare global {
|
|
67
|
+
var addMiddleware: typeof __facade_register__;
|
|
68
|
+
var addMiddlewareInternal: typeof __facade_registerInternal__;
|
|
69
|
+
}
|
|
70
|
+
globalThis.addMiddleware = __facade_register__;
|
|
71
|
+
globalThis.addMiddlewareInternal = __facade_registerInternal__;
|
|
72
|
+
|
|
57
73
|
const __facade_waitUntil__ = Symbol("__facade_waitUntil__");
|
|
58
74
|
const __facade_response__ = Symbol("__facade_response__");
|
|
59
75
|
const __facade_dispatched__ = Symbol("__facade_dispatched__");
|
|
@@ -154,7 +170,7 @@ class __Facade_ScheduledEvent__ extends __Facade_ExtendableEvent__ {
|
|
|
154
170
|
}
|
|
155
171
|
}
|
|
156
172
|
|
|
157
|
-
|
|
173
|
+
__facade__originalAddEventListener__("fetch", (event) => {
|
|
158
174
|
const ctx: ExecutionContext = {
|
|
159
175
|
waitUntil: event.waitUntil.bind(event),
|
|
160
176
|
passThroughOnException: event.passThroughOnException.bind(event),
|
|
@@ -192,7 +208,7 @@ globalThis.addEventListener("fetch", (event) => {
|
|
|
192
208
|
|
|
193
209
|
event.respondWith(
|
|
194
210
|
__facade_invoke__(
|
|
195
|
-
event.request,
|
|
211
|
+
event.request as IncomingRequest,
|
|
196
212
|
globalThis,
|
|
197
213
|
ctx,
|
|
198
214
|
__facade_sw_dispatch__,
|
|
@@ -201,7 +217,7 @@ globalThis.addEventListener("fetch", (event) => {
|
|
|
201
217
|
);
|
|
202
218
|
});
|
|
203
219
|
|
|
204
|
-
|
|
220
|
+
__facade__originalAddEventListener__("scheduled", (event) => {
|
|
205
221
|
const facadeEvent = new __Facade_ScheduledEvent__("scheduled", {
|
|
206
222
|
scheduledTime: event.scheduledTime,
|
|
207
223
|
cron: event.cron,
|
|
@@ -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,32 @@
|
|
|
1
|
+
import type { Middleware } from "./common";
|
|
2
|
+
|
|
3
|
+
interface JsonError {
|
|
4
|
+
message?: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
stack?: string;
|
|
7
|
+
cause?: JsonError;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function reduceError(e: any): JsonError {
|
|
11
|
+
return {
|
|
12
|
+
name: e?.name,
|
|
13
|
+
message: e?.message ?? String(e),
|
|
14
|
+
stack: e?.stack,
|
|
15
|
+
cause: e?.cause === undefined ? undefined : reduceError(e.cause),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// See comment in `bundle.ts` for details on why this is needed
|
|
20
|
+
const jsonError: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
21
|
+
try {
|
|
22
|
+
return await middlewareCtx.next(request, env);
|
|
23
|
+
} catch (e: any) {
|
|
24
|
+
const error = reduceError(e);
|
|
25
|
+
return Response.json(error, {
|
|
26
|
+
status: 500,
|
|
27
|
+
headers: { "MF-Experimental-Error-Stack": "true" },
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export default jsonError;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/// <reference path="middleware-mock-analytics-engine.d.ts"/>
|
|
2
|
+
|
|
3
|
+
import { bindings } from "config:middleware/mock-analytics-engine";
|
|
4
|
+
import type { Middleware } from "./common";
|
|
5
|
+
|
|
6
|
+
const bindingsEnv = Object.fromEntries(
|
|
7
|
+
bindings.map((binding) => [
|
|
8
|
+
binding,
|
|
9
|
+
{
|
|
10
|
+
writeDataPoint() {
|
|
11
|
+
// no op in dev
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
])
|
|
15
|
+
) satisfies Record<string, AnalyticsEngineDataset>;
|
|
16
|
+
|
|
17
|
+
const analyticsEngine: Middleware = async (
|
|
18
|
+
request,
|
|
19
|
+
env,
|
|
20
|
+
_ctx,
|
|
21
|
+
middlewareCtx
|
|
22
|
+
) => {
|
|
23
|
+
// we're going to directly modify env so it maintains referential equality
|
|
24
|
+
for (const binding of bindings) {
|
|
25
|
+
env[binding] ??= bindingsEnv[binding];
|
|
26
|
+
}
|
|
27
|
+
return await middlewareCtx.next(request, env);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export default analyticsEngine;
|
|
@@ -9,7 +9,21 @@ const scheduled: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
|
9
9
|
|
|
10
10
|
return new Response("Ran scheduled event");
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
|
|
13
|
+
const resp = await middlewareCtx.next(request, env);
|
|
14
|
+
|
|
15
|
+
// If you open the `/__scheduled` page in a browser, the browser will automatically make a request to `/favicon.ico`.
|
|
16
|
+
// For scheduled Workers _without_ a fetch handler, this will result in a 500 response that clutters the log with unhelpful error messages.
|
|
17
|
+
// To avoid this, inject a 404 response to favicon.ico loads on the `/__scheduled` page
|
|
18
|
+
if (
|
|
19
|
+
request.headers.get("referer")?.endsWith("/__scheduled") &&
|
|
20
|
+
url.pathname === "/favicon.ico" &&
|
|
21
|
+
resp.status === 500
|
|
22
|
+
) {
|
|
23
|
+
return new Response(null, { status: 404 });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return resp;
|
|
13
27
|
};
|
|
14
28
|
|
|
15
29
|
export default scheduled;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/// <reference path="middleware-serve-static-assets.d.ts"/>
|
|
2
|
+
|
|
3
|
+
import manifest from "__STATIC_CONTENT_MANIFEST";
|
|
4
|
+
import {
|
|
5
|
+
getAssetFromKV,
|
|
6
|
+
MethodNotAllowedError,
|
|
7
|
+
NotFoundError,
|
|
8
|
+
serveSinglePageApp,
|
|
9
|
+
} from "@cloudflare/kv-asset-handler";
|
|
10
|
+
import { cacheControl, spaMode } from "config:middleware/serve-static-assets";
|
|
11
|
+
import type { Middleware } from "./common";
|
|
12
|
+
import type { Options } from "@cloudflare/kv-asset-handler";
|
|
13
|
+
import type * as kvAssetHandler from "@cloudflare/kv-asset-handler";
|
|
14
|
+
|
|
15
|
+
const ASSET_MANIFEST = JSON.parse(manifest);
|
|
16
|
+
|
|
17
|
+
const staticAssets: Middleware = async (request, env, ctx, middlewareCtx) => {
|
|
18
|
+
let options: Partial<Options> = {
|
|
19
|
+
ASSET_MANIFEST,
|
|
20
|
+
ASSET_NAMESPACE: env.__STATIC_CONTENT,
|
|
21
|
+
cacheControl: cacheControl,
|
|
22
|
+
mapRequestToAsset: spaMode ? serveSinglePageApp : undefined,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const page = await (getAssetFromKV as typeof kvAssetHandler.getAssetFromKV)(
|
|
27
|
+
{
|
|
28
|
+
request,
|
|
29
|
+
waitUntil(promise) {
|
|
30
|
+
return ctx.waitUntil(promise);
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
options
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
// allow headers to be altered
|
|
37
|
+
const response = new Response(page.body, page);
|
|
38
|
+
|
|
39
|
+
response.headers.set("X-XSS-Protection", "1; mode=block");
|
|
40
|
+
response.headers.set("X-Content-Type-Options", "nosniff");
|
|
41
|
+
response.headers.set("X-Frame-Options", "DENY");
|
|
42
|
+
response.headers.set("Referrer-Policy", "unsafe-url");
|
|
43
|
+
response.headers.set("Feature-Policy", "none");
|
|
44
|
+
|
|
45
|
+
return response;
|
|
46
|
+
} catch (e) {
|
|
47
|
+
if (e instanceof NotFoundError || e instanceof MethodNotAllowedError) {
|
|
48
|
+
// if a known error is thrown then serve from actual worker
|
|
49
|
+
return await middlewareCtx.next(request, env);
|
|
50
|
+
}
|
|
51
|
+
// otherwise it's a real error, so throw it
|
|
52
|
+
throw e;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export default staticAssets;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* - Run `curl "http://localhost:8787/cdn-cgi/mf/scheduled"` to trigger the scheduled event
|
|
6
6
|
* - Go back to the console to see what your worker has logged
|
|
7
7
|
* - Update the Cron trigger in wrangler.toml (see https://developers.cloudflare.com/workers/wrangler/configuration/#triggers)
|
|
8
|
-
* - Run `wrangler
|
|
8
|
+
* - Run `wrangler deploy --name my-worker` to deploy your worker
|
|
9
9
|
*
|
|
10
10
|
* Learn more at https://developers.cloudflare.com/workers/runtime-apis/scheduled-event/
|
|
11
11
|
*/
|
package/templates/new-worker.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* - Run `wrangler dev src/index.ts` in your terminal to start a development server
|
|
5
5
|
* - Open a browser tab at http://localhost:8787/ to see your worker in action
|
|
6
|
-
* - Run `wrangler
|
|
6
|
+
* - Run `wrangler deploy src/index.ts --name my-worker` to deploy your worker
|
|
7
7
|
*
|
|
8
8
|
* Learn more at https://developers.cloudflare.com/workers/
|
|
9
9
|
*/
|
|
@@ -17,6 +17,9 @@ export interface Env {
|
|
|
17
17
|
//
|
|
18
18
|
// Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/
|
|
19
19
|
// MY_BUCKET: R2Bucket;
|
|
20
|
+
//
|
|
21
|
+
// Example binding to a Service. Learn more at https://developers.cloudflare.com/workers/runtime-apis/service-bindings/
|
|
22
|
+
// MY_SERVICE: Fetcher;
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
export default {
|
|
@@ -1,31 +1,28 @@
|
|
|
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
7
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
const routes = {
|
|
11
|
-
// @ts-ignore routes are injected
|
|
12
|
-
include: __ROUTES__.include.map(transformToRegex),
|
|
13
|
-
// @ts-ignore routes are injected
|
|
14
|
-
exclude: __ROUTES__.exclude.map(transformToRegex) || [],
|
|
15
|
-
};
|
|
8
|
+
// @ts-ignore routes are injected
|
|
9
|
+
const routes = __ROUTES__;
|
|
16
10
|
|
|
17
|
-
export default {
|
|
11
|
+
export default <ExportedHandler<{ ASSETS: Fetcher }>>{
|
|
18
12
|
fetch(request, env, context) {
|
|
19
13
|
const { pathname } = new URL(request.url);
|
|
20
14
|
|
|
21
15
|
for (const exclude of routes.exclude) {
|
|
22
|
-
if (pathname
|
|
16
|
+
if (isRoutingRuleMatch(pathname, exclude)) {
|
|
23
17
|
return env.ASSETS.fetch(request);
|
|
24
18
|
}
|
|
25
19
|
}
|
|
26
20
|
|
|
27
21
|
for (const include of routes.include) {
|
|
28
|
-
if (pathname
|
|
22
|
+
if (isRoutingRuleMatch(pathname, include)) {
|
|
23
|
+
if (worker.fetch === undefined) {
|
|
24
|
+
throw new TypeError("Entry point missing `fetch` handler");
|
|
25
|
+
}
|
|
29
26
|
return worker.fetch(request, env, context);
|
|
30
27
|
}
|
|
31
28
|
}
|