@robota-sdk/agent-transport-webrtc 3.0.0-beta.100

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 (84) hide show
  1. package/CHANGELOG.md +694 -0
  2. package/LICENSE +661 -0
  3. package/README.md +111 -0
  4. package/dist/node/index.cjs +1 -0
  5. package/dist/node/index.d.cts +1650 -0
  6. package/dist/node/index.d.cts.map +1 -0
  7. package/dist/node/index.d.ts +1650 -0
  8. package/dist/node/index.d.ts.map +1 -0
  9. package/dist/node/index.js +2 -0
  10. package/dist/node/index.js.map +1 -0
  11. package/package.json +93 -0
  12. package/src/__tests__/admission-secure-by-default.test.ts +63 -0
  13. package/src/__tests__/admission-steps.test.ts +46 -0
  14. package/src/__tests__/device-mesh-relay.test.ts +441 -0
  15. package/src/__tests__/device-mesh.test.ts +682 -0
  16. package/src/__tests__/discovering-mesh-relay.test.ts +234 -0
  17. package/src/__tests__/enrollment-link.test.ts +103 -0
  18. package/src/__tests__/fake-datachannel.ts +83 -0
  19. package/src/__tests__/handoff-grant-gate.test.ts +403 -0
  20. package/src/__tests__/local-peer-proof-gate.test.ts +215 -0
  21. package/src/__tests__/mesh-admission-contract.test.ts +38 -0
  22. package/src/__tests__/mesh-discovery.test.ts +820 -0
  23. package/src/__tests__/mesh-fixtures.ts +148 -0
  24. package/src/__tests__/mesh-internet.test.ts +942 -0
  25. package/src/__tests__/mesh-turn-relay.test.ts +161 -0
  26. package/src/__tests__/negotiated-certificate.test.ts +76 -0
  27. package/src/__tests__/nostr-source-condition.test.ts +27 -0
  28. package/src/__tests__/operator-approval-gate.test.ts +308 -0
  29. package/src/__tests__/outbound-delivery-carrier.test.ts +155 -0
  30. package/src/__tests__/pairing-e2e.test.ts +237 -0
  31. package/src/__tests__/pairing-gate-e3.test.ts +194 -0
  32. package/src/__tests__/pairing-gate-e4.test.ts +110 -0
  33. package/src/__tests__/pairing-gate.test.ts +296 -0
  34. package/src/__tests__/pairing-relay-in-the-middle.test.ts +225 -0
  35. package/src/__tests__/rtc-channel-close.test.ts +52 -0
  36. package/src/__tests__/rtc-peer-candidates.test.ts +61 -0
  37. package/src/__tests__/session-attachment-app-view.test.ts +66 -0
  38. package/src/__tests__/session-attachment-budget.test.ts +136 -0
  39. package/src/__tests__/turn-server-bind.test.ts +59 -0
  40. package/src/__tests__/turn-server.test.ts +335 -0
  41. package/src/__tests__/turn-test-client.ts +256 -0
  42. package/src/__tests__/webrtc-implementation.test.ts +83 -0
  43. package/src/__tests__/webrtc-transport.test.ts +349 -0
  44. package/src/__tests__/ws-mesh-relay-client.test.ts +95 -0
  45. package/src/__tests__/ws-signaling-client.test.ts +108 -0
  46. package/src/admission-steps.ts +55 -0
  47. package/src/channel-delivery.ts +44 -0
  48. package/src/datachannel-loader.ts +86 -0
  49. package/src/device-mesh-node.ts +1019 -0
  50. package/src/discovering-mesh-relay.ts +675 -0
  51. package/src/enrollment-link.ts +465 -0
  52. package/src/handoff-grant-gate.ts +186 -0
  53. package/src/index.ts +139 -0
  54. package/src/local-peer-proof.ts +135 -0
  55. package/src/mainline-dht-store.ts +174 -0
  56. package/src/mesh-dht.ts +446 -0
  57. package/src/mesh-discovery.ts +87 -0
  58. package/src/mesh-item-store.ts +287 -0
  59. package/src/mesh-lan-listener.ts +193 -0
  60. package/src/mesh-mdns.ts +406 -0
  61. package/src/mesh-peer-link.ts +600 -0
  62. package/src/mesh-public-relays.ts +25 -0
  63. package/src/mesh-records.ts +357 -0
  64. package/src/mesh-relay.ts +98 -0
  65. package/src/mesh-signal.ts +116 -0
  66. package/src/mesh-turn-relay.ts +238 -0
  67. package/src/negotiated-certificate.ts +72 -0
  68. package/src/nostr-mesh-relay.ts +391 -0
  69. package/src/pairing-channel-lifecycle.ts +31 -0
  70. package/src/pairing-controllers.ts +81 -0
  71. package/src/pairing-frames.ts +34 -0
  72. package/src/pairing-gate-options.ts +133 -0
  73. package/src/pairing-gate.ts +397 -0
  74. package/src/rtc-peer.ts +429 -0
  75. package/src/session-attachment.ts +96 -0
  76. package/src/signaling.ts +62 -0
  77. package/src/stun-message.ts +341 -0
  78. package/src/transport-lifecycle-error.ts +11 -0
  79. package/src/turn-server.ts +1028 -0
  80. package/src/webrtc-delivery-lifecycle.ts +54 -0
  81. package/src/webrtc-transport-options.ts +87 -0
  82. package/src/webrtc-transport.ts +368 -0
  83. package/src/ws-mesh-relay-client.ts +117 -0
  84. package/src/ws-signaling-client.ts +139 -0
@@ -0,0 +1,148 @@
1
+ import { createIdentityContext } from '@robota-sdk/agent-remote-pairing';
2
+ const testIdentity = createIdentityContext('test-product');
3
+ /**
4
+ * One user's identity with three devices, for device mesh tests: `low` and `high` are ordered by
5
+ * device id, so `low` is the offerer of their pair; `third` is a third rostered device.
6
+ */
7
+ import {
8
+ certifyDevice,
9
+ certifySigningKey,
10
+ deriveMasterKey,
11
+ generateDeviceKeyAgreementKeyPair,
12
+ generateDeviceSignKeyPair,
13
+ generateSigningKeyPair,
14
+ issueDeviceRevocationList,
15
+ issueDeviceRoster,
16
+ issueSigningKeyRevocation,
17
+ signSessionDescriptor,
18
+ type IDeviceCertificate,
19
+ type IDeviceHandshakeIdentity,
20
+ type IDeviceRevocationList,
21
+ type ISessionDescriptor,
22
+ type ISigningKey,
23
+ type TDeviceCapability,
24
+ } from '@robota-sdk/agent-remote-pairing';
25
+
26
+ export const PHRASE =
27
+ 'hamster diagram private dutch cause delay private meat slide toddler razor book happy fancy gospel tennis maple dilemma loan word shrug inflict delay length';
28
+
29
+ export const ALL_CAPABILITIES: readonly TDeviceCapability[] = [
30
+ 'delegate',
31
+ 'drive',
32
+ 'handoff',
33
+ 'message',
34
+ 'observe',
35
+ 'presence',
36
+ ];
37
+
38
+ export interface IMeshTestDevice {
39
+ readonly cert: IDeviceCertificate;
40
+ readonly sign: CryptoKeyPair;
41
+ readonly ka: CryptoKeyPair;
42
+ readonly session: ISessionDescriptor;
43
+ }
44
+
45
+ export interface IMeshTestWorld {
46
+ readonly signingKey: ISigningKey;
47
+ readonly masterPublicKey: string;
48
+ readonly low: IMeshTestDevice;
49
+ readonly high: IMeshTestDevice;
50
+ readonly third: IMeshTestDevice;
51
+ identity(
52
+ device: IMeshTestDevice,
53
+ over?: Partial<IDeviceHandshakeIdentity>,
54
+ ): IDeviceHandshakeIdentity;
55
+ /** A newer revocation list revoking `device`. */
56
+ revoking(device: IMeshTestDevice): Promise<IDeviceRevocationList>;
57
+ }
58
+
59
+ async function makeDevice(
60
+ signingKey: ISigningKey,
61
+ name: string,
62
+ now: number,
63
+ ): Promise<IMeshTestDevice> {
64
+ const sign = await generateDeviceSignKeyPair(false);
65
+ const ka = await generateDeviceKeyAgreementKeyPair(false);
66
+ const cert = await certifyDevice(testIdentity, {
67
+ signingKey,
68
+ signPublicKey: sign.publicKey,
69
+ kaPublicKey: ka.publicKey,
70
+ kaEpoch: 0,
71
+ name,
72
+ capabilities: ALL_CAPABILITIES,
73
+ issuedAt: now,
74
+ });
75
+ const session = await signSessionDescriptor(testIdentity, {
76
+ signPrivateKey: sign.privateKey,
77
+ deviceId: cert.deviceId,
78
+ sessionId: `c2Vzc2lvbi${name}`,
79
+ startedAt: now,
80
+ });
81
+ return { cert, sign, ka, session };
82
+ }
83
+
84
+ export async function buildMeshWorld(now = Date.now()): Promise<IMeshTestWorld> {
85
+ const master = await deriveMasterKey(PHRASE, { derivationPath: [100, 0] });
86
+ const pair = await generateSigningKeyPair({ extractable: false });
87
+ const certificate = await certifySigningKey(testIdentity, {
88
+ masterPrivateKey: master.keyPair.privateKey,
89
+ userId: master.userId,
90
+ signingPublicKey: pair.publicKey,
91
+ issuedAt: now,
92
+ });
93
+ const signingKey: ISigningKey = { certificate, privateKey: pair.privateKey };
94
+ const made = [
95
+ await makeDevice(signingKey, 'one', now),
96
+ await makeDevice(signingKey, 'two', now),
97
+ await makeDevice(signingKey, 'three', now),
98
+ ];
99
+ const [low, high] = [made[0]!, made[1]!].sort((x, y) =>
100
+ x.cert.deviceId < y.cert.deviceId ? -1 : 1,
101
+ ) as [IMeshTestDevice, IMeshTestDevice];
102
+ const third = made[2]!;
103
+ const roster = await issueDeviceRoster(testIdentity, {
104
+ signingKey,
105
+ seq: 10,
106
+ issuedAt: now,
107
+ devices: made.map((d) => d.cert),
108
+ });
109
+ const revocation = await issueDeviceRevocationList(testIdentity, {
110
+ signingKey,
111
+ seq: 10,
112
+ issuedAt: now,
113
+ revokedDeviceIds: [],
114
+ });
115
+ const signingKeyRevocation = await issueSigningKeyRevocation(testIdentity, {
116
+ masterPrivateKey: master.keyPair.privateKey,
117
+ userId: master.userId,
118
+ seq: 1,
119
+ issuedAt: now,
120
+ revokedSigningKeyIds: [],
121
+ });
122
+ return {
123
+ signingKey,
124
+ masterPublicKey: master.publicKey,
125
+ low,
126
+ high,
127
+ third,
128
+ identity: (device, over = {}) => ({
129
+ masterPublicKey: master.publicKey,
130
+ signingKeyCertificate: certificate,
131
+ deviceCertificate: device.cert,
132
+ signPrivateKey: device.sign.privateKey,
133
+ kaPrivateKey: device.ka.privateKey,
134
+ roster,
135
+ revocation,
136
+ signingKeyRevocation,
137
+ marks: {},
138
+ ...over,
139
+ }),
140
+ revoking: (device) =>
141
+ issueDeviceRevocationList(testIdentity, {
142
+ signingKey,
143
+ seq: 11,
144
+ issuedAt: now,
145
+ revokedDeviceIds: [device.cert.deviceId],
146
+ }),
147
+ };
148
+ }