Skip to content

feat(proxystatus): per-layer status ownership; move status.skysocks to skysocks-client - #4094

Merged
0pcom merged 1 commit into
skycoin:developfrom
0pcom:feat/per-layer-status-providers
Aug 23, 2026
Merged

feat(proxystatus): per-layer status ownership; move status.skysocks to skysocks-client#4094
0pcom merged 1 commit into
skycoin:developfrom
0pcom:feat/per-layer-status-providers

Conversation

@0pcom

@0pcom 0pcom commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator

Each resolving-proxy layer now owns exactly one reserved status host instead of every layer answering for all three.

  • Scope each resolver to its own surface. A new StatusSurface field on the dmsgweb/skynetweb runtime Config (checked right after proxystatus.Match) makes dmsg_web serve only status.dmsg and skynet_web serve only status.skynet. A matched status host for a different surface is not served — it falls through so the request continues up the chain to the owning layer. Empty surface keeps the old serve-any behavior for standalone runtimes/tests.
  • Serve the owned host over HTTPS too. status.dmsg/status.skynet are within the resolver CA name constraints, so the TLS-MITM path mints a per-host leaf and serves the page over terminated TLS, mirroring the existing MITM interstitial branch.
  • status.skysocks moves to the skysocks-client. The resolver CA forbids a .skysocks leaf, so it must be HTTP-only and served outside the MITM resolvers. The client transparently sniffs the SOCKS5 CONNECT target — forwarding the greeting/method negotiation and every non-status request to the exit byte-for-byte — and answers a status.skysocks CONNECT in-process. The snapshot is rendered from the client's own session state (liveness + open stream count), since skysocks-client is a separate app process whose app RPC exposes no status query.

Existing HTTP status.dmsg/status.skynet/status.skysocks keep working, now each from the right owner. Unit tests cover the scoping (a dmsg_web-scoped runtime serves status.dmsg but falls status.skynet through, and vice versa) and the skysocks-client interception (status served in-process, non-status forwarded to the exit). go build ., gofmt -l, and go vet are clean on the changed packages.

…o skysocks-client

Each resolving-proxy layer now owns exactly one reserved status host instead of
every layer answering for all three. A new StatusSurface on the dmsgweb and
skynetweb runtime Configs scopes serving to that surface: dmsg_web answers only
status.dmsg, skynet_web only status.skynet. A matched status host for a
different surface is not served — it falls through so the request continues up
the chain to the layer that owns it.

The owned host is now also served over HTTPS: status.dmsg / status.skynet are
within the resolver CA name constraints, so the TLS-MITM path mints a per-host
leaf and serves the page over terminated TLS, mirroring the existing MITM
interstitial branch.

status.skysocks moves to the skysocks-client, which is where it belongs: the
resolver CA forbids a .skysocks leaf, so it must be served HTTP-only outside the
MITM resolvers. The client transparently sniffs the SOCKS5 CONNECT target —
forwarding the greeting/method negotiation and every non-status request to the
exit byte-for-byte — and answers a status.skysocks CONNECT in-process. The page
is rendered from the client's own session state (liveness + open stream count),
since skysocks-client is a separate app process whose app RPC exposes no status
query and adding cross-process plumbing wasn't warranted.
@0pcom
0pcom force-pushed the feat/per-layer-status-providers branch from 05e51ce to df0662c Compare August 22, 2026 23:59
@0pcom
0pcom merged commit a8fe646 into skycoin:develop Aug 23, 2026
12 of 15 checks passed
@0pcom
0pcom deleted the feat/per-layer-status-providers branch August 23, 2026 00:00
0pcom added a commit that referenced this pull request Aug 23, 2026
…ks (#4125)

#4094 moved status.skysocks serving into the skysocks-client's in-process
handler but skipped the cross-process plumbing, so the page rendered only
session liveness + open-stream count — the per-leg mux table, route/transport
events and recent logs went empty even with a live route group.

Add a read-only app->visor RPC (ProxyStatus) that returns the visor-built
proxystatus.Snapshot, and have skysocks-client render that (overlaying its own
live session Running/Note) instead of the minimal local snapshot. On RPC error
or an empty snapshot it falls back to the local view, so status.skysocks still
renders where the RPC is unavailable (e.g. the browser wasm-visor).

Read-only addition; the data-plane splice and #4094's per-layer scoping for
dmsg/skynet are untouched.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant