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/logic.go

129 lines
4.6 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// Copyright 2019, 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
import (
"github.com/q191201771/lal/pkg/base"
"path/filepath"
)
// ---------------------------------------------------------------------------------------------------------------------
type ILalServer interface {
RunLoop() error
Dispose()
// AddCustomizePubSession 定制化增强功能。业务方可以将自己的流输入到 ILalServer 中
//
// @example 示例见 lal/app/demo/customize_lalserver
//
// @doc 文档见 <lalserver二次开发 - pub接入自定义流> https://pengrl.com/lal/#/customize_pub
//
AddCustomizePubSession(streamName string) (ICustomizePubSessionContext, error)
// DelCustomizePubSession 将 ICustomizePubSessionContext 从 ILalServer 中删除
//
DelCustomizePubSession(ICustomizePubSessionContext)
// StatLalInfo StatAllGroup StatGroup CtrlStartPull CtrlKickOutSession
//
// 一些获取状态、发送控制命令的API。
// 目的是方便业务方在不修改logic包内代码的前提下在外层实现一些特定逻辑的定制化开发。
//
StatLalInfo() base.LalInfo
StatAllGroup() (sgs []base.StatGroup)
StatGroup(streamName string) *base.StatGroup
CtrlStartRelayPull(info base.ApiCtrlStartRelayPullReq) base.ApiCtrlStartRelayPull
CtrlStopRelayPull(streamName string) base.ApiCtrlStopRelayPull
CtrlKickSession(info base.ApiCtrlKickSessionReq) base.HttpResponseBasic
}
// NewLalServer 创建一个lal server
//
// @param modOption: 定制化配置。可变参数,如果不关心,可以不填,具体字段见 Option
//
func NewLalServer(modOption ...ModOption) ILalServer {
return NewServerManager(modOption...)
}
// ---------------------------------------------------------------------------------------------------------------------
type ICustomizePubSessionContext interface {
// IAvPacketStream 传入音视频数据相关的接口。详细说明见 base.IAvPacketStream
//
base.IAvPacketStream
UniqueKey() string
StreamName() string
}
// ---------------------------------------------------------------------------------------------------------------------
// INotifyHandler 事件通知接口
//
type INotifyHandler interface {
OnServerStart(info base.LalInfo)
OnUpdate(info base.UpdateInfo)
OnPubStart(info base.PubStartInfo)
OnPubStop(info base.PubStopInfo)
OnSubStart(info base.SubStartInfo)
OnSubStop(info base.SubStopInfo)
OnRelayPullStart(info base.PullStartInfo)
OnRelayPullStop(info base.PullStopInfo)
OnRtmpConnect(info base.RtmpConnectInfo)
OnHlsMakeTs(info base.HlsMakeTsInfo)
}
type Option struct {
// ConfFilename 配置文件,注意,如果为空,内部会尝试从 DefaultConfFilenameList 读取默认配置文件
//
ConfFilename string
// NotifyHandler
//
// 事件监听
// 业务方可实现 INotifyHandler 接口并传入从而获取到对应的事件通知。
// 如果不填写保持默认值nil内部默认走http notify的逻辑当然还需要在配置文件中开启http notify功能
// 注意如果业务方实现了自己的事件监听则lal server内部不再走http notify的逻辑也即二选一
//
NotifyHandler INotifyHandler
// TODO(chef): [refactor] 考虑用INotifyHandler实现ModConfigGroupCreator和IAuthentication 202209
// ModConfigGroupCreator
// This func help us modify the group configuration base on appName or streamName
// so that group can have it own configuration (configuration can be in other source like db)
// It will help us reduce resource usage if we just want some specific group record flv or hls...
ModConfigGroupCreator ModConfigGroupCreator
// Authentication
// This interface make authenticate customizable so that we can implement any authenticate strategy like jwt...
Authentication IAuthentication
}
var defaultOption = Option{
NotifyHandler: nil, // 注意为nil时内部会赋值为 HttpNotify
}
type ModOption func(option *Option)
// DefaultConfFilenameList 没有指定配置文件时,按顺序作为优先级,找到第一个存在的并使用
//
var DefaultConfFilenameList = []string{
filepath.FromSlash("lalserver.conf.json"),
filepath.FromSlash("./conf/lalserver.conf.json"),
filepath.FromSlash("../lalserver.conf.json"),
filepath.FromSlash("../conf/lalserver.conf.json"),
filepath.FromSlash("../../lalserver.conf.json"),
filepath.FromSlash("../../conf/lalserver.conf.json"),
filepath.FromSlash("../../../lalserver.conf.json"),
filepath.FromSlash("../../../conf/lalserver.conf.json"),
filepath.FromSlash("lal/conf/lalserver.conf.json"),
}