- 引入 LogicalConn/TransportConn 分层,ClientConn 保留兼容适配层 - 新增 Stream、Bulk、RecordStream 三条数据面能力及对应控制路径 - 完成 transfer/file 传输内核与状态快照、诊断能力 - 补齐 reconnect、inbound dispatcher、modern psk 等基础模块 - 增加大规模回归、并发与基准测试覆盖 - 更新依赖库
533 lines
15 KiB
Go
533 lines
15 KiB
Go
package starnotify
|
|
|
|
import (
|
|
"b612.me/notify"
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
"net"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
cmu sync.RWMutex
|
|
smu sync.RWMutex
|
|
starClient map[string]notify.Client
|
|
starServer map[string]notify.Server
|
|
)
|
|
|
|
func init() {
|
|
starClient = make(map[string]notify.Client)
|
|
starServer = make(map[string]notify.Server)
|
|
}
|
|
|
|
func NewClient(key string) notify.Client {
|
|
client := notify.NewClient()
|
|
storeClient(key, client)
|
|
return client
|
|
}
|
|
|
|
func NewModernPSKClient(key string, sharedSecret []byte, opts *notify.ModernPSKOptions) (notify.Client, error) {
|
|
client := notify.NewClient()
|
|
if err := notify.UseModernPSKClient(client, sharedSecret, opts); err != nil {
|
|
return nil, err
|
|
}
|
|
storeClient(key, client)
|
|
return client, nil
|
|
}
|
|
|
|
func NewLegacySecurityClient(key string) notify.Client {
|
|
client := notify.NewClient()
|
|
notify.UseLegacySecurityClient(client)
|
|
storeClient(key, client)
|
|
return client
|
|
}
|
|
|
|
func DeleteClient(key string) (err error) {
|
|
cmu.RLock()
|
|
client, ok := starClient[key]
|
|
cmu.RUnlock()
|
|
if !ok {
|
|
return errors.New("Not Exists Yet!")
|
|
}
|
|
if client.Status().Alive {
|
|
err = client.Stop()
|
|
}
|
|
client = nil
|
|
cmu.Lock()
|
|
delete(starClient, key)
|
|
cmu.Unlock()
|
|
return err
|
|
}
|
|
|
|
func NewServer(key string) notify.Server {
|
|
server := notify.NewServer()
|
|
storeServer(key, server)
|
|
return server
|
|
}
|
|
|
|
func NewModernPSKServer(key string, sharedSecret []byte, opts *notify.ModernPSKOptions) (notify.Server, error) {
|
|
server := notify.NewServer()
|
|
if err := notify.UseModernPSKServer(server, sharedSecret, opts); err != nil {
|
|
return nil, err
|
|
}
|
|
storeServer(key, server)
|
|
return server, nil
|
|
}
|
|
|
|
func NewLegacySecurityServer(key string) notify.Server {
|
|
server := notify.NewServer()
|
|
notify.UseLegacySecurityServer(server)
|
|
storeServer(key, server)
|
|
return server
|
|
}
|
|
|
|
func DeleteServer(key string) error {
|
|
smu.RLock()
|
|
server, ok := starServer[key]
|
|
smu.RUnlock()
|
|
if !ok {
|
|
return errors.New("Not Exists Yet!")
|
|
}
|
|
if server.Status().Alive {
|
|
server.Stop()
|
|
}
|
|
server = nil
|
|
smu.Lock()
|
|
delete(starServer, key)
|
|
smu.Unlock()
|
|
return nil
|
|
}
|
|
|
|
func S(key string) notify.Server {
|
|
smu.RLock()
|
|
server, ok := starServer[key]
|
|
smu.RUnlock()
|
|
if !ok {
|
|
return nil
|
|
}
|
|
return server
|
|
}
|
|
|
|
func C(key string) notify.Client {
|
|
cmu.RLock()
|
|
client, ok := starClient[key]
|
|
cmu.RUnlock()
|
|
if !ok {
|
|
return nil
|
|
}
|
|
return client
|
|
}
|
|
|
|
func Server(key string) (notify.Server, error) {
|
|
smu.RLock()
|
|
server, ok := starServer[key]
|
|
smu.RUnlock()
|
|
if !ok {
|
|
return nil, errors.New("Not Exists Yet")
|
|
}
|
|
return server, nil
|
|
}
|
|
|
|
func Client(key string) (notify.Client, error) {
|
|
cmu.RLock()
|
|
client, ok := starClient[key]
|
|
cmu.RUnlock()
|
|
if !ok {
|
|
return nil, errors.New("Not Exists Yet")
|
|
}
|
|
return client, nil
|
|
}
|
|
|
|
func OpenClientStreamFromReader(ctx context.Context, key string, src io.Reader, opt notify.StreamOpenCopyOptions) (notify.Stream, int64, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
return notify.OpenClientStreamFromReader(ctx, client, src, opt)
|
|
}
|
|
|
|
func OpenServerLogicalStreamFromReader(ctx context.Context, key string, logical *notify.LogicalConn, src io.Reader, opt notify.StreamOpenCopyOptions) (notify.Stream, int64, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
return notify.OpenServerLogicalStreamFromReader(ctx, server, logical, src, opt)
|
|
}
|
|
|
|
func OpenServerTransportStreamFromReader(ctx context.Context, key string, transport *notify.TransportConn, src io.Reader, opt notify.StreamOpenCopyOptions) (notify.Stream, int64, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
return notify.OpenServerTransportStreamFromReader(ctx, server, transport, src, opt)
|
|
}
|
|
|
|
func CopyStreamToWriter(ctx context.Context, stream notify.Stream, dst io.Writer, opt notify.StreamCopyOptions) (int64, error) {
|
|
return notify.CopyStreamToWriter(ctx, stream, dst, opt)
|
|
}
|
|
|
|
func NewTransferSourceFromReader(src io.Reader, size int64) (notify.TransferReaderAt, error) {
|
|
return notify.NewTransferSourceFromReader(src, size)
|
|
}
|
|
|
|
func NewTransferSinkFromWriter(dst io.Writer) (notify.TransferWriterAt, error) {
|
|
return notify.NewTransferSinkFromWriter(dst)
|
|
}
|
|
|
|
func NewTransferReaderFromSource(source notify.TransferReaderAt, offset int64) (io.Reader, error) {
|
|
return notify.NewTransferReaderFromSource(source, offset)
|
|
}
|
|
|
|
func NewTransferWriterFromSink(sink notify.TransferWriterAt, offset int64) (io.Writer, error) {
|
|
return notify.NewTransferWriterFromSink(sink, offset)
|
|
}
|
|
|
|
func UseModernPSKClient(key string, sharedSecret []byte, opts *notify.ModernPSKOptions) error {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return notify.UseModernPSKClient(client, sharedSecret, opts)
|
|
}
|
|
|
|
func UseModernPSKServer(key string, sharedSecret []byte, opts *notify.ModernPSKOptions) error {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return notify.UseModernPSKServer(server, sharedSecret, opts)
|
|
}
|
|
|
|
func UseLegacySecurityClient(key string) error {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
notify.UseLegacySecurityClient(client)
|
|
return nil
|
|
}
|
|
|
|
func UseLegacySecurityServer(key string) error {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
notify.UseLegacySecurityServer(server)
|
|
return nil
|
|
}
|
|
|
|
func UseSignalReliabilityClient(key string, opts *notify.SignalReliabilityOptions) error {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return notify.UseSignalReliabilityClient(client, opts)
|
|
}
|
|
|
|
func UseSignalReliabilityServer(key string, opts *notify.SignalReliabilityOptions) error {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return notify.UseSignalReliabilityServer(server, opts)
|
|
}
|
|
|
|
func ConnectClientWithRetry(key string, network string, addr string, opts *notify.ConnectRetryOptions) error {
|
|
return ConnectClientWithRetryCtx(context.Background(), key, network, addr, opts)
|
|
}
|
|
|
|
func ConnectClientWithRetryCtx(ctx context.Context, key string, network string, addr string, opts *notify.ConnectRetryOptions) error {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return notify.ConnectClientWithRetry(ctx, client, network, addr, opts)
|
|
}
|
|
|
|
func ConnectClientFactoryWithRetry(key string, dialFn func(context.Context) (net.Conn, error), opts *notify.ConnectRetryOptions) error {
|
|
return ConnectClientFactoryWithRetryCtx(context.Background(), key, dialFn, opts)
|
|
}
|
|
|
|
func ConnectClientFactoryWithRetryCtx(ctx context.Context, key string, dialFn func(context.Context) (net.Conn, error), opts *notify.ConnectRetryOptions) error {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return notify.ConnectClientFactoryWithRetry(ctx, client, dialFn, opts)
|
|
}
|
|
|
|
func ListenServerWithRetry(key string, network string, addr string, opts *notify.ConnectRetryOptions) error {
|
|
return ListenServerWithRetryCtx(context.Background(), key, network, addr, opts)
|
|
}
|
|
|
|
func ListenServerWithRetryCtx(ctx context.Context, key string, network string, addr string, opts *notify.ConnectRetryOptions) error {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return notify.ListenServerWithRetry(ctx, server, network, addr, opts)
|
|
}
|
|
|
|
func GetSignalReliabilityStatsClient(key string) (notify.SignalReliabilityStats, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return notify.SignalReliabilityStats{}, err
|
|
}
|
|
return notify.GetSignalReliabilityStatsClient(client)
|
|
}
|
|
|
|
func GetSignalReliabilityStatsServer(key string) (notify.SignalReliabilityStats, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return notify.SignalReliabilityStats{}, err
|
|
}
|
|
return notify.GetSignalReliabilityStatsServer(server)
|
|
}
|
|
|
|
func GetClientRuntimeSnapshot(key string) (notify.ClientRuntimeSnapshot, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return notify.ClientRuntimeSnapshot{}, err
|
|
}
|
|
return notify.GetClientRuntimeSnapshot(client)
|
|
}
|
|
|
|
func GetServerRuntimeSnapshot(key string) (notify.ServerRuntimeSnapshot, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return notify.ServerRuntimeSnapshot{}, err
|
|
}
|
|
return notify.GetServerRuntimeSnapshot(server)
|
|
}
|
|
|
|
func GetServerClientRuntimeSnapshot(serverKey string, clientID string) (notify.ClientConnRuntimeSnapshot, error) {
|
|
return GetServerLogicalRuntimeSnapshot(serverKey, clientID)
|
|
}
|
|
|
|
func GetServerLogicalRuntimeSnapshot(serverKey string, clientID string) (notify.ClientConnRuntimeSnapshot, error) {
|
|
server, err := Server(serverKey)
|
|
if err != nil {
|
|
return notify.ClientConnRuntimeSnapshot{}, err
|
|
}
|
|
logical := server.GetLogicalConn(clientID)
|
|
if logical == nil {
|
|
return notify.ClientConnRuntimeSnapshot{}, errors.New("Not Exists Yet")
|
|
}
|
|
return notify.GetLogicalConnRuntimeSnapshot(logical)
|
|
}
|
|
|
|
func GetServerLogicalConn(serverKey string, clientID string) (*notify.LogicalConn, error) {
|
|
server, err := Server(serverKey)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
client := server.GetLogicalConn(clientID)
|
|
if client == nil {
|
|
return nil, errors.New("Not Exists Yet")
|
|
}
|
|
return client, nil
|
|
}
|
|
|
|
func GetServerCurrentTransportConn(serverKey string, clientID string) (*notify.TransportConn, bool, error) {
|
|
server, err := Server(serverKey)
|
|
if err != nil {
|
|
return nil, false, err
|
|
}
|
|
transport := server.GetCurrentTransportConn(clientID)
|
|
if transport == nil {
|
|
if server.GetLogicalConn(clientID) == nil {
|
|
return nil, false, errors.New("Not Exists Yet")
|
|
}
|
|
return nil, false, nil
|
|
}
|
|
return transport, true, nil
|
|
}
|
|
|
|
func GetServerClientTransportRuntimeSnapshot(serverKey string, clientID string) (notify.TransportConnRuntimeSnapshot, bool, error) {
|
|
return GetServerTransportRuntimeSnapshot(serverKey, clientID)
|
|
}
|
|
|
|
func GetServerTransportRuntimeSnapshot(serverKey string, clientID string) (notify.TransportConnRuntimeSnapshot, bool, error) {
|
|
server, err := Server(serverKey)
|
|
if err != nil {
|
|
return notify.TransportConnRuntimeSnapshot{}, false, err
|
|
}
|
|
transport := server.GetCurrentTransportConn(clientID)
|
|
if transport == nil {
|
|
if server.GetLogicalConn(clientID) == nil {
|
|
return notify.TransportConnRuntimeSnapshot{}, false, errors.New("Not Exists Yet")
|
|
}
|
|
return notify.TransportConnRuntimeSnapshot{}, false, nil
|
|
}
|
|
snapshot, err := notify.GetTransportConnRuntimeSnapshot(transport)
|
|
if err != nil {
|
|
return notify.TransportConnRuntimeSnapshot{}, false, err
|
|
}
|
|
return snapshot, true, nil
|
|
}
|
|
|
|
func GetServerDetachedClientRuntimeSnapshots(serverKey string) ([]notify.ClientConnRuntimeSnapshot, error) {
|
|
server, err := Server(serverKey)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return notify.GetServerDetachedClientRuntimeSnapshots(server)
|
|
}
|
|
|
|
func GetClientTransferSnapshots(key string) ([]notify.TransferSnapshot, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return notify.GetClientTransferSnapshots(client)
|
|
}
|
|
|
|
func GetServerTransferSnapshots(key string) ([]notify.TransferSnapshot, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return notify.GetServerTransferSnapshots(server)
|
|
}
|
|
|
|
func GetClientTransferSnapshotByID(key string, transferID string) (notify.TransferSnapshot, bool, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return notify.TransferSnapshot{}, false, err
|
|
}
|
|
return notify.GetClientTransferSnapshotByID(client, transferID)
|
|
}
|
|
|
|
func GetClientTransferSnapshotByIDScope(key string, transferID string, scope string) (notify.TransferSnapshot, bool, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return notify.TransferSnapshot{}, false, err
|
|
}
|
|
return notify.GetClientTransferSnapshotByIDScope(client, transferID, scope)
|
|
}
|
|
|
|
func GetClientTransferSnapshotByIDQuery(key string, transferID string, query notify.TransferSnapshotQuery) (notify.TransferSnapshot, bool, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return notify.TransferSnapshot{}, false, err
|
|
}
|
|
return notify.GetClientTransferSnapshotByIDQuery(client, transferID, query)
|
|
}
|
|
|
|
func GetServerTransferSnapshotByID(key string, transferID string) (notify.TransferSnapshot, bool, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return notify.TransferSnapshot{}, false, err
|
|
}
|
|
return notify.GetServerTransferSnapshotByID(server, transferID)
|
|
}
|
|
|
|
func GetServerTransferSnapshotByIDScope(key string, transferID string, scope string) (notify.TransferSnapshot, bool, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return notify.TransferSnapshot{}, false, err
|
|
}
|
|
return notify.GetServerTransferSnapshotByIDScope(server, transferID, scope)
|
|
}
|
|
|
|
func GetServerTransferSnapshotByIDQuery(key string, transferID string, query notify.TransferSnapshotQuery) (notify.TransferSnapshot, bool, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return notify.TransferSnapshot{}, false, err
|
|
}
|
|
return notify.GetServerTransferSnapshotByIDQuery(server, transferID, query)
|
|
}
|
|
|
|
func GetClientFileTransferActiveSummaries(key string) (notify.FileTransferSummaryGroup, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return notify.FileTransferSummaryGroup{}, err
|
|
}
|
|
return notify.GetClientFileTransferActiveSummaries(client)
|
|
}
|
|
|
|
func GetServerFileTransferActiveSummaries(key string) (notify.FileTransferSummaryGroup, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return notify.FileTransferSummaryGroup{}, err
|
|
}
|
|
return notify.GetServerFileTransferActiveSummaries(server)
|
|
}
|
|
|
|
func GetClientFileTransferCompletedSummaries(key string) (notify.FileTransferSummaryGroup, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return notify.FileTransferSummaryGroup{}, err
|
|
}
|
|
return notify.GetClientFileTransferCompletedSummaries(client)
|
|
}
|
|
|
|
func GetServerFileTransferCompletedSummaries(key string) (notify.FileTransferSummaryGroup, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return notify.FileTransferSummaryGroup{}, err
|
|
}
|
|
return notify.GetServerFileTransferCompletedSummaries(server)
|
|
}
|
|
|
|
func GetClientFileTransferFailedSummaries(key string) (notify.FileTransferSummaryGroup, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return notify.FileTransferSummaryGroup{}, err
|
|
}
|
|
return notify.GetClientFileTransferFailedSummaries(client)
|
|
}
|
|
|
|
func GetServerFileTransferFailedSummaries(key string) (notify.FileTransferSummaryGroup, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return notify.FileTransferSummaryGroup{}, err
|
|
}
|
|
return notify.GetServerFileTransferFailedSummaries(server)
|
|
}
|
|
|
|
func GetClientFileTransferLatestByFileID(key string, fileID string) (notify.FileTransferSummaryGroup, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return notify.FileTransferSummaryGroup{}, err
|
|
}
|
|
return notify.GetClientFileTransferLatestByFileID(client, fileID)
|
|
}
|
|
|
|
func GetServerFileTransferLatestByFileID(key string, fileID string) (notify.FileTransferSummaryGroup, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return notify.FileTransferSummaryGroup{}, err
|
|
}
|
|
return notify.GetServerFileTransferLatestByFileID(server, fileID)
|
|
}
|
|
|
|
func GetClientFileTransferLatestByFileIDQuery(key string, fileID string, query notify.FileTransferSummaryQuery) (notify.FileTransferSummaryGroup, error) {
|
|
client, err := Client(key)
|
|
if err != nil {
|
|
return notify.FileTransferSummaryGroup{}, err
|
|
}
|
|
return notify.GetClientFileTransferLatestByFileIDQuery(client, fileID, query)
|
|
}
|
|
|
|
func GetServerFileTransferLatestByFileIDQuery(key string, fileID string, query notify.FileTransferSummaryQuery) (notify.FileTransferSummaryGroup, error) {
|
|
server, err := Server(key)
|
|
if err != nil {
|
|
return notify.FileTransferSummaryGroup{}, err
|
|
}
|
|
return notify.GetServerFileTransferLatestByFileIDQuery(server, fileID, query)
|
|
}
|
|
|
|
func storeClient(key string, client notify.Client) {
|
|
cmu.Lock()
|
|
starClient[key] = client
|
|
cmu.Unlock()
|
|
}
|
|
|
|
func storeServer(key string, server notify.Server) {
|
|
smu.Lock()
|
|
starServer[key] = server
|
|
smu.Unlock()
|
|
}
|