
Product
Introducing Supply Chain Attack Campaigns Tracking in the Socket Dashboard
Campaign-level threat intelligence in Socket now shows when active supply chain attacks affect your repositories and packages.
该项目为m7s的引擎部分,该部分逻辑是流媒体服务器的核心转发逻辑。包含了一个插件的引入机制,其他功能均由插件实现
/api/stream?streamPath=xxx/api/closestream?streamPath=xxx/api/sysInfo 返回值{Version:xxx,StartTime:xxx,IP:[xxx.xxx.xxx.xxx]}/api/summary 返回值Summary数据/api/plugins 返回值Plugin数据/api/replay/mp4?streamPath=xxx&dump=filepath filepath是文件路径/api/replay/ts?streamPath=xxx&dump=filepath filepath是文件路径/api/getconfig?name=xxx 返回xxx插件的配置信息,如果不带参数或参数为空则返回全局配置/api/modifyconfig?name=xxx&yaml=1 修改xxx插件的配置信息,在请求的body中传入修改后的配置yaml字符串/api/updateconfig?name=xxx 热更新xxx插件的配置信息,如果不带参数或参数为空则热更新全局配置/api/list/pull 返回{RemoteURL:"",StreamPath:"",Type:"",StartTime:""}/api/list/push 返回{RemoteURL:"",StreamPath:"",Type:"",StartTime:""}/api/stop/push?url=xxx 停止向xxx推流 ,成功返回ok/api/stop/subscribe?streamPath=xxx&id=xxx 停止xxx流的xxx订阅者 ,成功返回okglobal:
disableall: false # 是否禁用所有插件
loglang: zh # 日志语言,可选值:zh,en
loglevel: info # 日志级别,可选值:debug,info,warn,error,panic,fatal
http:
listenaddr: :8080 # 网关地址,用于访问API
listenaddrtls: :8443 # 用于HTTPS方式访问API的端口配置
certfile: ""
keyfile: ""
cors: true # 是否自动添加cors头
username: "" # 用户名和密码,用于API访问时的基本身份认证
password: ""
readtimeout: 0 # 读取超时时间,0为不限制
writetimeout: 0 # 写入超时时间,0为不限制
idletimeout: 0 # 空闲超时时间,0为不限制
publish:
pubaudio: true # 是否发布音频流
pubvideo: true # 是否发布视频流
kickexist: false # 剔出已经存在的发布者,用于顶替原有发布者
publishtimeout: 10s # 发布流默认过期时间,超过该时间发布者没有恢复流将被删除
delayclosetimeout: 0 # 自动关闭触发后延迟的时间(期间内如果有新的订阅则取消触发关闭),0为关闭该功能,保持连接。
waitclosetimeout: 0 # 发布者断开后等待时间,超过该时间发布者没有恢复流将被删除,0为关闭该功能,由订阅者决定是否删除
buffertime: 0 # 缓存时间,用于时光回溯,0为关闭缓存
idletimeout: 0 # 空闲超时时间,0为不限制
speedlimit: 500ms # 限速超时时间 0为不限速,对于读取文件这类流需要限速,否则读取过快(如果流的时间戳不正确,则只能关闭该功能:设置为0)
key: # 发布鉴权key
secretargname: secret # 发布鉴权参数名
expireargname: expire # 发布鉴权失效时间参数名
subscribe:
subaudio: true # 是否订阅音频流
subvideo: true # 是否订阅视频流
subaudioargname: ats # 订阅音频轨道参数名
subvideoargname: vts # 订阅视频轨道参数名
subdataargname: dts # 订阅数据轨道参数名
subaudiotracks: [] # 订阅音频轨道名称列表
subvideotracks: [] # 订阅视频轨道名称列表
submode: 0 # 订阅模式,0为跳帧追赶模式,1为不追赶(多用于录制),2为时光回溯模式
syncmode: 0 # 音视频同步模式,0按照时间戳同步,1按照写入时间同步(在时间戳不正确的时候)
iframeonly: false # 只订阅关键帧
waittimeout: 10s # 等待发布者的超时时间,用于订阅尚未发布的流
writebuffersize: 0 # 订阅者写缓存大小,用于减少io次数,但可能影响实时性
key: # 订阅鉴权key
secretargname: secret # 订阅鉴权参数名
expireargname: expire # 订阅鉴权失效时间参数名
internal: false # 是否内部订阅,内部订阅不会触发发布者自动断开功能
enableavcc : true # 启用AVCC格式缓存,用于rtmp协议
enablertp : true # 启用rtp格式缓存,用于rtsp、websocket、gb28181协议
enableauth: true # 启用鉴权,详细查看鉴权机制
enablesubevent: true # 启用订阅事件,用于订阅者上下线事件,关闭可以提高性能
rtpreoderbufferlen: 50 # rtp乱序重排缓存长度
eventbussize: 10 # 事件总线缓存大小,事件较多时容易堵阻塞线程,需要增大缓存
poolsize: 0 # 内存池大小,0为不使用内存池
pulseinterval: 5s # 心跳事件间隔时间
console:
server : console.monibuca.com:44944 # 连接远程控制台的地址
secret: "" # 远程控制台的秘钥
publicaddr: "" # 实例公网地址,提供远程控制台访问的地址,不配置的话使用自动识别的地址
publicaddrtls: "" # 实例公网地址,提供远程控制台访问的地址,不配置的话使用自动识别的地址(https)
stateDiagram-v2
[*] --> ⌛等待发布者 : 创建
⌛等待发布者 --> 🟢正在发布 :发布
⌛等待发布者 --> 🔴已关闭 :关闭
⌛等待发布者 --> 🔴已关闭 :超时
⌛等待发布者 --> 🔴已关闭 :最后订阅者离开
🟢正在发布 --> ⌛等待发布者: 发布者断开
🟢正在发布 --> 🟡等待关闭: 最后订阅者离开
🟢正在发布 --> 🔴已关闭 :关闭
🟡等待关闭 --> 🟢正在发布 :第一个订阅者进入
🟡等待关闭 --> 🔴已关闭 :关闭
🟡等待关闭 --> 🔴已关闭 :超时
🟡等待关闭 --> 🔴已关闭 :发布者断开
在publish 和 subscribe 中配置 key 引擎会自动进行鉴权, 推流或者拉流时需要在url中添加参数 secret=xxx&expire=xxx。
设置时间:2018.12.01 08:30:00
十进制 UNIX 时间戳:1543624200
十六进制 UNIX 时间戳:5C01D608(云直播鉴权配置使用十六进制 UNIX 时间戳,十六进制不区分字母大小写)
secret = MD5(key+StreamPath+expire)
secret = MD5(ngoeiq03+test/01+5C01D608)
secret = MD5(ngoeiq03test/015C01D608)
secret = ce797dc6238156d548ef945e6ad1ea20
如果需要自定义鉴权,可以在插件中实现鉴权接口, 引擎中定义如下两个接口,插件中的发布者或者订阅者可以实现这两个接口,引擎会在发布或者订阅时调用这两个接口进行鉴权
type AuthSub interface {
OnAuth(*util.Promise[ISubscriber]) error
}
type AuthPub interface {
OnAuth(*util.Promise[IPublisher]) error
}
自定义鉴权也可以全局生效, 引擎中定义如下两个全局函数的变量,插件中可以对这两个变量进行赋值,引擎会在发布或者订阅时调用这两个接口进行鉴权
var OnAuthSub func(p *util.Promise[ISubscriber]) error
var OnAuthPub func(p *util.Promise[IPublisher]) error
** 注意:如果单独鉴权和全局鉴权同时存在,优先使用单独鉴权 ** ** 全局鉴权函数可以被多次覆盖,所以需要自己实现鉴权逻辑的合并 **
在HTTPConfig接口中增加了AddMiddleware方法,可以通过该方法添加中间件,中间件的定义如下
type Middleware func(string, http.Handler) http.Handler
type HTTPConfig interface {
GetHTTPConfig() *HTTP
Listen(ctx context.Context) error
Handle(string, http.Handler)
AddMiddleware(Middleware)
}
中间件的添加必须在FirstConfig之前,也就是在Listen之前 例如:
type MyMiddlewareConfig struct {
config.HTTP
}
var myMiddlewareConfig = &MyMiddlewareConfig{}
func init(){
myMiddlewareConfig.AddMiddleware(func(pattern string, handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// do something
handler.ServeHTTP(w, r)
})
})
}
FAQs
Unknown package
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Campaign-level threat intelligence in Socket now shows when active supply chain attacks affect your repositories and packages.

Research
Malicious PyPI package sympy-dev targets SymPy users, a Python symbolic math library with 85 million monthly downloads.

Security News
Node.js 25.4.0 makes require(esm) stable, formalizing CommonJS and ESM compatibility across supported Node versions.