ruview @ v2068
integrity
- size
- 65.5 MiB
- downloaded
- last checked
release notes
Automated release from CI pipeline
Changes: fix(ui): pose stream WebSocket 401s when RUVIEW_API_TOKEN is set (#1461) (#1462)
websocket.service.js (used by the pose/event streams) opened a bare
new WebSocket(url) with no ADR-272 ticket exchange, unlike
sensing.service.js which already mints a ticket per connect. Since a
browser cannot set an Authorization header on a WebSocket upgrade, and
the server rejects a long-lived bearer passed as a query string
(CWE-598), the pose stream 401'd whenever auth was on — visible in the
Live Demo tab as "Failed to create WebSocket connection".
Fix: createWebSocketWithTimeout() now strips any token query param a
caller put on the URL (pose.service.js does this) and exchanges the
stored bearer for a single-use ?ticket= via withWsTicket(), done at
this one choke point so every consumer (pose, events, training) and
every reconnect attempt gets a fresh ticket.
Second, smaller bug: pose-fusion/js/main.js auto-connected to a
hardcoded ws://localhost:8765/ws/sensing, but the Docker image serves
the sensing WebSocket on :3001 (the same 3000->3001 mapping
sensing.service.js already encodes) — the auto-connect dialed a port
nothing listens on. Reuses that port mapping and tickets both the
auto-connect and the manual "Connect" button.
Bumped the pose-fusion.html cache-buster (v=13 -> v=14) so browsers actually fetch the updated main.js.
Adds ui/services/websocket.service.test.mjs (4 executed Node tests, stubbed WebSocket/fetch/localStorage) covering: no-auth passthrough, ticket exchange + bearer-never-in-URL, stray ?token= stripping, and the pre-ADR-272 404 fallback. Wired into the CI "Run UI unit tests" step.
Reported with a verified fix in #1461 by wsc7r4zcj4-collab; this PR implements the same fix against current main with an added regression test.
Closes #1461
Docker Image:
ghcr.io/ruvnet/RuView:a70ca90525b9f724d9356c4cf75e10476550024c
download
curl -fL -o v2068.zip https://ratatoskr.space/pkg/ruview/v2068.zip
printf '%s %s\n' '1da1b372eeb52ca6cec9f3717bac38aa447accf2a1509fc46ddd98ebb2743741' 'v2068.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v2068.zip"
$out = "v2068.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "1da1b372eeb52ca6cec9f3717bac38aa447accf2a1509fc46ddd98ebb2743741") { throw "sha256 mismatch" }
curl -fL -o v2068.tar.gz https://ratatoskr.space/pkg/ruview/v2068.tar.gz
printf '%s %s\n' '2eadddb5444668def5591ce5135639c1579839e69c018aa80e5782e02e4b1be3' 'v2068.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v2068.tar.gz"
$out = "v2068.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "2eadddb5444668def5591ce5135639c1579839e69c018aa80e5782e02e4b1be3") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v2068.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2068.zip
printf '%s %s\n' '1da1b372eeb52ca6cec9f3717bac38aa447accf2a1509fc46ddd98ebb2743741' 'v2068.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2068.zip"
$out = "v2068.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "1da1b372eeb52ca6cec9f3717bac38aa447accf2a1509fc46ddd98ebb2743741") { throw "sha256 mismatch" }
curl -fL -o v2068.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2068.tar.gz
printf '%s %s\n' '2eadddb5444668def5591ce5135639c1579839e69c018aa80e5782e02e4b1be3' 'v2068.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2068.tar.gz"
$out = "v2068.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "2eadddb5444668def5591ce5135639c1579839e69c018aa80e5782e02e4b1be3") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v2068.zip | zip | 65.5 MiB |
blake3-24 9de9520bfcd710861ca0321eb1c28bd86d33bf63c39091d5
sha256 1da1b372eeb52ca6cec9f3717bac38aa447accf2a1509fc46ddd98ebb2743741
sha1 158c23a340d060a660688544a391d2cd01559a40
|
| v2068.tar.gz | tar.gz | 63.6 MiB |
blake3-24 5658b42bf63806947ea80d28a1fcfa377687051d3bb6375b
sha256 2eadddb5444668def5591ce5135639c1579839e69c018aa80e5782e02e4b1be3
sha1 c8d3c05a8ce59880b23d3d9bb88a0ed1638d9f86
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v2068.tar.gz"],
integrity = "sha256-Lq3dtURGaN71WRzlE1Y5wVeYOeacAYqoDleC4C5LG+M=",
strip_prefix = "ruview-v2068",
)
.url = "https://ratatoskr.space/pkg/ruview/v2068.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2068.tar.gz"],
integrity = "sha256-Lq3dtURGaN71WRzlE1Y5wVeYOeacAYqoDleC4C5LG+M=",
strip_prefix = "ruview-v2068",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2068.tar.gz",