mirror of
https://github.com/ehang-io/nps.git
synced 2025-07-03 04:53:50 +00:00
72 lines
1.3 KiB
Go
72 lines
1.3 KiB
Go
package transport
|
|
|
|
import (
|
|
"context"
|
|
quic "github.com/lucas-clemente/quic-go"
|
|
"net"
|
|
)
|
|
|
|
type QUIC struct {
|
|
session quic.Session
|
|
}
|
|
|
|
func NewQUIC(serverSession quic.Session) *QUIC {
|
|
return &QUIC{
|
|
session: serverSession,
|
|
}
|
|
}
|
|
|
|
func (qu *QUIC) Server() error {
|
|
return nil
|
|
}
|
|
|
|
func (qu *QUIC) Accept() (net.Conn, error) {
|
|
s, err := qu.session.AcceptStream(context.Background())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return NewQUICConn(s, qu.session.RemoteAddr(), qu.session.LocalAddr()), nil
|
|
}
|
|
|
|
func (qu *QUIC) Addr() net.Addr {
|
|
return qu.session.LocalAddr()
|
|
}
|
|
|
|
func (qu *QUIC) RemoteAddr() net.Addr {
|
|
return qu.session.RemoteAddr()
|
|
}
|
|
|
|
func (qu *QUIC) Client() error {
|
|
return nil
|
|
}
|
|
|
|
func (qu *QUIC) Open() (net.Conn, error) {
|
|
s, err := qu.session.OpenStream()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return NewQUICConn(s, qu.session.RemoteAddr(), qu.session.LocalAddr()), nil
|
|
}
|
|
|
|
func (qu *QUIC) Close() error {
|
|
return qu.session.CloseWithError(1, "by npc")
|
|
}
|
|
|
|
type QUICConn struct {
|
|
quic.Stream
|
|
localAddr net.Addr
|
|
remoteAddr net.Addr
|
|
}
|
|
|
|
func NewQUICConn(stream quic.Stream, rd net.Addr, ld net.Addr) *QUICConn {
|
|
return &QUICConn{Stream: stream, localAddr: ld, remoteAddr: rd}
|
|
}
|
|
|
|
func (qc *QUICConn) LocalAddr() net.Addr {
|
|
return qc.localAddr
|
|
}
|
|
|
|
func (qc *QUICConn) RemoteAddr() net.Addr {
|
|
return qc.remoteAddr
|
|
}
|