75 lines
1.6 KiB
Go
75 lines
1.6 KiB
Go
package core
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
type Room struct {
|
|
ID string
|
|
Sessions map[string]*StreamSession
|
|
CallerConn *websocket.Conn
|
|
}
|
|
|
|
type StreamSession struct {
|
|
ID string
|
|
Offer string
|
|
Answer string
|
|
CallerIceCandidates []string
|
|
CalleeIceCandidates []string
|
|
CallerConn *websocket.Conn
|
|
CalleeConn *websocket.Conn
|
|
}
|
|
|
|
var roomMap = make(map[string]*Room)
|
|
|
|
func GetRoom(id string) *Room {
|
|
return roomMap[id]
|
|
}
|
|
|
|
func NewRoom(callerConn *websocket.Conn) *Room {
|
|
room := Room{
|
|
ID: newRoomID(),
|
|
Sessions: make(map[string]*StreamSession),
|
|
CallerConn: callerConn,
|
|
}
|
|
roomMap[room.ID] = &room
|
|
return &room
|
|
}
|
|
|
|
func newRoomID() string {
|
|
id := GetRandomName(0)
|
|
for GetRoom(id) != nil {
|
|
id = GetRandomName(0)
|
|
}
|
|
return id
|
|
}
|
|
|
|
func RemoveRoom(id string) {
|
|
roomMap[id] = nil
|
|
}
|
|
|
|
func (room *Room) GetSession(id string) *StreamSession {
|
|
return room.Sessions[id]
|
|
}
|
|
|
|
func (room *Room) NewSession(calleeConn *websocket.Conn) *StreamSession {
|
|
session := StreamSession{
|
|
ID: room.newSessionID(),
|
|
CallerIceCandidates: []string{},
|
|
CalleeIceCandidates: []string{},
|
|
CallerConn: room.CallerConn,
|
|
CalleeConn: calleeConn,
|
|
}
|
|
room.Sessions[session.ID] = &session
|
|
return &session
|
|
}
|
|
|
|
func (room *Room) newSessionID() string {
|
|
id := fmt.Sprintf("%s$%s", room.ID, GetRandomName(0))
|
|
for GetRoom(id) != nil {
|
|
id = fmt.Sprintf("%s$%s", room.ID, GetRandomName(0))
|
|
}
|
|
return id
|
|
}
|