From 0290ed464a2c0927ab2567bec4a1dbc58cd3bc97 Mon Sep 17 00:00:00 2001 From: enzotar Date: Wed, 25 Feb 2026 21:55:49 -0800 Subject: [PATCH] =?UTF-8?q?fix:=20streaming=20polish=20=E2=80=94=20bind=20?= =?UTF-8?q?diff,=20state=20snapshot,=20dead=20code=20cleanup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - bind: input handler now emits _streamDiff so typed text syncs - Peers broadcast full state snapshot on WS open (late joiners sync) - Removed dead _handleRemoteInput 0x31 case (old source/receiver model) - Preserved scroll (0x50), pointer, and key handlers --- compiler/ds-codegen/src/js_emitter.rs | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/compiler/ds-codegen/src/js_emitter.rs b/compiler/ds-codegen/src/js_emitter.rs index b0c9b89..edd06a9 100644 --- a/compiler/ds-codegen/src/js_emitter.rs +++ b/compiler/ds-codegen/src/js_emitter.rs @@ -456,10 +456,10 @@ impl JsEmitter { "DS.effect(() => {{ {}.value = {}.value; }});", node_var, signal_name )); - // Input -> signal + // Input -> signal (with streaming diff) self.emit_line(&format!( - "{}.addEventListener('input', (e) => {{ {}.value = e.target.value; DS.flush(); }});", - node_var, signal_name + "{}.addEventListener('input', (e) => {{ {}.value = e.target.value; DS._streamDiff(\"{}\", e.target.value); DS.flush(); }});", + node_var, signal_name, signal_name )); } "class" => { @@ -1867,7 +1867,16 @@ const DS = (() => { } }; _streamWs.onclose = function() { setTimeout(function() { _initStream(url, mode); }, 2000); }; - console.log('[ds-stream] Peer connected:', peerUrl); + _streamWs.onopen = function() { + console.log('[ds-stream] Peer connected:', peerUrl); + // Broadcast full state snapshot so other peers can sync + var fullState = { _pid: _peerId }; + for (var name in _signalRegistry) { + var sig = _signalRegistry[name]; + fullState[name] = (typeof sig === 'object' && sig !== null && '_value' in sig) ? sig._value : sig; + } + _streamSend(0x31, 0, new TextEncoder().encode(JSON.stringify(fullState))); + }; } function _streamSend(type, flags, payload) { @@ -1936,16 +1945,6 @@ const DS = (() => { case 0x50: emit('remote_scroll', { dx: view.getInt16(0, true), dy: view.getInt16(2, true) }); break; - case 0x31: { - // Signal diff from a receiver — apply locally AND rebroadcast to all receivers - var json = new TextDecoder().decode(payload); - _applyRemoteDiff(json); - // Rebroadcast via source WS so all other receivers get it - if (_streamWs && _streamWs.readyState === 1) { - _streamSend(0x31, 0, payload); - } - break; - } } }