@mono-agent/web 0.18.3 → 0.19.1

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 +68 -0
  19. package/dist/push.d.ts.map +1 -0
  20. package/dist/push.js +594 -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,594 @@
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: createWebPushPinnedLookup(pinned),
454
+ }, (response) => {
455
+ const chunks = [];
456
+ let captured = 0;
457
+ response.on("data", (raw) => {
458
+ if (captured >= MAX_RESPONSE_BODY_BYTES)
459
+ return;
460
+ const chunk = Buffer.isBuffer(raw) ? raw : Buffer.from(raw);
461
+ const remaining = MAX_RESPONSE_BODY_BYTES - captured;
462
+ chunks.push(chunk.subarray(0, remaining));
463
+ captured += Math.min(chunk.byteLength, remaining);
464
+ });
465
+ response.once("error", (error) => finish(error));
466
+ response.once("end", () => finish(undefined, {
467
+ statusCode: response.statusCode ?? 0,
468
+ headers: response.headers,
469
+ ...(captured === 0 ? {} : { body: Buffer.concat(chunks).toString("utf8") }),
470
+ }));
471
+ });
472
+ request.setTimeout(REQUEST_TIMEOUT_MS, () => request.destroy(new Error("push_request_timeout")));
473
+ request.once("error", (error) => finish(error));
474
+ request.end(body);
475
+ });
476
+ }
477
+ /** Preserve one validated address while honoring both Node lookup callback modes. */
478
+ export function createWebPushPinnedLookup(pinned) {
479
+ return (_hostname, options, callback) => {
480
+ if (options.all === true) {
481
+ callback(null, [pinned]);
482
+ return;
483
+ }
484
+ callback(null, pinned.address, pinned.family);
485
+ };
486
+ }
487
+ function retryAfterMs(headers, now) {
488
+ const raw = headers["retry-after"];
489
+ const value = Array.isArray(raw) ? raw[0] : raw;
490
+ if (typeof value !== "string")
491
+ return undefined;
492
+ if (/^\d+$/u.test(value.trim()))
493
+ return Math.min(MAX_RETRY_MS, Number(value.trim()) * 1_000);
494
+ const parsed = Date.parse(value);
495
+ return Number.isFinite(parsed) ? Math.min(MAX_RETRY_MS, Math.max(1_000, parsed - now.getTime())) : undefined;
496
+ }
497
+ function createUnsafeAddressBlockList() {
498
+ const list = new BlockList();
499
+ for (const [network, prefix] of [
500
+ ["0.0.0.0", 8],
501
+ ["10.0.0.0", 8],
502
+ ["100.64.0.0", 10],
503
+ ["127.0.0.0", 8],
504
+ ["169.254.0.0", 16],
505
+ ["172.16.0.0", 12],
506
+ ["192.0.0.0", 24],
507
+ ["192.0.2.0", 24],
508
+ ["192.88.99.0", 24],
509
+ ["192.168.0.0", 16],
510
+ ["198.18.0.0", 15],
511
+ ["198.51.100.0", 24],
512
+ ["203.0.113.0", 24],
513
+ ["224.0.0.0", 4],
514
+ ["240.0.0.0", 4],
515
+ ])
516
+ list.addSubnet(network, prefix, "ipv4");
517
+ for (const [network, prefix] of [
518
+ ["::", 96],
519
+ ["100::", 64],
520
+ ["64:ff9b::", 96],
521
+ ["2001::", 32],
522
+ ["2002::", 16],
523
+ ["2001:db8::", 32],
524
+ ["fc00::", 7],
525
+ ["fe80::", 10],
526
+ ["ff00::", 8],
527
+ ])
528
+ list.addSubnet(network, prefix, "ipv6");
529
+ return list;
530
+ }
531
+ function isPublicAddress(address) {
532
+ if (address.toLowerCase().startsWith("::ffff:"))
533
+ return false;
534
+ const family = isIP(address);
535
+ return family === 4
536
+ ? !unsafeAddresses.check(address, "ipv4")
537
+ : family === 6 && !unsafeAddresses.check(address, "ipv6");
538
+ }
539
+ function isBase64Url(value) {
540
+ return value.length > 0 && value.length <= 256 && /^[A-Za-z0-9_-]+$/u.test(value);
541
+ }
542
+ function hasSubscriptionMismatchReason(body) {
543
+ if (body === undefined || body.length === 0)
544
+ return false;
545
+ const allowed = new Set(["BADSUBSCRIPTION", "UNREGISTERED"]);
546
+ const normalize = (value) => value.toUpperCase().replace(/[^A-Z0-9]+/gu, "");
547
+ if (allowed.has(normalize(body.trim())))
548
+ return true;
549
+ let parsed;
550
+ try {
551
+ parsed = JSON.parse(body);
552
+ }
553
+ catch {
554
+ return false;
555
+ }
556
+ const pending = [{ value: parsed, depth: 0 }];
557
+ let visited = 0;
558
+ while (pending.length > 0 && visited < 64) {
559
+ const item = pending.shift();
560
+ if (item === undefined)
561
+ break;
562
+ visited += 1;
563
+ if (item.depth > 5 || typeof item.value !== "object" || item.value === null)
564
+ continue;
565
+ if (Array.isArray(item.value)) {
566
+ for (const value of item.value)
567
+ pending.push({ value, depth: item.depth + 1 });
568
+ continue;
569
+ }
570
+ for (const [key, value] of Object.entries(item.value)) {
571
+ const normalizedKey = key.toLowerCase().replace(/[^a-z]/gu, "");
572
+ if ((normalizedKey === "reason" || normalizedKey === "error" || normalizedKey === "errorcode")
573
+ && typeof value === "string" && allowed.has(normalize(value)))
574
+ return true;
575
+ pending.push({ value, depth: item.depth + 1 });
576
+ }
577
+ }
578
+ return false;
579
+ }
580
+ function invalidSubscription(message) {
581
+ return new WebConsoleError("invalid_push_subscription", message, 400);
582
+ }
583
+ function endpointUnresolvable() {
584
+ return new WebConsoleError("push_endpoint_unresolvable", "The push endpoint hostname could not be resolved right now.", 503);
585
+ }
586
+ function safeErrorCode(error) {
587
+ if (error instanceof WebConsoleError)
588
+ return error.code;
589
+ if (typeof error === "object" && error !== null && "code" in error && typeof error.code === "string") {
590
+ return error.code.slice(0, 80);
591
+ }
592
+ return error instanceof Error ? createHash("sha256").update(error.name).digest("hex").slice(0, 12) : "network_error";
593
+ }
594
+ //# 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"}