Server/go/apptoken/service.go (122 lines of code) (raw):
package apptoken
import (
"bytes"
"encoding/binary"
"io"
)
const (
PRIVILEGE_ENABLED int32 = 1
PRIVILEGE_AUDIO_PUBLISH int32 = 2
PRIVILEGE_VIDEO_PUBLISH int32 = 4
PRIVILEGE_SCREEN_PUBLISH int32 = 8
)
const WILDCARD_CHARACTERS = "*"
type Service struct {
ChannelId string
UserId string
Privilege *int32
}
func CreateService(channelId string, userId string) Service {
return Service{
ChannelId: channelId,
UserId: userId,
}
}
func CreateServiceOnlyWithUserId(userId string) Service {
return Service{
ChannelId: WILDCARD_CHARACTERS,
UserId: userId,
}
}
func CreateServiceOnlyWithChannelId(channelId string) Service {
return Service{
ChannelId: channelId,
UserId: WILDCARD_CHARACTERS,
}
}
func (service *Service) Validate() {
if service.ChannelId == "" || service.UserId == "" {
panic("illegal ChannelId or UserId")
}
}
func (service *Service) AddAudioPublishPrivilege() {
if service.Privilege == nil {
service.Privilege = new(int32)
*service.Privilege = PRIVILEGE_ENABLED
}
*service.Privilege = *service.Privilege | PRIVILEGE_AUDIO_PUBLISH
}
func (service *Service) AddVideoPublishPrivilege() {
if service.Privilege == nil {
service.Privilege = new(int32)
*service.Privilege = PRIVILEGE_ENABLED
}
*service.Privilege = *service.Privilege | PRIVILEGE_VIDEO_PUBLISH
}
func (service *Service) AddScreenPublishPrivilege() {
if service.Privilege == nil {
service.Privilege = new(int32)
*service.Privilege = PRIVILEGE_ENABLED
}
*service.Privilege = *service.Privilege | PRIVILEGE_SCREEN_PUBLISH
}
func (service *Service) Pack() ([]byte, error) {
buf := new(bytes.Buffer)
// channelId
channelId := []byte(service.ChannelId)
if err := binary.Write(buf, binary.BigEndian, int32(len(channelId))); err != nil {
return nil, err
}
if _, err := buf.Write(channelId); err != nil {
return nil, err
}
// userId
userId := []byte(service.UserId)
if err := binary.Write(buf, binary.BigEndian, int32(len(userId))); err != nil {
return nil, err
}
if _, err := buf.Write(userId); err != nil {
return nil, err
}
// hasPrivilege
hasPrivilege := service.Privilege != nil
if err := binary.Write(buf, binary.BigEndian, hasPrivilege); err != nil {
return nil, err
}
// privilege
if hasPrivilege {
if err := binary.Write(buf, binary.BigEndian, *service.Privilege); err != nil {
return nil, err
}
}
return buf.Bytes(), nil
}
func UnpackService(buf io.Reader) (*Service, error) {
service := Service{}
// channelId
var channelIdLength int32
if err := binary.Read(buf, binary.BigEndian, &channelIdLength); err != nil {
return nil, err
}
channelId := make([]byte, channelIdLength)
if _, err := io.ReadFull(buf, channelId); err != nil {
return nil, err
}
service.ChannelId = string(channelId)
// userId
var userIdLength int32
if err := binary.Read(buf, binary.BigEndian, &userIdLength); err != nil {
return nil, err
}
userId := make([]byte, userIdLength)
if _, err := io.ReadFull(buf, userId); err != nil {
return nil, err
}
service.UserId = string(userId)
// privilege
var hasPrivilege bool
if err := binary.Read(buf, binary.BigEndian, &hasPrivilege); err != nil {
return nil, err
}
if hasPrivilege {
var privilege int32
if err := binary.Read(buf, binary.BigEndian, &privilege); err != nil {
return nil, err
}
service.Privilege = &privilege
}
return &service, nil
}