mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
transformed session delegate
This commit is contained in:
@@ -32,10 +32,11 @@ const (
|
||||
type Session struct {
|
||||
uuid, cstmId, subject, destination string
|
||||
startTime time.Time // destination: startTime
|
||||
sessionDelegate SessionDelegate
|
||||
stopDebit chan byte
|
||||
}
|
||||
|
||||
func NewSession(ev *Event) (s *Session) {
|
||||
func NewSession(ev *Event, ed SessionDelegate) (s *Session) {
|
||||
startTime, err := time.Parse(time.RFC1123, ev.Fields[START_TIME])
|
||||
if err != nil {
|
||||
log.Print("Error parsing answer event start time, using time.Now!")
|
||||
@@ -47,6 +48,7 @@ func NewSession(ev *Event) (s *Session) {
|
||||
destination: ev.Fields[DESTINATION],
|
||||
startTime: startTime,
|
||||
stopDebit: make(chan byte)}
|
||||
s.sessionDelegate = ed
|
||||
go s.StartDebitLoop()
|
||||
return
|
||||
}
|
||||
@@ -55,11 +57,10 @@ func (s *Session) StartDebitLoop() {
|
||||
for {
|
||||
select {
|
||||
case <-s.stopDebit:
|
||||
log.Print("Put back!")
|
||||
return
|
||||
default:
|
||||
}
|
||||
log.Print("Debit")
|
||||
s.sessionDelegate.LoopAction()
|
||||
time.Sleep(DEBIT_PERIOD)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ var (
|
||||
)
|
||||
|
||||
func TestSessionDurationSingle(t *testing.T) {
|
||||
s := NewSession(newEvent)
|
||||
s := NewSession(newEvent, new(DirectSessionDelegate))
|
||||
defer s.Close()
|
||||
twoSeconds, _ := time.ParseDuration("2s")
|
||||
if d := s.GetSessionDurationFrom(s.startTime.Add(twoSeconds)); d.Seconds() < 2 || d.Seconds() > 3 {
|
||||
@@ -61,7 +61,7 @@ func TestSessionDurationSingle(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestSessionCostSingle(t *testing.T) {
|
||||
s := NewSession(newEvent)
|
||||
s := NewSession(newEvent, new(DirectSessionDelegate))
|
||||
defer s.Close()
|
||||
twoSeconds, _ := time.ParseDuration("60s")
|
||||
if cc, err := s.GetSessionCostFrom(s.startTime.Add(twoSeconds)); err != nil {
|
||||
|
||||
@@ -22,22 +22,46 @@ import (
|
||||
"log"
|
||||
)
|
||||
|
||||
type EventDelegate interface {
|
||||
type SessionDelegate interface {
|
||||
OnHeartBeat(*Event)
|
||||
OnChannelAnswer(*Event, *Session)
|
||||
OnChannelHangupComplete(*Event, *Session)
|
||||
LoopAction()
|
||||
}
|
||||
|
||||
type DirectEventDelegate byte
|
||||
type DirectSessionDelegate byte
|
||||
|
||||
func (ded *DirectEventDelegate) OnHeartBeat(ev *Event) {
|
||||
func (dsd *DirectSessionDelegate) OnHeartBeat(ev *Event) {
|
||||
log.Print("direct hearbeat")
|
||||
}
|
||||
|
||||
func (ded *DirectEventDelegate) OnChannelAnswer(ev *Event, s *Session) {
|
||||
func (dsd *DirectSessionDelegate) OnChannelAnswer(ev *Event, s *Session) {
|
||||
log.Print("direct answer")
|
||||
}
|
||||
|
||||
func (ded *DirectEventDelegate) OnChannelHangupComplete(ev *Event, s *Session) {
|
||||
func (dsd *DirectSessionDelegate) OnChannelHangupComplete(ev *Event, s *Session) {
|
||||
log.Print("direct hangup")
|
||||
}
|
||||
|
||||
func (dsd *DirectSessionDelegate) LoopAction() {
|
||||
log.Print("Direct debit")
|
||||
}
|
||||
|
||||
//
|
||||
type RPCSessionDelegate byte
|
||||
|
||||
func (rsd *RPCSessionDelegate) OnHeartBeat(ev *Event) {
|
||||
log.Print("rpc hearbeat")
|
||||
}
|
||||
|
||||
func (rsd *RPCSessionDelegate) OnChannelAnswer(ev *Event, s *Session) {
|
||||
log.Print("rpc answer")
|
||||
}
|
||||
|
||||
func (rsd *RPCSessionDelegate) OnChannelHangupComplete(ev *Event, s *Session) {
|
||||
log.Print("rpc hangup")
|
||||
}
|
||||
|
||||
func (rsd *RPCSessionDelegate) LoopAction() {
|
||||
log.Print("Rpc debit")
|
||||
}
|
||||
@@ -31,9 +31,9 @@ var (
|
||||
)
|
||||
|
||||
type SessionManager struct {
|
||||
buf *bufio.Reader
|
||||
sessions []*Session
|
||||
eventDelegate EventDelegate
|
||||
buf *bufio.Reader
|
||||
sessions []*Session
|
||||
sessionDelegate SessionDelegate
|
||||
}
|
||||
|
||||
func (sm *SessionManager) Connect(address, pass string) {
|
||||
@@ -46,8 +46,8 @@ func (sm *SessionManager) Connect(address, pass string) {
|
||||
fmt.Fprint(conn, "event json all\n\n")
|
||||
}
|
||||
|
||||
func (sm *SessionManager) AddEventDelegate(ed EventDelegate) {
|
||||
sm.eventDelegate = ed
|
||||
func (sm *SessionManager) SetSessionDelegate(ed SessionDelegate) {
|
||||
sm.sessionDelegate = ed
|
||||
}
|
||||
|
||||
func (sm *SessionManager) ReadNextEvent() (ev *Event) {
|
||||
@@ -79,17 +79,17 @@ func (sm *SessionManager) GetSession(uuid string) *Session {
|
||||
}
|
||||
|
||||
func (sm *SessionManager) OnHeartBeat(ev *Event) {
|
||||
if sm.eventDelegate != nil {
|
||||
sm.eventDelegate.OnHeartBeat(ev)
|
||||
if sm.sessionDelegate != nil {
|
||||
sm.sessionDelegate.OnHeartBeat(ev)
|
||||
} else {
|
||||
log.Print("heartbeat")
|
||||
}
|
||||
}
|
||||
|
||||
func (sm *SessionManager) OnChannelAnswer(ev *Event) {
|
||||
s := NewSession(ev)
|
||||
if sm.eventDelegate != nil {
|
||||
sm.eventDelegate.OnChannelAnswer(ev, s)
|
||||
if sm.sessionDelegate != nil {
|
||||
s := NewSession(ev, sm.sessionDelegate)
|
||||
sm.sessionDelegate.OnChannelAnswer(ev, s)
|
||||
} else {
|
||||
log.Print("answer")
|
||||
}
|
||||
@@ -97,8 +97,8 @@ func (sm *SessionManager) OnChannelAnswer(ev *Event) {
|
||||
|
||||
func (sm *SessionManager) OnChannelHangupComplete(ev *Event) {
|
||||
s := sm.GetSession(ev.Fields[UUID])
|
||||
if sm.eventDelegate != nil {
|
||||
sm.eventDelegate.OnChannelHangupComplete(ev, s)
|
||||
if sm.sessionDelegate != nil {
|
||||
sm.sessionDelegate.OnChannelHangupComplete(ev, s)
|
||||
} else {
|
||||
log.Print("HangupComplete")
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ import (
|
||||
func TestConnect(t *testing.T) {
|
||||
sm := &SessionManager{}
|
||||
sm.Connect("localhost:8021", "ClueCon")
|
||||
sm.AddEventDelegate(new(DirectEventDelegate))
|
||||
sm.SetSessionDelegate(new(DirectSessionDelegate))
|
||||
//for {
|
||||
ev := sm.ReadNextEvent()
|
||||
if ev == nil {
|
||||
|
||||
Reference in New Issue
Block a user