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/httpflv/server_sub_session.go

139 lines
4.2 KiB
Go

// 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 httpflv
import (
"net"
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/connection"
)
var flvHttpResponseHeader []byte
type SubSession struct {
core *base.HttpSubSession
IsFresh bool
ShouldWaitVideoKeyFrame bool
}
func NewSubSession(conn net.Conn, urlCtx base.UrlContext, isWebSocket bool, websocketKey string) *SubSession {
uk := base.GenUkFlvSubSession()
s := &SubSession{
core: base.NewHttpSubSession(base.HttpSubSessionOption{
Conn: conn,
ConnModOption: func(option *connection.Option) {
option.WriteChanSize = SubSessionWriteChanSize
option.WriteTimeoutMs = SubSessionWriteTimeoutMs
},
SessionType: base.SessionTypeFlvSub,
UrlCtx: urlCtx,
IsWebSocket: isWebSocket,
WebSocketKey: websocketKey,
}),
IsFresh: true,
ShouldWaitVideoKeyFrame: true,
}
Log.Infof("[%s] lifecycle new httpflv SubSession. session=%p, remote addr=%s", uk, s, conn.RemoteAddr().String())
return s
}
// ---------------------------------------------------------------------------------------------------------------------
// IServerSessionLifecycle interface
// ---------------------------------------------------------------------------------------------------------------------
func (session *SubSession) RunLoop() error {
return session.core.RunLoop()
}
func (session *SubSession) Dispose() error {
Log.Infof("[%s] lifecycle dispose httpflv SubSession.", session.core.UniqueKey())
return session.core.Dispose()
}
// ---------------------------------------------------------------------------------------------------------------------
func (session *SubSession) WriteHttpResponseHeader() {
Log.Debugf("[%s] > W http response header.", session.core.UniqueKey())
session.core.WriteHttpResponseHeader(flvHttpResponseHeader)
}
func (session *SubSession) WriteFlvHeader() {
Log.Debugf("[%s] > W http flv header.", session.core.UniqueKey())
session.core.Write(FlvHeader)
}
func (session *SubSession) WriteTag(tag *Tag) {
session.core.Write(tag.Raw)
}
func (session *SubSession) Write(b []byte) {
session.core.Write(b)
}
// ---------------------------------------------------------------------------------------------------------------------
// IObject interface
// ---------------------------------------------------------------------------------------------------------------------
func (session *SubSession) UniqueKey() string {
return session.core.UniqueKey()
}
// ---------------------------------------------------------------------------------------------------------------------
// ISessionUrlContext interface
// ---------------------------------------------------------------------------------------------------------------------
func (session *SubSession) Url() string {
return session.core.Url()
}
func (session *SubSession) AppName() string {
return session.core.AppName()
}
func (session *SubSession) StreamName() string {
return session.core.StreamName()
}
func (session *SubSession) RawQuery() string {
return session.core.RawQuery()
}
// ----- ISessionStat --------------------------------------------------------------------------------------------------
func (session *SubSession) UpdateStat(intervalSec uint32) {
session.core.UpdateStat(intervalSec)
}
func (session *SubSession) GetStat() base.StatSession {
return session.core.GetStat()
}
func (session *SubSession) IsAlive() (readAlive, writeAlive bool) {
return session.core.IsAlive()
}
// ---------------------------------------------------------------------------------------------------------------------
func init() {
flvHttpResponseHeaderStr := "HTTP/1.1 200 OK\r\n" +
"Server: " + base.LalHttpflvSubSessionServer + "\r\n" +
"Cache-Control: no-cache\r\n" +
"Content-Type: video/x-flv\r\n" +
"Connection: close\r\n" +
"Expires: -1\r\n" +
"Pragma: no-cache\r\n" +
"Access-Control-Allow-Credentials: true\r\n" +
"Access-Control-Allow-Origin: *\r\n" +
"\r\n"
flvHttpResponseHeader = []byte(flvHttpResponseHeaderStr)
}