notify/starnotify/define.go

533 lines
15 KiB
Go
Raw Normal View History

2020-07-17 09:54:37 +08:00
package starnotify
import (
"b612.me/notify"
"context"
2021-11-12 16:04:39 +08:00
"errors"
"io"
"net"
2021-11-12 16:04:39 +08:00
"sync"
2020-07-17 09:54:37 +08:00
)
var (
2021-11-12 16:04:39 +08:00
cmu sync.RWMutex
smu sync.RWMutex
starClient map[string]notify.Client
starServer map[string]notify.Server
2020-07-17 09:54:37 +08:00
)
func init() {
2021-11-12 16:04:39 +08:00
starClient = make(map[string]notify.Client)
starServer = make(map[string]notify.Server)
2020-07-17 09:54:37 +08:00
}
2021-11-12 16:04:39 +08:00
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)
2021-11-12 16:04:39 +08:00
return client
2020-10-22 16:20:18 +08:00
}
2021-11-12 16:04:39 +08:00
func DeleteClient(key string) (err error) {
cmu.RLock()
2020-07-17 09:54:37 +08:00
client, ok := starClient[key]
2021-11-12 16:04:39 +08:00
cmu.RUnlock()
2020-07-17 09:54:37 +08:00
if !ok {
return errors.New("Not Exists Yet!")
}
2021-11-12 16:04:39 +08:00
if client.Status().Alive {
err = client.Stop()
2020-07-17 09:54:37 +08:00
}
client = nil
2021-11-12 16:04:39 +08:00
cmu.Lock()
2020-07-17 09:54:37 +08:00
delete(starClient, key)
2021-11-12 16:04:39 +08:00
cmu.Unlock()
return err
2020-07-17 09:54:37 +08:00
}
2021-11-12 16:04:39 +08:00
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)
2021-11-12 16:04:39 +08:00
return server
2020-07-17 09:54:37 +08:00
}
func DeleteServer(key string) error {
2021-11-12 16:04:39 +08:00
smu.RLock()
2020-07-17 09:54:37 +08:00
server, ok := starServer[key]
2021-11-12 16:04:39 +08:00
smu.RUnlock()
2020-07-17 09:54:37 +08:00
if !ok {
return errors.New("Not Exists Yet!")
}
2021-11-12 16:04:39 +08:00
if server.Status().Alive {
server.Stop()
2020-07-17 09:54:37 +08:00
}
server = nil
2021-11-12 16:04:39 +08:00
smu.Lock()
2020-07-17 09:54:37 +08:00
delete(starServer, key)
2021-11-12 16:04:39 +08:00
smu.Unlock()
2020-07-17 09:54:37 +08:00
return nil
}
2021-11-12 16:04:39 +08:00
func S(key string) notify.Server {
smu.RLock()
2020-07-17 09:54:37 +08:00
server, ok := starServer[key]
2021-11-12 16:04:39 +08:00
smu.RUnlock()
2020-07-17 09:54:37 +08:00
if !ok {
return nil
}
return server
}
2021-11-12 16:04:39 +08:00
func C(key string) notify.Client {
cmu.RLock()
2020-07-17 09:54:37 +08:00
client, ok := starClient[key]
2021-11-12 16:04:39 +08:00
cmu.RUnlock()
2020-07-17 09:54:37 +08:00
if !ok {
return nil
}
return client
}
2021-11-12 16:04:39 +08:00
func Server(key string) (notify.Server, error) {
smu.RLock()
2020-07-17 09:54:37 +08:00
server, ok := starServer[key]
2021-11-12 16:04:39 +08:00
smu.RUnlock()
2020-07-17 09:54:37 +08:00
if !ok {
return nil, errors.New("Not Exists Yet")
}
return server, nil
}
2021-11-12 16:04:39 +08:00
func Client(key string) (notify.Client, error) {
cmu.RLock()
2020-07-17 09:54:37 +08:00
client, ok := starClient[key]
2021-11-12 16:04:39 +08:00
cmu.RUnlock()
2020-07-17 09:54:37 +08:00
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()
}