Help us shape the future of Go! Take the 2026 Go Developer Survey

rpcgrpc

package
v1.3.104 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 31, 2026 License: AGPL-3.0 Imports: 40 Imported by: 0

Documentation

Overview

Package rpcgrpc pkg/visor/rpcgrpc/client.go c3-vis-core

Package rpcgrpc pkg/visor/rpcgrpc/server.go c3-vis-core

Package rpcgrpc pkg/visor/rpcgrpc/server_mux_bandwidth.go c3-vis-core server-side implementation of the StreamMuxBandwidth gRPC RPC.

Test the operator's hypothesis: bandwidth aggregated across N parallel routes (with min_hops >= 2 forcing the routes through intermediates) should exceed the bandwidth of the single direct transport between the same two visors. This RPC drives N concurrent pump goroutines, sums their throughput, and emits periodic samples + a terminal Done event.

Pump shape (per route, in its own goroutine):

  1. Dial (with MinHops constraint when set).
  2. Pump bytes via PingOnceWithEcho until ctx-cancel or cfg.Duration elapsed. Each call returns (sent, recvd, _, err).
  3. On goroutine exit, decrement activeRoutes.

Sampler shape (one goroutine total):

  • On a sample_interval ticker, sum all routes' counters and emit a MuxBandwidthSample event.

Optional probe shape (one goroutine when ProbeRtt is set):

  • On a probe_interval ticker, run a single PingOnce on the first established route. Emit a MuxRttProbe event per attempt.

All goroutines share a bounded event channel; a single sender drains it to stream.Send so events arrive in a serializable order.

Package rpcgrpc pkg/visor/rpcgrpc/server_ping_tree.go c3-vis-core implementation of the StreamPingTree gRPC RPC. Replaces the client-side BFS in cmd/skywire-cli/commands/visor/ping/tree.go, giving the visor direct access to per-transport latency data and the route-finder graph without paying for RPC roundtrips per BFS step.

Wire shape: per ping.proto, one PingTreeEvent per discovered entry / ping result / level boundary / run terminus. Per-level concurrency, ctx.Done() observed at every BFS iteration, bounded event channel with drop-StatusUpdate-before-PingResult policy.

Authorization: TODO — first cut runs unauthenticated for development; follow-up PR gates on the dmsgWL whitelist (hypervisors + own PK + Dmsgpty.Whitelist) before opening to the network. Local CLI use over the unix-socket RPC is implicitly trusted via filesystem permissions; the gate matters for the dmsg-port gRPC entry point.

Package rpcgrpc pkg/visor/rpcgrpc/server_policy_bandwidth.go c3-vis-core the `policy-bw` control layer that drives the in-process mux-bandwidth rig through the WASM / Starlark routing-policy engine — proving a preset is demonstrably ADAPTIVE over a live multiplexed route.

Where the pure mux-bw baseline (server_mux_bandwidth.go) plans a fixed set of disjoint routes and pumps them unchanged for the whole run, this layer:

  • at dial time, calls the engine's decide_route hook to pick the mux leg count + min-hops (muxBwController.decideAtDial), then reuses the same disjoint planner + setup path; and
  • during the pump, on the preset's rotation cadence, fires the engine's on_tick hook against the live per-leg stats and applies the returned RotationAction — dropping / adding legs and promoting / demoting warm standbys (muxBwController.controlLoop → applyRotation).

The leg-management surface is the in-process analog of the route group's RotationAction executor (pkg/router/route_group.go rotationServiceFn): a drop cancels one leg's pump + tears down its conn; an add plans a fresh disjoint route and spawns a pump; a demote parks a leg on warm standby (conn kept alive via a keepalive ping, not byte-pumped) and a promote resumes it instantly with no re-dial. Route-group LegInfo semantics are preserved so a preset written against the app path behaves identically here: leg indices are slice positions that compact after a drop, and each leg's TransportID (the key a preset uses to smooth an EWMA across ticks) is its stable intermediate PK.

Concurrency: active/all and the sampler tracker are touched ONLY by the single controlLoop goroutine (after a happens-before init in startPumps), so they need no lock; the pump goroutines share state only through the per-leg atomics on muxBwRouteState. totals()/peaks() are read after pumpWg.Wait(), i.e. once controlLoop has returned.

Package rpcgrpc pkg/visor/rpcgrpc/server_routegroup_mux_info.go c3-vis-core server-side implementation of the StreamRouteGroupMuxInfo gRPC RPC.

This is the server-streaming counterpart of the unary RouteGroupMuxInfo net/rpc call. 'cli proxy mux plot' (default, watch-a-running-app mode) used to poll that unary RPC once per --interval — a gob round-trip per tick that read choppy next to the --pk StreamMuxBandwidth path. This RPC pushes the same per-leg breakdown on a server-side ticker so the plot updates smoothly/continuously without per-tick connection overhead.

Package rpcgrpc pkg/visor/rpcgrpc/systemstats.go c3-vis-core

Index

Constants

View Source
const (
	PingService_StreamPing_FullMethodName              = "/rpcgrpc.PingService/StreamPing"
	PingService_StreamDmsgPing_FullMethodName          = "/rpcgrpc.PingService/StreamDmsgPing"
	PingService_StreamBandwidthTest_FullMethodName     = "/rpcgrpc.PingService/StreamBandwidthTest"
	PingService_StreamDmsgBandwidthTest_FullMethodName = "/rpcgrpc.PingService/StreamDmsgBandwidthTest"
	PingService_GetRemoteDmsgServers_FullMethodName    = "/rpcgrpc.PingService/GetRemoteDmsgServers"
	PingService_StreamSystemStats_FullMethodName       = "/rpcgrpc.PingService/StreamSystemStats"
	PingService_GetSystemStats_FullMethodName          = "/rpcgrpc.PingService/GetSystemStats"
	PingService_StreamRemoteSystemStats_FullMethodName = "/rpcgrpc.PingService/StreamRemoteSystemStats"
	PingService_StreamAppLogs_FullMethodName           = "/rpcgrpc.PingService/StreamAppLogs"
	PingService_StreamCalcRoutes_FullMethodName        = "/rpcgrpc.PingService/StreamCalcRoutes"
	PingService_StreamGroupMessages_FullMethodName     = "/rpcgrpc.PingService/StreamGroupMessages"
	PingService_StreamPingTree_FullMethodName          = "/rpcgrpc.PingService/StreamPingTree"
	PingService_StreamMuxBandwidth_FullMethodName      = "/rpcgrpc.PingService/StreamMuxBandwidth"
	PingService_StreamRouteGroupMuxInfo_FullMethodName = "/rpcgrpc.PingService/StreamRouteGroupMuxInfo"
)

Variables

View Source
var PingService_ServiceDesc = grpc.ServiceDesc{
	ServiceName: "rpcgrpc.PingService",
	HandlerType: (*PingServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetRemoteDmsgServers",
			Handler:    _PingService_GetRemoteDmsgServers_Handler,
		},
		{
			MethodName: "GetSystemStats",
			Handler:    _PingService_GetSystemStats_Handler,
		},
	},
	Streams: []grpc.StreamDesc{
		{
			StreamName:    "StreamPing",
			Handler:       _PingService_StreamPing_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "StreamDmsgPing",
			Handler:       _PingService_StreamDmsgPing_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "StreamBandwidthTest",
			Handler:       _PingService_StreamBandwidthTest_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "StreamDmsgBandwidthTest",
			Handler:       _PingService_StreamDmsgBandwidthTest_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "StreamSystemStats",
			Handler:       _PingService_StreamSystemStats_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "StreamRemoteSystemStats",
			Handler:       _PingService_StreamRemoteSystemStats_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "StreamAppLogs",
			Handler:       _PingService_StreamAppLogs_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "StreamCalcRoutes",
			Handler:       _PingService_StreamCalcRoutes_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "StreamGroupMessages",
			Handler:       _PingService_StreamGroupMessages_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "StreamPingTree",
			Handler:       _PingService_StreamPingTree_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "StreamMuxBandwidth",
			Handler:       _PingService_StreamMuxBandwidth_Handler,
			ServerStreams: true,
		},
		{
			StreamName:    "StreamRouteGroupMuxInfo",
			Handler:       _PingService_StreamRouteGroupMuxInfo_Handler,
			ServerStreams: true,
		},
	},
	Metadata: "ping.proto",
}

PingService_ServiceDesc is the grpc.ServiceDesc for PingService service. It's only intended for direct use with grpc.RegisterService, and not to be introspected or modified (even as a copy)

Functions

func RegisterPingServiceServer

func RegisterPingServiceServer(s grpc.ServiceRegistrar, srv PingServiceServer)

Types

type AppLogCallback

type AppLogCallback func(entry *AppLogEntry)

AppLogCallback is called for each log entry received from the stream.

type AppLogEntry

type AppLogEntry struct {
	TimestampNs int64             `protobuf:"varint,1,opt,name=timestamp_ns,json=timestampNs,proto3" json:"timestamp_ns,omitempty"` // entry time as Unix nanoseconds
	Level       string            `protobuf:"bytes,2,opt,name=level,proto3" json:"level,omitempty"`                                 // "trace"|"debug"|"info"|"warn"|"error"|"fatal"|"panic"
	Module      string            `protobuf:"bytes,3,opt,name=module,proto3" json:"module,omitempty"`                               // _module field (e.g. "router", "skysocks-client")
	Message     string            `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"`                             // formatted message text
	Fields      map[string]string ``                                                                                                // remaining structured fields
	/* 139-byte string literal not displayed */
	// Subscribed is set on a sentinel entry the server sends
	// immediately after it has registered the subscription with the
	// broadcaster. Clients use this to know that any subsequent log
	// activity will reach them — letting them gate downstream RPC
	// calls (e.g. StartAppWithMode) on subscription readiness so the
	// first ~50ms of setup logs aren't lost to the race between
	// subscription handshake and the action that triggers them.
	// The other fields are unused on the sentinel.
	Subscribed bool `protobuf:"varint,6,opt,name=subscribed,proto3" json:"subscribed,omitempty"`
	// contains filtered or unexported fields
}

AppLogEntry is one log line forwarded to the gRPC client.

func (*AppLogEntry) Descriptor deprecated

func (*AppLogEntry) Descriptor() ([]byte, []int)

Deprecated: Use AppLogEntry.ProtoReflect.Descriptor instead.

func (*AppLogEntry) GetFields

func (x *AppLogEntry) GetFields() map[string]string

func (*AppLogEntry) GetLevel

func (x *AppLogEntry) GetLevel() string

func (*AppLogEntry) GetMessage

func (x *AppLogEntry) GetMessage() string

func (*AppLogEntry) GetModule

func (x *AppLogEntry) GetModule() string

func (*AppLogEntry) GetSubscribed

func (x *AppLogEntry) GetSubscribed() bool

func (*AppLogEntry) GetTimestampNs

func (x *AppLogEntry) GetTimestampNs() int64

func (*AppLogEntry) ProtoMessage

func (*AppLogEntry) ProtoMessage()

func (*AppLogEntry) ProtoReflect

func (x *AppLogEntry) ProtoReflect() protoreflect.Message

func (*AppLogEntry) Reset

func (x *AppLogEntry) Reset()

func (*AppLogEntry) String

func (x *AppLogEntry) String() string

type AppLogStreamRequest

type AppLogStreamRequest struct {

	// AppName scopes the stream to entries originating from this app's
	// module or carrying app=<name> as a logrus field. Either AppName
	// or Modules (or both) must be set.
	AppName string `protobuf:"bytes,1,opt,name=app_name,json=appName,proto3" json:"app_name,omitempty"`
	// IncludeRouter is retained on the wire for forward compatibility
	// but is ignored — the app_name field tagging now covers what it
	// used to do, and Modules below is the explicit path for non-app
	// scoping (e.g. 'cli dmsg curl --verbose' picking up dmsg layers).
	IncludeRouter bool `protobuf:"varint,2,opt,name=include_router,json=includeRouter,proto3" json:"include_router,omitempty"`
	// MinLevel filters out lower-severity entries: trace|debug|info|warn|error.
	// Default debug.
	MinLevel string `protobuf:"bytes,3,opt,name=min_level,json=minLevel,proto3" json:"min_level,omitempty"`
	// Modules filters by _module prefix, OR-merged with the AppName
	// match. Use this when no app context exists — e.g. 'dmsg curl
	// --verbose' sends ["dmsgC","dmsghttp","dmsg_grpc"]. Empty means
	// "no module-prefix match"; AppName is then the only path.
	Modules []string `protobuf:"bytes,4,rep,name=modules,proto3" json:"modules,omitempty"`
	// contains filtered or unexported fields
}

AppLogStreamRequest configures app-scoped log streaming.

func (*AppLogStreamRequest) Descriptor deprecated

func (*AppLogStreamRequest) Descriptor() ([]byte, []int)

Deprecated: Use AppLogStreamRequest.ProtoReflect.Descriptor instead.

func (*AppLogStreamRequest) GetAppName

func (x *AppLogStreamRequest) GetAppName() string

func (*AppLogStreamRequest) GetIncludeRouter

func (x *AppLogStreamRequest) GetIncludeRouter() bool

func (*AppLogStreamRequest) GetMinLevel

func (x *AppLogStreamRequest) GetMinLevel() string

func (*AppLogStreamRequest) GetModules

func (x *AppLogStreamRequest) GetModules() []string

func (*AppLogStreamRequest) ProtoMessage

func (*AppLogStreamRequest) ProtoMessage()

func (*AppLogStreamRequest) ProtoReflect

func (x *AppLogStreamRequest) ProtoReflect() protoreflect.Message

func (*AppLogStreamRequest) Reset

func (x *AppLogStreamRequest) Reset()

func (*AppLogStreamRequest) String

func (x *AppLogStreamRequest) String() string

type BandwidthProgress

type BandwidthProgress struct {
	BytesSent     uint64  `protobuf:"varint,1,opt,name=bytes_sent,json=bytesSent,proto3" json:"bytes_sent,omitempty"`              // Cumulative bytes sent
	BytesReceived uint64  `protobuf:"varint,2,opt,name=bytes_received,json=bytesReceived,proto3" json:"bytes_received,omitempty"`  // Cumulative bytes received
	ElapsedNs     int64   `protobuf:"varint,3,opt,name=elapsed_ns,json=elapsedNs,proto3" json:"elapsed_ns,omitempty"`              // Elapsed time in nanoseconds
	UploadSpeed   float64 `protobuf:"fixed64,4,opt,name=upload_speed,json=uploadSpeed,proto3" json:"upload_speed,omitempty"`       // Current upload speed in KB/s
	DownloadSpeed float64 `protobuf:"fixed64,5,opt,name=download_speed,json=downloadSpeed,proto3" json:"download_speed,omitempty"` // Current download speed in KB/s
	IsFinal       bool    `protobuf:"varint,6,opt,name=is_final,json=isFinal,proto3" json:"is_final,omitempty"`                    // True if this is the final result
	Error         string  `protobuf:"bytes,7,opt,name=error,proto3" json:"error,omitempty"`                                        // Error message if test failed
	// contains filtered or unexported fields
}

func (*BandwidthProgress) Descriptor deprecated

func (*BandwidthProgress) Descriptor() ([]byte, []int)

Deprecated: Use BandwidthProgress.ProtoReflect.Descriptor instead.

func (*BandwidthProgress) GetBytesReceived

func (x *BandwidthProgress) GetBytesReceived() uint64

func (*BandwidthProgress) GetBytesSent

func (x *BandwidthProgress) GetBytesSent() uint64

func (*BandwidthProgress) GetDownloadSpeed

func (x *BandwidthProgress) GetDownloadSpeed() float64

func (*BandwidthProgress) GetElapsedNs

func (x *BandwidthProgress) GetElapsedNs() int64

func (*BandwidthProgress) GetError

func (x *BandwidthProgress) GetError() string

func (*BandwidthProgress) GetIsFinal

func (x *BandwidthProgress) GetIsFinal() bool

func (*BandwidthProgress) GetUploadSpeed

func (x *BandwidthProgress) GetUploadSpeed() float64

func (*BandwidthProgress) ProtoMessage

func (*BandwidthProgress) ProtoMessage()

func (*BandwidthProgress) ProtoReflect

func (x *BandwidthProgress) ProtoReflect() protoreflect.Message

func (*BandwidthProgress) Reset

func (x *BandwidthProgress) Reset()

func (*BandwidthProgress) String

func (x *BandwidthProgress) String() string

type BandwidthProgressCallback

type BandwidthProgressCallback func(bytesSent, bytesReceived uint64, elapsed time.Duration, uploadSpeed, downloadSpeed float64, isFinal bool, err error)

BandwidthProgressCallback is called for each bandwidth progress update.

type BandwidthRequest

type BandwidthRequest struct {
	PublicKey    string `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`             // Target visor public key
	DurationNs   int64  `protobuf:"varint,2,opt,name=duration_ns,json=durationNs,proto3" json:"duration_ns,omitempty"`         // Duration to run the test in nanoseconds
	PacketSizeKb int32  `protobuf:"varint,3,opt,name=packet_size_kb,json=packetSizeKb,proto3" json:"packet_size_kb,omitempty"` // Packet size in KB (default 32)
	LocalRoute   bool   `protobuf:"varint,4,opt,name=local_route,json=localRoute,proto3" json:"local_route,omitempty"`         // Use local route calculation (for skywire route)
	// contains filtered or unexported fields
}

func (*BandwidthRequest) Descriptor deprecated

func (*BandwidthRequest) Descriptor() ([]byte, []int)

Deprecated: Use BandwidthRequest.ProtoReflect.Descriptor instead.

func (*BandwidthRequest) GetDurationNs

func (x *BandwidthRequest) GetDurationNs() int64

func (*BandwidthRequest) GetLocalRoute

func (x *BandwidthRequest) GetLocalRoute() bool

func (*BandwidthRequest) GetPacketSizeKb

func (x *BandwidthRequest) GetPacketSizeKb() int32

func (*BandwidthRequest) GetPublicKey

func (x *BandwidthRequest) GetPublicKey() string

func (*BandwidthRequest) ProtoMessage

func (*BandwidthRequest) ProtoMessage()

func (*BandwidthRequest) ProtoReflect

func (x *BandwidthRequest) ProtoReflect() protoreflect.Message

func (*BandwidthRequest) Reset

func (x *BandwidthRequest) Reset()

func (*BandwidthRequest) String

func (x *BandwidthRequest) String() string

type CalcHop

type CalcHop struct {
	TpId string `protobuf:"bytes,1,opt,name=tp_id,json=tpId,proto3" json:"tp_id,omitempty"`
	From string `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"`
	To   string `protobuf:"bytes,3,opt,name=to,proto3" json:"to,omitempty"`
	// contains filtered or unexported fields
}

CalcHop is one edge in a route.

func (*CalcHop) Descriptor deprecated

func (*CalcHop) Descriptor() ([]byte, []int)

Deprecated: Use CalcHop.ProtoReflect.Descriptor instead.

func (*CalcHop) GetFrom

func (x *CalcHop) GetFrom() string

func (*CalcHop) GetTo

func (x *CalcHop) GetTo() string

func (*CalcHop) GetTpId

func (x *CalcHop) GetTpId() string

func (*CalcHop) ProtoMessage

func (*CalcHop) ProtoMessage()

func (*CalcHop) ProtoReflect

func (x *CalcHop) ProtoReflect() protoreflect.Message

func (*CalcHop) Reset

func (x *CalcHop) Reset()

func (*CalcHop) String

func (x *CalcHop) String() string

type CalcRoute

type CalcRoute struct {
	Hops []*CalcHop `protobuf:"bytes,1,rep,name=hops,proto3" json:"hops,omitempty"`
	// contains filtered or unexported fields
}

CalcRoute is one path the BFS found. Hops are listed in forward order from src to dst; the caller can derive the reverse by mirroring.

func (*CalcRoute) Descriptor deprecated

func (*CalcRoute) Descriptor() ([]byte, []int)

Deprecated: Use CalcRoute.ProtoReflect.Descriptor instead.

func (*CalcRoute) GetHops

func (x *CalcRoute) GetHops() []*CalcHop

func (*CalcRoute) ProtoMessage

func (*CalcRoute) ProtoMessage()

func (*CalcRoute) ProtoReflect

func (x *CalcRoute) ProtoReflect() protoreflect.Message

func (*CalcRoute) Reset

func (x *CalcRoute) Reset()

func (*CalcRoute) String

func (x *CalcRoute) String() string

type CalcRouteCallback

type CalcRouteCallback func(route *CalcRoute) bool

CalcRouteCallback is called once per route received from StreamCalcRoutes. Returning false stops further reception (the underlying gRPC stream is canceled, signaling the server to stop the BFS as well).

type CalcRoutesRequest

type CalcRoutesRequest struct {

	// SrcPk is the source visor public key. Empty means use the receiving
	// visor's own PK (the common case — calc routes from this visor).
	SrcPk string `protobuf:"bytes,1,opt,name=src_pk,json=srcPk,proto3" json:"src_pk,omitempty"`
	// DstPk is the destination visor public key. Required.
	DstPk string `protobuf:"bytes,2,opt,name=dst_pk,json=dstPk,proto3" json:"dst_pk,omitempty"`
	// MinHops is the minimum hop count. 0 falls back to the visor's
	// routing.min_hops, then 1.
	MinHops int32 `protobuf:"varint,3,opt,name=min_hops,json=minHops,proto3" json:"min_hops,omitempty"`
	// MaxHops is the maximum hop count. 0 falls back to a safe default.
	MaxHops int32 `protobuf:"varint,4,opt,name=max_hops,json=maxHops,proto3" json:"max_hops,omitempty"`
	// Count caps how many routes to return. 0 means unbounded (the BFS
	// runs until the search space is exhausted; the streaming wire
	// protocol means the caller can still dump them as they arrive
	// without buffering the whole set).
	Count int32 `protobuf:"varint,5,opt,name=count,proto3" json:"count,omitempty"`
	// Source selects the transport-graph data source. "tpd" (HTTP),
	// "dht" (visor's local DHT store), or "auto" (DHT then TPD fallback).
	Source string `protobuf:"bytes,6,opt,name=source,proto3" json:"source,omitempty"`
	// TpdUrl optionally overrides the default transport-discovery URL.
	TpdUrl string `protobuf:"bytes,7,opt,name=tpd_url,json=tpdUrl,proto3" json:"tpd_url,omitempty"`
	// QueueCap caps the per-call BFS queue size on the server. 0 falls
	// back to the route-finder package's DefaultMaxBFSQueue. Negative
	// means unbounded (use with caution on dense graphs).
	QueueCap int32 `protobuf:"varint,8,opt,name=queue_cap,json=queueCap,proto3" json:"queue_cap,omitempty"`
	// contains filtered or unexported fields
}

CalcRoutesRequest configures server-side route calculation streaming.

func (*CalcRoutesRequest) Descriptor deprecated

func (*CalcRoutesRequest) Descriptor() ([]byte, []int)

Deprecated: Use CalcRoutesRequest.ProtoReflect.Descriptor instead.

func (*CalcRoutesRequest) GetCount

func (x *CalcRoutesRequest) GetCount() int32

func (*CalcRoutesRequest) GetDstPk

func (x *CalcRoutesRequest) GetDstPk() string

func (*CalcRoutesRequest) GetMaxHops

func (x *CalcRoutesRequest) GetMaxHops() int32

func (*CalcRoutesRequest) GetMinHops

func (x *CalcRoutesRequest) GetMinHops() int32

func (*CalcRoutesRequest) GetQueueCap

func (x *CalcRoutesRequest) GetQueueCap() int32

func (*CalcRoutesRequest) GetSource

func (x *CalcRoutesRequest) GetSource() string

func (*CalcRoutesRequest) GetSrcPk

func (x *CalcRoutesRequest) GetSrcPk() string

func (*CalcRoutesRequest) GetTpdUrl

func (x *CalcRoutesRequest) GetTpdUrl() string

func (*CalcRoutesRequest) ProtoMessage

func (*CalcRoutesRequest) ProtoMessage()

func (*CalcRoutesRequest) ProtoReflect

func (x *CalcRoutesRequest) ProtoReflect() protoreflect.Message

func (*CalcRoutesRequest) Reset

func (x *CalcRoutesRequest) Reset()

func (*CalcRoutesRequest) String

func (x *CalcRoutesRequest) String() string

type CpuStat

type CpuStat struct {
	Cpu          string  `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"`                                         // CPU identifier (cpu0, cpu1, etc. or cpu-total)
	UsagePercent float64 `protobuf:"fixed64,2,opt,name=usage_percent,json=usagePercent,proto3" json:"usage_percent,omitempty"` // Usage percentage (0-100)
	// contains filtered or unexported fields
}

CpuStat contains CPU usage for a single core

func (*CpuStat) Descriptor deprecated

func (*CpuStat) Descriptor() ([]byte, []int)

Deprecated: Use CpuStat.ProtoReflect.Descriptor instead.

func (*CpuStat) GetCpu

func (x *CpuStat) GetCpu() string

func (*CpuStat) GetUsagePercent

func (x *CpuStat) GetUsagePercent() float64

func (*CpuStat) ProtoMessage

func (*CpuStat) ProtoMessage()

func (*CpuStat) ProtoReflect

func (x *CpuStat) ProtoReflect() protoreflect.Message

func (*CpuStat) Reset

func (x *CpuStat) Reset()

func (*CpuStat) String

func (x *CpuStat) String() string

type DiskStat

type DiskStat struct {
	Device      string  `protobuf:"bytes,1,opt,name=device,proto3" json:"device,omitempty"`                                // Device name
	Mountpoint  string  `protobuf:"bytes,2,opt,name=mountpoint,proto3" json:"mountpoint,omitempty"`                        // Mount point
	Fstype      string  `protobuf:"bytes,3,opt,name=fstype,proto3" json:"fstype,omitempty"`                                // Filesystem type
	Total       uint64  `protobuf:"varint,4,opt,name=total,proto3" json:"total,omitempty"`                                 // Total space in bytes
	Used        uint64  `protobuf:"varint,5,opt,name=used,proto3" json:"used,omitempty"`                                   // Used space in bytes
	Free        uint64  `protobuf:"varint,6,opt,name=free,proto3" json:"free,omitempty"`                                   // Free space in bytes
	UsedPercent float64 `protobuf:"fixed64,7,opt,name=used_percent,json=usedPercent,proto3" json:"used_percent,omitempty"` // Usage percentage (0-100)
	// contains filtered or unexported fields
}

DiskStat contains disk usage for a partition

func (*DiskStat) Descriptor deprecated

func (*DiskStat) Descriptor() ([]byte, []int)

Deprecated: Use DiskStat.ProtoReflect.Descriptor instead.

func (*DiskStat) GetDevice

func (x *DiskStat) GetDevice() string

func (*DiskStat) GetFree

func (x *DiskStat) GetFree() uint64

func (*DiskStat) GetFstype

func (x *DiskStat) GetFstype() string

func (*DiskStat) GetMountpoint

func (x *DiskStat) GetMountpoint() string

func (*DiskStat) GetTotal

func (x *DiskStat) GetTotal() uint64

func (*DiskStat) GetUsed

func (x *DiskStat) GetUsed() uint64

func (*DiskStat) GetUsedPercent

func (x *DiskStat) GetUsedPercent() float64

func (*DiskStat) ProtoMessage

func (*DiskStat) ProtoMessage()

func (*DiskStat) ProtoReflect

func (x *DiskStat) ProtoReflect() protoreflect.Message

func (*DiskStat) Reset

func (x *DiskStat) Reset()

func (*DiskStat) String

func (x *DiskStat) String() string

type DmsgServersRequest

type DmsgServersRequest struct {
	PublicKey string `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` // Remote visor public key to look up
	// contains filtered or unexported fields
}

func (*DmsgServersRequest) Descriptor deprecated

func (*DmsgServersRequest) Descriptor() ([]byte, []int)

Deprecated: Use DmsgServersRequest.ProtoReflect.Descriptor instead.

func (*DmsgServersRequest) GetPublicKey

func (x *DmsgServersRequest) GetPublicKey() string

func (*DmsgServersRequest) ProtoMessage

func (*DmsgServersRequest) ProtoMessage()

func (*DmsgServersRequest) ProtoReflect

func (x *DmsgServersRequest) ProtoReflect() protoreflect.Message

func (*DmsgServersRequest) Reset

func (x *DmsgServersRequest) Reset()

func (*DmsgServersRequest) String

func (x *DmsgServersRequest) String() string

type DmsgServersResponse

type DmsgServersResponse struct {
	ServerPks []string `protobuf:"bytes,1,rep,name=server_pks,json=serverPks,proto3" json:"server_pks,omitempty"` // List of DMSG server public keys
	// contains filtered or unexported fields
}

func (*DmsgServersResponse) Descriptor deprecated

func (*DmsgServersResponse) Descriptor() ([]byte, []int)

Deprecated: Use DmsgServersResponse.ProtoReflect.Descriptor instead.

func (*DmsgServersResponse) GetServerPks

func (x *DmsgServersResponse) GetServerPks() []string

func (*DmsgServersResponse) ProtoMessage

func (*DmsgServersResponse) ProtoMessage()

func (*DmsgServersResponse) ProtoReflect

func (x *DmsgServersResponse) ProtoReflect() protoreflect.Message

func (*DmsgServersResponse) Reset

func (x *DmsgServersResponse) Reset()

func (*DmsgServersResponse) String

func (x *DmsgServersResponse) String() string

type GroupMessageCallback

type GroupMessageCallback func(e *GroupMessageEvent)

GroupMessageCallback is invoked for every group message the stream delivers. The Subscribed-sentinel entry is filtered out by StreamGroupMessages — callers only see real messages.

type GroupMessageData

type GroupMessageData struct {
	TimestampNs int64
	GroupID     string
	SenderPK    string
	Body        string
}

GroupMessageData mirrors visor.GroupMessage one-for-one but lives in rpcgrpc so VisorAPI.SubscribeGroupMessages doesn't pull pkg/visor into rpcgrpc's import graph. The adapter at the visor's init wires a tiny converter goroutine between the inbox's chan visor.GroupMessage and this chan GroupMessageData.

type GroupMessageEvent

type GroupMessageEvent struct {

	// TimestampNs is the message Unix-nanos timestamp from the sender.
	TimestampNs int64 `protobuf:"varint,1,opt,name=timestamp_ns,json=timestampNs,proto3" json:"timestamp_ns,omitempty"`
	// GroupId is the group the message arrived on.
	GroupId string `protobuf:"bytes,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	// SenderPk is the publishing member's hex public key.
	SenderPk string `protobuf:"bytes,3,opt,name=sender_pk,json=senderPk,proto3" json:"sender_pk,omitempty"`
	// Body is the message text (may contain embedded newlines —
	// callers that need one-line-per-event should escape on display).
	Body string `protobuf:"bytes,4,opt,name=body,proto3" json:"body,omitempty"`
	// Subscribed is set on a sentinel sent immediately after the
	// server registers the subscription. Lets clients gate downstream
	// RPCs on subscription liveness — same pattern AppLogEntry uses.
	Subscribed bool `protobuf:"varint,5,opt,name=subscribed,proto3" json:"subscribed,omitempty"`
	// contains filtered or unexported fields
}

GroupMessageEvent is one inbound group message delivered to the stream. Mirrors visor.GroupMessage one-for-one.

func (*GroupMessageEvent) Descriptor deprecated

func (*GroupMessageEvent) Descriptor() ([]byte, []int)

Deprecated: Use GroupMessageEvent.ProtoReflect.Descriptor instead.

func (*GroupMessageEvent) GetBody

func (x *GroupMessageEvent) GetBody() string

func (*GroupMessageEvent) GetGroupId

func (x *GroupMessageEvent) GetGroupId() string

func (*GroupMessageEvent) GetSenderPk

func (x *GroupMessageEvent) GetSenderPk() string

func (*GroupMessageEvent) GetSubscribed

func (x *GroupMessageEvent) GetSubscribed() bool

func (*GroupMessageEvent) GetTimestampNs

func (x *GroupMessageEvent) GetTimestampNs() int64

func (*GroupMessageEvent) ProtoMessage

func (*GroupMessageEvent) ProtoMessage()

func (*GroupMessageEvent) ProtoReflect

func (x *GroupMessageEvent) ProtoReflect() protoreflect.Message

func (*GroupMessageEvent) Reset

func (x *GroupMessageEvent) Reset()

func (*GroupMessageEvent) String

func (x *GroupMessageEvent) String() string

type GroupMessagesRequest

type GroupMessagesRequest struct {

	// GroupId filters to one group. Empty subscribes to every group
	// the visor is currently in (the default 'cli skychat group listen'
	// behavior).
	GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	// SinceTimestampNs replays buffered messages with TS strictly
	// greater than this value before live deliveries start. Zero
	// means "live only" — drains nothing from history. Mirrors the
	// 'since' arg the previous GroupPoll RPC accepted.
	SinceTimestampNs int64 `protobuf:"varint,2,opt,name=since_timestamp_ns,json=sinceTimestampNs,proto3" json:"since_timestamp_ns,omitempty"`
	// contains filtered or unexported fields
}

GroupMessagesRequest configures a group-message stream subscription.

func (*GroupMessagesRequest) Descriptor deprecated

func (*GroupMessagesRequest) Descriptor() ([]byte, []int)

Deprecated: Use GroupMessagesRequest.ProtoReflect.Descriptor instead.

func (*GroupMessagesRequest) GetGroupId

func (x *GroupMessagesRequest) GetGroupId() string

func (*GroupMessagesRequest) GetSinceTimestampNs

func (x *GroupMessagesRequest) GetSinceTimestampNs() int64

func (*GroupMessagesRequest) ProtoMessage

func (*GroupMessagesRequest) ProtoMessage()

func (*GroupMessagesRequest) ProtoReflect

func (x *GroupMessagesRequest) ProtoReflect() protoreflect.Message

func (*GroupMessagesRequest) Reset

func (x *GroupMessagesRequest) Reset()

func (*GroupMessagesRequest) String

func (x *GroupMessagesRequest) String() string

type HostInfo

type HostInfo struct {
	Hostname        string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"`
	UptimeSec       int64  `protobuf:"varint,2,opt,name=uptime_sec,json=uptimeSec,proto3" json:"uptime_sec,omitempty"`                  // System uptime in seconds
	Os              string `protobuf:"bytes,3,opt,name=os,proto3" json:"os,omitempty"`                                                  // Operating system name
	Platform        string `protobuf:"bytes,4,opt,name=platform,proto3" json:"platform,omitempty"`                                      // Platform (e.g., ubuntu, centos)
	PlatformVersion string `protobuf:"bytes,5,opt,name=platform_version,json=platformVersion,proto3" json:"platform_version,omitempty"` // Platform version
	KernelVersion   string `protobuf:"bytes,6,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"`       // Kernel version
	KernelArch      string `protobuf:"bytes,7,opt,name=kernel_arch,json=kernelArch,proto3" json:"kernel_arch,omitempty"`                // Kernel architecture
	NumCpus         int32  `protobuf:"varint,8,opt,name=num_cpus,json=numCpus,proto3" json:"num_cpus,omitempty"`                        // Number of logical CPUs
	// contains filtered or unexported fields
}

HostInfo contains basic host information

func (*HostInfo) Descriptor deprecated

func (*HostInfo) Descriptor() ([]byte, []int)

Deprecated: Use HostInfo.ProtoReflect.Descriptor instead.

func (*HostInfo) GetHostname

func (x *HostInfo) GetHostname() string

func (*HostInfo) GetKernelArch

func (x *HostInfo) GetKernelArch() string

func (*HostInfo) GetKernelVersion

func (x *HostInfo) GetKernelVersion() string

func (*HostInfo) GetNumCpus

func (x *HostInfo) GetNumCpus() int32

func (*HostInfo) GetOs

func (x *HostInfo) GetOs() string

func (*HostInfo) GetPlatform

func (x *HostInfo) GetPlatform() string

func (*HostInfo) GetPlatformVersion

func (x *HostInfo) GetPlatformVersion() string

func (*HostInfo) GetUptimeSec

func (x *HostInfo) GetUptimeSec() int64

func (*HostInfo) ProtoMessage

func (*HostInfo) ProtoMessage()

func (*HostInfo) ProtoReflect

func (x *HostInfo) ProtoReflect() protoreflect.Message

func (*HostInfo) Reset

func (x *HostInfo) Reset()

func (*HostInfo) String

func (x *HostInfo) String() string

type MemoryStat

type MemoryStat struct {
	Total       uint64  `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"`                                 // Total memory in bytes
	Used        uint64  `protobuf:"varint,2,opt,name=used,proto3" json:"used,omitempty"`                                   // Used memory in bytes
	Available   uint64  `protobuf:"varint,3,opt,name=available,proto3" json:"available,omitempty"`                         // Available memory in bytes
	UsedPercent float64 `protobuf:"fixed64,4,opt,name=used_percent,json=usedPercent,proto3" json:"used_percent,omitempty"` // Usage percentage (0-100)
	// contains filtered or unexported fields
}

MemoryStat contains memory usage information

func (*MemoryStat) Descriptor deprecated

func (*MemoryStat) Descriptor() ([]byte, []int)

Deprecated: Use MemoryStat.ProtoReflect.Descriptor instead.

func (*MemoryStat) GetAvailable

func (x *MemoryStat) GetAvailable() uint64

func (*MemoryStat) GetTotal

func (x *MemoryStat) GetTotal() uint64

func (*MemoryStat) GetUsed

func (x *MemoryStat) GetUsed() uint64

func (*MemoryStat) GetUsedPercent

func (x *MemoryStat) GetUsedPercent() float64

func (*MemoryStat) ProtoMessage

func (*MemoryStat) ProtoMessage()

func (*MemoryStat) ProtoReflect

func (x *MemoryStat) ProtoReflect() protoreflect.Message

func (*MemoryStat) Reset

func (x *MemoryStat) Reset()

func (*MemoryStat) String

func (x *MemoryStat) String() string

type MuxBandwidthDone

type MuxBandwidthDone struct {
	TotalBytesSent     uint64 `protobuf:"varint,1,opt,name=total_bytes_sent,json=totalBytesSent,proto3" json:"total_bytes_sent,omitempty"`
	TotalBytesReceived uint64 `protobuf:"varint,2,opt,name=total_bytes_received,json=totalBytesReceived,proto3" json:"total_bytes_received,omitempty"`
	// WallTimeNs is total elapsed including setup; PumpTimeNs excludes
	// setup. Operators comparing throughput across runs typically want
	// PumpTimeNs (apples-to-apples regardless of how long setup took).
	WallTimeNs        int64   `protobuf:"varint,3,opt,name=wall_time_ns,json=wallTimeNs,proto3" json:"wall_time_ns,omitempty"`
	PumpTimeNs        int64   `protobuf:"varint,4,opt,name=pump_time_ns,json=pumpTimeNs,proto3" json:"pump_time_ns,omitempty"`
	AvgSendBps        float64 `protobuf:"fixed64,5,opt,name=avg_send_bps,json=avgSendBps,proto3" json:"avg_send_bps,omitempty"`
	AvgRecvBps        float64 `protobuf:"fixed64,6,opt,name=avg_recv_bps,json=avgRecvBps,proto3" json:"avg_recv_bps,omitempty"`
	PeakSendBps       float64 `protobuf:"fixed64,7,opt,name=peak_send_bps,json=peakSendBps,proto3" json:"peak_send_bps,omitempty"`
	PeakRecvBps       float64 `protobuf:"fixed64,8,opt,name=peak_recv_bps,json=peakRecvBps,proto3" json:"peak_recv_bps,omitempty"`
	RoutesRequested   int32   `protobuf:"varint,9,opt,name=routes_requested,json=routesRequested,proto3" json:"routes_requested,omitempty"`
	RoutesEstablished int32   `protobuf:"varint,10,opt,name=routes_established,json=routesEstablished,proto3" json:"routes_established,omitempty"`
	SetupTotalNs      int64   `protobuf:"varint,11,opt,name=setup_total_ns,json=setupTotalNs,proto3" json:"setup_total_ns,omitempty"`
	// RTT distribution under load — across all probes that fired
	// during the bulk pump phase. Zero when no probes ran or
	// ProbeRtt was false. Jitter is population stddev — same
	// formula as PingTreeResult.jitter_ns.
	ProbeCount    int32 `protobuf:"varint,12,opt,name=probe_count,json=probeCount,proto3" json:"probe_count,omitempty"`
	ProbeAvgNs    int64 `protobuf:"varint,13,opt,name=probe_avg_ns,json=probeAvgNs,proto3" json:"probe_avg_ns,omitempty"`
	ProbeP50Ns    int64 `protobuf:"varint,14,opt,name=probe_p50_ns,json=probeP50Ns,proto3" json:"probe_p50_ns,omitempty"`
	ProbeP99Ns    int64 `protobuf:"varint,15,opt,name=probe_p99_ns,json=probeP99Ns,proto3" json:"probe_p99_ns,omitempty"`
	ProbeJitterNs int64 `protobuf:"varint,16,opt,name=probe_jitter_ns,json=probeJitterNs,proto3" json:"probe_jitter_ns,omitempty"`
	// TerminationReason: "duration" | "context_cancel" | "all_routes_failed" | "error".
	TerminationReason string `protobuf:"bytes,17,opt,name=termination_reason,json=terminationReason,proto3" json:"termination_reason,omitempty"`
	// RTT distribution under no contention — across all probes that
	// fired during the IdleBaselineDuration phase BEFORE the bulk
	// pump. Zero when idle_baseline_duration_ns was 0 or no probes
	// landed in the window. Operators compute the queueing delay
	// as (probe_pXX - idle_probe_pXX); the CLI's summary prints
	// this delta directly when both distributions are present.
	IdleProbeCount    int32 `protobuf:"varint,18,opt,name=idle_probe_count,json=idleProbeCount,proto3" json:"idle_probe_count,omitempty"`
	IdleProbeAvgNs    int64 `protobuf:"varint,19,opt,name=idle_probe_avg_ns,json=idleProbeAvgNs,proto3" json:"idle_probe_avg_ns,omitempty"`
	IdleProbeP50Ns    int64 `protobuf:"varint,20,opt,name=idle_probe_p50_ns,json=idleProbeP50Ns,proto3" json:"idle_probe_p50_ns,omitempty"`
	IdleProbeP99Ns    int64 `protobuf:"varint,21,opt,name=idle_probe_p99_ns,json=idleProbeP99Ns,proto3" json:"idle_probe_p99_ns,omitempty"`
	IdleProbeJitterNs int64 `protobuf:"varint,22,opt,name=idle_probe_jitter_ns,json=idleProbeJitterNs,proto3" json:"idle_probe_jitter_ns,omitempty"`
	// contains filtered or unexported fields
}

MuxBandwidthDone is the terminal event. Aggregates the run.

func (*MuxBandwidthDone) Descriptor deprecated

func (*MuxBandwidthDone) Descriptor() ([]byte, []int)

Deprecated: Use MuxBandwidthDone.ProtoReflect.Descriptor instead.

func (*MuxBandwidthDone) GetAvgRecvBps

func (x *MuxBandwidthDone) GetAvgRecvBps() float64

func (*MuxBandwidthDone) GetAvgSendBps

func (x *MuxBandwidthDone) GetAvgSendBps() float64

func (*MuxBandwidthDone) GetIdleProbeAvgNs

func (x *MuxBandwidthDone) GetIdleProbeAvgNs() int64

func (*MuxBandwidthDone) GetIdleProbeCount

func (x *MuxBandwidthDone) GetIdleProbeCount() int32

func (*MuxBandwidthDone) GetIdleProbeJitterNs

func (x *MuxBandwidthDone) GetIdleProbeJitterNs() int64

func (*MuxBandwidthDone) GetIdleProbeP50Ns

func (x *MuxBandwidthDone) GetIdleProbeP50Ns() int64

func (*MuxBandwidthDone) GetIdleProbeP99Ns

func (x *MuxBandwidthDone) GetIdleProbeP99Ns() int64

func (*MuxBandwidthDone) GetPeakRecvBps

func (x *MuxBandwidthDone) GetPeakRecvBps() float64

func (*MuxBandwidthDone) GetPeakSendBps

func (x *MuxBandwidthDone) GetPeakSendBps() float64

func (*MuxBandwidthDone) GetProbeAvgNs

func (x *MuxBandwidthDone) GetProbeAvgNs() int64

func (*MuxBandwidthDone) GetProbeCount

func (x *MuxBandwidthDone) GetProbeCount() int32

func (*MuxBandwidthDone) GetProbeJitterNs

func (x *MuxBandwidthDone) GetProbeJitterNs() int64

func (*MuxBandwidthDone) GetProbeP50Ns

func (x *MuxBandwidthDone) GetProbeP50Ns() int64

func (*MuxBandwidthDone) GetProbeP99Ns

func (x *MuxBandwidthDone) GetProbeP99Ns() int64

func (*MuxBandwidthDone) GetPumpTimeNs

func (x *MuxBandwidthDone) GetPumpTimeNs() int64

func (*MuxBandwidthDone) GetRoutesEstablished

func (x *MuxBandwidthDone) GetRoutesEstablished() int32

func (*MuxBandwidthDone) GetRoutesRequested

func (x *MuxBandwidthDone) GetRoutesRequested() int32

func (*MuxBandwidthDone) GetSetupTotalNs

func (x *MuxBandwidthDone) GetSetupTotalNs() int64

func (*MuxBandwidthDone) GetTerminationReason

func (x *MuxBandwidthDone) GetTerminationReason() string

func (*MuxBandwidthDone) GetTotalBytesReceived

func (x *MuxBandwidthDone) GetTotalBytesReceived() uint64

func (*MuxBandwidthDone) GetTotalBytesSent

func (x *MuxBandwidthDone) GetTotalBytesSent() uint64

func (*MuxBandwidthDone) GetWallTimeNs

func (x *MuxBandwidthDone) GetWallTimeNs() int64

func (*MuxBandwidthDone) ProtoMessage

func (*MuxBandwidthDone) ProtoMessage()

func (*MuxBandwidthDone) ProtoReflect

func (x *MuxBandwidthDone) ProtoReflect() protoreflect.Message

func (*MuxBandwidthDone) Reset

func (x *MuxBandwidthDone) Reset()

func (*MuxBandwidthDone) String

func (x *MuxBandwidthDone) String() string

type MuxBandwidthError

type MuxBandwidthError struct {
	Code    string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"`
	Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
	// contains filtered or unexported fields
}

MuxBandwidthError signals an unrecoverable condition. Last event before stream close.

func (*MuxBandwidthError) Descriptor deprecated

func (*MuxBandwidthError) Descriptor() ([]byte, []int)

Deprecated: Use MuxBandwidthError.ProtoReflect.Descriptor instead.

func (*MuxBandwidthError) GetCode

func (x *MuxBandwidthError) GetCode() string

func (*MuxBandwidthError) GetMessage

func (x *MuxBandwidthError) GetMessage() string

func (*MuxBandwidthError) ProtoMessage

func (*MuxBandwidthError) ProtoMessage()

func (*MuxBandwidthError) ProtoReflect

func (x *MuxBandwidthError) ProtoReflect() protoreflect.Message

func (*MuxBandwidthError) Reset

func (x *MuxBandwidthError) Reset()

func (*MuxBandwidthError) String

func (x *MuxBandwidthError) String() string

type MuxBandwidthEvent

type MuxBandwidthEvent struct {
	TimestampNs int64 `protobuf:"varint,1,opt,name=timestamp_ns,json=timestampNs,proto3" json:"timestamp_ns,omitempty"`
	// Types that are valid to be assigned to Payload:
	//
	//	*MuxBandwidthEvent_RouteEstablished
	//	*MuxBandwidthEvent_Sample
	//	*MuxBandwidthEvent_RttProbe
	//	*MuxBandwidthEvent_Done
	//	*MuxBandwidthEvent_Error
	//	*MuxBandwidthEvent_RouteFailure
	//	*MuxBandwidthEvent_LegLifecycle
	Payload isMuxBandwidthEvent_Payload `protobuf_oneof:"payload"`
	// contains filtered or unexported fields
}

MuxBandwidthEvent is one entry on the stream. Exactly one oneof payload is set per message.

func (*MuxBandwidthEvent) Descriptor deprecated

func (*MuxBandwidthEvent) Descriptor() ([]byte, []int)

Deprecated: Use MuxBandwidthEvent.ProtoReflect.Descriptor instead.

func (*MuxBandwidthEvent) GetDone

func (x *MuxBandwidthEvent) GetDone() *MuxBandwidthDone

func (*MuxBandwidthEvent) GetError

func (x *MuxBandwidthEvent) GetError() *MuxBandwidthError

func (*MuxBandwidthEvent) GetLegLifecycle

func (x *MuxBandwidthEvent) GetLegLifecycle() *MuxLegLifecycle

func (*MuxBandwidthEvent) GetPayload

func (x *MuxBandwidthEvent) GetPayload() isMuxBandwidthEvent_Payload

func (*MuxBandwidthEvent) GetRouteEstablished

func (x *MuxBandwidthEvent) GetRouteEstablished() *MuxRouteEstablished

func (*MuxBandwidthEvent) GetRouteFailure

func (x *MuxBandwidthEvent) GetRouteFailure() *MuxRouteFailure

func (*MuxBandwidthEvent) GetRttProbe

func (x *MuxBandwidthEvent) GetRttProbe() *MuxRttProbe

func (*MuxBandwidthEvent) GetSample

func (x *MuxBandwidthEvent) GetSample() *MuxBandwidthSample

func (*MuxBandwidthEvent) GetTimestampNs

func (x *MuxBandwidthEvent) GetTimestampNs() int64

func (*MuxBandwidthEvent) ProtoMessage

func (*MuxBandwidthEvent) ProtoMessage()

func (*MuxBandwidthEvent) ProtoReflect

func (x *MuxBandwidthEvent) ProtoReflect() protoreflect.Message

func (*MuxBandwidthEvent) Reset

func (x *MuxBandwidthEvent) Reset()

func (*MuxBandwidthEvent) String

func (x *MuxBandwidthEvent) String() string

type MuxBandwidthEvent_Done

type MuxBandwidthEvent_Done struct {
	// Done is the terminal event before stream close. Carries the
	// aggregated totals + RTT distribution stats.
	Done *MuxBandwidthDone `protobuf:"bytes,13,opt,name=done,proto3,oneof"`
}

type MuxBandwidthEvent_Error

type MuxBandwidthEvent_Error struct {
	// Error signals an unrecoverable condition. Last event before
	// stream close; same shape semantics as PingTreeServerError.
	Error *MuxBandwidthError `protobuf:"bytes,14,opt,name=error,proto3,oneof"`
}

type MuxBandwidthEvent_LegLifecycle

type MuxBandwidthEvent_LegLifecycle struct {
	// LegLifecycle fires when the routing-policy on_tick hook mutates the
	// leg set — a leg added, dropped, promoted from warm standby, or demoted
	// to it. Only emitted on policy-driven (`policy-bw`) runs; the pure
	// mux-bw baseline never mutates its leg set mid-run so never emits these.
	// Lets the telemetry chart render hot-swaps against the per-leg bandwidth
	// series.
	LegLifecycle *MuxLegLifecycle `protobuf:"bytes,16,opt,name=leg_lifecycle,json=legLifecycle,proto3,oneof"`
}

type MuxBandwidthEvent_RouteEstablished

type MuxBandwidthEvent_RouteEstablished struct {
	// RouteEstablished fires once per route (in any order) as the
	// setup phase completes. Carries the actual route hops chosen,
	// letting consumers verify min_hops was honored.
	RouteEstablished *MuxRouteEstablished `protobuf:"bytes,10,opt,name=route_established,json=routeEstablished,proto3,oneof"`
}

type MuxBandwidthEvent_RouteFailure

type MuxBandwidthEvent_RouteFailure struct {
	// RouteFailure fires when a route's pump goroutine exits with an
	// error AFTER the route was established. Distinct from
	// MuxRouteEstablished{failed:true,setup_err:...} which covers
	// setup-phase failures. Carries the partial bytes shipped before
	// the pump goroutine died so the consumer can attribute throughput
	// contributions accurately.
	RouteFailure *MuxRouteFailure `protobuf:"bytes,15,opt,name=route_failure,json=routeFailure,proto3,oneof"`
}

type MuxBandwidthEvent_RttProbe

type MuxBandwidthEvent_RttProbe struct {
	// RttProbe fires every probe_interval_ns when ProbeRtt is set.
	// Standalone from the Sample event because probes are async.
	RttProbe *MuxRttProbe `protobuf:"bytes,12,opt,name=rtt_probe,json=rttProbe,proto3,oneof"`
}

type MuxBandwidthEvent_Sample

type MuxBandwidthEvent_Sample struct {
	// Sample fires every sample_interval_ns with cumulative + instant
	// throughput numbers. Sent until pump duration elapses.
	Sample *MuxBandwidthSample `protobuf:"bytes,11,opt,name=sample,proto3,oneof"`
}

type MuxBandwidthRequest

type MuxBandwidthRequest struct {

	// TargetPk is the remote visor's public key. Required.
	TargetPk string `protobuf:"bytes,1,opt,name=target_pk,json=targetPk,proto3" json:"target_pk,omitempty"`
	// Routes is the number of parallel route connections to open.
	// 1 = single route (the StreamBandwidthTest equivalent).
	// N > 1 = N concurrent routes pumping bytes, aggregate throughput
	// is the headline measurement. 0 falls back to 1.
	Routes int32 `protobuf:"varint,2,opt,name=routes,proto3" json:"routes,omitempty"`
	// DurationNs caps the total wall-clock time spent pumping bytes.
	// 0 falls back to 30s.
	DurationNs int64 `protobuf:"varint,3,opt,name=duration_ns,json=durationNs,proto3" json:"duration_ns,omitempty"`
	// PacketSizeKb sizes each write block. Larger amortizes write
	// overhead; smaller surfaces stalls faster. 0 falls back to 32 KB.
	PacketSizeKb int32 `protobuf:"varint,4,opt,name=packet_size_kb,json=packetSizeKb,proto3" json:"packet_size_kb,omitempty"`
	// MinHops is the route-finder's minimum hop constraint. When > 1,
	// the route excludes any direct transport between the local visor
	// and TargetPk — forcing the bandwidth pump through intermediates.
	// This is the "mux excluding direct" cell of the operator's
	// hypothesis. 0 uses the visor's routing.min_hops config default
	// (usually 1).
	MinHops int32 `protobuf:"varint,5,opt,name=min_hops,json=minHops,proto3" json:"min_hops,omitempty"`
	// SetupTimeoutNs bounds each route's setup phase. 0 falls back to
	// 30s. Long setup times are common for multi-hop routes (see the
	// p95=9.5s level-1 setup numbers from the ping-tree measurement).
	SetupTimeoutNs int64 `protobuf:"varint,6,opt,name=setup_timeout_ns,json=setupTimeoutNs,proto3" json:"setup_timeout_ns,omitempty"`
	// ProbeRtt toggles a separate small-packet RTT probe that runs
	// concurrently with the bulk pump. Pairs are emitted as
	// MuxRttProbe events. The probe rides the SAME first route as the
	// bulk pump, so the resulting RTT samples reflect that route's
	// saturation — the queueing-delay signal.
	ProbeRtt bool `protobuf:"varint,7,opt,name=probe_rtt,json=probeRtt,proto3" json:"probe_rtt,omitempty"`
	// ProbeIntervalNs is how often the RTT probe fires. 0 falls back
	// to 100 ms. Faster = denser jitter signal; slower = less
	// contention with the bulk pump.
	ProbeIntervalNs int64 `protobuf:"varint,8,opt,name=probe_interval_ns,json=probeIntervalNs,proto3" json:"probe_interval_ns,omitempty"`
	// SampleIntervalNs is how often a MuxBandwidthSample is emitted.
	// 0 falls back to 1s. Smaller surfaces transient throughput dips
	// (bufferbloat, queue spikes); larger reduces stream chatter.
	SampleIntervalNs int64 `protobuf:"varint,9,opt,name=sample_interval_ns,json=sampleIntervalNs,proto3" json:"sample_interval_ns,omitempty"`
	// LocalRoute uses local route calculation (cached TPD data)
	// instead of querying the route-finder service. Mirrors
	// BandwidthRequest.LocalRoute.
	LocalRoute bool `protobuf:"varint,10,opt,name=local_route,json=localRoute,proto3" json:"local_route,omitempty"`
	// IdleBaselineDurationNs, when > 0, inserts a quiescent probe
	// phase between route setup and the bulk pump. During the phase
	// the same probe loop fires (rate = probe_interval_ns) but no
	// pump goroutines run — so the RTT samples reflect the route
	// with zero contention. The aggregated distribution comes back
	// in MuxBandwidthDone.idle_probe_* fields, and the queueing
	// delay computed by callers is (loaded_pXX - idle_pXX). 0 = no
	// idle phase (skip the baseline measurement). Implies ProbeRtt =
	// true at the handler — without probes there's nothing to
	// measure.
	IdleBaselineDurationNs int64 `` /* 133-byte string literal not displayed */
	// RoutingPolicy, when non-empty, drives this run through the WASM /
	// Starlark routing-policy engine instead of the pure-measurement path.
	// Accepts the same values as the visor's routing.policy_per_dial config:
	// "preset:<name>" (a compiled bundle preset — rotating-bw, elastic-mux,
	// latency-adaptive, app-mux, adaptive, probe-and-prune), "@/path/to.wasm",
	// "@/path/to.star", or an inline Starlark string. When set, the handler
	// (a) calls the engine's decide_route to pick the mux leg count + min-hops
	// at setup, and (b) fires the engine's on_tick hook against the live per-leg
	// stats on the sample cadence, applying the returned add/drop/promote/demote
	// leg actions — the in-process rig that proves a preset is demonstrably
	// adaptive over a live multiplexed route. Empty = the untouched mux-bw
	// baseline. This is the `policy-bw` CLI sibling's surface.
	RoutingPolicy string `protobuf:"bytes,12,opt,name=routing_policy,json=routingPolicy,proto3" json:"routing_policy,omitempty"`
	// PolicyApp is the app name the routing-policy engine sees as
	// RoutingContext.App — presets branch on it (latency-adaptive acts on
	// vpn-client/skysocks-client/skynet-client; app-mux is per-app). Only
	// meaningful when routing_policy is set; the handler defaults it to
	// "skysocks-client" so the bandwidth-oriented presets are exercised.
	PolicyApp string `protobuf:"bytes,13,opt,name=policy_app,json=policyApp,proto3" json:"policy_app,omitempty"`
	// CliOverrides surfaces the operator's ad-hoc `--override key=value` flags
	// into the routing-policy engine's RoutingContext.CLIOverrides — the same
	// map the conditional presets read: geo-avoid (avoid_geo=<CC,CC>),
	// trust-tiered (trusted_pks=<PK,PK>), time-of-day (business_hours=START-END).
	// Only meaningful when routing_policy is set. Absent/empty = the preset's
	// built-in defaults (unchanged behavior). Keys collide-last with the
	// handler-derived mux_routes / min_hops entries the controller already sets.
	CliOverrides map[string]string `` /* 172-byte string literal not displayed */
	// contains filtered or unexported fields
}

MuxBandwidthRequest configures a multiplexed-route bandwidth + RTT probe run against a single target peer. See StreamMuxBandwidth's docstring for the operator-visible hypothesis this serves.

All durations are nanoseconds (proto convention used throughout this service). All "0 = default" fields fall back to handler-side constants documented inline.

func (*MuxBandwidthRequest) Descriptor deprecated

func (*MuxBandwidthRequest) Descriptor() ([]byte, []int)

Deprecated: Use MuxBandwidthRequest.ProtoReflect.Descriptor instead.

func (*MuxBandwidthRequest) GetCliOverrides

func (x *MuxBandwidthRequest) GetCliOverrides() map[string]string

func (*MuxBandwidthRequest) GetDurationNs

func (x *MuxBandwidthRequest) GetDurationNs() int64

func (*MuxBandwidthRequest) GetIdleBaselineDurationNs

func (x *MuxBandwidthRequest) GetIdleBaselineDurationNs() int64

func (*MuxBandwidthRequest) GetLocalRoute

func (x *MuxBandwidthRequest) GetLocalRoute() bool

func (*MuxBandwidthRequest) GetMinHops

func (x *MuxBandwidthRequest) GetMinHops() int32

func (*MuxBandwidthRequest) GetPacketSizeKb

func (x *MuxBandwidthRequest) GetPacketSizeKb() int32

func (*MuxBandwidthRequest) GetPolicyApp

func (x *MuxBandwidthRequest) GetPolicyApp() string

func (*MuxBandwidthRequest) GetProbeIntervalNs

func (x *MuxBandwidthRequest) GetProbeIntervalNs() int64

func (*MuxBandwidthRequest) GetProbeRtt

func (x *MuxBandwidthRequest) GetProbeRtt() bool

func (*MuxBandwidthRequest) GetRoutes

func (x *MuxBandwidthRequest) GetRoutes() int32

func (*MuxBandwidthRequest) GetRoutingPolicy

func (x *MuxBandwidthRequest) GetRoutingPolicy() string

func (*MuxBandwidthRequest) GetSampleIntervalNs

func (x *MuxBandwidthRequest) GetSampleIntervalNs() int64

func (*MuxBandwidthRequest) GetSetupTimeoutNs

func (x *MuxBandwidthRequest) GetSetupTimeoutNs() int64

func (*MuxBandwidthRequest) GetTargetPk

func (x *MuxBandwidthRequest) GetTargetPk() string

func (*MuxBandwidthRequest) ProtoMessage

func (*MuxBandwidthRequest) ProtoMessage()

func (*MuxBandwidthRequest) ProtoReflect

func (x *MuxBandwidthRequest) ProtoReflect() protoreflect.Message

func (*MuxBandwidthRequest) Reset

func (x *MuxBandwidthRequest) Reset()

func (*MuxBandwidthRequest) String

func (x *MuxBandwidthRequest) String() string

type MuxBandwidthSample

type MuxBandwidthSample struct {

	// ElapsedNs is the time since the first byte was sent (NOT since
	// the run was requested — excludes setup time).
	ElapsedNs     int64  `protobuf:"varint,1,opt,name=elapsed_ns,json=elapsedNs,proto3" json:"elapsed_ns,omitempty"`
	BytesSent     uint64 `protobuf:"varint,2,opt,name=bytes_sent,json=bytesSent,proto3" json:"bytes_sent,omitempty"`
	BytesReceived uint64 `protobuf:"varint,3,opt,name=bytes_received,json=bytesReceived,proto3" json:"bytes_received,omitempty"`
	// InstantSendBps / RecvBps are per-interval rates. avg_*_bps are
	// run-cumulative rates. All in bits-per-second (matches the
	// network-engineer convention; consumers needing Mbps divide by
	// 1e6).
	InstantSendBps float64 `protobuf:"fixed64,4,opt,name=instant_send_bps,json=instantSendBps,proto3" json:"instant_send_bps,omitempty"`
	InstantRecvBps float64 `protobuf:"fixed64,5,opt,name=instant_recv_bps,json=instantRecvBps,proto3" json:"instant_recv_bps,omitempty"`
	AvgSendBps     float64 `protobuf:"fixed64,6,opt,name=avg_send_bps,json=avgSendBps,proto3" json:"avg_send_bps,omitempty"`
	AvgRecvBps     float64 `protobuf:"fixed64,7,opt,name=avg_recv_bps,json=avgRecvBps,proto3" json:"avg_recv_bps,omitempty"`
	// ActiveRoutes is how many of the Routes-requested routes are
	// still pumping. Drops when a route fails mid-run.
	ActiveRoutes int32 `protobuf:"varint,8,opt,name=active_routes,json=activeRoutes,proto3" json:"active_routes,omitempty"`
	// Legs is the per-route breakdown for this sample interval. One
	// entry per established route, in route-index order. Additive to
	// the aggregate fields above: consumers measuring adaptive routing
	// policies read per-leg bandwidth + identity over time from here,
	// while consumers wanting only the total keep using the aggregate
	// fields. Empty on runs where no route came up.
	Legs []*MuxLegSample `protobuf:"bytes,9,rep,name=legs,proto3" json:"legs,omitempty"`
	// contains filtered or unexported fields
}

MuxBandwidthSample is a periodic throughput snapshot. Cumulative fields are run-totals across all routes; instant fields are per-sample-interval rates.

func (*MuxBandwidthSample) Descriptor deprecated

func (*MuxBandwidthSample) Descriptor() ([]byte, []int)

Deprecated: Use MuxBandwidthSample.ProtoReflect.Descriptor instead.

func (*MuxBandwidthSample) GetActiveRoutes

func (x *MuxBandwidthSample) GetActiveRoutes() int32

func (*MuxBandwidthSample) GetAvgRecvBps

func (x *MuxBandwidthSample) GetAvgRecvBps() float64

func (*MuxBandwidthSample) GetAvgSendBps

func (x *MuxBandwidthSample) GetAvgSendBps() float64

func (*MuxBandwidthSample) GetBytesReceived

func (x *MuxBandwidthSample) GetBytesReceived() uint64

func (*MuxBandwidthSample) GetBytesSent

func (x *MuxBandwidthSample) GetBytesSent() uint64

func (*MuxBandwidthSample) GetElapsedNs

func (x *MuxBandwidthSample) GetElapsedNs() int64

func (*MuxBandwidthSample) GetInstantRecvBps

func (x *MuxBandwidthSample) GetInstantRecvBps() float64

func (*MuxBandwidthSample) GetInstantSendBps

func (x *MuxBandwidthSample) GetInstantSendBps() float64

func (*MuxBandwidthSample) GetLegs

func (x *MuxBandwidthSample) GetLegs() []*MuxLegSample

func (*MuxBandwidthSample) ProtoMessage

func (*MuxBandwidthSample) ProtoMessage()

func (*MuxBandwidthSample) ProtoReflect

func (x *MuxBandwidthSample) ProtoReflect() protoreflect.Message

func (*MuxBandwidthSample) Reset

func (x *MuxBandwidthSample) Reset()

func (*MuxBandwidthSample) String

func (x *MuxBandwidthSample) String() string

type MuxLegLifecycle

type MuxLegLifecycle struct {

	// Event is one of "added", "dropped", "promoted", "demoted".
	Event string `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"`
	// RouteIndex is the affected leg's index at the time of the event.
	RouteIndex int32 `protobuf:"varint,2,opt,name=route_index,json=routeIndex,proto3" json:"route_index,omitempty"`
	// GateState is the leg's resulting warm-standby gate state: "active"
	// (selected for pumping) or "standby" (kept alive via keepalive but not
	// pumped). Mirrors router.LegInfo.Standby observed by the on_tick ABI.
	GateState string `protobuf:"bytes,3,opt,name=gate_state,json=gateState,proto3" json:"gate_state,omitempty"`
	// IntermediatePk / TransportKind identify the affected leg's path — same
	// fields as MuxLegSample so a consumer can join the event to the series.
	IntermediatePk string `protobuf:"bytes,4,opt,name=intermediate_pk,json=intermediatePk,proto3" json:"intermediate_pk,omitempty"`
	TransportKind  string `protobuf:"bytes,5,opt,name=transport_kind,json=transportKind,proto3" json:"transport_kind,omitempty"`
	// ElapsedNs is time since pump-start when the mutation was applied. Same
	// epoch as MuxBandwidthSample.ElapsedNs.
	ElapsedNs int64 `protobuf:"varint,6,opt,name=elapsed_ns,json=elapsedNs,proto3" json:"elapsed_ns,omitempty"`
	// contains filtered or unexported fields
}

MuxLegLifecycle records one policy-driven leg-set mutation from the on_tick hook. The rig is the in-process analog of the route group's RotationAction executor (add/drop/promote/demote), so a preset's adaptive behavior is visible as a stream of these events interleaved with the per-leg MuxBandwidthSample series.

func (*MuxLegLifecycle) Descriptor deprecated

func (*MuxLegLifecycle) Descriptor() ([]byte, []int)

Deprecated: Use MuxLegLifecycle.ProtoReflect.Descriptor instead.

func (*MuxLegLifecycle) GetElapsedNs

func (x *MuxLegLifecycle) GetElapsedNs() int64

func (*MuxLegLifecycle) GetEvent

func (x *MuxLegLifecycle) GetEvent() string

func (*MuxLegLifecycle) GetGateState

func (x *MuxLegLifecycle) GetGateState() string

func (*MuxLegLifecycle) GetIntermediatePk

func (x *MuxLegLifecycle) GetIntermediatePk() string

func (*MuxLegLifecycle) GetRouteIndex

func (x *MuxLegLifecycle) GetRouteIndex() int32

func (*MuxLegLifecycle) GetTransportKind

func (x *MuxLegLifecycle) GetTransportKind() string

func (*MuxLegLifecycle) ProtoMessage

func (*MuxLegLifecycle) ProtoMessage()

func (*MuxLegLifecycle) ProtoReflect

func (x *MuxLegLifecycle) ProtoReflect() protoreflect.Message

func (*MuxLegLifecycle) Reset

func (x *MuxLegLifecycle) Reset()

func (*MuxLegLifecycle) String

func (x *MuxLegLifecycle) String() string

type MuxLegSample

type MuxLegSample struct {

	// RouteIndex is the same 0..Routes-1 index from the matching
	// MuxRouteEstablished event, letting consumers join a leg's
	// per-sample series back to its established path.
	RouteIndex int32 `protobuf:"varint,1,opt,name=route_index,json=routeIndex,proto3" json:"route_index,omitempty"`
	// IntermediatePk is the first hop's `to` PK — the leg's
	// distinguishing intermediate. Empty when the route is direct
	// (single hop straight to the target, no intermediate).
	IntermediatePk string `protobuf:"bytes,2,opt,name=intermediate_pk,json=intermediatePk,proto3" json:"intermediate_pk,omitempty"`
	// TransportKind is the first hop's transport type (stcpr, sudph,
	// dmsg, ...). Lets consumers correlate per-leg throughput with the
	// carrier the leg egresses on.
	TransportKind string `protobuf:"bytes,3,opt,name=transport_kind,json=transportKind,proto3" json:"transport_kind,omitempty"`
	// BytesSent / BytesRecv are cumulative for this leg since pump
	// start (NOT since the last sample) — same epoch as the aggregate
	// MuxBandwidthSample.BytesSent.
	BytesSent int64 `protobuf:"varint,4,opt,name=bytes_sent,json=bytesSent,proto3" json:"bytes_sent,omitempty"`
	BytesRecv int64 `protobuf:"varint,5,opt,name=bytes_recv,json=bytesRecv,proto3" json:"bytes_recv,omitempty"`
	// InstSendBps / InstRecvBps are this leg's per-interval rates
	// (delta since the previous sample), in bits-per-second — mirrors
	// how MuxBandwidthSample.InstantSendBps is computed for the
	// aggregate.
	InstSendBps float64 `protobuf:"fixed64,6,opt,name=inst_send_bps,json=instSendBps,proto3" json:"inst_send_bps,omitempty"`
	InstRecvBps float64 `protobuf:"fixed64,7,opt,name=inst_recv_bps,json=instRecvBps,proto3" json:"inst_recv_bps,omitempty"`
	// Alive is the route's not-failed state — true while the leg's
	// pump goroutine is still running. Matches the accounting behind
	// MuxBandwidthSample.ActiveRoutes.
	Alive bool `protobuf:"varint,8,opt,name=alive,proto3" json:"alive,omitempty"`
	// LatencyMs is the leg's EWMA-smoothed round-trip latency in
	// milliseconds, sampled by the per-leg policy probe. 0 = unknown (no
	// measurement yet). Only populated on policy-driven runs — the pure
	// baseline uses a single dedicated probe route, not per-leg probes.
	// This is the signal latency-adaptive / adaptive presets evict on.
	LatencyMs int32 `protobuf:"varint,9,opt,name=latency_ms,json=latencyMs,proto3" json:"latency_ms,omitempty"`
	// Standby is the leg's warm-standby gate state: true when the policy
	// demoted this leg (kept alive via keepalive, not pumped). Lets the
	// telemetry consumer see the gate flip in the per-sample series, not
	// just at the lifecycle event.
	Standby bool `protobuf:"varint,10,opt,name=standby,proto3" json:"standby,omitempty"`
	// contains filtered or unexported fields
}

MuxLegSample is one route's contribution within a single MuxBandwidthSample interval. It carries both the leg's cumulative byte counters and its per-interval instantaneous rates, plus the identity fields (intermediate PK + first-hop transport kind) that distinguish this leg from the others — so a policy-measurement consumer can attribute throughput to a specific path over time.

func (*MuxLegSample) Descriptor deprecated

func (*MuxLegSample) Descriptor() ([]byte, []int)

Deprecated: Use MuxLegSample.ProtoReflect.Descriptor instead.

func (*MuxLegSample) GetAlive

func (x *MuxLegSample) GetAlive() bool

func (*MuxLegSample) GetBytesRecv

func (x *MuxLegSample) GetBytesRecv() int64

func (*MuxLegSample) GetBytesSent

func (x *MuxLegSample) GetBytesSent() int64

func (*MuxLegSample) GetInstRecvBps

func (x *MuxLegSample) GetInstRecvBps() float64

func (*MuxLegSample) GetInstSendBps

func (x *MuxLegSample) GetInstSendBps() float64

func (*MuxLegSample) GetIntermediatePk

func (x *MuxLegSample) GetIntermediatePk() string

func (*MuxLegSample) GetLatencyMs

func (x *MuxLegSample) GetLatencyMs() int32

func (*MuxLegSample) GetRouteIndex

func (x *MuxLegSample) GetRouteIndex() int32

func (*MuxLegSample) GetStandby

func (x *MuxLegSample) GetStandby() bool

func (*MuxLegSample) GetTransportKind

func (x *MuxLegSample) GetTransportKind() string

func (*MuxLegSample) ProtoMessage

func (*MuxLegSample) ProtoMessage()

func (*MuxLegSample) ProtoReflect

func (x *MuxLegSample) ProtoReflect() protoreflect.Message

func (*MuxLegSample) Reset

func (x *MuxLegSample) Reset()

func (*MuxLegSample) String

func (x *MuxLegSample) String() string

type MuxRouteEstablished

type MuxRouteEstablished struct {

	// RouteIndex is 0..Routes-1, assigned in setup-order.
	RouteIndex int32 `protobuf:"varint,1,opt,name=route_index,json=routeIndex,proto3" json:"route_index,omitempty"`
	// SetupLatencyNs is the time spent on the route-setup phase
	// (route-finder query + setup-node negotiation + handshake).
	SetupLatencyNs int64 `protobuf:"varint,2,opt,name=setup_latency_ns,json=setupLatencyNs,proto3" json:"setup_latency_ns,omitempty"`
	// Hops is the chosen path. Consumers verify min_hops by
	// counting (len(hops) - 1) intermediate edges.
	Hops []*RouteHop `protobuf:"bytes,3,rep,name=hops,proto3" json:"hops,omitempty"`
	// Failed is set when the route could not be established;
	// SetupErr carries the cause. The route is excluded from the
	// pump phase but kept in the event log for diagnostics.
	Failed   bool   `protobuf:"varint,4,opt,name=failed,proto3" json:"failed,omitempty"`
	SetupErr string `protobuf:"bytes,5,opt,name=setup_err,json=setupErr,proto3" json:"setup_err,omitempty"`
	// contains filtered or unexported fields
}

MuxRouteEstablished records one route's setup outcome.

func (*MuxRouteEstablished) Descriptor deprecated

func (*MuxRouteEstablished) Descriptor() ([]byte, []int)

Deprecated: Use MuxRouteEstablished.ProtoReflect.Descriptor instead.

func (*MuxRouteEstablished) GetFailed

func (x *MuxRouteEstablished) GetFailed() bool

func (*MuxRouteEstablished) GetHops

func (x *MuxRouteEstablished) GetHops() []*RouteHop

func (*MuxRouteEstablished) GetRouteIndex

func (x *MuxRouteEstablished) GetRouteIndex() int32

func (*MuxRouteEstablished) GetSetupErr

func (x *MuxRouteEstablished) GetSetupErr() string

func (*MuxRouteEstablished) GetSetupLatencyNs

func (x *MuxRouteEstablished) GetSetupLatencyNs() int64

func (*MuxRouteEstablished) ProtoMessage

func (*MuxRouteEstablished) ProtoMessage()

func (*MuxRouteEstablished) ProtoReflect

func (x *MuxRouteEstablished) ProtoReflect() protoreflect.Message

func (*MuxRouteEstablished) Reset

func (x *MuxRouteEstablished) Reset()

func (*MuxRouteEstablished) String

func (x *MuxRouteEstablished) String() string

type MuxRouteFailure

type MuxRouteFailure struct {

	// RouteIndex is the same 0..Routes-1 index from the matching
	// MuxRouteEstablished event.
	RouteIndex int32 `protobuf:"varint,1,opt,name=route_index,json=routeIndex,proto3" json:"route_index,omitempty"`
	// ErrorMessage is the formatted error returned by the pump call.
	ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"`
	// BytesSentBeforeFailure / BytesReceivedBeforeFailure are the
	// cumulative bytes the route had pumped up to the failure point.
	// Zero is meaningful — indicates the first call after route
	// establishment failed before any bytes shipped.
	BytesSentBeforeFailure     uint64 `` /* 132-byte string literal not displayed */
	BytesReceivedBeforeFailure uint64 `` /* 144-byte string literal not displayed */
	// ElapsedNs is time since pump-start when the failure happened.
	// Same epoch as MuxBandwidthSample.ElapsedNs.
	ElapsedNs int64 `protobuf:"varint,5,opt,name=elapsed_ns,json=elapsedNs,proto3" json:"elapsed_ns,omitempty"`
	// contains filtered or unexported fields
}

MuxRouteFailure records a route's pump-phase exit-with-error. Distinct from MuxRouteEstablished{failed:true} which covers setup-phase failures. Pre-this event, pump goroutines that hit PingOnceWithEcho errors silently exited and the route's bytes contribution stopped accruing — operator-visible only as a drop in MuxBandwidthSample.active_routes with no explanation.

This event surfaces the cause: the first PingOnceWithEcho call that fails terminates the route's pump goroutine, and we emit one of these with the bytes shipped before the failure so the consumer can compute per-route effective throughput.

func (*MuxRouteFailure) Descriptor deprecated

func (*MuxRouteFailure) Descriptor() ([]byte, []int)

Deprecated: Use MuxRouteFailure.ProtoReflect.Descriptor instead.

func (*MuxRouteFailure) GetBytesReceivedBeforeFailure

func (x *MuxRouteFailure) GetBytesReceivedBeforeFailure() uint64

func (*MuxRouteFailure) GetBytesSentBeforeFailure

func (x *MuxRouteFailure) GetBytesSentBeforeFailure() uint64

func (*MuxRouteFailure) GetElapsedNs

func (x *MuxRouteFailure) GetElapsedNs() int64

func (*MuxRouteFailure) GetErrorMessage

func (x *MuxRouteFailure) GetErrorMessage() string

func (*MuxRouteFailure) GetRouteIndex

func (x *MuxRouteFailure) GetRouteIndex() int32

func (*MuxRouteFailure) ProtoMessage

func (*MuxRouteFailure) ProtoMessage()

func (*MuxRouteFailure) ProtoReflect

func (x *MuxRouteFailure) ProtoReflect() protoreflect.Message

func (*MuxRouteFailure) Reset

func (x *MuxRouteFailure) Reset()

func (*MuxRouteFailure) String

func (x *MuxRouteFailure) String() string

type MuxRttProbe

type MuxRttProbe struct {

	// Sequence is the 1-indexed probe number, in emit order.
	Sequence int64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"`
	// LatencyNs is the measured RTT. 0 when the probe failed; Error
	// carries the cause.
	LatencyNs int64  `protobuf:"varint,2,opt,name=latency_ns,json=latencyNs,proto3" json:"latency_ns,omitempty"`
	Error     string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"`
	// ElapsedNs is the time since the first byte was sent (same epoch
	// as MuxBandwidthSample.ElapsedNs). Lets consumers align probes
	// with concurrent bandwidth samples without timestamp diffing.
	ElapsedNs int64 `protobuf:"varint,4,opt,name=elapsed_ns,json=elapsedNs,proto3" json:"elapsed_ns,omitempty"`
	// contains filtered or unexported fields
}

MuxRttProbe is one RTT measurement during the pump. Allows consumers to plot loaded-RTT-over-time and compute queueing delay as (loaded_rtt - baseline_rtt).

func (*MuxRttProbe) Descriptor deprecated

func (*MuxRttProbe) Descriptor() ([]byte, []int)

Deprecated: Use MuxRttProbe.ProtoReflect.Descriptor instead.

func (*MuxRttProbe) GetElapsedNs

func (x *MuxRttProbe) GetElapsedNs() int64

func (*MuxRttProbe) GetError

func (x *MuxRttProbe) GetError() string

func (*MuxRttProbe) GetLatencyNs

func (x *MuxRttProbe) GetLatencyNs() int64

func (*MuxRttProbe) GetSequence

func (x *MuxRttProbe) GetSequence() int64

func (*MuxRttProbe) ProtoMessage

func (*MuxRttProbe) ProtoMessage()

func (*MuxRttProbe) ProtoReflect

func (x *MuxRttProbe) ProtoReflect() protoreflect.Message

func (*MuxRttProbe) Reset

func (x *MuxRttProbe) Reset()

func (*MuxRttProbe) String

func (x *MuxRttProbe) String() string

type NetworkStat

type NetworkStat struct {
	BytesSent     uint64  `protobuf:"varint,1,opt,name=bytes_sent,json=bytesSent,proto3" json:"bytes_sent,omitempty"`                // Total bytes sent
	BytesRecv     uint64  `protobuf:"varint,2,opt,name=bytes_recv,json=bytesRecv,proto3" json:"bytes_recv,omitempty"`                // Total bytes received
	PacketsSent   uint64  `protobuf:"varint,3,opt,name=packets_sent,json=packetsSent,proto3" json:"packets_sent,omitempty"`          // Total packets sent
	PacketsRecv   uint64  `protobuf:"varint,4,opt,name=packets_recv,json=packetsRecv,proto3" json:"packets_recv,omitempty"`          // Total packets received
	BytesSentRate float64 `protobuf:"fixed64,5,opt,name=bytes_sent_rate,json=bytesSentRate,proto3" json:"bytes_sent_rate,omitempty"` // Bytes sent per second (since last update)
	BytesRecvRate float64 `protobuf:"fixed64,6,opt,name=bytes_recv_rate,json=bytesRecvRate,proto3" json:"bytes_recv_rate,omitempty"` // Bytes received per second (since last update)
	// contains filtered or unexported fields
}

NetworkStat contains network I/O information

func (*NetworkStat) Descriptor deprecated

func (*NetworkStat) Descriptor() ([]byte, []int)

Deprecated: Use NetworkStat.ProtoReflect.Descriptor instead.

func (*NetworkStat) GetBytesRecv

func (x *NetworkStat) GetBytesRecv() uint64

func (*NetworkStat) GetBytesRecvRate

func (x *NetworkStat) GetBytesRecvRate() float64

func (*NetworkStat) GetBytesSent

func (x *NetworkStat) GetBytesSent() uint64

func (*NetworkStat) GetBytesSentRate

func (x *NetworkStat) GetBytesSentRate() float64

func (*NetworkStat) GetPacketsRecv

func (x *NetworkStat) GetPacketsRecv() uint64

func (*NetworkStat) GetPacketsSent

func (x *NetworkStat) GetPacketsSent() uint64

func (*NetworkStat) ProtoMessage

func (*NetworkStat) ProtoMessage()

func (*NetworkStat) ProtoReflect

func (x *NetworkStat) ProtoReflect() protoreflect.Message

func (*NetworkStat) Reset

func (x *NetworkStat) Reset()

func (*NetworkStat) String

func (x *NetworkStat) String() string

type PingClient

type PingClient struct {
	// contains filtered or unexported fields
}

PingClient provides streaming ping operations via gRPC

func NewPingClient

func NewPingClient(addr string) (*PingClient, error)

NewPingClient creates a new gRPC ping client NewPingClient creates a new gRPC ping client. It dials through vnet, so in a browser tab the address reaches the in-tab visor, and passthrough keeps gRPC from resolving it over DNS, which a tab does not have.

func (*PingClient) Close

func (c *PingClient) Close() error

Close closes the gRPC connection

func (*PingClient) GetRemoteDmsgServers

func (c *PingClient) GetRemoteDmsgServers(ctx context.Context, pk string) ([]string, error)

GetRemoteDmsgServers returns the DMSG servers a remote visor is connected to

func (*PingClient) GetSystemStats

func (c *PingClient) GetSystemStats(ctx context.Context, includeProcesses bool, processLimit int32) (*SystemStats, error)

GetSystemStats returns a single snapshot of system stats.

func (*PingClient) StreamAppLogs

func (c *PingClient) StreamAppLogs(ctx context.Context, appName string, includeRouter bool, minLevel string, modules []string, subscribed chan<- struct{}, cb AppLogCallback) error

StreamAppLogs subscribes to the visor's master logger and calls cb for each entry that matches the filter. Blocks until ctx is canceled or the stream errors. Used by 'proxy start --verbose' (app-name scoped) and 'dmsg curl --verbose' (module-prefix scoped).

modules is OR-merged with appName; either or both must be non-empty.

If subscribed is non-nil, it is closed once the server confirms the subscription is live (via the Subscribed sentinel entry). Callers should wait on this channel before triggering downstream RPCs whose log output they want to capture, so the first burst of activity isn't lost to the subscription handshake. The sentinel itself is not delivered to cb.

func (*PingClient) StreamBandwidthTest

func (c *PingClient) StreamBandwidthTest(ctx context.Context, pk string, duration time.Duration, pcktSize int32, localRoute bool, cb BandwidthProgressCallback) error

StreamBandwidthTest performs a bandwidth test over skywire route and calls callback for each progress update

func (*PingClient) StreamCalcRoutes

func (c *PingClient) StreamCalcRoutes(
	ctx context.Context,
	srcPK, dstPK string,
	minHops, maxHops, count, queueCap int32,
	source, tpdURL string,
	cb CalcRouteCallback,
) error

StreamCalcRoutes runs a server-side route-finder BFS and invokes cb for each path the server emits. count == 0 means "until exhausted"; the streaming wire shape lets the caller dump every route as it arrives without buffering the whole set, which matters when the server's BFS is exploring an unbounded result space.

Source PK empty means "use the receiving visor's PK". queueCap caps the server's BFS queue (0 = server default).

func (*PingClient) StreamDmsgBandwidthTest

func (c *PingClient) StreamDmsgBandwidthTest(ctx context.Context, pk string, duration time.Duration, pcktSize int32, cb BandwidthProgressCallback) error

StreamDmsgBandwidthTest performs a bandwidth test over dmsg and calls callback for each progress update

func (*PingClient) StreamDmsgPing

func (c *PingClient) StreamDmsgPing(ctx context.Context, pk string, tries int32, pcktSize int32, timeout time.Duration, dmsgServerPK string, cb PingResultCallback) error

StreamDmsgPing performs dmsg pings and calls the callback for each result timeout applies only to the ping phase (after dial), 0 means no timeout dmsgServerPK optionally specifies which DMSG server to dial through (empty string for auto-select)

func (*PingClient) StreamGroupMessages

func (c *PingClient) StreamGroupMessages(ctx context.Context, groupID string, sinceTimestampNs int64, subscribed chan<- struct{}, cb GroupMessageCallback) error

StreamGroupMessages opens a server-streaming subscription to the visor's group inbox. Blocks until ctx is canceled or the stream errors. Replaces the net/rpc GroupPoll loop in 'cli skychat group listen', whose underlying conn was killed every 5 minutes by the per-conn deadline at init_apps.go (the deadline exists to bound unary RPC hang detection; it's the wrong tool for long-lived listen-style RPCs).

groupID, when non-empty, scopes the stream to one group (server-side filter). Empty subscribes to every group the visor is in.

sinceTimestampNs requests backlog replay of messages with TS strictly greater than the value before live deliveries start. Zero means live-only. (Backlog replay is currently honored on the wire but the server-side implementation may be a no-op pending the snapshotAfter accessor — see the server handler comment.)

If subscribed is non-nil, it is closed once the server emits the Subscribed sentinel — the same handshake pattern StreamAppLogs uses. The sentinel itself is filtered and not delivered to cb.

func (*PingClient) StreamMuxBandwidth

StreamMuxBandwidth opens the multiplexed-route bandwidth + RTT probe stream. Same event-level-control rationale as StreamPingTree — the CLI consumer drives Recv() and the harness path consumes the raw events.

func (*PingClient) StreamPing

func (c *PingClient) StreamPing(ctx context.Context, pk string, tries int32, pcktSize int32, localRoute bool, timeout time.Duration, setupTimeout time.Duration, cb PingResultCallback) error

StreamPing performs pings and calls the callback for each result timeout applies only to the ping phase (after route setup), 0 means no timeout setupTimeout applies to route setup phase, 0 means no timeout

func (*PingClient) StreamPingTree

StreamPingTree opens the server-side BFS ping-tree stream. The caller drives the returned stream via Recv() and is responsible for handling the io.EOF terminus + any wire errors. Unlike the other PingClient methods this returns the raw protoc-generated stream type because callers want event-level control (e.g. the 'cli visor ping tree-stream' command emits NDJSON envelopes, the ping tree TUI drives its own update loop). Wrapping in a callback pattern here would force every consumer to re-marshal back to the event type.

func (*PingClient) StreamPingWithRoute

func (c *PingClient) StreamPingWithRoute(ctx context.Context, pk string, tries int32, pcktSize int32, localRoute bool, timeout time.Duration, setupTimeout time.Duration, forwardHops []RouteHopDetail, reverseHops []RouteHopDetail, cb PingResultCallback) error

StreamPingWithRoute performs pings using a specific route (skips route calculation) forwardHops and reverseHops define the exact path to use

func (*PingClient) StreamPingWithTransport

func (c *PingClient) StreamPingWithTransport(ctx context.Context, pk string, tries int32, pcktSize int32, localRoute bool, timeout time.Duration, setupTimeout time.Duration, transportID string, cb PingResultCallback) error

StreamPingWithTransport performs pings using a specific transport (skips route calculation) If transportID is empty, normal route calculation is used

func (*PingClient) StreamRemoteSystemStats

func (c *PingClient) StreamRemoteSystemStats(ctx context.Context, remotePK string, updateInterval time.Duration, includeProcesses bool, processLimit int32, cb SystemStatsCallback) error

StreamRemoteSystemStats streams system stats from a remote visor via DMSG. The local visor proxies the connection to the remote visor using its DMSG client.

func (*PingClient) StreamRouteGroupMuxInfo

StreamRouteGroupMuxInfo opens the running-app per-leg mux telemetry stream — the smooth server-streaming replacement for the unary RouteGroupMuxInfo poll that 'cli proxy mux plot' (default mode) rides. Same event-level-control rationale as StreamMuxBandwidth: the CLI consumer drives Recv() and renders each sample as it arrives. Returns the raw generated stream so the caller can distinguish a never- implemented RPC (first Recv errors) and fall back to the unary poll.

func (*PingClient) StreamSystemStats

func (c *PingClient) StreamSystemStats(ctx context.Context, updateInterval time.Duration, includeProcesses bool, processLimit int32, cb SystemStatsCallback) error

StreamSystemStats streams system stats and calls the callback for each update. updateInterval specifies how often to receive updates (default 1s). includeProcesses controls whether to include top processes (more expensive). processLimit limits the number of processes to include (default 10).

type PingConf

type PingConf struct {
	PK          cipher.PubKey
	Tries       int
	PcktSize    int
	LocalRoute  bool
	TransportID string         // Optional: use specific transport (skips route calculation)
	ForwardHops []RouteHopInfo // Optional: explicit forward route (skips route calculation)
	ReverseHops []RouteHopInfo // Optional: explicit reverse route (skips route calculation)
	// RouteIndex selects among N parallel routes to the same peer.
	// Zero = primary / single-route (legacy behavior). Mirrors
	// visor.PingConfig.RouteIndex; the adapter passes it through.
	RouteIndex int
	// MinHops is the per-call route-finder min-hops constraint.
	// Mirrors visor.PingConfig.MinHops; adapter passes it through.
	// 0 = inherit visor-global routing.min_hops.
	MinHops int
	// SetupTimeoutNs is the dial-setup ceiling in nanoseconds.
	// Mirrors visor.PingConfig.SetupTimeout; adapter converts to
	// time.Duration. 0 falls back to DialPing's 30s default.
	SetupTimeoutNs int64
	// Timeout bounds a single PingOnce round-trip. Mirrors
	// visor.PingConfig.Timeout; 0 = the visor-side 10s default. The
	// mux-bw probe loop sets it to the remaining measurement window.
	Timeout time.Duration
}

PingConf mirrors visor.PingConfig to avoid import cycles

type PingRequest

type PingRequest struct {
	PublicKey      string      `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`                   // Target visor public key
	Tries          int32       `protobuf:"varint,2,opt,name=tries,proto3" json:"tries,omitempty"`                                           // Number of ping attempts
	PacketSizeKb   int32       `protobuf:"varint,3,opt,name=packet_size_kb,json=packetSizeKb,proto3" json:"packet_size_kb,omitempty"`       // Packet size in KB
	LocalRoute     bool        `protobuf:"varint,4,opt,name=local_route,json=localRoute,proto3" json:"local_route,omitempty"`               // Use local route calculation
	PingTimeoutNs  int64       `protobuf:"varint,5,opt,name=ping_timeout_ns,json=pingTimeoutNs,proto3" json:"ping_timeout_ns,omitempty"`    // Timeout for ping phase only (after route setup), 0 = no timeout
	SetupTimeoutNs int64       `protobuf:"varint,6,opt,name=setup_timeout_ns,json=setupTimeoutNs,proto3" json:"setup_timeout_ns,omitempty"` // Timeout for route setup phase, 0 = no timeout (default 30s recommended)
	DmsgServerPk   string      `protobuf:"bytes,7,opt,name=dmsg_server_pk,json=dmsgServerPk,proto3" json:"dmsg_server_pk,omitempty"`        // Optional: specific DMSG server to use for DMSG pings
	TransportId    string      `protobuf:"bytes,8,opt,name=transport_id,json=transportId,proto3" json:"transport_id,omitempty"`             // Optional: use specific transport (skips route calculation)
	ForwardHops    []*RouteHop `protobuf:"bytes,9,rep,name=forward_hops,json=forwardHops,proto3" json:"forward_hops,omitempty"`             // Optional: explicit forward route (skips route calculation)
	ReverseHops    []*RouteHop `protobuf:"bytes,10,rep,name=reverse_hops,json=reverseHops,proto3" json:"reverse_hops,omitempty"`            // Optional: explicit reverse route (skips route calculation)
	// contains filtered or unexported fields
}

func (*PingRequest) Descriptor deprecated

func (*PingRequest) Descriptor() ([]byte, []int)

Deprecated: Use PingRequest.ProtoReflect.Descriptor instead.

func (*PingRequest) GetDmsgServerPk

func (x *PingRequest) GetDmsgServerPk() string

func (*PingRequest) GetForwardHops

func (x *PingRequest) GetForwardHops() []*RouteHop

func (*PingRequest) GetLocalRoute

func (x *PingRequest) GetLocalRoute() bool

func (*PingRequest) GetPacketSizeKb

func (x *PingRequest) GetPacketSizeKb() int32

func (*PingRequest) GetPingTimeoutNs

func (x *PingRequest) GetPingTimeoutNs() int64

func (*PingRequest) GetPublicKey

func (x *PingRequest) GetPublicKey() string

func (*PingRequest) GetReverseHops

func (x *PingRequest) GetReverseHops() []*RouteHop

func (*PingRequest) GetSetupTimeoutNs

func (x *PingRequest) GetSetupTimeoutNs() int64

func (*PingRequest) GetTransportId

func (x *PingRequest) GetTransportId() string

func (*PingRequest) GetTries

func (x *PingRequest) GetTries() int32

func (*PingRequest) ProtoMessage

func (*PingRequest) ProtoMessage()

func (*PingRequest) ProtoReflect

func (x *PingRequest) ProtoReflect() protoreflect.Message

func (*PingRequest) Reset

func (x *PingRequest) Reset()

func (*PingRequest) String

func (x *PingRequest) String() string

type PingResult

type PingResult struct {
	Sequence        int32       `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"`                                          // Ping sequence number (1-indexed)
	LatencyNs       int64       `protobuf:"varint,2,opt,name=latency_ns,json=latencyNs,proto3" json:"latency_ns,omitempty"`                       // Round-trip time in nanoseconds
	Error           string      `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"`                                                 // Error message if ping failed
	IsSetup         bool        `protobuf:"varint,4,opt,name=is_setup,json=isSetup,proto3" json:"is_setup,omitempty"`                             // True if this is the route setup time, not a ping
	RouteHops       []string    `protobuf:"bytes,5,rep,name=route_hops,json=routeHops,proto3" json:"route_hops,omitempty"`                        // Route hops (public keys), only set for setup message (deprecated)
	RouteHopDetails []*RouteHop `protobuf:"bytes,6,rep,name=route_hop_details,json=routeHopDetails,proto3" json:"route_hop_details,omitempty"`    // Detailed route hops with transport info
	DmsgServerPk    string      `protobuf:"bytes,7,opt,name=dmsg_server_pk,json=dmsgServerPk,proto3" json:"dmsg_server_pk,omitempty"`             // For DMSG pings: the server PK used for this connection
	RouteCalcTimeNs int64       `protobuf:"varint,8,opt,name=route_calc_time_ns,json=routeCalcTimeNs,proto3" json:"route_calc_time_ns,omitempty"` // Route calculation time in nanoseconds (local route mode only)
	// contains filtered or unexported fields
}

func (*PingResult) Descriptor deprecated

func (*PingResult) Descriptor() ([]byte, []int)

Deprecated: Use PingResult.ProtoReflect.Descriptor instead.

func (*PingResult) GetDmsgServerPk

func (x *PingResult) GetDmsgServerPk() string

func (*PingResult) GetError

func (x *PingResult) GetError() string

func (*PingResult) GetIsSetup

func (x *PingResult) GetIsSetup() bool

func (*PingResult) GetLatencyNs

func (x *PingResult) GetLatencyNs() int64

func (*PingResult) GetRouteCalcTimeNs

func (x *PingResult) GetRouteCalcTimeNs() int64

func (*PingResult) GetRouteHopDetails

func (x *PingResult) GetRouteHopDetails() []*RouteHop

func (*PingResult) GetRouteHops

func (x *PingResult) GetRouteHops() []string

func (*PingResult) GetSequence

func (x *PingResult) GetSequence() int32

func (*PingResult) ProtoMessage

func (*PingResult) ProtoMessage()

func (*PingResult) ProtoReflect

func (x *PingResult) ProtoReflect() protoreflect.Message

func (*PingResult) Reset

func (x *PingResult) Reset()

func (*PingResult) String

func (x *PingResult) String() string

type PingResultCallback

type PingResultCallback func(seq int32, latency time.Duration, isSetup bool, routeHopDetails []RouteHopDetail, dmsgServerPK string, routeCalcTime time.Duration, err error)

PingResultCallback is called for each ping result received from the stream. routeHopDetails is only set for the setup message (isSetup=true) for skywire route pings. dmsgServerPK is only set for DMSG pings and contains the server used for the connection. routeCalcTime is the time spent calculating the route (local route mode only, isSetup=true).

type PingRouteRef

type PingRouteRef struct {
	PK    cipher.PubKey
	Index int
}

PingRouteRef identifies a specific route in a mux-set. Mirrors visor.PingRouteRef across the package boundary to avoid the rpcgrpc → visor import cycle. The visorPingAdapter converts at the boundary.

type PingServer

type PingServer struct {
	UnimplementedPingServiceServer
	// contains filtered or unexported fields
}

PingServer implements the gRPC PingService

func NewPingServer

func NewPingServer(visor VisorAPI, log *logging.Logger) *PingServer

NewPingServer creates a new gRPC ping server

func (*PingServer) GetRemoteDmsgServers

func (s *PingServer) GetRemoteDmsgServers(_ context.Context, req *DmsgServersRequest) (*DmsgServersResponse, error)

GetRemoteDmsgServers returns the DMSG servers a remote visor is connected to

func (*PingServer) GetSystemStats

func (s *PingServer) GetSystemStats(ctx context.Context, req *SystemStatsRequest) (*SystemStats, error)

GetSystemStats returns a single snapshot of system stats

func (*PingServer) StreamAppLogs

StreamAppLogs subscribes to the visor's master logger and forwards matching entries to the gRPC client. Used by 'proxy start --verbose' and 'dmsg curl --verbose'.

Filtering: AppName matches by _module exact equality OR app/app_name field. Modules matches by _module prefix. The two are OR-merged; at least one must be specified (AppName="*" enables wildcard mode for diagnostics).

The visor's router/mux/setup layers attach app_name=<n> to rg-scoped entries (see router.Config.AppLookup), so AppName filtering scopes to one app's session — including layered events that happen on behalf of the app, not just app stdout.

IncludeRouter is retained on the wire for forward compatibility but is currently ignored — Modules is the explicit replacement.

The subscription's per-stream buffer is bounded; bursts beyond it are dropped and counted (cancel returns the count).

func (*PingServer) StreamBandwidthTest

func (s *PingServer) StreamBandwidthTest(req *BandwidthRequest, stream PingService_StreamBandwidthTestServer) error

StreamBandwidthTest performs a bandwidth test over skywire route and streams progress

func (*PingServer) StreamCalcRoutes

func (s *PingServer) StreamCalcRoutes(req *CalcRoutesRequest, stream PingService_StreamCalcRoutesServer) error

StreamCalcRoutes runs a route-finder BFS server-side and streams each valid path back to the caller as it's discovered. The streaming wire shape lets callers consume routes incrementally — neither side has to hold every result in memory at once, which matters for unbounded requests on dense graphs.

Source PK defaults to this visor's own. Max-hops defaults to a safe 5 if zero. count == 0 means "until exhausted"; the server will keep emitting until no more routes exist or the client disconnects.

The route-finder package's StreamRoutes drives the search; the loop here is just transport-graph fetch + protocol marshaling.

func (*PingServer) StreamDmsgBandwidthTest

func (s *PingServer) StreamDmsgBandwidthTest(req *BandwidthRequest, stream PingService_StreamDmsgBandwidthTestServer) error

StreamDmsgBandwidthTest performs a bandwidth test over dmsg and streams progress

func (*PingServer) StreamDmsgPing

func (s *PingServer) StreamDmsgPing(req *PingRequest, stream PingService_StreamDmsgPingServer) error

StreamDmsgPing performs multiple pings over dmsg and streams results

func (*PingServer) StreamGroupMessages

func (s *PingServer) StreamGroupMessages(req *GroupMessagesRequest, stream PingService_StreamGroupMessagesServer) error

func (*PingServer) StreamMuxBandwidth

func (s *PingServer) StreamMuxBandwidth(req *MuxBandwidthRequest, stream PingService_StreamMuxBandwidthServer) error

StreamMuxBandwidth is the canonical implementation of the RPC. See ping.proto for the wire contract.

func (*PingServer) StreamPing

func (s *PingServer) StreamPing(req *PingRequest, stream PingService_StreamPingServer) error

StreamPing performs multiple pings and streams results back

func (*PingServer) StreamPingTree

func (s *PingServer) StreamPingTree(req *PingTreeRequest, stream PingService_StreamPingTreeServer) error

StreamPingTree walks the visor's neighborhood breadth-first and streams discovery + ping events. See ping.proto for the wire shape; this function is the canonical implementation.

Implementation outline:

  1. Fetch the global transport-discovery adjacency once (FetchAllTransportEntries returns every entry in the system).
  2. Spawn a sender goroutine that drains a bounded event channel to stream.Send. The bounded channel + non-blocking send for StatusUpdate gives backpressure visibility without dropping measurement data.
  3. BFS: - Level 1: enumerate candidates from adjacency[localPK]. - For each level, emit Discovered, then ping with bounded concurrency, then emit LevelDone. - At each iteration check ctx.Done() so a client disconnect tears the walk down within one in-flight ping.
  4. Emit RunDone with termination_reason.

Level-1 fast path via TransportSummary.LatencyMS is left as a TODO with the explicit hook so the follow-up PR can land it without restructuring (Beta's slice per role split).

func (*PingServer) StreamRemoteSystemStats

StreamRemoteSystemStats proxies system stats from a remote visor via DMSG. The local visor dials the remote visor over DMSG and forwards the stats stream.

func (*PingServer) StreamRouteGroupMuxInfo

StreamRouteGroupMuxInfo streams a running app's per-leg mux telemetry on a fixed cadence. See ping.proto for the wire contract.

The first sample fires immediately (so the client renders without waiting a full interval), then every sample_interval_ns until the client disconnects / cancels. A transient absent route group is NOT an error — the handler emits an empty sample and keeps sampling, so the plot shows an empty frame until the app dials.

func (*PingServer) StreamSystemStats

func (s *PingServer) StreamSystemStats(req *SystemStatsRequest, stream PingService_StreamSystemStatsServer) error

StreamSystemStats streams system stats for gotop-style monitoring

type PingServiceClient

type PingServiceClient interface {
	// StreamPing performs multiple pings and streams results back one at a time
	StreamPing(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[PingResult], error)
	// StreamDmsgPing performs multiple pings over dmsg and streams results
	StreamDmsgPing(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[PingResult], error)
	// StreamBandwidthTest performs a bandwidth test and streams progress
	StreamBandwidthTest(ctx context.Context, in *BandwidthRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[BandwidthProgress], error)
	// StreamDmsgBandwidthTest performs a bandwidth test over dmsg and streams progress
	StreamDmsgBandwidthTest(ctx context.Context, in *BandwidthRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[BandwidthProgress], error)
	// GetRemoteDmsgServers returns the DMSG servers a remote visor is connected to
	GetRemoteDmsgServers(ctx context.Context, in *DmsgServersRequest, opts ...grpc.CallOption) (*DmsgServersResponse, error)
	// StreamSystemStats streams system stats (CPU, memory, disk, network, etc.) for gotop-style monitoring
	StreamSystemStats(ctx context.Context, in *SystemStatsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[SystemStats], error)
	// GetSystemStats returns a single snapshot of system stats
	GetSystemStats(ctx context.Context, in *SystemStatsRequest, opts ...grpc.CallOption) (*SystemStats, error)
	// StreamRemoteSystemStats proxies system stats from a remote visor via DMSG
	// The local visor dials the remote visor over DMSG and forwards the stats stream
	StreamRemoteSystemStats(ctx context.Context, in *RemoteSystemStatsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[SystemStats], error)
	// StreamAppLogs streams visor log entries scoped to one app's session.
	// Used by 'skywire-cli proxy start --verbose' to surface what the visor is
	// doing while spinning up an app's transports/routes.
	StreamAppLogs(ctx context.Context, in *AppLogStreamRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[AppLogEntry], error)
	// StreamCalcRoutes runs a route-finder BFS server-side and streams each
	// valid route back as it's discovered. Lets the CLI display routes
	// incrementally and avoids accumulating every result in memory before
	// returning — important when count is large or unbounded.
	StreamCalcRoutes(ctx context.Context, in *CalcRoutesRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[CalcRoute], error)
	// StreamGroupMessages opens a long-lived stream of inbound group
	// messages. The server holds a per-stream subscription to the
	// visor's group inbox and pushes each delivered message to the
	// client as it arrives. Replaces the net/rpc poll loop in
	// 'cli skychat group listen', which would lose its underlying
	// connection every 5 minutes to the per-conn deadline applied at
	// init_apps.go for unary-RPC hang detection. Stream lifetime is
	// the listen lifetime, no arbitrary ceiling.
	StreamGroupMessages(ctx context.Context, in *GroupMessagesRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[GroupMessageEvent], error)
	// StreamPingTree walks the visor's neighborhood breadth-first and
	// streams discovery + ping events as they happen. Replaces the
	// client-side BFS in 'cli visor ping tree' — server-side has
	// direct access to TransportSummary.LatencyMS (the smoothed per-
	// transport RTT measured continuously by the transport layer),
	// the route-finder, and the local tpM, so it can:
	//   - Skip live pings at level 1 when the transport already has a
	//     warmed latency cache (use_transport_latency flag);
	//   - Walk tpM.WalkTransports directly without the snapshot
	//     allocation cost that the unary Transports() RPC imposes
	//     on visors with hundreds of transports;
	//   - Observe cancellation at every BFS iteration so a client
	//     disconnect tears down the walk within one in-flight ping.
	//
	// Result events arrive in chunk-complete-by-completion order, NOT
	// deterministically grouped per peer — consumers that want
	// (level, parent_pk, remote_pk) grouping must sort/bucket on
	// receive. Server-side per-level concurrency means events for
	// level N+1 never appear before level N's LevelDone.
	//
	// Authorization: the handler gates on the same whitelist used by
	// dmsgscp (hypervisors + own PK + Dmsgpty.Whitelist). On a public
	// visor with hundreds of transports, an unauthenticated caller
	// could trigger a many-target ping storm; the gate prevents that.
	StreamPingTree(ctx context.Context, in *PingTreeRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[PingTreeEvent], error)
	// StreamMuxBandwidth measures bandwidth + queueing-delay between
	// this visor and a target peer, optionally across N parallel
	// routes. The operator-visible hypothesis: routes that EXCLUDE the
	// direct transport (via min_hops >= 2) should sum to MORE bandwidth
	// than the direct edge alone, because intermediates aggregate
	// independent paths. This RPC produces the data to test that.
	//
	// Three flavors via the request fields:
	//   - routes=1, min_hops=0: baseline — whatever route the finder
	//     picks. With a healthy direct transport this measures the
	//     direct edge.
	//   - routes=1, min_hops=2: single non-direct path — forces the
	//     route through at least one intermediate.
	//   - routes=N, min_hops=>=0: N parallel routes pumping bytes
	//     concurrently. Aggregate throughput is the operator's headline
	//     comparison metric.
	//
	// Optionally a separate small-packet probe runs alongside the bulk
	// load to capture queueing-delay: loaded RTT vs unloaded RTT
	// baseline. The probe rides the SAME first route as the bulk pump,
	// so the queueing-delay number reflects that route's saturation.
	//
	// Wire shape mirrors StreamPingTree: server-side BFS becomes
	// server-side bandwidth-pump, events stream as they happen,
	// ctx.Done() at every iteration, bounded internal channel.
	StreamMuxBandwidth(ctx context.Context, in *MuxBandwidthRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[MuxBandwidthEvent], error)
	// StreamRouteGroupMuxInfo streams a running app's per-leg mux
	// telemetry on a fixed cadence — the server-streaming equivalent of
	// the unary RouteGroupMuxInfo net/rpc call that 'cli proxy mux plot'
	// (default, watch-a-running-app mode) polls. Lets that plot update
	// smoothly/continuously like the --pk StreamMuxBandwidth path,
	// instead of the choppy 1 Hz unary gob poll. Each sample carries the
	// same []visor.MuxRouteGroupInfo per-leg breakdown the unary RPC
	// returns. The handler never errors the stream on a transient absent
	// route group — it emits an empty sample and keeps sampling, so the
	// plot renders an empty frame until the app dials.
	StreamRouteGroupMuxInfo(ctx context.Context, in *StreamRouteGroupMuxInfoRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[RouteGroupMuxInfoSample], error)
}

PingServiceClient is the client API for PingService service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.

PingService provides streaming ping functionality

type PingServiceServer

type PingServiceServer interface {
	// StreamPing performs multiple pings and streams results back one at a time
	StreamPing(*PingRequest, grpc.ServerStreamingServer[PingResult]) error
	// StreamDmsgPing performs multiple pings over dmsg and streams results
	StreamDmsgPing(*PingRequest, grpc.ServerStreamingServer[PingResult]) error
	// StreamBandwidthTest performs a bandwidth test and streams progress
	StreamBandwidthTest(*BandwidthRequest, grpc.ServerStreamingServer[BandwidthProgress]) error
	// StreamDmsgBandwidthTest performs a bandwidth test over dmsg and streams progress
	StreamDmsgBandwidthTest(*BandwidthRequest, grpc.ServerStreamingServer[BandwidthProgress]) error
	// GetRemoteDmsgServers returns the DMSG servers a remote visor is connected to
	GetRemoteDmsgServers(context.Context, *DmsgServersRequest) (*DmsgServersResponse, error)
	// StreamSystemStats streams system stats (CPU, memory, disk, network, etc.) for gotop-style monitoring
	StreamSystemStats(*SystemStatsRequest, grpc.ServerStreamingServer[SystemStats]) error
	// GetSystemStats returns a single snapshot of system stats
	GetSystemStats(context.Context, *SystemStatsRequest) (*SystemStats, error)
	// StreamRemoteSystemStats proxies system stats from a remote visor via DMSG
	// The local visor dials the remote visor over DMSG and forwards the stats stream
	StreamRemoteSystemStats(*RemoteSystemStatsRequest, grpc.ServerStreamingServer[SystemStats]) error
	// StreamAppLogs streams visor log entries scoped to one app's session.
	// Used by 'skywire-cli proxy start --verbose' to surface what the visor is
	// doing while spinning up an app's transports/routes.
	StreamAppLogs(*AppLogStreamRequest, grpc.ServerStreamingServer[AppLogEntry]) error
	// StreamCalcRoutes runs a route-finder BFS server-side and streams each
	// valid route back as it's discovered. Lets the CLI display routes
	// incrementally and avoids accumulating every result in memory before
	// returning — important when count is large or unbounded.
	StreamCalcRoutes(*CalcRoutesRequest, grpc.ServerStreamingServer[CalcRoute]) error
	// StreamGroupMessages opens a long-lived stream of inbound group
	// messages. The server holds a per-stream subscription to the
	// visor's group inbox and pushes each delivered message to the
	// client as it arrives. Replaces the net/rpc poll loop in
	// 'cli skychat group listen', which would lose its underlying
	// connection every 5 minutes to the per-conn deadline applied at
	// init_apps.go for unary-RPC hang detection. Stream lifetime is
	// the listen lifetime, no arbitrary ceiling.
	StreamGroupMessages(*GroupMessagesRequest, grpc.ServerStreamingServer[GroupMessageEvent]) error
	// StreamPingTree walks the visor's neighborhood breadth-first and
	// streams discovery + ping events as they happen. Replaces the
	// client-side BFS in 'cli visor ping tree' — server-side has
	// direct access to TransportSummary.LatencyMS (the smoothed per-
	// transport RTT measured continuously by the transport layer),
	// the route-finder, and the local tpM, so it can:
	//   - Skip live pings at level 1 when the transport already has a
	//     warmed latency cache (use_transport_latency flag);
	//   - Walk tpM.WalkTransports directly without the snapshot
	//     allocation cost that the unary Transports() RPC imposes
	//     on visors with hundreds of transports;
	//   - Observe cancellation at every BFS iteration so a client
	//     disconnect tears down the walk within one in-flight ping.
	//
	// Result events arrive in chunk-complete-by-completion order, NOT
	// deterministically grouped per peer — consumers that want
	// (level, parent_pk, remote_pk) grouping must sort/bucket on
	// receive. Server-side per-level concurrency means events for
	// level N+1 never appear before level N's LevelDone.
	//
	// Authorization: the handler gates on the same whitelist used by
	// dmsgscp (hypervisors + own PK + Dmsgpty.Whitelist). On a public
	// visor with hundreds of transports, an unauthenticated caller
	// could trigger a many-target ping storm; the gate prevents that.
	StreamPingTree(*PingTreeRequest, grpc.ServerStreamingServer[PingTreeEvent]) error
	// StreamMuxBandwidth measures bandwidth + queueing-delay between
	// this visor and a target peer, optionally across N parallel
	// routes. The operator-visible hypothesis: routes that EXCLUDE the
	// direct transport (via min_hops >= 2) should sum to MORE bandwidth
	// than the direct edge alone, because intermediates aggregate
	// independent paths. This RPC produces the data to test that.
	//
	// Three flavors via the request fields:
	//   - routes=1, min_hops=0: baseline — whatever route the finder
	//     picks. With a healthy direct transport this measures the
	//     direct edge.
	//   - routes=1, min_hops=2: single non-direct path — forces the
	//     route through at least one intermediate.
	//   - routes=N, min_hops=>=0: N parallel routes pumping bytes
	//     concurrently. Aggregate throughput is the operator's headline
	//     comparison metric.
	//
	// Optionally a separate small-packet probe runs alongside the bulk
	// load to capture queueing-delay: loaded RTT vs unloaded RTT
	// baseline. The probe rides the SAME first route as the bulk pump,
	// so the queueing-delay number reflects that route's saturation.
	//
	// Wire shape mirrors StreamPingTree: server-side BFS becomes
	// server-side bandwidth-pump, events stream as they happen,
	// ctx.Done() at every iteration, bounded internal channel.
	StreamMuxBandwidth(*MuxBandwidthRequest, grpc.ServerStreamingServer[MuxBandwidthEvent]) error
	// StreamRouteGroupMuxInfo streams a running app's per-leg mux
	// telemetry on a fixed cadence — the server-streaming equivalent of
	// the unary RouteGroupMuxInfo net/rpc call that 'cli proxy mux plot'
	// (default, watch-a-running-app mode) polls. Lets that plot update
	// smoothly/continuously like the --pk StreamMuxBandwidth path,
	// instead of the choppy 1 Hz unary gob poll. Each sample carries the
	// same []visor.MuxRouteGroupInfo per-leg breakdown the unary RPC
	// returns. The handler never errors the stream on a transient absent
	// route group — it emits an empty sample and keeps sampling, so the
	// plot renders an empty frame until the app dials.
	StreamRouteGroupMuxInfo(*StreamRouteGroupMuxInfoRequest, grpc.ServerStreamingServer[RouteGroupMuxInfoSample]) error
	// contains filtered or unexported methods
}

PingServiceServer is the server API for PingService service. All implementations must embed UnimplementedPingServiceServer for forward compatibility.

PingService provides streaming ping functionality

type PingService_StreamAppLogsClient

type PingService_StreamAppLogsClient = grpc.ServerStreamingClient[AppLogEntry]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamAppLogsServer

type PingService_StreamAppLogsServer = grpc.ServerStreamingServer[AppLogEntry]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamBandwidthTestClient

type PingService_StreamBandwidthTestClient = grpc.ServerStreamingClient[BandwidthProgress]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamBandwidthTestServer

type PingService_StreamBandwidthTestServer = grpc.ServerStreamingServer[BandwidthProgress]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamCalcRoutesClient

type PingService_StreamCalcRoutesClient = grpc.ServerStreamingClient[CalcRoute]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamCalcRoutesServer

type PingService_StreamCalcRoutesServer = grpc.ServerStreamingServer[CalcRoute]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamDmsgBandwidthTestClient

type PingService_StreamDmsgBandwidthTestClient = grpc.ServerStreamingClient[BandwidthProgress]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamDmsgBandwidthTestServer

type PingService_StreamDmsgBandwidthTestServer = grpc.ServerStreamingServer[BandwidthProgress]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamDmsgPingClient

type PingService_StreamDmsgPingClient = grpc.ServerStreamingClient[PingResult]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamDmsgPingServer

type PingService_StreamDmsgPingServer = grpc.ServerStreamingServer[PingResult]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamGroupMessagesClient

type PingService_StreamGroupMessagesClient = grpc.ServerStreamingClient[GroupMessageEvent]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamGroupMessagesServer

type PingService_StreamGroupMessagesServer = grpc.ServerStreamingServer[GroupMessageEvent]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamMuxBandwidthClient

type PingService_StreamMuxBandwidthClient = grpc.ServerStreamingClient[MuxBandwidthEvent]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamMuxBandwidthServer

type PingService_StreamMuxBandwidthServer = grpc.ServerStreamingServer[MuxBandwidthEvent]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamPingClient

type PingService_StreamPingClient = grpc.ServerStreamingClient[PingResult]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamPingServer

type PingService_StreamPingServer = grpc.ServerStreamingServer[PingResult]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamPingTreeClient

type PingService_StreamPingTreeClient = grpc.ServerStreamingClient[PingTreeEvent]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamPingTreeServer

type PingService_StreamPingTreeServer = grpc.ServerStreamingServer[PingTreeEvent]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamRemoteSystemStatsClient

type PingService_StreamRemoteSystemStatsClient = grpc.ServerStreamingClient[SystemStats]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamRemoteSystemStatsServer

type PingService_StreamRemoteSystemStatsServer = grpc.ServerStreamingServer[SystemStats]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamRouteGroupMuxInfoClient

type PingService_StreamRouteGroupMuxInfoClient = grpc.ServerStreamingClient[RouteGroupMuxInfoSample]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamRouteGroupMuxInfoServer

type PingService_StreamRouteGroupMuxInfoServer = grpc.ServerStreamingServer[RouteGroupMuxInfoSample]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamSystemStatsClient

type PingService_StreamSystemStatsClient = grpc.ServerStreamingClient[SystemStats]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingService_StreamSystemStatsServer

type PingService_StreamSystemStatsServer = grpc.ServerStreamingServer[SystemStats]

This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.

type PingTreeDiscovered

type PingTreeDiscovered struct {
	TpId     string `protobuf:"bytes,1,opt,name=tp_id,json=tpId,proto3" json:"tp_id,omitempty"`
	TpType   string `protobuf:"bytes,2,opt,name=tp_type,json=tpType,proto3" json:"tp_type,omitempty"`
	RemotePk string `protobuf:"bytes,3,opt,name=remote_pk,json=remotePk,proto3" json:"remote_pk,omitempty"`
	ParentPk string `protobuf:"bytes,4,opt,name=parent_pk,json=parentPk,proto3" json:"parent_pk,omitempty"`
	Level    int32  `protobuf:"varint,5,opt,name=level,proto3" json:"level,omitempty"`
	// contains filtered or unexported fields
}

Discovered fires when the BFS adds a (transport, peer) pair to the candidate set at level N. Fires BEFORE the corresponding PingResult.

func (*PingTreeDiscovered) Descriptor deprecated

func (*PingTreeDiscovered) Descriptor() ([]byte, []int)

Deprecated: Use PingTreeDiscovered.ProtoReflect.Descriptor instead.

func (*PingTreeDiscovered) GetLevel

func (x *PingTreeDiscovered) GetLevel() int32

func (*PingTreeDiscovered) GetParentPk

func (x *PingTreeDiscovered) GetParentPk() string

func (*PingTreeDiscovered) GetRemotePk

func (x *PingTreeDiscovered) GetRemotePk() string

func (*PingTreeDiscovered) GetTpId

func (x *PingTreeDiscovered) GetTpId() string

func (*PingTreeDiscovered) GetTpType

func (x *PingTreeDiscovered) GetTpType() string

func (*PingTreeDiscovered) ProtoMessage

func (*PingTreeDiscovered) ProtoMessage()

func (*PingTreeDiscovered) ProtoReflect

func (x *PingTreeDiscovered) ProtoReflect() protoreflect.Message

func (*PingTreeDiscovered) Reset

func (x *PingTreeDiscovered) Reset()

func (*PingTreeDiscovered) String

func (x *PingTreeDiscovered) String() string

type PingTreeEvent

type PingTreeEvent struct {
	TimestampNs int64 `protobuf:"varint,1,opt,name=timestamp_ns,json=timestampNs,proto3" json:"timestamp_ns,omitempty"`
	// Types that are valid to be assigned to Payload:
	//
	//	*PingTreeEvent_Discovered
	//	*PingTreeEvent_PingResult
	//	*PingTreeEvent_LevelDone
	//	*PingTreeEvent_RunDone
	//	*PingTreeEvent_StatusUpdate
	//	*PingTreeEvent_ServerError
	Payload isPingTreeEvent_Payload `protobuf_oneof:"payload"`
	// contains filtered or unexported fields
}

PingTreeEvent is one entry on the stream. Exactly one oneof payload is set per message. Consumers switch on the payload type; the top-level timestamp_ns is server-side wall time at emit.

func (*PingTreeEvent) Descriptor deprecated

func (*PingTreeEvent) Descriptor() ([]byte, []int)

Deprecated: Use PingTreeEvent.ProtoReflect.Descriptor instead.

func (*PingTreeEvent) GetDiscovered

func (x *PingTreeEvent) GetDiscovered() *PingTreeDiscovered

func (*PingTreeEvent) GetLevelDone

func (x *PingTreeEvent) GetLevelDone() *PingTreeLevelDone

func (*PingTreeEvent) GetPayload

func (x *PingTreeEvent) GetPayload() isPingTreeEvent_Payload

func (*PingTreeEvent) GetPingResult

func (x *PingTreeEvent) GetPingResult() *PingTreeResult

func (*PingTreeEvent) GetRunDone

func (x *PingTreeEvent) GetRunDone() *PingTreeRunDone

func (*PingTreeEvent) GetServerError

func (x *PingTreeEvent) GetServerError() *PingTreeServerError

func (*PingTreeEvent) GetStatusUpdate

func (x *PingTreeEvent) GetStatusUpdate() *PingTreeStatusUpdate

func (*PingTreeEvent) GetTimestampNs

func (x *PingTreeEvent) GetTimestampNs() int64

func (*PingTreeEvent) ProtoMessage

func (*PingTreeEvent) ProtoMessage()

func (*PingTreeEvent) ProtoReflect

func (x *PingTreeEvent) ProtoReflect() protoreflect.Message

func (*PingTreeEvent) Reset

func (x *PingTreeEvent) Reset()

func (*PingTreeEvent) String

func (x *PingTreeEvent) String() string

type PingTreeEvent_Discovered

type PingTreeEvent_Discovered struct {
	Discovered *PingTreeDiscovered `protobuf:"bytes,10,opt,name=discovered,proto3,oneof"`
}

type PingTreeEvent_LevelDone

type PingTreeEvent_LevelDone struct {
	LevelDone *PingTreeLevelDone `protobuf:"bytes,12,opt,name=level_done,json=levelDone,proto3,oneof"`
}

type PingTreeEvent_PingResult

type PingTreeEvent_PingResult struct {
	PingResult *PingTreeResult `protobuf:"bytes,11,opt,name=ping_result,json=pingResult,proto3,oneof"`
}

type PingTreeEvent_RunDone

type PingTreeEvent_RunDone struct {
	RunDone *PingTreeRunDone `protobuf:"bytes,13,opt,name=run_done,json=runDone,proto3,oneof"`
}

type PingTreeEvent_ServerError

type PingTreeEvent_ServerError struct {
	// ServerError is a terminal event: the handler is about to
	// close the stream because of an unrecoverable condition
	// (e.g. proto break, internal panic recovered). Clients should
	// treat receipt as equivalent to stream-EOF with a known cause.
	ServerError *PingTreeServerError `protobuf:"bytes,15,opt,name=server_error,json=serverError,proto3,oneof"`
}

type PingTreeEvent_StatusUpdate

type PingTreeEvent_StatusUpdate struct {
	StatusUpdate *PingTreeStatusUpdate `protobuf:"bytes,14,opt,name=status_update,json=statusUpdate,proto3,oneof"`
}

type PingTreeLevelDone

type PingTreeLevelDone struct {
	Level int32 `protobuf:"varint,1,opt,name=level,proto3" json:"level,omitempty"`
	// Attempted = sum of (succeeded + failed + skipped_cached + skipped_dry).
	Attempted int32 `protobuf:"varint,2,opt,name=attempted,proto3" json:"attempted,omitempty"`
	Succeeded int32 `protobuf:"varint,3,opt,name=succeeded,proto3" json:"succeeded,omitempty"`
	Failed    int32 `protobuf:"varint,4,opt,name=failed,proto3" json:"failed,omitempty"`
	// SkippedCached is the count of entries where the
	// use_transport_latency fast-path fired. Lets harnesses compute
	// cache hit rate.
	SkippedCached int32 `protobuf:"varint,5,opt,name=skipped_cached,json=skippedCached,proto3" json:"skipped_cached,omitempty"`
	// contains filtered or unexported fields
}

LevelDone fires after every transport at level N has either completed its ping or been skipped. Always fires before the next level's Discovered events. Counts are authoritative for the harness.

func (*PingTreeLevelDone) Descriptor deprecated

func (*PingTreeLevelDone) Descriptor() ([]byte, []int)

Deprecated: Use PingTreeLevelDone.ProtoReflect.Descriptor instead.

func (*PingTreeLevelDone) GetAttempted

func (x *PingTreeLevelDone) GetAttempted() int32

func (*PingTreeLevelDone) GetFailed

func (x *PingTreeLevelDone) GetFailed() int32

func (*PingTreeLevelDone) GetLevel

func (x *PingTreeLevelDone) GetLevel() int32

func (*PingTreeLevelDone) GetSkippedCached

func (x *PingTreeLevelDone) GetSkippedCached() int32

func (*PingTreeLevelDone) GetSucceeded

func (x *PingTreeLevelDone) GetSucceeded() int32

func (*PingTreeLevelDone) ProtoMessage

func (*PingTreeLevelDone) ProtoMessage()

func (*PingTreeLevelDone) ProtoReflect

func (x *PingTreeLevelDone) ProtoReflect() protoreflect.Message

func (*PingTreeLevelDone) Reset

func (x *PingTreeLevelDone) Reset()

func (*PingTreeLevelDone) String

func (x *PingTreeLevelDone) String() string

type PingTreeRequest

type PingTreeRequest struct {

	// MaxLevel caps BFS depth. 0 = unlimited until expansion exhausts.
	MaxLevel int32 `protobuf:"varint,1,opt,name=max_level,json=maxLevel,proto3" json:"max_level,omitempty"`
	// Hops, when > 0, pings ONLY entries at exactly N hops. The BFS
	// still discovers intermediate levels (so it can reach the target),
	// but no PingResult fires for non-target levels. Synth's "latency
	// as a function of hop count" measurement uses this.
	Hops int32 `protobuf:"varint,2,opt,name=hops,proto3" json:"hops,omitempty"`
	// Tries is the per-transport ping count. The PingResult carries
	// the aggregated stats (avg, p50, p99, jitter) over all tries.
	// 0 falls back to 1.
	Tries int32 `protobuf:"varint,3,opt,name=tries,proto3" json:"tries,omitempty"`
	// PacketSizeKb is the per-ping packet size. 0 falls back to 2 KB.
	PacketSizeKb int32 `protobuf:"varint,4,opt,name=packet_size_kb,json=packetSizeKb,proto3" json:"packet_size_kb,omitempty"`
	// PingTimeoutNs bounds each individual ping (after route setup).
	// 0 falls back to 30s.
	PingTimeoutNs int64 `protobuf:"varint,5,opt,name=ping_timeout_ns,json=pingTimeoutNs,proto3" json:"ping_timeout_ns,omitempty"`
	// SetupTimeoutNs bounds the route-setup phase per transport.
	// 0 falls back to 30s.
	SetupTimeoutNs int64 `protobuf:"varint,6,opt,name=setup_timeout_ns,json=setupTimeoutNs,proto3" json:"setup_timeout_ns,omitempty"`
	// Concurrency limits in-flight pings per level. The cap resets
	// between levels (level 2 starts with a fresh budget after level 1
	// drains) — predictable LevelDone semantics + bounded fan-out at
	// deep levels. 0 falls back to 16.
	Concurrency int32 `protobuf:"varint,7,opt,name=concurrency,proto3" json:"concurrency,omitempty"`
	// OnlineOnly filters discovered visors via the uptime tracker.
	OnlineOnly bool `protobuf:"varint,8,opt,name=online_only,json=onlineOnly,proto3" json:"online_only,omitempty"`
	// MinVersion filters by minimum visor version (semver). Empty = no
	// filter.
	MinVersion string `protobuf:"bytes,9,opt,name=min_version,json=minVersion,proto3" json:"min_version,omitempty"`
	// UseTransportLatency turns on the level-1 fast path: when a
	// direct transport already has a non-zero smoothed
	// TransportSummary.LatencyMS, the handler emits a PingResult with
	// latency_source="transport_summary" and skips the live ping.
	// Saves traffic + makes level 1 instant for warm transports.
	// Deeper levels always live-ping (no transport-level latency for
	// multi-hop routes).
	UseTransportLatency bool `protobuf:"varint,10,opt,name=use_transport_latency,json=useTransportLatency,proto3" json:"use_transport_latency,omitempty"`
	// DmsgOnly forces the ping to ride the DMSG path instead of the
	// skywire router. Mirrors `cli visor ping --dmsg`.
	DmsgOnly bool `protobuf:"varint,11,opt,name=dmsg_only,json=dmsgOnly,proto3" json:"dmsg_only,omitempty"`
	// DmsgPreCheck probes DMSG reachability before attempting a
	// route ping. Discards unreachable visors early.
	DmsgPreCheck bool `protobuf:"varint,12,opt,name=dmsg_pre_check,json=dmsgPreCheck,proto3" json:"dmsg_pre_check,omitempty"`
	// Retries adds N retry attempts on failed pings. 0 = no retry.
	Retries int32 `protobuf:"varint,13,opt,name=retries,proto3" json:"retries,omitempty"`
	// DryRun runs the BFS discovery but emits no PingResult events;
	// useful for visualizing the reachable graph without traffic.
	DryRun bool `protobuf:"varint,14,opt,name=dry_run,json=dryRun,proto3" json:"dry_run,omitempty"`
	// contains filtered or unexported fields
}

PingTreeRequest configures a server-side BFS ping-tree walk. All durations are in nanoseconds (proto convention used throughout this service). All "0 = default" fields fall back to handler-side constants documented inline.

func (*PingTreeRequest) Descriptor deprecated

func (*PingTreeRequest) Descriptor() ([]byte, []int)

Deprecated: Use PingTreeRequest.ProtoReflect.Descriptor instead.

func (*PingTreeRequest) GetConcurrency

func (x *PingTreeRequest) GetConcurrency() int32

func (*PingTreeRequest) GetDmsgOnly

func (x *PingTreeRequest) GetDmsgOnly() bool

func (*PingTreeRequest) GetDmsgPreCheck

func (x *PingTreeRequest) GetDmsgPreCheck() bool

func (*PingTreeRequest) GetDryRun

func (x *PingTreeRequest) GetDryRun() bool

func (*PingTreeRequest) GetHops

func (x *PingTreeRequest) GetHops() int32

func (*PingTreeRequest) GetMaxLevel

func (x *PingTreeRequest) GetMaxLevel() int32

func (*PingTreeRequest) GetMinVersion

func (x *PingTreeRequest) GetMinVersion() string

func (*PingTreeRequest) GetOnlineOnly

func (x *PingTreeRequest) GetOnlineOnly() bool

func (*PingTreeRequest) GetPacketSizeKb

func (x *PingTreeRequest) GetPacketSizeKb() int32

func (*PingTreeRequest) GetPingTimeoutNs

func (x *PingTreeRequest) GetPingTimeoutNs() int64

func (*PingTreeRequest) GetRetries

func (x *PingTreeRequest) GetRetries() int32

func (*PingTreeRequest) GetSetupTimeoutNs

func (x *PingTreeRequest) GetSetupTimeoutNs() int64

func (*PingTreeRequest) GetTries

func (x *PingTreeRequest) GetTries() int32

func (*PingTreeRequest) GetUseTransportLatency

func (x *PingTreeRequest) GetUseTransportLatency() bool

func (*PingTreeRequest) ProtoMessage

func (*PingTreeRequest) ProtoMessage()

func (*PingTreeRequest) ProtoReflect

func (x *PingTreeRequest) ProtoReflect() protoreflect.Message

func (*PingTreeRequest) Reset

func (x *PingTreeRequest) Reset()

func (*PingTreeRequest) String

func (x *PingTreeRequest) String() string

type PingTreeResult

type PingTreeResult struct {
	TpId     string `protobuf:"bytes,1,opt,name=tp_id,json=tpId,proto3" json:"tp_id,omitempty"`
	TpType   string `protobuf:"bytes,2,opt,name=tp_type,json=tpType,proto3" json:"tp_type,omitempty"`
	RemotePk string `protobuf:"bytes,3,opt,name=remote_pk,json=remotePk,proto3" json:"remote_pk,omitempty"`
	ParentPk string `protobuf:"bytes,4,opt,name=parent_pk,json=parentPk,proto3" json:"parent_pk,omitempty"`
	Level    int32  `protobuf:"varint,5,opt,name=level,proto3" json:"level,omitempty"`
	Failed   bool   `protobuf:"varint,6,opt,name=failed,proto3" json:"failed,omitempty"`
	// Canceled distinguishes ctx-canceled-mid-flight from genuine
	// failure. Set when ctx.Err() != nil at the time the result was
	// finalized. Different operator action: retry vs investigate.
	Canceled bool `protobuf:"varint,7,opt,name=canceled,proto3" json:"canceled,omitempty"`
	// SetupLatencyNs is the route-setup phase time. Excluded from the
	// ping_*_ns aggregations below — those are per-ping post-setup.
	SetupLatencyNs int64 `protobuf:"varint,8,opt,name=setup_latency_ns,json=setupLatencyNs,proto3" json:"setup_latency_ns,omitempty"`
	// SampleCount is the number of successful pings (out of Tries).
	// Zero when failed.
	SampleCount int32 `protobuf:"varint,9,opt,name=sample_count,json=sampleCount,proto3" json:"sample_count,omitempty"`
	// PingAvgNs / PingP50Ns / PingP99Ns / JitterNs are aggregations
	// over the sample series. Jitter is the population stddev:
	// sqrt(sum((x - mean)^2) / N). Zero when sample_count < 2 (no
	// stddev defined for a single sample).
	PingAvgNs int64 `protobuf:"varint,10,opt,name=ping_avg_ns,json=pingAvgNs,proto3" json:"ping_avg_ns,omitempty"`
	PingP50Ns int64 `protobuf:"varint,11,opt,name=ping_p50_ns,json=pingP50Ns,proto3" json:"ping_p50_ns,omitempty"`
	PingP99Ns int64 `protobuf:"varint,12,opt,name=ping_p99_ns,json=pingP99Ns,proto3" json:"ping_p99_ns,omitempty"`
	JitterNs  int64 `protobuf:"varint,13,opt,name=jitter_ns,json=jitterNs,proto3" json:"jitter_ns,omitempty"`
	// SetupErr / PingErr / CalcErr surface the most-recent error from
	// each phase. Multiple may be set when multiple phases failed.
	SetupErr string `protobuf:"bytes,14,opt,name=setup_err,json=setupErr,proto3" json:"setup_err,omitempty"`
	PingErr  string `protobuf:"bytes,15,opt,name=ping_err,json=pingErr,proto3" json:"ping_err,omitempty"`
	CalcErr  string `protobuf:"bytes,16,opt,name=calc_err,json=calcErr,proto3" json:"calc_err,omitempty"`
	// LatencySource carries the provenance of the latency stats:
	//
	//	"live_ping"          — measured by an actual ping just now
	//	"transport_summary"  — pulled from TransportSummary.LatencyMS
	//	                       (smoothed cache, level-1 fast path)
	//	"skipped"            — entry was --hops mismatch or --dry-run
	//
	// Consumers use this to weight stale-cache values vs fresh probes.
	LatencySource string `protobuf:"bytes,17,opt,name=latency_source,json=latencySource,proto3" json:"latency_source,omitempty"`
	// Route is the hop sequence used for this ping. Empty for the
	// transport_summary fast-path (no route was constructed).
	Route []*RouteHop `protobuf:"bytes,18,rep,name=route,proto3" json:"route,omitempty"`
	// contains filtered or unexported fields
}

PingResult fires when a transport's ping (or the cache fast-path) completes. Both success and failure produce a PingResult; consumers switch on the failed bool. Latency stats are aggregated across the per-tries sample series.

func (*PingTreeResult) Descriptor deprecated

func (*PingTreeResult) Descriptor() ([]byte, []int)

Deprecated: Use PingTreeResult.ProtoReflect.Descriptor instead.

func (*PingTreeResult) GetCalcErr

func (x *PingTreeResult) GetCalcErr() string

func (*PingTreeResult) GetCanceled

func (x *PingTreeResult) GetCanceled() bool

func (*PingTreeResult) GetFailed

func (x *PingTreeResult) GetFailed() bool

func (*PingTreeResult) GetJitterNs

func (x *PingTreeResult) GetJitterNs() int64

func (*PingTreeResult) GetLatencySource

func (x *PingTreeResult) GetLatencySource() string

func (*PingTreeResult) GetLevel

func (x *PingTreeResult) GetLevel() int32

func (*PingTreeResult) GetParentPk

func (x *PingTreeResult) GetParentPk() string

func (*PingTreeResult) GetPingAvgNs

func (x *PingTreeResult) GetPingAvgNs() int64

func (*PingTreeResult) GetPingErr

func (x *PingTreeResult) GetPingErr() string

func (*PingTreeResult) GetPingP50Ns

func (x *PingTreeResult) GetPingP50Ns() int64

func (*PingTreeResult) GetPingP99Ns

func (x *PingTreeResult) GetPingP99Ns() int64

func (*PingTreeResult) GetRemotePk

func (x *PingTreeResult) GetRemotePk() string

func (*PingTreeResult) GetRoute

func (x *PingTreeResult) GetRoute() []*RouteHop

func (*PingTreeResult) GetSampleCount

func (x *PingTreeResult) GetSampleCount() int32

func (*PingTreeResult) GetSetupErr

func (x *PingTreeResult) GetSetupErr() string

func (*PingTreeResult) GetSetupLatencyNs

func (x *PingTreeResult) GetSetupLatencyNs() int64

func (*PingTreeResult) GetTpId

func (x *PingTreeResult) GetTpId() string

func (*PingTreeResult) GetTpType

func (x *PingTreeResult) GetTpType() string

func (*PingTreeResult) ProtoMessage

func (*PingTreeResult) ProtoMessage()

func (*PingTreeResult) ProtoReflect

func (x *PingTreeResult) ProtoReflect() protoreflect.Message

func (*PingTreeResult) Reset

func (x *PingTreeResult) Reset()

func (*PingTreeResult) String

func (x *PingTreeResult) String() string

type PingTreeRunDone

type PingTreeRunDone struct {
	TotalDiscovered    int32 `protobuf:"varint,1,opt,name=total_discovered,json=totalDiscovered,proto3" json:"total_discovered,omitempty"`
	TotalPinged        int32 `protobuf:"varint,2,opt,name=total_pinged,json=totalPinged,proto3" json:"total_pinged,omitempty"`
	TotalSucceeded     int32 `protobuf:"varint,3,opt,name=total_succeeded,json=totalSucceeded,proto3" json:"total_succeeded,omitempty"`
	TotalFailed        int32 `protobuf:"varint,4,opt,name=total_failed,json=totalFailed,proto3" json:"total_failed,omitempty"`
	TotalSkippedCached int32 `protobuf:"varint,5,opt,name=total_skipped_cached,json=totalSkippedCached,proto3" json:"total_skipped_cached,omitempty"`
	WallTimeNs         int64 `protobuf:"varint,6,opt,name=wall_time_ns,json=wallTimeNs,proto3" json:"wall_time_ns,omitempty"`
	// PeakInFlight is the highest concurrent ping count observed
	// during the run. Useful for tuning concurrency.
	PeakInFlight int32 `protobuf:"varint,7,opt,name=peak_in_flight,json=peakInFlight,proto3" json:"peak_in_flight,omitempty"`
	// TerminationReason is one of:
	//
	//	"max_level"          — hit cfg.MaxLevel
	//	"no_neighbors"       — BFS exhausted before MaxLevel
	//	"hops_target"        — reached cfg.Hops target level
	//	"context_cancel"     — client disconnect / server shutdown
	//	"error"              — see ServerError preceding this event
	TerminationReason string `protobuf:"bytes,8,opt,name=termination_reason,json=terminationReason,proto3" json:"termination_reason,omitempty"`
	// contains filtered or unexported fields
}

RunDone is the terminal event before stream close. Fires exactly once per StreamPingTree call.

func (*PingTreeRunDone) Descriptor deprecated

func (*PingTreeRunDone) Descriptor() ([]byte, []int)

Deprecated: Use PingTreeRunDone.ProtoReflect.Descriptor instead.

func (*PingTreeRunDone) GetPeakInFlight

func (x *PingTreeRunDone) GetPeakInFlight() int32

func (*PingTreeRunDone) GetTerminationReason

func (x *PingTreeRunDone) GetTerminationReason() string

func (*PingTreeRunDone) GetTotalDiscovered

func (x *PingTreeRunDone) GetTotalDiscovered() int32

func (*PingTreeRunDone) GetTotalFailed

func (x *PingTreeRunDone) GetTotalFailed() int32

func (*PingTreeRunDone) GetTotalPinged

func (x *PingTreeRunDone) GetTotalPinged() int32

func (*PingTreeRunDone) GetTotalSkippedCached

func (x *PingTreeRunDone) GetTotalSkippedCached() int32

func (*PingTreeRunDone) GetTotalSucceeded

func (x *PingTreeRunDone) GetTotalSucceeded() int32

func (*PingTreeRunDone) GetWallTimeNs

func (x *PingTreeRunDone) GetWallTimeNs() int64

func (*PingTreeRunDone) ProtoMessage

func (*PingTreeRunDone) ProtoMessage()

func (*PingTreeRunDone) ProtoReflect

func (x *PingTreeRunDone) ProtoReflect() protoreflect.Message

func (*PingTreeRunDone) Reset

func (x *PingTreeRunDone) Reset()

func (*PingTreeRunDone) String

func (x *PingTreeRunDone) String() string

type PingTreeServerError

type PingTreeServerError struct {

	// Code is a short stable identifier (e.g. "auth_denied",
	// "internal_panic", "tpm_unavailable"). Suitable for grep / metric
	// labeling.
	Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"`
	// Message carries operator-readable detail. Not stable across
	// versions.
	Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
	// contains filtered or unexported fields
}

ServerError signals an unrecoverable condition that's about to close the stream. Clients receive it as the last event before stream-EOF; preserves a known cause vs an opaque transport error.

func (*PingTreeServerError) Descriptor deprecated

func (*PingTreeServerError) Descriptor() ([]byte, []int)

Deprecated: Use PingTreeServerError.ProtoReflect.Descriptor instead.

func (*PingTreeServerError) GetCode

func (x *PingTreeServerError) GetCode() string

func (*PingTreeServerError) GetMessage

func (x *PingTreeServerError) GetMessage() string

func (*PingTreeServerError) ProtoMessage

func (*PingTreeServerError) ProtoMessage()

func (*PingTreeServerError) ProtoReflect

func (x *PingTreeServerError) ProtoReflect() protoreflect.Message

func (*PingTreeServerError) Reset

func (x *PingTreeServerError) Reset()

func (*PingTreeServerError) String

func (x *PingTreeServerError) String() string

type PingTreeStatusUpdate

type PingTreeStatusUpdate struct {

	// Phase is one of: "discovering" | "pinging_level_N" | "finalizing".
	Phase string `protobuf:"bytes,1,opt,name=phase,proto3" json:"phase,omitempty"`
	// InFlight is the count of currently-active ping goroutines.
	InFlight int32 `protobuf:"varint,2,opt,name=in_flight,json=inFlight,proto3" json:"in_flight,omitempty"`
	// Pending is the count of queued-but-not-started pings.
	Pending int32 `protobuf:"varint,3,opt,name=pending,proto3" json:"pending,omitempty"`
	// Message is an optional human-readable hint (e.g. "waiting on 3
	// slow pings at level 2"). Empty for routine progress.
	Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"`
	// contains filtered or unexported fields
}

StatusUpdate is a low-priority informational event (e.g. "expanding level 3", "draining in-flight"). The handler MUST prefer dropping StatusUpdate over PingResult under backpressure — never trade measurement data for status text.

func (*PingTreeStatusUpdate) Descriptor deprecated

func (*PingTreeStatusUpdate) Descriptor() ([]byte, []int)

Deprecated: Use PingTreeStatusUpdate.ProtoReflect.Descriptor instead.

func (*PingTreeStatusUpdate) GetInFlight

func (x *PingTreeStatusUpdate) GetInFlight() int32

func (*PingTreeStatusUpdate) GetMessage

func (x *PingTreeStatusUpdate) GetMessage() string

func (*PingTreeStatusUpdate) GetPending

func (x *PingTreeStatusUpdate) GetPending() int32

func (*PingTreeStatusUpdate) GetPhase

func (x *PingTreeStatusUpdate) GetPhase() string

func (*PingTreeStatusUpdate) ProtoMessage

func (*PingTreeStatusUpdate) ProtoMessage()

func (*PingTreeStatusUpdate) ProtoReflect

func (x *PingTreeStatusUpdate) ProtoReflect() protoreflect.Message

func (*PingTreeStatusUpdate) Reset

func (x *PingTreeStatusUpdate) Reset()

func (*PingTreeStatusUpdate) String

func (x *PingTreeStatusUpdate) String() string

type ProcessStat

type ProcessStat struct {
	Pid           int32   `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"`                                           // Process ID
	Name          string  `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`                                          // Process name
	CpuPercent    float64 `protobuf:"fixed64,3,opt,name=cpu_percent,json=cpuPercent,proto3" json:"cpu_percent,omitempty"`          // CPU usage percentage
	MemoryPercent float64 `protobuf:"fixed64,4,opt,name=memory_percent,json=memoryPercent,proto3" json:"memory_percent,omitempty"` // Memory usage percentage
	MemoryRss     uint64  `protobuf:"varint,5,opt,name=memory_rss,json=memoryRss,proto3" json:"memory_rss,omitempty"`              // Resident set size in bytes
	Username      string  `protobuf:"bytes,6,opt,name=username,proto3" json:"username,omitempty"`                                  // Username running the process
	Status        string  `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"`                                      // Process status (running, sleeping, etc.)
	// contains filtered or unexported fields
}

ProcessStat contains information about a running process

func (*ProcessStat) Descriptor deprecated

func (*ProcessStat) Descriptor() ([]byte, []int)

Deprecated: Use ProcessStat.ProtoReflect.Descriptor instead.

func (*ProcessStat) GetCpuPercent

func (x *ProcessStat) GetCpuPercent() float64

func (*ProcessStat) GetMemoryPercent

func (x *ProcessStat) GetMemoryPercent() float64

func (*ProcessStat) GetMemoryRss

func (x *ProcessStat) GetMemoryRss() uint64

func (*ProcessStat) GetName

func (x *ProcessStat) GetName() string

func (*ProcessStat) GetPid

func (x *ProcessStat) GetPid() int32

func (*ProcessStat) GetStatus

func (x *ProcessStat) GetStatus() string

func (*ProcessStat) GetUsername

func (x *ProcessStat) GetUsername() string

func (*ProcessStat) ProtoMessage

func (*ProcessStat) ProtoMessage()

func (*ProcessStat) ProtoReflect

func (x *ProcessStat) ProtoReflect() protoreflect.Message

func (*ProcessStat) Reset

func (x *ProcessStat) Reset()

func (*ProcessStat) String

func (x *ProcessStat) String() string

type RemoteSystemStatsRequest

type RemoteSystemStatsRequest struct {
	RemotePk         string `protobuf:"bytes,1,opt,name=remote_pk,json=remotePk,proto3" json:"remote_pk,omitempty"`                            // Public key of remote visor to connect to
	UpdateIntervalNs int64  `protobuf:"varint,2,opt,name=update_interval_ns,json=updateIntervalNs,proto3" json:"update_interval_ns,omitempty"` // Update interval in nanoseconds (default 1s)
	IncludeProcesses bool   `protobuf:"varint,3,opt,name=include_processes,json=includeProcesses,proto3" json:"include_processes,omitempty"`   // Include top processes (more expensive)
	ProcessLimit     int32  `protobuf:"varint,4,opt,name=process_limit,json=processLimit,proto3" json:"process_limit,omitempty"`               // Max processes to include (default 10)
	// contains filtered or unexported fields
}

RemoteSystemStatsRequest requests system stats from a remote visor via DMSG

func (*RemoteSystemStatsRequest) Descriptor deprecated

func (*RemoteSystemStatsRequest) Descriptor() ([]byte, []int)

Deprecated: Use RemoteSystemStatsRequest.ProtoReflect.Descriptor instead.

func (*RemoteSystemStatsRequest) GetIncludeProcesses

func (x *RemoteSystemStatsRequest) GetIncludeProcesses() bool

func (*RemoteSystemStatsRequest) GetProcessLimit

func (x *RemoteSystemStatsRequest) GetProcessLimit() int32

func (*RemoteSystemStatsRequest) GetRemotePk

func (x *RemoteSystemStatsRequest) GetRemotePk() string

func (*RemoteSystemStatsRequest) GetUpdateIntervalNs

func (x *RemoteSystemStatsRequest) GetUpdateIntervalNs() int64

func (*RemoteSystemStatsRequest) ProtoMessage

func (*RemoteSystemStatsRequest) ProtoMessage()

func (*RemoteSystemStatsRequest) ProtoReflect

func (x *RemoteSystemStatsRequest) ProtoReflect() protoreflect.Message

func (*RemoteSystemStatsRequest) Reset

func (x *RemoteSystemStatsRequest) Reset()

func (*RemoteSystemStatsRequest) String

func (x *RemoteSystemStatsRequest) String() string

type RouteGroupMuxInfo

type RouteGroupMuxInfo struct {
	MuxEnabled  bool                `protobuf:"varint,1,opt,name=mux_enabled,json=muxEnabled,proto3" json:"mux_enabled,omitempty"`
	SackEnabled bool                `protobuf:"varint,2,opt,name=sack_enabled,json=sackEnabled,proto3" json:"sack_enabled,omitempty"`
	Legs        []*RouteGroupMuxLeg `protobuf:"bytes,3,rep,name=legs,proto3" json:"legs,omitempty"`
	// contains filtered or unexported fields
}

RouteGroupMuxInfo is one route group's mux state plus its per-leg counters. Field-for-field mirror of visor.MuxRouteGroupInfo (minus the descriptor, which the plot consumer does not render).

func (*RouteGroupMuxInfo) Descriptor deprecated

func (*RouteGroupMuxInfo) Descriptor() ([]byte, []int)

Deprecated: Use RouteGroupMuxInfo.ProtoReflect.Descriptor instead.

func (*RouteGroupMuxInfo) GetLegs

func (x *RouteGroupMuxInfo) GetLegs() []*RouteGroupMuxLeg

func (*RouteGroupMuxInfo) GetMuxEnabled

func (x *RouteGroupMuxInfo) GetMuxEnabled() bool

func (*RouteGroupMuxInfo) GetSackEnabled

func (x *RouteGroupMuxInfo) GetSackEnabled() bool

func (*RouteGroupMuxInfo) ProtoMessage

func (*RouteGroupMuxInfo) ProtoMessage()

func (*RouteGroupMuxInfo) ProtoReflect

func (x *RouteGroupMuxInfo) ProtoReflect() protoreflect.Message

func (*RouteGroupMuxInfo) Reset

func (x *RouteGroupMuxInfo) Reset()

func (*RouteGroupMuxInfo) String

func (x *RouteGroupMuxInfo) String() string

type RouteGroupMuxInfoData

type RouteGroupMuxInfoData struct {
	MuxEnabled  bool
	SACKEnabled bool
	Legs        []RouteGroupMuxLegData
}

RouteGroupMuxInfoData mirrors visor.MuxRouteGroupInfo at the rpcgrpc boundary so VisorAPI doesn't pull pkg/visor into rpcgrpc's import graph. The adapter at the visor's init transcribes the visor type into this one.

type RouteGroupMuxInfoSample

type RouteGroupMuxInfoSample struct {

	// TimestampNs is server-side wall time at emit.
	TimestampNs int64 `protobuf:"varint,1,opt,name=timestamp_ns,json=timestampNs,proto3" json:"timestamp_ns,omitempty"`
	// RouteGroups is one entry per active route group tagged with the
	// requested app. Empty when the app has no route group yet — the
	// stream stays open and keeps sampling rather than erroring.
	RouteGroups []*RouteGroupMuxInfo `protobuf:"bytes,2,rep,name=route_groups,json=routeGroups,proto3" json:"route_groups,omitempty"`
	// contains filtered or unexported fields
}

RouteGroupMuxInfoSample is one snapshot of a running app's mux'd route-group telemetry, emitted every sample_interval_ns. Mirrors the []visor.MuxRouteGroupInfo the unary RouteGroupMuxInfo RPC returns.

func (*RouteGroupMuxInfoSample) Descriptor deprecated

func (*RouteGroupMuxInfoSample) Descriptor() ([]byte, []int)

Deprecated: Use RouteGroupMuxInfoSample.ProtoReflect.Descriptor instead.

func (*RouteGroupMuxInfoSample) GetRouteGroups

func (x *RouteGroupMuxInfoSample) GetRouteGroups() []*RouteGroupMuxInfo

func (*RouteGroupMuxInfoSample) GetTimestampNs

func (x *RouteGroupMuxInfoSample) GetTimestampNs() int64

func (*RouteGroupMuxInfoSample) ProtoMessage

func (*RouteGroupMuxInfoSample) ProtoMessage()

func (*RouteGroupMuxInfoSample) ProtoReflect

func (x *RouteGroupMuxInfoSample) ProtoReflect() protoreflect.Message

func (*RouteGroupMuxInfoSample) Reset

func (x *RouteGroupMuxInfoSample) Reset()

func (*RouteGroupMuxInfoSample) String

func (x *RouteGroupMuxInfoSample) String() string

type RouteGroupMuxLeg

type RouteGroupMuxLeg struct {

	// RouteIndex is the leg's stable index within the group
	// (visor.MuxLegInfo.Index).
	RouteIndex  int32  `protobuf:"varint,1,opt,name=route_index,json=routeIndex,proto3" json:"route_index,omitempty"`
	TransportId string `protobuf:"bytes,2,opt,name=transport_id,json=transportId,proto3" json:"transport_id,omitempty"`
	// TransportKind is the leg's transport type (stcpr, sudph, dmsg, ...)
	// — visor.MuxLegInfo.TpType.
	TransportKind string  `protobuf:"bytes,3,opt,name=transport_kind,json=transportKind,proto3" json:"transport_kind,omitempty"`
	RemotePk      string  `protobuf:"bytes,4,opt,name=remote_pk,json=remotePk,proto3" json:"remote_pk,omitempty"`
	LatencyMs     float64 `protobuf:"fixed64,5,opt,name=latency_ms,json=latencyMs,proto3" json:"latency_ms,omitempty"`
	SentBytes     uint64  `protobuf:"varint,6,opt,name=sent_bytes,json=sentBytes,proto3" json:"sent_bytes,omitempty"`
	SentPackets   uint64  `protobuf:"varint,7,opt,name=sent_packets,json=sentPackets,proto3" json:"sent_packets,omitempty"`
	RecvBytes     uint64  `protobuf:"varint,8,opt,name=recv_bytes,json=recvBytes,proto3" json:"recv_bytes,omitempty"`
	RecvPackets   uint64  `protobuf:"varint,9,opt,name=recv_packets,json=recvPackets,proto3" json:"recv_packets,omitempty"`
	Retransmits   uint64  `protobuf:"varint,10,opt,name=retransmits,proto3" json:"retransmits,omitempty"`
	// Alive is false once the leg's transport is closed; Standby is true
	// for a warm standby (rules kept, not sending) — the leg's gate_state.
	Alive   bool `protobuf:"varint,11,opt,name=alive,proto3" json:"alive,omitempty"`
	Standby bool `protobuf:"varint,12,opt,name=standby,proto3" json:"standby,omitempty"`
	// contains filtered or unexported fields
}

RouteGroupMuxLeg is one leg (route) within a mux'd group — mirror of visor.MuxLegInfo.

func (*RouteGroupMuxLeg) Descriptor deprecated

func (*RouteGroupMuxLeg) Descriptor() ([]byte, []int)

Deprecated: Use RouteGroupMuxLeg.ProtoReflect.Descriptor instead.

func (*RouteGroupMuxLeg) GetAlive

func (x *RouteGroupMuxLeg) GetAlive() bool

func (*RouteGroupMuxLeg) GetLatencyMs

func (x *RouteGroupMuxLeg) GetLatencyMs() float64

func (*RouteGroupMuxLeg) GetRecvBytes

func (x *RouteGroupMuxLeg) GetRecvBytes() uint64

func (*RouteGroupMuxLeg) GetRecvPackets

func (x *RouteGroupMuxLeg) GetRecvPackets() uint64

func (*RouteGroupMuxLeg) GetRemotePk

func (x *RouteGroupMuxLeg) GetRemotePk() string

func (*RouteGroupMuxLeg) GetRetransmits

func (x *RouteGroupMuxLeg) GetRetransmits() uint64

func (*RouteGroupMuxLeg) GetRouteIndex

func (x *RouteGroupMuxLeg) GetRouteIndex() int32

func (*RouteGroupMuxLeg) GetSentBytes

func (x *RouteGroupMuxLeg) GetSentBytes() uint64

func (*RouteGroupMuxLeg) GetSentPackets

func (x *RouteGroupMuxLeg) GetSentPackets() uint64

func (*RouteGroupMuxLeg) GetStandby

func (x *RouteGroupMuxLeg) GetStandby() bool

func (*RouteGroupMuxLeg) GetTransportId

func (x *RouteGroupMuxLeg) GetTransportId() string

func (*RouteGroupMuxLeg) GetTransportKind

func (x *RouteGroupMuxLeg) GetTransportKind() string

func (*RouteGroupMuxLeg) ProtoMessage

func (*RouteGroupMuxLeg) ProtoMessage()

func (*RouteGroupMuxLeg) ProtoReflect

func (x *RouteGroupMuxLeg) ProtoReflect() protoreflect.Message

func (*RouteGroupMuxLeg) Reset

func (x *RouteGroupMuxLeg) Reset()

func (*RouteGroupMuxLeg) String

func (x *RouteGroupMuxLeg) String() string

type RouteGroupMuxLegData

type RouteGroupMuxLegData struct {
	Index       int
	TransportID string
	TpType      string
	RemotePK    string
	LatencyMS   float64
	SentBytes   uint64
	SentPackets uint64
	RecvBytes   uint64
	RecvPackets uint64
	Retransmits uint64
	Alive       bool
	Standby     bool
}

RouteGroupMuxLegData mirrors visor.MuxLegInfo — one leg (route) within a mux'd route group.

type RouteHop

type RouteHop struct {
	TpId   string `protobuf:"bytes,1,opt,name=tp_id,json=tpId,proto3" json:"tp_id,omitempty"`       // Transport ID (UUID)
	From   string `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"`                   // Source public key
	To     string `protobuf:"bytes,3,opt,name=to,proto3" json:"to,omitempty"`                       // Destination public key
	TpType string `protobuf:"bytes,4,opt,name=tp_type,json=tpType,proto3" json:"tp_type,omitempty"` // Transport type (stcpr, sudph, dmsg)
	// contains filtered or unexported fields
}

func (*RouteHop) Descriptor deprecated

func (*RouteHop) Descriptor() ([]byte, []int)

Deprecated: Use RouteHop.ProtoReflect.Descriptor instead.

func (*RouteHop) GetFrom

func (x *RouteHop) GetFrom() string

func (*RouteHop) GetTo

func (x *RouteHop) GetTo() string

func (*RouteHop) GetTpId

func (x *RouteHop) GetTpId() string

func (*RouteHop) GetTpType

func (x *RouteHop) GetTpType() string

func (*RouteHop) ProtoMessage

func (*RouteHop) ProtoMessage()

func (*RouteHop) ProtoReflect

func (x *RouteHop) ProtoReflect() protoreflect.Message

func (*RouteHop) Reset

func (x *RouteHop) Reset()

func (*RouteHop) String

func (x *RouteHop) String() string

type RouteHopDetail

type RouteHopDetail struct {
	TpID   string // Transport ID
	From   string // Source public key
	To     string // Destination public key
	TpType string // Transport type (stcpr, sudph, dmsg)
}

RouteHopDetail contains detailed information about a route hop for display.

type RouteHopInfo

type RouteHopInfo struct {
	TpID   string
	From   string
	To     string
	TpType string
}

RouteHopInfo contains detailed information about a single hop in a route. Mirrors router.RouteHopInfo to avoid import cycles.

type StreamRouteGroupMuxInfoRequest

type StreamRouteGroupMuxInfoRequest struct {

	// AppName scopes the telemetry to route groups tagged with this app
	// (skysocks-client, vpn-client, ...). Empty returns every mux'd route
	// group the visor has — matching the unary RouteGroupMuxInfo("").
	AppName string `protobuf:"bytes,1,opt,name=app_name,json=appName,proto3" json:"app_name,omitempty"`
	// SampleIntervalNs is how often a RouteGroupMuxInfoSample is emitted.
	// 0 falls back to 500 ms; the handler floors it to a 100 ms minimum
	// so a client can't spin the visor. Nanoseconds (proto convention
	// used throughout this service).
	SampleIntervalNs int64 `protobuf:"varint,2,opt,name=sample_interval_ns,json=sampleIntervalNs,proto3" json:"sample_interval_ns,omitempty"`
	// contains filtered or unexported fields
}

StreamRouteGroupMuxInfoRequest configures a live route-group mux telemetry stream for a running app. See StreamRouteGroupMuxInfo.

func (*StreamRouteGroupMuxInfoRequest) Descriptor deprecated

func (*StreamRouteGroupMuxInfoRequest) Descriptor() ([]byte, []int)

Deprecated: Use StreamRouteGroupMuxInfoRequest.ProtoReflect.Descriptor instead.

func (*StreamRouteGroupMuxInfoRequest) GetAppName

func (x *StreamRouteGroupMuxInfoRequest) GetAppName() string

func (*StreamRouteGroupMuxInfoRequest) GetSampleIntervalNs

func (x *StreamRouteGroupMuxInfoRequest) GetSampleIntervalNs() int64

func (*StreamRouteGroupMuxInfoRequest) ProtoMessage

func (*StreamRouteGroupMuxInfoRequest) ProtoMessage()

func (*StreamRouteGroupMuxInfoRequest) ProtoReflect

func (*StreamRouteGroupMuxInfoRequest) Reset

func (x *StreamRouteGroupMuxInfoRequest) Reset()

func (*StreamRouteGroupMuxInfoRequest) String

type SystemStats

type SystemStats struct {
	TimestampNs int64          `protobuf:"varint,1,opt,name=timestamp_ns,json=timestampNs,proto3" json:"timestamp_ns,omitempty"` // Unix timestamp in nanoseconds
	Host        *HostInfo      `protobuf:"bytes,2,opt,name=host,proto3" json:"host,omitempty"`                                   // Host information
	Cpu         []*CpuStat     `protobuf:"bytes,3,rep,name=cpu,proto3" json:"cpu,omitempty"`                                     // CPU usage per core
	CpuAverage  float64        `protobuf:"fixed64,4,opt,name=cpu_average,json=cpuAverage,proto3" json:"cpu_average,omitempty"`   // Average CPU usage across all cores
	Memory      *MemoryStat    `protobuf:"bytes,5,opt,name=memory,proto3" json:"memory,omitempty"`                               // Memory usage
	Swap        *MemoryStat    `protobuf:"bytes,6,opt,name=swap,proto3" json:"swap,omitempty"`                                   // Swap usage
	Disks       []*DiskStat    `protobuf:"bytes,7,rep,name=disks,proto3" json:"disks,omitempty"`                                 // Disk usage per partition
	Network     *NetworkStat   `protobuf:"bytes,8,opt,name=network,proto3" json:"network,omitempty"`                             // Network I/O
	Temps       []*TempStat    `protobuf:"bytes,9,rep,name=temps,proto3" json:"temps,omitempty"`                                 // Temperature sensors
	Processes   []*ProcessStat `protobuf:"bytes,10,rep,name=processes,proto3" json:"processes,omitempty"`                        // Top processes
	Error       string         `protobuf:"bytes,11,opt,name=error,proto3" json:"error,omitempty"`                                // Error message if collection failed
	// contains filtered or unexported fields
}

SystemStats contains system monitoring data for gotop-style display

func (*SystemStats) Descriptor deprecated

func (*SystemStats) Descriptor() ([]byte, []int)

Deprecated: Use SystemStats.ProtoReflect.Descriptor instead.

func (*SystemStats) GetCpu

func (x *SystemStats) GetCpu() []*CpuStat

func (*SystemStats) GetCpuAverage

func (x *SystemStats) GetCpuAverage() float64

func (*SystemStats) GetDisks

func (x *SystemStats) GetDisks() []*DiskStat

func (*SystemStats) GetError

func (x *SystemStats) GetError() string

func (*SystemStats) GetHost

func (x *SystemStats) GetHost() *HostInfo

func (*SystemStats) GetMemory

func (x *SystemStats) GetMemory() *MemoryStat

func (*SystemStats) GetNetwork

func (x *SystemStats) GetNetwork() *NetworkStat

func (*SystemStats) GetProcesses

func (x *SystemStats) GetProcesses() []*ProcessStat

func (*SystemStats) GetSwap

func (x *SystemStats) GetSwap() *MemoryStat

func (*SystemStats) GetTemps

func (x *SystemStats) GetTemps() []*TempStat

func (*SystemStats) GetTimestampNs

func (x *SystemStats) GetTimestampNs() int64

func (*SystemStats) ProtoMessage

func (*SystemStats) ProtoMessage()

func (*SystemStats) ProtoReflect

func (x *SystemStats) ProtoReflect() protoreflect.Message

func (*SystemStats) Reset

func (x *SystemStats) Reset()

func (*SystemStats) String

func (x *SystemStats) String() string

type SystemStatsCallback

type SystemStatsCallback func(stats *SystemStats)

SystemStatsCallback is called for each system stats update received from the stream.

type SystemStatsCollector

type SystemStatsCollector struct {
	// contains filtered or unexported fields
}

SystemStatsCollector collects system stats using gopsutil

func NewSystemStatsCollector

func NewSystemStatsCollector() *SystemStatsCollector

NewSystemStatsCollector creates a new system stats collector

func (*SystemStatsCollector) Collect

func (c *SystemStatsCollector) Collect(ctx context.Context, includeProcesses bool, processLimit int) (*SystemStats, error)

Collect gathers system stats and returns them as a proto message

type SystemStatsRequest

type SystemStatsRequest struct {
	UpdateIntervalNs int64 `protobuf:"varint,1,opt,name=update_interval_ns,json=updateIntervalNs,proto3" json:"update_interval_ns,omitempty"` // Update interval in nanoseconds (default 1s)
	IncludeProcesses bool  `protobuf:"varint,2,opt,name=include_processes,json=includeProcesses,proto3" json:"include_processes,omitempty"`   // Include top processes (more expensive)
	ProcessLimit     int32 `protobuf:"varint,3,opt,name=process_limit,json=processLimit,proto3" json:"process_limit,omitempty"`               // Max processes to include (default 10)
	// contains filtered or unexported fields
}

SystemStatsRequest configures system stats streaming

func (*SystemStatsRequest) Descriptor deprecated

func (*SystemStatsRequest) Descriptor() ([]byte, []int)

Deprecated: Use SystemStatsRequest.ProtoReflect.Descriptor instead.

func (*SystemStatsRequest) GetIncludeProcesses

func (x *SystemStatsRequest) GetIncludeProcesses() bool

func (*SystemStatsRequest) GetProcessLimit

func (x *SystemStatsRequest) GetProcessLimit() int32

func (*SystemStatsRequest) GetUpdateIntervalNs

func (x *SystemStatsRequest) GetUpdateIntervalNs() int64

func (*SystemStatsRequest) ProtoMessage

func (*SystemStatsRequest) ProtoMessage()

func (*SystemStatsRequest) ProtoReflect

func (x *SystemStatsRequest) ProtoReflect() protoreflect.Message

func (*SystemStatsRequest) Reset

func (x *SystemStatsRequest) Reset()

func (*SystemStatsRequest) String

func (x *SystemStatsRequest) String() string

type TempStat

type TempStat struct {
	SensorKey   string  `protobuf:"bytes,1,opt,name=sensor_key,json=sensorKey,proto3" json:"sensor_key,omitempty"` // Sensor identifier
	Temperature float64 `protobuf:"fixed64,2,opt,name=temperature,proto3" json:"temperature,omitempty"`            // Temperature in Celsius
	High        float64 `protobuf:"fixed64,3,opt,name=high,proto3" json:"high,omitempty"`                          // High threshold (if available)
	Critical    float64 `protobuf:"fixed64,4,opt,name=critical,proto3" json:"critical,omitempty"`                  // Critical threshold (if available)
	// contains filtered or unexported fields
}

TempStat contains temperature sensor information

func (*TempStat) Descriptor deprecated

func (*TempStat) Descriptor() ([]byte, []int)

Deprecated: Use TempStat.ProtoReflect.Descriptor instead.

func (*TempStat) GetCritical

func (x *TempStat) GetCritical() float64

func (*TempStat) GetHigh

func (x *TempStat) GetHigh() float64

func (*TempStat) GetSensorKey

func (x *TempStat) GetSensorKey() string

func (*TempStat) GetTemperature

func (x *TempStat) GetTemperature() float64

func (*TempStat) ProtoMessage

func (*TempStat) ProtoMessage()

func (*TempStat) ProtoReflect

func (x *TempStat) ProtoReflect() protoreflect.Message

func (*TempStat) Reset

func (x *TempStat) Reset()

func (*TempStat) String

func (x *TempStat) String() string

type UnimplementedPingServiceServer

type UnimplementedPingServiceServer struct{}

UnimplementedPingServiceServer must be embedded to have forward compatible implementations.

NOTE: this should be embedded by value instead of pointer to avoid a nil pointer dereference when methods are called.

func (UnimplementedPingServiceServer) GetRemoteDmsgServers

func (UnimplementedPingServiceServer) GetSystemStats

func (UnimplementedPingServiceServer) StreamAppLogs

func (UnimplementedPingServiceServer) StreamBandwidthTest

func (UnimplementedPingServiceServer) StreamCalcRoutes

func (UnimplementedPingServiceServer) StreamDmsgBandwidthTest

func (UnimplementedPingServiceServer) StreamDmsgPing

func (UnimplementedPingServiceServer) StreamPing

func (UnimplementedPingServiceServer) StreamPingTree

func (UnimplementedPingServiceServer) StreamRemoteSystemStats

func (UnimplementedPingServiceServer) StreamSystemStats

type UnsafePingServiceServer

type UnsafePingServiceServer interface {
	// contains filtered or unexported methods
}

UnsafePingServiceServer may be embedded to opt out of forward compatibility for this service. Use of this interface is not recommended, as added methods to PingServiceServer will result in compilation errors.

type VisorAPI

type VisorAPI interface {
	DialPing(conf PingConf) error
	PingOnce(conf PingConf) (time.Duration, error)
	PingOnceWithEcho(conf PingConf, echoFull bool) (bytesSent, bytesReceived uint64, latency time.Duration, err error)
	StopPing(pk cipher.PubKey) error
	// StopPingRoute tears down a single route in a mux-set without
	// touching the peer's other parallel routes. Used by
	// StreamMuxBandwidth to drop a failed aux route mid-pump.
	StopPingRoute(ref PingRouteRef) error
	GetPingRoute(pk cipher.PubKey) []cipher.PubKey
	GetPingRouteDetails(pk cipher.PubKey) []RouteHopInfo
	// GetPingRouteDetailsAt returns the hops for a specific route in
	// a mux-set. The peer-keyed accessor (GetPingRouteDetails) can't
	// distinguish among N parallel routes to the same target, so
	// per-route emit paths (MuxRouteEstablished.hops) ride this.
	GetPingRouteDetailsAt(ref PingRouteRef) []RouteHopInfo
	GetLastRouteCalcTime() time.Duration
	DialDmsgPing(pk cipher.PubKey) error
	DialDmsgPingViaServer(pk cipher.PubKey, serverPK cipher.PubKey) error
	DmsgPingOnce(conf PingConf) (time.Duration, error)
	DmsgPingOnceWithEcho(conf PingConf, echoFull bool) (bytesSent, bytesReceived uint64, latency time.Duration, err error)
	StopDmsgPing(pk cipher.PubKey) error
	GetDmsgPingServerPK(pk cipher.PubKey) (cipher.PubKey, error)
	GetRemoteDmsgServers(pk cipher.PubKey) ([]cipher.PubKey, error)
	// DialDmsgRPC dials a remote visor's gRPC/RPC port over DMSG and returns the connection
	DialDmsgRPC(pk cipher.PubKey) (net.Conn, error)
	// SubscribeLogs returns a channel of logrus entries matching the
	// filter; cancel() unsubscribes and returns the dropped count.
	// Both may be nil (visor without a broadcaster wired up).
	SubscribeLogs(f logging.Filter, capacity int) (<-chan *logrus.Entry, func() uint64)
	// SubscribeGroupMessages returns a channel of inbound group
	// messages converted into GroupMessageData (rpcgrpc's wire-friendly
	// mirror of visor.GroupMessage to avoid the visor → rpcgrpc import
	// cycle). cancel() unsubscribes and returns the dropped count.
	// Returns (nil, no-op) when grouping is not yet initialized on
	// the visor or running in a test harness.
	SubscribeGroupMessages(capacity int) (<-chan GroupMessageData, func() uint64)
	// SnapshotGroupMessagesAfterNs returns inbox-buffered group
	// messages with TS > sinceNs (UnixNano). Used by
	// StreamGroupMessages to replay events that landed during a
	// client's reconnect gap before entering the live dispatch loop.
	// Empty slice when grouping is uninitialized; bounded by the
	// inbox ring capacity (long disconnect → only the tail is
	// recoverable).
	SnapshotGroupMessagesAfterNs(sinceNs int64) []GroupMessageData
	// SnapshotGroupHistoryAfterNs returns durably-persisted group
	// messages with TS > sinceNs for the named group. Powers the
	// history-fallback path that backfills a subscriber whose
	// reconnect gap exceeds the in-memory inbox ring. Empty when the
	// operator hasn't enabled GroupHistoryDB, when the group has no
	// stored messages, or when no messages newer than sinceNs exist.
	SnapshotGroupHistoryAfterNs(groupID string, sinceNs int64) []GroupMessageData
	// IncGroupStreamSend records one successful stream.Send call from
	// StreamGroupMessages — i.e. one data event handed to the gRPC
	// transport. Called by the streaming handler after each successful
	// Send so the visor can surface a stream_send_count alongside the
	// inbox-side DeliverCount and SubDropCount in GroupInfo. The two
	// PingServer instances (local CLI + dmsg-RPC) share a single
	// adapter, so the counter aggregates across both transports.
	//
	// The Subscribed sentinel is NOT counted — operators care about
	// data delivery throughput, not handshake bookkeeping.
	IncGroupStreamSend()
	// LocalPK returns the visor's own public key. Used by route-calc
	// gRPC handlers that default the src PK to the local visor.
	LocalPK() cipher.PubKey
	// FetchAllTransportEntries pulls every transport entry from TPD via
	// the visor's existing discovery client. The route-calc gRPC
	// handler builds the BFS graph from this slice.
	FetchAllTransportEntries(ctx context.Context) ([]*transport.Entry, error)
	// GetTransportLatencyByRemotePK returns the smoothed avg RTT (ms)
	// for the local managed transport to remotePK, or 0 if no such
	// transport exists or its latency is not yet sampled. Powers the
	// ping-tree UseTransportLatency fast-path at level-1.
	GetTransportLatencyByRemotePK(remotePK cipher.PubKey) float64
	// RouteGroupMuxInfo returns the per-mux-leg counters for every active
	// route group tagged with appName — the same data the unary
	// RouteGroupMuxInfo net/rpc call returns, projected into the
	// rpcgrpc-local mirror so this package stays free of pkg/visor
	// imports. Powers StreamRouteGroupMuxInfo (the smooth server-stream
	// backing 'cli proxy mux plot'). Returns an empty slice (not an
	// error) when the app has no route group yet.
	RouteGroupMuxInfo(appName string) ([]RouteGroupMuxInfoData, error)
}

VisorAPI defines the interface for visor ping operations

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL