@blit-sh/core 0.19.0 → 0.21.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 (58) hide show
  1. package/dist/BlitConnection.d.ts +16 -2
  2. package/dist/BlitConnection.d.ts.map +1 -1
  3. package/dist/BlitConnection.js +183 -8
  4. package/dist/BlitConnection.js.map +1 -1
  5. package/dist/BlitSurfaceCanvas.d.ts +122 -0
  6. package/dist/BlitSurfaceCanvas.d.ts.map +1 -0
  7. package/dist/BlitSurfaceCanvas.js +582 -0
  8. package/dist/BlitSurfaceCanvas.js.map +1 -0
  9. package/dist/BlitTerminalSurface.d.ts +12 -0
  10. package/dist/BlitTerminalSurface.d.ts.map +1 -1
  11. package/dist/BlitTerminalSurface.js +51 -1
  12. package/dist/BlitTerminalSurface.js.map +1 -1
  13. package/dist/BlitWorkspace.d.ts +2 -0
  14. package/dist/BlitWorkspace.d.ts.map +1 -1
  15. package/dist/BlitWorkspace.js +27 -0
  16. package/dist/BlitWorkspace.js.map +1 -1
  17. package/dist/SurfaceStore.d.ts +69 -0
  18. package/dist/SurfaceStore.d.ts.map +1 -0
  19. package/dist/SurfaceStore.js +494 -0
  20. package/dist/SurfaceStore.js.map +1 -0
  21. package/dist/TerminalStore.d.ts.map +1 -1
  22. package/dist/TerminalStore.js +4 -1
  23. package/dist/TerminalStore.js.map +1 -1
  24. package/dist/bsp/index.d.ts +1 -1
  25. package/dist/bsp/index.d.ts.map +1 -1
  26. package/dist/bsp/index.js +1 -1
  27. package/dist/bsp/index.js.map +1 -1
  28. package/dist/bsp/layout.d.ts +9 -1
  29. package/dist/bsp/layout.d.ts.map +1 -1
  30. package/dist/bsp/layout.js +36 -4
  31. package/dist/bsp/layout.js.map +1 -1
  32. package/dist/gl-renderer.d.ts +6 -0
  33. package/dist/gl-renderer.d.ts.map +1 -1
  34. package/dist/gl-renderer.js +132 -0
  35. package/dist/gl-renderer.js.map +1 -1
  36. package/dist/index.d.ts +7 -2
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +4 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/keyboard.d.ts +6 -0
  41. package/dist/keyboard.d.ts.map +1 -1
  42. package/dist/keyboard.js +25 -0
  43. package/dist/keyboard.js.map +1 -1
  44. package/dist/protocol.d.ts +19 -0
  45. package/dist/protocol.d.ts.map +1 -1
  46. package/dist/protocol.js +124 -1
  47. package/dist/protocol.js.map +1 -1
  48. package/dist/transports/webrtc-share.d.ts.map +1 -1
  49. package/dist/transports/webrtc-share.js +209 -62
  50. package/dist/transports/webrtc-share.js.map +1 -1
  51. package/dist/transports/webtransport.d.ts.map +1 -1
  52. package/dist/transports/webtransport.js +3 -1
  53. package/dist/transports/webtransport.js.map +1 -1
  54. package/dist/types.d.ts +41 -0
  55. package/dist/types.d.ts.map +1 -1
  56. package/dist/types.js +29 -0
  57. package/dist/types.js.map +1 -1
  58. package/package.json +1 -1
package/dist/protocol.js CHANGED
@@ -1,4 +1,4 @@
1
- import { C2S_ACK, C2S_CLIENT_METRICS, C2S_DISPLAY_RATE, C2S_INPUT, C2S_KILL, C2S_MOUSE, C2S_RESTART, C2S_RESIZE, C2S_SCROLL, C2S_FOCUS, C2S_CLOSE, C2S_SUBSCRIBE, C2S_UNSUBSCRIBE, C2S_SEARCH, C2S_COPY_RANGE, C2S_CREATE2, CREATE2_HAS_SRC_PTY, CREATE2_HAS_COMMAND, } from "./types";
1
+ import { C2S_ACK, C2S_CLIENT_METRICS, C2S_CLIPBOARD, C2S_DISPLAY_RATE, C2S_INPUT, C2S_KILL, C2S_MOUSE, C2S_RESTART, C2S_RESIZE, C2S_SCROLL, C2S_FOCUS, C2S_CLOSE, C2S_SUBSCRIBE, C2S_UNSUBSCRIBE, C2S_SEARCH, C2S_COPY_RANGE, C2S_CREATE2, C2S_SURFACE_INPUT, C2S_SURFACE_POINTER, C2S_SURFACE_POINTER_AXIS, C2S_SURFACE_RESIZE, C2S_SURFACE_FOCUS, C2S_SURFACE_SUBSCRIBE, C2S_SURFACE_UNSUBSCRIBE, C2S_SURFACE_ACK, C2S_SURFACE_CLOSE, CREATE2_HAS_SRC_PTY, CREATE2_HAS_COMMAND, } from "./types";
2
2
  const textEncoder = new TextEncoder();
3
3
  const UNSET_VIEW_SIZE = 0;
4
4
  export function buildAckMessage() {
@@ -192,4 +192,127 @@ export function buildCopyRangeMessage(nonce, ptyId, startTail, startCol, endTail
192
192
  msg[17] = 0;
193
193
  return msg;
194
194
  }
195
+ export function buildSurfaceInputMessage(sessionId, surfaceId, keycode, pressed) {
196
+ const msg = new Uint8Array(10);
197
+ msg[0] = C2S_SURFACE_INPUT;
198
+ msg[1] = sessionId & 0xff;
199
+ msg[2] = (sessionId >> 8) & 0xff;
200
+ msg[3] = surfaceId & 0xff;
201
+ msg[4] = (surfaceId >> 8) & 0xff;
202
+ const v = new DataView(msg.buffer);
203
+ v.setUint32(5, keycode, true);
204
+ msg[9] = pressed ? 1 : 0;
205
+ return msg;
206
+ }
207
+ export const SURFACE_POINTER_DOWN = 0;
208
+ export const SURFACE_POINTER_UP = 1;
209
+ export const SURFACE_POINTER_MOVE = 2;
210
+ export function buildSurfacePointerMessage(sessionId, surfaceId, type, button, x, y) {
211
+ const msg = new Uint8Array(11);
212
+ msg[0] = C2S_SURFACE_POINTER;
213
+ msg[1] = sessionId & 0xff;
214
+ msg[2] = (sessionId >> 8) & 0xff;
215
+ msg[3] = surfaceId & 0xff;
216
+ msg[4] = (surfaceId >> 8) & 0xff;
217
+ msg[5] = type;
218
+ msg[6] = button;
219
+ msg[7] = x & 0xff;
220
+ msg[8] = (x >> 8) & 0xff;
221
+ msg[9] = y & 0xff;
222
+ msg[10] = (y >> 8) & 0xff;
223
+ return msg;
224
+ }
225
+ export function buildSurfaceAxisMessage(sessionId, surfaceId, axis, valueX100) {
226
+ const msg = new Uint8Array(10);
227
+ msg[0] = C2S_SURFACE_POINTER_AXIS;
228
+ msg[1] = sessionId & 0xff;
229
+ msg[2] = (sessionId >> 8) & 0xff;
230
+ msg[3] = surfaceId & 0xff;
231
+ msg[4] = (surfaceId >> 8) & 0xff;
232
+ msg[5] = axis;
233
+ const v = new DataView(msg.buffer);
234
+ v.setInt32(6, valueX100, true);
235
+ return msg;
236
+ }
237
+ /**
238
+ * @param scale120 DPR in 1/120th units (Wayland convention):
239
+ * 120 = 1×, 180 = 1.5×, 240 = 2×.
240
+ * 0 means unspecified (server defaults to 1×).
241
+ * @param codecSupport Bitmask of CODEC_SUPPORT_* flags. 0 = accept anything.
242
+ */
243
+ export function buildSurfaceResizeMessage(sessionId, surfaceId, width, height, scale120 = 0, codecSupport = 0) {
244
+ const msg = new Uint8Array(12);
245
+ msg[0] = C2S_SURFACE_RESIZE;
246
+ msg[1] = sessionId & 0xff;
247
+ msg[2] = (sessionId >> 8) & 0xff;
248
+ msg[3] = surfaceId & 0xff;
249
+ msg[4] = (surfaceId >> 8) & 0xff;
250
+ msg[5] = width & 0xff;
251
+ msg[6] = (width >> 8) & 0xff;
252
+ msg[7] = height & 0xff;
253
+ msg[8] = (height >> 8) & 0xff;
254
+ msg[9] = scale120 & 0xff;
255
+ msg[10] = (scale120 >> 8) & 0xff;
256
+ msg[11] = codecSupport & 0xff;
257
+ return msg;
258
+ }
259
+ export function buildSurfaceFocusMessage(sessionId, surfaceId) {
260
+ const msg = new Uint8Array(5);
261
+ msg[0] = C2S_SURFACE_FOCUS;
262
+ msg[1] = sessionId & 0xff;
263
+ msg[2] = (sessionId >> 8) & 0xff;
264
+ msg[3] = surfaceId & 0xff;
265
+ msg[4] = (surfaceId >> 8) & 0xff;
266
+ return msg;
267
+ }
268
+ export function buildSurfaceCloseMessage(sessionId, surfaceId) {
269
+ const msg = new Uint8Array(5);
270
+ msg[0] = C2S_SURFACE_CLOSE;
271
+ msg[1] = sessionId & 0xff;
272
+ msg[2] = (sessionId >> 8) & 0xff;
273
+ msg[3] = surfaceId & 0xff;
274
+ msg[4] = (surfaceId >> 8) & 0xff;
275
+ return msg;
276
+ }
277
+ export function buildSurfaceSubscribeMessage(sessionId, surfaceId) {
278
+ const msg = new Uint8Array(5);
279
+ msg[0] = C2S_SURFACE_SUBSCRIBE;
280
+ msg[1] = sessionId & 0xff;
281
+ msg[2] = (sessionId >> 8) & 0xff;
282
+ msg[3] = surfaceId & 0xff;
283
+ msg[4] = (surfaceId >> 8) & 0xff;
284
+ return msg;
285
+ }
286
+ export function buildSurfaceUnsubscribeMessage(sessionId, surfaceId) {
287
+ const msg = new Uint8Array(5);
288
+ msg[0] = C2S_SURFACE_UNSUBSCRIBE;
289
+ msg[1] = sessionId & 0xff;
290
+ msg[2] = (sessionId >> 8) & 0xff;
291
+ msg[3] = surfaceId & 0xff;
292
+ msg[4] = (surfaceId >> 8) & 0xff;
293
+ return msg;
294
+ }
295
+ export function buildSurfaceAckMessage(surfaceId) {
296
+ const msg = new Uint8Array(3);
297
+ msg[0] = C2S_SURFACE_ACK;
298
+ msg[1] = surfaceId & 0xff;
299
+ msg[2] = (surfaceId >> 8) & 0xff;
300
+ return msg;
301
+ }
302
+ export function buildClipboardMessage(sessionId, surfaceId, mimeType, data) {
303
+ const mimeBytes = textEncoder.encode(mimeType);
304
+ const msg = new Uint8Array(11 + mimeBytes.length + data.length);
305
+ msg[0] = C2S_CLIPBOARD;
306
+ msg[1] = sessionId & 0xff;
307
+ msg[2] = (sessionId >> 8) & 0xff;
308
+ msg[3] = surfaceId & 0xff;
309
+ msg[4] = (surfaceId >> 8) & 0xff;
310
+ msg[5] = mimeBytes.length & 0xff;
311
+ msg[6] = (mimeBytes.length >> 8) & 0xff;
312
+ msg.set(mimeBytes, 7);
313
+ const v = new DataView(msg.buffer);
314
+ v.setUint32(7 + mimeBytes.length, data.length, true);
315
+ msg.set(data, 11 + mimeBytes.length);
316
+ return msg;
317
+ }
195
318
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"webrtc-share.d.ts","sourceRoot":"","sources":["../../src/transports/webrtc-share.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAoB,MAAM,UAAU,CAAC;AAsF3E,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,SAAS,GAChB,aAAa,CAmSf"}
1
+ {"version":3,"file":"webrtc-share.d.ts","sourceRoot":"","sources":["../../src/transports/webrtc-share.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAoB,MAAM,UAAU,CAAC;AA+O3E,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,SAAS,GAChB,aAAa,CA2Wf"}
@@ -8,21 +8,75 @@
8
8
  */
9
9
  import nacl from "tweetnacl";
10
10
  import { createWebRtcDataChannelTransport } from "./webrtc";
11
- const PBKDF2_SALT = new TextEncoder().encode("https://blit.sh");
12
11
  const PBKDF2_ROUNDS = 100000;
13
- /** Derive Ed25519 signing keypair from passphrase (PBKDF2-SHA256). */
14
- async function deriveKeypair(passphrase) {
15
- const raw = new TextEncoder().encode(passphrase);
16
- const key = await crypto.subtle.importKey("raw", raw, "PBKDF2", false, [
12
+ async function pbkdf2Derive(input, salt) {
13
+ // Copy into plain ArrayBuffers to satisfy SubtleCrypto's BufferSource type.
14
+ const inputAb = input.buffer.slice(input.byteOffset, input.byteOffset + input.byteLength);
15
+ const saltAb = salt.buffer.slice(salt.byteOffset, salt.byteOffset + salt.byteLength);
16
+ const key = await crypto.subtle.importKey("raw", inputAb, "PBKDF2", false, [
17
17
  "deriveBits",
18
18
  ]);
19
19
  const bits = await crypto.subtle.deriveBits({
20
20
  name: "PBKDF2",
21
- salt: PBKDF2_SALT,
21
+ salt: saltAb,
22
22
  iterations: PBKDF2_ROUNDS,
23
23
  hash: "SHA-256",
24
24
  }, key, 256);
25
- return nacl.sign.keyPair.fromSeed(new Uint8Array(bits));
25
+ return new Uint8Array(bits);
26
+ }
27
+ /** Derive all keys needed for a RW consumer from a passphrase. */
28
+ async function deriveKeys(passphrase) {
29
+ const enc = new TextEncoder();
30
+ const passphraseBytes = enc.encode(passphrase);
31
+ // Level 1: Ed25519 seed from passphrase (channel ID / signing key).
32
+ const ed25519Seed = await pbkdf2Derive(passphraseBytes, enc.encode("https://blit.sh"));
33
+ const signing = nacl.sign.keyPair.fromSeed(ed25519Seed);
34
+ // Level 1: RW consumer X25519 secret key from passphrase.
35
+ const ourX25519Secret = await pbkdf2Derive(passphraseBytes, enc.encode("blit-consumer-rw-x25519"));
36
+ // Level 2: producer X25519 secret key from Ed25519 seed bytes,
37
+ // then derive its public key.
38
+ const producerX25519Secret = await pbkdf2Derive(ed25519Seed, enc.encode("blit-producer-x25519"));
39
+ const producerX25519Public = nacl.scalarMult.base(producerX25519Secret);
40
+ return { signing, ourX25519Secret, producerX25519Public, readOnly: false };
41
+ }
42
+ /** Base64url decode (no padding). */
43
+ function base64urlDecode(str) {
44
+ const padded = str.replace(/-/g, "+").replace(/_/g, "/");
45
+ const binary = atob(padded);
46
+ const bytes = new Uint8Array(binary.length);
47
+ for (let i = 0; i < binary.length; i++)
48
+ bytes[i] = binary.charCodeAt(i);
49
+ return bytes;
50
+ }
51
+ /**
52
+ * Derive all keys needed for a RO consumer from a read-only token.
53
+ *
54
+ * The RO token is the base64url-encoded Ed25519 signing key (seed).
55
+ * Mirrors Rust's `ConsumerKeys::derive_ro`.
56
+ */
57
+ async function deriveKeysFromRoToken(token) {
58
+ const ed25519Seed = base64urlDecode(token);
59
+ if (ed25519Seed.length !== 32) {
60
+ throw new Error(`Invalid RO token: expected 32 bytes, got ${ed25519Seed.length}`);
61
+ }
62
+ const signing = nacl.sign.keyPair.fromSeed(ed25519Seed);
63
+ // Level 2 (from Ed25519 seed): RO consumer X25519 sk.
64
+ const ourX25519Secret = await pbkdf2Derive(ed25519Seed, new TextEncoder().encode("blit-consumer-ro-x25519"));
65
+ // Level 2 (from Ed25519 seed): producer X25519 sk → derive its public key.
66
+ const producerX25519Secret = await pbkdf2Derive(ed25519Seed, new TextEncoder().encode("blit-producer-x25519"));
67
+ const producerX25519Public = nacl.scalarMult.base(producerX25519Secret);
68
+ return { signing, ourX25519Secret, producerX25519Public, readOnly: true };
69
+ }
70
+ /**
71
+ * Detect and parse a read-only token (ends with `.ro`) from the passphrase
72
+ * field, then derive the appropriate keys.
73
+ */
74
+ async function deriveConsumerKeys(passphrase) {
75
+ if (passphrase.endsWith(".ro")) {
76
+ const token = passphrase.slice(0, -3);
77
+ return deriveKeysFromRoToken(token);
78
+ }
79
+ return deriveKeys(passphrase);
26
80
  }
27
81
  function hexEncode(bytes) {
28
82
  return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
@@ -31,9 +85,45 @@ function signPayload(secretKey, payload) {
31
85
  const signed = nacl.sign(payload, secretKey); // 64-byte sig + payload
32
86
  return btoa(String.fromCharCode(...signed));
33
87
  }
34
- function buildSignedMessage(secretKey, target, data) {
35
- const payload = new TextEncoder().encode(JSON.stringify(data));
36
- return JSON.stringify({ signed: signPayload(secretKey, payload), target });
88
+ /**
89
+ * Encrypt `data` in a NaCl box and build a signed hub message.
90
+ * Inner payload: `{"box":"<base64(nonce||ciphertext)>"}`.
91
+ */
92
+ function buildSealedMessage(keys, signingSecretKey, target, data) {
93
+ const plaintext = new TextEncoder().encode(JSON.stringify(data));
94
+ const nonce = nacl.randomBytes(nacl.box.nonceLength);
95
+ const ciphertext = nacl.box(plaintext, nonce, keys.producerX25519Public, keys.ourX25519Secret);
96
+ const sealed = new Uint8Array(nonce.length + ciphertext.length);
97
+ sealed.set(nonce);
98
+ sealed.set(ciphertext, nonce.length);
99
+ const sealedB64 = btoa(String.fromCharCode(...sealed));
100
+ const inner = JSON.stringify({ box: sealedB64 });
101
+ const innerBytes = new TextEncoder().encode(inner);
102
+ const signed = signPayload(signingSecretKey, innerBytes);
103
+ return JSON.stringify({ signed, target });
104
+ }
105
+ /**
106
+ * Try to open a NaCl box sealed payload from the producer.
107
+ * Returns the decrypted JSON value, or `null` on failure.
108
+ */
109
+ function openSealedData(data, keys) {
110
+ const sealedB64 = data["box"];
111
+ if (typeof sealedB64 !== "string")
112
+ return null;
113
+ const sealed = Uint8Array.from(atob(sealedB64), (c) => c.charCodeAt(0));
114
+ if (sealed.length < nacl.box.nonceLength)
115
+ return null;
116
+ const nonce = sealed.slice(0, nacl.box.nonceLength);
117
+ const ciphertext = sealed.slice(nacl.box.nonceLength);
118
+ const plaintext = nacl.box.open(ciphertext, nonce, keys.producerX25519Public, keys.ourX25519Secret);
119
+ if (!plaintext)
120
+ return null;
121
+ try {
122
+ return JSON.parse(new TextDecoder().decode(plaintext));
123
+ }
124
+ catch {
125
+ return null;
126
+ }
37
127
  }
38
128
  /**
39
129
  * Fetch ICE server config from the hub's /ice endpoint.
@@ -62,6 +152,10 @@ async function fetchIceServers(hubWsUrl) {
62
152
  *
63
153
  * The transport handles all signaling internally: hub WebSocket connection,
64
154
  * Ed25519-signed message exchange, SDP offer/answer, and ICE candidate relay.
155
+ *
156
+ * Supports reconnection: calling `connect()` when the transport is in a
157
+ * `"disconnected"` or `"error"` state tears down old resources and re-runs
158
+ * the full signaling + WebRTC handshake.
65
159
  */
66
160
  const noopDebug = { log() { }, warn() { }, error() { } };
67
161
  export function createShareTransport(hubWsUrl, passphrase, debug) {
@@ -73,6 +167,8 @@ export function createShareTransport(hubWsUrl, passphrase, debug) {
73
167
  let pc = null;
74
168
  let disposed = false;
75
169
  let started = false;
170
+ let connectGeneration = 0;
171
+ let cachedKeys = null;
76
172
  const earlyMessages = [];
77
173
  const messageListeners = new Set();
78
174
  const statusListeners = new Set();
@@ -93,22 +189,53 @@ export function createShareTransport(hubWsUrl, passphrase, debug) {
93
189
  l(data);
94
190
  }
95
191
  }
96
- // Run the signaling + WebRTC setup asynchronously
97
- (async () => {
192
+ /** Tear down the current signaling WS, peer connection, and inner transport. */
193
+ function teardown() {
194
+ if (inner) {
195
+ inner.close();
196
+ inner = null;
197
+ }
198
+ if (pc) {
199
+ try {
200
+ pc.close();
201
+ }
202
+ catch {
203
+ // Ignore.
204
+ }
205
+ pc = null;
206
+ }
207
+ if (ws) {
208
+ try {
209
+ ws.close();
210
+ }
211
+ catch {
212
+ // Ignore.
213
+ }
214
+ ws = null;
215
+ }
216
+ }
217
+ /** Run the full signaling + WebRTC setup. */
218
+ async function doConnect(generation) {
98
219
  try {
99
- dbg.log("deriving keypair from passphrase");
100
- const keypair = await deriveKeypair(passphrase);
101
- const pubHex = hexEncode(keypair.publicKey);
102
- dbg.log("pubkey: %s", pubHex);
103
- const iceHttpUrl = hubWsUrl
104
- .replace(/^wss:\/\//, "https://")
105
- .replace(/^ws:\/\//, "http://")
106
- .replace(/\/$/, "");
107
- dbg.log("fetching ICE servers from %s/ice", iceHttpUrl);
220
+ if (!cachedKeys) {
221
+ dbg.log(passphrase.endsWith(".ro")
222
+ ? "deriving keys from RO token"
223
+ : "deriving keys from passphrase");
224
+ cachedKeys = await deriveConsumerKeys(passphrase);
225
+ }
226
+ const keys = cachedKeys;
227
+ // Connect to the producer's channel (the passphrase-derived Ed25519
228
+ // public key) and sign with the matching secret key. The hub verifies
229
+ // signatures against the channel ID as the Ed25519 public key, so the
230
+ // signing key must correspond to the channel we connect to.
231
+ // Multiple consumers can coexist in the same channel; the hub gives each
232
+ // a unique sessionId (UUID).
233
+ const pubHex = hexEncode(keys.signing.publicKey);
234
+ dbg.log("channel id (passphrase-derived pubkey): %s", pubHex);
108
235
  const iceServers = await fetchIceServers(hubWsUrl);
109
236
  dbg.log("ICE servers: %o", iceServers);
110
- if (disposed) {
111
- dbg.warn("disposed before WS connect");
237
+ if (disposed || generation !== connectGeneration) {
238
+ dbg.warn("stale connect attempt, aborting");
112
239
  return;
113
240
  }
114
241
  const wsUrl = `${hubWsUrl.replace(/\/$/, "")}/channel/${pubHex}/consumer`;
@@ -126,12 +253,12 @@ export function createShareTransport(hubWsUrl, passphrase, debug) {
126
253
  if (disposed)
127
254
  reject(new Error("disposed"));
128
255
  });
129
- if (disposed) {
130
- dbg.warn("disposed after WS open");
131
- ws.close();
256
+ if (disposed || generation !== connectGeneration) {
257
+ dbg.warn("stale after WS open, aborting");
258
+ ws?.close();
132
259
  return;
133
260
  }
134
- // Wait for registered + peer_joined
261
+ // Wait for registered + peer_joined (producer role only).
135
262
  dbg.log("waiting for registered + peer_joined");
136
263
  const producerSessionId = await new Promise((resolve, reject) => {
137
264
  let registered = false;
@@ -143,7 +270,12 @@ export function createShareTransport(hubWsUrl, passphrase, debug) {
143
270
  dbg.log("registered with hub");
144
271
  }
145
272
  else if (m.type === "peer_joined" && registered) {
146
- dbg.log("peer joined: %s", m.sessionId);
273
+ // Only connect to the producer (role === "producer"), not other consumers.
274
+ if (m.role && m.role !== "producer") {
275
+ dbg.log("ignoring non-producer peer: %s (role=%s)", m.sessionId, m.role);
276
+ return;
277
+ }
278
+ dbg.log("producer joined: %s", m.sessionId);
147
279
  resolve(m.sessionId);
148
280
  }
149
281
  else if (m.type === "error") {
@@ -156,9 +288,9 @@ export function createShareTransport(hubWsUrl, passphrase, debug) {
156
288
  reject(new Error("signaling closed before peer joined"));
157
289
  };
158
290
  });
159
- if (disposed) {
160
- dbg.warn("disposed after peer joined");
161
- ws.close();
291
+ if (disposed || generation !== connectGeneration) {
292
+ dbg.warn("stale after peer joined, aborting");
293
+ ws?.close();
162
294
  return;
163
295
  }
164
296
  // Create RTCPeerConnection and data channel transport
@@ -168,12 +300,12 @@ export function createShareTransport(hubWsUrl, passphrase, debug) {
168
300
  pc.oniceconnectionstatechange = () => dbg.log("pc.iceConnectionState = %s", pc.iceConnectionState);
169
301
  pc.onicegatheringstatechange = () => dbg.log("pc.iceGatheringState = %s", pc.iceGatheringState);
170
302
  pc.onsignalingstatechange = () => dbg.log("pc.signalingState = %s", pc.signalingState);
171
- const transport = createWebRtcDataChannelTransport(pc);
172
- inner = transport;
303
+ const dcTransport = createWebRtcDataChannelTransport(pc);
304
+ inner = dcTransport;
173
305
  // Forward inner transport events
174
- transport.addEventListener("message", (data) => dispatch(data));
175
- transport.addEventListener("statuschange", (s) => {
176
- if (disposed)
306
+ dcTransport.addEventListener("message", (data) => dispatch(data));
307
+ dcTransport.addEventListener("statuschange", (s) => {
308
+ if (disposed || generation !== connectGeneration)
177
309
  return;
178
310
  setStatus(s);
179
311
  });
@@ -182,30 +314,34 @@ export function createShareTransport(hubWsUrl, passphrase, debug) {
182
314
  const offer = await pc.createOffer();
183
315
  await pc.setLocalDescription(offer);
184
316
  dbg.log("SDP offer set as local description, type=%s", offer.type);
185
- // Send the offer via signaling
317
+ // Send the offer encrypted to the producer.
186
318
  const sdpData = { sdp: { type: offer.type, sdp: offer.sdp } };
187
- ws.send(buildSignedMessage(keypair.secretKey, producerSessionId, sdpData));
188
- dbg.log("sent SDP offer to producer %s", producerSessionId);
319
+ ws.send(buildSealedMessage(keys, keys.signing.secretKey, producerSessionId, sdpData));
320
+ dbg.log("sent encrypted SDP offer to producer %s", producerSessionId);
189
321
  // Buffer ICE candidates that arrive before we have the remote description
190
322
  const pendingCandidates = [];
191
323
  let remoteDescSet = false;
192
- // Send our ICE candidates to the producer
324
+ // Send our ICE candidates to the producer, encrypted.
193
325
  pc.onicecandidate = (e) => {
194
- if (!e.candidate || disposed)
326
+ if (!e.candidate || disposed || generation !== connectGeneration)
195
327
  return;
196
328
  dbg.log("local ICE candidate: %s", e.candidate.candidate);
197
329
  const candidateData = { candidate: e.candidate.toJSON() };
198
- ws.send(buildSignedMessage(keypair.secretKey, producerSessionId, candidateData));
330
+ ws.send(buildSealedMessage(keys, keys.signing.secretKey, producerSessionId, candidateData));
199
331
  };
200
- // Receive answer + remote ICE candidates
332
+ // Receive answer + remote ICE candidates.
333
+ // The producer sends replies encrypted with the consumer's X25519 public
334
+ // key; try to decrypt, fall back to plaintext for legacy producers.
201
335
  ws.onmessage = (e) => {
202
336
  const m = JSON.parse(e.data);
203
337
  dbg.log("signaling ← %s %o", m.type, m.data ? Object.keys(m.data) : "no data");
204
338
  if (m.type !== "signal" || !m.data)
205
339
  return;
206
- if (m.data.sdp) {
340
+ // Decrypt the payload if it's a crypto_box sealed message.
341
+ const data = openSealedData(m.data, keys) ?? m.data;
342
+ if (data.sdp) {
207
343
  dbg.log("received remote SDP answer");
208
- const sdp = m.data.sdp;
344
+ const sdp = data.sdp;
209
345
  pc
210
346
  .setRemoteDescription(new RTCSessionDescription({
211
347
  type: sdp.type ?? "answer",
@@ -221,14 +357,14 @@ export function createShareTransport(hubWsUrl, passphrase, debug) {
221
357
  })
222
358
  .catch((err) => {
223
359
  dbg.error("setRemoteDescription failed: %o", err);
224
- if (disposed)
360
+ if (disposed || generation !== connectGeneration)
225
361
  return;
226
362
  _lastError = err instanceof Error ? err.message : String(err);
227
363
  setStatus("error");
228
364
  });
229
365
  }
230
- else if (m.data.candidate) {
231
- const candidate = m.data.candidate;
366
+ else if (data.candidate) {
367
+ const candidate = data.candidate;
232
368
  if (remoteDescSet) {
233
369
  dbg.log("remote ICE candidate (applied): %s", candidate.candidate);
234
370
  pc.addIceCandidate(new RTCIceCandidate(candidate)).catch(() => { });
@@ -244,7 +380,7 @@ export function createShareTransport(hubWsUrl, passphrase, debug) {
244
380
  };
245
381
  if (started) {
246
382
  dbg.log("calling inner transport.connect()");
247
- transport.connect();
383
+ dcTransport.connect();
248
384
  }
249
385
  else {
250
386
  dbg.log("inner transport created but start() not yet called");
@@ -252,23 +388,36 @@ export function createShareTransport(hubWsUrl, passphrase, debug) {
252
388
  }
253
389
  catch (err) {
254
390
  dbg.error("share transport error: %o", err);
255
- if (disposed)
391
+ if (disposed || generation !== connectGeneration)
256
392
  return;
257
393
  _lastError = err instanceof Error ? err.message : String(err);
258
- setStatus("error");
394
+ setStatus("disconnected");
259
395
  }
260
- })();
396
+ }
261
397
  const transport = {
262
398
  connect() {
263
- if (started)
399
+ if (disposed)
264
400
  return;
265
- started = true;
266
- for (const msg of earlyMessages) {
267
- for (const l of messageListeners)
268
- l(msg);
401
+ // First call: mark as started, kick off the initial connection, and
402
+ // flush any early messages that arrived before connect() was called.
403
+ if (!started) {
404
+ started = true;
405
+ doConnect(connectGeneration);
406
+ for (const msg of earlyMessages) {
407
+ for (const l of messageListeners)
408
+ l(msg);
409
+ }
410
+ earlyMessages.length = 0;
411
+ return;
412
+ }
413
+ // Subsequent calls: reconnect if currently disconnected or errored.
414
+ if (_status === "disconnected" || _status === "error") {
415
+ dbg.log("reconnect requested (status=%s), tearing down and retrying", _status);
416
+ teardown();
417
+ connectGeneration++;
418
+ setStatus("connecting");
419
+ doConnect(connectGeneration);
269
420
  }
270
- earlyMessages.length = 0;
271
- inner?.connect();
272
421
  },
273
422
  get status() {
274
423
  return _status;
@@ -300,9 +449,7 @@ export function createShareTransport(hubWsUrl, passphrase, debug) {
300
449
  },
301
450
  close() {
302
451
  disposed = true;
303
- ws?.close();
304
- pc?.close();
305
- inner?.close();
452
+ teardown();
306
453
  setStatus("closed");
307
454
  },
308
455
  };