@mono-agent/web 0.18.3 → 0.19.0

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.
Files changed (44) hide show
  1. package/README.md +79 -18
  2. package/dist/contracts.d.ts +46 -1
  3. package/dist/contracts.d.ts.map +1 -1
  4. package/dist/contracts.js +3 -0
  5. package/dist/contracts.js.map +1 -1
  6. package/dist/index.d.ts +2 -2
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/operator-client.d.ts +10 -1
  11. package/dist/operator-client.d.ts.map +1 -1
  12. package/dist/operator-client.js +85 -0
  13. package/dist/operator-client.js.map +1 -1
  14. package/dist/push-preview.d.ts +8 -0
  15. package/dist/push-preview.d.ts.map +1 -0
  16. package/dist/push-preview.js +146 -0
  17. package/dist/push-preview.js.map +1 -0
  18. package/dist/push.d.ts +65 -0
  19. package/dist/push.d.ts.map +1 -0
  20. package/dist/push.js +586 -0
  21. package/dist/push.js.map +1 -0
  22. package/dist/server.d.ts +2 -0
  23. package/dist/server.d.ts.map +1 -1
  24. package/dist/server.js +195 -4
  25. package/dist/server.js.map +1 -1
  26. package/dist/service.d.ts +36 -2
  27. package/dist/service.d.ts.map +1 -1
  28. package/dist/service.js +251 -8
  29. package/dist/service.js.map +1 -1
  30. package/dist/store.d.ts +87 -1
  31. package/dist/store.d.ts.map +1 -1
  32. package/dist/store.js +590 -5
  33. package/dist/store.js.map +1 -1
  34. package/package.json +8 -6
  35. package/webapp/dist/assets/{assistant-ui-DTnHvSvW.js → assistant-ui-CxqQJmH9.js} +13 -13
  36. package/webapp/dist/assets/index-DBk-VjNE.css +1 -0
  37. package/webapp/dist/assets/index-DntvgDjy.js +51 -0
  38. package/webapp/dist/assets/{markdown-CTWk6ujC.js → markdown-8pwMczg6.js} +1 -1
  39. package/webapp/dist/index.html +8 -7
  40. package/webapp/dist/manifest.webmanifest +17 -1
  41. package/webapp/dist/notification-sw.js +162 -4
  42. package/webapp/dist/sw.js +1 -1
  43. package/webapp/dist/assets/index-BDLWl9d1.css +0 -1
  44. package/webapp/dist/assets/index-byaz_i41.js +0 -51
package/dist/push.js ADDED
@@ -0,0 +1,586 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lookup as dnsLookup } from "node:dns/promises";
3
+ import { request as httpsRequest } from "node:https";
4
+ import { BlockList, isIP } from "node:net";
5
+ import webPush, {} from "web-push";
6
+ import { WebConsoleError } from "./errors.js";
7
+ import {} from "./store.js";
8
+ export const WEB_PUSH_SERVICE_WORKER_VERSION = 2;
9
+ export const DEFAULT_WEB_PUSH_SUBJECT = "https://github.com/robertsreberski/mono-agent";
10
+ const MAX_ENDPOINT_LENGTH = 2_048;
11
+ const MAX_ENCRYPTED_PAYLOAD_BYTES = 4_096;
12
+ const MAX_RESPONSE_BODY_BYTES = 4_096;
13
+ const MINIMUM_PUSH_BODY = "Open the console to view the update.";
14
+ const REQUEST_TIMEOUT_MS = 10_000;
15
+ const DISPATCH_INTERVAL_MS = 500;
16
+ const MAX_ATTEMPTS = 100;
17
+ const MAX_RETRY_MS = 15 * 60 * 1_000;
18
+ const CIRCUIT_WINDOW_MS = 10 * 60 * 1_000;
19
+ const CIRCUIT_FAILURES = 3;
20
+ const unsafeAddresses = createUnsafeAddressBlockList();
21
+ export function generateWebPushIdentity() {
22
+ return webPush.generateVAPIDKeys();
23
+ }
24
+ export function resolveWebPushSubject(value) {
25
+ const subject = value?.trim() || DEFAULT_WEB_PUSH_SUBJECT;
26
+ if (/^mailto:[^\s@]+@[^\s@]+$/iu.test(subject))
27
+ return subject;
28
+ let parsed;
29
+ try {
30
+ parsed = new URL(subject);
31
+ }
32
+ catch {
33
+ throw new WebConsoleError("invalid_web_push_subject", "MONO_AGENT_WEB_PUSH_SUBJECT must be a mailto address or a non-localhost HTTPS URL.", 500);
34
+ }
35
+ const hostname = parsed.hostname.toLowerCase().replace(/\.$/u, "");
36
+ if (parsed.protocol !== "https:" || parsed.username !== "" || parsed.password !== ""
37
+ || hostname === "localhost" || hostname.endsWith(".localhost")
38
+ || (isIP(hostname) !== 0 && !isPublicAddress(hostname))) {
39
+ throw new WebConsoleError("invalid_web_push_subject", "MONO_AGENT_WEB_PUSH_SUBJECT must be a mailto address or a non-localhost HTTPS URL.", 500);
40
+ }
41
+ return parsed.href;
42
+ }
43
+ export async function validateWebPushEndpoint(value, resolver = defaultWebPushDnsResolver) {
44
+ const endpoint = normalizeWebPushEndpoint(value);
45
+ const url = new URL(endpoint);
46
+ let addresses;
47
+ try {
48
+ addresses = await resolver(url.hostname);
49
+ }
50
+ catch {
51
+ throw endpointUnresolvable();
52
+ }
53
+ if (addresses.length === 0)
54
+ throw endpointUnresolvable();
55
+ if (addresses.some((address) => !isPublicAddress(address.address))) {
56
+ throw invalidSubscription("The push endpoint must resolve only to public Internet addresses.");
57
+ }
58
+ return { endpoint, url, addresses };
59
+ }
60
+ /** Canonicalize an endpoint without resolving it or making an outbound request. */
61
+ export function normalizeWebPushEndpoint(value) {
62
+ if (value.length === 0 || value.length > MAX_ENDPOINT_LENGTH) {
63
+ throw invalidSubscription("The push endpoint has an invalid length.");
64
+ }
65
+ let url;
66
+ try {
67
+ url = new URL(value);
68
+ }
69
+ catch {
70
+ throw invalidSubscription("The push endpoint must be a valid HTTPS URL.");
71
+ }
72
+ if (url.protocol !== "https:" || url.port !== "" || url.username !== "" || url.password !== ""
73
+ || url.hash !== "" || isIP(url.hostname) !== 0) {
74
+ throw invalidSubscription("The push endpoint must use HTTPS on port 443 with a public DNS hostname.");
75
+ }
76
+ return url.href;
77
+ }
78
+ export function validateWebPushKeys(p256dh, auth) {
79
+ if (!isBase64Url(p256dh) || !isBase64Url(auth)) {
80
+ throw invalidSubscription("The push subscription keys must use base64url encoding.");
81
+ }
82
+ let publicKey;
83
+ let authSecret;
84
+ try {
85
+ publicKey = Buffer.from(p256dh, "base64url");
86
+ authSecret = Buffer.from(auth, "base64url");
87
+ }
88
+ catch {
89
+ throw invalidSubscription("The push subscription keys are invalid.");
90
+ }
91
+ if (publicKey.byteLength !== 65 || publicKey[0] !== 4 || authSecret.byteLength !== 16) {
92
+ throw invalidSubscription("The push subscription keys have invalid lengths.");
93
+ }
94
+ }
95
+ export function webPushPayload(delivery) {
96
+ return webPushPayloadWithPreview(delivery, delivery.event.title, delivery.event.body);
97
+ }
98
+ function webPushPayloadWithPreview(delivery, title, body) {
99
+ const navigate = new URL("/", delivery.subscription.siteOrigin);
100
+ if (delivery.event.threadId !== undefined)
101
+ navigate.searchParams.set("thread", delivery.event.threadId);
102
+ return JSON.stringify({
103
+ web_push: 8030,
104
+ notification: {
105
+ title,
106
+ body,
107
+ navigate: navigate.href,
108
+ silent: false,
109
+ tag: delivery.event.tag,
110
+ data: {
111
+ schema: "mono-agent.web-push.v1",
112
+ eventId: delivery.event.id,
113
+ kind: delivery.event.kind,
114
+ ...(delivery.event.threadId === undefined ? {} : { threadId: delivery.event.threadId }),
115
+ },
116
+ },
117
+ });
118
+ }
119
+ export function webPushUrgency(kind) {
120
+ if (kind === "input.required")
121
+ return "high";
122
+ if (kind === "run.cancelled" || kind === "test")
123
+ return "low";
124
+ return "normal";
125
+ }
126
+ export async function sendWebPushPinned(delivery, identity, subject, signal, resolver = defaultWebPushDnsResolver) {
127
+ const validated = await validateWebPushEndpoint(delivery.subscription.endpoint, resolver);
128
+ const nowSeconds = Math.floor(Date.now() / 1_000);
129
+ const expirySeconds = Math.floor(new Date(delivery.event.expiresAt).getTime() / 1_000);
130
+ const ttl = Math.max(0, expirySeconds - nowSeconds);
131
+ let title = delivery.event.title;
132
+ let body = delivery.event.body;
133
+ let details = webPushRequestDetails(delivery, validated.endpoint, identity, subject, ttl, title, body);
134
+ while (details.body === null || details.body.byteLength > MAX_ENCRYPTED_PAYLOAD_BYTES) {
135
+ const bodyLength = [...body].length;
136
+ const titleLength = [...title].length;
137
+ if (bodyLength > [...MINIMUM_PUSH_BODY].length) {
138
+ body = truncatePayloadText(body, Math.max([...MINIMUM_PUSH_BODY].length, Math.floor(bodyLength / 2)));
139
+ }
140
+ else if (body !== MINIMUM_PUSH_BODY) {
141
+ body = MINIMUM_PUSH_BODY;
142
+ }
143
+ else if (titleLength > 1) {
144
+ title = truncatePayloadText(title, Math.max(1, Math.floor(titleLength / 2)));
145
+ }
146
+ else {
147
+ break;
148
+ }
149
+ details = webPushRequestDetails(delivery, validated.endpoint, identity, subject, ttl, title, body);
150
+ }
151
+ if (details.body === null || details.body.byteLength > MAX_ENCRYPTED_PAYLOAD_BYTES) {
152
+ throw new WebConsoleError("push_payload_too_large", "The encrypted notification payload exceeds the Web Push limit.", 500);
153
+ }
154
+ const pinned = validated.addresses[0];
155
+ if (pinned === undefined)
156
+ throw invalidSubscription("The push endpoint has no safe address.");
157
+ return await performPinnedRequest(validated.url, pinned, details.headers, details.body, signal);
158
+ }
159
+ export class WebPushDispatcher {
160
+ store;
161
+ identity;
162
+ subject;
163
+ options;
164
+ active = new Map();
165
+ circuits = new Map();
166
+ send;
167
+ clock;
168
+ random;
169
+ timer;
170
+ ticking = false;
171
+ stopped = false;
172
+ constructor(store, identity, subject, options = {}) {
173
+ this.store = store;
174
+ this.identity = identity;
175
+ this.subject = subject;
176
+ this.options = options;
177
+ this.clock = options.clock ?? (() => new Date());
178
+ this.random = options.random ?? Math.random;
179
+ this.send = options.send ?? ((delivery, currentIdentity, currentSubject, signal) => sendWebPushPinned(delivery, currentIdentity, currentSubject, signal, options.resolve));
180
+ }
181
+ start() {
182
+ if (this.timer !== undefined || this.stopped)
183
+ return;
184
+ this.timer = setInterval(() => this.wake(), this.options.intervalMs ?? DISPATCH_INTERVAL_MS);
185
+ this.timer.unref();
186
+ this.wake();
187
+ }
188
+ wake() {
189
+ if (this.stopped || this.ticking)
190
+ return;
191
+ void this.tick();
192
+ }
193
+ isDegraded() {
194
+ const now = this.clock().getTime();
195
+ for (const [origin, circuit] of this.circuits) {
196
+ if ((circuit.openUntil ?? 0) > now)
197
+ return true;
198
+ if (circuit.openUntil !== undefined)
199
+ this.circuits.delete(origin);
200
+ }
201
+ return false;
202
+ }
203
+ async stopAndDrain(timeoutMs = 5_000) {
204
+ if (this.stopped)
205
+ return;
206
+ const deadline = Date.now() + timeoutMs;
207
+ while (Date.now() < deadline && (this.store.webPushDueQueueDepth() > 0 || this.active.size > 0)) {
208
+ this.wake();
209
+ await new Promise((resolvePromise) => {
210
+ const timer = setTimeout(resolvePromise, 50);
211
+ timer.unref();
212
+ });
213
+ }
214
+ this.stopped = true;
215
+ if (this.timer !== undefined)
216
+ clearInterval(this.timer);
217
+ this.timer = undefined;
218
+ if (this.active.size > 0) {
219
+ for (const controller of this.active.values())
220
+ controller.abort(new Error("Web Push shutdown deadline reached."));
221
+ await Promise.allSettled([...this.active.keys()]);
222
+ }
223
+ }
224
+ async tick() {
225
+ if (this.stopped || this.ticking)
226
+ return;
227
+ this.ticking = true;
228
+ try {
229
+ const available = Math.max(0, 4 - this.active.size);
230
+ if (available === 0)
231
+ return;
232
+ for (const delivery of this.store.claimDueWebPushDeliveries(available)) {
233
+ const controller = new AbortController();
234
+ const operation = this.deliver(delivery, controller.signal)
235
+ .catch((error) => {
236
+ this.options.logger?.warn?.("Web Push delivery failed safely.", {
237
+ eventId: delivery.event.id,
238
+ subscriptionId: delivery.subscription.id,
239
+ error: safeErrorCode(error),
240
+ });
241
+ })
242
+ .finally(() => {
243
+ this.active.delete(operation);
244
+ this.wake();
245
+ });
246
+ this.active.set(operation, controller);
247
+ }
248
+ }
249
+ finally {
250
+ this.ticking = false;
251
+ }
252
+ }
253
+ async deliver(delivery, signal) {
254
+ const now = this.clock();
255
+ if (new Date(delivery.event.expiresAt).getTime() <= now.getTime()) {
256
+ this.store.settleWebPushDelivery({
257
+ eventId: delivery.event.id,
258
+ subscriptionId: delivery.subscription.id,
259
+ status: "dropped",
260
+ errorCode: "expired",
261
+ });
262
+ return;
263
+ }
264
+ if (delivery.subscription.keyFingerprint !== this.identity.fingerprint) {
265
+ this.store.expireWebPushSubscription(delivery.subscription.id, "application_key_changed");
266
+ return;
267
+ }
268
+ if (delivery.event.kind === "input.required" && this.options.beforeSend !== undefined) {
269
+ let relevance;
270
+ try {
271
+ relevance = await this.options.beforeSend(delivery.event, signal);
272
+ }
273
+ catch {
274
+ relevance = "unknown";
275
+ }
276
+ if (relevance === "stale") {
277
+ this.store.settleWebPushDelivery({
278
+ eventId: delivery.event.id,
279
+ subscriptionId: delivery.subscription.id,
280
+ status: "stale",
281
+ errorCode: "interaction_resolved",
282
+ });
283
+ return;
284
+ }
285
+ if (relevance === "unknown") {
286
+ this.retry(delivery, undefined, "interaction_state_unknown");
287
+ return;
288
+ }
289
+ }
290
+ const origin = new URL(delivery.subscription.endpoint).origin;
291
+ const circuit = this.circuits.get(origin);
292
+ if (delivery.event.kind !== "test" && (circuit?.openUntil ?? 0) > now.getTime()) {
293
+ this.store.deferClaimedWebPushDelivery(delivery.event.id, delivery.subscription.id, new Date(circuit?.openUntil ?? now.getTime() + CIRCUIT_WINDOW_MS).toISOString());
294
+ return;
295
+ }
296
+ let result;
297
+ try {
298
+ result = await this.send(delivery, this.identity, this.subject, signal);
299
+ }
300
+ catch (error) {
301
+ if (error instanceof WebConsoleError) {
302
+ if (error.code === "invalid_push_subscription") {
303
+ this.store.expireWebPushSubscription(delivery.subscription.id, "unsafe_endpoint");
304
+ return;
305
+ }
306
+ if (error.code === "push_endpoint_unresolvable") {
307
+ this.retry(delivery, undefined, error.code);
308
+ return;
309
+ }
310
+ this.store.settleWebPushDelivery({
311
+ eventId: delivery.event.id,
312
+ subscriptionId: delivery.subscription.id,
313
+ status: "config_error",
314
+ errorCode: error.code,
315
+ });
316
+ return;
317
+ }
318
+ this.retry(delivery, undefined, safeErrorCode(error));
319
+ return;
320
+ }
321
+ const status = result.statusCode;
322
+ if (status >= 200 && status < 300) {
323
+ this.circuits.delete(origin);
324
+ this.store.settleWebPushDelivery({
325
+ eventId: delivery.event.id,
326
+ subscriptionId: delivery.subscription.id,
327
+ status: "accepted",
328
+ statusCode: status,
329
+ });
330
+ return;
331
+ }
332
+ if (status === 404 || status === 410) {
333
+ this.store.expireWebPushSubscription(delivery.subscription.id, `push_service_${String(status)}`);
334
+ return;
335
+ }
336
+ if ((status === 400 || status === 403) && hasSubscriptionMismatchReason(result.body)) {
337
+ this.store.expireWebPushSubscription(delivery.subscription.id, "push_service_unregistered");
338
+ return;
339
+ }
340
+ if (status === 401 || status === 403) {
341
+ this.recordAuthFailure(origin, delivery.subscription.id);
342
+ this.store.settleWebPushDelivery({
343
+ eventId: delivery.event.id,
344
+ subscriptionId: delivery.subscription.id,
345
+ status: "config_error",
346
+ statusCode: status,
347
+ errorCode: `push_service_${String(status)}`,
348
+ });
349
+ return;
350
+ }
351
+ if (status === 429) {
352
+ this.retry(delivery, status, "push_service_429", retryAfterMs(result.headers, now));
353
+ return;
354
+ }
355
+ if (status === 408 || status === 425 || status >= 500) {
356
+ this.retry(delivery, status, `push_service_${String(status)}`);
357
+ return;
358
+ }
359
+ this.store.settleWebPushDelivery({
360
+ eventId: delivery.event.id,
361
+ subscriptionId: delivery.subscription.id,
362
+ status: "failed",
363
+ statusCode: status,
364
+ errorCode: `push_service_${String(status)}`,
365
+ });
366
+ }
367
+ retry(delivery, statusCode, errorCode, requestedDelayMs) {
368
+ const attempt = delivery.attempts + 1;
369
+ const exponential = Math.min(MAX_RETRY_MS, 5_000 * 2 ** Math.min(attempt - 1, 16));
370
+ const jittered = Math.round(exponential * (0.75 + this.random() * 0.5));
371
+ const delay = Math.min(MAX_RETRY_MS, Math.max(1_000, requestedDelayMs ?? jittered));
372
+ const next = new Date(this.clock().getTime() + delay);
373
+ if (attempt >= MAX_ATTEMPTS || next.getTime() >= new Date(delivery.event.expiresAt).getTime()) {
374
+ this.store.settleWebPushDelivery({
375
+ eventId: delivery.event.id,
376
+ subscriptionId: delivery.subscription.id,
377
+ status: "failed",
378
+ ...(statusCode === undefined ? {} : { statusCode }),
379
+ errorCode: attempt >= MAX_ATTEMPTS ? "attempt_limit" : "expired_before_retry",
380
+ });
381
+ return;
382
+ }
383
+ this.store.retryWebPushDelivery({
384
+ eventId: delivery.event.id,
385
+ subscriptionId: delivery.subscription.id,
386
+ nextAttemptAt: next.toISOString(),
387
+ ...(statusCode === undefined ? {} : { statusCode }),
388
+ errorCode,
389
+ });
390
+ }
391
+ recordAuthFailure(origin, subscriptionId) {
392
+ const now = this.clock().getTime();
393
+ const recent = (this.circuits.get(origin)?.failures ?? []).filter((failure) => now - failure.at <= CIRCUIT_WINDOW_MS);
394
+ recent.push({ subscriptionId, at: now });
395
+ const distinctSubscriptions = new Set(recent.map((failure) => failure.subscriptionId)).size;
396
+ this.circuits.set(origin, {
397
+ failures: recent,
398
+ ...(recent.length >= CIRCUIT_FAILURES && distinctSubscriptions >= 2
399
+ ? { openUntil: now + CIRCUIT_WINDOW_MS }
400
+ : {}),
401
+ });
402
+ }
403
+ }
404
+ function webPushRequestDetails(delivery, endpoint, identity, subject, ttl, title, body) {
405
+ return webPush.generateRequestDetails({
406
+ endpoint,
407
+ ...(delivery.subscription.expirationTime === undefined ? {} : { expirationTime: delivery.subscription.expirationTime }),
408
+ keys: { p256dh: delivery.subscription.p256dh, auth: delivery.subscription.auth },
409
+ }, webPushPayloadWithPreview(delivery, title, body), {
410
+ TTL: ttl,
411
+ contentEncoding: "aes128gcm",
412
+ urgency: webPushUrgency(delivery.event.kind),
413
+ topic: delivery.event.topic,
414
+ vapidDetails: {
415
+ subject,
416
+ publicKey: identity.publicKey,
417
+ privateKey: identity.privateKey,
418
+ },
419
+ });
420
+ }
421
+ function truncatePayloadText(value, maxCodePoints) {
422
+ const points = [...value];
423
+ if (points.length <= maxCodePoints)
424
+ return value;
425
+ if (maxCodePoints <= 0)
426
+ return "";
427
+ if (maxCodePoints === 1)
428
+ return "…";
429
+ return `${points.slice(0, maxCodePoints - 1).join("")}…`;
430
+ }
431
+ async function defaultWebPushDnsResolver(hostname) {
432
+ return await dnsLookup(hostname, { all: true, verbatim: true });
433
+ }
434
+ function performPinnedRequest(url, pinned, headers, body, signal) {
435
+ return new Promise((resolvePromise, reject) => {
436
+ let settled = false;
437
+ const finish = (error, value) => {
438
+ if (settled)
439
+ return;
440
+ settled = true;
441
+ if (error !== undefined)
442
+ reject(error);
443
+ else if (value !== undefined)
444
+ resolvePromise(value);
445
+ };
446
+ const request = httpsRequest(url, {
447
+ method: "POST",
448
+ headers,
449
+ servername: url.hostname,
450
+ signal,
451
+ // Keep TLS hostname verification on the original host while pinning the
452
+ // validated address. Node's HTTPS client does not follow redirects.
453
+ lookup: ((_hostname, _options, callback) => {
454
+ callback(null, pinned.address, pinned.family);
455
+ }),
456
+ }, (response) => {
457
+ const chunks = [];
458
+ let captured = 0;
459
+ response.on("data", (raw) => {
460
+ if (captured >= MAX_RESPONSE_BODY_BYTES)
461
+ return;
462
+ const chunk = Buffer.isBuffer(raw) ? raw : Buffer.from(raw);
463
+ const remaining = MAX_RESPONSE_BODY_BYTES - captured;
464
+ chunks.push(chunk.subarray(0, remaining));
465
+ captured += Math.min(chunk.byteLength, remaining);
466
+ });
467
+ response.once("error", (error) => finish(error));
468
+ response.once("end", () => finish(undefined, {
469
+ statusCode: response.statusCode ?? 0,
470
+ headers: response.headers,
471
+ ...(captured === 0 ? {} : { body: Buffer.concat(chunks).toString("utf8") }),
472
+ }));
473
+ });
474
+ request.setTimeout(REQUEST_TIMEOUT_MS, () => request.destroy(new Error("push_request_timeout")));
475
+ request.once("error", (error) => finish(error));
476
+ request.end(body);
477
+ });
478
+ }
479
+ function retryAfterMs(headers, now) {
480
+ const raw = headers["retry-after"];
481
+ const value = Array.isArray(raw) ? raw[0] : raw;
482
+ if (typeof value !== "string")
483
+ return undefined;
484
+ if (/^\d+$/u.test(value.trim()))
485
+ return Math.min(MAX_RETRY_MS, Number(value.trim()) * 1_000);
486
+ const parsed = Date.parse(value);
487
+ return Number.isFinite(parsed) ? Math.min(MAX_RETRY_MS, Math.max(1_000, parsed - now.getTime())) : undefined;
488
+ }
489
+ function createUnsafeAddressBlockList() {
490
+ const list = new BlockList();
491
+ for (const [network, prefix] of [
492
+ ["0.0.0.0", 8],
493
+ ["10.0.0.0", 8],
494
+ ["100.64.0.0", 10],
495
+ ["127.0.0.0", 8],
496
+ ["169.254.0.0", 16],
497
+ ["172.16.0.0", 12],
498
+ ["192.0.0.0", 24],
499
+ ["192.0.2.0", 24],
500
+ ["192.88.99.0", 24],
501
+ ["192.168.0.0", 16],
502
+ ["198.18.0.0", 15],
503
+ ["198.51.100.0", 24],
504
+ ["203.0.113.0", 24],
505
+ ["224.0.0.0", 4],
506
+ ["240.0.0.0", 4],
507
+ ])
508
+ list.addSubnet(network, prefix, "ipv4");
509
+ for (const [network, prefix] of [
510
+ ["::", 96],
511
+ ["100::", 64],
512
+ ["64:ff9b::", 96],
513
+ ["2001::", 32],
514
+ ["2002::", 16],
515
+ ["2001:db8::", 32],
516
+ ["fc00::", 7],
517
+ ["fe80::", 10],
518
+ ["ff00::", 8],
519
+ ])
520
+ list.addSubnet(network, prefix, "ipv6");
521
+ return list;
522
+ }
523
+ function isPublicAddress(address) {
524
+ if (address.toLowerCase().startsWith("::ffff:"))
525
+ return false;
526
+ const family = isIP(address);
527
+ return family === 4
528
+ ? !unsafeAddresses.check(address, "ipv4")
529
+ : family === 6 && !unsafeAddresses.check(address, "ipv6");
530
+ }
531
+ function isBase64Url(value) {
532
+ return value.length > 0 && value.length <= 256 && /^[A-Za-z0-9_-]+$/u.test(value);
533
+ }
534
+ function hasSubscriptionMismatchReason(body) {
535
+ if (body === undefined || body.length === 0)
536
+ return false;
537
+ const allowed = new Set(["BADSUBSCRIPTION", "UNREGISTERED"]);
538
+ const normalize = (value) => value.toUpperCase().replace(/[^A-Z0-9]+/gu, "");
539
+ if (allowed.has(normalize(body.trim())))
540
+ return true;
541
+ let parsed;
542
+ try {
543
+ parsed = JSON.parse(body);
544
+ }
545
+ catch {
546
+ return false;
547
+ }
548
+ const pending = [{ value: parsed, depth: 0 }];
549
+ let visited = 0;
550
+ while (pending.length > 0 && visited < 64) {
551
+ const item = pending.shift();
552
+ if (item === undefined)
553
+ break;
554
+ visited += 1;
555
+ if (item.depth > 5 || typeof item.value !== "object" || item.value === null)
556
+ continue;
557
+ if (Array.isArray(item.value)) {
558
+ for (const value of item.value)
559
+ pending.push({ value, depth: item.depth + 1 });
560
+ continue;
561
+ }
562
+ for (const [key, value] of Object.entries(item.value)) {
563
+ const normalizedKey = key.toLowerCase().replace(/[^a-z]/gu, "");
564
+ if ((normalizedKey === "reason" || normalizedKey === "error" || normalizedKey === "errorcode")
565
+ && typeof value === "string" && allowed.has(normalize(value)))
566
+ return true;
567
+ pending.push({ value, depth: item.depth + 1 });
568
+ }
569
+ }
570
+ return false;
571
+ }
572
+ function invalidSubscription(message) {
573
+ return new WebConsoleError("invalid_push_subscription", message, 400);
574
+ }
575
+ function endpointUnresolvable() {
576
+ return new WebConsoleError("push_endpoint_unresolvable", "The push endpoint hostname could not be resolved right now.", 503);
577
+ }
578
+ function safeErrorCode(error) {
579
+ if (error instanceof WebConsoleError)
580
+ return error.code;
581
+ if (typeof error === "object" && error !== null && "code" in error && typeof error.code === "string") {
582
+ return error.code.slice(0, 80);
583
+ }
584
+ return error instanceof Error ? createHash("sha256").update(error.name).digest("hex").slice(0, 12) : "network_error";
585
+ }
586
+ //# sourceMappingURL=push.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,9 +1,11 @@
1
+ import { type WebTheme } from "./contracts.js";
1
2
  import { type CreateWebServiceOptions } from "./service.js";
2
3
  export declare const DEFAULT_WEB_HOST = "0.0.0.0";
3
4
  export declare const DEFAULT_WEB_PORT = 5050;
4
5
  export interface StartWebServerOptions extends CreateWebServiceOptions {
5
6
  readonly host?: string;
6
7
  readonly port?: number;
8
+ readonly theme?: WebTheme;
7
9
  readonly staticDir?: string;
8
10
  /** Exact additional DNS hostnames accepted at the browser boundary (for example this node's Tailscale DNSName). */
9
11
  readonly allowedHosts?: readonly string[];
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAoCA,OAAO,EAAc,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAExE,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAC1C,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAIrC,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB;IACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,mHAAmH;IACnH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,eAAe,CAAC,CAiRlG;AAwID,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,eAAe,SAAmB,EAClC,eAAe,GAAE,SAAS,MAAM,EAAO,GACtC,OAAO,CAYT"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAoBA,OAAO,EAaL,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EAAc,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAExE,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAC1C,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAUrC,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB;IACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,mHAAmH;IACnH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,eAAe,CAAC,CAwWlG;AAoLD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,eAAe,SAAmB,EAClC,eAAe,GAAE,SAAS,MAAM,EAAO,GACtC,OAAO,CAYT"}