mirror of
https://github.com/nestriness/nestri.git
synced 2025-12-11 00:05:36 +02:00
## Description ### First commit Restructured protobuf schemas to make them easier to use across languages, switched to using them in-place of JSON for signaling as well, so there's no 2 different message formats flying about. Few new message types to deal with clients and nestri-servers better (not final format, may see changes still). General cleanup of dead/unused code along some bug squashing and package updates. TODO for future commits: - [x] Fix additional controllers not doing inputs (possibly needs vimputti changes) - [x] ~~Restructure relay protocols code a bit, to reduce bloatiness of the currently single file for them, more code re-use.~~ - Gonna keep this PR somewhat manageable without poking more at relay.. - [x] ~~Try to fix issue where with multiple clients, static stream content causes video to freeze until there's some movement.~~ - Was caused by server tuned profile being `throughput-performance`, causing CPU latency to be too high. - [x] Ponder the orb ### Second + third commit Redid the controller polling handling and fixed multi-controller handling in vimputti and nestri code sides. Remove some dead relay code as well to clean up the protocol source file, we'll revisit the meshing functionality later. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added software rendering option and MangoHud runtime config; controller sessions now support reconnection and batched state updates with persistent session IDs. * **Bug Fixes** * Restored previously-filtered NES-like gamepads so they connect correctly. * **Chores** * Modernized dependencies and protobuf tooling, migrated to protobuf-based messaging and streaming, and removed obsolete CUDA build steps. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: DatCaptainHorse <DatCaptainHorse@users.noreply.github.com>
80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
package connections
|
|
|
|
import (
|
|
"log/slog"
|
|
gen "relay/internal/proto"
|
|
|
|
"github.com/pion/webrtc/v4"
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
type OnMessageCallback func(data []byte)
|
|
|
|
// NestriDataChannel is a custom data channel with callbacks
|
|
type NestriDataChannel struct {
|
|
*webrtc.DataChannel
|
|
callbacks map[string]OnMessageCallback // MessageBase type -> callback
|
|
}
|
|
|
|
// NewNestriDataChannel creates a new NestriDataChannel from *webrtc.DataChannel
|
|
func NewNestriDataChannel(dc *webrtc.DataChannel) *NestriDataChannel {
|
|
ndc := &NestriDataChannel{
|
|
DataChannel: dc,
|
|
callbacks: make(map[string]OnMessageCallback),
|
|
}
|
|
|
|
// Handler for incoming messages
|
|
ndc.OnMessage(func(msg webrtc.DataChannelMessage) {
|
|
// If string type message, ignore
|
|
if msg.IsString {
|
|
return
|
|
}
|
|
|
|
// Decode message
|
|
var base gen.ProtoMessage
|
|
if err := proto.Unmarshal(msg.Data, &base); err != nil {
|
|
slog.Error("failed to decode binary DataChannel message", "err", err)
|
|
return
|
|
}
|
|
|
|
// Route based on PayloadType
|
|
if base.MessageBase != nil && len(base.MessageBase.PayloadType) > 0 {
|
|
if callback, ok := ndc.callbacks[base.MessageBase.PayloadType]; ok {
|
|
go callback(msg.Data)
|
|
}
|
|
}
|
|
})
|
|
|
|
return ndc
|
|
}
|
|
|
|
// SendBinary sends a binary message to the data channel
|
|
func (ndc *NestriDataChannel) SendBinary(data []byte) error {
|
|
return ndc.Send(data)
|
|
}
|
|
|
|
// RegisterMessageCallback registers a callback for a given binary message type
|
|
func (ndc *NestriDataChannel) RegisterMessageCallback(msgType string, callback OnMessageCallback) {
|
|
if ndc.callbacks == nil {
|
|
ndc.callbacks = make(map[string]OnMessageCallback)
|
|
}
|
|
ndc.callbacks[msgType] = callback
|
|
}
|
|
|
|
// UnregisterMessageCallback removes the callback for a given binary message type
|
|
func (ndc *NestriDataChannel) UnregisterMessageCallback(msgType string) {
|
|
if ndc.callbacks != nil {
|
|
delete(ndc.callbacks, msgType)
|
|
}
|
|
}
|
|
|
|
// RegisterOnOpen registers a callback for the data channel opening
|
|
func (ndc *NestriDataChannel) RegisterOnOpen(callback func()) {
|
|
ndc.OnOpen(callback)
|
|
}
|
|
|
|
// RegisterOnClose registers a callback for the data channel closing
|
|
func (ndc *NestriDataChannel) RegisterOnClose(callback func()) {
|
|
ndc.OnClose(callback)
|
|
}
|