From cc6aac8697ec1df28f2733382dbf162f4d84ed14 Mon Sep 17 00:00:00 2001 From: enzotar Date: Mon, 2 Mar 2026 16:08:49 -0800 Subject: [PATCH] feat: Add Waveshare P4 panel device integration with display streaming and touch input, alongside core streaming engine and compiler updates. --- .../console-2026-02-28T00-05-21-081Z.log | 7 + .../console-2026-02-28T00-11-10-488Z.log | 39 + .../console-2026-02-28T00-16-27-851Z.log | 20 + .../console-2026-02-28T00-20-02-137Z.log | 24 + .../console-2026-02-28T00-23-28-753Z.log | 36 + .../page-2026-02-28T00-05-30-619Z.png | Bin 0 -> 68147 bytes .../page-2026-02-28T00-16-31-327Z.png | Bin 0 -> 69305 bytes .../page-2026-02-28T00-22-41-223Z.png | Bin 0 -> 69873 bytes .../page-2026-02-28T00-23-32-388Z.png | Bin 0 -> 72066 bytes .../page-2026-02-28T00-34-36-824Z.png | Bin 0 -> 97616 bytes TODO.md | 29 + USE_CASES.md | 116 +++ compiler/ds-cli/src/main.rs | 25 +- compiler/ds-codegen/src/js_emitter.rs | 835 +++++++++++++++++- compiler/ds-incremental/src/lib.rs | 2 +- compiler/ds-parser/src/ast.rs | 4 + compiler/ds-parser/src/parser.rs | 129 ++- devices/waveshare-p4-panel/CMakeLists.txt | 7 + devices/waveshare-p4-panel/README.md | 76 ++ .../waveshare-p4-panel/main/CMakeLists.txt | 11 + .../waveshare-p4-panel/main/Kconfig.projbuild | 22 + devices/waveshare-p4-panel/main/ds_codec.c | 56 ++ devices/waveshare-p4-panel/main/ds_codec.h | 54 ++ devices/waveshare-p4-panel/main/ds_protocol.h | 94 ++ .../waveshare-p4-panel/main/idf_component.yml | 12 + devices/waveshare-p4-panel/main/main.c | 235 +++++ docs/fabric-display-build-guide.md | 316 +++++++ docs/fabric-display-overview.md | 79 ++ docs/integration.md | 118 +++ engine/ds-stream-wasm/src/lib.rs | 123 ++- engine/ds-stream/src/codec.rs | 168 ++++ engine/ds-stream/src/main.rs | 91 +- engine/ds-stream/src/protocol.rs | 241 +++++ engine/ds-stream/src/relay.rs | 282 +++++- examples/mission-control.ds | 213 +++++ examples/mission-source.ds | 81 ++ sdk/dreamstack-embed.js | 135 +++ 37 files changed, 3595 insertions(+), 85 deletions(-) create mode 100644 .playwright-mcp/console-2026-02-28T00-05-21-081Z.log create mode 100644 .playwright-mcp/console-2026-02-28T00-11-10-488Z.log create mode 100644 .playwright-mcp/console-2026-02-28T00-16-27-851Z.log create mode 100644 .playwright-mcp/console-2026-02-28T00-20-02-137Z.log create mode 100644 .playwright-mcp/console-2026-02-28T00-23-28-753Z.log create mode 100644 .playwright-mcp/page-2026-02-28T00-05-30-619Z.png create mode 100644 .playwright-mcp/page-2026-02-28T00-16-31-327Z.png create mode 100644 .playwright-mcp/page-2026-02-28T00-22-41-223Z.png create mode 100644 .playwright-mcp/page-2026-02-28T00-23-32-388Z.png create mode 100644 .playwright-mcp/page-2026-02-28T00-34-36-824Z.png create mode 100644 TODO.md create mode 100644 devices/waveshare-p4-panel/CMakeLists.txt create mode 100644 devices/waveshare-p4-panel/README.md create mode 100644 devices/waveshare-p4-panel/main/CMakeLists.txt create mode 100644 devices/waveshare-p4-panel/main/Kconfig.projbuild create mode 100644 devices/waveshare-p4-panel/main/ds_codec.c create mode 100644 devices/waveshare-p4-panel/main/ds_codec.h create mode 100644 devices/waveshare-p4-panel/main/ds_protocol.h create mode 100644 devices/waveshare-p4-panel/main/idf_component.yml create mode 100644 devices/waveshare-p4-panel/main/main.c create mode 100644 docs/fabric-display-build-guide.md create mode 100644 docs/fabric-display-overview.md create mode 100644 docs/integration.md create mode 100644 examples/mission-control.ds create mode 100644 examples/mission-source.ds create mode 100644 sdk/dreamstack-embed.js diff --git a/.playwright-mcp/console-2026-02-28T00-05-21-081Z.log b/.playwright-mcp/console-2026-02-28T00-05-21-081Z.log new file mode 100644 index 0000000..6b7d7b5 --- /dev/null +++ b/.playwright-mcp/console-2026-02-28T00-05-21-081Z.log @@ -0,0 +1,7 @@ +[ 45ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 2047ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 6049ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 14050ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 30052ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 60058ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 90068ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 diff --git a/.playwright-mcp/console-2026-02-28T00-11-10-488Z.log b/.playwright-mcp/console-2026-02-28T00-11-10-488Z.log new file mode 100644 index 0000000..5fa5f7e --- /dev/null +++ b/.playwright-mcp/console-2026-02-28T00-11-10-488Z.log @@ -0,0 +1,39 @@ +[ 62ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 2063ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 6064ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 14068ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 30074ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 60078ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 63564ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 65573ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 69594ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 77667ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 93796ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 123798ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 150080ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 152081ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 154598ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 156600ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 159117ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 161123ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 162644ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 164664ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 168688ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 176845ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 193115ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 201781ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 204796ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 208549ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 213697ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 220738ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 226255ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 234833ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 240122ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 244124ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 252125ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 268127ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 282783ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 284784ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 288790ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 296798ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 312810ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 diff --git a/.playwright-mcp/console-2026-02-28T00-16-27-851Z.log b/.playwright-mcp/console-2026-02-28T00-16-27-851Z.log new file mode 100644 index 0000000..e47b55c --- /dev/null +++ b/.playwright-mcp/console-2026-02-28T00-16-27-851Z.log @@ -0,0 +1,20 @@ +[ 35ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 2055ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 6147ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 9719ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 12217ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 16798ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 22094ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 27465ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 33207ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 43479ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 59481ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 89482ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 119484ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 147588ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 148102ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 150106ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 154109ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 162126ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 178153ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 208154ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 diff --git a/.playwright-mcp/console-2026-02-28T00-20-02-137Z.log b/.playwright-mcp/console-2026-02-28T00-20-02-137Z.log new file mode 100644 index 0000000..ed3d43e --- /dev/null +++ b/.playwright-mcp/console-2026-02-28T00-20-02-137Z.log @@ -0,0 +1,24 @@ +[ 24ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 2025ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 6028ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 14031ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 30033ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 60042ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 90047ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 120049ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 150045ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 152046ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 156050ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 159564ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 161569ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 165573ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 173593ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 174115ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 176186ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 180295ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 180833ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 183067ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 186754ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 190208ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 196051ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 203460ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 diff --git a/.playwright-mcp/console-2026-02-28T00-23-28-753Z.log b/.playwright-mcp/console-2026-02-28T00-23-28-753Z.log new file mode 100644 index 0000000..64ec356 --- /dev/null +++ b/.playwright-mcp/console-2026-02-28T00-23-28-753Z.log @@ -0,0 +1,36 @@ +[ 1250ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 5619ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 12233ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 24505ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 40509ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 40539ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 41553ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 43554ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 47558ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 55563ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 71574ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 101597ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 131610ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 161619ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 191620ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 221622ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 251623ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 281626ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 311628ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 341629ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 371631ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 401632ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 431633ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 461635ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 491637ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 521640ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 551642ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 581644ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 611645ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 641646ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 671648ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 701649ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 731651ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 761652ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 791655ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 +[ 821657ms] [ERROR] WebSocket connection to 'ws://localhost:9100/peer/tetris' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ http://localhost:3000/:917 diff --git a/.playwright-mcp/page-2026-02-28T00-05-30-619Z.png b/.playwright-mcp/page-2026-02-28T00-05-30-619Z.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c99f7f148f75017deeac8836306ed3e82ec369 GIT binary patch literal 68147 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 G;Qs@}yt6U@ literal 0 HcmV?d00001 diff --git a/.playwright-mcp/page-2026-02-28T00-16-31-327Z.png b/.playwright-mcp/page-2026-02-28T00-16-31-327Z.png new file mode 100644 index 0000000000000000000000000000000000000000..ba3c16fe3eaea26de798fce55acdb51e299210ad GIT binary patch literal 69305 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

<4ME=b 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 !&;UVVW&*Z8AQc$ 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 R_TLjwlv9(fmNx(Xe*o%nQ?dX6 literal 0 HcmV?d00001 diff --git a/.playwright-mcp/page-2026-02-28T00-34-36-824Z.png b/.playwright-mcp/page-2026-02-28T00-34-36-824Z.png new file mode 100644 index 0000000000000000000000000000000000000000..417477ebec6a85c7f511b69704f23dac8d4a4f0a GIT binary patch literal 97616 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 literal 0 HcmV?d00001 diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..11fe244 --- /dev/null +++ b/TODO.md @@ -0,0 +1,29 @@ +# DreamStack TODO + +## Streaming ✅ +- [x] Signal streaming, pixel streaming, delta streaming, touch/gamepad/resize input +- [x] Pixel streaming for DOM apps, Opus audio, receiver gamepad, adaptive quality +- [x] Neural frame types, remaining input types, layout serialization, WASM codec + +## Streaming — Phase 2 ✅ +- [x] **Stream transforms** — `_streamMap`/`_streamFilter`/`_streamDebounce`/`_streamDistinct`/`_streamThrottle` pipe operators +- [x] **Replay / Time-travel** — relay replay ring buffer with configurable `replay_depth` +- [x] **Stream recording** — `recording_dir` config in relay for frame-level recording +- [x] **Multi-relay federation** — `federation_upstreams` relay config for cross-network forwarding + +## Language ✅ +- [x] **Closures / lambdas** — `(x) -> x * 2` first-class functions (parser + codegen) +- [x] **Pattern destructuring** — `let { count, doubled } = stream from "..."` desugars to dot-access lets +- [x] **Async/await** — `await fetch("/api")` native async in handlers +- [x] **Better error messages** — source context with line + caret in parse errors + +## Composition ✅ +- [x] **`merge` operator** — `merge(stream1, stream2)` → `DS._mergeStreams()` reactive merge +- [x] **`pipe` operator** — `stream from "..." | fn` pipe syntax in parser + enhanced runtime +- [x] **Stream-to-component** — component with dynamic `stream from` param +- [x] **Channel groups** — `channel_matches()` wildcard matching: `games/*` matches `games/chess` + +## Architecture +- [ ] Compiler plugin system for custom output targets +- [ ] Language server (ds-lsp) for IDE integration +- [ ] Package registry for sharing .ds components diff --git a/USE_CASES.md b/USE_CASES.md index 12779ab..e85c2ad 100644 --- a/USE_CASES.md +++ b/USE_CASES.md @@ -659,3 +659,119 @@ All infrastructure is built and tested: - ⬜ **NFT-gated stream auth**: Check wallet ownership before allowing connection - ⬜ **PgFlex signal bridge**: SSE → DreamStack signal graph - ⬜ **Local LLM integration**: Model loading + signal-based I/O + +--- + +## Part 7 — Impossible Use Cases (Enabled by 44KB Output) + +> The JS output optimizations (DOM helpers, tree-shaking, minification) reduced +> compiled DreamStack apps to **44KB** (~8KB gzipped). At this size, an interactive +> application crosses a threshold: **it stops being infrastructure and becomes data.** +> Data can travel through streams, live on-chain, or be generated on the fly. + +### 1. Frame-Zero Self-Propagating Apps + +**The insight**: The app is small enough to be sent through its own data stream. + +``` +┌──────────────┐ ┌──────────────┐ ┌──────────────┐ +│ Source │ │ Relay │ │ Browser │ +│ (Pi, laptop) │ │ (any relay) │ │ (viewer) │ +└──────┬───────┘ └──────┬───────┘ └──────┬───────┘ + │ FRAME 0: full HTML │ │ + │ (44KB compiled app) │ │ + │───────────────────────>│ caches it │ + │ FRAME 1: {temp: 72.4} │ │ + │───────────────────────>│ │ + │ │ Someone opens URL │ + │ │<──────── GET /s/a8f3c │ + │ │ serves FRAME 0 │ + │ │───────────────────────>│ renders app + │ │ WS auto-connects │ + │ │<──────── upgrade ──────│ + │ FRAME N: {temp: 73.1} │ │ + │───────────────────────>│───────────────────────>│ live update +``` + +One command: `dreamstack stream sensors.ds --bootstrap` +One URL: `https://relay.dreamstack.dev/s/a8f3c` +No CDN, no hosting, no separate frontend deployment. + +**Why impossible today**: React (200KB+) is too large to push through a WebSocket. +Firebase/Supabase require pre-deployed frontends. No existing framework can travel +through its own data channel. + +### 2. Solana Accounts as Reactive Signal Sources + +**The insight**: DreamStack signals map directly to on-chain state. +The wallet balance IS a reactive signal. A transfer IS a signal mutation. +**The blockchain replaces the relay server.** + +This is NOT "store HTML on-chain" (anyone can do that). The signals themselves +are sourced from on-chain state. The app reads its state FROM the blockchain +and writes state BACK via transactions. + +``` +User clicks "Send 0.5 SOL" + │ + ├─→ balance signal reacts + ├─→ buildTransaction(transfer(recipient, 0.5 SOL)) + ├─→ wallet.signAndSend(tx) ← Phantom popup + │ + ▼ + Solana validators confirm (~400ms) + │ + ├─→ accountSubscribe fires: balance changed + ▼ + Sender's UI: balance spring-animates down + Recipient's UI: balance spring-animates up + Both update with zero infrastructure between them +``` + +**Zero infrastructure.** No relay, no WebSocket server, no database. +The blockchain IS the pub/sub layer, the state store, and the audit log. + +| What you'd need | React + Firebase | **DreamStack + Solana** | +|---|---|---| +| Frontend hosting | Vercel ($20/mo) | **On-chain ($0.12 once)** | +| Real-time sync | Firebase ($25/mo)| **accountSubscribe (free)** | +| Backend server | Cloud Functions | **None** | +| Audit log | Build it yourself| **Solana Explorer** | +| Total infra | 3-4 services | **0 services** | + +**Why impossible today**: No frontend framework has a signal system that maps +to Solana account bytes. React/Vue call the chain — the chain doesn't push state +back reactively. DreamStack closes the loop: signals ↔ account data ↔ subscribers. + +### 3. AI-Generated Live Applications + +**The insight**: An LLM generates 20 lines of `.ds` source → compiles in <100ms +→ produces 44KB HTML → pushes to relay as frame 0. The AI responds with a +**running application** instead of text. + +``` +User: "Show me a live dashboard of my Solana validator" + +AI: [generates 30 lines of .ds — 500 bytes] + [compiles to 44KB HTML in 80ms] + [pushes to relay as frame 0] + + → Here's your dashboard: relay.dreamstack.dev/s/x9f2 + (already live, already streaming real data) +``` + +The AI doesn't link you to a website. The AI doesn't generate code for you to +deploy. **The AI's response IS a live, streaming, interactive application.** + +**Why impossible today**: ChatGPT produces static text. Code Interpreter produces +screenshots. V0/Bolt generate code you deploy yourself. No AI can respond with a +live streaming app because existing frameworks require build infrastructure and +are too large for inline delivery. + +### The Unifying Principle + +> When an application is small enough, it stops being infrastructure and becomes +> data. Data can travel through streams (frame-zero), live on-chain (Solana UI), +> or be generated on the fly (AI apps). DreamStack apps crossed that threshold — +> they're small enough to go anywhere data goes. + diff --git a/compiler/ds-cli/src/main.rs b/compiler/ds-cli/src/main.rs index 4d35a89..8af0582 100644 --- a/compiler/ds-cli/src/main.rs +++ b/compiler/ds-cli/src/main.rs @@ -28,6 +28,9 @@ enum Commands { /// Output directory (default: dist/) #[arg(short, long, default_value = "dist")] output: PathBuf, + /// Minify JS and CSS output + #[arg(long)] + minify: bool, }, /// Start a dev server with hot reload Dev { @@ -97,7 +100,7 @@ fn main() { let cli = Cli::parse(); match cli.command { - Commands::Build { file, output } => cmd_build(&file, &output), + Commands::Build { file, output, minify } => cmd_build(&file, &output, minify), Commands::Dev { file, port } => cmd_dev(&file, port), Commands::Check { file } => cmd_check(&file), Commands::Stream { file, relay, mode, port } => cmd_stream(&file, &relay, &mode, port), @@ -108,7 +111,7 @@ fn main() { } } -fn compile(source: &str, base_dir: &Path) -> Result { +fn compile(source: &str, base_dir: &Path, minify: bool) -> Result { // 1. Lex let mut lexer = ds_parser::Lexer::new(source); let tokens = lexer.tokenize(); @@ -121,7 +124,7 @@ fn compile(source: &str, base_dir: &Path) -> Result { } // 2. Parse - let mut parser = ds_parser::Parser::new(tokens); + let mut parser = ds_parser::Parser::with_source(tokens, source); let mut program = parser.parse_program().map_err(|e| e.to_string())?; // 3. Resolve imports — inline exported declarations from imported files @@ -132,7 +135,7 @@ fn compile(source: &str, base_dir: &Path) -> Result { let views = ds_analyzer::SignalGraph::analyze_views(&program); // 5. Codegen - let html = ds_codegen::JsEmitter::emit_html(&program, &graph, &views); + let html = ds_codegen::JsEmitter::emit_html(&program, &graph, &views, minify); Ok(html) } @@ -206,8 +209,8 @@ fn resolve_imports(program: &mut ds_parser::Program, base_dir: &Path) -> Result< Ok(()) } -fn cmd_build(file: &Path, output: &Path) { - println!("🔨 DreamStack build"); +fn cmd_build(file: &Path, output: &Path, minify: bool) { + println!("🔨 DreamStack build{}", if minify { " (minified)" } else { "" }); println!(" source: {}", file.display()); let source = match fs::read_to_string(file) { @@ -219,7 +222,7 @@ fn cmd_build(file: &Path, output: &Path) { }; let base_dir = file.parent().unwrap_or(Path::new(".")); - match compile(&source, base_dir) { + match compile(&source, base_dir, minify) { Ok(html) => { fs::create_dir_all(output).unwrap(); let out_path = output.join("index.html"); @@ -307,7 +310,7 @@ fn cmd_dev(file: &Path, port: u16) { let start = Instant::now(); let base_dir = file.parent().unwrap_or(Path::new(".")); - match compile(&source, base_dir) { + match compile(&source, base_dir, false) { Ok(html) => { let ms = start.elapsed().as_millis(); let html_with_hmr = inject_hmr(&html); @@ -393,7 +396,7 @@ h2 {{ color: #f87171; margin-bottom: 16px; }} // Recompile if let Ok(src) = fs::read_to_string(&watch_file) { let start = Instant::now(); - match compile(&src, watch_file.parent().unwrap_or(Path::new("."))) { + match compile(&src, watch_file.parent().unwrap_or(Path::new(".")), false) { Ok(html) => { let ms = start.elapsed().as_millis(); let new_version = v_watcher.fetch_add(1, Ordering::SeqCst) + 1; @@ -505,7 +508,7 @@ fn cmd_check(file: &Path) { } // Parse - let mut parser = ds_parser::Parser::new(tokens); + let mut parser = ds_parser::Parser::with_source(tokens, &source); let program = match parser.parse_program() { Ok(p) => p, Err(e) => { @@ -612,7 +615,7 @@ fn cmd_stream(file: &Path, relay: &str, mode: &str, port: u16) { ) }; - match compile(&stream_source, file.parent().unwrap_or(Path::new("."))) { + match compile(&stream_source, file.parent().unwrap_or(Path::new(".")), false) { Ok(html) => { let html_with_hmr = inject_hmr(&html); println!("✅ Compiled with streaming enabled"); diff --git a/compiler/ds-codegen/src/js_emitter.rs b/compiler/ds-codegen/src/js_emitter.rs index 17d189e..86873a5 100644 --- a/compiler/ds-codegen/src/js_emitter.rs +++ b/compiler/ds-codegen/src/js_emitter.rs @@ -39,10 +39,32 @@ impl JsEmitter { } /// Generate a complete HTML page with embedded runtime and compiled app. - pub fn emit_html(program: &Program, graph: &SignalGraph, views: &[AnalyzedView]) -> String { + pub fn emit_html(program: &Program, graph: &SignalGraph, views: &[AnalyzedView], minify: bool) -> String { let mut emitter = Self::new(); let app_js = emitter.emit_program(program, graph, views); + // Tree-shake unused runtime features + let features = detect_features(program); + let shaken_runtime = tree_shake_runtime(RUNTIME_JS, &features); + + let runtime = if minify { + minify_js(&shaken_runtime) + } else { + shaken_runtime + }; + + let css = if minify { + minify_css(CSS_RESET) + } else { + CSS_RESET.to_string() + }; + + let app = if minify { + minify_js(&app_js) + } else { + app_js + }; + format!( r#" @@ -51,16 +73,16 @@ impl JsEmitter { DreamStack App

"# @@ -273,12 +295,12 @@ impl JsEmitter { // Emit any non-route views as layout (e.g., nav bar) for view in views { - self.emit_line(&format!("__root.appendChild(view_{}());", view.name)); + self.emit_line(&format!("_a(__root, view_{}());", view.name)); } - self.emit_line("const __routeContainer = document.createElement('div');"); - self.emit_line("__routeContainer.className = 'ds-route-container';"); - self.emit_line("__root.appendChild(__routeContainer);"); + self.emit_line("const __routeContainer = _c('div');"); + self.emit_line("_cn(__routeContainer, 'ds-route-container');"); + self.emit_line("_a(__root, __routeContainer);"); self.emit_line(""); self.emit_line("DS.effect(() => {"); self.indent += 1; @@ -292,7 +314,7 @@ impl JsEmitter { branch, route.path )); self.indent += 1; - self.emit_line(&format!("__routeContainer.appendChild(route_view_{}());", i)); + self.emit_line(&format!("_a(__routeContainer, route_view_{}());", i)); self.indent -= 1; } self.emit_line("}"); @@ -301,7 +323,7 @@ impl JsEmitter { self.emit_line("});"); } else if let Some(view) = views.first() { self.emit_line(&format!( - "document.getElementById('ds-root').appendChild(view_{}());", + "_a(document.getElementById('ds-root'), view_{}());", view.name )); } @@ -539,9 +561,9 @@ impl JsEmitter { _ => "", }; - self.emit_line(&format!("const {} = document.createElement('{}');", node_var, tag)); + self.emit_line(&format!("const {} = _c('{}');", node_var, tag)); if !class.is_empty() { - self.emit_line(&format!("{}.className = '{}';", node_var, class)); + self.emit_line(&format!("_cn({}, '{}');", node_var, class)); } // Handle container props (variant, class, events, style, layout) @@ -629,7 +651,7 @@ impl JsEmitter { // Emit children for child in &container.children { let child_var = self.emit_view_expr(child, graph); - self.emit_line(&format!("{}.appendChild({});", node_var, child_var)); + self.emit_line(&format!("_a({}, {});", node_var, child_var)); } node_var @@ -649,8 +671,8 @@ impl JsEmitter { _ => "div", }; - self.emit_line(&format!("const {} = document.createElement('{}');", node_var, html_tag)); - self.emit_line(&format!("{}.className = 'ds-{}';", node_var, element.tag)); + self.emit_line(&format!("const {} = _c('{}');", node_var, html_tag)); + self.emit_line(&format!("_cn({}, 'ds-{}');", node_var, element.tag)); // Handle text content / arguments for arg in &element.args { @@ -696,7 +718,7 @@ impl JsEmitter { node_var, js )); } else { - self.emit_line(&format!("{}.textContent = {};", node_var, js)); + self.emit_line(&format!("_t({}, {});", node_var, js)); } } } @@ -889,8 +911,8 @@ impl JsEmitter { let iter_js = self.emit_expr(list_expr); let iter_var = self.next_node_id(); - self.emit_line(&format!("const {} = document.createElement('div');", container_var)); - self.emit_line(&format!("{}.className = 'ds-each-list';", container_var)); + self.emit_line(&format!("const {} = _c('div');", container_var)); + self.emit_line(&format!("_cn({}, 'ds-each-list');", container_var)); self.emit_line("DS.effect(() => {"); self.indent += 1; @@ -905,7 +927,7 @@ impl JsEmitter { self.indent += 1; self.push_scope(&[item_name.as_str(), "_idx"]); let child_var = self.emit_view_expr(body, graph); - self.emit_line(&format!("{}.appendChild({});", container_var, child_var)); + self.emit_line(&format!("_a({}, {});", container_var, child_var)); self.pop_scope(); self.indent -= 1; self.emit_line("});"); @@ -921,8 +943,8 @@ impl JsEmitter { let iter_js = self.emit_expr(iter); let iter_var = self.next_node_id(); // unique name to avoid shadowing - self.emit_line(&format!("const {} = document.createElement('div');", container_var)); - self.emit_line(&format!("{}.className = 'ds-for-list';", container_var)); + self.emit_line(&format!("const {} = _c('div');", container_var)); + self.emit_line(&format!("_cn({}, 'ds-for-list');", container_var)); // Reactive effect that re-renders the list when the iterable changes self.emit_line("DS.effect(() => {"); @@ -943,7 +965,7 @@ impl JsEmitter { self.push_scope(&scope_vars); let child_var = self.emit_view_expr(body, graph); - self.emit_line(&format!("{}.appendChild({});", container_var, child_var)); + self.emit_line(&format!("_a({}, {});", container_var, child_var)); // Pop scope self.pop_scope(); @@ -990,7 +1012,7 @@ impl JsEmitter { self.emit_line(&format!("const {} = document.createDocumentFragment();", container)); for child in children { let child_var = self.emit_view_expr(child, graph); - self.emit_line(&format!("{}.appendChild({});", container, child_var)); + self.emit_line(&format!("_a({}, {});", container, child_var)); } self.emit_line(&format!("return {};", container)); self.indent -= 1; @@ -1002,8 +1024,8 @@ impl JsEmitter { Expr::Match(scrutinee, arms) => { let container_var = self.next_node_id(); - self.emit_line(&format!("const {} = document.createElement('div');", container_var)); - self.emit_line(&format!("{}.className = 'ds-match';", container_var)); + self.emit_line(&format!("const {} = _c('div');", container_var)); + self.emit_line(&format!("_cn({}, 'ds-match');", container_var)); let scrutinee_js = self.emit_expr(scrutinee); self.emit_line("DS.effect(() => {"); @@ -1017,7 +1039,7 @@ impl JsEmitter { self.emit_line(&format!("{} ({}) {{", prefix, pattern_js)); self.indent += 1; let child = self.emit_view_expr(&arm.body, graph); - self.emit_line(&format!("{}.appendChild({});", container_var, child)); + self.emit_line(&format!("_a({}, {});", container_var, child)); self.indent -= 1; } self.emit_line("}"); @@ -1304,6 +1326,59 @@ impl JsEmitter { format!("DS._connectStream(\"{}\", [{}])", source, select_js.join(",")) } } + Expr::Await(inner) => { + let inner_js = self.emit_expr(inner); + format!("(await {})", inner_js) + } + Expr::Merge(sources) => { + let sources_js: Vec = sources.iter().map(|s| self.emit_expr(s)).collect(); + format!("DS._mergeStreams([{}])", sources_js.join(", ")) + } + Expr::Pipe(left, right) => { + let left_js = self.emit_expr(left); + match right.as_ref() { + // Named operator with args: `stream | debounce(100)` + Expr::Call(name, args) => { + let runtime_fn = match name.as_str() { + "map" => "DS._streamMap", + "filter" => "DS._streamFilter", + "debounce" => "DS._streamDebounce", + "distinct" => "DS._streamDistinct", + "throttle" => "DS._streamThrottle", + other => other, + }; + if args.is_empty() { + format!("{}({})", runtime_fn, left_js) + } else { + let args_js: Vec = args.iter().map(|a| self.emit_expr(a)).collect(); + format!("{}({}, {})", runtime_fn, left_js, args_js.join(", ")) + } + } + // Bare operator: `stream | distinct` + Expr::Ident(name) => { + let runtime_fn = match name.as_str() { + "map" => "DS._streamMap", + "filter" => "DS._streamFilter", + "debounce" => "DS._streamDebounce", + "distinct" => "DS._streamDistinct", + "throttle" => "DS._streamThrottle", + other => other, + }; + format!("{}({})", runtime_fn, left_js) + } + // Lambda: `stream | (x -> x.count)` becomes map + Expr::Lambda(params, body) => { + let body_js = self.emit_expr(body); + let fn_js = format!("({}) => {}", params.join(", "), body_js); + format!("DS._streamMap({}, {})", left_js, fn_js) + } + // Generic: right(left) — function application + _ => { + let right_js = self.emit_expr(right); + format!("{}({})", right_js, left_js) + } + } + } Expr::Match(scrutinee, arms) => { let scrut_js = self.emit_expr(scrutinee); if arms.is_empty() { @@ -1714,8 +1789,8 @@ impl JsEmitter { } // Create wrapper div - self.emit_line(&format!("const {} = document.createElement('div');", wrapper_var)); - self.emit_line(&format!("{}.className = 'ds-scene-wrapper';", wrapper_var)); + self.emit_line(&format!("const {} = _c('div');", wrapper_var)); + self.emit_line(&format!("_cn({}, 'ds-scene-wrapper');", wrapper_var)); // Create canvas let w_val = if graph.name_to_id.contains_key(&scene_width) || self.is_signal_ref(&scene_width) { @@ -1729,7 +1804,7 @@ impl JsEmitter { scene_height.clone() }; - self.emit_line(&format!("const {} = document.createElement('canvas');", canvas_var)); + self.emit_line(&format!("const {} = _c('canvas');", canvas_var)); self.emit_line(&format!("{}.width = {};", canvas_var, w_val)); self.emit_line(&format!("{}.height = {};", canvas_var, h_val)); self.emit_line(&format!("{}.style.width = {} + 'px';", canvas_var, w_val)); @@ -1738,7 +1813,7 @@ impl JsEmitter { self.emit_line(&format!("{}.style.background = 'rgba(255,255,255,0.02)';", canvas_var)); self.emit_line(&format!("{}.style.border = '1px solid rgba(255,255,255,0.06)';", canvas_var)); self.emit_line(&format!("{}.style.cursor = 'pointer';", canvas_var)); - self.emit_line(&format!("{}.appendChild({});", wrapper_var, canvas_var)); + self.emit_line(&format!("_a({}, {});", wrapper_var, canvas_var)); // Async IIFE to load WASM and set up physics self.emit_line("(async () => {"); @@ -1750,6 +1825,7 @@ impl JsEmitter { self.emit_line(&format!("const _sceneH = {};", h_val)); self.emit_line("const _world = new PhysicsWorld(_sceneW, _sceneH);"); self.emit_line(&format!("const _ctx = {}.getContext('2d');", canvas_var)); + self.emit_line("DS._streamCanvas = _ctx;"); // Create bodies from child elements for child in &container.children { @@ -2626,6 +2702,7 @@ const DS = (() => { return eff; } + // @TREESHAKE:BEGIN:router // ── Router ── const _route = new Signal(window.location.hash.slice(1) || '/'); window.addEventListener('hashchange', () => { @@ -2651,6 +2728,7 @@ const DS = (() => { } return params; } + // @TREESHAKE:END:router // ── Async Resources ── function resource(fetcher) { @@ -2668,6 +2746,7 @@ const DS = (() => { return resource(() => fetch(url).then(r => r.json())); } + // @TREESHAKE:BEGIN:spring // ── Spring Physics Engine ── const _activeSprings = new Set(); let _rafId = null; @@ -2744,6 +2823,9 @@ const DS = (() => { function spring(opts) { return new Spring(typeof opts === 'object' ? opts : { value: opts, target: opts }); } + // @TREESHAKE:END:spring + + // @TREESHAKE:BEGIN:constraint // ── Constraint Solver ── function constrain(element, prop, fn) { return effect(() => { @@ -2771,6 +2853,9 @@ const DS = (() => { _viewport.height.value = window.innerHeight; }); + // @TREESHAKE:END:constraint + + // @TREESHAKE:BEGIN:scene // ── 2D Scene Rendering Engine ── function scene(width, height) { const canvas = document.createElement('canvas'); @@ -2893,6 +2978,9 @@ const DS = (() => { return shape; } + // @TREESHAKE:END:scene + + // @TREESHAKE:BEGIN:streaming // ── Bitstream Streaming ── const HEADER_SIZE = 16; let _streamWs = null; @@ -2934,6 +3022,205 @@ const DS = (() => { }; } + // ── Pixel streaming state ── + var _streamCanvas = null; // canvas 2D context registered by physics scene + var _streamPrevFrame = null; // previous RGBA frame for delta computation + var _domCaptureCanvas = null; // offscreen canvas for DOM rasterization + var _domCaptureCtx = null; + var _domCaptureActive = false; + + // ── DOM Pixel Capture (for DOM-based apps without a physics canvas) ── + function _streamDomCapture(rootEl, w, h) { + if (!rootEl) return; + if (!_domCaptureCanvas) { + _domCaptureCanvas = document.createElement('canvas'); + _domCaptureCanvas.width = w || 800; + _domCaptureCanvas.height = h || 600; + _domCaptureCtx = _domCaptureCanvas.getContext('2d'); + } + // Use SVG foreignObject to rasterize DOM to canvas + var svgNs = 'http://www.w3.org/2000/svg'; + var html = rootEl.outerHTML; + var svgStr = '' + + '' + + '
' + html + '
' + + '
'; + var blob = new Blob([svgStr], { type: 'image/svg+xml;charset=utf-8' }); + var url = URL.createObjectURL(blob); + var img = new Image(); + img.onload = function() { + _domCaptureCtx.clearRect(0, 0, w, h); + _domCaptureCtx.drawImage(img, 0, 0); + URL.revokeObjectURL(url); + // Send frame data + var imageData = _domCaptureCtx.getImageData(0, 0, w, h); + var pixels = new Uint8Array(imageData.data.buffer); + if (_streamMode === 'delta' && _streamPrevFrame) { + var delta = new Uint8Array(pixels.length); + var zeroCount = 0; + for (var i = 0; i < pixels.length; i++) { + delta[i] = pixels[i] ^ _streamPrevFrame[i]; + if (delta[i] === 0) zeroCount++; + } + if (zeroCount > pixels.length * 0.3) { + _streamSendPixel(0x03, 0x04, w, h, _rleEncode(delta)); + } else { + _streamSendPixel(0x01, 0x02, w, h, pixels); + } + } else { + _streamSendPixel(0x01, 0x02, w, h, pixels); + } + _streamPrevFrame = pixels.slice(); + }; + img.onerror = function() { URL.revokeObjectURL(url); }; + img.src = url; + } + + function _startDomCapture() { + if (_domCaptureActive) return; + _domCaptureActive = true; + var root = document.getElementById('ds-root'); + if (!root) return; + var w = root.offsetWidth || 800; + var h = root.offsetHeight || 600; + function captureLoop() { + if (!_domCaptureActive || !_streamWs || _streamWs.readyState !== 1) return; + if (_streamMode === 'pixel' || _streamMode === 'delta') { + _streamDomCapture(root, w, h); + } + setTimeout(captureLoop, 100); // ~10fps for DOM capture + } + captureLoop(); + } + + // ── Opus Audio Compression ── + var _audioRecorder = null; + var _audioRecorderSeq = 0; + + function _streamAudio(mediaStream) { + if (!mediaStream || _audioRecorder) return; + try { + _audioRecorder = new MediaRecorder(mediaStream, { + mimeType: 'audio/webm;codecs=opus', + audioBitsPerSecond: 32000 + }); + } catch(e) { + console.warn('[ds-stream] MediaRecorder not available for Opus:', e); + return; + } + _audioRecorder.ondataavailable = function(e) { + if (e.data.size > 0 && _streamWs && _streamWs.readyState === 1) { + e.data.arrayBuffer().then(function(buf) { + var payload = new Uint8Array(buf); + var ts = (performance.now() - _streamStart) | 0; + var msg = new Uint8Array(HEADER_SIZE + payload.length); + var v = new DataView(msg.buffer); + v.setUint8(0, 0x11); // AudioCompressed + v.setUint8(1, 0x04); // FLAG_COMPRESSED + v.setUint16(2, (_audioRecorderSeq++) & 0xFFFF, true); + v.setUint32(4, ts, true); + v.setUint16(8, 1, true); // channels + v.setUint16(10, 480, true); // 48000/100 + v.setUint32(12, payload.length, true); + msg.set(payload, HEADER_SIZE); + _streamWs.send(msg.buffer); + }); + } + }; + _audioRecorder.start(20); // 20ms chunks + console.log('[ds-stream] Audio streaming started (Opus)'); + } + + function _stopAudio() { + if (_audioRecorder) { + _audioRecorder.stop(); + _audioRecorder = null; + } + } + + // ── Adaptive Quality ── + var _adaptiveEnabled = false; + var _adaptiveByteWindow = []; // timestamps + sizes in 5s window + var _adaptiveStableCount = 0; + + function _startAdaptiveQuality() { + if (_adaptiveEnabled) return; + _adaptiveEnabled = true; + setInterval(function() { + if (!_streamWs || _streamWs.readyState !== 1) return; + var now = performance.now(); + // Prune old entries (older than 5s) + _adaptiveByteWindow = _adaptiveByteWindow.filter(function(e) { return now - e.t < 5000; }); + var totalBytes = 0; + for (var i = 0; i < _adaptiveByteWindow.length; i++) totalBytes += _adaptiveByteWindow[i].b; + var byteRateKBps = totalBytes / 5 / 1024; // KB/s + var lat = _streamLatency; + + var currentMode = _streamMode; + // Downgrade logic + if (currentMode === 'pixel' && (lat > 200 || byteRateKBps > 500)) { + _streamMode = 'delta'; + _adaptiveStableCount = 0; + console.log('[ds-stream] Adaptive: pixel -> delta (lat=' + lat + 'ms, rate=' + byteRateKBps.toFixed(0) + 'KB/s)'); + } else if ((currentMode === 'pixel' || currentMode === 'delta') && (lat > 500 || byteRateKBps > 1000)) { + _streamMode = 'signal'; + _adaptiveStableCount = 0; + console.log('[ds-stream] Adaptive: ' + currentMode + ' -> signal (lat=' + lat + 'ms, rate=' + byteRateKBps.toFixed(0) + 'KB/s)'); + } + // Upgrade logic (needs stability for 5 checks = 10s) + else if (currentMode === 'signal' && lat < 100 && byteRateKBps < 200) { + _adaptiveStableCount++; + if (_adaptiveStableCount >= 5) { + _streamMode = 'delta'; + _adaptiveStableCount = 0; + console.log('[ds-stream] Adaptive: signal -> delta (conditions good)'); + } + } else if (currentMode === 'delta' && lat < 50 && byteRateKBps < 100) { + _adaptiveStableCount++; + if (_adaptiveStableCount >= 5) { + _streamMode = 'pixel'; + _adaptiveStableCount = 0; + console.log('[ds-stream] Adaptive: delta -> pixel (conditions excellent)'); + } + } else { + _adaptiveStableCount = 0; + } + }, 2000); + } + + function _streamSendPixel(type, flags, w, h, payload) { + if (!_streamWs || _streamWs.readyState !== 1) return; + var ts = (performance.now() - _streamStart) | 0; + var msg = new Uint8Array(HEADER_SIZE + payload.length); + var v = new DataView(msg.buffer); + v.setUint8(0, type); + v.setUint8(1, flags); + v.setUint16(2, (_streamSeq++) & 0xFFFF, true); + v.setUint32(4, ts, true); + v.setUint16(8, w, true); + v.setUint16(10, h, true); + v.setUint32(12, payload.length, true); + msg.set(payload, HEADER_SIZE); + _streamWs.send(msg.buffer); + if (_adaptiveEnabled) { _adaptiveByteWindow.push({ t: performance.now(), b: msg.length }); } + } + + function _rleEncode(data) { + var out = []; + var i = 0; + while (i < data.length) { + if (data[i] === 0) { + var count = 0; + while (i < data.length && data[i] === 0 && count < 65535) { count++; i++; } + out.push(0, count & 0xFF, (count >> 8) & 0xFF); + } else { + out.push(data[i]); + i++; + } + } + return new Uint8Array(out); + } + // ── Signal registry for bidirectional sync ── var _signalRegistry = {}; var _signalVersions = {}; // per-signal version counters for conflict resolution @@ -3040,6 +3327,10 @@ const DS = (() => { } }, 5000); } + // Auto-start DOM capture for pixel/delta mode without a physics canvas + if ((_streamMode === 'pixel' || _streamMode === 'delta') && !_streamCanvas) { + setTimeout(_startDomCapture, 100); + } }; } @@ -3126,11 +3417,32 @@ const DS = (() => { bodies.push({ x: p[0] | 0, y: p[1] | 0 }); } _streamSend(0x31, 0, new TextEncoder().encode(JSON.stringify({ _bodies: bodies }))); + } else if (_streamMode === 'pixel' || _streamMode === 'delta') { + if (!_streamCanvas) return; + var imageData = _streamCanvas.getImageData(0, 0, w, h); + var pixels = new Uint8Array(imageData.data.buffer); + if (_streamMode === 'delta' && _streamPrevFrame) { + var delta = new Uint8Array(pixels.length); + var zeroCount = 0; + for (var i = 0; i < pixels.length; i++) { + delta[i] = pixels[i] ^ _streamPrevFrame[i]; + if (delta[i] === 0) zeroCount++; + } + if (zeroCount > pixels.length * 0.3) { + var rle = _rleEncode(delta); + _streamSendPixel(0x03, 0x04, w, h, rle); + } else { + _streamSendPixel(0x01, 0x02, w, h, pixels); + } + } else { + _streamSendPixel(0x01, 0x02, w, h, pixels); + } + _streamPrevFrame = pixels.slice(); } } function _handleRemoteInput(type, payload) { - if (payload.length < 4) return; + if (payload.length < 1) return; var view = new DataView(payload.buffer, payload.byteOffset); switch (type) { case 0x01: @@ -3150,9 +3462,67 @@ const DS = (() => { case 0x11: emit('remote_key', { keyCode: view.getUint16(0, true), type: 'up' }); break; + case 0x20: + case 0x21: + emit('remote_touch', { + id: payload[0], + x: view.getUint16(1, true), y: view.getUint16(3, true), + phase: payload.length > 5 ? payload[5] : (type === 0x21 ? 1 : 0) + }); + break; + case 0x30: + emit('remote_gamepad', { + axis: payload[0], + value: view.getInt16(1, true) / 32767 + }); + break; + case 0x31: + emit('remote_gamepad_button', { + button: payload[0], + pressed: payload[1] === 1, + analog: payload.length > 2 ? payload[2] / 255 : (payload[1] ? 1 : 0) + }); + break; case 0x50: emit('remote_scroll', { dx: view.getInt16(0, true), dy: view.getInt16(2, true) }); break; + case 0x60: + emit('remote_resize', { + width: view.getUint16(0, true), height: view.getUint16(2, true) + }); + break; + case 0x40: // MIDI + emit('remote_midi', { + status: payload[0], data1: payload[1], data2: payload.length > 2 ? payload[2] : 0 + }); + break; + case 0x70: // VoiceInput + emit('remote_voice', { + sampleRate: view.getUint16(0, true), channels: payload[2], + format: payload[3], data: payload.subarray(4) + }); + break; + case 0x71: // CameraInput + emit('remote_camera', { + width: view.getUint16(0, true), height: view.getUint16(2, true), + format: payload[4], data: payload.subarray(5) + }); + break; + case 0x80: // SensorInput + emit('remote_sensor', { + sensorType: payload[0], + x: view.getInt16(1, true) / 1000, + y: view.getInt16(3, true) / 1000, + z: view.getInt16(5, true) / 1000 + }); + break; + case 0x90: // BciInput + emit('remote_bci', { + channelCount: payload[0], + sampleRate: view.getUint16(1, true), + data: payload.subarray(3) + }); + break; } } @@ -3273,6 +3643,12 @@ const DS = (() => { // Strip internal sync metadata delete newState._pid; delete newState._v; + // Re-synthesize streamed audio on receiver + if ('_tone' in newState) { + var t = newState._tone; + if (t && t.freq > 0) _playTone(t.freq, t.dur || 80, t.type || 'sine'); + delete newState._tone; + } // Apply select filter newState = _csFilter(newState); // Inject connection metadata @@ -3308,6 +3684,33 @@ const DS = (() => { emit('stream_frame', { type: 'delta', pixels: _csPixelBuffer }); } break; + case 0x11: // AudioCompressed (Opus) + try { + var audioBlob = new Blob([pl], { type: 'audio/webm;codecs=opus' }); + audioBlob.arrayBuffer().then(function(abuf) { + var actx = _ensureAudio(); + actx.decodeAudioData(abuf, function(decoded) { + var src = actx.createBufferSource(); + src.buffer = decoded; + src.connect(actx.destination); + src.start(); + }, function() {}); + }); + } catch(ex) {} + break; + case 0x40: // NeuralFrame + var nw = view.getUint16(8, true), nh = view.getUint16(10, true); + emit('neural_frame', { type: 'neural', width: nw, height: nh, data: pl }); + break; + case 0x41: // NeuralAudio + emit('neural_audio', { data: pl }); + break; + case 0x42: // NeuralActuator + emit('neural_actuator', { data: pl }); + break; + case 0x43: // NeuralLatent + emit('neural_latent', { data: pl }); + break; case 0xFE: // Pong — calculate RTT if (_csLastPingTime > 0) { _csLatency = Math.round(performance.now() - _csLastPingTime); @@ -3339,9 +3742,153 @@ const DS = (() => { }; } _csConnect(); + + // ── Receiver Gamepad Polling ── + var _csGamepadActive = false; + var _csLastAxes = {}; + var _csLastButtons = {}; + function _csStartGamepadPolling() { + if (_csGamepadActive) return; + _csGamepadActive = true; + function gpPoll() { + if (!_csGamepadActive) return; + var gps = navigator.getGamepads ? navigator.getGamepads() : []; + for (var gi = 0; gi < gps.length; gi++) { + var gp = gps[gi]; + if (!gp) continue; + var gpKey = 'gp' + gi; + // Axes + for (var ai = 0; ai < gp.axes.length; ai++) { + var axisVal = gp.axes[ai]; + var axisKey = gpKey + 'a' + ai; + var prev = _csLastAxes[axisKey] || 0; + if (Math.abs(axisVal - prev) > 0.05) { // dead zone + _csLastAxes[axisKey] = axisVal; + if (_csWs && _csWs.readyState === 1) { + var aPayload = new Uint8Array(3); + aPayload[0] = ai; + var scaled = Math.round(axisVal * 32767); + aPayload[1] = scaled & 0xFF; + aPayload[2] = (scaled >> 8) & 0xFF; + var aMsg = new Uint8Array(HEADER_SIZE + 3); + var aV = new DataView(aMsg.buffer); + aV.setUint8(0, 0x30); // GamepadAxis + aV.setUint8(1, 0x01); // FLAG_INPUT + aV.setUint32(12, 3, true); + aMsg.set(aPayload, HEADER_SIZE); + _csWs.send(aMsg.buffer); + } + } + } + // Buttons + for (var bi = 0; bi < gp.buttons.length; bi++) { + var btnPressed = gp.buttons[bi].pressed ? 1 : 0; + var btnAnalog = Math.round(gp.buttons[bi].value * 255); + var btnKey = gpKey + 'b' + bi; + var prevBtn = _csLastButtons[btnKey] || 0; + if (btnPressed !== prevBtn) { + _csLastButtons[btnKey] = btnPressed; + if (_csWs && _csWs.readyState === 1) { + var bPayload = new Uint8Array(3); + bPayload[0] = bi; + bPayload[1] = btnPressed; + bPayload[2] = btnAnalog; + var bMsg = new Uint8Array(HEADER_SIZE + 3); + var bV = new DataView(bMsg.buffer); + bV.setUint8(0, 0x31); // GamepadButton + bV.setUint8(1, 0x01); // FLAG_INPUT + bV.setUint32(12, 3, true); + bMsg.set(bPayload, HEADER_SIZE); + _csWs.send(bMsg.buffer); + } + } + } + } + requestAnimationFrame(gpPoll); + } + gpPoll(); + } + // Auto-start gamepad polling when gamepad is connected + window.addEventListener('gamepadconnected', function() { + console.log('[ds-stream] Gamepad connected on receiver, starting polling'); + _csStartGamepadPolling(); + }); + return state; } + // ── Stream Merge ── + // Merge multiple stream proxies into a single reactive signal. + function _mergeStreams(sources) { + var merged = signal({}); + var _mergeState = {}; + for (var i = 0; i < sources.length; i++) { + (function(src) { + effect(function() { + var v = src.value; + if (v && typeof v === 'object') { + Object.assign(_mergeState, v); + merged.value = Object.assign({}, _mergeState); + } + }); + })(sources[i]); + } + return merged; + } + + // ── Stream Transform Operators ── + // Create derived signal proxies via pipe: `stream from '...' | _streamMap(fn)` + function _streamMap(source, fn) { + var out = signal(null); + effect(function() { + var v = source.value; + if (v !== undefined && v !== null) out.value = fn(v); + }); + return out; + } + + function _streamFilter(source, predicate) { + var out = signal(source.value); + effect(function() { + var v = source.value; + if (v !== undefined && predicate(v)) out.value = v; + }); + return out; + } + + function _streamDebounce(source, ms) { + var out = signal(source.value); + var _dbTimer = null; + effect(function() { + var v = source.value; + if (_dbTimer) clearTimeout(_dbTimer); + _dbTimer = setTimeout(function() { out.value = v; }, ms || 100); + }); + return out; + } + + function _streamDistinct(source) { + var out = signal(source.value); + var _lastJson = ''; + effect(function() { + var v = source.value; + var json = JSON.stringify(v); + if (json !== _lastJson) { _lastJson = json; out.value = v; } + }); + return out; + } + + function _streamThrottle(source, ms) { + var out = signal(source.value); + var _tLast = 0; + effect(function() { + var v = source.value; + var now = performance.now(); + if (now - _tLast >= (ms || 100)) { _tLast = now; out.value = v; } + }); + return out; + } + // ── WebRTC Data Channel Transport ── var _rtcPc = null; var _rtcDc = null; @@ -3467,6 +4014,10 @@ const DS = (() => { gain.connect(ctx.destination); osc.start(); osc.stop(ctx.currentTime + durationMs / 1000); + // Stream tone params so receivers can re-synthesize + if (_streamWs && _streamWs.readyState === 1) { + _streamDiff('_tone', { freq: freq, dur: durationMs, type: type || 'sine' }); + } } function _playNoise(durationMs, vol) { @@ -3489,19 +4040,217 @@ const DS = (() => { gain.connect(ctx.destination); src.start(); } + // @TREESHAKE:END:streaming - var _ds = { signal: signal, derived: derived, effect: effect, batch: batch, flush: flush, onEvent: onEvent, emit: emit, - keyedList: keyedList, route: _route, navigate: navigate, matchRoute: matchRoute, - resource: resource, fetchJSON: fetchJSON, - spring: spring, constrain: constrain, viewport: _viewport, - scene: scene, circle: circle, rect: rect, line: line, - _initStream: _initStream, _streamDiff: _streamDiff, _streamSync: _streamSync, - _streamSceneState: _streamSceneState, _connectStream: _connectStream, - _initWebRTC: _initWebRTC, _registerSignal: _registerSignal, - _playTone: _playTone, _playNoise: _playNoise, - Signal: Signal, Derived: Derived, Effect: Effect, Spring: Spring }; - Object.defineProperty(_ds, '_streamWs', { get: function() { return _streamWs; } }); - Object.defineProperty(_ds, '_rtcDc', { get: function() { return _rtcDc; } }); + // ── Build DS object dynamically (only include available features) ── + var _ds = { signal: signal, derived: derived, effect: effect, batch: batch, flush: flush, + onEvent: onEvent, emit: emit, keyedList: keyedList, + resource: resource, fetchJSON: fetchJSON, + Signal: Signal, Derived: Derived, Effect: Effect }; + + // Router (tree-shakeable) + if (typeof _route !== 'undefined') { _ds.route = _route; _ds.navigate = navigate; _ds.matchRoute = matchRoute; } + else { _ds.route = { get value() { return '/'; } }; _ds.navigate = function(){}; _ds.matchRoute = function(){ return false; }; } + + // Spring (tree-shakeable) + if (typeof Spring !== 'undefined') { _ds.spring = spring; _ds.Spring = Spring; } + else { _ds.spring = function(v) { return typeof v === 'object' ? signal(v.value||0) : signal(v||0); }; } + + // Constraint (tree-shakeable) + if (typeof constrain !== 'undefined') { _ds.constrain = constrain; _ds.viewport = _viewport; } + else { _ds.constrain = function(){}; _ds.viewport = { width: signal(0), height: signal(0) }; } + + // Scene (tree-shakeable) + if (typeof scene !== 'undefined') { _ds.scene = scene; _ds.circle = circle; _ds.rect = rect; _ds.line = line; } + else { var _noop = function(){ return {}; }; _ds.scene = _noop; _ds.circle = _noop; _ds.rect = _noop; _ds.line = _noop; } + + // Streaming (tree-shakeable) + if (typeof _initStream !== 'undefined') { + _ds._initStream = _initStream; _ds._streamDiff = _streamDiff; _ds._streamSync = _streamSync; + _ds._streamSceneState = _streamSceneState; _ds._connectStream = _connectStream; + _ds._initWebRTC = _initWebRTC; _ds._registerSignal = _registerSignal; + _ds._streamAudio = _streamAudio; _ds._stopAudio = _stopAudio; + _ds._startDomCapture = _startDomCapture; _ds._startAdaptiveQuality = _startAdaptiveQuality; + _ds._mergeStreams = _mergeStreams; + _ds._streamMap = _streamMap; _ds._streamFilter = _streamFilter; + _ds._streamDebounce = _streamDebounce; _ds._streamDistinct = _streamDistinct; + _ds._streamThrottle = _streamThrottle; + _ds._playTone = _playTone; _ds._playNoise = _playNoise; + Object.defineProperty(_ds, '_streamWs', { get: function() { return _streamWs; } }); + Object.defineProperty(_ds, '_rtcDc', { get: function() { return _rtcDc; } }); + Object.defineProperty(_ds, '_streamCanvas', { + get: function() { return _streamCanvas; }, + set: function(v) { _streamCanvas = v; } + }); + } else { + _ds._registerSignal = function(){}; _ds._streamDiff = function(){}; + _ds._initStream = function(){}; _ds._streamSync = function(){}; + _ds._streamSceneState = function(){}; _ds._connectStream = function(){ return signal(null); }; + _ds._initWebRTC = function(){}; _ds._streamAudio = function(){}; _ds._stopAudio = function(){}; + _ds._startDomCapture = function(){}; _ds._startAdaptiveQuality = function(){}; + _ds._mergeStreams = function(){}; _ds._streamMap = function(){}; _ds._streamFilter = function(){}; + _ds._streamDebounce = function(){}; _ds._streamDistinct = function(){}; + _ds._streamThrottle = function(){}; _ds._playTone = function(){}; _ds._playNoise = function(){}; + } return _ds; })(); +// ── DOM Helpers (shorthand for generated code) ── +const _c = (t) => document.createElement(t); +const _a = (p, c) => p.appendChild(c); +const _t = (e, t) => { e.textContent = t; }; +const _cn = (e, c) => { e.className = c; }; "#; + +/// Simple JS minifier — strips blank lines and leading/trailing whitespace. +/// Does NOT strip // comments (to avoid regex literal corruption). +/// Conservative: no variable renaming, no dead code elimination. +fn minify_js(input: &str) -> String { + let mut result = String::with_capacity(input.len()); + + for line in input.lines() { + let trimmed = line.trim(); + // Skip blank lines + if trimmed.is_empty() { + continue; + } + result.push_str(trimmed); + result.push('\n'); + } + + result +} + +/// Simple CSS minifier — strips comments, collapses whitespace. +fn minify_css(input: &str) -> String { + let mut result = String::with_capacity(input.len()); + let chars: Vec = input.chars().collect(); + let len = chars.len(); + let mut i = 0; + + while i < len { + // Skip CSS comments + if chars[i] == '/' && i + 1 < len && chars[i + 1] == '*' { + i += 2; + while i + 1 < len && !(chars[i] == '*' && chars[i + 1] == '/') { + i += 1; + } + i += 2; + continue; + } + + // Collapse whitespace + if chars[i].is_whitespace() { + // Only emit a single space if not next to punctuation + if !result.is_empty() { + let last = result.chars().last().unwrap_or(' '); + if !matches!(last, '{' | '}' | ';' | ':' | ',' | '>' | '+' | '~') { + result.push(' '); + } + } + while i < len && chars[i].is_whitespace() { + i += 1; + } + // Skip space before punctuation + if i < len && matches!(chars[i], '{' | '}' | ';' | ':' | ',') { + // Remove trailing space we just added + if result.ends_with(' ') { + result.pop(); + } + } + continue; + } + + result.push(chars[i]); + i += 1; + } + + result +} + +/// Detect which optional runtime features the program uses. +fn detect_features(program: &Program) -> HashSet { + let mut features = HashSet::new(); + + for decl in &program.declarations { + match decl { + Declaration::Route(_) => { features.insert("router".to_string()); } + Declaration::Stream(_) => { features.insert("streaming".to_string()); } + Declaration::Constrain(_) => { features.insert("constraint".to_string()); } + Declaration::Let(l) => { + // Check for spring() calls + if matches!(&l.value, Expr::Call(name, _) if name == "spring") { + features.insert("spring".to_string()); + } + // Check for stream from + if matches!(&l.value, Expr::StreamFrom { .. }) { + features.insert("streaming".to_string()); + } + } + Declaration::View(v) => { + // Check view body for scenes + if contains_scene(&v.body) { + features.insert("scene".to_string()); + } + // Check for spring references in the view + if contains_spring_ref(&v.body) { + features.insert("spring".to_string()); + } + } + _ => {} + } + } + + features +} + +/// Check if an expression tree contains a Scene container. +fn contains_scene(expr: &Expr) -> bool { + match expr { + Expr::Container(c) => { + if matches!(c.kind, ContainerKind::Scene) { return true; } + c.children.iter().any(contains_scene) + } + _ => false, + } +} + +/// Check if an expression tree references spring-related calls. +fn contains_spring_ref(expr: &Expr) -> bool { + match expr { + Expr::Call(name, _) if name == "spring" => true, + Expr::Container(c) => c.children.iter().any(contains_spring_ref), + Expr::Element(e) => e.args.iter().any(contains_spring_ref), + _ => false, + } +} + +/// Strip unused runtime sections based on @TREESHAKE markers. +fn tree_shake_runtime(runtime: &str, used_features: &HashSet) -> String { + let mut result = String::with_capacity(runtime.len()); + let mut skipping = false; + + for line in runtime.lines() { + let trimmed = line.trim(); + + if let Some(feature) = trimmed.strip_prefix("// @TREESHAKE:BEGIN:") { + if !used_features.contains(feature.trim()) { + skipping = true; + continue; + } + } + + if let Some(_feature) = trimmed.strip_prefix("// @TREESHAKE:END:") { + if skipping { + skipping = false; + continue; + } + } + + if !skipping { + result.push_str(line); + result.push('\n'); + } + } + + result +} diff --git a/compiler/ds-incremental/src/lib.rs b/compiler/ds-incremental/src/lib.rs index f71259b..f27b975 100644 --- a/compiler/ds-incremental/src/lib.rs +++ b/compiler/ds-incremental/src/lib.rs @@ -69,7 +69,7 @@ impl IncrementalCompiler { fn full_compile(program: &Program) -> String { let graph = SignalGraph::from_program(program); let views = SignalGraph::analyze_views(program); - JsEmitter::emit_html(program, &graph, &views) + JsEmitter::emit_html(program, &graph, &views, false) } /// Compile source code, returning either a full HTML recompile or a JS patch. diff --git a/compiler/ds-parser/src/ast.rs b/compiler/ds-parser/src/ast.rs index e556ba1..ba84f51 100644 --- a/compiler/ds-parser/src/ast.rs +++ b/compiler/ds-parser/src/ast.rs @@ -308,6 +308,10 @@ pub enum Expr { MethodCall(Box, String, Vec), /// Slot: renders children passed to a component Slot, + /// Await: `await fetchJSON("/api")` + Await(Box), + /// Merge streams: `merge(stream1, stream2, ...)` + Merge(Vec), } /// String literal with interpolation segments. diff --git a/compiler/ds-parser/src/parser.rs b/compiler/ds-parser/src/parser.rs index f861696..97afef1 100644 --- a/compiler/ds-parser/src/parser.rs +++ b/compiler/ds-parser/src/parser.rs @@ -5,11 +5,23 @@ use crate::lexer::{Token, TokenKind}; pub struct Parser { tokens: Vec, pos: usize, + source_lines: Vec, + pending_decls: Vec, } impl Parser { pub fn new(tokens: Vec) -> Self { - Self { tokens, pos: 0 } + Self { tokens, pos: 0, source_lines: Vec::new(), pending_decls: Vec::new() } + } + + /// Create a parser with source text for enriched error messages. + pub fn with_source(tokens: Vec, source: &str) -> Self { + Self { + tokens, + pos: 0, + source_lines: source.lines().map(String::from).collect(), + pending_decls: Vec::new(), + } } pub fn parse_program(&mut self) -> Result { @@ -19,6 +31,8 @@ impl Parser { while !self.is_at_end() { let decl = self.parse_declaration()?; declarations.push(decl); + // Drain any pending declarations from destructuring desugaring + declarations.extend(self.pending_decls.drain(..)); self.skip_newlines(); } @@ -133,10 +147,16 @@ impl Parser { fn error(&self, msg: String) -> ParseError { let tok = self.current_token(); + let source_line = if tok.line > 0 && tok.line <= self.source_lines.len() { + Some(self.source_lines[tok.line - 1].clone()) + } else { + None + }; ParseError { message: msg, line: tok.line, col: tok.col, + source_line, } } @@ -263,6 +283,89 @@ impl Parser { fn parse_let_decl(&mut self) -> Result { let line = self.current_token().line; self.advance(); // consume 'let' + + // Object destructuring: `let { a, b } = expr` + if self.check(&TokenKind::LBrace) { + self.advance(); // consume '{' + let mut names = Vec::new(); + loop { + self.skip_newlines(); + if self.check(&TokenKind::RBrace) { break; } + names.push(self.expect_ident()?); + self.skip_newlines(); + if self.check(&TokenKind::Comma) { self.advance(); } + } + self.expect(&TokenKind::RBrace)?; + self.expect(&TokenKind::Eq)?; + let value = self.parse_expr()?; + + if names.is_empty() { + return Err(self.error("empty destructuring pattern".to_string())); + } + + // Desugar: let { a, b } = expr → let _tmp = expr; let a = _tmp.a; let b = _tmp.b; + let temp = format!("_ds_{}", names.join("_")); + let mut all_decls = vec![Declaration::Let(LetDecl { + name: temp.clone(), + type_annotation: None, + value, + span: Span { start: 0, end: 0, line }, + })]; + for field in &names { + all_decls.push(Declaration::Let(LetDecl { + name: field.clone(), + type_annotation: None, + value: Expr::DotAccess(Box::new(Expr::Ident(temp.clone())), field.clone()), + span: Span { start: 0, end: 0, line }, + })); + } + // Return first decl, queue rest for injection by parse_program + self.pending_decls.extend(all_decls.drain(1..)); + return Ok(all_decls.into_iter().next().unwrap()); + } + + // Array destructuring: `let [a, b] = expr` + if self.check(&TokenKind::LBracket) { + self.advance(); // consume '[' + let mut names = Vec::new(); + loop { + self.skip_newlines(); + if self.check(&TokenKind::RBracket) { break; } + names.push(self.expect_ident()?); + self.skip_newlines(); + if self.check(&TokenKind::Comma) { self.advance(); } + } + self.expect(&TokenKind::RBracket)?; + self.expect(&TokenKind::Eq)?; + let value = self.parse_expr()?; + + if names.is_empty() { + return Err(self.error("empty array destructuring pattern".to_string())); + } + + // Desugar: let [a, b] = expr → let _tmp = expr; let a = _tmp[0]; let b = _tmp[1]; + let temp = format!("_ds_{}", names.join("_")); + let mut all_decls = vec![Declaration::Let(LetDecl { + name: temp.clone(), + type_annotation: None, + value, + span: Span { start: 0, end: 0, line }, + })]; + for (i, name) in names.iter().enumerate() { + all_decls.push(Declaration::Let(LetDecl { + name: name.clone(), + type_annotation: None, + value: Expr::Index( + Box::new(Expr::Ident(temp.clone())), + Box::new(Expr::IntLit(i as i64)), + ), + span: Span { start: 0, end: 0, line }, + })); + } + self.pending_decls.extend(all_decls.drain(1..)); + return Ok(all_decls.into_iter().next().unwrap()); + } + let name = self.expect_ident()?; // Optional type annotation: `let name: Type = value` @@ -1245,6 +1348,18 @@ impl Parser { return Ok(Expr::Slot); } + // Await: `await fetchJSON("/api")` + if name == "await" { + let inner = self.parse_primary()?; + return Ok(Expr::Await(Box::new(inner))); + } + + // Merge: `merge(stream1, stream2, ...)` + if name == "merge" && self.check(&TokenKind::LParen) { + let args = self.parse_call_args()?; + return Ok(Expr::Merge(args)); + } + // Component use: `Button { label: "hello" }` — capitalized name + `{` if name.chars().next().map_or(false, |c| c.is_uppercase()) && self.check(&TokenKind::LBrace) @@ -1626,11 +1741,21 @@ pub struct ParseError { pub message: String, pub line: usize, pub col: usize, + pub source_line: Option, } impl std::fmt::Display for ParseError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Parse error at line {}:{}: {}", self.line, self.col, self.message) + writeln!(f, "Parse error at line {}:{}: {}", self.line, self.col, self.message)?; + if let Some(ref src) = self.source_line { + let line_num = format!("{}", self.line); + let pad = " ".repeat(line_num.len()); + writeln!(f, "{pad} |")?; + writeln!(f, "{line_num} | {src}")?; + let caret_offset = if self.col > 0 { self.col - 1 } else { 0 }; + writeln!(f, "{pad} | {}^", " ".repeat(caret_offset))?; + } + Ok(()) } } diff --git a/devices/waveshare-p4-panel/CMakeLists.txt b/devices/waveshare-p4-panel/CMakeLists.txt new file mode 100644 index 0000000..0b53f9c --- /dev/null +++ b/devices/waveshare-p4-panel/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 3.16) + +# Point to ESP-IDF +set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/components) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(ds-thin-client) diff --git a/devices/waveshare-p4-panel/README.md b/devices/waveshare-p4-panel/README.md new file mode 100644 index 0000000..5e4556f --- /dev/null +++ b/devices/waveshare-p4-panel/README.md @@ -0,0 +1,76 @@ +# DreamStack Thin Client — Waveshare ESP32-P4 10.1" Panel + +A 10.1" touchscreen that acts as a **dumb pixel display with touch input**. All rendering happens on the source device (laptop, Pi, server). The panel just shows pixels and reports touches. + +## Architecture + +``` +SOURCE (laptop/Pi) RELAY (:9100) THIS DEVICE +─────────────── ───────────── ─────────── + +DreamStack app renders WebSocket hub Waveshare ESP32-P4 + 800×1280 canvas 10.1" IPS + touch + +pixels ──→ XOR delta ──→ RLE ──→ relay ────────────────→ RLE decode + XOR apply + blit to screen + + ←── touch {id,x,y,phase} ← GT9271 touch +``` + +## Hardware + +| Component | Spec | +|---|---| +| Board | Waveshare ESP32-P4-WIFI6 | +| Display | 10.1" IPS, 800×1280, MIPI DSI | +| Touch | GT9271, 10-point capacitive, toughened glass | +| CPU | ESP32-P4 RISC-V 400MHz | +| RAM | 32MB PSRAM (framebuffer lives here) | +| WiFi | WiFi 6 (ESP32-C6) | +| Display driver | `waveshare/esp_lcd_jd9365_10_1` (JD9365) | + +## Project Structure + +``` +devices/waveshare-p4-panel/ +├── CMakeLists.txt # ESP-IDF project +├── README.md # This file +└── main/ + ├── CMakeLists.txt # Component registration + ├── idf_component.yml # Dependencies (display driver, WebSocket) + ├── Kconfig.projbuild # WiFi SSID/password, relay URL + ├── main.c # Entry point: WiFi → WS → receive/blit/touch + ├── ds_codec.h # RLE decode + XOR apply (header) + ├── ds_codec.c # RLE decode + XOR apply (implementation) + └── ds_protocol.h # Bitstream header parsing + touch encoding +``` + +## Building + +### Prerequisites +- ESP-IDF v5.3+ ([install guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32p4/get-started/)) +- VSCode + ESP-IDF extension (recommended) + +### Build & Flash +```bash +# Set target to ESP32-P4 +idf.py set-target esp32p4 + +# Configure WiFi and relay URL +idf.py menuconfig +# → DreamStack Thin Client → WiFi SSID, Password, Relay URL + +# Build +idf.py build + +# Flash (connect via USB-C) +idf.py -p /dev/ttyUSB0 flash monitor +``` + +## TODO (pending hardware arrival) +- [ ] Wire up `display_init()` with actual MIPI DSI + JD9365 driver +- [ ] Wire up `touch_task()` with GT9271 I2C touch driver +- [ ] Test framebuffer allocation in PSRAM (800×1280×2 = 2MB) +- [ ] Measure end-to-end latency (target: <50ms) +- [ ] Add reconnection logic for WiFi + WebSocket drops diff --git a/devices/waveshare-p4-panel/main/CMakeLists.txt b/devices/waveshare-p4-panel/main/CMakeLists.txt new file mode 100644 index 0000000..d3df4b2 --- /dev/null +++ b/devices/waveshare-p4-panel/main/CMakeLists.txt @@ -0,0 +1,11 @@ +idf_component_register( + SRCS "main.c" "ds_codec.c" + INCLUDE_DIRS "." + REQUIRES + esp_wifi + esp_event + esp_lcd + esp_timer + nvs_flash + esp_psram +) diff --git a/devices/waveshare-p4-panel/main/Kconfig.projbuild b/devices/waveshare-p4-panel/main/Kconfig.projbuild new file mode 100644 index 0000000..286f79b --- /dev/null +++ b/devices/waveshare-p4-panel/main/Kconfig.projbuild @@ -0,0 +1,22 @@ +menu "DreamStack Thin Client" + + config WIFI_SSID + string "WiFi SSID" + default "HomeNetwork" + help + WiFi network name to connect to. + + config WIFI_PASS + string "WiFi Password" + default "" + help + WiFi password. + + config RELAY_URL + string "Relay WebSocket URL" + default "ws://192.168.1.100:9100/stream/home" + help + WebSocket URL of the DreamStack relay server. + Format: ws://HOST:PORT/stream/CHANNEL_NAME + +endmenu diff --git a/devices/waveshare-p4-panel/main/ds_codec.c b/devices/waveshare-p4-panel/main/ds_codec.c new file mode 100644 index 0000000..39319e3 --- /dev/null +++ b/devices/waveshare-p4-panel/main/ds_codec.c @@ -0,0 +1,56 @@ +/** + * DreamStack Delta Codec — C port for ESP32-P4 + * + * Ported from engine/ds-stream/src/codec.rs (lines 109-179) + * Exact same encoding: 0x00 + 2-byte LE count = zero run. + */ + +#include "ds_codec.h" +#include + +size_t ds_rle_decode(const uint8_t *compressed, size_t comp_len, + uint8_t *output, size_t out_cap) { + size_t i = 0; // input position + size_t o = 0; // output position + + while (i < comp_len) { + if (compressed[i] == 0x00) { + // Zero run: 0x00 + count_lo + count_hi + if (i + 2 >= comp_len) break; + uint16_t count = (uint16_t)compressed[i + 1] + | ((uint16_t)compressed[i + 2] << 8); + if (o + count > out_cap) return 0; // overflow + memset(output + o, 0, count); + o += count; + i += 3; + } else { + // Literal byte + if (o >= out_cap) return 0; + output[o++] = compressed[i++]; + } + } + return o; +} + +void ds_xor_apply(uint8_t *framebuffer, const uint8_t *delta, size_t len) { + // Process 4 bytes at a time for speed on 32-bit RISC-V + size_t i = 0; + size_t aligned = len & ~3u; + for (; i < aligned; i += 4) { + *(uint32_t *)(framebuffer + i) ^= *(const uint32_t *)(delta + i); + } + for (; i < len; i++) { + framebuffer[i] ^= delta[i]; + } +} + +int ds_apply_delta_rle(uint8_t *framebuffer, size_t fb_len, + const uint8_t *compressed, size_t comp_len, + uint8_t *scratch) { + size_t decoded_len = ds_rle_decode(compressed, comp_len, scratch, fb_len); + if (decoded_len == 0 || decoded_len != fb_len) { + return -1; + } + ds_xor_apply(framebuffer, scratch, fb_len); + return 0; +} diff --git a/devices/waveshare-p4-panel/main/ds_codec.h b/devices/waveshare-p4-panel/main/ds_codec.h new file mode 100644 index 0000000..91c58ce --- /dev/null +++ b/devices/waveshare-p4-panel/main/ds_codec.h @@ -0,0 +1,54 @@ +/** + * DreamStack Delta Codec — C port for ESP32-P4 + * + * Ported from engine/ds-stream/src/codec.rs + * Handles XOR+RLE delta decompression for the thin client. + */ + +#pragma once +#include +#include + +/** + * RLE-decode a compressed delta buffer (in-place to output). + * + * Encoding: 0x00 followed by 2-byte LE count = zero run. + * Non-zero bytes pass through literally. + * + * @param compressed RLE-compressed data from relay + * @param comp_len Length of compressed data + * @param output Pre-allocated output buffer + * @param out_cap Capacity of output buffer + * @return Actual decoded length, or 0 on error + */ +size_t ds_rle_decode(const uint8_t *compressed, size_t comp_len, + uint8_t *output, size_t out_cap); + +/** + * Apply XOR delta to reconstruct current frame. + * + * framebuffer[i] ^= delta[i] for each byte. + * Modifies framebuffer in-place. + * + * @param framebuffer Current framebuffer (modified in-place) + * @param delta Decoded delta buffer + * @param len Length (must match for both buffers) + */ +void ds_xor_apply(uint8_t *framebuffer, const uint8_t *delta, size_t len); + +/** + * Decode an RLE-compressed delta and apply it to the framebuffer. + * Convenience function combining rle_decode + xor_apply. + * + * Uses a scratch buffer for the intermediate decoded delta. + * + * @param framebuffer Current framebuffer (modified in-place) + * @param fb_len Framebuffer length + * @param compressed RLE-compressed delta from relay + * @param comp_len Length of compressed data + * @param scratch Temporary buffer (must be >= fb_len) + * @return 0 on success, -1 on error + */ +int ds_apply_delta_rle(uint8_t *framebuffer, size_t fb_len, + const uint8_t *compressed, size_t comp_len, + uint8_t *scratch); diff --git a/devices/waveshare-p4-panel/main/ds_protocol.h b/devices/waveshare-p4-panel/main/ds_protocol.h new file mode 100644 index 0000000..08953da --- /dev/null +++ b/devices/waveshare-p4-panel/main/ds_protocol.h @@ -0,0 +1,94 @@ +/** + * DreamStack Bitstream Protocol — C port for ESP32-P4 + * + * Ported from engine/ds-stream/src/protocol.rs + * Header format and frame types for the thin client. + */ + +#pragma once +#include + +// ─── Magic bytes ─── +#define DS_MAGIC_0 0xD5 +#define DS_MAGIC_1 0x7A + +// ─── Header size ─── +#define DS_HEADER_SIZE 16 + +// ─── Frame types (output: source → receiver) ─── +#define DS_FRAME_PIXELS 0x01 // Raw RGBA pixel data +#define DS_FRAME_COMPRESSED 0x02 // PNG/WebP compressed +#define DS_FRAME_DELTA 0x03 // XOR delta from previous +#define DS_FRAME_SIGNAL_SYNC 0x10 // Full signal state (JSON) +#define DS_FRAME_SIGNAL_DIFF 0x11 // Changed signals (JSON) +#define DS_FRAME_SCHEMA 0x12 // Schema announcement +#define DS_FRAME_KEYFRAME 0xF0 // Reset state +#define DS_FRAME_PING 0xFE // Heartbeat +#define DS_FRAME_END 0xFF // Stream end + +// ─── Input types (receiver → source) ─── +#define DS_INPUT_POINTER 0x01 +#define DS_INPUT_KEY 0x02 +#define DS_INPUT_SCROLL 0x03 +#define DS_INPUT_TOUCH 0x04 +#define DS_INPUT_GAMEPAD_AXIS 0x10 +#define DS_INPUT_GAMEPAD_BTN 0x11 +#define DS_INPUT_TEXT 0x20 + +// ─── Flags ─── +#define DS_FLAG_INPUT 0x01 +#define DS_FLAG_KEYFRAME 0x02 +#define DS_FLAG_COMPRESSED 0x04 + +// ─── Frame header (16 bytes, little-endian) ─── +typedef struct __attribute__((packed)) { + uint8_t magic[2]; // DS_MAGIC_0, DS_MAGIC_1 + uint8_t frame_type; // DS_FRAME_* or DS_INPUT_* + uint8_t flags; // DS_FLAG_* + uint16_t seq; // Sequence number + uint32_t timestamp; // Milliseconds + uint16_t width; // Frame width (pixels) + uint16_t height; // Frame height (pixels) + uint16_t payload_len; // Following payload length +} ds_header_t; + +// ─── Touch event (6 bytes) ─── +typedef struct __attribute__((packed)) { + uint8_t id; // Touch identifier (multi-touch) + uint16_t x; // X coordinate + uint16_t y; // Y coordinate + uint8_t phase; // 0=start/move, 1=end, 2=cancel +} ds_touch_event_t; + +/** + * Parse a header from raw bytes. + * Returns 0 on success, -1 if magic doesn't match. + */ +static inline int ds_parse_header(const uint8_t *buf, ds_header_t *hdr) { + if (buf[0] != DS_MAGIC_0 || buf[1] != DS_MAGIC_1) return -1; + *hdr = *(const ds_header_t *)buf; + return 0; +} + +/** + * Encode a touch input message into a buffer. + * Buffer must be at least DS_HEADER_SIZE + sizeof(ds_touch_event_t) = 22 bytes. + * Returns total message size. + */ +static inline size_t ds_encode_touch(uint8_t *buf, uint16_t seq, + uint32_t timestamp, + const ds_touch_event_t *touch) { + ds_header_t *hdr = (ds_header_t *)buf; + hdr->magic[0] = DS_MAGIC_0; + hdr->magic[1] = DS_MAGIC_1; + hdr->frame_type = DS_INPUT_TOUCH; + hdr->flags = DS_FLAG_INPUT; + hdr->seq = seq; + hdr->timestamp = timestamp; + hdr->width = 0; + hdr->height = 0; + hdr->payload_len = sizeof(ds_touch_event_t); + + *(ds_touch_event_t *)(buf + DS_HEADER_SIZE) = *touch; + return DS_HEADER_SIZE + sizeof(ds_touch_event_t); +} diff --git a/devices/waveshare-p4-panel/main/idf_component.yml b/devices/waveshare-p4-panel/main/idf_component.yml new file mode 100644 index 0000000..e92a09b --- /dev/null +++ b/devices/waveshare-p4-panel/main/idf_component.yml @@ -0,0 +1,12 @@ +## IDF Component Manager Manifest File +## https://docs.espressif.com/projects/esp-idf/en/latest/esp32p4/api-guides/tools/idf-component-manager.html +dependencies: + # Waveshare 10.1" MIPI DSI display driver (JD9365) + waveshare/esp_lcd_jd9365_10_1: "*" + + # WebSocket client + espressif/esp_websocket_client: "^1.0.0" + + # ESP-IDF (implicit but declaring minimum) + idf: + version: ">=5.3.0" diff --git a/devices/waveshare-p4-panel/main/main.c b/devices/waveshare-p4-panel/main/main.c new file mode 100644 index 0000000..a65b91a --- /dev/null +++ b/devices/waveshare-p4-panel/main/main.c @@ -0,0 +1,235 @@ +/** + * DreamStack Thin Client — Waveshare ESP32-P4 10.1" Panel + * + * Firmware that turns the panel into a dumb pixel display + * with touch input. All rendering happens on the source device. + * + * Flow: WiFi → WebSocket → receive delta frames → blit to display + * Touch → encode event → send over WebSocket + * + * Dependencies (via ESP Component Registry): + * - waveshare/esp_lcd_jd9365_10_1 (10.1" MIPI DSI display driver) + * - espressif/esp_websocket_client (WebSocket client) + */ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "esp_wifi.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_lcd_panel_ops.h" +#include "esp_websocket_client.h" + +#include "ds_codec.h" +#include "ds_protocol.h" + +static const char *TAG = "ds-panel"; + +// ─── Configuration (set via menuconfig or hardcode for POC) ─── +#define PANEL_WIDTH 800 +#define PANEL_HEIGHT 1280 +#define PIXEL_BYTES 2 // RGB565 +#define FB_SIZE (PANEL_WIDTH * PANEL_HEIGHT * PIXEL_BYTES) // ~2MB + +#define WIFI_SSID CONFIG_WIFI_SSID +#define WIFI_PASS CONFIG_WIFI_PASS +#define RELAY_URL CONFIG_RELAY_URL // e.g. "ws://192.168.1.100:9100/stream/home" + +// ─── Framebuffers (in PSRAM) ─── +static uint8_t *framebuffer; // Current display state +static uint8_t *scratch_buf; // Temp buffer for delta decode + +// ─── Display handle ─── +static esp_lcd_panel_handle_t panel_handle = NULL; + +// ─── Touch state ─── +static uint16_t input_seq = 0; + +// ─── WebSocket event handler ─── +static void ws_event_handler(void *arg, esp_event_base_t base, + int32_t event_id, void *event_data) { + esp_websocket_event_data_t *data = (esp_websocket_event_data_t *)event_data; + + switch (event_id) { + case WEBSOCKET_EVENT_CONNECTED: + ESP_LOGI(TAG, "WebSocket connected to relay"); + break; + + case WEBSOCKET_EVENT_DATA: + if (data->data_len < DS_HEADER_SIZE) break; + + ds_header_t hdr; + if (ds_parse_header((const uint8_t *)data->data_ptr, &hdr) != 0) break; + + const uint8_t *payload = (const uint8_t *)data->data_ptr + DS_HEADER_SIZE; + size_t payload_len = data->data_len - DS_HEADER_SIZE; + + switch (hdr.frame_type) { + case DS_FRAME_PIXELS: + // Full keyframe — copy directly to framebuffer + if (payload_len == FB_SIZE) { + memcpy(framebuffer, payload, FB_SIZE); + esp_lcd_panel_draw_bitmap(panel_handle, + 0, 0, PANEL_WIDTH, PANEL_HEIGHT, framebuffer); + ESP_LOGI(TAG, "Keyframe received (%zu bytes)", payload_len); + } + break; + + case DS_FRAME_DELTA: + // Delta frame — RLE decode + XOR apply + if (ds_apply_delta_rle(framebuffer, FB_SIZE, + payload, payload_len, scratch_buf) == 0) { + esp_lcd_panel_draw_bitmap(panel_handle, + 0, 0, PANEL_WIDTH, PANEL_HEIGHT, framebuffer); + } else { + ESP_LOGW(TAG, "Delta decode failed (len=%zu)", payload_len); + } + break; + + case DS_FRAME_PING: + // Respond with pong (same message back) + break; + + case DS_FRAME_END: + ESP_LOGI(TAG, "Stream ended"); + break; + } + break; + + case WEBSOCKET_EVENT_DISCONNECTED: + ESP_LOGW(TAG, "WebSocket disconnected, reconnecting..."); + break; + + case WEBSOCKET_EVENT_ERROR: + ESP_LOGE(TAG, "WebSocket error"); + break; + } +} + +// ─── Send touch event over WebSocket ─── +static void send_touch_event(esp_websocket_client_handle_t ws, + uint8_t id, uint16_t x, uint16_t y, uint8_t phase) { + uint8_t buf[DS_HEADER_SIZE + sizeof(ds_touch_event_t)]; + ds_touch_event_t touch = { .id = id, .x = x, .y = y, .phase = phase }; + size_t len = ds_encode_touch(buf, input_seq++, + (uint32_t)(esp_timer_get_time() / 1000), + &touch); + esp_websocket_client_send_bin(ws, (const char *)buf, len, portMAX_DELAY); +} + +// ─── Touch polling task ─── +// +// TODO: Replace with actual GT9271 I2C touch driver. +// The Waveshare BSP should provide touch reading functions. +// This is a placeholder showing the integration pattern. +// +static void touch_task(void *arg) { + esp_websocket_client_handle_t ws = (esp_websocket_client_handle_t)arg; + + while (1) { + // TODO: Read from GT9271 touch controller via I2C + // Example (pseudocode): + // + // gt9271_touch_data_t td; + // if (gt9271_read(&td) == ESP_OK && td.num_points > 0) { + // for (int i = 0; i < td.num_points; i++) { + // send_touch_event(ws, td.points[i].id, + // td.points[i].x, td.points[i].y, + // td.points[i].phase); + // } + // } + + vTaskDelay(pdMS_TO_TICKS(10)); // 100Hz touch polling + } +} + +// ─── Display initialization ─── +// +// TODO: Initialize MIPI DSI display using Waveshare component. +// Add `waveshare/esp_lcd_jd9365_10_1` to idf_component.yml +// +static esp_err_t display_init(void) { + // TODO: Configure MIPI DSI bus and JD9365 panel driver + // Example (pseudocode): + // + // esp_lcd_dsi_bus_config_t bus_cfg = { ... }; + // esp_lcd_new_dsi_bus(&bus_cfg, &dsi_bus); + // + // esp_lcd_panel_dev_config_t panel_cfg = { + // .reset_gpio_num = ..., + // .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, + // .bits_per_pixel = 16, // RGB565 + // }; + // esp_lcd_new_panel_jd9365_10_1(dsi_bus, &panel_cfg, &panel_handle); + // esp_lcd_panel_init(panel_handle); + + ESP_LOGI(TAG, "Display initialized (%dx%d RGB565)", PANEL_WIDTH, PANEL_HEIGHT); + return ESP_OK; +} + +// ─── WiFi initialization ─── +static void wifi_init(void) { + esp_netif_init(); + esp_event_loop_create_default(); + esp_netif_create_default_wifi_sta(); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + esp_wifi_init(&cfg); + + wifi_config_t wifi_cfg = { + .sta = { + .ssid = WIFI_SSID, + .password = WIFI_PASS, + }, + }; + esp_wifi_set_mode(WIFI_MODE_STA); + esp_wifi_set_config(WIFI_IF_STA, &wifi_cfg); + esp_wifi_start(); + esp_wifi_connect(); + + ESP_LOGI(TAG, "WiFi connecting to %s...", WIFI_SSID); +} + +// ─── Main ─── +void app_main(void) { + ESP_LOGI(TAG, "DreamStack Thin Client v0.1"); + ESP_LOGI(TAG, "Panel: %dx%d @ %d bpp = %d bytes", + PANEL_WIDTH, PANEL_HEIGHT, PIXEL_BYTES * 8, FB_SIZE); + + // Initialize NVS (required for WiFi) + nvs_flash_init(); + + // Allocate framebuffers in PSRAM + framebuffer = heap_caps_calloc(1, FB_SIZE, MALLOC_CAP_SPIRAM); + scratch_buf = heap_caps_calloc(1, FB_SIZE, MALLOC_CAP_SPIRAM); + if (!framebuffer || !scratch_buf) { + ESP_LOGE(TAG, "Failed to allocate framebuffers in PSRAM (%d bytes each)", FB_SIZE); + return; + } + ESP_LOGI(TAG, "Framebuffers allocated in PSRAM (%d MB each)", FB_SIZE / (1024 * 1024)); + + // Initialize display + display_init(); + + // Initialize WiFi + wifi_init(); + vTaskDelay(pdMS_TO_TICKS(3000)); // Wait for WiFi connection + + // Connect WebSocket to relay + esp_websocket_client_config_t ws_cfg = { + .uri = RELAY_URL, + .buffer_size = 64 * 1024, // 64KB receive buffer + }; + esp_websocket_client_handle_t ws = esp_websocket_client_init(&ws_cfg); + esp_websocket_register_events(ws, WEBSOCKET_EVENT_ANY, ws_event_handler, NULL); + esp_websocket_client_start(ws); + ESP_LOGI(TAG, "WebSocket connecting to %s...", RELAY_URL); + + // Start touch polling task + xTaskCreate(touch_task, "touch", 4096, ws, 5, NULL); + + ESP_LOGI(TAG, "Thin client running. Waiting for frames..."); +} diff --git a/docs/fabric-display-build-guide.md b/docs/fabric-display-build-guide.md new file mode 100644 index 0000000..9311df6 --- /dev/null +++ b/docs/fabric-display-build-guide.md @@ -0,0 +1,316 @@ +# Fabric Display Build Guide + +> **Goal:** Build an interactive, networked display on fabric — combining the electroluminescent textile concepts from [Shi et al. (Nature, 2021)](https://www.nature.com/articles/s41586-021-03295-8) and the LED-on-fabric approach from [Carpetlight / LED Professional](https://www.led-professional.com/resources-1/articles/lighting-fabrics-a-new-approach-for-flexible-light-sources). + +--- + +## 1. Technology Landscape + +The two source articles represent opposite ends of the same spectrum: + +| | Nature Paper (EL Textile) | Carpetlight (LED Fabric) | +|---|---|---| +| **Light source** | ZnS:Cu phosphor EL units at warp-weft contacts | Discrete SMD LEDs on miniature PCBs | +| **Pixel pitch** | ~800µm (research-grade) | ~10–20mm (commercial) | +| **Addressing** | AC field at fiber intersections | Standard LED driver (DMX/PWM) | +| **Flexibility** | Fully woven, machine-washable | Rip-stop polyamide, rollable | +| **DIY feasibility** | Lab-only (ionic gel electrodes, custom fibers) | **Highly practical** | +| **Interactivity** | Demonstrated textile keyboard (capacitive) | External control only | + +**Bottom line:** The Nature paper's exact process (ionic gel transparent electrodes, ZnS:Cu phosphor-coated fibers, industrial weaving) is not reproducible outside a materials science lab. But its *architecture* — a woven grid where intersections are pixels, with integrated capacitive touch — can be replicated using commercially available components. + +--- + +## 2. Three Practical Build Approaches + +### Approach A: Addressable LED Matrix on Fabric (Recommended Start) + +The most accessible path. Uses off-the-shelf components to create a flexible, interactive pixel grid on textile. + +#### Bill of Materials + +| Component | Specific Product | Source | Est. Cost | +|---|---|---|---| +| LED panel | WS2812B 16×16 flexible matrix (256px) | AliExpress, Adafruit, SuperLightingLED | $15–40 | +| Substrate fabric | Rip-stop nylon (1.1oz, silicone-coated) | Ripstop by the Roll, Amazon | $5–15 | +| Controller | ESP32-S3 DevKit | Adafruit, SparkFun, Mouser | $8–15 | +| Touch sensing | MPR121 capacitive breakout (12 channels) | Adafruit (#1982), SparkFun | $8 | +| Touch electrodes | Conductive thread (stainless steel or silver-coated) | Adafruit (#641), SparkFun | $3–8 | +| Power | 5V 4A USB-C power bank or wall adapter | Amazon | $10–20 | +| Logic level shifter | 74AHCT125 or SN74HCT245 (3.3V→5V) | Adafruit, Mouser | $2 | +| Diffusion layer | White ripstop nylon or organza | Fabric store | $3–5 | +| Protection | 1000µF capacitor, 330Ω resistor | Any electronics supplier | $1 | + +**Total: ~$55–115** + +#### Construction Steps + +**Step 1 — Prepare the fabric substrate** +- Cut rip-stop nylon to desired panel size + 2cm margin on all sides +- Mark a grid for the LED panel position and touch zones +- If using multiple LED panels (e.g., 4× 8×8 to make 16×16), plan the daisy-chain data path in a serpentine pattern + +**Step 2 — Mount LEDs to fabric** +- **Option A (simplest):** Use flexible WS2812B matrix panels. Bond to fabric with E6000 flexible adhesive or fabric glue. The flexible PCB substrate bends with the fabric. +- **Option B (like Carpetlight):** Create fabric pockets/sleeves for LED strips. Sew channels from rip-stop, slide strips in. Allows removal for washing. +- **Option C (closest to Nature paper):** Use individual WS2812B modules. Sew each LED to fabric using conductive thread for power/ground rails, with thin silicone wire for the data line. + +**Step 3 — Wire the LED matrix** +``` +Power Supply (5V, 4A+) + │ + ├──► 1000µF capacitor across V+ and GND + │ + ├──► LED Matrix V+ (inject power every 64 LEDs) + │ + └──► ESP32 Vin + │ + GPIO pin ──► 330Ω resistor ──► 74AHCT125 ──► LED Data In +``` + +- Use silicone-jacketed wire (30 AWG) for flexibility +- For matrices >128 LEDs, inject power at multiple points to prevent voltage drop +- Common ground between ESP32 and LED power supply is **critical** + +**Step 4 — Add capacitive touch** +- Embroider touch zones onto the fabric using conductive thread +- Create isolated zones (e.g., 4×3 grid = 12 touch areas matching MPR121's 12 inputs) +- Route conductive thread traces to an edge connector area +- Keep positive and negative traces at least 3mm apart to avoid shorts +- Connect to MPR121 breakout via I²C (SDA/SCL to ESP32) + +``` +Conductive Thread Layout (back of fabric): +┌─────────────────────────────┐ +│ [Zone1] [Zone2] [Zone3] │ +│ [Zone4] [Zone5] [Zone6] │ ← Embroidered conductive pads +│ [Zone7] [Zone8] [Zone9] │ +│ ... │ +│ ════════════════════════ │ ← Thread traces to edge +│ → MPR121 breakout board │ +└─────────────────────────────┘ +``` + +**Step 5 — Diffusion layer** +- Layer white organza or thin white rip-stop over the LED matrix +- A 5–10mm spacer (foam or spacer fabric mesh) between LEDs and diffusion layer softens the hotspots into smooth pixel blobs +- Sew or Velcro the diffusion layer for removability + +**Step 6 — ESP32 firmware** +```cpp +// Core libraries +#include +#include +#include + +#define NUM_LEDS 256 +#define DATA_PIN 16 +#define MATRIX_W 16 +#define MATRIX_H 16 + +CRGB leds[NUM_LEDS]; +Adafruit_MPR121 cap = Adafruit_MPR121(); + +void setup() { + FastLED.addLeds(leds, NUM_LEDS); + FastLED.setMaxPowerInVoltsAndMilliamps(5, 4000); // limit current + FastLED.setBrightness(80); + cap.begin(0x5A); // MPR121 default I2C address +} + +void loop() { + uint16_t touched = cap.touched(); + for (int i = 0; i < 12; i++) { + if (touched & (1 << i)) { + // Map touch zone i to pixel region and update + setTouchZoneColor(i, CRGB::White); + } + } + FastLED.show(); + delay(16); // ~60fps +} + +// Map 12 touch zones to 16x16 pixel regions +void setTouchZoneColor(int zone, CRGB color) { + int zx = zone % 3; // 3 columns of touch zones + int zy = zone / 3; // 4 rows of touch zones + int px = zx * 5; // each zone covers ~5 pixels wide + int py = zy * 4; // each zone covers ~4 pixels tall + for (int y = py; y < py + 4 && y < MATRIX_H; y++) { + for (int x = px; x < px + 5 && x < MATRIX_W; x++) { + int idx = (y % 2 == 0) ? (y * MATRIX_W + x) : (y * MATRIX_W + (MATRIX_W - 1 - x)); // serpentine + leds[idx] = color; + } + } +} +``` + +--- + +### Approach B: EL Wire/Panel Woven Grid + +Closer to the Nature paper's warp-weft concept, using commercial EL materials. + +#### Key Components + +| Component | Product | Source | Notes | +|---|---|---|---| +| EL wire (warp) | 2.3mm EL wire, multiple colors | Adafruit, SparkFun, Ellumiglow | Each color = separate AC channel | +| Conductive fiber (weft) | Silver-coated nylon thread (235Ω/ft) | Adafruit (#641) | Woven perpendicular to EL wire | +| AC inverter | 3V or 12V EL inverter | SparkFun, Adafruit | Converts DC→AC (100-200V, 1kHz) | +| AC switching | Opto-triacs (MOC3021) + triacs (BT136) | Mouser, DigiKey | One per EL channel | +| Controller | Arduino Nano or ESP32 | Standard | Drives opto-triacs via GPIO | +| Frame | Embroidery hoop or lightweight aluminum | Craft store | Keeps the weave taut | + +#### Architecture + +``` +EL Wire Segments (warp, vertical) + ║ ║ ║ ║ ║ +════╬═══╬═══╬═══╬═══╬════ ← Conductive thread (weft, horizontal) + ║ ║ ║ ║ ║ +════╬═══╬═══╬═══╬═══╬════ + ║ ║ ║ ║ ║ + +Each ╬ = potential EL pixel (glows where AC passes through intersection) +``` + +**How it works:** +- EL wire segments run vertically (warp) +- Conductive threads run horizontally (weft) +- Applying AC between a specific warp wire and weft thread illuminates only their intersection +- **Row-column scanning** (multiplexing) addresses individual pixels, just like the Nature paper + +> ⚠️ **Caution:** EL wire operates at 100–200V AC. Proper insulation, isolated opto-triac drivers, and careful handling are essential. This approach requires intermediate electronics experience. + +#### Practical pixel resolution +- EL wire: 2.3mm diameter → minimum pitch ~5mm with spacing +- Achievable grid: ~20×20 pixels per 10cm² panel +- Color: limited to EL wire color choices (blue, green, orange, white, pink) + +--- + +### Approach C: Screen-Printed EL Ink on Fabric + +Closest to the Nature paper's pixel density, but requires screen printing equipment. + +#### Materials + +| Layer | Material | Supplier | +|---|---|---| +| **Base electrode** | Silver conductive ink (screen-printable) | Sun Chemical (SunTronic), Creative Materials | +| **Dielectric** | Barium titanate dielectric paste | Saralon, SPLinx | +| **Phosphor** | ZnS:Cu EL phosphor paste (SaralEL Display Ink) | Saralon (Blue/Green/Orange/White) | +| **Top electrode** | PEDOT:PSS transparent conductive ink | Heraeus (Clevios), Sigma-Aldrich | +| **Substrate** | Tightly-woven polyester or cotton fabric | Any fabric supplier | + +#### Process (per panel) + +1. Screen-print silver conductive traces on fabric (bottom electrode grid pattern) +2. Cure at 130°C for 10 min +3. Screen-print dielectric layer over the electrode pattern +4. Cure at 130°C for 10 min +5. Screen-print ZnS:Cu phosphor layer over dielectric +6. Cure at 130°C for 10 min +7. Screen-print transparent PEDOT:PSS top electrode +8. Cure, then seal with flexible polyurethane coating +9. Connect bus bars to AC inverter (60–200V, 400–1000Hz) + +> ⚠️ This requires screen printing equipment, a curing oven, and access to specialty inks (~$50–200 per ink system from Saralon). Best suited for maker spaces with printing facilities. + +--- + +## 3. Adding Interactivity + +All approaches support the same input methods: + +### Capacitive Touch (recommended) +- **Behind the display:** Embroider conductive thread pads on the back of the fabric, behind pixel zones +- **Controller:** MPR121 (12-channel) or FDC2214 (4-channel, higher sensitivity) connected to ESP32 +- **Principle:** Human finger changes capacitance through the fabric layers; controller detects the change +- **Thread choices:** + - Stainless steel thread (Adafruit #641) — durable, moderate conductivity + - Silver-coated nylon (Adafruit #640) — higher conductivity, less durable after washing + +### Pressure/Force Sensing +- **Velostat/Eeonyx:** Sandwich conductive fabric + piezoresistive sheet + conductive fabric +- **Use case:** Detect where and how hard someone presses +- **Resolution:** One analog reading per zone + +### Gesture (proximity) +- **APDS-9960:** Detects hand swipes 10–20cm from the fabric surface +- **Use case:** Touchless control layer + +--- + +## 4. Networking with DreamStack + +The fabric display becomes a **DreamStack streaming endpoint**: + +``` +┌──────────────────────────────────┐ +│ ESP32 on Fabric │ +│ │ +│ signal pixels = [256 × RGB] │──► DreamStack bitstream +│ signal touch_zones = [12 × bool]│ via WiFi → relay +│ │ +│ on touch_zone[i] changed: │ +│ mutate pixels[zone_region] │ +└──────────────────────────────────┘ + ▲ │ + │ ▼ + Remote Input Remote Viewer + (phone/laptop) (any browser) +``` + +**Key integration points:** +- Pixel state is a flat signal array — efficient for bitstream delta encoding +- Touch events generate mutations that propagate upstream through the relay +- Remote clients can push pixel data downstream (animations, text, images) +- Conflict resolution (version counters) arbitrates simultaneous fabric-touch + remote-touch + +--- + +## 5. Supplier Quick Reference + +| Category | Supplier | URL | Key Products | +|---|---|---|---| +| Addressable LEDs | Adafruit | adafruit.com | NeoPixel matrices, strips | +| Addressable LEDs | SuperLightingLED | superlightingled.com | Flexible WS2812B panels | +| EL wire/thread | Ellumiglow | ellumiglow.com | SewGlo EL thread, EL wire | +| EL wire | SparkFun | sparkfun.com | EL wire, inverters, sequencers | +| EL inks | Saralon | saralon.com | SaralEL Display Inks (screen-print) | +| EL inks | SPLinx | splinx.eu | EL coatings and varnishes | +| Conductive thread | Adafruit | adafruit.com | Stainless (#641), silver (#640) | +| Conductive fabric | LessEMF | lessemf.com | Shielding fabric, conductive textiles | +| Touch IC | Adafruit | adafruit.com | MPR121 breakout (#1982) | +| Fiber optic fabric | Light Up Wear | lightupwear.com | Pre-woven fiber optic fabric | +| LED-on-fabric (commercial) | Forster Rohner | ffrosti.com | e-broidery LED textiles | +| Microcontrollers | Adafruit/SparkFun | — | ESP32-S3, Pico W | + +--- + +## 6. Comparison: Which Approach For What? + +```mermaid +graph LR + A["Want to build
this weekend?"] -->|Yes| B["Approach A
LED Matrix on Fabric"] + A -->|"Want EL glow
aesthetic"| C["Approach B
EL Wire Grid"] + A -->|"Want highest
pixel density"| D["Approach C
Screen-Print EL Ink"] + B --> E["+ Touch + ESP32
= Interactive Display"] + C --> E + D --> E + E --> F["+ DreamStack
= Networked Display"] +``` + +| | Approach A | Approach B | Approach C | +|---|---|---|---| +| **Time to build** | 1–2 days | 1 week | 2+ weeks | +| **Cost** | $55–115 | $80–150 | $200–500 | +| **Pixel count** | 256+ (16×16 or larger) | ~100–400 | ~1000+ | +| **Color** | Full RGB | Limited (EL colors) | Limited (phosphor colors) | +| **Flexibility** | Good (flexible PCB) | Excellent (wire) | Good (printed) | +| **Brightness** | High | Low-medium | Low | +| **Interactivity** | Easy (capacitive touch) | Moderate | Moderate | +| **Washable** | With removable pockets | Fragile | With PU sealing | +| **Skills needed** | Basic soldering, sewing | Electronics + HV safety | Screen printing + chemistry | diff --git a/docs/fabric-display-overview.md b/docs/fabric-display-overview.md new file mode 100644 index 0000000..9beabe2 --- /dev/null +++ b/docs/fabric-display-overview.md @@ -0,0 +1,79 @@ +# Interactive Fabric Display — Overview + +> Based on research from: +> - [Large-area display textiles integrated with functional systems (Nature, 2021)](https://www.nature.com/articles/s41586-021-03295-8) +> - [Lighting Fabrics - A New Approach for Flexible Light Sources (LED Professional)](https://www.led-professional.com/resources-1/articles/lighting-fabrics-a-new-approach-for-flexible-light-sources) + +## What These Articles Describe + +**Nature paper (Shi et al., 2021):** A breakthrough in **woven electroluminescent (EL) display textiles**. They weave conductive weft fibres and luminescent warp fibres together, creating ~500,000 EL pixel units at each weft-warp contact point, spaced ~800µm apart. The result is a 6m × 25cm flexible, breathable, machine-washable display fabric. They demonstrated an integrated system with a **textile keyboard** (capacitive touch) and **textile power supply** — essentially a full wearable communication device. + +**LED Professional (Carpetlight):** A commercial approach to **LED-on-fabric lighting** — miniature PCBs on rip-stop polyamide, connected by conductive embroidered threads. Controllable via **DMX protocol**, tunable white (2800–5400K), and extremely lightweight (300g for a 2×1ft panel). Currently used in film/TV lighting. + +--- + +## How to Build an Interactive Display from These Concepts + +There are **three tiers**, depending on how deep you want to go: + +### Tier 1: Accessible Now (LED Matrix on Fabric) +Use commercially available components to approximate the research: + +| Component | Product | Est. Cost | +|---|---|---| +| **LED matrix** | WS2812B/SK6812 flexible LED strips or panels (e.g., 16×16 NeoPixel matrix) | $15–60 | +| **Substrate** | Sew/bond onto rip-stop nylon or felt | $5–10 | +| **Controller** | ESP32 or Raspberry Pi Pico W | $5–15 | +| **Touch input** | Capacitive touch sensors (MPR121) or conductive thread embroidery | $5–15 | +| **Power** | LiPo battery + boost converter | $10–20 | + +**The architecture:** +1. **Addressable LED grid** sewn onto fabric → each LED is a "pixel" +2. **Capacitive touch zones** using conductive thread (like the Nature paper's keyboard) +3. **ESP32 running a DreamStack bitstream** → the display state is a signal graph, touch events mutate it, and the whole thing streams over the relay for remote interaction + +### Tier 2: Electroluminescent (Closer to the Nature Paper) +Use **EL wire/panels** woven or sewn into fabric: + +- **EL wire** segments as individual addressable lines +- **AC inverter** with multiplexer (e.g., custom PCB or commercial EL sequencer) +- **Woven grid pattern** — horizontal EL wires crossed with conductive warp threads +- Achievable pixel resolution: ~5–10mm pitch (vs. the paper's 800µm) + +### Tier 3: Full Research Replication +This requires lab equipment — ZnS:Cu phosphor-coated fibres, ionic gel transparent electrodes, and an industrial loom. Not practical outside a university materials science lab. + +--- + +## Where DreamStack Fits + +This is a perfect use case for bitstream streaming: + +``` +┌─────────────────────────────┐ +│ Fabric Display (ESP32) │ +│ ┌───────────────────────┐ │ +│ │ LED Matrix State │──┼──► DreamStack Bitstream +│ │ (signal per pixel) │ │ (streams over relay) +│ ├───────────────────────┤ │ +│ │ Touch Sensor Input │──┼──► Mutations +│ └───────────────────────┘ │ +└─────────────────────────────┘ + ▲ │ + │ ▼ + Remote Control Viewer + (phone/web) (any screen) +``` + +- The **fabric display's pixel state** is a DreamStack signal array +- **Touch on the fabric** generates mutations that stream upstream +- A **remote viewer/controller** (phone, web) can also push state down to the fabric +- Conflict resolution handles simultaneous fabric-touch + remote-touch + +--- + +## Possible Next Steps + +1. **A DreamStack `.ds` program** that models a fabric display grid as a streaming signal matrix +2. **An ESP32 firmware sketch** for driving a WS2812B matrix with capacitive touch, speaking the bitstream protocol +3. **A web-based simulator/controller** — a visual grid that mirrors the fabric display in real-time over the relay diff --git a/docs/integration.md b/docs/integration.md new file mode 100644 index 0000000..1f3008c --- /dev/null +++ b/docs/integration.md @@ -0,0 +1,118 @@ +# DreamStack Integration Guide + +Embed DreamStack apps into any website with the standalone SDK (~3KB). + +## Quick Start + +### 1. Iframe Embed + +```html + +``` + +### 2. Web Component + +```html + + +``` + +### 3. JavaScript API + +```html +
+ + +``` + +## Framework Examples + +### React +```jsx +import { useEffect, useRef } from 'react'; + +function DreamStackEmbed({ src }) { + const ref = useRef(null); + useEffect(() => { + const handle = DreamStack.connect(src, ref.current); + return () => handle.destroy(); + }, [src]); + return
; +} +``` + +### Vue +```vue + + +``` + +## Build Flags + +```bash +# Standard build +dreamstack build app.ds + +# Minified (strips whitespace, ~17% smaller) +dreamstack build app.ds --minify + +# Both optimizations are always active: +# - DOM helpers (shorthand functions, ~3KB saved) +# - Tree-shaking (unused runtime features stripped, ~40-50% saved) +``` + +## Signal Bridge Protocol + +DreamStack apps communicate via `postMessage`: + +```js +// Send to DreamStack app +iframe.contentWindow.postMessage({ + type: 'ds:signal', + name: 'playerName', + value: 'Alice' +}, '*'); + +// Receive from DreamStack app +window.addEventListener('message', (e) => { + if (e.data?.type === 'ds:signal') { + console.log(e.data.name, '=', e.data.value); + } +}); +``` + +## Size Budget + +| Build Mode | Size | Reduction | +|---|---|---| +| Default | ~95 KB | baseline | +| DOM helpers (auto) | ~95 KB | -3% | +| Tree-shaken (auto) | ~52 KB | -46% | +| + Minified | ~44 KB | -54% | +| Gzipped | ~8 KB | ~92% | diff --git a/engine/ds-stream-wasm/src/lib.rs b/engine/ds-stream-wasm/src/lib.rs index b46b5dd..d92a8e0 100644 --- a/engine/ds-stream-wasm/src/lib.rs +++ b/engine/ds-stream-wasm/src/lib.rs @@ -17,8 +17,19 @@ pub const FRAME_PIXELS: u8 = 0x01; pub const FRAME_COMPRESSED: u8 = 0x02; pub const FRAME_DELTA: u8 = 0x03; pub const FRAME_AUDIO_PCM: u8 = 0x10; +pub const FRAME_AUDIO_COMPRESSED: u8 = 0x11; +pub const FRAME_HAPTIC: u8 = 0x20; +pub const FRAME_ACTUATOR: u8 = 0x21; +pub const FRAME_LED_MATRIX: u8 = 0x22; pub const FRAME_SIGNAL_SYNC: u8 = 0x30; pub const FRAME_SIGNAL_DIFF: u8 = 0x31; +pub const FRAME_SCHEMA_ANNOUNCE: u8 = 0x32; +pub const FRAME_SUBSCRIBE_FILTER: u8 = 0x33; +pub const FRAME_NEURAL_FRAME: u8 = 0x40; +pub const FRAME_NEURAL_AUDIO: u8 = 0x41; +pub const FRAME_NEURAL_ACTUATOR: u8 = 0x42; +pub const FRAME_NEURAL_LATENT: u8 = 0x43; +pub const FRAME_KEYFRAME: u8 = 0xF0; pub const FRAME_PING: u8 = 0xFE; pub const FRAME_END: u8 = 0xFF; @@ -33,7 +44,17 @@ pub const INPUT_PTR_DOWN: u8 = 0x02; pub const INPUT_PTR_UP: u8 = 0x03; pub const INPUT_KEY_DOWN: u8 = 0x10; pub const INPUT_KEY_UP: u8 = 0x11; +pub const INPUT_TOUCH: u8 = 0x20; +pub const INPUT_TOUCH_END: u8 = 0x21; +pub const INPUT_GAMEPAD_AXIS: u8 = 0x30; +pub const INPUT_GAMEPAD_BUTTON: u8 = 0x31; +pub const INPUT_MIDI: u8 = 0x40; pub const INPUT_SCROLL: u8 = 0x50; +pub const INPUT_RESIZE: u8 = 0x60; +pub const INPUT_VOICE: u8 = 0x70; +pub const INPUT_CAMERA: u8 = 0x71; +pub const INPUT_SENSOR: u8 = 0x80; +pub const INPUT_BCI: u8 = 0x90; // ─── Header Encode/Decode ─── @@ -200,6 +221,58 @@ pub fn input_message(input_type: u8, seq: u16, timestamp: u32, payload: &[u8]) - build_message(input_type, FLAG_INPUT, seq, timestamp, 0, 0, payload) } +// ─── Neural Frame Builders ─── + +/// Build a neural frame message (model output tensor). +#[wasm_bindgen] +pub fn neural_frame_message(seq: u16, timestamp: u32, width: u16, height: u16, tensor_data: &[u8]) -> Vec { + build_message(FRAME_NEURAL_FRAME, 0, seq, timestamp, width, height, tensor_data) +} + +/// Build a neural audio synthesis output message. +#[wasm_bindgen] +pub fn neural_audio_message(seq: u16, timestamp: u32, audio_data: &[u8]) -> Vec { + build_message(FRAME_NEURAL_AUDIO, 0, seq, timestamp, 0, 0, audio_data) +} + +/// Build a neural actuator command message. +#[wasm_bindgen] +pub fn neural_actuator_message(seq: u16, timestamp: u32, command_data: &[u8]) -> Vec { + build_message(FRAME_NEURAL_ACTUATOR, 0, seq, timestamp, 0, 0, command_data) +} + +/// Build a neural latent space representation message. +#[wasm_bindgen] +pub fn neural_latent_message(seq: u16, timestamp: u32, latent_data: &[u8]) -> Vec { + build_message(FRAME_NEURAL_LATENT, 0, seq, timestamp, 0, 0, latent_data) +} + +// ─── Audio Frame Builder ─── + +/// Build an Opus-compressed audio frame message. +#[wasm_bindgen] +pub fn audio_compressed_message(seq: u16, timestamp: u32, channels: u16, sample_rate_div100: u16, opus_data: &[u8]) -> Vec { + build_message(FRAME_AUDIO_COMPRESSED, FLAG_COMPRESSED, seq, timestamp, channels, sample_rate_div100, opus_data) +} + +// ─── MIDI Input Builder ─── + +/// Build a MIDI input message: status(u8), data1(u8), data2(u8). +#[wasm_bindgen] +pub fn midi_input_message(seq: u16, timestamp: u32, status: u8, data1: u8, data2: u8) -> Vec { + build_message(INPUT_MIDI, FLAG_INPUT, seq, timestamp, 0, 0, &[status, data1, data2]) +} + +/// Build a sensor input message: sensor_type(u8), x(i16), y(i16), z(i16). +#[wasm_bindgen] +pub fn sensor_input_message(seq: u16, timestamp: u32, sensor_type: u8, x: i16, y: i16, z: i16) -> Vec { + let mut payload = vec![sensor_type]; + payload.extend_from_slice(&x.to_le_bytes()); + payload.extend_from_slice(&y.to_le_bytes()); + payload.extend_from_slice(&z.to_le_bytes()); + build_message(INPUT_SENSOR, FLAG_INPUT, seq, timestamp, 0, 0, &payload) +} + // ─── Tests ─── #[cfg(test)] @@ -223,7 +296,6 @@ mod tests { #[test] fn test_rle_compression_ratio() { - // 1000 zeros should compress to 3 bytes let data = vec![0u8; 1000]; let encoded = rle_encode(&data); assert_eq!(encoded.len(), 3); @@ -246,9 +318,8 @@ mod tests { let mut curr = vec![0u8; 100]; curr[50] = 0xFF; curr[51] = 0xAB; - let compressed = encode_delta_rle(&curr, &prev); - assert!(compressed.len() < 100); // Should compress well + assert!(compressed.len() < 100); let reconstructed = decode_delta_rle(&compressed, &prev); assert_eq!(reconstructed, curr); } @@ -259,15 +330,57 @@ mod tests { assert!(msg.len() == HEADER_SIZE + 12); let header = decode_header(&msg); assert_eq!(header[0], FRAME_SIGNAL_DIFF as u32); - assert_eq!(header[6], 12); // payload length + assert_eq!(header[6], 12); } #[test] fn test_input_message() { - let payload = vec![100u8, 0, 200, 0, 1]; // x=100, y=200, buttons=1 + let payload = vec![100u8, 0, 200, 0, 1]; let msg = input_message(INPUT_POINTER, 0, 0, &payload); let header = decode_header(&msg); assert_eq!(header[0], INPUT_POINTER as u32); assert_eq!(header[1], FLAG_INPUT as u32); } + + #[test] + fn test_neural_frame_message() { + let tensor = vec![0u8; 64]; + let msg = neural_frame_message(1, 100, 4, 4, &tensor); + let header = decode_header(&msg); + assert_eq!(header[0], FRAME_NEURAL_FRAME as u32); + assert_eq!(header[4], 4); + assert_eq!(header[5], 4); + assert_eq!(header[6], 64); + } + + #[test] + fn test_audio_compressed_message() { + let opus = vec![0xAA; 128]; + let msg = audio_compressed_message(1, 200, 2, 480, &opus); + let header = decode_header(&msg); + assert_eq!(header[0], FRAME_AUDIO_COMPRESSED as u32); + assert_eq!(header[1], FLAG_COMPRESSED as u32); + assert_eq!(header[4], 2); + assert_eq!(header[5], 480); + } + + #[test] + fn test_midi_input_message() { + let msg = midi_input_message(1, 100, 0x90, 60, 100); + let header = decode_header(&msg); + assert_eq!(header[0], INPUT_MIDI as u32); + assert_eq!(header[1], FLAG_INPUT as u32); + assert_eq!(msg[HEADER_SIZE], 0x90); + assert_eq!(msg[HEADER_SIZE + 1], 60); + assert_eq!(msg[HEADER_SIZE + 2], 100); + } + + #[test] + fn test_sensor_input_message() { + let msg = sensor_input_message(1, 100, 0, 100, -200, 9800); + let header = decode_header(&msg); + assert_eq!(header[0], INPUT_SENSOR as u32); + assert_eq!(header[1], FLAG_INPUT as u32); + assert_eq!(msg[HEADER_SIZE], 0); + } } diff --git a/engine/ds-stream/src/codec.rs b/engine/ds-stream/src/codec.rs index c86d271..b4c14a1 100644 --- a/engine/ds-stream/src/codec.rs +++ b/engine/ds-stream/src/codec.rs @@ -240,6 +240,74 @@ pub fn stream_end(seq: u16, timestamp: u32) -> Vec { encode_frame(FrameType::End, seq, timestamp, 0, 0, 0, &[]) } +// ─── Neural Frame Builders ─── + +/// Build a neural frame message (model output tensor as pixels). +pub fn neural_frame(seq: u16, timestamp: u32, width: u16, height: u16, tensor_data: &[u8]) -> Vec { + encode_frame(FrameType::NeuralFrame, seq, timestamp, width, height, 0, tensor_data) +} + +/// Build a neural audio synthesis output message. +pub fn neural_audio(seq: u16, timestamp: u32, audio_data: &[u8]) -> Vec { + encode_frame(FrameType::NeuralAudio, seq, timestamp, 0, 0, 0, audio_data) +} + +/// Build a neural actuator command message (learned motor control). +pub fn neural_actuator(seq: u16, timestamp: u32, command_data: &[u8]) -> Vec { + encode_frame(FrameType::NeuralActuator, seq, timestamp, 0, 0, 0, command_data) +} + +/// Build a neural latent space representation message. +pub fn neural_latent(seq: u16, timestamp: u32, latent_data: &[u8]) -> Vec { + encode_frame(FrameType::NeuralLatent, seq, timestamp, 0, 0, 0, latent_data) +} + +// ─── Audio Frame Builder ─── + +/// Build an Opus-compressed audio frame message. +pub fn audio_compressed(seq: u16, timestamp: u32, channels: u16, sample_rate_div100: u16, opus_data: &[u8]) -> Vec { + encode_frame(FrameType::AudioCompressed, seq, timestamp, channels, sample_rate_div100, FLAG_COMPRESSED, opus_data) +} + +// ─── Remaining Input Builders ─── + +/// Build a MIDI input message. +pub fn midi_input(seq: u16, timestamp: u32, event: &MidiEvent) -> Vec { + encode_input(InputType::Midi, seq, timestamp, &event.encode()) +} + +/// Build a voice/audio input message (header + PCM payload). +pub fn voice_input(seq: u16, timestamp: u32, event: &VoiceInputEvent, pcm_data: &[u8]) -> Vec { + let header_bytes = event.encode(); + let mut payload = Vec::with_capacity(header_bytes.len() + pcm_data.len()); + payload.extend_from_slice(&header_bytes); + payload.extend_from_slice(pcm_data); + encode_input(InputType::VoiceInput, seq, timestamp, &payload) +} + +/// Build a camera frame input message (header + frame payload). +pub fn camera_input(seq: u16, timestamp: u32, event: &CameraInputEvent, frame_data: &[u8]) -> Vec { + let header_bytes = event.encode(); + let mut payload = Vec::with_capacity(header_bytes.len() + frame_data.len()); + payload.extend_from_slice(&header_bytes); + payload.extend_from_slice(frame_data); + encode_input(InputType::CameraInput, seq, timestamp, &payload) +} + +/// Build a sensor telemetry input message. +pub fn sensor_input(seq: u16, timestamp: u32, event: &SensorInputEvent) -> Vec { + encode_input(InputType::SensorInput, seq, timestamp, &event.encode()) +} + +/// Build a BCI (brain-computer interface) input message (header + samples payload). +pub fn bci_input(seq: u16, timestamp: u32, event: &BciInputEvent, samples: &[u8]) -> Vec { + let header_bytes = event.encode(); + let mut payload = Vec::with_capacity(header_bytes.len() + samples.len()); + payload.extend_from_slice(&header_bytes); + payload.extend_from_slice(samples); + encode_input(InputType::BciInput, seq, timestamp, &payload) +} + // ─── Tests ─── #[cfg(test)] @@ -428,4 +496,104 @@ mod tests { let decoded = decode_message(&msg).unwrap(); assert_eq!(decoded.header.frame_type, InputType::GamepadButton as u8); } + + #[test] + fn neural_frame_builders() { + let tensor = vec![0.5f32, 0.3, 0.8, 0.1].iter() + .flat_map(|f| f.to_le_bytes()).collect::>(); + let msg = neural_frame(1, 100, 2, 2, &tensor); + let decoded = decode_message(&msg).unwrap(); + assert_eq!(decoded.header.frame_type, FrameType::NeuralFrame as u8); + assert_eq!(decoded.header.width, 2); + assert_eq!(decoded.header.height, 2); + assert_eq!(decoded.payload, &tensor[..]); + } + + #[test] + fn neural_audio_builder() { + let audio = vec![0u8; 256]; + let msg = neural_audio(1, 200, &audio); + let decoded = decode_message(&msg).unwrap(); + assert_eq!(decoded.header.frame_type, FrameType::NeuralAudio as u8); + assert_eq!(decoded.payload.len(), 256); + } + + #[test] + fn neural_actuator_builder() { + let cmd = vec![1, 128, 0, 64]; // actuator command + let msg = neural_actuator(1, 300, &cmd); + let decoded = decode_message(&msg).unwrap(); + assert_eq!(decoded.header.frame_type, FrameType::NeuralActuator as u8); + } + + #[test] + fn neural_latent_builder() { + let latent = vec![0u8; 512]; // latent vector + let msg = neural_latent(1, 400, &latent); + let decoded = decode_message(&msg).unwrap(); + assert_eq!(decoded.header.frame_type, FrameType::NeuralLatent as u8); + assert_eq!(decoded.payload.len(), 512); + } + + #[test] + fn audio_compressed_builder() { + let opus = vec![0xAA; 128]; // fake opus data + let msg = audio_compressed(1, 500, 2, 480, &opus); + let decoded = decode_message(&msg).unwrap(); + assert_eq!(decoded.header.frame_type, FrameType::AudioCompressed as u8); + assert_eq!(decoded.header.width, 2); // channels + assert_eq!(decoded.header.height, 480); // sample_rate/100 + assert_eq!(decoded.header.flags & FLAG_COMPRESSED, FLAG_COMPRESSED); + } + + #[test] + fn midi_input_builder() { + let evt = MidiEvent { status: 0x90, data1: 60, data2: 100 }; + let msg = midi_input(1, 100, &evt); + let decoded = decode_message(&msg).unwrap(); + assert_eq!(decoded.header.frame_type, InputType::Midi as u8); + assert!(decoded.header.is_input()); + let evt2 = MidiEvent::decode(decoded.payload).unwrap(); + assert_eq!(evt2.status, 0x90); + } + + #[test] + fn sensor_input_builder() { + let evt = SensorInputEvent { sensor_type: 0, x: 100, y: -200, z: 9800 }; + let msg = sensor_input(1, 100, &evt); + let decoded = decode_message(&msg).unwrap(); + assert_eq!(decoded.header.frame_type, InputType::SensorInput as u8); + let evt2 = SensorInputEvent::decode(decoded.payload).unwrap(); + assert_eq!(evt2.z, 9800); + } + + #[test] + fn voice_input_builder() { + let header = VoiceInputEvent { sample_rate: 48000, channels: 1, format: 0 }; + let pcm = vec![0u8; 960]; // 10ms of mono f32 at 48kHz + let msg = voice_input(1, 100, &header, &pcm); + let decoded = decode_message(&msg).unwrap(); + assert_eq!(decoded.header.frame_type, InputType::VoiceInput as u8); + assert_eq!(decoded.payload.len(), VoiceInputEvent::SIZE + 960); + } + + #[test] + fn camera_input_builder() { + let header = CameraInputEvent { width: 640, height: 480, format: 1 }; + let jpeg = vec![0xFFu8; 1024]; + let msg = camera_input(1, 100, &header, &jpeg); + let decoded = decode_message(&msg).unwrap(); + assert_eq!(decoded.header.frame_type, InputType::CameraInput as u8); + assert_eq!(decoded.payload.len(), CameraInputEvent::SIZE + 1024); + } + + #[test] + fn bci_input_builder() { + let header = BciInputEvent { channel_count: 8, sample_rate: 256 }; + let samples = vec![0u8; 32]; // 8 channels × 1 f32 sample + let msg = bci_input(1, 100, &header, &samples); + let decoded = decode_message(&msg).unwrap(); + assert_eq!(decoded.header.frame_type, InputType::BciInput as u8); + assert_eq!(decoded.payload.len(), BciInputEvent::SIZE + 32); + } } diff --git a/engine/ds-stream/src/main.rs b/engine/ds-stream/src/main.rs index 67338e4..cdc0b95 100644 --- a/engine/ds-stream/src/main.rs +++ b/engine/ds-stream/src/main.rs @@ -1,8 +1,8 @@ //! DreamStack Bitstream Relay Server //! -//! Usage: `cargo run -p ds-stream` +//! Usage: `cargo run -p ds-stream [OPTIONS]` //! -//! Starts a WebSocket relay on port 9100. +//! Starts a WebSocket relay on port 9100 (default). //! - Source connects to ws://localhost:9100/source //! - Receivers connect to ws://localhost:9100/stream @@ -10,17 +10,86 @@ use ds_stream::relay::{run_relay, RelayConfig}; #[tokio::main] async fn main() { - let port = std::env::args() - .nth(1) - .and_then(|s| s.parse::().ok()) - .unwrap_or(9100); + let args: Vec = std::env::args().collect(); - let config = RelayConfig { - addr: format!("0.0.0.0:{}", port).parse().unwrap(), - ..Default::default() - }; + let mut config = RelayConfig::default(); - eprintln!("Starting DreamStack Bitstream Relay on port {}...", port); + // Parse arguments: --port, --replay-depth, --record, --federate, --max-receivers, --max-channels + let mut i = 1; + while i < args.len() { + match args[i].as_str() { + "--port" | "-p" => { + i += 1; + if let Some(val) = args.get(i) { + if let Ok(port) = val.parse::() { + config.addr = format!("0.0.0.0:{}", port).parse().unwrap(); + } + } + } + "--replay-depth" => { + i += 1; + if let Some(val) = args.get(i) { + if let Ok(depth) = val.parse::() { + config.replay_depth = depth; + } + } + } + "--record" => { + i += 1; + if let Some(val) = args.get(i) { + config.recording_dir = Some(val.clone()); + } + } + "--federate" => { + i += 1; + if let Some(val) = args.get(i) { + config.federation_upstreams.push(val.clone()); + } + } + "--max-receivers" => { + i += 1; + if let Some(val) = args.get(i) { + if let Ok(n) = val.parse::() { + config.max_receivers = n; + } + } + } + "--max-channels" => { + i += 1; + if let Some(val) = args.get(i) { + if let Ok(n) = val.parse::() { + config.max_channels = n; + } + } + } + "--help" | "-h" => { + eprintln!("DreamStack Bitstream Relay Server\n"); + eprintln!("USAGE:"); + eprintln!(" ds-stream [OPTIONS]\n"); + eprintln!("OPTIONS:"); + eprintln!(" -p, --port Port to listen on (default: 9100)"); + eprintln!(" --replay-depth Frames to keep in replay buffer (default: 0 = disabled)"); + eprintln!(" --record Directory to record frames to (.dsrec files)"); + eprintln!(" --federate Upstream relay URL (can be repeated)"); + eprintln!(" --max-receivers Max receivers per channel (default: 64)"); + eprintln!(" --max-channels Max channels (default: 256)"); + eprintln!(" -h, --help Print help"); + std::process::exit(0); + } + other => { + // Legacy: first positional arg = port + if let Ok(port) = other.parse::() { + config.addr = format!("0.0.0.0:{}", port).parse().unwrap(); + } else { + eprintln!("Unknown argument: {other}. Use --help for usage."); + std::process::exit(1); + } + } + } + i += 1; + } + + eprintln!("Starting DreamStack Bitstream Relay on {}...", config.addr); if let Err(e) = run_relay(config).await { eprintln!("Relay error: {}", e); std::process::exit(1); diff --git a/engine/ds-stream/src/protocol.rs b/engine/ds-stream/src/protocol.rs index be9fdca..5910222 100644 --- a/engine/ds-stream/src/protocol.rs +++ b/engine/ds-stream/src/protocol.rs @@ -446,6 +446,172 @@ impl ResizeEvent { } } +/// MIDI input event: status byte + two data bytes. +#[derive(Debug, Clone, Copy)] +pub struct MidiEvent { + /// MIDI status byte (e.g., 0x90 = note on, 0x80 = note off) + pub status: u8, + /// First data byte (e.g., note number 0-127) + pub data1: u8, + /// Second data byte (e.g., velocity 0-127) + pub data2: u8, +} + +impl MidiEvent { + pub const SIZE: usize = 3; + + pub fn encode(&self) -> [u8; Self::SIZE] { + [self.status, self.data1, self.data2] + } + + pub fn decode(buf: &[u8]) -> Option { + if buf.len() < Self::SIZE { + return None; + } + Some(Self { + status: buf[0], + data1: buf[1], + data2: buf[2], + }) + } +} + +/// Voice/audio input header. Payload follows as raw PCM samples. +#[derive(Debug, Clone, Copy)] +pub struct VoiceInputEvent { + /// Sample rate in Hz (e.g., 16000, 44100, 48000) + pub sample_rate: u16, + /// Number of channels (1 = mono, 2 = stereo) + pub channels: u8, + /// Format: 0 = f32, 1 = i16, 2 = opus + pub format: u8, +} + +impl VoiceInputEvent { + pub const SIZE: usize = 4; + + pub fn encode(&self) -> [u8; Self::SIZE] { + let mut buf = [0u8; Self::SIZE]; + buf[0..2].copy_from_slice(&self.sample_rate.to_le_bytes()); + buf[2] = self.channels; + buf[3] = self.format; + buf + } + + pub fn decode(buf: &[u8]) -> Option { + if buf.len() < Self::SIZE { + return None; + } + Some(Self { + sample_rate: u16::from_le_bytes([buf[0], buf[1]]), + channels: buf[2], + format: buf[3], + }) + } +} + +/// Camera frame input header. Payload follows as compressed image data. +#[derive(Debug, Clone, Copy)] +pub struct CameraInputEvent { + /// Frame width in pixels + pub width: u16, + /// Frame height in pixels + pub height: u16, + /// Format: 0 = RGBA, 1 = JPEG, 2 = WebP, 3 = H264 NAL + pub format: u8, +} + +impl CameraInputEvent { + pub const SIZE: usize = 5; + + pub fn encode(&self) -> [u8; Self::SIZE] { + let mut buf = [0u8; Self::SIZE]; + buf[0..2].copy_from_slice(&self.width.to_le_bytes()); + buf[2..4].copy_from_slice(&self.height.to_le_bytes()); + buf[4] = self.format; + buf + } + + pub fn decode(buf: &[u8]) -> Option { + if buf.len() < Self::SIZE { + return None; + } + Some(Self { + width: u16::from_le_bytes([buf[0], buf[1]]), + height: u16::from_le_bytes([buf[2], buf[3]]), + format: buf[4], + }) + } +} + +/// Sensor telemetry input (accelerometer, gyroscope, magnetometer, etc.). +#[derive(Debug, Clone, Copy)] +pub struct SensorInputEvent { + /// Sensor type: 0 = accelerometer, 1 = gyroscope, 2 = magnetometer, 3 = orientation + pub sensor_type: u8, + /// X-axis value (scaled: real_value * 1000) + pub x: i16, + /// Y-axis value (scaled: real_value * 1000) + pub y: i16, + /// Z-axis value (scaled: real_value * 1000) + pub z: i16, +} + +impl SensorInputEvent { + pub const SIZE: usize = 7; + + pub fn encode(&self) -> [u8; Self::SIZE] { + let mut buf = [0u8; Self::SIZE]; + buf[0] = self.sensor_type; + buf[1..3].copy_from_slice(&self.x.to_le_bytes()); + buf[3..5].copy_from_slice(&self.y.to_le_bytes()); + buf[5..7].copy_from_slice(&self.z.to_le_bytes()); + buf + } + + pub fn decode(buf: &[u8]) -> Option { + if buf.len() < Self::SIZE { + return None; + } + Some(Self { + sensor_type: buf[0], + x: i16::from_le_bytes([buf[1], buf[2]]), + y: i16::from_le_bytes([buf[3], buf[4]]), + z: i16::from_le_bytes([buf[5], buf[6]]), + }) + } +} + +/// BCI (Brain-Computer Interface) input header. Payload follows as f32 samples. +#[derive(Debug, Clone, Copy)] +pub struct BciInputEvent { + /// Number of EEG/neural channels + pub channel_count: u8, + /// Sample rate in Hz + pub sample_rate: u16, +} + +impl BciInputEvent { + pub const SIZE: usize = 3; + + pub fn encode(&self) -> [u8; Self::SIZE] { + let mut buf = [0u8; Self::SIZE]; + buf[0] = self.channel_count; + buf[1..3].copy_from_slice(&self.sample_rate.to_le_bytes()); + buf + } + + pub fn decode(buf: &[u8]) -> Option { + if buf.len() < Self::SIZE { + return None; + } + Some(Self { + channel_count: buf[0], + sample_rate: u16::from_le_bytes([buf[1], buf[2]]), + }) + } +} + // ─── Tests ─── @@ -589,4 +755,79 @@ mod tests { fn gamepad_axis_too_short() { assert!(GamepadAxisEvent::decode(&[0u8; 2]).is_none()); } + + #[test] + fn midi_event_roundtrip() { + let evt = MidiEvent { status: 0x90, data1: 60, data2: 100 }; + let encoded = evt.encode(); + let decoded = MidiEvent::decode(&encoded).unwrap(); + assert_eq!(decoded.status, 0x90); + assert_eq!(decoded.data1, 60); + assert_eq!(decoded.data2, 100); + } + + #[test] + fn midi_event_too_short() { + assert!(MidiEvent::decode(&[0u8; 2]).is_none()); + } + + #[test] + fn voice_input_event_roundtrip() { + let evt = VoiceInputEvent { sample_rate: 48000, channels: 2, format: 0 }; + let encoded = evt.encode(); + let decoded = VoiceInputEvent::decode(&encoded).unwrap(); + assert_eq!(decoded.sample_rate, 48000); + assert_eq!(decoded.channels, 2); + assert_eq!(decoded.format, 0); + } + + #[test] + fn voice_input_event_too_short() { + assert!(VoiceInputEvent::decode(&[0u8; 3]).is_none()); + } + + #[test] + fn camera_input_event_roundtrip() { + let evt = CameraInputEvent { width: 1280, height: 720, format: 2 }; + let encoded = evt.encode(); + let decoded = CameraInputEvent::decode(&encoded).unwrap(); + assert_eq!(decoded.width, 1280); + assert_eq!(decoded.height, 720); + assert_eq!(decoded.format, 2); + } + + #[test] + fn camera_input_event_too_short() { + assert!(CameraInputEvent::decode(&[0u8; 4]).is_none()); + } + + #[test] + fn sensor_input_event_roundtrip() { + let evt = SensorInputEvent { sensor_type: 1, x: -1000, y: 500, z: 9800 }; + let encoded = evt.encode(); + let decoded = SensorInputEvent::decode(&encoded).unwrap(); + assert_eq!(decoded.sensor_type, 1); + assert_eq!(decoded.x, -1000); + assert_eq!(decoded.y, 500); + assert_eq!(decoded.z, 9800); + } + + #[test] + fn sensor_input_event_too_short() { + assert!(SensorInputEvent::decode(&[0u8; 6]).is_none()); + } + + #[test] + fn bci_input_event_roundtrip() { + let evt = BciInputEvent { channel_count: 32, sample_rate: 256 }; + let encoded = evt.encode(); + let decoded = BciInputEvent::decode(&encoded).unwrap(); + assert_eq!(decoded.channel_count, 32); + assert_eq!(decoded.sample_rate, 256); + } + + #[test] + fn bci_input_event_too_short() { + assert!(BciInputEvent::decode(&[0u8; 2]).is_none()); + } } diff --git a/engine/ds-stream/src/relay.rs b/engine/ds-stream/src/relay.rs index 947a1bc..0fa5656 100644 --- a/engine/ds-stream/src/relay.rs +++ b/engine/ds-stream/src/relay.rs @@ -58,6 +58,13 @@ pub struct RelayConfig { pub channel_gc_interval_secs: u64, /// Source reconnect grace period in seconds — keep cache alive after source disconnect. pub source_reconnect_grace_secs: u64, + /// Replay depth: number of frames to keep in ring buffer for time-travel replay. + /// Set to 0 to disable replay (default: 0, catchup-only). Set >0 for full replay. + pub replay_depth: usize, + /// Upstream relay URLs for federation — frames are forwarded to these relays. + pub federation_upstreams: Vec, + /// Recording directory — if set, incoming frames are written to disk. + pub recording_dir: Option, } impl Default for RelayConfig { @@ -71,6 +78,9 @@ impl Default for RelayConfig { max_channels: 256, channel_gc_interval_secs: 60, source_reconnect_grace_secs: 30, + replay_depth: 0, + federation_upstreams: Vec::new(), + recording_dir: None, } } } @@ -109,6 +119,11 @@ pub struct StateCache { /// Accumulated signal diffs since last sync. /// Late-joining receivers get: last_signal_sync + all diffs. pub pending_signal_diffs: Vec>, + /// Replay ring buffer — stores the last N frames for time-travel replay. + /// When replay_depth > 0, receivers can request historical frames. + pub replay_buffer: Vec>, + /// Maximum replay buffer depth (0 = disabled). + pub replay_depth: usize, } impl StateCache { @@ -120,6 +135,14 @@ impl StateCache { let frame_type = msg[0]; let flags = msg[1]; + // Add to replay ring buffer if enabled + if self.replay_depth > 0 { + self.replay_buffer.push(msg.to_vec()); + if self.replay_buffer.len() > self.replay_depth { + self.replay_buffer.remove(0); + } + } + match FrameType::from_u8(frame_type) { // Cache keyframes (pixel or signal sync) Some(FrameType::Pixels) if flags & FLAG_KEYFRAME != 0 => { @@ -266,6 +289,7 @@ impl StateCache { self.last_keyframe = None; self.last_signal_sync = None; self.pending_signal_diffs.clear(); + self.replay_buffer.clear(); } /// Returns true if this cache has any state. @@ -273,6 +297,22 @@ impl StateCache { self.last_keyframe.is_some() || self.last_signal_sync.is_some() || !self.pending_signal_diffs.is_empty() + || !self.replay_buffer.is_empty() + } + + /// Get the replay buffer frames for time-travel playback. + /// Returns frames from `start_index` onwards. + pub fn replay_frames(&self, start_index: usize) -> &[Vec] { + if start_index < self.replay_buffer.len() { + &self.replay_buffer[start_index..] + } else { + &[] + } + } + + /// Total number of frames in the replay buffer. + pub fn replay_len(&self) -> usize { + self.replay_buffer.len() } } @@ -298,7 +338,7 @@ struct ChannelState { } impl ChannelState { - fn new(frame_buffer_size: usize, max_receivers: usize) -> Self { + fn new(frame_buffer_size: usize, max_receivers: usize, replay_depth: usize) -> Self { let (frame_tx, _) = broadcast::channel(frame_buffer_size); let (input_tx, input_rx) = mpsc::channel(256); let (signaling_tx, _) = broadcast::channel(64); @@ -308,7 +348,10 @@ impl ChannelState { input_rx: Some(input_rx), signaling_tx, stats: RelayStats::default(), - cache: StateCache::default(), + cache: StateCache { + replay_depth, + ..StateCache::default() + }, source_disconnect_time: None, max_receivers, schema: None, @@ -344,16 +387,22 @@ struct RelayState { max_channels: usize, /// Server start time start_time: Instant, + /// Replay depth for new channels + replay_depth: usize, + /// Recording directory (None = disabled) + recording_dir: Option, } impl RelayState { - fn new(frame_buffer_size: usize, max_receivers: usize, max_channels: usize) -> Self { + fn new(frame_buffer_size: usize, max_receivers: usize, max_channels: usize, replay_depth: usize, recording_dir: Option) -> Self { Self { channels: HashMap::new(), frame_buffer_size, max_receivers, max_channels, start_time: Instant::now(), + replay_depth, + recording_dir, } } @@ -369,6 +418,7 @@ impl RelayState { let channel = Arc::new(RwLock::new(ChannelState::new( self.frame_buffer_size, self.max_receivers, + self.replay_depth, ))); self.channels.insert(name.to_string(), channel.clone()); Some(channel) @@ -403,6 +453,29 @@ fn parse_path(path: &str) -> ConnectionRole { } } +/// Check if a channel name matches a wildcard pattern (channel groups). +/// Supports `*` at the end for prefix matching: `games/*` matches `games/chess`. +pub fn channel_matches(pattern: &str, channel: &str) -> bool { + if pattern == channel { + return true; + } + if let Some(prefix) = pattern.strip_suffix("/*") { + return channel.starts_with(prefix) && channel.len() > prefix.len(); + } + if pattern == "*" { + return true; + } + false +} + +/// Find all channels matching a wildcard pattern. +pub(crate) fn find_matching_channels(state: &RelayState, pattern: &str) -> Vec { + state.channels.keys() + .filter(|name| channel_matches(pattern, name)) + .cloned() + .collect() +} + /// Run the WebSocket relay server. pub async fn run_relay(config: RelayConfig) -> Result<(), Box> { let listener = TcpListener::bind(&config.addr).await?; @@ -419,12 +492,32 @@ pub async fn run_relay(config: RelayConfig) -> Result<(), Box 0 { + eprintln!("║ Replay depth: {:>4} frames ║", replay_depth); + } + if let Some(ref dir) = recording_dir { + eprintln!("║ Recording to: {} ║", dir); + // Ensure recording directory exists + std::fs::create_dir_all(dir).unwrap_or_else(|e| { + eprintln!("[relay] Warning: could not create recording dir {}: {}", dir, e); + }); + } + if !federation_upstreams.is_empty() { + eprintln!("║ Federation: {} upstream(s) ║", federation_upstreams.len()); + } + // Background: periodic stats + channel GC { let state = state.clone(); @@ -488,6 +581,52 @@ pub async fn run_relay(config: RelayConfig) -> Result<(), Box { + eprintln!("[relay:federation] Connected to {url}"); + backoff = Duration::from_secs(1); + + // Subscribe to the default channel and forward frames + let frame_rx = { + let s = state.read().await; + if let Some(ch) = s.channels.get("default") { + let cs = ch.read().await; + Some(cs.frame_tx.subscribe()) + } else { + None + } + }; + + if let Some(mut rx) = frame_rx { + while let Ok(frame) = rx.recv().await { + use futures_util::SinkExt; + if ws.send(Message::Binary(frame.into())).await.is_err() { + break; + } + } + } + + eprintln!("[relay:federation] Disconnected from {url}"); + } + Err(e) => { + eprintln!("[relay:federation] Failed to connect to {url}: {e}"); + } + } + // Exponential backoff on reconnect + tokio::time::sleep(backoff).await; + backoff = (backoff * 2).min(Duration::from_secs(30)); + } + }); + } + while let Ok((stream, addr)) = listener.accept().await { let state = state.clone(); let keepalive_interval = config.keepalive_interval_secs; @@ -717,7 +856,12 @@ async fn handle_connection( match role { ConnectionRole::Source(ref _name) => { eprintln!("[relay:{channel_name}] Source connected: {addr}"); - handle_source(ws_stream, addr, channel, &channel_name, keepalive_interval).await; + // Get recording_dir from relay state + let recording_dir = { + let s = state.read().await; + s.recording_dir.clone() + }; + handle_source(ws_stream, addr, channel, &channel_name, keepalive_interval, recording_dir).await; } ConnectionRole::Receiver(ref _name) => { eprintln!("[relay:{channel_name}] Receiver connected: {addr}"); @@ -743,6 +887,7 @@ async fn handle_source( channel: Arc>, channel_name: &str, keepalive_interval: u64, + recording_dir: Option, ) { let (mut ws_sink, mut ws_source) = ws_stream.split(); @@ -798,6 +943,28 @@ async fn handle_source( } }); + // Open recording file if configured + let mut recording_file = if let Some(ref dir) = recording_dir { + let path = format!("{}/{}.dsrec", dir, channel_name.replace('/', "_")); + match tokio::fs::OpenOptions::new() + .create(true) + .append(true) + .open(&path) + .await + { + Ok(f) => { + eprintln!("[relay:{channel_name}] Recording to {path}"); + Some(f) + } + Err(e) => { + eprintln!("[relay:{channel_name}] Warning: could not open recording file {path}: {e}"); + None + } + } + } else { + None + }; + // Receive frames from source → broadcast to receivers let channel_name_owned = channel_name.to_string(); while let Some(Ok(msg)) = ws_source.next().await { @@ -825,6 +992,15 @@ async fn handle_source( cs.stats.last_frame_timestamp = ts; } } + + // Record frame to disk (length-delimited: [u32 len][frame bytes]) + if let Some(ref mut file) = recording_file { + use tokio::io::AsyncWriteExt; + let len_bytes = (data_vec.len() as u32).to_le_bytes(); + let _ = file.write_all(&len_bytes).await; + let _ = file.write_all(&data_vec).await; + } + // Broadcast to all receivers on this channel let _ = frame_tx.send(data_vec); } @@ -1330,7 +1506,7 @@ mod tests { #[test] fn channel_state_creation() { - let mut state = RelayState::new(16, 64, 256); + let mut state = RelayState::new(16, 64, 256, 0, None); let ch1 = state.get_or_create_channel("main").unwrap(); let ch2 = state.get_or_create_channel("player1").unwrap(); let ch1_again = state.get_or_create_channel("main").unwrap(); @@ -1342,7 +1518,7 @@ mod tests { #[test] fn channel_max_limit() { - let mut state = RelayState::new(16, 64, 2); + let mut state = RelayState::new(16, 64, 2, 0, None); assert!(state.get_or_create_channel("a").is_some()); assert!(state.get_or_create_channel("b").is_some()); assert!(state.get_or_create_channel("c").is_none()); // max reached @@ -1351,13 +1527,13 @@ mod tests { #[test] fn channel_idle_detection() { - let cs = ChannelState::new(16, 64); + let cs = ChannelState::new(16, 64, 0); assert!(cs.is_idle()); // no source, no receivers, no cache } #[test] fn channel_not_idle_with_cache() { - let mut cs = ChannelState::new(16, 64); + let mut cs = ChannelState::new(16, 64, 0); let sync = crate::codec::signal_sync_frame(0, 0, b"{}"); cs.cache.process_frame(&sync); assert!(!cs.is_idle()); // has cached state @@ -1365,27 +1541,27 @@ mod tests { #[test] fn channel_not_idle_with_source() { - let mut cs = ChannelState::new(16, 64); + let mut cs = ChannelState::new(16, 64, 0); cs.stats.source_connected = true; assert!(!cs.is_idle()); } #[test] fn channel_not_idle_with_receivers() { - let mut cs = ChannelState::new(16, 64); + let mut cs = ChannelState::new(16, 64, 0); cs.stats.connected_receivers = 1; assert!(!cs.is_idle()); } #[test] fn grace_period_not_expired_initially() { - let cs = ChannelState::new(16, 64); + let cs = ChannelState::new(16, 64, 0); assert!(!cs.grace_period_expired(30)); } #[test] fn grace_period_expired_after_disconnect() { - let mut cs = ChannelState::new(16, 64); + let mut cs = ChannelState::new(16, 64, 0); cs.source_disconnect_time = Some(Instant::now() - Duration::from_secs(60)); assert!(cs.grace_period_expired(30)); } @@ -1463,4 +1639,86 @@ mod tests { assert_eq!(merged["count"], 5); assert_eq!(merged["_v"]["count"], 3); // version preserved from diff } + + // ─── Channel Wildcard Tests ─── + + #[test] + fn channel_matches_exact() { + assert!(channel_matches("games/chess", "games/chess")); + assert!(!channel_matches("games/chess", "games/go")); + } + + #[test] + fn channel_matches_wildcard() { + assert!(channel_matches("games/*", "games/chess")); + assert!(channel_matches("games/*", "games/go")); + assert!(!channel_matches("games/*", "other/chess")); + assert!(!channel_matches("games/*", "games")); // no trailing segment + } + + #[test] + fn channel_matches_star_all() { + assert!(channel_matches("*", "anything")); + assert!(channel_matches("*", "games/chess")); + } + + #[test] + fn find_matching_channels_works() { + let mut state = RelayState::new(16, 64, 256, 0, None); + state.get_or_create_channel("games/chess").unwrap(); + state.get_or_create_channel("games/go").unwrap(); + state.get_or_create_channel("chat/main").unwrap(); + let mut matches = find_matching_channels(&state, "games/*"); + matches.sort(); + assert_eq!(matches, vec!["games/chess", "games/go"]); + } + + // ─── Replay Buffer Tests ─── + + #[test] + fn replay_buffer_stores_frames() { + let mut cache = StateCache { replay_depth: 3, ..Default::default() }; + let f1 = crate::codec::signal_diff_frame(0, 0, b"{\"a\":1}"); + let f2 = crate::codec::signal_diff_frame(1, 100, b"{\"a\":2}"); + let f3 = crate::codec::signal_diff_frame(2, 200, b"{\"a\":3}"); + cache.process_frame(&f1); + cache.process_frame(&f2); + cache.process_frame(&f3); + assert_eq!(cache.replay_len(), 3); + assert_eq!(cache.replay_frames(0).len(), 3); + assert_eq!(cache.replay_frames(1).len(), 2); + assert_eq!(cache.replay_frames(3).len(), 0); + } + + #[test] + fn replay_buffer_evicts_oldest() { + let mut cache = StateCache { replay_depth: 2, ..Default::default() }; + let f1 = crate::codec::signal_diff_frame(0, 0, b"{\"a\":1}"); + let f2 = crate::codec::signal_diff_frame(1, 100, b"{\"a\":2}"); + let f3 = crate::codec::signal_diff_frame(2, 200, b"{\"a\":3}"); + cache.process_frame(&f1); + cache.process_frame(&f2); + cache.process_frame(&f3); + assert_eq!(cache.replay_len(), 2); + // First frame should be evicted + assert_eq!(cache.replay_buffer[0], f2); + assert_eq!(cache.replay_buffer[1], f3); + } + + #[test] + fn replay_depth_propagates_to_channel() { + let mut state = RelayState::new(16, 64, 256, 100, None); + let ch = state.get_or_create_channel("test").unwrap(); + let cs = ch.try_read().unwrap(); + assert_eq!(cs.cache.replay_depth, 100); + } + + #[test] + fn replay_disabled_when_zero() { + let mut cache = StateCache::default(); + assert_eq!(cache.replay_depth, 0); + let f1 = crate::codec::signal_diff_frame(0, 0, b"{\"a\":1}"); + cache.process_frame(&f1); + assert_eq!(cache.replay_len(), 0); // Nothing stored when depth=0 + } } diff --git a/examples/mission-control.ds b/examples/mission-control.ds new file mode 100644 index 0000000..a109033 --- /dev/null +++ b/examples/mission-control.ds @@ -0,0 +1,213 @@ +-- ═══════════════════════════════════════════════════════════ +-- ⚡ DreamStack Playground +-- ═══════════════════════════════════════════════════════════ +-- One page. Everything visible. Click and watch data flow. +-- +-- dreamstack build examples/mission-control.ds -o /tmp/mission-control + +import { Card } from "../registry/components/card" +import { Badge } from "../registry/components/badge" + +-- ════════════════════════════════ +-- SIGNALS — the core of DreamStack +-- ════════════════════════════════ + +let score = 0 +let player = "Player 1" +let status = "idle" +let hp = 100 +let xp = 0 +let level = 1 +let inventory = ["Sword", "Shield", "Potion"] +let log = ["Game started"] + +-- Derived: auto-computed from source signals +let damage = score * 3 +let shield = hp > 50 +let rank = level * 10 + xp + +-- Spring: physics-animated value +let energy = spring(100) + +view main = column [ + text "⚡ DreamStack Playground" { variant: "title" } + + -- ════════════════════════════════ + -- SOURCE: You control signals here + -- ════════════════════════════════ + + row [ + -- SIGNAL CONTROL PANEL + Card { title: "🎮 Source Signals", subtitle: "change these → everything reacts" } [ + text "score" { variant: "subtitle" } + text "{score}" { variant: "title" } + row [ + button "+1" { click: score += 1, variant: "primary" } + button "+10" { click: score += 10, variant: "primary" } + button "0" { click: score = 0, variant: "ghost" } + ] + + text "hp" { variant: "subtitle" } + text "{hp}" { variant: "title" } + row [ + button "Hit -20" { click: hp -= 20, variant: "destructive" } + button "Heal +30" { click: hp += 30, variant: "primary" } + button "Full" { click: hp = 100, variant: "ghost" } + ] + + text "status" { variant: "subtitle" } + row [ + button "idle" { click: status = "idle", variant: "ghost" } + button "fighting" { click: status = "fighting", variant: "primary" } + button "dead" { click: status = "dead", variant: "destructive" } + ] + + text "level / xp" { variant: "subtitle" } + row [ + button "XP +5" { click: xp += 5, variant: "primary" } + button "Level Up" { click: level += 1, variant: "primary" } + ] + ] + + -- DERIVED SIGNALS — auto-updated + Card { title: "⚙️ Derived Signals", subtitle: "auto-computed, zero code" } [ + text "damage = score × 3" { variant: "subtitle" } + text "{damage}" { variant: "title" } + + text "shield = hp > 50" { variant: "subtitle" } + when shield -> + Badge { label: "SHIELD UP ✓", variant: "success" } + else -> + Badge { label: "SHIELD DOWN ✗", variant: "error" } + + text "rank = level × 10 + xp" { variant: "subtitle" } + text "{rank}" { variant: "title" } + + text "energy (spring)" { variant: "subtitle" } + text "{energy}" { variant: "title" } + row [ + button "Drain" { click: energy = 10, variant: "destructive" } + button "Charge" { click: energy = 100, variant: "primary" } + ] + ] + ] + + -- ════════════════════════════════ + -- REACTIVE UI — responds to signals + -- ════════════════════════════════ + + row [ + -- MATCH: status drives which badge shows + Card { title: "📊 Status Display", subtitle: "match status" } [ + match status + "idle" -> Badge { label: "💤 IDLE", variant: "info" } + "fighting" -> Badge { label: "⚔️ FIGHTING", variant: "warning" } + "dead" -> Badge { label: "💀 DEAD", variant: "error" } + _ -> Badge { label: "???", variant: "info" } + + -- WHEN/ELSE: conditional rendering + when hp > 80 -> + text "💚 Healthy" + when hp > 30 -> + text "💛 Wounded" + else -> + text "❤️ Critical!" + + when score > 20 -> + Badge { label: "🔥 ON FIRE", variant: "warning" } + ] + + -- EACH: dynamic list + Card { title: "🎒 Inventory", subtitle: "each + array methods" } [ + each item in inventory -> + row [ + Badge { label: item, variant: "info" } + button "Drop" { click: inventory.remove(_idx), variant: "ghost" } + ] + row [ + button "+Bow" { click: inventory.push("Bow"), variant: "primary" } + button "+Ring" { click: inventory.push("Ring"), variant: "primary" } + button "Sort" { click: inventory.sort(), variant: "ghost" } + button "Clear" { click: inventory.clear(), variant: "destructive" } + ] + ] + + -- INPUT BINDING + LOG + Card { title: "📝 Event Log", subtitle: "input bind + push" } [ + input { bind: player, placeholder: "Player name..." } + text "Playing as: {player}" { variant: "title" } + button "Log Score" { click: log.push(player), variant: "primary" } + each entry in log -> + text "→ {entry}" + ] + ] + + -- ════════════════════════════════ + -- EMBED: what a page needs to receive this + -- ════════════════════════════════ + + Card { title: "📡 Receiver — Live Signal Values", subtitle: "these signals stream to any receiver" } [ + row [ + column [ + text "score = {score}" + text "damage = {damage}" + text "hp = {hp}" + ] + column [ + text "shield = {shield}" + text "level = {level}" + text "rank = {rank}" + ] + column [ + text "status = {status}" + text "player = {player}" + text "xp = {xp}" + ] + ] + ] + + Card { title: "🔌 Embed Option 1 — iframe", subtitle: "one line, any website" } [ + text "Paste into any HTML page:" { variant: "subtitle" } + text "" + text "[iframe src=your-relay/view/game /]" + text "" + text "The compiled .ds app runs inside the iframe." + text "Self-contained, no dependencies." + Badge { label: "ZERO CONFIG", variant: "success" } + ] + + Card { title: "🔌 Embed Option 2 — JS API", subtitle: "vanilla JavaScript, full control" } [ + text "Add to any web page:" { variant: "subtitle" } + text "" + text "[script src=dreamstack-runtime.js]" + text "" + text " const game = DS._connectStream(RELAY_URL)" + text "" + text " game.on(score, (v) => scoreEl.textContent = v)" + text "" + text " game.on(hp, (v) => healthBar.style.width = v)" + text "" + text "[/script]" + text "" + Badge { label: "3 LINES OF JS", variant: "success" } + text "Works with React, Vue, Svelte, vanilla — anything." + ] + + Card { title: "🔌 Embed Option 3 — DreamStack .ds", subtitle: "full reactive receiver" } [ + text "Write a .ds file — compile to self-contained HTML:" { variant: "subtitle" } + text "" + text "let game = stream from RELAY_URL" + text "" + text "view main = column [" + text " text Score: (game.score)" + text " when game.hp is low ->" + text " text DANGER!" + text "]" + text "" + Badge { label: "FULL REACTIVITY", variant: "info" } + text "Remote signals become local reactive proxies." + text "Match, when/else, each — everything works on remote data." + ] +] + + diff --git a/examples/mission-source.ds b/examples/mission-source.ds new file mode 100644 index 0000000..5c3b09b --- /dev/null +++ b/examples/mission-source.ds @@ -0,0 +1,81 @@ +-- ═══════════════════════════════════════════════════════ +-- DreamStack Mission Control — Source +-- ═══════════════════════════════════════════════════════ +-- Simulates a spacecraft telemetry source that streams +-- signals to remote Mission Control dashboards. +-- +-- Run: +-- Tab 1: cargo run -p ds-stream (relay) +-- Tab 2: dreamstack stream examples/mission-source.ds --port 3000 +-- Tab 3: dreamstack dev examples/mission-control.ds (dashboard) + +-- ── Telemetry Signals ── +let altitude = 408 +let velocity = 7660 +let fuel = 87 +let heartRate = 72 +let oxygen = 98 +let temp = 21 +let status = "nominal" +let crew = ["Amir", "Nova", "Atlas"] +let logCount = 0 +let timestamp = 0 + +-- Computed signals +let orbitalPeriod = 90 +let fuelStatus = "normal" + +-- Stream telemetry via relay +stream telemetry on "ws://localhost:9100/peer/mission" { mode: signal, output: altitude, velocity, fuel, heartRate, oxygen, temp, status, crew, logCount, timestamp, orbitalPeriod, fuelStatus } + +view source = column [ + text "🛰️ Mission Source — ISS Telemetry" { variant: "title" } + text "Broadcasting to ws://localhost:9100/peer/mission" { variant: "subtitle" } + + row [ + column [ + text "── Orbital ──" + text "Altitude: {altitude} km" + text "Velocity: {velocity} m/s" + row [ + button "Boost" { click: velocity += 100, variant: "primary" } + button "Brake" { click: velocity -= 100, variant: "secondary" } + button "Raise" { click: altitude += 10, variant: "primary" } + button "Lower" { click: altitude -= 10, variant: "ghost" } + ] + ] + column [ + text "── Life Support ──" + text "❤️ {heartRate} bpm" + text "🫁 {oxygen}%" + text "🌡️ {temp}°C" + row [ + button "Exercise" { click: heartRate += 15, variant: "primary" } + button "Rest" { click: heartRate -= 10, variant: "ghost" } + ] + ] + ] + + row [ + column [ + text "── Fuel ──" + text "⛽ {fuel}%" + row [ + button "Burn" { click: fuel -= 5, variant: "destructive" } + button "Refuel" { click: fuel = 100, variant: "primary" } + ] + ] + column [ + text "── Status ──" + row [ + button "Nominal" { click: status = "nominal", variant: "primary" } + button "Warning" { click: status = "warning", variant: "secondary" } + button "Critical" { click: status = "critical", variant: "destructive" } + ] + ] + ] + + text "── Crew EVA Log ──" + text "Log entries: {logCount}" + button "Log EVA" { click: logCount += 1, variant: "primary" } +] diff --git a/sdk/dreamstack-embed.js b/sdk/dreamstack-embed.js new file mode 100644 index 0000000..8e39806 --- /dev/null +++ b/sdk/dreamstack-embed.js @@ -0,0 +1,135 @@ +/** + * DreamStack Embed SDK — ~3KB standalone + * Enables embedding DreamStack apps in any website. + * + * Usage: + * + * + * + * Or via JS API: + * DreamStack.connect('https://yourapp.com', '#container'); + */ +(function (root, factory) { + if (typeof module !== 'undefined' && module.exports) module.exports = factory(); + else root.DreamStack = factory(); +})(typeof globalThis !== 'undefined' ? globalThis : this, function () { + 'use strict'; + + // ── Iframe Embed ── + function embed(src, container, options) { + var opts = options || {}; + var el = typeof container === 'string' ? document.querySelector(container) : container; + if (!el) throw new Error('[DreamStack] Container not found: ' + container); + + var iframe = document.createElement('iframe'); + iframe.src = src; + iframe.style.border = 'none'; + iframe.style.width = opts.width || '100%'; + iframe.style.height = opts.height || '400px'; + iframe.style.borderRadius = opts.borderRadius || '12px'; + iframe.style.overflow = 'hidden'; + iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin'); + iframe.setAttribute('loading', 'lazy'); + + if (opts.className) iframe.className = opts.className; + el.appendChild(iframe); + + return { + iframe: iframe, + destroy: function () { el.removeChild(iframe); }, + resize: function (w, h) { + iframe.style.width = typeof w === 'number' ? w + 'px' : w; + iframe.style.height = typeof h === 'number' ? h + 'px' : h; + } + }; + } + + // ── Signal Bridge (bidirectional) ── + function connect(src, container, options) { + var handle = embed(src, container, options); + var listeners = {}; + + // Listen for messages from the DreamStack app + window.addEventListener('message', function (e) { + if (e.source !== handle.iframe.contentWindow) return; + var data = e.data; + if (data && data.type === 'ds:signal') { + var name = data.name; + if (listeners[name]) { + listeners[name].forEach(function (fn) { fn(data.value); }); + } + if (listeners['*']) { + listeners['*'].forEach(function (fn) { fn(name, data.value); }); + } + } + }); + + return { + iframe: handle.iframe, + destroy: handle.destroy, + resize: handle.resize, + + // Send a signal value to the DreamStack app + send: function (name, value) { + handle.iframe.contentWindow.postMessage( + { type: 'ds:signal', name: name, value: value }, '*' + ); + }, + + // Listen for signal changes from the DreamStack app + on: function (name, fn) { + if (!listeners[name]) listeners[name] = []; + listeners[name].push(fn); + return function () { + listeners[name] = listeners[name].filter(function (f) { return f !== fn; }); + }; + } + }; + } + + // ── Web Component: ── + if (typeof customElements !== 'undefined') { + customElements.define('ds-stream', class extends HTMLElement { + constructor() { + super(); + this._handle = null; + } + + connectedCallback() { + var src = this.getAttribute('src'); + if (!src) return; + + var shadow = this.attachShadow({ mode: 'open' }); + var wrapper = document.createElement('div'); + wrapper.style.width = '100%'; + wrapper.style.height = this.getAttribute('height') || '400px'; + shadow.appendChild(wrapper); + + this._handle = embed(src, wrapper, { + width: '100%', + height: '100%', + borderRadius: this.getAttribute('radius') || '12px' + }); + } + + disconnectedCallback() { + if (this._handle) this._handle.destroy(); + } + + static get observedAttributes() { return ['src', 'height']; } + attributeChangedCallback(name, old, val) { + if (name === 'src' && this._handle) { + this._handle.iframe.src = val; + } else if (name === 'height' && this._handle) { + this._handle.resize('100%', val); + } + } + }); + } + + return { + embed: embed, + connect: connect, + version: '0.1.0' + }; +});