wrangler 2.0.12 → 2.0.16
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 +7 -1
- package/bin/wrangler.js +111 -57
- package/miniflare-dist/index.mjs +9 -2
- package/package.json +156 -154
- package/src/__tests__/config-cache-without-cache-dir.test.ts +38 -0
- package/src/__tests__/config-cache.test.ts +30 -24
- package/src/__tests__/configuration.test.ts +3935 -3476
- package/src/__tests__/dev.test.tsx +1128 -979
- package/src/__tests__/guess-worker-format.test.ts +68 -68
- package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
- package/src/__tests__/helpers/faye-websocket.d.ts +4 -4
- package/src/__tests__/helpers/mock-account-id.ts +24 -24
- package/src/__tests__/helpers/mock-bin.ts +20 -20
- package/src/__tests__/helpers/mock-cfetch.ts +92 -92
- package/src/__tests__/helpers/mock-console.ts +49 -39
- package/src/__tests__/helpers/mock-dialogs.ts +94 -71
- package/src/__tests__/helpers/mock-http-server.ts +30 -30
- package/src/__tests__/helpers/mock-istty.ts +65 -18
- package/src/__tests__/helpers/mock-kv.ts +26 -26
- package/src/__tests__/helpers/mock-oauth-flow.ts +223 -228
- package/src/__tests__/helpers/mock-process.ts +39 -0
- package/src/__tests__/helpers/mock-stdin.ts +82 -77
- package/src/__tests__/helpers/mock-web-socket.ts +21 -21
- package/src/__tests__/helpers/run-in-tmp.ts +27 -27
- package/src/__tests__/helpers/run-wrangler.ts +8 -8
- package/src/__tests__/helpers/write-worker-source.ts +16 -16
- package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
- package/src/__tests__/https-options.test.ts +104 -104
- package/src/__tests__/index.test.ts +239 -234
- package/src/__tests__/init.test.ts +1605 -1250
- package/src/__tests__/jest.setup.ts +63 -33
- package/src/__tests__/kv.test.ts +1128 -1011
- package/src/__tests__/logger.test.ts +100 -74
- package/src/__tests__/package-manager.test.ts +303 -303
- package/src/__tests__/pages.test.ts +1152 -652
- package/src/__tests__/parse.test.ts +252 -252
- package/src/__tests__/publish.test.ts +6371 -5622
- package/src/__tests__/pubsub.test.ts +367 -0
- package/src/__tests__/r2.test.ts +133 -133
- package/src/__tests__/route.test.ts +18 -18
- package/src/__tests__/secret.test.ts +382 -377
- package/src/__tests__/tail.test.ts +530 -530
- package/src/__tests__/user.test.ts +123 -111
- package/src/__tests__/whoami.test.tsx +198 -117
- package/src/__tests__/worker-namespace.test.ts +327 -0
- package/src/abort.d.ts +1 -1
- package/src/api/dev.ts +49 -0
- package/src/api/index.ts +1 -0
- package/src/bundle-reporter.tsx +29 -0
- package/src/bundle.ts +157 -149
- package/src/cfetch/index.ts +80 -80
- package/src/cfetch/internal.ts +90 -83
- package/src/cli.ts +21 -7
- package/src/config/config.ts +204 -195
- package/src/config/diagnostics.ts +61 -61
- package/src/config/environment.ts +390 -357
- package/src/config/index.ts +206 -193
- package/src/config/validation-helpers.ts +366 -366
- package/src/config/validation.ts +1573 -1376
- package/src/config-cache.ts +79 -41
- package/src/create-worker-preview.ts +206 -136
- package/src/create-worker-upload-form.ts +247 -238
- package/src/dev/dev-vars.ts +13 -13
- package/src/dev/dev.tsx +329 -307
- package/src/dev/local.tsx +304 -275
- package/src/dev/remote.tsx +366 -224
- package/src/dev/use-esbuild.ts +126 -91
- package/src/dev.tsx +538 -0
- package/src/dialogs.tsx +97 -97
- package/src/durable.ts +87 -87
- package/src/entry.ts +234 -228
- package/src/environment-variables.ts +23 -23
- package/src/errors.ts +6 -6
- package/src/generate.ts +33 -0
- package/src/git-client.ts +42 -0
- package/src/https-options.ts +79 -79
- package/src/index.tsx +1775 -2763
- package/src/init.ts +549 -0
- package/src/inspect.ts +593 -593
- package/src/intl-polyfill.d.ts +123 -123
- package/src/is-interactive.ts +12 -0
- package/src/kv.ts +277 -277
- package/src/logger.ts +46 -39
- package/src/miniflare-cli/enum-keys.ts +8 -8
- package/src/miniflare-cli/index.ts +42 -31
- package/src/miniflare-cli/request-context.ts +18 -18
- package/src/module-collection.ts +212 -212
- package/src/open-in-browser.ts +4 -6
- package/src/package-manager.ts +123 -123
- package/src/pages/build.tsx +202 -0
- package/src/pages/constants.ts +7 -0
- package/src/pages/deployments.tsx +101 -0
- package/src/pages/dev.tsx +964 -0
- package/src/pages/functions/buildPlugin.ts +105 -0
- package/src/pages/functions/buildWorker.ts +151 -0
- package/{pages → src/pages}/functions/filepath-routing.test.ts +113 -113
- package/src/pages/functions/filepath-routing.ts +189 -0
- package/src/pages/functions/identifiers.ts +78 -0
- package/src/pages/functions/routes.ts +151 -0
- package/src/pages/index.tsx +84 -0
- package/src/pages/projects.tsx +157 -0
- package/src/pages/publish.tsx +335 -0
- package/src/pages/types.ts +40 -0
- package/src/pages/upload.tsx +384 -0
- package/src/pages/utils.ts +12 -0
- package/src/parse.ts +202 -138
- package/src/paths.ts +6 -6
- package/src/preview.ts +31 -0
- package/src/proxy.ts +400 -402
- package/src/publish.ts +667 -621
- package/src/pubsub/index.ts +286 -0
- package/src/pubsub/pubsub-commands.tsx +577 -0
- package/src/r2.ts +19 -19
- package/src/selfsigned.d.ts +23 -23
- package/src/sites.tsx +271 -225
- package/src/tail/filters.ts +108 -108
- package/src/tail/index.ts +217 -217
- package/src/tail/printing.ts +45 -45
- package/src/update-check.ts +11 -11
- package/src/user/choose-account.tsx +60 -0
- package/src/user/env-vars.ts +46 -0
- package/src/user/generate-auth-url.ts +33 -0
- package/src/user/generate-random-state.ts +16 -0
- package/src/user/index.ts +3 -0
- package/src/user/user.tsx +1161 -0
- package/src/whoami.tsx +61 -42
- package/src/worker-namespace.ts +190 -0
- package/src/worker.ts +110 -100
- package/src/zones.ts +39 -36
- package/templates/checked-fetch.js +17 -0
- package/templates/new-worker-scheduled.js +3 -3
- package/templates/new-worker-scheduled.ts +15 -15
- package/templates/new-worker.js +3 -3
- package/templates/new-worker.ts +15 -15
- package/templates/no-op-worker.js +10 -0
- package/templates/pages-template-plugin.ts +155 -0
- package/templates/pages-template-worker.ts +161 -0
- package/templates/static-asset-facade.js +31 -31
- package/templates/tsconfig.json +95 -95
- package/wrangler-dist/cli.js +55383 -54138
- package/pages/functions/buildPlugin.ts +0 -105
- package/pages/functions/buildWorker.ts +0 -151
- package/pages/functions/filepath-routing.ts +0 -189
- package/pages/functions/identifiers.ts +0 -78
- package/pages/functions/routes.ts +0 -156
- package/pages/functions/template-plugin.ts +0 -147
- package/pages/functions/template-worker.ts +0 -143
- package/src/pages.tsx +0 -2093
- package/src/user.tsx +0 -1214
package/src/tail/index.ts
CHANGED
|
@@ -14,9 +14,9 @@ import type { Request } from "undici";
|
|
|
14
14
|
* - an expiration date when the tail is no longer guaranteed to be valid
|
|
15
15
|
*/
|
|
16
16
|
type TailCreationApiResponse = {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
id: string;
|
|
18
|
+
url: string;
|
|
19
|
+
expires_at: Date;
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -29,13 +29,13 @@ type TailCreationApiResponse = {
|
|
|
29
29
|
* @returns a `cfetch`-ready URL for creating a new tail
|
|
30
30
|
*/
|
|
31
31
|
function makeCreateTailUrl(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
accountId: string,
|
|
33
|
+
workerName: string,
|
|
34
|
+
env: string | undefined
|
|
35
35
|
): string {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
return env
|
|
37
|
+
? `/accounts/${accountId}/workers/services/${workerName}/environments/${env}/tails`
|
|
38
|
+
: `/accounts/${accountId}/workers/scripts/${workerName}/tails`;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
/**
|
|
@@ -49,14 +49,14 @@ function makeCreateTailUrl(
|
|
|
49
49
|
* @returns a `cfetch`-ready URL for deleting a tail
|
|
50
50
|
*/
|
|
51
51
|
function makeDeleteTailUrl(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
accountId: string,
|
|
53
|
+
workerName: string,
|
|
54
|
+
tailId: string,
|
|
55
|
+
env: string | undefined
|
|
56
56
|
): string {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
return env
|
|
58
|
+
? `/accounts/${accountId}/workers/services/${workerName}/environments/${env}/tails/${tailId}`
|
|
59
|
+
: `/accounts/${accountId}/workers/scripts/${workerName}/tails/${tailId}`;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/**
|
|
@@ -73,53 +73,53 @@ function makeDeleteTailUrl(
|
|
|
73
73
|
* @returns a websocket connection, an expiration, and a function to call to delete the tail
|
|
74
74
|
*/
|
|
75
75
|
export async function createTail(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
accountId: string,
|
|
77
|
+
workerName: string,
|
|
78
|
+
message: TailFilterMessage,
|
|
79
|
+
env: string | undefined
|
|
80
80
|
): Promise<{
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
tail: WebSocket;
|
|
82
|
+
expiration: Date;
|
|
83
|
+
deleteTail: () => Promise<void>;
|
|
84
84
|
}> {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
85
|
+
// create the tail
|
|
86
|
+
const createTailUrl = makeCreateTailUrl(accountId, workerName, env);
|
|
87
|
+
const {
|
|
88
|
+
id: tailId,
|
|
89
|
+
url: websocketUrl,
|
|
90
|
+
expires_at: expiration,
|
|
91
|
+
} = await fetchResult<TailCreationApiResponse>(createTailUrl, {
|
|
92
|
+
method: "POST",
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// delete the tail (not yet!)
|
|
96
|
+
const deleteUrl = makeDeleteTailUrl(accountId, workerName, tailId, env);
|
|
97
|
+
async function deleteTail() {
|
|
98
|
+
await fetchResult(deleteUrl, { method: "DELETE" });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// connect to the tail
|
|
102
|
+
const tail = new WebSocket(websocketUrl, "trace-v1", {
|
|
103
|
+
headers: {
|
|
104
|
+
"Sec-WebSocket-Protocol": "trace-v1", // needs to be `trace-v1` to be accepted
|
|
105
|
+
"User-Agent": `wrangler-js/${packageVersion}`,
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// send filters when we open up
|
|
110
|
+
tail.on("open", function () {
|
|
111
|
+
tail.send(
|
|
112
|
+
JSON.stringify(message),
|
|
113
|
+
{ binary: false, compress: false, mask: false, fin: true },
|
|
114
|
+
(err) => {
|
|
115
|
+
if (err) {
|
|
116
|
+
throw err;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
return { tail, expiration, deleteTail };
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
/**
|
|
@@ -127,59 +127,59 @@ export async function createTail(
|
|
|
127
127
|
* `wrangler tail` is structured JSON that deserializes to this type.
|
|
128
128
|
*/
|
|
129
129
|
export type TailEventMessage = {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
130
|
+
/**
|
|
131
|
+
* Whether the execution of this worker succeeded or failed
|
|
132
|
+
*/
|
|
133
|
+
outcome: Outcome;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The name of the script we're tailing
|
|
137
|
+
*/
|
|
138
|
+
scriptName?: string;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Any exceptions raised by the worker
|
|
142
|
+
*/
|
|
143
|
+
exceptions: {
|
|
144
|
+
/**
|
|
145
|
+
* The name of the exception.
|
|
146
|
+
*/
|
|
147
|
+
name: string;
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* The error message
|
|
151
|
+
*/
|
|
152
|
+
message: unknown;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* When the exception was raised/thrown
|
|
156
|
+
*/
|
|
157
|
+
timestamp: number;
|
|
158
|
+
}[];
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Any logs sent out by the worker
|
|
162
|
+
*/
|
|
163
|
+
logs: {
|
|
164
|
+
message: unknown[];
|
|
165
|
+
level: string; // TODO: make this a union of possible values
|
|
166
|
+
timestamp: number;
|
|
167
|
+
}[];
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* When the event was triggered
|
|
171
|
+
*/
|
|
172
|
+
eventTimestamp: number;
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* The event that triggered the worker. In the case of an HTTP request,
|
|
176
|
+
* this will be a RequestEvent. If it's a cron trigger, it'll be a
|
|
177
|
+
* ScheduledEvent.
|
|
178
|
+
*
|
|
179
|
+
* Until workers-types exposes individual types for export, we'll have
|
|
180
|
+
* to just re-define these types ourselves.
|
|
181
|
+
*/
|
|
182
|
+
event: RequestEvent | ScheduledEvent | undefined | null;
|
|
183
183
|
};
|
|
184
184
|
|
|
185
185
|
/**
|
|
@@ -187,113 +187,113 @@ export type TailEventMessage = {
|
|
|
187
187
|
*/
|
|
188
188
|
|
|
189
189
|
export type RequestEvent = {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
190
|
+
request: Pick<Request, "url" | "method" | "headers"> & {
|
|
191
|
+
/**
|
|
192
|
+
* Cloudflare-specific properties
|
|
193
|
+
* https://developers.cloudflare.com/workers/runtime-apis/request#incomingrequestcfproperties
|
|
194
|
+
*/
|
|
195
|
+
cf: {
|
|
196
|
+
/**
|
|
197
|
+
* How long (in ms) it took for the client's TCP connection to make a
|
|
198
|
+
* round trip to the worker and back. For all my gamers out there,
|
|
199
|
+
* this is the request's ping
|
|
200
|
+
*/
|
|
201
|
+
clientTcpRtt?: number;
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Longitude and Latitude of where the request originated from
|
|
205
|
+
*/
|
|
206
|
+
longitude?: string;
|
|
207
|
+
latitude?: string;
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* What cipher was used to establish the TLS connection
|
|
211
|
+
*/
|
|
212
|
+
tlsCipher: string;
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Which continent the request came from.
|
|
216
|
+
*/
|
|
217
|
+
continent?: "NA";
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* ASN of the incoming request
|
|
221
|
+
*/
|
|
222
|
+
asn: number;
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* The country the incoming request is coming from
|
|
226
|
+
*/
|
|
227
|
+
country?: string;
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* The TLS version the connection used
|
|
231
|
+
*/
|
|
232
|
+
tlsVersion: string;
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* The colo that processed the request (i.e. the airport code
|
|
236
|
+
* of the closest city to the server that spun up the worker)
|
|
237
|
+
*/
|
|
238
|
+
colo: string;
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* The timezone where the request came from
|
|
242
|
+
*/
|
|
243
|
+
timezone?: string;
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* The city where the request came from
|
|
247
|
+
*/
|
|
248
|
+
city?: string;
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* The browser-requested prioritization information in the request object
|
|
252
|
+
*/
|
|
253
|
+
requestPriority?: string;
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Which version of HTTP the request came over e.g. "HTTP/2"
|
|
257
|
+
*/
|
|
258
|
+
httpProtocol: string;
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* The region where the request originated from
|
|
262
|
+
*/
|
|
263
|
+
region?: string;
|
|
264
|
+
regionCode?: string;
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* The organization which owns the ASN of the incoming request, for example, Google Cloud.
|
|
268
|
+
*/
|
|
269
|
+
asOrganization: string;
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Metro code (DMA) of the incoming request, for example, "635".
|
|
273
|
+
*/
|
|
274
|
+
metroCode?: string;
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Postal code of the incoming request, for example, "78701".
|
|
278
|
+
*/
|
|
279
|
+
postalCode?: string;
|
|
280
|
+
};
|
|
281
|
+
};
|
|
282
282
|
};
|
|
283
283
|
|
|
284
284
|
/**
|
|
285
285
|
* An event that was triggered at a certain time
|
|
286
286
|
*/
|
|
287
287
|
export type ScheduledEvent = {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
288
|
+
/**
|
|
289
|
+
* The cron pattern that matched when this event fired
|
|
290
|
+
*/
|
|
291
|
+
cron: string;
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* The time this worker was scheduled to run.
|
|
295
|
+
* For some reason, this doesn't...work correctly when we
|
|
296
|
+
* do it directly as a Date. So parse it later on your own.
|
|
297
|
+
*/
|
|
298
|
+
scheduledTime: number;
|
|
299
299
|
};
|
package/src/tail/printing.ts
CHANGED
|
@@ -4,64 +4,64 @@ import type { Outcome } from "./filters";
|
|
|
4
4
|
import type WebSocket from "ws";
|
|
5
5
|
|
|
6
6
|
export function prettyPrintLogs(data: WebSocket.RawData): void {
|
|
7
|
-
|
|
7
|
+
const eventMessage: TailEventMessage = JSON.parse(data.toString());
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
if (isScheduledEvent(eventMessage.event)) {
|
|
10
|
+
const cronPattern = eventMessage.event.cron;
|
|
11
|
+
const datetime = new Date(
|
|
12
|
+
eventMessage.event.scheduledTime
|
|
13
|
+
).toLocaleString();
|
|
14
|
+
const outcome = prettifyOutcome(eventMessage.outcome);
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
logger.log(`"${cronPattern}" @ ${datetime} - ${outcome}`);
|
|
17
|
+
} else {
|
|
18
|
+
const requestMethod = eventMessage.event?.request.method.toUpperCase();
|
|
19
|
+
const url = eventMessage.event?.request.url;
|
|
20
|
+
const outcome = prettifyOutcome(eventMessage.outcome);
|
|
21
|
+
const datetime = new Date(eventMessage.eventTimestamp).toLocaleString();
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
logger.log(
|
|
24
|
+
url
|
|
25
|
+
? `${requestMethod} ${url} - ${outcome} @ ${datetime}`
|
|
26
|
+
: `[missing request] - ${outcome} @ ${datetime}`
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
if (eventMessage.logs.length > 0) {
|
|
31
|
+
eventMessage.logs.forEach(({ level, message }) => {
|
|
32
|
+
logger.log(` (${level})`, ...message);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
if (eventMessage.exceptions.length > 0) {
|
|
37
|
+
eventMessage.exceptions.forEach(({ name, message }) => {
|
|
38
|
+
logger.error(` ${name}:`, message);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
export function jsonPrintLogs(data: WebSocket.RawData): void {
|
|
44
|
-
|
|
44
|
+
console.log(JSON.stringify(JSON.parse(data.toString()), null, 2));
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
function isScheduledEvent(
|
|
48
|
-
|
|
48
|
+
event: RequestEvent | ScheduledEvent | undefined | null
|
|
49
49
|
): event is ScheduledEvent {
|
|
50
|
-
|
|
50
|
+
return Boolean(event && "cron" in event);
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
function prettifyOutcome(outcome: Outcome): string {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
54
|
+
switch (outcome) {
|
|
55
|
+
case "ok":
|
|
56
|
+
return "Ok";
|
|
57
|
+
case "canceled":
|
|
58
|
+
return "Canceled";
|
|
59
|
+
case "exceededCpu":
|
|
60
|
+
return "Exceeded CPU Limit";
|
|
61
|
+
case "exception":
|
|
62
|
+
return "Exception Thrown";
|
|
63
|
+
case "unknown":
|
|
64
|
+
default:
|
|
65
|
+
return "Unknown";
|
|
66
|
+
}
|
|
67
67
|
}
|
package/src/update-check.ts
CHANGED
|
@@ -3,17 +3,17 @@ import checkForUpdate from "update-check";
|
|
|
3
3
|
import pkg from "../package.json";
|
|
4
4
|
|
|
5
5
|
export async function updateCheck(): Promise<string> {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
let update = null;
|
|
7
|
+
try {
|
|
8
|
+
// default cache for update check is 1 day
|
|
9
|
+
update = await checkForUpdate(pkg, {
|
|
10
|
+
distTag: pkg.version.startsWith("0.0.0") ? "beta" : "latest",
|
|
11
|
+
});
|
|
12
|
+
} catch (err) {
|
|
13
|
+
// ignore error
|
|
14
|
+
}
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
if (update) return `(update available ${chalk.green(update.latest)})`;
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
return "";
|
|
19
19
|
}
|