mirror of
https://github.com/m1k1o/neko.git
synced 2024-07-24 14:40:50 +12:00
major refactor.
This commit is contained in:
@ -6,15 +6,15 @@ import (
|
||||
"strconv"
|
||||
|
||||
"github.com/pion/webrtc/v2"
|
||||
|
||||
"demodesk/neko/internal/types"
|
||||
)
|
||||
|
||||
const OP_MOVE = 0x01
|
||||
const OP_SCROLL = 0x02
|
||||
const OP_KEY_DOWN = 0x03
|
||||
const OP_KEY_UP = 0x04
|
||||
const OP_KEY_CLK = 0x05
|
||||
const (
|
||||
OP_MOVE = 0x01
|
||||
OP_SCROLL = 0x02
|
||||
OP_KEY_DOWN = 0x03
|
||||
OP_KEY_UP = 0x04
|
||||
OP_KEY_CLK = 0x05
|
||||
)
|
||||
|
||||
type PayloadHeader struct {
|
||||
Event uint8
|
||||
@ -38,11 +38,7 @@ type PayloadKey struct {
|
||||
Key uint64
|
||||
}
|
||||
|
||||
func (manager *WebRTCManager) handle(session types.Session, msg webrtc.DataChannelMessage) error {
|
||||
if !session.IsHost() {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (manager *WebRTCManagerCtx) handle(msg webrtc.DataChannelMessage) error {
|
||||
buffer := bytes.NewBuffer(msg.Data)
|
||||
header := &PayloadHeader{}
|
||||
hbytes := make([]byte, 3)
|
||||
@ -64,7 +60,7 @@ func (manager *WebRTCManager) handle(session types.Session, msg webrtc.DataChann
|
||||
return err
|
||||
}
|
||||
|
||||
manager.remote.Move(int(payload.X), int(payload.Y))
|
||||
manager.desktop.Move(int(payload.X), int(payload.Y))
|
||||
case OP_SCROLL:
|
||||
payload := &PayloadScroll{}
|
||||
if err := binary.Read(buffer, binary.LittleEndian, payload); err != nil {
|
||||
@ -77,7 +73,7 @@ func (manager *WebRTCManager) handle(session types.Session, msg webrtc.DataChann
|
||||
Str("y", strconv.Itoa(int(payload.Y))).
|
||||
Msg("scroll")
|
||||
|
||||
manager.remote.Scroll(int(payload.X), int(payload.Y))
|
||||
manager.desktop.Scroll(int(payload.X), int(payload.Y))
|
||||
case OP_KEY_DOWN:
|
||||
payload := &PayloadKey{}
|
||||
if err := binary.Read(buffer, binary.LittleEndian, payload); err != nil {
|
||||
@ -85,7 +81,7 @@ func (manager *WebRTCManager) handle(session types.Session, msg webrtc.DataChann
|
||||
}
|
||||
|
||||
if payload.Key < 8 {
|
||||
err := manager.remote.ButtonDown(int(payload.Key))
|
||||
err := manager.desktop.ButtonDown(int(payload.Key))
|
||||
if err != nil {
|
||||
manager.logger.Warn().Err(err).Msg("button down failed")
|
||||
return nil
|
||||
@ -93,7 +89,7 @@ func (manager *WebRTCManager) handle(session types.Session, msg webrtc.DataChann
|
||||
|
||||
manager.logger.Debug().Msgf("button down %d", payload.Key)
|
||||
} else {
|
||||
err := manager.remote.KeyDown(uint64(payload.Key))
|
||||
err := manager.desktop.KeyDown(uint64(payload.Key))
|
||||
if err != nil {
|
||||
manager.logger.Warn().Err(err).Msg("key down failed")
|
||||
return nil
|
||||
@ -109,7 +105,7 @@ func (manager *WebRTCManager) handle(session types.Session, msg webrtc.DataChann
|
||||
}
|
||||
|
||||
if payload.Key < 8 {
|
||||
err := manager.remote.ButtonUp(int(payload.Key))
|
||||
err := manager.desktop.ButtonUp(int(payload.Key))
|
||||
if err != nil {
|
||||
manager.logger.Warn().Err(err).Msg("button up failed")
|
||||
return nil
|
||||
@ -117,7 +113,7 @@ func (manager *WebRTCManager) handle(session types.Session, msg webrtc.DataChann
|
||||
|
||||
manager.logger.Debug().Msgf("button up %d", payload.Key)
|
||||
} else {
|
||||
err := manager.remote.KeyUp(uint64(payload.Key))
|
||||
err := manager.desktop.KeyUp(uint64(payload.Key))
|
||||
if err != nil {
|
||||
manager.logger.Warn().Err(err).Msg("key up failed")
|
||||
return nil
|
||||
|
@ -8,17 +8,17 @@ import (
|
||||
"github.com/rs/zerolog"
|
||||
)
|
||||
|
||||
type nulllog struct{}
|
||||
type nulllog struct {}
|
||||
|
||||
func (l nulllog) Trace(msg string) {}
|
||||
func (l nulllog) Trace(msg string) {}
|
||||
func (l nulllog) Tracef(format string, args ...interface{}) {}
|
||||
func (l nulllog) Debug(msg string) {}
|
||||
func (l nulllog) Debug(msg string) {}
|
||||
func (l nulllog) Debugf(format string, args ...interface{}) {}
|
||||
func (l nulllog) Info(msg string) {}
|
||||
func (l nulllog) Infof(format string, args ...interface{}) {}
|
||||
func (l nulllog) Warn(msg string) {}
|
||||
func (l nulllog) Warnf(format string, args ...interface{}) {}
|
||||
func (l nulllog) Error(msg string) {}
|
||||
func (l nulllog) Info(msg string) {}
|
||||
func (l nulllog) Infof(format string, args ...interface{}) {}
|
||||
func (l nulllog) Warn(msg string) {}
|
||||
func (l nulllog) Warnf(format string, args ...interface{}) {}
|
||||
func (l nulllog) Error(msg string) {}
|
||||
func (l nulllog) Errorf(format string, args ...interface{}) {}
|
||||
|
||||
type logger struct {
|
||||
@ -26,10 +26,18 @@ type logger struct {
|
||||
subsystem string
|
||||
}
|
||||
|
||||
func (l logger) Trace(msg string) { l.logger.Trace().Msg(msg) }
|
||||
func (l logger) Tracef(format string, args ...interface{}) { l.logger.Trace().Msgf(format, args...) }
|
||||
func (l logger) Debug(msg string) { l.logger.Debug().Msg(msg) }
|
||||
func (l logger) Debugf(format string, args ...interface{}) { l.logger.Debug().Msgf(format, args...) }
|
||||
func (l logger) Trace(msg string) {
|
||||
l.logger.Trace().Msg(msg)
|
||||
}
|
||||
func (l logger) Tracef(format string, args ...interface{}) {
|
||||
l.logger.Trace().Msgf(format, args...)
|
||||
}
|
||||
func (l logger) Debug(msg string) {
|
||||
l.logger.Debug().Msg(msg)
|
||||
}
|
||||
func (l logger) Debugf(format string, args ...interface{}) {
|
||||
l.logger.Debug().Msgf(format, args...)
|
||||
}
|
||||
func (l logger) Info(msg string) {
|
||||
if strings.Contains(msg, "packetio.Buffer is full") {
|
||||
//l.logger.Panic().Msg(msg)
|
||||
@ -45,10 +53,18 @@ func (l logger) Infof(format string, args ...interface{}) {
|
||||
}
|
||||
l.logger.Info().Msg(msg)
|
||||
}
|
||||
func (l logger) Warn(msg string) { l.logger.Warn().Msg(msg) }
|
||||
func (l logger) Warnf(format string, args ...interface{}) { l.logger.Warn().Msgf(format, args...) }
|
||||
func (l logger) Error(msg string) { l.logger.Error().Msg(msg) }
|
||||
func (l logger) Errorf(format string, args ...interface{}) { l.logger.Error().Msgf(format, args...) }
|
||||
func (l logger) Warn(msg string) {
|
||||
l.logger.Warn().Msg(msg)
|
||||
}
|
||||
func (l logger) Warnf(format string, args ...interface{}) {
|
||||
l.logger.Warn().Msgf(format, args...)
|
||||
}
|
||||
func (l logger) Error(msg string) {
|
||||
l.logger.Error().Msg(msg)
|
||||
}
|
||||
func (l logger) Errorf(format string, args ...interface{}) {
|
||||
l.logger.Error().Msgf(format, args...)
|
||||
}
|
||||
|
||||
type loggerFactory struct {
|
||||
logger zerolog.Logger
|
||||
|
@ -4,26 +4,25 @@ import (
|
||||
"github.com/pion/webrtc/v2"
|
||||
)
|
||||
|
||||
type Peer struct {
|
||||
id string
|
||||
type PeerCtx struct {
|
||||
api *webrtc.API
|
||||
engine *webrtc.MediaEngine
|
||||
manager *WebRTCManager
|
||||
settings *webrtc.SettingEngine
|
||||
connection *webrtc.PeerConnection
|
||||
configuration *webrtc.Configuration
|
||||
}
|
||||
|
||||
func (peer *Peer) SignalAnswer(sdp string) error {
|
||||
return peer.connection.SetRemoteDescription(webrtc.SessionDescription{SDP: sdp, Type: webrtc.SDPTypeAnswer})
|
||||
func (peer *PeerCtx) SignalAnswer(sdp string) error {
|
||||
return peer.connection.SetRemoteDescription(webrtc.SessionDescription{
|
||||
SDP: sdp,
|
||||
Type: webrtc.SDPTypeAnswer,
|
||||
})
|
||||
}
|
||||
|
||||
func (peer *Peer) Destroy() error {
|
||||
if peer.connection != nil && peer.connection.ConnectionState() == webrtc.PeerConnectionStateConnected {
|
||||
if err := peer.connection.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
func (peer *PeerCtx) Destroy() error {
|
||||
if peer.connection == nil || peer.connection.ConnectionState() != webrtc.PeerConnectionStateConnected {
|
||||
return nil
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
return peer.connection.Close()
|
||||
}
|
||||
|
@ -12,46 +12,49 @@ import (
|
||||
"github.com/rs/zerolog/log"
|
||||
|
||||
"demodesk/neko/internal/types"
|
||||
"demodesk/neko/internal/types/config"
|
||||
"demodesk/neko/internal/config"
|
||||
)
|
||||
|
||||
func New(remote types.RemoteManager, config *config.WebRTC) *WebRTCManager {
|
||||
return &WebRTCManager{
|
||||
func New(desktop types.DesktopManager, capture types.CaptureManager, config *config.WebRTC) *WebRTCManagerCtx {
|
||||
return &WebRTCManagerCtx{
|
||||
logger: log.With().Str("module", "webrtc").Logger(),
|
||||
remote: remote,
|
||||
desktop: desktop,
|
||||
capture: capture,
|
||||
config: config,
|
||||
}
|
||||
}
|
||||
|
||||
type WebRTCManager struct {
|
||||
type WebRTCManagerCtx struct {
|
||||
logger zerolog.Logger
|
||||
videoTrack *webrtc.Track
|
||||
audioTrack *webrtc.Track
|
||||
videoCodec *webrtc.RTPCodec
|
||||
audioCodec *webrtc.RTPCodec
|
||||
remote types.RemoteManager
|
||||
desktop types.DesktopManager
|
||||
capture types.CaptureManager
|
||||
config *config.WebRTC
|
||||
}
|
||||
|
||||
func (manager *WebRTCManager) Start() {
|
||||
func (manager *WebRTCManagerCtx) Start() {
|
||||
var err error
|
||||
manager.audioTrack, manager.audioCodec, err = manager.createTrack(manager.remote.AudioCodec())
|
||||
|
||||
manager.audioTrack, manager.audioCodec, err = manager.createTrack(manager.capture.AudioCodec())
|
||||
if err != nil {
|
||||
manager.logger.Panic().Err(err).Msg("unable to create audio track")
|
||||
}
|
||||
|
||||
manager.remote.OnAudioFrame(func(sample types.Sample) {
|
||||
manager.capture.OnAudioFrame(func(sample types.Sample) {
|
||||
if err := manager.audioTrack.WriteSample(media.Sample(sample)); err != nil && err != io.ErrClosedPipe {
|
||||
manager.logger.Warn().Err(err).Msg("audio pipeline failed to write")
|
||||
}
|
||||
})
|
||||
|
||||
manager.videoTrack, manager.videoCodec, err = manager.createTrack(manager.remote.VideoCodec())
|
||||
manager.videoTrack, manager.videoCodec, err = manager.createTrack(manager.capture.VideoCodec())
|
||||
if err != nil {
|
||||
manager.logger.Panic().Err(err).Msg("unable to create video track")
|
||||
}
|
||||
|
||||
manager.remote.OnVideoFrame(func(sample types.Sample) {
|
||||
manager.capture.OnVideoFrame(func(sample types.Sample) {
|
||||
if err := manager.videoTrack.WriteSample(media.Sample(sample)); err != nil && err != io.ErrClosedPipe {
|
||||
manager.logger.Warn().Err(err).Msg("video pipeline failed to write")
|
||||
}
|
||||
@ -65,12 +68,12 @@ func (manager *WebRTCManager) Start() {
|
||||
Msgf("webrtc starting")
|
||||
}
|
||||
|
||||
func (manager *WebRTCManager) Shutdown() error {
|
||||
func (manager *WebRTCManagerCtx) Shutdown() error {
|
||||
manager.logger.Info().Msgf("webrtc shutting down")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (manager *WebRTCManager) CreatePeer(id string, session types.Session) (string, bool, []string, error) {
|
||||
func (manager *WebRTCManagerCtx) CreatePeer(session types.Session) (string, bool, []string, error) {
|
||||
configuration := &webrtc.Configuration{
|
||||
ICEServers: []webrtc.ICEServer{
|
||||
{
|
||||
@ -134,7 +137,11 @@ func (manager *WebRTCManager) CreatePeer(id string, session types.Session) (stri
|
||||
|
||||
connection.OnDataChannel(func(d *webrtc.DataChannel) {
|
||||
d.OnMessage(func(msg webrtc.DataChannelMessage) {
|
||||
if err = manager.handle(session, msg); err != nil {
|
||||
if !session.IsHost() {
|
||||
return
|
||||
}
|
||||
|
||||
if err = manager.handle(msg); err != nil {
|
||||
manager.logger.Warn().Err(err).Msg("data handle failed")
|
||||
}
|
||||
})
|
||||
@ -148,21 +155,19 @@ func (manager *WebRTCManager) CreatePeer(id string, session types.Session) (stri
|
||||
switch state {
|
||||
case webrtc.PeerConnectionStateDisconnected:
|
||||
case webrtc.PeerConnectionStateFailed:
|
||||
manager.logger.Info().Str("id", id).Msg("peer disconnected")
|
||||
manager.logger.Info().Str("id", session.ID()).Msg("peer disconnected")
|
||||
if err:= session.Disconnect("peer connection state failed"); err != nil {
|
||||
manager.logger.Warn().Err(err).Msg("error while disconnecting session")
|
||||
}
|
||||
case webrtc.PeerConnectionStateConnected:
|
||||
manager.logger.Info().Str("id", id).Msg("peer connected")
|
||||
manager.logger.Info().Str("id", session.ID()).Msg("peer connected")
|
||||
session.SetConnected()
|
||||
}
|
||||
})
|
||||
|
||||
session.SetPeer(&Peer{
|
||||
id: id,
|
||||
session.SetPeer(&PeerCtx{
|
||||
api: api,
|
||||
engine: &engine,
|
||||
manager: manager,
|
||||
settings: &settings,
|
||||
connection: connection,
|
||||
configuration: configuration,
|
||||
@ -171,7 +176,7 @@ func (manager *WebRTCManager) CreatePeer(id string, session types.Session) (stri
|
||||
return description.SDP, manager.config.ICELite, manager.config.ICEServers, nil
|
||||
}
|
||||
|
||||
func (m *WebRTCManager) createTrack(codecName string) (*webrtc.Track, *webrtc.RTPCodec, error) {
|
||||
func (m *WebRTCManagerCtx) createTrack(codecName string) (*webrtc.Track, *webrtc.RTPCodec, error) {
|
||||
var codec *webrtc.RTPCodec
|
||||
switch codecName {
|
||||
case webrtc.VP8:
|
||||
|
Reference in New Issue
Block a user