Add content structs for VoIP events

This commit is contained in:
Tulir Asokan 2021-04-19 17:24:35 +03:00
commit ba8ea0c90b
3 changed files with 152 additions and 0 deletions

View file

@ -67,6 +67,14 @@ var TypeMap = map[Type]reflect.Type{
ToDeviceVerificationRequest: reflect.TypeOf(VerificationRequestEventContent{}),
ToDeviceOrgMatrixRoomKeyWithheld: reflect.TypeOf(RoomKeyWithheldEventContent{}),
CallInvite: reflect.TypeOf(CallInviteEventContent{}),
CallCandidates: reflect.TypeOf(CallCandidatesEventContent{}),
CallAnswer: reflect.TypeOf(CallAnswerEventContent{}),
CallReject: reflect.TypeOf(CallRejectEventContent{}),
CallSelectAnswer: reflect.TypeOf(CallSelectAnswerEventContent{}),
CallNegotiate: reflect.TypeOf(CallNegotiateEventContent{}),
CallHangup: reflect.TypeOf(CallHangupEventContent{}),
}
// Content stores the content of a Matrix event.
@ -398,3 +406,52 @@ func (content *Content) AsRoomKeyWithheld() *RoomKeyWithheldEventContent {
}
return casted
}
func (content *Content) AsCallInvite() *CallInviteEventContent {
casted, ok := content.Parsed.(*CallInviteEventContent)
if !ok {
return &CallInviteEventContent{}
}
return casted
}
func (content *Content) AsCallCandidates() *CallCandidatesEventContent {
casted, ok := content.Parsed.(*CallCandidatesEventContent)
if !ok {
return &CallCandidatesEventContent{}
}
return casted
}
func (content *Content) AsCallAnswer() *CallAnswerEventContent {
casted, ok := content.Parsed.(*CallAnswerEventContent)
if !ok {
return &CallAnswerEventContent{}
}
return casted
}
func (content *Content) AsCallReject() *CallRejectEventContent {
casted, ok := content.Parsed.(*CallRejectEventContent)
if !ok {
return &CallRejectEventContent{}
}
return casted
}
func (content *Content) AsCallSelectAnswer() *CallSelectAnswerEventContent {
casted, ok := content.Parsed.(*CallSelectAnswerEventContent)
if !ok {
return &CallSelectAnswerEventContent{}
}
return casted
}
func (content *Content) AsCallNegotiate() *CallNegotiateEventContent {
casted, ok := content.Parsed.(*CallNegotiateEventContent)
if !ok {
return &CallNegotiateEventContent{}
}
return casted
}
func (content *Content) AsCallHangup() *CallHangupEventContent {
casted, ok := content.Parsed.(*CallHangupEventContent)
if !ok {
return &CallHangupEventContent{}
}
return casted
}

View file

@ -83,6 +83,16 @@ func (et *Type) IsInRoomVerification() bool {
}
}
func (et *Type) IsCall() bool {
switch et.Type {
case CallInvite.Type, CallCandidates.Type, CallAnswer.Type, CallReject.Type, CallSelectAnswer.Type,
CallNegotiate.Type, CallHangup.Type:
return true
default:
return false
}
}
func (et *Type) IsCustom() bool {
return !strings.HasPrefix(et.Type, "m.")
}
@ -173,6 +183,14 @@ var (
InRoomVerificationKey = Type{"m.key.verification.key", MessageEventType}
InRoomVerificationMAC = Type{"m.key.verification.mac", MessageEventType}
InRoomVerificationCancel = Type{"m.key.verification.cancel", MessageEventType}
CallInvite = Type{"m.call.invite", MessageEventType}
CallCandidates = Type{"m.call.candidates", MessageEventType}
CallAnswer = Type{"m.call.answer", MessageEventType}
CallReject = Type{"m.call.reject", MessageEventType}
CallSelectAnswer = Type{"m.call.select_answer", MessageEventType}
CallNegotiate = Type{"m.call.negotiate", MessageEventType}
CallHangup = Type{"m.call.hangup", MessageEventType}
)
// Ephemeral events

77
event/voip.go Normal file
View file

@ -0,0 +1,77 @@
// Copyright (c) 2021 Tulir Asokan
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package event
type CallHangupReason string
const (
CallHangupICEFailed CallHangupReason = "ice_failed"
CallHangupInviteTimeout CallHangupReason = "invite_timeout"
CallHangupUserHangup CallHangupReason = "user_hangup"
CallHangupUserMediaFailed CallHangupReason = "user_media_failed"
CallHangupUnknownError CallHangupReason = "unknown_error"
)
type CallDataType string
const (
CallDataTypeOffer CallDataType = "offer"
CallDataTypeAnswer CallDataType = "answer"
)
type CallData struct {
SDP string `json:"sdp"`
Type CallDataType `json:"type"`
}
type CallCandidate struct {
Candidate string `json:"candidate"`
SDPMLineIndex int `json:"sdpMLineIndex"`
SDPMID string `json:"sdpMid"`
}
type BaseCallEventContent struct {
CallID string `json:"call_id"`
PartyID string `json:"party_id"`
Version int `json:"version"`
}
type CallInviteEventContent struct {
BaseCallEventContent
Lifetime int `json:"lifetime"`
Offer CallData `json:"offer"`
}
type CallCandidatesEventContent struct {
BaseCallEventContent
Candidates []CallCandidate `json:"candidates"`
}
type CallRejectEventContent struct {
BaseCallEventContent
}
type CallAnswerEventContent struct {
BaseCallEventContent
Answer CallData `json:"answer"`
}
type CallSelectAnswerEventContent struct {
BaseCallEventContent
SelectedPartyID string `json:"selected_party_id"`
}
type CallNegotiateEventContent struct {
BaseCallEventContent
Lifetime int `json:"lifetime"`
Description CallData `json:"description"`
}
type CallHangupEventContent struct {
BaseCallEventContent
Reason CallHangupReason `json:"reason"`
}