- 引入 LogicalConn/TransportConn 分层,ClientConn 保留兼容适配层 - 新增 Stream、Bulk、RecordStream 三条数据面能力及对应控制路径 - 完成 transfer/file 传输内核与状态快照、诊断能力 - 补齐 reconnect、inbound dispatcher、modern psk 等基础模块 - 增加大规模回归、并发与基准测试覆盖 - 更新依赖库
147 lines
4.7 KiB
Go
147 lines
4.7 KiB
Go
package notify
|
|
|
|
import "sort"
|
|
|
|
type fileTransferSummaryGroup struct {
|
|
Send []fileTransferSummary
|
|
Receive []fileTransferSummary
|
|
}
|
|
|
|
type fileTransferSummaryQuery struct {
|
|
Scope string
|
|
RuntimeScope string
|
|
TransportGeneration uint64
|
|
MatchTransportGeneration bool
|
|
}
|
|
|
|
type fileTransferQuery struct {
|
|
monitor *fileTransferMonitor
|
|
}
|
|
|
|
func newFileTransferQuery(m *fileTransferMonitor) fileTransferQuery {
|
|
return fileTransferQuery{monitor: m}
|
|
}
|
|
|
|
func (q fileTransferQuery) active() fileTransferSummaryGroup {
|
|
if q.monitor == nil {
|
|
return fileTransferSummaryGroup{}
|
|
}
|
|
return groupFileTransferSummaries(q.monitor.activeSummaries())
|
|
}
|
|
|
|
func (q fileTransferQuery) completed() fileTransferSummaryGroup {
|
|
if q.monitor == nil {
|
|
return fileTransferSummaryGroup{}
|
|
}
|
|
return groupFileTransferSummaries(filterFileTransferSummaries(q.monitor.completedSummaries(), func(summary fileTransferSummary) bool {
|
|
return summary.Done && !summary.Failed
|
|
}))
|
|
}
|
|
|
|
func (q fileTransferQuery) failed() fileTransferSummaryGroup {
|
|
return groupFileTransferSummaries(filterFileTransferSummaries(latestFileTransferSummaries(q.monitor), func(summary fileTransferSummary) bool {
|
|
return summary.Failed
|
|
}))
|
|
}
|
|
|
|
func (q fileTransferQuery) latestByFileID(fileID string) fileTransferSummaryGroup {
|
|
if q.monitor == nil || fileID == "" {
|
|
return fileTransferSummaryGroup{}
|
|
}
|
|
return groupFileTransferSummaries(q.monitor.summariesByFileID(fileID))
|
|
}
|
|
|
|
func (q fileTransferQuery) latestSendByFileID(fileID string) []fileTransferSummary {
|
|
if q.monitor == nil || fileID == "" {
|
|
return nil
|
|
}
|
|
return q.monitor.summariesByDirectionAndFileID(fileTransferDirectionSend, fileID)
|
|
}
|
|
|
|
func (q fileTransferQuery) latestReceiveByFileID(fileID string) []fileTransferSummary {
|
|
if q.monitor == nil || fileID == "" {
|
|
return nil
|
|
}
|
|
return q.monitor.summariesByDirectionAndFileID(fileTransferDirectionReceive, fileID)
|
|
}
|
|
|
|
func (q fileTransferQuery) latestByFileIDQuery(fileID string, query fileTransferSummaryQuery) fileTransferSummaryGroup {
|
|
if q.monitor == nil || fileID == "" {
|
|
return fileTransferSummaryGroup{}
|
|
}
|
|
return groupFileTransferSummaries(filterFileTransferSummaries(q.monitor.runtimeSummariesByFileID(fileID), func(summary fileTransferSummary) bool {
|
|
return fileTransferSummaryQueryMatch(summary, query)
|
|
}))
|
|
}
|
|
|
|
func (q fileTransferQuery) latestSendByFileIDQuery(fileID string, query fileTransferSummaryQuery) []fileTransferSummary {
|
|
if q.monitor == nil || fileID == "" {
|
|
return nil
|
|
}
|
|
return filterFileTransferSummaries(q.monitor.runtimeSummariesByDirectionAndFileID(fileTransferDirectionSend, fileID), func(summary fileTransferSummary) bool {
|
|
return fileTransferSummaryQueryMatch(summary, query)
|
|
})
|
|
}
|
|
|
|
func (q fileTransferQuery) latestReceiveByFileIDQuery(fileID string, query fileTransferSummaryQuery) []fileTransferSummary {
|
|
if q.monitor == nil || fileID == "" {
|
|
return nil
|
|
}
|
|
return filterFileTransferSummaries(q.monitor.runtimeSummariesByDirectionAndFileID(fileTransferDirectionReceive, fileID), func(summary fileTransferSummary) bool {
|
|
return fileTransferSummaryQueryMatch(summary, query)
|
|
})
|
|
}
|
|
|
|
func latestFileTransferSummaries(m *fileTransferMonitor) []fileTransferSummary {
|
|
if m == nil {
|
|
return nil
|
|
}
|
|
summaries := append([]fileTransferSummary{}, m.activeSummaries()...)
|
|
summaries = append(summaries, m.completedSummaries()...)
|
|
sort.Slice(summaries, func(i int, j int) bool {
|
|
return fileTransferSummarySortKey(summaries[i]) < fileTransferSummarySortKey(summaries[j])
|
|
})
|
|
return summaries
|
|
}
|
|
|
|
func fileTransferSummarySortKey(summary fileTransferSummary) string {
|
|
return fileTransferMonitorKey(summary.Direction, summary.Scope, summary.FileID)
|
|
}
|
|
|
|
func groupFileTransferSummaries(src []fileTransferSummary) fileTransferSummaryGroup {
|
|
var group fileTransferSummaryGroup
|
|
for _, summary := range src {
|
|
switch summary.Direction {
|
|
case fileTransferDirectionReceive:
|
|
group.Receive = append(group.Receive, summary)
|
|
case fileTransferDirectionSend:
|
|
group.Send = append(group.Send, summary)
|
|
}
|
|
}
|
|
return group
|
|
}
|
|
|
|
func filterFileTransferSummaries(src []fileTransferSummary, keep func(fileTransferSummary) bool) []fileTransferSummary {
|
|
out := make([]fileTransferSummary, 0, len(src))
|
|
for _, summary := range src {
|
|
if !keep(summary) {
|
|
continue
|
|
}
|
|
out = append(out, summary)
|
|
}
|
|
return out
|
|
}
|
|
|
|
func fileTransferSummaryQueryMatch(summary fileTransferSummary, query fileTransferSummaryQuery) bool {
|
|
if query.Scope != "" && normalizeFileScope(summary.Scope) != normalizeFileScope(query.Scope) {
|
|
return false
|
|
}
|
|
if query.RuntimeScope != "" && normalizeFileScope(summary.RuntimeScope) != normalizeFileScope(query.RuntimeScope) {
|
|
return false
|
|
}
|
|
if query.MatchTransportGeneration && summary.TransportGeneration != query.TransportGeneration {
|
|
return false
|
|
}
|
|
return true
|
|
}
|