func (api *channellingAPI) HandleSessions(session *channelling.Session, sessions *channelling.DataSessionsRequest) (*channelling.DataSessions, error) { switch sessions.Type { case "contact": if !api.config.WithModule("contacts") { return nil, channelling.NewDataError("contacts_not_enabled", "incoming contacts session request with contacts disabled") } userID, err := api.ContactManager.GetContactID(session, sessions.Token) if err != nil { return nil, err } return &channelling.DataSessions{ Type: "Sessions", Users: api.SessionManager.GetUserSessions(session, userID), Sessions: sessions, }, nil case "session": id, err := session.DecodeAttestation(sessions.Token) if err != nil { return nil, channelling.NewDataError("bad_attestation", err.Error()) } session, ok := api.Unicaster.GetSession(id) if !ok { return nil, channelling.NewDataError("no_such_session", "cannot retrieve session") } return &channelling.DataSessions{ Type: "Sessions", Users: []*channelling.DataSession{session.Data()}, Sessions: sessions, }, nil default: return nil, channelling.NewDataError("bad_request", "unknown sessions request type") } }
func (api *channellingAPI) HandleUsers(session *channelling.Session) (sessions *channelling.DataSessions, err error) { if session.Hello { sessions = &channelling.DataSessions{Type: "Users", Users: api.RoomStatusManager.RoomUsers(session)} } else { err = channelling.NewDataError("not_in_room", "Cannot list users without a current room") } return }
func (api *channellingAPI) OnIncoming(sender channelling.Sender, session *channelling.Session, msg *channelling.DataIncoming) (interface{}, error) { var pipeline *channelling.Pipeline switch msg.Type { case "Self": return api.HandleSelf(session) case "Hello": if msg.Hello == nil { return nil, channelling.NewDataError("bad_request", "message did not contain Hello") } return api.HandleHello(session, msg.Hello, sender) case "Offer": if msg.Offer == nil || msg.Offer.Offer == nil { log.Println("Received invalid offer message.", msg) break } if _, ok := msg.Offer.Offer["_token"]; !ok { pipeline = api.PipelineManager.GetPipeline(channelling.PipelineNamespaceCall, sender, session, msg.Offer.To) // Trigger offer event when offer has no token, so this is // not triggered for peerxfer and peerscreenshare offers. api.BusManager.Trigger(channelling.BusManagerOffer, session.Id, msg.Offer.To, nil, pipeline) } session.Unicast(msg.Offer.To, msg.Offer, pipeline) case "Candidate": if msg.Candidate == nil || msg.Candidate.Candidate == nil { log.Println("Received invalid candidate message.", msg) break } pipeline = api.PipelineManager.GetPipeline(channelling.PipelineNamespaceCall, sender, session, msg.Candidate.To) session.Unicast(msg.Candidate.To, msg.Candidate, pipeline) case "Answer": if msg.Answer == nil || msg.Answer.Answer == nil { log.Println("Received invalid answer message.", msg) break } if _, ok := msg.Answer.Answer["_token"]; !ok { pipeline = api.PipelineManager.GetPipeline(channelling.PipelineNamespaceCall, sender, session, msg.Answer.To) // Trigger answer event when answer has no token. so this is // not triggered for peerxfer and peerscreenshare answers. api.BusManager.Trigger(channelling.BusManagerAnswer, session.Id, msg.Answer.To, nil, pipeline) } session.Unicast(msg.Answer.To, msg.Answer, pipeline) case "Users": return api.HandleUsers(session) case "Authentication": if msg.Authentication == nil || msg.Authentication.Authentication == nil { return nil, channelling.NewDataError("bad_request", "message did not contain Authentication") } return api.HandleAuthentication(session, msg.Authentication.Authentication) case "Bye": if msg.Bye == nil { log.Println("Received invalid bye message.", msg) break } pipeline = api.PipelineManager.GetPipeline(channelling.PipelineNamespaceCall, sender, session, msg.Bye.To) api.BusManager.Trigger(channelling.BusManagerBye, session.Id, msg.Bye.To, nil, pipeline) session.Unicast(msg.Bye.To, msg.Bye, pipeline) if pipeline != nil { pipeline.Close() } case "Status": if msg.Status == nil { log.Println("Received invalid status message.", msg) break } //log.Println("Status", msg.Status) session.Update(&channelling.SessionUpdate{Types: []string{"Status"}, Status: msg.Status.Status}) session.BroadcastStatus() case "Chat": if msg.Chat == nil || msg.Chat.Chat == nil { log.Println("Received invalid chat message.", msg) break } api.HandleChat(session, msg.Chat) case "Conference": if msg.Conference == nil { log.Println("Received invalid conference message.", msg) break } api.HandleConference(session, msg.Conference) case "Alive": return msg.Alive, nil case "Sessions": if msg.Sessions == nil || msg.Sessions.Sessions == nil { return nil, channelling.NewDataError("bad_request", "message did not contain Sessions") } return api.HandleSessions(session, msg.Sessions.Sessions) case "Room": if msg.Room == nil { return nil, channelling.NewDataError("bad_request", "message did not contain Room") } return api.HandleRoom(session, msg.Room) case "Leave": if err := api.HandleLeave(session); err != nil { return nil, err } return nil, nil default: log.Println("OnText unhandled message type", msg.Type) } return nil, nil }