agent-comms 1.14.0 → 1.15.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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/bridges/claude-code/channel.d.ts.map +1 -1
- package/dist/bridges/claude-code/channel.js +6 -1
- package/dist/bridges/claude-code/channel.js.map +1 -1
- package/dist/bridges/codex/tool.d.ts.map +1 -1
- package/dist/bridges/codex/tool.js +6 -1
- package/dist/bridges/codex/tool.js.map +1 -1
- package/dist/bridges/mcp/index.d.ts.map +1 -1
- package/dist/bridges/mcp/index.js +6 -1
- package/dist/bridges/mcp/index.js.map +1 -1
- package/dist/bridges/opencode/plugin.d.ts.map +1 -1
- package/dist/bridges/opencode/plugin.js +5 -0
- package/dist/bridges/opencode/plugin.js.map +1 -1
- package/dist/bridges/pi/index.d.ts.map +1 -1
- package/dist/bridges/pi/index.js +39 -17
- package/dist/bridges/pi/index.js.map +1 -1
- package/dist/bridges/user/controller.d.ts +9 -1
- package/dist/bridges/user/controller.d.ts.map +1 -1
- package/dist/bridges/user/controller.js +25 -1
- package/dist/bridges/user/controller.js.map +1 -1
- package/dist/bridges/user/tui.js +2 -0
- package/dist/bridges/user/tui.js.map +1 -1
- package/dist/bridges/user/web/build.d.ts +2 -0
- package/dist/bridges/user/web/build.d.ts.map +1 -1
- package/dist/bridges/user/web/build.js +44 -0
- package/dist/bridges/user/web/build.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.d.ts +5 -0
- package/dist/bridges/user/web/frontend/components/App.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/App.js +1 -1
- package/dist/bridges/user/web/frontend/components/App.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/ProjectTree.js +6 -3
- package/dist/bridges/user/web/frontend/components/ProjectTree.js.map +1 -1
- package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts +15 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.js +46 -0
- package/dist/bridges/user/web/frontend/components/RelayPanel.js.map +1 -0
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts +7 -2
- package/dist/bridges/user/web/frontend/components/Sidebar.d.ts.map +1 -1
- package/dist/bridges/user/web/frontend/components/Sidebar.js +15 -9
- package/dist/bridges/user/web/frontend/components/Sidebar.js.map +1 -1
- package/dist/bridges/user/web/frontend/input.js +1 -1
- package/dist/bridges/user/web/frontend/input.js.map +1 -1
- package/dist/bridges/user/web/frontend/main.js +73 -5
- package/dist/bridges/user/web/frontend/main.js.map +1 -1
- package/dist/bridges/user/web/frontend/mesh-client.d.ts +43 -0
- package/dist/bridges/user/web/frontend/mesh-client.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-client.js +132 -0
- package/dist/bridges/user/web/frontend/mesh-client.js.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-worker.d.ts +14 -0
- package/dist/bridges/user/web/frontend/mesh-worker.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/mesh-worker.js +274 -0
- package/dist/bridges/user/web/frontend/mesh-worker.js.map +1 -0
- package/dist/bridges/user/web/frontend/relay-client.d.ts +40 -0
- package/dist/bridges/user/web/frontend/relay-client.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/relay-client.js +97 -0
- package/dist/bridges/user/web/frontend/relay-client.js.map +1 -0
- package/dist/bridges/user/web/frontend/relay-worker.d.ts +15 -0
- package/dist/bridges/user/web/frontend/relay-worker.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/relay-worker.js +366 -0
- package/dist/bridges/user/web/frontend/relay-worker.js.map +1 -0
- package/dist/bridges/user/web/frontend/sw.d.ts +16 -0
- package/dist/bridges/user/web/frontend/sw.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/sw.js +145 -0
- package/dist/bridges/user/web/frontend/sw.js.map +1 -0
- package/dist/bridges/user/web/frontend/url-sync.d.ts +48 -0
- package/dist/bridges/user/web/frontend/url-sync.d.ts.map +1 -0
- package/dist/bridges/user/web/frontend/url-sync.js +74 -0
- package/dist/bridges/user/web/frontend/url-sync.js.map +1 -0
- package/dist/bridges/user/web/server.d.ts +10 -3
- package/dist/bridges/user/web/server.d.ts.map +1 -1
- package/dist/bridges/user/web/server.js +254 -12
- package/dist/bridges/user/web/server.js.map +1 -1
- package/dist/core/bridge.d.ts +28 -0
- package/dist/core/bridge.d.ts.map +1 -1
- package/dist/core/bridge.js +137 -0
- package/dist/core/bridge.js.map +1 -1
- package/dist/core/comms-store.d.ts +22 -1
- package/dist/core/comms-store.d.ts.map +1 -1
- package/dist/core/discovery-mdns.d.ts +33 -0
- package/dist/core/discovery-mdns.d.ts.map +1 -0
- package/dist/core/discovery-mdns.js +182 -0
- package/dist/core/discovery-mdns.js.map +1 -0
- package/dist/core/discovery-tailscale.d.ts +40 -0
- package/dist/core/discovery-tailscale.d.ts.map +1 -0
- package/dist/core/discovery-tailscale.js +158 -0
- package/dist/core/discovery-tailscale.js.map +1 -0
- package/dist/core/discovery.d.ts +82 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +194 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/federation.d.ts +100 -0
- package/dist/core/federation.d.ts.map +1 -0
- package/dist/core/federation.js +411 -0
- package/dist/core/federation.js.map +1 -0
- package/dist/core/identity.d.ts +31 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +251 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/mesh-store.d.ts +72 -26
- package/dist/core/mesh-store.d.ts.map +1 -1
- package/dist/core/mesh-store.js +467 -352
- package/dist/core/mesh-store.js.map +1 -1
- package/dist/core/push-manager.d.ts +41 -0
- package/dist/core/push-manager.d.ts.map +1 -0
- package/dist/core/push-manager.js +60 -0
- package/dist/core/push-manager.js.map +1 -0
- package/dist/core/store.d.ts +21 -1
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/store.js +44 -0
- package/dist/core/store.js.map +1 -1
- package/dist/core/tcp-transport.d.ts +77 -0
- package/dist/core/tcp-transport.d.ts.map +1 -0
- package/dist/core/tcp-transport.js +596 -0
- package/dist/core/tcp-transport.js.map +1 -0
- package/dist/core/test/identity.unit.test.d.ts +5 -0
- package/dist/core/test/identity.unit.test.d.ts.map +1 -0
- package/dist/core/test/identity.unit.test.js +70 -0
- package/dist/core/test/identity.unit.test.js.map +1 -0
- package/dist/core/tls-transport.d.ts +69 -0
- package/dist/core/tls-transport.d.ts.map +1 -0
- package/dist/core/tls-transport.js +602 -0
- package/dist/core/tls-transport.js.map +1 -0
- package/dist/core/tool.d.ts +23 -2
- package/dist/core/tool.d.ts.map +1 -1
- package/dist/core/tool.js +269 -1
- package/dist/core/tool.js.map +1 -1
- package/dist/core/transport.d.ts +166 -0
- package/dist/core/transport.d.ts.map +1 -0
- package/dist/core/transport.js +20 -0
- package/dist/core/transport.js.map +1 -0
- package/dist/core/types.d.ts +136 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +71 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/vapid.d.ts +22 -0
- package/dist/core/vapid.d.ts.map +1 -0
- package/dist/core/vapid.js +50 -0
- package/dist/core/vapid.js.map +1 -0
- package/dist/core/web-push.d.ts +37 -0
- package/dist/core/web-push.d.ts.map +1 -0
- package/dist/core/web-push.js +198 -0
- package/dist/core/web-push.js.map +1 -0
- package/dist/core/wire-protocol.d.ts +131 -0
- package/dist/core/wire-protocol.d.ts.map +1 -0
- package/dist/core/wire-protocol.js +54 -0
- package/dist/core/wire-protocol.js.map +1 -0
- package/dist/core/ws-transport.d.ts +71 -0
- package/dist/core/ws-transport.d.ts.map +1 -0
- package/dist/core/ws-transport.js +560 -0
- package/dist/core/ws-transport.js.map +1 -0
- package/dist/test/approval.integration.test.d.ts +9 -0
- package/dist/test/approval.integration.test.d.ts.map +1 -0
- package/dist/test/approval.integration.test.js +361 -0
- package/dist/test/approval.integration.test.js.map +1 -0
- package/dist/test/delivery-receipt.helper.d.ts +16 -0
- package/dist/test/delivery-receipt.helper.d.ts.map +1 -0
- package/dist/test/delivery-receipt.helper.js +409 -0
- package/dist/test/delivery-receipt.helper.js.map +1 -0
- package/dist/test/delivery-receipt.runner.d.ts +13 -0
- package/dist/test/delivery-receipt.runner.d.ts.map +1 -0
- package/dist/test/delivery-receipt.runner.js +51 -0
- package/dist/test/delivery-receipt.runner.js.map +1 -0
- package/dist/test/federation.integration.test.d.ts +15 -0
- package/dist/test/federation.integration.test.d.ts.map +1 -0
- package/dist/test/federation.integration.test.js +218 -0
- package/dist/test/federation.integration.test.js.map +1 -0
- package/dist/test/listener-policy.integration.test.d.ts +9 -0
- package/dist/test/listener-policy.integration.test.d.ts.map +1 -0
- package/dist/test/listener-policy.integration.test.js +239 -0
- package/dist/test/listener-policy.integration.test.js.map +1 -0
- package/dist/test/tls-transport.integration.test.d.ts +8 -0
- package/dist/test/tls-transport.integration.test.d.ts.map +1 -0
- package/dist/test/tls-transport.integration.test.js +158 -0
- package/dist/test/tls-transport.integration.test.js.map +1 -0
- package/dist/test/visibility.integration.test.d.ts +12 -0
- package/dist/test/visibility.integration.test.d.ts.map +1 -0
- package/dist/test/visibility.integration.test.js +181 -0
- package/dist/test/visibility.integration.test.js.map +1 -0
- package/package.json +4 -1
package/dist/core/types.d.ts
CHANGED
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
import { z } from "zod";
|
|
9
9
|
export type AgentId = string;
|
|
10
10
|
export type RoomId = string;
|
|
11
|
+
export declare const MeshVisibility: z.ZodUnion<readonly [z.ZodLiteral<"discoverable">, z.ZodLiteral<"quiet">, z.ZodLiteral<"dark">]> & {
|
|
12
|
+
is(value: unknown): value is "discoverable" | "quiet" | "dark";
|
|
13
|
+
};
|
|
14
|
+
export type MeshVisibility = z.infer<typeof MeshVisibility>;
|
|
11
15
|
export declare const Visibility: z.ZodUnion<readonly [z.ZodLiteral<"visible">, z.ZodLiteral<"hidden">, z.ZodLiteral<"ghost">]> & {
|
|
12
16
|
is(value: unknown): value is "visible" | "hidden" | "ghost";
|
|
13
17
|
};
|
|
@@ -61,6 +65,7 @@ export declare const RoomSchema: z.ZodObject<{
|
|
|
61
65
|
description: z.ZodString;
|
|
62
66
|
members: z.ZodArray<z.ZodString>;
|
|
63
67
|
invited: z.ZodArray<z.ZodString>;
|
|
68
|
+
federated: z.ZodOptional<z.ZodBoolean>;
|
|
64
69
|
}, z.core.$strip> & {
|
|
65
70
|
is(value: unknown): value is {
|
|
66
71
|
id: string;
|
|
@@ -71,6 +76,7 @@ export declare const RoomSchema: z.ZodObject<{
|
|
|
71
76
|
description: string;
|
|
72
77
|
members: string[];
|
|
73
78
|
invited: string[];
|
|
79
|
+
federated?: boolean | undefined;
|
|
74
80
|
};
|
|
75
81
|
};
|
|
76
82
|
export type Room = z.infer<typeof RoomSchema>;
|
|
@@ -227,6 +233,13 @@ export declare const DeliveryEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
227
233
|
agent: z.ZodString;
|
|
228
234
|
oldName: z.ZodString;
|
|
229
235
|
newName: z.ZodString;
|
|
236
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
237
|
+
type: z.ZodLiteral<"connection_request">;
|
|
238
|
+
connectionId: z.ZodString;
|
|
239
|
+
peerId: z.ZodString;
|
|
240
|
+
dataPort: z.ZodNumber;
|
|
241
|
+
name: z.ZodString;
|
|
242
|
+
fingerprint: z.ZodString;
|
|
230
243
|
}, z.core.$strip>], "type"> & {
|
|
231
244
|
is(value: unknown): value is {
|
|
232
245
|
type: "room_message";
|
|
@@ -294,9 +307,22 @@ export declare const DeliveryEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
294
307
|
agent: string;
|
|
295
308
|
oldName: string;
|
|
296
309
|
newName: string;
|
|
310
|
+
} | {
|
|
311
|
+
type: "connection_request";
|
|
312
|
+
connectionId: string;
|
|
313
|
+
peerId: string;
|
|
314
|
+
dataPort: number;
|
|
315
|
+
name: string;
|
|
316
|
+
fingerprint: string;
|
|
297
317
|
};
|
|
298
318
|
};
|
|
299
319
|
export type DeliveryEvent = z.infer<typeof DeliveryEventSchema>;
|
|
320
|
+
export interface NetworkInterface {
|
|
321
|
+
name: string;
|
|
322
|
+
address: string;
|
|
323
|
+
family: "IPv4" | "IPv6";
|
|
324
|
+
internal: boolean;
|
|
325
|
+
}
|
|
300
326
|
export declare const CommsActionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
301
327
|
action: z.ZodLiteral<"register">;
|
|
302
328
|
name: z.ZodString;
|
|
@@ -361,6 +387,62 @@ export declare const CommsActionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
361
387
|
}, z.core.$strip>, z.ZodObject<{
|
|
362
388
|
action: z.ZodLiteral<"destroy_room">;
|
|
363
389
|
room: z.ZodString;
|
|
390
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
391
|
+
action: z.ZodLiteral<"mesh_connect">;
|
|
392
|
+
host: z.ZodString;
|
|
393
|
+
port: z.ZodNumber;
|
|
394
|
+
policy: z.ZodOptional<z.ZodString>;
|
|
395
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
396
|
+
action: z.ZodLiteral<"mesh_accept">;
|
|
397
|
+
connectionId: z.ZodString;
|
|
398
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
399
|
+
action: z.ZodLiteral<"mesh_reject">;
|
|
400
|
+
connectionId: z.ZodString;
|
|
401
|
+
reason: z.ZodString;
|
|
402
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
403
|
+
action: z.ZodLiteral<"mesh_pending">;
|
|
404
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
405
|
+
action: z.ZodLiteral<"mesh_discover">;
|
|
406
|
+
method: z.ZodOptional<z.ZodString>;
|
|
407
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
408
|
+
action: z.ZodLiteral<"mesh_advertise">;
|
|
409
|
+
method: z.ZodString;
|
|
410
|
+
name: z.ZodString;
|
|
411
|
+
port: z.ZodOptional<z.ZodNumber>;
|
|
412
|
+
adapter: z.ZodOptional<z.ZodString>;
|
|
413
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
414
|
+
action: z.ZodLiteral<"mesh_unadvertise">;
|
|
415
|
+
id: z.ZodString;
|
|
416
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
417
|
+
action: z.ZodLiteral<"mesh_interfaces">;
|
|
418
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
419
|
+
action: z.ZodLiteral<"mesh_listen">;
|
|
420
|
+
host: z.ZodString;
|
|
421
|
+
port: z.ZodOptional<z.ZodNumber>;
|
|
422
|
+
policy: z.ZodOptional<z.ZodString>;
|
|
423
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
424
|
+
action: z.ZodLiteral<"mesh_unlisten">;
|
|
425
|
+
id: z.ZodString;
|
|
426
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
427
|
+
action: z.ZodLiteral<"mesh_listeners">;
|
|
428
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
429
|
+
action: z.ZodLiteral<"mesh_set_visibility">;
|
|
430
|
+
visibility: z.ZodUnion<readonly [z.ZodLiteral<"discoverable">, z.ZodLiteral<"quiet">, z.ZodLiteral<"dark">]> & {
|
|
431
|
+
is(value: unknown): value is "discoverable" | "quiet" | "dark";
|
|
432
|
+
};
|
|
433
|
+
adapter: z.ZodOptional<z.ZodString>;
|
|
434
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
435
|
+
action: z.ZodLiteral<"mesh_get_visibility">;
|
|
436
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
437
|
+
action: z.ZodLiteral<"mesh_fed_connect">;
|
|
438
|
+
host: z.ZodString;
|
|
439
|
+
port: z.ZodNumber;
|
|
440
|
+
name: z.ZodOptional<z.ZodString>;
|
|
441
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
442
|
+
action: z.ZodLiteral<"mesh_fed_disconnect">;
|
|
443
|
+
linkId: z.ZodString;
|
|
444
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
445
|
+
action: z.ZodLiteral<"mesh_fed_links">;
|
|
364
446
|
}, z.core.$strip>], "action"> & {
|
|
365
447
|
is(value: unknown): value is {
|
|
366
448
|
action: "register";
|
|
@@ -418,6 +500,60 @@ export declare const CommsActionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
418
500
|
} | {
|
|
419
501
|
action: "destroy_room";
|
|
420
502
|
room: string;
|
|
503
|
+
} | {
|
|
504
|
+
action: "mesh_connect";
|
|
505
|
+
host: string;
|
|
506
|
+
port: number;
|
|
507
|
+
policy?: string | undefined;
|
|
508
|
+
} | {
|
|
509
|
+
action: "mesh_accept";
|
|
510
|
+
connectionId: string;
|
|
511
|
+
} | {
|
|
512
|
+
action: "mesh_reject";
|
|
513
|
+
connectionId: string;
|
|
514
|
+
reason: string;
|
|
515
|
+
} | {
|
|
516
|
+
action: "mesh_pending";
|
|
517
|
+
} | {
|
|
518
|
+
action: "mesh_discover";
|
|
519
|
+
method?: string | undefined;
|
|
520
|
+
} | {
|
|
521
|
+
action: "mesh_advertise";
|
|
522
|
+
method: string;
|
|
523
|
+
name: string;
|
|
524
|
+
port?: number | undefined;
|
|
525
|
+
adapter?: string | undefined;
|
|
526
|
+
} | {
|
|
527
|
+
action: "mesh_unadvertise";
|
|
528
|
+
id: string;
|
|
529
|
+
} | {
|
|
530
|
+
action: "mesh_interfaces";
|
|
531
|
+
} | {
|
|
532
|
+
action: "mesh_listen";
|
|
533
|
+
host: string;
|
|
534
|
+
port?: number | undefined;
|
|
535
|
+
policy?: string | undefined;
|
|
536
|
+
} | {
|
|
537
|
+
action: "mesh_unlisten";
|
|
538
|
+
id: string;
|
|
539
|
+
} | {
|
|
540
|
+
action: "mesh_listeners";
|
|
541
|
+
} | {
|
|
542
|
+
action: "mesh_set_visibility";
|
|
543
|
+
visibility: "discoverable" | "quiet" | "dark";
|
|
544
|
+
adapter?: string | undefined;
|
|
545
|
+
} | {
|
|
546
|
+
action: "mesh_get_visibility";
|
|
547
|
+
} | {
|
|
548
|
+
action: "mesh_fed_connect";
|
|
549
|
+
host: string;
|
|
550
|
+
port: number;
|
|
551
|
+
name?: string | undefined;
|
|
552
|
+
} | {
|
|
553
|
+
action: "mesh_fed_disconnect";
|
|
554
|
+
linkId: string;
|
|
555
|
+
} | {
|
|
556
|
+
action: "mesh_fed_links";
|
|
421
557
|
};
|
|
422
558
|
};
|
|
423
559
|
export type CommsAction = z.infer<typeof CommsActionSchema>;
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqBxB,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAC7B,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAM5B,eAAO,MAAM,UAAU;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.js
CHANGED
|
@@ -19,6 +19,7 @@ function defineSchema(schema) {
|
|
|
19
19
|
// ---------------------------------------------------------------------------
|
|
20
20
|
// Enums
|
|
21
21
|
// ---------------------------------------------------------------------------
|
|
22
|
+
export const MeshVisibility = defineSchema(z.union([z.literal("discoverable"), z.literal("quiet"), z.literal("dark")]));
|
|
22
23
|
export const Visibility = defineSchema(z.union([z.literal("visible"), z.literal("hidden"), z.literal("ghost")]));
|
|
23
24
|
export const AgentStatus = defineSchema(z.union([
|
|
24
25
|
z.literal("active"),
|
|
@@ -54,6 +55,7 @@ export const RoomSchema = defineSchema(z.object({
|
|
|
54
55
|
description: z.string(),
|
|
55
56
|
members: z.array(z.string()),
|
|
56
57
|
invited: z.array(z.string()),
|
|
58
|
+
federated: z.boolean().optional(),
|
|
57
59
|
}));
|
|
58
60
|
// ---------------------------------------------------------------------------
|
|
59
61
|
// Messages
|
|
@@ -142,6 +144,14 @@ export const DeliveryEventSchema = defineSchema(z.discriminatedUnion("type", [
|
|
|
142
144
|
oldName: z.string(),
|
|
143
145
|
newName: z.string(),
|
|
144
146
|
}),
|
|
147
|
+
z.object({
|
|
148
|
+
type: z.literal("connection_request"),
|
|
149
|
+
connectionId: z.string(),
|
|
150
|
+
peerId: z.string(),
|
|
151
|
+
dataPort: z.number(),
|
|
152
|
+
name: z.string(),
|
|
153
|
+
fingerprint: z.string(),
|
|
154
|
+
}),
|
|
145
155
|
]));
|
|
146
156
|
// ---------------------------------------------------------------------------
|
|
147
157
|
// CommsAction
|
|
@@ -212,5 +222,66 @@ export const CommsActionSchema = defineSchema(z.discriminatedUnion("action", [
|
|
|
212
222
|
action: z.literal("destroy_room"),
|
|
213
223
|
room: z.string(),
|
|
214
224
|
}),
|
|
225
|
+
z.object({
|
|
226
|
+
action: z.literal("mesh_connect"),
|
|
227
|
+
host: z.string(),
|
|
228
|
+
port: z.number(),
|
|
229
|
+
policy: z.string().optional(),
|
|
230
|
+
}),
|
|
231
|
+
z.object({
|
|
232
|
+
action: z.literal("mesh_accept"),
|
|
233
|
+
connectionId: z.string(),
|
|
234
|
+
}),
|
|
235
|
+
z.object({
|
|
236
|
+
action: z.literal("mesh_reject"),
|
|
237
|
+
connectionId: z.string(),
|
|
238
|
+
reason: z.string(),
|
|
239
|
+
}),
|
|
240
|
+
z.object({ action: z.literal("mesh_pending") }),
|
|
241
|
+
z.object({
|
|
242
|
+
action: z.literal("mesh_discover"),
|
|
243
|
+
method: z.string().optional(),
|
|
244
|
+
}),
|
|
245
|
+
z.object({
|
|
246
|
+
action: z.literal("mesh_advertise"),
|
|
247
|
+
method: z.string(),
|
|
248
|
+
name: z.string(),
|
|
249
|
+
port: z.number().optional(),
|
|
250
|
+
adapter: z.string().optional(),
|
|
251
|
+
}),
|
|
252
|
+
z.object({
|
|
253
|
+
action: z.literal("mesh_unadvertise"),
|
|
254
|
+
id: z.string(),
|
|
255
|
+
}),
|
|
256
|
+
z.object({ action: z.literal("mesh_interfaces") }),
|
|
257
|
+
z.object({
|
|
258
|
+
action: z.literal("mesh_listen"),
|
|
259
|
+
host: z.string(),
|
|
260
|
+
port: z.number().optional(),
|
|
261
|
+
policy: z.string().optional(),
|
|
262
|
+
}),
|
|
263
|
+
z.object({
|
|
264
|
+
action: z.literal("mesh_unlisten"),
|
|
265
|
+
id: z.string(),
|
|
266
|
+
}),
|
|
267
|
+
z.object({ action: z.literal("mesh_listeners") }),
|
|
268
|
+
z.object({
|
|
269
|
+
action: z.literal("mesh_set_visibility"),
|
|
270
|
+
visibility: MeshVisibility,
|
|
271
|
+
adapter: z.string().optional(),
|
|
272
|
+
}),
|
|
273
|
+
z.object({ action: z.literal("mesh_get_visibility") }),
|
|
274
|
+
// Federation actions (coordinator-to-coordinator)
|
|
275
|
+
z.object({
|
|
276
|
+
action: z.literal("mesh_fed_connect"),
|
|
277
|
+
host: z.string(),
|
|
278
|
+
port: z.number(),
|
|
279
|
+
name: z.string().optional(),
|
|
280
|
+
}),
|
|
281
|
+
z.object({
|
|
282
|
+
action: z.literal("mesh_fed_disconnect"),
|
|
283
|
+
linkId: z.string(),
|
|
284
|
+
}),
|
|
285
|
+
z.object({ action: z.literal("mesh_fed_links") }),
|
|
215
286
|
]));
|
|
216
287
|
//# sourceMappingURL=types.js.map
|
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E,SAAS,YAAY,CAAsB,MAAS;IAClD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QAC3B,EAAE,CAAC,KAAc;YACf,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;QACzC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAYD,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CACpC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CACzE,CAAC;AAGF,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CACrC,CAAC,CAAC,KAAK,CAAC;IACN,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACjB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACjB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;CACrB,CAAC,CACH,CAAC;AAGF,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAClC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC1E,CAAC;AAGF,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,CAAC,CAAC,MAAM,CAAC;IACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,UAAU,EAAE,UAAU;IACtB,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CACrC,CAAC,CACH,CAAC;AAGF,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CACpC,CAAC,CAAC,MAAM,CAAC;IACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VAPID key generation for Web Push (RFC 8292).
|
|
3
|
+
*
|
|
4
|
+
* Generates a P-256 EC key pair once per process lifetime and caches it
|
|
5
|
+
* in memory. The public key is shared with the PWA client so it can
|
|
6
|
+
* create push subscriptions; the private key signs push requests.
|
|
7
|
+
*/
|
|
8
|
+
export interface VapidKeys {
|
|
9
|
+
/** Base64url-encoded uncompressed P-256 public key (65 bytes). */
|
|
10
|
+
publicKey: string;
|
|
11
|
+
/** Base64url-encoded P-256 private key (32 bytes). */
|
|
12
|
+
privateKey: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate or return cached VAPID keys.
|
|
16
|
+
*
|
|
17
|
+
* Uses Node.js `crypto.generateKeyPairSync` with P-256, extracts the
|
|
18
|
+
* raw 65-byte uncompressed public point and the 32-byte private scalar,
|
|
19
|
+
* and base64url-encodes both per RFC 8291.
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateVapidKeys(): VapidKeys;
|
|
22
|
+
//# sourceMappingURL=vapid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vapid.d.ts","sourceRoot":"","sources":["../../src/core/vapid.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,WAAW,SAAS;IACxB,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;CACpB;AAYD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,CAwB7C"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VAPID key generation for Web Push (RFC 8292).
|
|
3
|
+
*
|
|
4
|
+
* Generates a P-256 EC key pair once per process lifetime and caches it
|
|
5
|
+
* in memory. The public key is shared with the PWA client so it can
|
|
6
|
+
* create push subscriptions; the private key signs push requests.
|
|
7
|
+
*/
|
|
8
|
+
import * as crypto from "node:crypto";
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Cached singleton
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
let cachedKeys;
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Implementation
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/**
|
|
17
|
+
* Generate or return cached VAPID keys.
|
|
18
|
+
*
|
|
19
|
+
* Uses Node.js `crypto.generateKeyPairSync` with P-256, extracts the
|
|
20
|
+
* raw 65-byte uncompressed public point and the 32-byte private scalar,
|
|
21
|
+
* and base64url-encodes both per RFC 8291.
|
|
22
|
+
*/
|
|
23
|
+
export function generateVapidKeys() {
|
|
24
|
+
if (cachedKeys)
|
|
25
|
+
return cachedKeys;
|
|
26
|
+
const { publicKey, privateKey } = crypto.generateKeyPairSync("ec", {
|
|
27
|
+
namedCurve: "P-256",
|
|
28
|
+
});
|
|
29
|
+
// Export public key as raw DER, extract the 65-byte uncompressed point.
|
|
30
|
+
// SPKI DER for P-256 has a 26-byte header before the 65-byte point.
|
|
31
|
+
const pubDer = publicKey.export({ type: "spki", format: "der" });
|
|
32
|
+
const publicKeyBuffer = pubDer.subarray(pubDer.length - 65);
|
|
33
|
+
// Export private key as PKCS8 DER, extract the 32-byte private scalar.
|
|
34
|
+
// PKCS8 DER for P-256 has a 39-byte header before the 32-byte scalar.
|
|
35
|
+
// The scalar is the last 32 bytes (after the leading zero pad byte).
|
|
36
|
+
const privDer = privateKey.export({ type: "pkcs8", format: "der" });
|
|
37
|
+
const privateKeyBuffer = privDer.subarray(privDer.length - 32);
|
|
38
|
+
cachedKeys = {
|
|
39
|
+
publicKey: base64url(publicKeyBuffer),
|
|
40
|
+
privateKey: base64url(privateKeyBuffer),
|
|
41
|
+
};
|
|
42
|
+
return cachedKeys;
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Helpers
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
function base64url(buffer) {
|
|
48
|
+
return buffer.toString("base64url");
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=vapid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vapid.js","sourceRoot":"","sources":["../../src/core/vapid.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAatC,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,IAAI,UAAiC,CAAC;AAEtC,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE;QACjE,UAAU,EAAE,OAAO;KACpB,CAAC,CAAC;IAEH,wEAAwE;IACxE,oEAAoE;IACpE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAE5D,uEAAuE;IACvE,sEAAsE;IACtE,qEAAqE;IACrE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACpE,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAE/D,UAAU,GAAG;QACX,SAAS,EAAE,SAAS,CAAC,eAAe,CAAC;QACrC,UAAU,EAAE,SAAS,CAAC,gBAAgB,CAAC;KACxC,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,SAAS,CAAC,MAAc;IAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Push encryption and VAPID JWT signing (RFC 8291 + RFC 8292).
|
|
3
|
+
*
|
|
4
|
+
* Implements the Web Push protocol using only Node.js built-in `crypto`
|
|
5
|
+
* and `https` — no external dependencies.
|
|
6
|
+
*
|
|
7
|
+
* Encryption flow (RFC 8291):
|
|
8
|
+
* 1. Derive a shared ECDH secret from the subscription's p256dh key
|
|
9
|
+
* 2. HKDF-derive the encryption key and nonce from the shared secret + auth
|
|
10
|
+
* 3. Encrypt the payload with AES-128-GCM
|
|
11
|
+
* 4. Prepend the sender's public key (65 bytes) to the ciphertext
|
|
12
|
+
*
|
|
13
|
+
* VAPID signing (RFC 8292):
|
|
14
|
+
* 1. Build a JWT with { sub, exp, aud } claims
|
|
15
|
+
* 2. Sign with ES256 (ECDSA + P-256 + SHA-256)
|
|
16
|
+
* 3. Append the public key and token to the Crypto-Key header
|
|
17
|
+
*/
|
|
18
|
+
import type { VapidKeys } from "./vapid.js";
|
|
19
|
+
export interface PushSubscription {
|
|
20
|
+
endpoint: string;
|
|
21
|
+
keys: {
|
|
22
|
+
p256dh: string;
|
|
23
|
+
auth: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface PushPayload {
|
|
27
|
+
title: string;
|
|
28
|
+
body: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Send a Web Push notification.
|
|
32
|
+
*
|
|
33
|
+
* Encrypts the payload per RFC 8291, signs with VAPID per RFC 8292,
|
|
34
|
+
* and POSTs to the push service endpoint.
|
|
35
|
+
*/
|
|
36
|
+
export declare function sendWebPush(subscription: PushSubscription, payload: PushPayload, vapidKeys: VapidKeys, subject: string): Promise<void>;
|
|
37
|
+
//# sourceMappingURL=web-push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-push.d.ts","sourceRoot":"","sources":["../../src/core/web-push.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAM5C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAeD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,YAAY,EAAE,gBAAgB,EAC9B,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Push encryption and VAPID JWT signing (RFC 8291 + RFC 8292).
|
|
3
|
+
*
|
|
4
|
+
* Implements the Web Push protocol using only Node.js built-in `crypto`
|
|
5
|
+
* and `https` — no external dependencies.
|
|
6
|
+
*
|
|
7
|
+
* Encryption flow (RFC 8291):
|
|
8
|
+
* 1. Derive a shared ECDH secret from the subscription's p256dh key
|
|
9
|
+
* 2. HKDF-derive the encryption key and nonce from the shared secret + auth
|
|
10
|
+
* 3. Encrypt the payload with AES-128-GCM
|
|
11
|
+
* 4. Prepend the sender's public key (65 bytes) to the ciphertext
|
|
12
|
+
*
|
|
13
|
+
* VAPID signing (RFC 8292):
|
|
14
|
+
* 1. Build a JWT with { sub, exp, aud } claims
|
|
15
|
+
* 2. Sign with ES256 (ECDSA + P-256 + SHA-256)
|
|
16
|
+
* 3. Append the public key and token to the Crypto-Key header
|
|
17
|
+
*/
|
|
18
|
+
import * as crypto from "node:crypto";
|
|
19
|
+
import * as https from "node:https";
|
|
20
|
+
import * as http from "node:http";
|
|
21
|
+
import { URL } from "node:url";
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Constants
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
const CONTENT_ENCODING = "aes128gcm";
|
|
26
|
+
const KEY_LENGTH = 16;
|
|
27
|
+
const NONCE_LENGTH = 12;
|
|
28
|
+
const SALT_LENGTH = 16;
|
|
29
|
+
const MAX_PAYLOAD_SIZE = 4078;
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Public API
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
/**
|
|
34
|
+
* Send a Web Push notification.
|
|
35
|
+
*
|
|
36
|
+
* Encrypts the payload per RFC 8291, signs with VAPID per RFC 8292,
|
|
37
|
+
* and POSTs to the push service endpoint.
|
|
38
|
+
*/
|
|
39
|
+
export async function sendWebPush(subscription, payload, vapidKeys, subject) {
|
|
40
|
+
const plaintext = JSON.stringify(payload);
|
|
41
|
+
const plaintextBuf = Buffer.from(plaintext, "utf-8");
|
|
42
|
+
if (plaintextBuf.length > MAX_PAYLOAD_SIZE) {
|
|
43
|
+
throw new Error(`Payload too large: ${String(plaintextBuf.length)} bytes (max ${String(MAX_PAYLOAD_SIZE)})`);
|
|
44
|
+
}
|
|
45
|
+
const encrypted = encrypt(plaintextBuf, subscription.keys);
|
|
46
|
+
const headers = buildHeaders(encrypted, subscription.endpoint, vapidKeys, subject);
|
|
47
|
+
await post(subscription.endpoint, headers, encrypted);
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Encryption (RFC 8291)
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
function encrypt(plaintext, keys) {
|
|
53
|
+
// Decode the subscription's p256dh and auth keys
|
|
54
|
+
const recipientPubKey = base64urlDecode(keys.p256dh);
|
|
55
|
+
const authKey = base64urlDecode(keys.auth);
|
|
56
|
+
// Generate an ephemeral ECDH key pair for this message
|
|
57
|
+
const ecdh = crypto.generateKeyPairSync("ec", { namedCurve: "P-256" });
|
|
58
|
+
const senderPrivateKey = crypto.createPrivateKey({
|
|
59
|
+
key: ecdh.privateKey.export({ type: "pkcs8", format: "der" }),
|
|
60
|
+
format: "der",
|
|
61
|
+
type: "pkcs8",
|
|
62
|
+
});
|
|
63
|
+
const senderPublicDer = ecdh.publicKey.export({
|
|
64
|
+
type: "spki",
|
|
65
|
+
format: "der",
|
|
66
|
+
});
|
|
67
|
+
const senderPublicKey = senderPublicDer.subarray(senderPublicDer.length - 65);
|
|
68
|
+
// Derive the shared secret via ECDH
|
|
69
|
+
const sharedSecret = crypto.diffieHellman({
|
|
70
|
+
privateKey: senderPrivateKey,
|
|
71
|
+
publicKey: crypto.createPublicKey({
|
|
72
|
+
key: concat(Buffer.from("3059301306072a8648ce3d020106082a8648ce3d030107034200", "hex"), recipientPubKey),
|
|
73
|
+
format: "der",
|
|
74
|
+
type: "spki",
|
|
75
|
+
}),
|
|
76
|
+
});
|
|
77
|
+
// Derive the pseudo-random key (PRK) using HKDF with auth
|
|
78
|
+
const prk = hkdfExtract(authKey, sharedSecret);
|
|
79
|
+
// Derive the encryption key and nonce
|
|
80
|
+
const keyInfo = concat(Buffer.from("Content-Encoding: aes128gcm\0", "utf-8"), senderPublicKey);
|
|
81
|
+
const nonceInfo = Buffer.from("Content-Encoding: nonce\0", "utf-8");
|
|
82
|
+
const encryptionKey = hkdfExpand(prk, keyInfo, KEY_LENGTH);
|
|
83
|
+
const nonce = hkdfExpand(prk, nonceInfo, NONCE_LENGTH);
|
|
84
|
+
// Generate a random salt
|
|
85
|
+
const salt = crypto.randomBytes(SALT_LENGTH);
|
|
86
|
+
// Pad the plaintext: plaintext + 2-byte padding delimiter (0x02 0x00 for no padding)
|
|
87
|
+
// RFC 8291 §4: record is plaintext || 0x02 || padding zeros
|
|
88
|
+
const padded = concat(plaintext, Buffer.from([0x02]));
|
|
89
|
+
// Encrypt with AES-128-GCM
|
|
90
|
+
const cipher = crypto.createCipheriv("aes-128-gcm", encryptionKey, nonce);
|
|
91
|
+
const ciphertext = cipher.update(padded);
|
|
92
|
+
const authTag = cipher.getAuthTag();
|
|
93
|
+
// RFC 8291 §4: salt (16) || rs (4, big-endian, 4096) || sender pubkey (65) || ciphertext || tag
|
|
94
|
+
const rs = Buffer.alloc(4);
|
|
95
|
+
rs.writeUInt32BE(4096);
|
|
96
|
+
return concat(salt, rs, senderPublicKey, ciphertext, authTag);
|
|
97
|
+
}
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// HKDF helpers
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
function hkdfExtract(salt, ikm) {
|
|
102
|
+
const hmac = crypto.createHmac("sha256", salt);
|
|
103
|
+
hmac.update(ikm);
|
|
104
|
+
return hmac.digest();
|
|
105
|
+
}
|
|
106
|
+
function hkdfExpand(prk, info, length) {
|
|
107
|
+
const hmac = crypto.createHmac("sha256", prk);
|
|
108
|
+
hmac.update(concat(info, Buffer.from([0x01])));
|
|
109
|
+
const t = hmac.digest();
|
|
110
|
+
return t.subarray(0, length);
|
|
111
|
+
}
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// VAPID JWT signing (RFC 8292)
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
function buildVapidJwt(audience, vapidKeys, subject) {
|
|
116
|
+
const header = base64url(Buffer.from('{"alg":"ES256","typ":"JWT"}', "utf-8"));
|
|
117
|
+
const exp = Math.floor(Date.now() / 1000) + 12 * 60 * 60; // 12 hours
|
|
118
|
+
const claims = JSON.stringify({ aud: audience, exp, sub: subject });
|
|
119
|
+
const payload = base64url(Buffer.from(claims, "utf-8"));
|
|
120
|
+
const signInput = `${header}.${payload}`;
|
|
121
|
+
// Reconstruct the private key from the raw 32-byte scalar
|
|
122
|
+
// P-256 PKCS8 DER wrapper: 39 bytes header + 32 bytes scalar (with 0x00 prefix)
|
|
123
|
+
const privScalar = base64urlDecode(vapidKeys.privateKey);
|
|
124
|
+
// Build the EC private key in SEC1 DER format
|
|
125
|
+
const sec1Der = concat(Buffer.from("30770201010420", "hex"), privScalar, Buffer.from("a00a06082a8648ce3d030107a14403420004", "hex"), base64urlDecode(vapidKeys.publicKey));
|
|
126
|
+
const privateKey = crypto.createPrivateKey({
|
|
127
|
+
key: sec1Der,
|
|
128
|
+
format: "der",
|
|
129
|
+
type: "sec1",
|
|
130
|
+
});
|
|
131
|
+
const signature = crypto.sign("sha256", Buffer.from(signInput), privateKey);
|
|
132
|
+
// ECDSA signature is a DER-encoded SEQUENCE of two INTEGERs.
|
|
133
|
+
// Web Push requires base64url encoding of the raw DER.
|
|
134
|
+
const sigB64 = base64url(signature);
|
|
135
|
+
return `${signInput}.${sigB64}`;
|
|
136
|
+
}
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
// HTTP headers
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
function buildHeaders(encrypted, endpoint, vapidKeys, subject) {
|
|
141
|
+
const audience = new URL(endpoint).origin;
|
|
142
|
+
const jwt = buildVapidJwt(audience, vapidKeys, subject);
|
|
143
|
+
return {
|
|
144
|
+
"Content-Type": "application/octet-stream",
|
|
145
|
+
"Content-Encoding": CONTENT_ENCODING,
|
|
146
|
+
"Content-Length": String(encrypted.length),
|
|
147
|
+
Authorization: `vapid t=${jwt}, k=${vapidKeys.publicKey}`,
|
|
148
|
+
TTL: "86400",
|
|
149
|
+
Urgency: "high",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// HTTP POST
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
function post(endpoint, headers, body) {
|
|
156
|
+
return new Promise((resolve, reject) => {
|
|
157
|
+
const url = new URL(endpoint);
|
|
158
|
+
const isHttps = url.protocol === "https:";
|
|
159
|
+
const mod = isHttps ? https : http;
|
|
160
|
+
const req = mod.request({
|
|
161
|
+
hostname: url.hostname,
|
|
162
|
+
port: url.port || (isHttps ? 443 : 80),
|
|
163
|
+
path: url.pathname + url.search,
|
|
164
|
+
method: "POST",
|
|
165
|
+
headers,
|
|
166
|
+
}, (res) => {
|
|
167
|
+
// Drain the response body
|
|
168
|
+
const chunks = [];
|
|
169
|
+
res.on("data", (chunk) => chunks.push(chunk));
|
|
170
|
+
res.on("end", () => {
|
|
171
|
+
if (res.statusCode !== undefined &&
|
|
172
|
+
(res.statusCode < 200 || res.statusCode > 299)) {
|
|
173
|
+
const body = Buffer.concat(chunks).toString("utf-8");
|
|
174
|
+
reject(new Error(`Push service returned ${String(res.statusCode)}: ${body}`));
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
resolve();
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
req.on("error", reject);
|
|
182
|
+
req.write(body);
|
|
183
|
+
req.end();
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
// Utilities
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
function base64urlDecode(input) {
|
|
190
|
+
return Buffer.from(input, "base64url");
|
|
191
|
+
}
|
|
192
|
+
function base64url(input) {
|
|
193
|
+
return input.toString("base64url");
|
|
194
|
+
}
|
|
195
|
+
function concat(...buffers) {
|
|
196
|
+
return Buffer.concat(buffers);
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=web-push.js.map
|