2019-11-14 10:44:19 +08:00
|
|
|
package notify
|
|
|
|
|
|
|
|
|
|
import (
|
2021-11-12 16:04:39 +08:00
|
|
|
"b612.me/stario"
|
2020-02-11 10:50:11 +08:00
|
|
|
"context"
|
2019-11-14 10:44:19 +08:00
|
|
|
"net"
|
2020-12-23 20:50:57 +08:00
|
|
|
"sync"
|
2021-11-12 16:04:39 +08:00
|
|
|
"sync/atomic"
|
2019-11-14 10:44:19 +08:00
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
2021-11-12 16:04:39 +08:00
|
|
|
type ServerCommon struct {
|
|
|
|
|
msgID uint64
|
|
|
|
|
alive atomic.Value
|
|
|
|
|
status Status
|
2026-04-15 15:24:36 +08:00
|
|
|
sessionOwnerState atomic.Int32
|
|
|
|
|
sessionRuntime atomic.Pointer[serverSessionRuntime]
|
2021-11-12 16:04:39 +08:00
|
|
|
listener net.Listener
|
|
|
|
|
udpListener *net.UDPConn
|
2024-08-18 17:23:52 +08:00
|
|
|
queue *stario.StarQueue
|
2021-11-12 16:04:39 +08:00
|
|
|
stopFn context.CancelFunc
|
|
|
|
|
stopCtx context.Context
|
|
|
|
|
maxReadTimeout time.Duration
|
|
|
|
|
maxWriteTimeout time.Duration
|
|
|
|
|
parallelNum int
|
|
|
|
|
wg stario.WaitGroup
|
2026-04-15 15:24:36 +08:00
|
|
|
peerRegistry *serverPeerRegistry
|
2021-11-12 16:04:39 +08:00
|
|
|
mu sync.RWMutex
|
|
|
|
|
handshakeRsaKey []byte
|
|
|
|
|
SecretKey []byte
|
|
|
|
|
defaultMsgEn func([]byte, []byte) []byte
|
|
|
|
|
defaultMsgDe func([]byte, []byte) []byte
|
2026-04-15 15:24:36 +08:00
|
|
|
defaultFastStreamEncode transportFastStreamEncoder
|
|
|
|
|
defaultFastBulkEncode transportFastBulkEncoder
|
|
|
|
|
defaultFastPlainEncode transportFastPlainEncoder
|
2021-11-12 16:04:39 +08:00
|
|
|
linkFns map[string]func(message *Message)
|
|
|
|
|
defaultFns func(message *Message)
|
|
|
|
|
noFinSyncMsgMaxKeepSeconds int64
|
|
|
|
|
maxHeartbeatLostSeconds int64
|
|
|
|
|
sequenceDe func([]byte) (interface{}, error)
|
|
|
|
|
sequenceEn func(interface{}) ([]byte, error)
|
2026-04-15 15:24:36 +08:00
|
|
|
logicalSession *logicalSessionState
|
|
|
|
|
onFileEvent func(FileEvent)
|
|
|
|
|
fileEventObserver func(FileEvent)
|
|
|
|
|
fileTransferCfg fileTransferConfig
|
|
|
|
|
signalReliableCfg signalReliabilityConfig
|
|
|
|
|
streamRuntime *streamRuntime
|
|
|
|
|
recordRuntime *recordRuntime
|
|
|
|
|
bulkRuntime *bulkRuntime
|
|
|
|
|
connectionRetryState *connectionRetryState
|
|
|
|
|
detachedClientKeepSeconds int64
|
|
|
|
|
securityReadyCheck bool
|
2022-02-23 14:36:12 +08:00
|
|
|
showError bool
|
2022-05-20 09:27:19 +08:00
|
|
|
debugMode bool
|
2020-12-29 14:09:48 +08:00
|
|
|
}
|
2020-06-08 15:06:22 +08:00
|
|
|
|
2021-11-12 16:04:39 +08:00
|
|
|
func NewServer() Server {
|
2026-04-15 15:24:36 +08:00
|
|
|
transport := defaultModernPSKTransportBundle()
|
2021-11-12 16:04:39 +08:00
|
|
|
var server ServerCommon
|
|
|
|
|
server.wg = stario.NewWaitGroup(0)
|
|
|
|
|
server.parallelNum = 0
|
|
|
|
|
server.noFinSyncMsgMaxKeepSeconds = 0
|
|
|
|
|
server.maxHeartbeatLostSeconds = 300
|
|
|
|
|
server.stopCtx, server.stopFn = context.WithCancel(context.Background())
|
2026-04-15 15:24:36 +08:00
|
|
|
server.SecretKey = nil
|
2021-11-12 16:04:39 +08:00
|
|
|
server.handshakeRsaKey = defaultRsaKey
|
2026-04-15 15:24:36 +08:00
|
|
|
server.peerRegistry = newServerPeerRegistry()
|
|
|
|
|
server.defaultMsgEn = transport.msgEn
|
|
|
|
|
server.defaultMsgDe = transport.msgDe
|
|
|
|
|
server.defaultFastStreamEncode = transport.fastStreamEncode
|
|
|
|
|
server.defaultFastBulkEncode = transport.fastBulkEncode
|
|
|
|
|
server.defaultFastPlainEncode = transport.fastPlainEncode
|
|
|
|
|
server.securityReadyCheck = true
|
2021-11-12 16:04:39 +08:00
|
|
|
server.sequenceEn = encode
|
|
|
|
|
server.sequenceDe = Decode
|
|
|
|
|
server.alive.Store(false)
|
|
|
|
|
server.linkFns = make(map[string]func(*Message))
|
2026-04-15 15:24:36 +08:00
|
|
|
server.fileTransferCfg = defaultFileTransferConfig()
|
|
|
|
|
server.signalReliableCfg = defaultSignalReliabilityConfig()
|
|
|
|
|
server.logicalSession = newLogicalSessionState(server.fileTransferCfg, server.signalReliableCfg)
|
|
|
|
|
server.streamRuntime = newStreamRuntime("sstrm")
|
|
|
|
|
server.recordRuntime = newRecordRuntime()
|
|
|
|
|
server.bulkRuntime = newBulkRuntime("sblk")
|
|
|
|
|
server.connectionRetryState = newConnectionRetryState()
|
|
|
|
|
server.onFileEvent = normalizeFileEventCallback(nil)
|
|
|
|
|
server.fileEventObserver = normalizeFileEventCallback(nil)
|
2021-11-12 16:04:39 +08:00
|
|
|
server.defaultFns = func(message *Message) {
|
|
|
|
|
return
|
2020-06-08 15:06:22 +08:00
|
|
|
}
|
2026-04-15 15:24:36 +08:00
|
|
|
server.sessionRuntime.Store(newServerSessionRuntimeBase(server.stopCtx, server.stopFn))
|
|
|
|
|
bindServerStreamControl(&server)
|
|
|
|
|
bindServerBulkControl(&server)
|
|
|
|
|
server.getTransferState().setBuiltinHandler(server.builtinFileTransferHandler)
|
2021-11-12 16:04:39 +08:00
|
|
|
return &server
|
2020-06-08 15:06:22 +08:00
|
|
|
}
|