You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/pkg/logic/group_manager.go

176 lines
5.2 KiB
Go

// Copyright 2021, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package logic
// TODO
// - 现有逻辑重构至当前模块中【DONE】
// - server_manger接入当前模块替换掉原来的map【DONE】
// - 重构整理使用server_manager的地方【DONE】
// - 实现appName逻辑的IGroupManager
// - 配置文件或var.go中增加选取具体IGroupManager实现的开关
// - 去除配置文件中一部分的url_pattern
// - 更新相应的文档本文件注释server_manager等中原有关于appName的注释配置文件文档流地址列表文档
// - 其他
// - 前面没有appname后面又有了可以更新一次
// ---------------------------------------------------------------------------------------------------------------------
// OnIterateGroup
//
// @return 如果返回false则删除这个元素
//
type OnIterateGroup func(appName string, streamName string, group *Group) bool
// IGroupManager
//
// 封装管理Group的容器
// 管理流标识appNamestreamName与Group的映射关系
//
type IGroupManager interface {
// GetOrCreateGroup
//
// @param appName 如果没有,可以为""
//
// @return createFlag 如果为false表示group之前就存在如果为true表示为当前新创建
//
GetOrCreateGroup(appName string, streamName string) (group *Group, createFlag bool)
// GetGroup
//
// @return 如果不存在则返回nil
//
GetGroup(appName string, streamName string) *Group
Iterate(onIterateGroup OnIterateGroup)
Len() int
}
// SimpleGroupManager 忽略appName只使用streamName
//
type SimpleGroupManager struct {
groups map[string]*Group // streamName -> Group
}
func NewSimpleGroupManager() *SimpleGroupManager {
return &SimpleGroupManager{
groups: make(map[string]*Group),
}
}
func (s *SimpleGroupManager) GetOrCreateGroup(appName string, streamName string) (group *Group, createFlag bool) {
g, ok := s.groups[streamName]
if !ok {
g = NewGroup(appName, streamName)
s.groups[streamName] = g
return g, true
}
return g, false
}
func (s *SimpleGroupManager) GetGroup(appName string, streamName string) *Group {
g, ok := s.groups[streamName]
if !ok {
return nil
}
return g
}
func (s *SimpleGroupManager) Iterate(onIterateGroup OnIterateGroup) {
for streamName, group := range s.groups {
if !onIterateGroup("", streamName, group) {
delete(s.groups, streamName)
}
}
}
func (s *SimpleGroupManager) Len() int {
return len(s.groups)
}
// ComplexGroupManager
//
// 背景:
// 有的协议需要结合appName和streamName作为流唯一标识比如rtmphttpflvhttpts
// 有的协议不需要appName只使用streamName作为流唯一标识比如rtsp
// 目标:
// 有appName的协议需要参考appName
// 没appName的协议需要和有appName的协议互通
// 注意:
// 当以上两种类型的协议混用时系统使用者应避免第二种协议的streamName在第一种协议中存在相同的streamName但是appName不止一个
// 这种情况下,内部无法知道该如何对应
// 实现:
// group可能由第一种协议创建也可能由第二种协议创建
//type GroupManager struct {
// // 注意一个group只可能在一个容器中
// onlyStreamNameGroups map[string]*Group // streamName -> Group注意并不是全量有appname的group有可能在另外一个容器中
// appNameStreamNameGroups map[string]map[string]*Group // appName -> streamName -> Group
//}
//
//func NewGroupManager() *GroupManager {
// return &GroupManager{
// onlyStreamNameGroups: make(map[string]*Group),
// appNameStreamNameGroups:make(map[string]map[string]*Group),
// }
//}
//
//func (gm *GroupManager) GetOrCreateGroup(appName string, streamName string) *Group {
// if appName == "" {
// group, exist := gm.onlyStreamNameGroups[streamName]
// if exist {
// return group
// }
// // 虽然没有appName也有可能在appNameStreamNameGroups中
// //
// // 注意此时有可能不同appName的容器里都有对应这个streamName的group但是程序已没法区分系统使用者应规范流名称避免出现这种问题
// for _, m := range gm.appNameStreamNameGroups {
// group, exist := m[streamName]
// if exist {
// return group
// }
// }
// // 两个容器都没找到
// group = NewGroup(appName, streamName)
// gm.onlyStreamNameGroups[streamName] = group
// return group
// } else { // appName存在
// m, exist := gm.appNameStreamNameGroups[appName]
// if exist {
// group, exist := m[streamName]
// if exist {
// return group
// }
// // 在到了appName对应的容器但是没有streamName对应的group
// group = NewGroup(appName, streamName)
// m[streamName] = group
// return group
// }
// // 虽然有appName也有可能在onlyStreamNameGroups中我们尝试一下
// group, exist := gm.onlyStreamNameGroups[streamName]
// if exist {
// return group
// }
//
// }
//
// return nil
//}
//
//func (gm *GroupManager) GetGroup(appName string, streamName string) *Group {
// return nil
//}
//
//func (gm *GroupManager) Iterate() {
// panic(0)
//}
//
//func (gm *GroupManager) Delete() {
// panic(0)
//}