wrangler 0.0.0-e7a0cd5b → 0.0.0-e8053554
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 +12 -14
- package/bin/wrangler.js +24 -65
- package/package.json +213 -191
- 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 +17 -0
- package/templates/gitignore +1 -0
- package/templates/init-tests/test-jest-new-worker.js +3 -5
- package/templates/init-tests/test-vitest-new-worker.js +3 -5
- package/templates/init-tests/test-vitest-new-worker.ts +25 -0
- package/templates/middleware/common.ts +9 -4
- package/templates/middleware/loader-modules.ts +64 -11
- package/templates/middleware/loader-sw.ts +47 -32
- package/templates/middleware/middleware-d1-beta.d.ts +3 -0
- package/templates/middleware/middleware-miniflare3-json-error.ts +33 -0
- package/templates/middleware/middleware-multiworker-dev.d.ts +4 -0
- package/templates/middleware/middleware-multiworker-dev.ts +68 -0
- 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 +4 -1
- package/templates/pages-dev-util.ts +4 -1
- package/templates/pages-shim.ts +1 -1
- package/templates/pages-template-plugin.ts +31 -12
- package/templates/pages-template-worker.ts +11 -2
- package/templates/startDevWorker/InspectorProxyWorker.ts +652 -0
- package/templates/startDevWorker/ProxyWorker.ts +252 -0
- package/templates/tsconfig-sanity.ts +11 -0
- package/templates/tsconfig.init.json +105 -0
- package/templates/tsconfig.json +5 -103
- package/wrangler-dist/InspectorProxyWorker.js +460 -0
- package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
- package/wrangler-dist/ProxyWorker.js +186 -0
- package/wrangler-dist/ProxyWorker.js.map +6 -0
- package/wrangler-dist/cli.d.ts +23148 -533
- package/wrangler-dist/cli.js +135057 -136366
- package/wrangler-dist/wasm-sync.wasm +0 -0
- 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 -6316
- package/src/__tests__/access.test.ts +0 -25
- package/src/__tests__/api-dev.test.ts +0 -209
- package/src/__tests__/api-devregistry.test.js +0 -57
- 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 -4028
- package/src/__tests__/d1.test.ts +0 -72
- package/src/__tests__/delete.test.ts +0 -230
- package/src/__tests__/deployments.test.ts +0 -95
- package/src/__tests__/dev.test.tsx +0 -1509
- 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/access.ts +0 -13
- package/src/__tests__/helpers/msw/handlers/deployments.ts +0 -59
- 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/handlers/zones.ts +0 -22
- package/src/__tests__/helpers/msw/index.ts +0 -21
- 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 -262
- package/src/__tests__/init.test.ts +0 -2900
- package/src/__tests__/jest.setup.ts +0 -202
- 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 -2223
- package/src/__tests__/parse.test.ts +0 -330
- package/src/__tests__/paths.test.ts +0 -39
- package/src/__tests__/publish.test.ts +0 -7660
- package/src/__tests__/pubsub.test.ts +0 -370
- package/src/__tests__/queues.test.ts +0 -371
- package/src/__tests__/r2.test.ts +0 -376
- 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__/type-generation.test.ts +0 -217
- 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 -326
- 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 -68
- package/src/bundle.ts +0 -785
- package/src/cfetch/index.ts +0 -160
- package/src/cfetch/internal.ts +0 -263
- package/src/cli.ts +0 -28
- 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 -563
- package/src/config/index.ts +0 -342
- package/src/config/validation-helpers.ts +0 -597
- package/src/config/validation.ts +0 -2113
- package/src/config-cache.ts +0 -85
- package/src/create-worker-preview.ts +0 -282
- package/src/create-worker-upload-form.ts +0 -321
- package/src/d1/backups.tsx +0 -218
- package/src/d1/create.tsx +0 -54
- package/src/d1/delete.tsx +0 -56
- package/src/d1/execute.tsx +0 -299
- package/src/d1/formatTimeAgo.ts +0 -14
- package/src/d1/index.ts +0 -76
- 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 -108
- package/src/deployments.ts +0 -74
- package/src/deprecated/index.ts +0 -438
- package/src/dev/dev-vars.ts +0 -39
- package/src/dev/dev.tsx +0 -587
- package/src/dev/get-local-persistence-path.tsx +0 -31
- package/src/dev/local.tsx +0 -717
- package/src/dev/remote.tsx +0 -603
- package/src/dev/start-server.ts +0 -513
- package/src/dev/use-esbuild.ts +0 -204
- package/src/dev/validate-dev-props.ts +0 -31
- package/src/dev-registry.tsx +0 -201
- package/src/dev.tsx +0 -869
- package/src/dialogs.tsx +0 -163
- package/src/dispatch-namespace.ts +0 -207
- 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 -684
- package/src/init.ts +0 -970
- package/src/inspect.ts +0 -767
- package/src/intl-polyfill.d.ts +0 -139
- package/src/is-ci.ts +0 -14
- package/src/is-interactive.ts +0 -16
- package/src/kv/helpers.ts +0 -430
- package/src/kv/index.ts +0 -596
- package/src/logger.ts +0 -92
- 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 -213
- 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 -18
- package/src/pages/deployments.tsx +0 -106
- package/src/pages/dev.tsx +0 -693
- 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 -425
- package/src/pages/utils.ts +0 -12
- package/src/parse.ts +0 -286
- package/src/paths.ts +0 -71
- package/src/proxy.ts +0 -689
- package/src/publish/index.ts +0 -270
- package/src/publish/publish.ts +0 -1035
- package/src/pubsub/index.ts +0 -286
- package/src/pubsub/pubsub-commands.tsx +0 -624
- package/src/queues/cli/commands/consumer/add.ts +0 -71
- package/src/queues/cli/commands/consumer/index.ts +0 -22
- package/src/queues/cli/commands/consumer/remove.ts +0 -38
- package/src/queues/cli/commands/create.ts +0 -25
- package/src/queues/cli/commands/delete.ts +0 -26
- package/src/queues/cli/commands/index.ts +0 -33
- package/src/queues/cli/commands/list.ts +0 -25
- package/src/queues/client.ts +0 -135
- 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 -379
- 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 -214
- package/src/tail/printing.ts +0 -107
- package/src/type-generation.ts +0 -159
- package/src/update-check.ts +0 -19
- package/src/user/access.ts +0 -69
- 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 -242
- package/src/yargs-types.ts +0 -20
- package/src/zones.ts +0 -191
- 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
package/src/tail/filters.ts
DELETED
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* When tailing logs from a worker, oftentimes you don't want to see _every
|
|
3
|
-
* single event_. That's where filters come in. We can send a set of filters
|
|
4
|
-
* to the tail worker, and it will pre-filter any logs for us so that we
|
|
5
|
-
* only recieve the ones we care about.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* These are the filters we accept in the CLI. They
|
|
10
|
-
* were copied directly from wrangler 1 in order to
|
|
11
|
-
* maintain compatability, so they aren't actually the exact
|
|
12
|
-
* filters we need to send up to the tail worker. They generally map 1:1,
|
|
13
|
-
* but often require some transformation or
|
|
14
|
-
* renaming to match what it expects.
|
|
15
|
-
*
|
|
16
|
-
* For a full description of each filter, either check the
|
|
17
|
-
* CLI description or see the documentation for `ApiFilter`.
|
|
18
|
-
*/
|
|
19
|
-
export type TailCLIFilters = {
|
|
20
|
-
status?: ("ok" | "error" | "canceled")[];
|
|
21
|
-
header?: string;
|
|
22
|
-
method?: string[];
|
|
23
|
-
search?: string;
|
|
24
|
-
samplingRate?: number;
|
|
25
|
-
clientIp?: string[];
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* These are the filters we send to the tail worker. We
|
|
30
|
-
* actually send a list of filters (an array of objects),
|
|
31
|
-
* so rather than having a single TailAPIFilters type,
|
|
32
|
-
* each kind of filter gets its own type and we define
|
|
33
|
-
* TailAPIFilter to be the union of those types.
|
|
34
|
-
*/
|
|
35
|
-
export type TailAPIFilter =
|
|
36
|
-
| SamplingRateFilter
|
|
37
|
-
| OutcomeFilter
|
|
38
|
-
| MethodFilter
|
|
39
|
-
| HeaderFilter
|
|
40
|
-
| ClientIPFilter
|
|
41
|
-
| QueryFilter;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Filters logs based on a given sampling rate.
|
|
45
|
-
* For example, a `sampling_rate` of 0.25 will let one-quarter of the
|
|
46
|
-
* logs through.
|
|
47
|
-
*/
|
|
48
|
-
type SamplingRateFilter = {
|
|
49
|
-
sampling_rate: number;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Filters logs based on the outcome of the worker's event handler.
|
|
54
|
-
*/
|
|
55
|
-
type OutcomeFilter = {
|
|
56
|
-
outcome: Outcome[];
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* There are five possible outcomes we can get, three of which
|
|
61
|
-
* (exception, exceededCpu, exceededMemory, and unknown) are considered errors
|
|
62
|
-
*/
|
|
63
|
-
export type Outcome =
|
|
64
|
-
| "ok"
|
|
65
|
-
| "canceled"
|
|
66
|
-
| "exception"
|
|
67
|
-
| "exceededCpu"
|
|
68
|
-
| "exceededMemory"
|
|
69
|
-
| "unknown";
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Filters logs based on the HTTP method used for the request
|
|
73
|
-
* that triggered the worker.
|
|
74
|
-
*/
|
|
75
|
-
type MethodFilter = {
|
|
76
|
-
method: string[];
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Filters logs based on an HTTP header on the request that
|
|
81
|
-
* triggered the worker.
|
|
82
|
-
*/
|
|
83
|
-
type HeaderFilter = {
|
|
84
|
-
header: {
|
|
85
|
-
/**
|
|
86
|
-
* Filters on the header "key", e.g. "X-CLOUDFLARE-HEADER"
|
|
87
|
-
* or "X-CUSTOM-HEADER"
|
|
88
|
-
*/
|
|
89
|
-
key: string;
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Filters on the header "value", e.g. if this is set to
|
|
93
|
-
* "filter-for-me" and the "key" is "X-SHOULD-LOG", only
|
|
94
|
-
* events triggered by requests with the header
|
|
95
|
-
* "X-SHOULD-LOG:filter-for-me" will be logged.
|
|
96
|
-
*/
|
|
97
|
-
query?: string;
|
|
98
|
-
};
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Filters on the IP address the request came from that triggered
|
|
103
|
-
* the worker. A value of "self" will be replaced with the IP
|
|
104
|
-
* address that is running `wrangler tail`
|
|
105
|
-
*/
|
|
106
|
-
type ClientIPFilter = {
|
|
107
|
-
client_ip: string[];
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Filters logs by a query string. This means only logs that
|
|
112
|
-
* contain the given string will be sent to wrangler, and any
|
|
113
|
-
* that don't will be discarded by the tail worker.
|
|
114
|
-
*/
|
|
115
|
-
type QueryFilter = {
|
|
116
|
-
query: string;
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* The full message we send to the tail worker includes our
|
|
121
|
-
* filters and a debug flag.
|
|
122
|
-
*/
|
|
123
|
-
export type TailFilterMessage = {
|
|
124
|
-
filters: TailAPIFilter[];
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Translate the flags passed in via a CLI invokation of wrangler
|
|
129
|
-
* into a message that we can send to the tail worker.
|
|
130
|
-
*
|
|
131
|
-
* @param cliFilters An object containing all the filters passed in from the CLI
|
|
132
|
-
* @returns A filter message ready to be sent to the tail worker
|
|
133
|
-
*/
|
|
134
|
-
export function translateCLICommandToFilterMessage(
|
|
135
|
-
cliFilters: TailCLIFilters
|
|
136
|
-
): TailFilterMessage {
|
|
137
|
-
const apiFilters: TailAPIFilter[] = [];
|
|
138
|
-
|
|
139
|
-
if (cliFilters.samplingRate) {
|
|
140
|
-
apiFilters.push(parseSamplingRate(cliFilters.samplingRate));
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (cliFilters.status) {
|
|
144
|
-
apiFilters.push(parseOutcome(cliFilters.status));
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (cliFilters.method) {
|
|
148
|
-
apiFilters.push(parseMethod(cliFilters.method));
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if (cliFilters.header) {
|
|
152
|
-
apiFilters.push(parseHeader(cliFilters.header));
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
if (cliFilters.clientIp) {
|
|
156
|
-
apiFilters.push(parseIP(cliFilters.clientIp));
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (cliFilters.search) {
|
|
160
|
-
apiFilters.push(parseQuery(cliFilters.search));
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return {
|
|
164
|
-
filters: apiFilters,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Parse the sampling rate passed in via command line
|
|
170
|
-
*
|
|
171
|
-
* @param sampling_rate the sampling rate passed in via CLI
|
|
172
|
-
* @throws an Error if the rate doesn't make sense
|
|
173
|
-
* @returns a SamplingRateFilter for use with the API
|
|
174
|
-
*/
|
|
175
|
-
function parseSamplingRate(sampling_rate: number): SamplingRateFilter {
|
|
176
|
-
if (sampling_rate <= 0 || sampling_rate >= 1) {
|
|
177
|
-
throw new Error(
|
|
178
|
-
"A sampling rate must be between 0 and 1 in order to have any effect.\nFor example, a sampling rate of 0.25 means 25% of events will be logged."
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return { sampling_rate };
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Translate from CLI "status"es to API "outcome"s, including
|
|
187
|
-
* broadening "error" into "exception", "exceededCpu", and "unknown".
|
|
188
|
-
*
|
|
189
|
-
* @param statuses statuses passed in via CLI
|
|
190
|
-
* @returns an OutcomeFilter for use with the API
|
|
191
|
-
*/
|
|
192
|
-
function parseOutcome(
|
|
193
|
-
statuses: ("ok" | "error" | "canceled")[]
|
|
194
|
-
): OutcomeFilter {
|
|
195
|
-
const outcomes = new Set<Outcome>();
|
|
196
|
-
|
|
197
|
-
for (const status of statuses) {
|
|
198
|
-
switch (status) {
|
|
199
|
-
case "ok":
|
|
200
|
-
outcomes.add("ok");
|
|
201
|
-
break;
|
|
202
|
-
|
|
203
|
-
case "canceled":
|
|
204
|
-
outcomes.add("canceled");
|
|
205
|
-
break;
|
|
206
|
-
|
|
207
|
-
case "error":
|
|
208
|
-
outcomes.add("exception");
|
|
209
|
-
outcomes.add("exceededCpu");
|
|
210
|
-
outcomes.add("exceededMemory");
|
|
211
|
-
outcomes.add("unknown");
|
|
212
|
-
break;
|
|
213
|
-
|
|
214
|
-
default:
|
|
215
|
-
break;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
return {
|
|
220
|
-
outcome: Array.from(outcomes),
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* We just send silly methods through to the API anyway, since they don't
|
|
226
|
-
* cause any harm.
|
|
227
|
-
*
|
|
228
|
-
* @param method an array of HTTP request methods passed in via CLI
|
|
229
|
-
* @returns a MethodFilter for use with the API
|
|
230
|
-
*/
|
|
231
|
-
function parseMethod(method: string[]): MethodFilter {
|
|
232
|
-
return { method };
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Header filters can contain either just a key ("X-HEADER-KEY") or both
|
|
237
|
-
* a key and a value ("X-HEADER-KEY:some-value"). This function parses
|
|
238
|
-
* a given string according to that pattern.
|
|
239
|
-
*
|
|
240
|
-
* @param header a header string, "X-HEADER-KEY" or "X-HEADER-KEY:some-value"
|
|
241
|
-
* @returns a HeaderFilter for use with the API
|
|
242
|
-
*/
|
|
243
|
-
function parseHeader(header: string): HeaderFilter {
|
|
244
|
-
const [headerKey, headerQuery] = header.split(":", 2);
|
|
245
|
-
|
|
246
|
-
return {
|
|
247
|
-
header: {
|
|
248
|
-
key: headerKey.trim(),
|
|
249
|
-
query: headerQuery?.trim(),
|
|
250
|
-
},
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* A list of IPs can be passed in to filter for messages that come from
|
|
256
|
-
* a worker triggered by a request originating from one of those IPs.
|
|
257
|
-
* You can also pass in the string "self" to filter for the IP of the
|
|
258
|
-
* machine running `wrangler tail`.
|
|
259
|
-
*
|
|
260
|
-
* @param client_ip an array of IP addresses to filter
|
|
261
|
-
* @returns a ClientIPFilter for use with the API
|
|
262
|
-
*/
|
|
263
|
-
function parseIP(client_ip: string[]): ClientIPFilter {
|
|
264
|
-
return { client_ip };
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* Users can filter for logs that contain a "search" or a "query string".
|
|
269
|
-
* For example, if `--search findme` is passed to then we will only
|
|
270
|
-
* receive logs that contain the string "findme".
|
|
271
|
-
*
|
|
272
|
-
* @param query a query string to search for
|
|
273
|
-
* @returns a QueryFilter for use with the API
|
|
274
|
-
*/
|
|
275
|
-
function parseQuery(query: string): QueryFilter {
|
|
276
|
-
return { query };
|
|
277
|
-
}
|
package/src/tail/index.ts
DELETED
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
import { setTimeout } from "node:timers/promises";
|
|
2
|
-
import onExit from "signal-exit";
|
|
3
|
-
|
|
4
|
-
import { fetchResult, fetchScriptContent } from "../cfetch";
|
|
5
|
-
import { readConfig } from "../config";
|
|
6
|
-
import { tailDOLogPrompt } from "../dialogs";
|
|
7
|
-
import {
|
|
8
|
-
isLegacyEnv,
|
|
9
|
-
printWranglerBanner,
|
|
10
|
-
getLegacyScriptName,
|
|
11
|
-
} from "../index";
|
|
12
|
-
import { logger } from "../logger";
|
|
13
|
-
import * as metrics from "../metrics";
|
|
14
|
-
import { requireAuth } from "../user";
|
|
15
|
-
import { getWorkerForZone } from "../zones";
|
|
16
|
-
import {
|
|
17
|
-
createTail,
|
|
18
|
-
jsonPrintLogs,
|
|
19
|
-
prettyPrintLogs,
|
|
20
|
-
translateCLICommandToFilterMessage,
|
|
21
|
-
} from "./createTail";
|
|
22
|
-
import type { WorkerMetadata } from "../create-worker-upload-form";
|
|
23
|
-
import type { ConfigPath } from "../index";
|
|
24
|
-
import type {
|
|
25
|
-
CommonYargsOptions,
|
|
26
|
-
YargsOptionsToInterface,
|
|
27
|
-
} from "../yargs-types";
|
|
28
|
-
import type { TailCLIFilters } from "./createTail";
|
|
29
|
-
import type { RawData } from "ws";
|
|
30
|
-
import type { Argv } from "yargs";
|
|
31
|
-
|
|
32
|
-
export function tailOptions(yargs: Argv<CommonYargsOptions>) {
|
|
33
|
-
return yargs
|
|
34
|
-
.positional("worker", {
|
|
35
|
-
describe: "Name or route of the worker to tail",
|
|
36
|
-
type: "string",
|
|
37
|
-
})
|
|
38
|
-
.option("format", {
|
|
39
|
-
default: process.stdout.isTTY ? "pretty" : "json",
|
|
40
|
-
choices: ["json", "pretty"],
|
|
41
|
-
describe: "The format of log entries",
|
|
42
|
-
})
|
|
43
|
-
.option("status", {
|
|
44
|
-
choices: ["ok", "error", "canceled"],
|
|
45
|
-
describe: "Filter by invocation status",
|
|
46
|
-
array: true,
|
|
47
|
-
})
|
|
48
|
-
.option("header", {
|
|
49
|
-
type: "string",
|
|
50
|
-
requiresArg: true,
|
|
51
|
-
describe: "Filter by HTTP header",
|
|
52
|
-
})
|
|
53
|
-
.option("method", {
|
|
54
|
-
type: "string",
|
|
55
|
-
requiresArg: true,
|
|
56
|
-
describe: "Filter by HTTP method",
|
|
57
|
-
array: true,
|
|
58
|
-
})
|
|
59
|
-
.option("sampling-rate", {
|
|
60
|
-
type: "number",
|
|
61
|
-
describe: "Adds a percentage of requests to log sampling rate",
|
|
62
|
-
})
|
|
63
|
-
.option("search", {
|
|
64
|
-
type: "string",
|
|
65
|
-
requiresArg: true,
|
|
66
|
-
describe: "Filter by a text match in console.log messages",
|
|
67
|
-
})
|
|
68
|
-
.option("ip", {
|
|
69
|
-
type: "string",
|
|
70
|
-
requiresArg: true,
|
|
71
|
-
describe:
|
|
72
|
-
'Filter by the IP address the request originates from. Use "self" to filter for your own IP',
|
|
73
|
-
array: true,
|
|
74
|
-
})
|
|
75
|
-
.option("debug", {
|
|
76
|
-
type: "boolean",
|
|
77
|
-
hidden: true,
|
|
78
|
-
default: false,
|
|
79
|
-
describe:
|
|
80
|
-
"If a log would have been filtered out, send it through anyway alongside the filter which would have blocked it.",
|
|
81
|
-
})
|
|
82
|
-
.option("legacy-env", {
|
|
83
|
-
type: "boolean",
|
|
84
|
-
describe: "Use legacy environments",
|
|
85
|
-
hidden: true,
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
type TailArgs = YargsOptionsToInterface<typeof tailOptions>;
|
|
90
|
-
|
|
91
|
-
export async function tailHandler(args: TailArgs) {
|
|
92
|
-
if (args.format === "pretty") {
|
|
93
|
-
await printWranglerBanner();
|
|
94
|
-
}
|
|
95
|
-
const config = readConfig(args.config as ConfigPath, args);
|
|
96
|
-
await metrics.sendMetricsEvent("begin log stream", {
|
|
97
|
-
sendMetrics: config.send_metrics,
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
let scriptName;
|
|
101
|
-
|
|
102
|
-
// Worker names can't contain "." (and most routes should), so use that as a discriminator
|
|
103
|
-
if (args.worker?.includes(".")) {
|
|
104
|
-
scriptName = await getWorkerForZone(args.worker);
|
|
105
|
-
if (args.format === "pretty") {
|
|
106
|
-
logger.log(`Connecting to worker ${scriptName} at route ${args.worker}`);
|
|
107
|
-
}
|
|
108
|
-
} else {
|
|
109
|
-
scriptName = getLegacyScriptName({ name: args.worker, ...args }, config);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (!scriptName) {
|
|
113
|
-
throw new Error(
|
|
114
|
-
"Required Worker name missing. Please specify the Worker name in wrangler.toml, or pass it as an argument with `wrangler tail <worker-name>`"
|
|
115
|
-
);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const accountId = await requireAuth(config);
|
|
119
|
-
|
|
120
|
-
const cliFilters: TailCLIFilters = {
|
|
121
|
-
status: args.status as ("ok" | "error" | "canceled")[] | undefined,
|
|
122
|
-
header: args.header,
|
|
123
|
-
method: args.method,
|
|
124
|
-
samplingRate: args["sampling-rate"],
|
|
125
|
-
search: args.search,
|
|
126
|
-
clientIp: args.ip,
|
|
127
|
-
};
|
|
128
|
-
const scriptContent: string = await fetchScriptContent(
|
|
129
|
-
(!isLegacyEnv(config) ? args.env : undefined)
|
|
130
|
-
? `/accounts/${accountId}/workers/services/${scriptName}/environments/${args.env}/content`
|
|
131
|
-
: `/accounts/${accountId}/workers/scripts/${scriptName}`
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
const bindings = await fetchResult<WorkerMetadata["bindings"]>(
|
|
135
|
-
(!isLegacyEnv(config) ? args.env : undefined)
|
|
136
|
-
? `/accounts/${accountId}/workers/services/${scriptName}/environments/${args.env}/bindings`
|
|
137
|
-
: `/accounts/${accountId}/workers/scripts/${scriptName}/bindings`
|
|
138
|
-
);
|
|
139
|
-
if (
|
|
140
|
-
scriptContent.toLowerCase().includes("websocket") &&
|
|
141
|
-
bindings.find((b) => b.type === "durable_object_namespace")
|
|
142
|
-
) {
|
|
143
|
-
logger.warn(
|
|
144
|
-
`Beginning log collection requires restarting the Durable Objects associated with ${scriptName}. Any WebSocket connections or other non-persisted state will be lost as part of this restart.`
|
|
145
|
-
);
|
|
146
|
-
|
|
147
|
-
const shouldContinue = await tailDOLogPrompt();
|
|
148
|
-
if (!shouldContinue) {
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
const filters = translateCLICommandToFilterMessage(cliFilters);
|
|
153
|
-
|
|
154
|
-
const { tail, expiration, deleteTail } = await createTail(
|
|
155
|
-
accountId,
|
|
156
|
-
scriptName,
|
|
157
|
-
filters,
|
|
158
|
-
args.debug,
|
|
159
|
-
!isLegacyEnv(config) ? args.env : undefined
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
const scriptDisplayName = `${scriptName}${
|
|
163
|
-
args.env && !isLegacyEnv(config) ? ` (${args.env})` : ""
|
|
164
|
-
}`;
|
|
165
|
-
|
|
166
|
-
if (args.format === "pretty") {
|
|
167
|
-
logger.log(
|
|
168
|
-
`Successfully created tail, expires at ${expiration.toLocaleString()}`
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
onExit(async () => {
|
|
173
|
-
tail.terminate();
|
|
174
|
-
await deleteTail();
|
|
175
|
-
await metrics.sendMetricsEvent("end log stream", {
|
|
176
|
-
sendMetrics: config.send_metrics,
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
const printLog: (data: RawData) => void =
|
|
181
|
-
args.format === "pretty" ? prettyPrintLogs : jsonPrintLogs;
|
|
182
|
-
|
|
183
|
-
tail.on("message", printLog);
|
|
184
|
-
|
|
185
|
-
while (tail.readyState !== tail.OPEN) {
|
|
186
|
-
switch (tail.readyState) {
|
|
187
|
-
case tail.CONNECTING:
|
|
188
|
-
await setTimeout(100);
|
|
189
|
-
break;
|
|
190
|
-
case tail.CLOSING:
|
|
191
|
-
await setTimeout(100);
|
|
192
|
-
break;
|
|
193
|
-
case tail.CLOSED:
|
|
194
|
-
await metrics.sendMetricsEvent("end log stream", {
|
|
195
|
-
sendMetrics: config.send_metrics,
|
|
196
|
-
});
|
|
197
|
-
throw new Error(
|
|
198
|
-
`Connection to ${scriptDisplayName} closed unexpectedly.`
|
|
199
|
-
);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
if (args.format === "pretty") {
|
|
204
|
-
logger.log(`Connected to ${scriptDisplayName}, waiting for logs...`);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
tail.on("close", async () => {
|
|
208
|
-
tail.terminate();
|
|
209
|
-
await deleteTail();
|
|
210
|
-
await metrics.sendMetricsEvent("end log stream", {
|
|
211
|
-
sendMetrics: config.send_metrics,
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
}
|
package/src/tail/printing.ts
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { logger } from "../logger";
|
|
2
|
-
import type {
|
|
3
|
-
AlarmEvent,
|
|
4
|
-
RequestEvent,
|
|
5
|
-
ScheduledEvent,
|
|
6
|
-
TailEventMessage,
|
|
7
|
-
} from "./createTail";
|
|
8
|
-
import type { Outcome } from "./filters";
|
|
9
|
-
import type WebSocket from "ws";
|
|
10
|
-
|
|
11
|
-
export function prettyPrintLogs(data: WebSocket.RawData): void {
|
|
12
|
-
const eventMessage: TailEventMessage = JSON.parse(data.toString());
|
|
13
|
-
|
|
14
|
-
if (isScheduledEvent(eventMessage.event)) {
|
|
15
|
-
const cronPattern = eventMessage.event.cron;
|
|
16
|
-
const datetime = new Date(
|
|
17
|
-
eventMessage.event.scheduledTime
|
|
18
|
-
).toLocaleString();
|
|
19
|
-
const outcome = prettifyOutcome(eventMessage.outcome);
|
|
20
|
-
|
|
21
|
-
logger.log(`"${cronPattern}" @ ${datetime} - ${outcome}`);
|
|
22
|
-
} else if (isRequestEvent(eventMessage.event)) {
|
|
23
|
-
const requestMethod = eventMessage.event?.request.method.toUpperCase();
|
|
24
|
-
const url = eventMessage.event?.request.url;
|
|
25
|
-
const outcome = prettifyOutcome(eventMessage.outcome);
|
|
26
|
-
const datetime = new Date(eventMessage.eventTimestamp).toLocaleString();
|
|
27
|
-
|
|
28
|
-
logger.log(
|
|
29
|
-
url
|
|
30
|
-
? `${requestMethod} ${url} - ${outcome} @ ${datetime}`
|
|
31
|
-
: `[missing request] - ${outcome} @ ${datetime}`
|
|
32
|
-
);
|
|
33
|
-
} else if (isAlarmEvent(eventMessage.event)) {
|
|
34
|
-
const outcome = prettifyOutcome(eventMessage.outcome);
|
|
35
|
-
const datetime = new Date(
|
|
36
|
-
eventMessage.event.scheduledTime
|
|
37
|
-
).toLocaleString();
|
|
38
|
-
|
|
39
|
-
logger.log(`Alarm @ ${datetime} - ${outcome}`);
|
|
40
|
-
} else {
|
|
41
|
-
// Unknown event type
|
|
42
|
-
const outcome = prettifyOutcome(eventMessage.outcome);
|
|
43
|
-
const datetime = new Date(eventMessage.eventTimestamp).toLocaleString();
|
|
44
|
-
|
|
45
|
-
logger.log(`Unknown Event - ${outcome} @ ${datetime}`);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (eventMessage.logs.length > 0) {
|
|
49
|
-
eventMessage.logs.forEach(({ level, message }) => {
|
|
50
|
-
logger.log(` (${level})`, ...message);
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (eventMessage.exceptions.length > 0) {
|
|
55
|
-
eventMessage.exceptions.forEach(({ name, message }) => {
|
|
56
|
-
logger.error(` ${name}:`, message);
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export function jsonPrintLogs(data: WebSocket.RawData): void {
|
|
62
|
-
console.log(JSON.stringify(JSON.parse(data.toString()), null, 2));
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function isRequestEvent(
|
|
66
|
-
event: TailEventMessage["event"]
|
|
67
|
-
): event is RequestEvent {
|
|
68
|
-
return Boolean(event && "request" in event);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function isScheduledEvent(
|
|
72
|
-
event: TailEventMessage["event"]
|
|
73
|
-
): event is ScheduledEvent {
|
|
74
|
-
return Boolean(event && "cron" in event);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Check to see if an event sent from a worker is an AlarmEvent.
|
|
79
|
-
*
|
|
80
|
-
* Because the only property on `AlarmEvent` is "scheduledTime", which it
|
|
81
|
-
* shares with `ScheduledEvent`, `isAlarmEvent` checks if there's _not_
|
|
82
|
-
* a "cron" property in `event` to confirm it's an alarm event.
|
|
83
|
-
*
|
|
84
|
-
* @param event An event
|
|
85
|
-
* @returns true if the event is an AlarmEvent
|
|
86
|
-
*/
|
|
87
|
-
function isAlarmEvent(event: TailEventMessage["event"]): event is AlarmEvent {
|
|
88
|
-
return Boolean(event && "scheduledTime" in event && !("cron" in event));
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function prettifyOutcome(outcome: Outcome): string {
|
|
92
|
-
switch (outcome) {
|
|
93
|
-
case "ok":
|
|
94
|
-
return "Ok";
|
|
95
|
-
case "canceled":
|
|
96
|
-
return "Canceled";
|
|
97
|
-
case "exceededCpu":
|
|
98
|
-
return "Exceeded CPU Limit";
|
|
99
|
-
case "exceededMemory":
|
|
100
|
-
return "Exceeded Memory Limit";
|
|
101
|
-
case "exception":
|
|
102
|
-
return "Exception Thrown";
|
|
103
|
-
case "unknown":
|
|
104
|
-
default:
|
|
105
|
-
return "Unknown";
|
|
106
|
-
}
|
|
107
|
-
}
|