Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
load(
"@io_bazel_rules_go//proto:def.bzl",
"go_proto_library",
)
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
proto_library(
name = "model_proto",
srcs = ["model.proto"],
tags = ["automanaged"],
)
go_proto_library(
name = "model_go_proto",
compilers = ["@io_bazel_rules_go//proto:gogofast_proto"],
importpath = "go-common/app/service/main/broadcast/model",
proto = ":model_proto",
tags = ["manual"],
)
go_library(
name = "go_default_library",
srcs = [
"auth.go",
"model.go",
"model_v1.go",
"online.go",
"operation.go",
"room.go",
"server.go",
],
embed = [":model_go_proto"],
importpath = "go-common/app/service/main/broadcast/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/service/main/broadcast/libs/bufio:go_default_library",
"//app/service/main/broadcast/libs/bytes:go_default_library",
"//app/service/main/broadcast/libs/encoding/binary:go_default_library",
"//app/service/main/broadcast/libs/websocket:go_default_library",
"@com_github_gogo_protobuf//proto:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,15 @@
package model
// AuthToken auth token.
type AuthToken struct {
DeviceID string `json:"device_id"` // 客户端唯一key
RoomID string `json:"room_id"` // 业务房间号
AccessKey string `json:"access_key"` // access key用来获取mid
Platform string `json:"platform"` // 平台, android/ios/h5/web
MobiApp string `json:"mobi_app"` // mobi_app
Build int32 `json:"build"` // build
Accepts []int32 `json:"accepts"` // accept operations
// 兼容goim-chat
Aid int64 `json:"aid"`
Cid int64 `json:"roomid"`
}

View File

@@ -0,0 +1,256 @@
package model
import (
"errors"
"go-common/app/service/main/broadcast/libs/bufio"
"go-common/app/service/main/broadcast/libs/bytes"
"go-common/app/service/main/broadcast/libs/encoding/binary"
"go-common/app/service/main/broadcast/libs/websocket"
)
const (
// MaxBodySize max proto body size
MaxBodySize = int32(1 << 12)
)
const (
// size
_packSize = 4
_headerSize = 2
_verSize = 2
_operationSize = 4
_seqIDSize = 4
_compressSize = 1
_contentTypeSize = 1
_rawHeaderSize = _packSize + _headerSize + _verSize + _operationSize + _seqIDSize + _compressSize + _contentTypeSize
_maxPackSize = MaxBodySize + int32(_rawHeaderSize)
// offset
_packOffset = 0
_headerOffset = _packOffset + _packSize
_verOffset = _headerOffset + _headerSize
_operationOffset = _verOffset + _verSize
_seqIDOffset = _operationOffset + _operationSize
_compressOffset = _seqIDOffset + _seqIDSize
_contentTypeOffset = _compressOffset + _compressSize
)
var (
emptyJSONBody = []byte("{}")
// ErrProtoPackLen proto packet len error
ErrProtoPackLen = errors.New("default server codec pack length error")
// ErrProtoHeaderLen proto header len error
ErrProtoHeaderLen = errors.New("default server codec header length error")
)
var (
// ProtoReady proto ready
ProtoReady = &Proto{Operation: OpProtoReady}
// ProtoFinish proto finish
ProtoFinish = &Proto{Operation: OpProtoFinish}
)
// WriteTo write a proto to bytes writer.
func (p *Proto) WriteTo(b *bytes.Writer) {
var (
packLen = _rawHeaderSize + int32(len(p.Body))
buf = b.Peek(_rawHeaderSize)
)
binary.BigEndian.PutInt32(buf[_packOffset:], packLen)
binary.BigEndian.PutInt16(buf[_headerOffset:], int16(_rawHeaderSize))
binary.BigEndian.PutInt16(buf[_verOffset:], int16(p.Ver))
binary.BigEndian.PutInt32(buf[_operationOffset:], p.Operation)
binary.BigEndian.PutInt32(buf[_seqIDOffset:], p.SeqId)
binary.BigEndian.PutInt8(buf[_compressOffset:], int8(p.Compress))
binary.BigEndian.PutInt8(buf[_contentTypeOffset:], int8(p.ContentType))
if p.Body != nil {
b.Write(p.Body)
}
}
// ReadTCP read a proto from TCP reader.
func (p *Proto) ReadTCP(rr *bufio.Reader) (err error) {
var (
bodyLen int
headerLen int16
packLen int32
buf []byte
)
if buf, err = rr.Pop(_rawHeaderSize); err != nil {
return
}
packLen = binary.BigEndian.Int32(buf[_packOffset:_headerOffset])
headerLen = binary.BigEndian.Int16(buf[_headerOffset:_verOffset])
p.Ver = int32(binary.BigEndian.Int16(buf[_verOffset:_operationOffset]))
p.Operation = binary.BigEndian.Int32(buf[_operationOffset:_seqIDOffset])
p.SeqId = binary.BigEndian.Int32(buf[_seqIDOffset:_compressOffset])
p.Compress = int32(binary.BigEndian.Int8(buf[_compressOffset:_contentTypeOffset]))
p.ContentType = int32(binary.BigEndian.Int8(buf[_contentTypeOffset:]))
if packLen > _maxPackSize {
return ErrProtoPackLen
}
if headerLen != _rawHeaderSize {
return ErrProtoHeaderLen
}
if bodyLen = int(packLen - int32(headerLen)); bodyLen > 0 {
p.Body, err = rr.Pop(bodyLen)
} else {
p.Body = nil
}
return
}
// WriteTCP write a proto to TCP writer.
func (p *Proto) WriteTCP(wr *bufio.Writer) (err error) {
var (
buf []byte
packLen int32
)
if p.Operation == OpRaw {
// write without buffer, job concact proto into raw buffer
_, err = wr.WriteRaw(p.Body)
return
}
packLen = _rawHeaderSize + int32(len(p.Body))
if buf, err = wr.Peek(_rawHeaderSize); err != nil {
return
}
binary.BigEndian.PutInt32(buf[_packOffset:], packLen)
binary.BigEndian.PutInt16(buf[_headerOffset:], int16(_rawHeaderSize))
binary.BigEndian.PutInt16(buf[_verOffset:], int16(p.Ver))
binary.BigEndian.PutInt32(buf[_operationOffset:], p.Operation)
binary.BigEndian.PutInt32(buf[_seqIDOffset:], p.SeqId)
binary.BigEndian.PutInt8(buf[_compressOffset:], int8(p.Compress))
binary.BigEndian.PutInt8(buf[_contentTypeOffset:], int8(p.ContentType))
if p.Body != nil {
_, err = wr.Write(p.Body)
}
return
}
// ReadWebsocket read a proto from websocket connection.
func (p *Proto) ReadWebsocket(ws *websocket.Conn) (err error) {
var (
bodyLen int
headerLen int16
packLen int32
buf []byte
)
if _, buf, err = ws.ReadMessage(); err != nil {
return
}
if len(buf) < _rawHeaderSize {
return ErrProtoPackLen
}
packLen = binary.BigEndian.Int32(buf[_packOffset:_headerOffset])
headerLen = binary.BigEndian.Int16(buf[_headerOffset:_verOffset])
p.Ver = int32(binary.BigEndian.Int16(buf[_verOffset:_operationOffset]))
p.Operation = binary.BigEndian.Int32(buf[_operationOffset:_seqIDOffset])
p.SeqId = binary.BigEndian.Int32(buf[_seqIDOffset:_compressOffset])
p.Compress = int32(binary.BigEndian.Int8(buf[_compressOffset:_contentTypeOffset]))
p.ContentType = int32(binary.BigEndian.Int8(buf[_contentTypeOffset:]))
if packLen > _maxPackSize {
return ErrProtoPackLen
}
if headerLen != _rawHeaderSize {
return ErrProtoHeaderLen
}
if bodyLen = int(packLen - int32(headerLen)); bodyLen > 0 {
p.Body = buf[headerLen:packLen]
} else {
p.Body = nil
}
return
}
// WriteWebsocket write a proto to websocket connection.
func (p *Proto) WriteWebsocket(ws *websocket.Conn) (err error) {
var (
buf []byte
packLen int
)
// NOTE: 通过 OpRaw = 9 为ws批量消息处理
// if p.Operation == OpRaw {
// err = ws.WriteMessage(websocket.BinaryMessage, p.Body)
// return
// }
packLen = _rawHeaderSize + len(p.Body)
if err = ws.WriteHeader(websocket.BinaryMessage, packLen); err != nil {
return
}
if buf, err = ws.Peek(_rawHeaderSize); err != nil {
return
}
binary.BigEndian.PutInt32(buf[_packOffset:], int32(packLen))
binary.BigEndian.PutInt16(buf[_headerOffset:], int16(_rawHeaderSize))
binary.BigEndian.PutInt16(buf[_verOffset:], int16(p.Ver))
binary.BigEndian.PutInt32(buf[_operationOffset:], p.Operation)
binary.BigEndian.PutInt32(buf[_seqIDOffset:], p.SeqId)
binary.BigEndian.PutInt8(buf[_compressOffset:], int8(p.Compress))
binary.BigEndian.PutInt8(buf[_contentTypeOffset:], int8(p.ContentType))
if p.Body != nil {
err = ws.WriteBody(p.Body)
}
return
}
// WriteWebsocketHeart write a heartbeat proto to websocket connnection.
func (p *Proto) WriteWebsocketHeart(wr *websocket.Conn) (err error) {
var (
buf []byte
packLen int
)
if len(p.Body) == 0 {
p.Body = emptyJSONBody
}
packLen = _rawHeaderSize + len(p.Body)
// websocket header
if err = wr.WriteHeader(websocket.BinaryMessage, packLen); err != nil {
return
}
if buf, err = wr.Peek(_rawHeaderSize); err != nil {
return
}
// proto header
binary.BigEndian.PutInt32(buf[_packOffset:], int32(packLen))
binary.BigEndian.PutInt16(buf[_headerOffset:], int16(_rawHeaderSize))
binary.BigEndian.PutInt16(buf[_verOffset:], int16(p.Ver))
binary.BigEndian.PutInt32(buf[_operationOffset:], p.Operation)
binary.BigEndian.PutInt32(buf[_seqIDOffset:], p.SeqId)
binary.BigEndian.PutInt8(buf[_compressOffset:], int8(p.Compress))
binary.BigEndian.PutInt8(buf[_contentTypeOffset:], int8(p.ContentType))
// proto body
if p.Body != nil {
err = wr.WriteBody(p.Body)
}
return
}
// WriteTCPHeart write a heartbeat proto to TCP writer.
func (p *Proto) WriteTCPHeart(wr *bufio.Writer) (err error) {
var (
buf []byte
packLen int32
)
if len(p.Body) == 0 {
p.Body = emptyJSONBody
}
packLen = _rawHeaderSize + int32(len(p.Body))
if buf, err = wr.Peek(_rawHeaderSize); err != nil {
return
}
// header
binary.BigEndian.PutInt32(buf[_packOffset:], int32(packLen))
binary.BigEndian.PutInt16(buf[_headerOffset:], int16(_rawHeaderSize))
binary.BigEndian.PutInt16(buf[_verOffset:], int16(p.Ver))
binary.BigEndian.PutInt32(buf[_operationOffset:], p.Operation)
binary.BigEndian.PutInt32(buf[_seqIDOffset:], p.SeqId)
binary.BigEndian.PutInt8(buf[_compressOffset:], int8(p.Compress))
binary.BigEndian.PutInt8(buf[_contentTypeOffset:], int8(p.ContentType))
// body
if p.Body != nil {
_, err = wr.Write(p.Body)
}
return
}

View File

@@ -0,0 +1,486 @@
// Code generated by protoc-gen-gogo. DO NOT EDIT.
// source: app/service/main/broadcast/model/model.proto
/*
Package model is a generated protocol buffer package.
It is generated from these files:
app/service/main/broadcast/model/model.proto
It has these top-level messages:
Proto
*/
package model
import proto "github.com/gogo/protobuf/proto"
import fmt "fmt"
import math "math"
import io "io"
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
type Proto struct {
Ver int32 `protobuf:"varint,1,opt,name=ver,proto3" json:"ver,omitempty"`
Operation int32 `protobuf:"varint,2,opt,name=operation,proto3" json:"operation,omitempty"`
SeqId int32 `protobuf:"varint,3,opt,name=seqId,proto3" json:"seqId,omitempty"`
Compress int32 `protobuf:"varint,4,opt,name=compress,proto3" json:"compress,omitempty"`
ContentType int32 `protobuf:"varint,5,opt,name=contentType,proto3" json:"contentType,omitempty"`
Body []byte `protobuf:"bytes,6,opt,name=body,proto3" json:"body,omitempty"`
}
func (m *Proto) Reset() { *m = Proto{} }
func (m *Proto) String() string { return proto.CompactTextString(m) }
func (*Proto) ProtoMessage() {}
func (*Proto) Descriptor() ([]byte, []int) { return fileDescriptorModel, []int{0} }
func (m *Proto) GetVer() int32 {
if m != nil {
return m.Ver
}
return 0
}
func (m *Proto) GetOperation() int32 {
if m != nil {
return m.Operation
}
return 0
}
func (m *Proto) GetSeqId() int32 {
if m != nil {
return m.SeqId
}
return 0
}
func (m *Proto) GetCompress() int32 {
if m != nil {
return m.Compress
}
return 0
}
func (m *Proto) GetContentType() int32 {
if m != nil {
return m.ContentType
}
return 0
}
func (m *Proto) GetBody() []byte {
if m != nil {
return m.Body
}
return nil
}
func init() {
proto.RegisterType((*Proto)(nil), "push.service.broadcast.model.Proto")
}
func (m *Proto) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalTo(dAtA)
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *Proto) MarshalTo(dAtA []byte) (int, error) {
var i int
_ = i
var l int
_ = l
if m.Ver != 0 {
dAtA[i] = 0x8
i++
i = encodeVarintModel(dAtA, i, uint64(m.Ver))
}
if m.Operation != 0 {
dAtA[i] = 0x10
i++
i = encodeVarintModel(dAtA, i, uint64(m.Operation))
}
if m.SeqId != 0 {
dAtA[i] = 0x18
i++
i = encodeVarintModel(dAtA, i, uint64(m.SeqId))
}
if m.Compress != 0 {
dAtA[i] = 0x20
i++
i = encodeVarintModel(dAtA, i, uint64(m.Compress))
}
if m.ContentType != 0 {
dAtA[i] = 0x28
i++
i = encodeVarintModel(dAtA, i, uint64(m.ContentType))
}
if len(m.Body) > 0 {
dAtA[i] = 0x32
i++
i = encodeVarintModel(dAtA, i, uint64(len(m.Body)))
i += copy(dAtA[i:], m.Body)
}
return i, nil
}
func encodeVarintModel(dAtA []byte, offset int, v uint64) int {
for v >= 1<<7 {
dAtA[offset] = uint8(v&0x7f | 0x80)
v >>= 7
offset++
}
dAtA[offset] = uint8(v)
return offset + 1
}
func (m *Proto) Size() (n int) {
var l int
_ = l
if m.Ver != 0 {
n += 1 + sovModel(uint64(m.Ver))
}
if m.Operation != 0 {
n += 1 + sovModel(uint64(m.Operation))
}
if m.SeqId != 0 {
n += 1 + sovModel(uint64(m.SeqId))
}
if m.Compress != 0 {
n += 1 + sovModel(uint64(m.Compress))
}
if m.ContentType != 0 {
n += 1 + sovModel(uint64(m.ContentType))
}
l = len(m.Body)
if l > 0 {
n += 1 + l + sovModel(uint64(l))
}
return n
}
func sovModel(x uint64) (n int) {
for {
n++
x >>= 7
if x == 0 {
break
}
}
return n
}
func sozModel(x uint64) (n int) {
return sovModel(uint64((x << 1) ^ uint64((int64(x) >> 63))))
}
func (m *Proto) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: Proto: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: Proto: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Ver", wireType)
}
m.Ver = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Ver |= (int32(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Operation", wireType)
}
m.Operation = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Operation |= (int32(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field SeqId", wireType)
}
m.SeqId = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.SeqId |= (int32(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 4:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Compress", wireType)
}
m.Compress = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Compress |= (int32(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 5:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field ContentType", wireType)
}
m.ContentType = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.ContentType |= (int32(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
case 6:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Body", wireType)
}
var byteLen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowModel
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
byteLen |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
if byteLen < 0 {
return ErrInvalidLengthModel
}
postIndex := iNdEx + byteLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Body = append(m.Body[:0], dAtA[iNdEx:postIndex]...)
if m.Body == nil {
m.Body = []byte{}
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipModel(dAtA[iNdEx:])
if err != nil {
return err
}
if skippy < 0 {
return ErrInvalidLengthModel
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func skipModel(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowModel
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
wireType := int(wire & 0x7)
switch wireType {
case 0:
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowModel
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
iNdEx++
if dAtA[iNdEx-1] < 0x80 {
break
}
}
return iNdEx, nil
case 1:
iNdEx += 8
return iNdEx, nil
case 2:
var length int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowModel
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
length |= (int(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
iNdEx += length
if length < 0 {
return 0, ErrInvalidLengthModel
}
return iNdEx, nil
case 3:
for {
var innerWire uint64
var start int = iNdEx
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return 0, ErrIntOverflowModel
}
if iNdEx >= l {
return 0, io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
innerWire |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
innerWireType := int(innerWire & 0x7)
if innerWireType == 4 {
break
}
next, err := skipModel(dAtA[start:])
if err != nil {
return 0, err
}
iNdEx = start + next
}
return iNdEx, nil
case 4:
return iNdEx, nil
case 5:
iNdEx += 4
return iNdEx, nil
default:
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
}
}
panic("unreachable")
}
var (
ErrInvalidLengthModel = fmt.Errorf("proto: negative length found during unmarshaling")
ErrIntOverflowModel = fmt.Errorf("proto: integer overflow")
)
func init() { proto.RegisterFile("app/service/main/broadcast/model/model.proto", fileDescriptorModel) }
var fileDescriptorModel = []byte{
// 216 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x49, 0x2c, 0x28, 0xd0,
0x2f, 0x4e, 0x2d, 0x2a, 0xcb, 0x4c, 0x4e, 0xd5, 0xcf, 0x4d, 0xcc, 0xcc, 0xd3, 0x4f, 0x2a, 0xca,
0x4f, 0x4c, 0x49, 0x4e, 0x2c, 0x2e, 0xd1, 0xcf, 0xcd, 0x4f, 0x49, 0xcd, 0x81, 0x90, 0x7a, 0x05,
0x45, 0xf9, 0x25, 0xf9, 0x42, 0x32, 0x05, 0xa5, 0xc5, 0x19, 0x7a, 0x50, 0xe5, 0x7a, 0x70, 0x95,
0x7a, 0x60, 0x35, 0x4a, 0xf3, 0x19, 0xb9, 0x58, 0x03, 0xc0, 0xea, 0x04, 0xb8, 0x98, 0xcb, 0x52,
0x8b, 0x24, 0x18, 0x15, 0x18, 0x35, 0x58, 0x83, 0x40, 0x4c, 0x21, 0x19, 0x2e, 0xce, 0xfc, 0x82,
0xd4, 0xa2, 0xc4, 0x92, 0xcc, 0xfc, 0x3c, 0x09, 0x26, 0xb0, 0x38, 0x42, 0x40, 0x48, 0x84, 0x8b,
0xb5, 0x38, 0xb5, 0xd0, 0x33, 0x45, 0x82, 0x19, 0x2c, 0x03, 0xe1, 0x08, 0x49, 0x71, 0x71, 0x24,
0xe7, 0xe7, 0x16, 0x14, 0xa5, 0x16, 0x17, 0x4b, 0xb0, 0x80, 0x25, 0xe0, 0x7c, 0x21, 0x05, 0x2e,
0xee, 0xe4, 0xfc, 0xbc, 0x92, 0xd4, 0xbc, 0x92, 0x90, 0xca, 0x82, 0x54, 0x09, 0x56, 0xb0, 0x34,
0xb2, 0x90, 0x90, 0x10, 0x17, 0x4b, 0x52, 0x7e, 0x4a, 0xa5, 0x04, 0x9b, 0x02, 0xa3, 0x06, 0x4f,
0x10, 0x98, 0xed, 0x24, 0x7c, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9,
0x31, 0x46, 0xb1, 0x82, 0x9d, 0x9d, 0xc4, 0x06, 0xf6, 0x9b, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff,
0x43, 0x45, 0x1f, 0x62, 0x0b, 0x01, 0x00, 0x00,
}

View File

@@ -0,0 +1,16 @@
// +bili:type=service
// Code generated by warden.
syntax = "proto3";
package push.service.broadcast.model;
option go_package = "model";
message Proto {
int32 ver = 1;
int32 operation = 2;
int32 seqId = 3;
int32 compress = 4;
int32 contentType = 5;
bytes body = 6;
}

View File

@@ -0,0 +1,207 @@
package model
import (
"go-common/app/service/main/broadcast/libs/bufio"
"go-common/app/service/main/broadcast/libs/bytes"
"go-common/app/service/main/broadcast/libs/encoding/binary"
"go-common/app/service/main/broadcast/libs/websocket"
)
const (
maxBodySizeV1 = int32(1 << 10)
// size
packSizeV1 = 4
headerSizeV1 = 2
verSizeV1 = 2
operationSizeV1 = 4
seqIDSizeV1 = 4
heartbeatSizeV1 = 4
rawHeaderSizeV1 = packSizeV1 + headerSizeV1 + verSizeV1 + operationSizeV1 + seqIDSizeV1
maxPackSizeV1 = maxBodySizeV1 + int32(rawHeaderSizeV1)
// offset
packOffsetV1 = 0
headerOffsetV1 = packOffsetV1 + packSizeV1
verOffsetV1 = headerOffsetV1 + headerSizeV1
operationOffsetV1 = verOffsetV1 + verSizeV1
seqIDOffsetV1 = operationOffsetV1 + operationSizeV1
heartbeatOffsetV1 = seqIDOffsetV1 + seqIDSizeV1
)
// WriteToV1 .
func (p *Proto) WriteToV1(b *bytes.Writer) {
var (
packLen = rawHeaderSizeV1 + int32(len(p.Body))
buf = b.Peek(rawHeaderSizeV1)
)
binary.BigEndian.PutInt32(buf[packOffsetV1:], packLen)
binary.BigEndian.PutInt16(buf[headerOffsetV1:], int16(rawHeaderSizeV1))
binary.BigEndian.PutInt16(buf[verOffsetV1:], int16(p.Ver))
binary.BigEndian.PutInt32(buf[operationOffsetV1:], p.Operation)
binary.BigEndian.PutInt32(buf[seqIDOffsetV1:], p.SeqId)
if p.Body != nil {
b.Write(p.Body)
}
}
// ReadTCPV1 .
func (p *Proto) ReadTCPV1(rr *bufio.Reader) (err error) {
var (
bodyLen int
headerLen int16
packLen int32
buf []byte
)
if buf, err = rr.Pop(rawHeaderSizeV1); err != nil {
return
}
packLen = binary.BigEndian.Int32(buf[packOffsetV1:headerOffsetV1])
headerLen = binary.BigEndian.Int16(buf[headerOffsetV1:verOffsetV1])
p.Ver = int32(binary.BigEndian.Int16(buf[verOffsetV1:operationOffsetV1]))
p.Operation = binary.BigEndian.Int32(buf[operationOffsetV1:seqIDOffsetV1])
p.SeqId = binary.BigEndian.Int32(buf[seqIDOffsetV1:])
if packLen > maxPackSizeV1 {
return ErrProtoPackLen
}
if headerLen != rawHeaderSizeV1 {
return ErrProtoHeaderLen
}
if bodyLen = int(packLen - int32(headerLen)); bodyLen > 0 {
p.Body, err = rr.Pop(bodyLen)
} else {
p.Body = nil
}
return
}
// WriteTCPV1 .
func (p *Proto) WriteTCPV1(wr *bufio.Writer) (err error) {
var (
buf []byte
packLen int32
)
if p.Operation == OpRaw {
// write without buffer, job concact proto into raw buffer
_, err = wr.WriteRaw(p.Body)
return
}
packLen = rawHeaderSizeV1 + int32(len(p.Body))
if buf, err = wr.Peek(rawHeaderSizeV1); err != nil {
return
}
binary.BigEndian.PutInt32(buf[packOffsetV1:], packLen)
binary.BigEndian.PutInt16(buf[headerOffsetV1:], int16(rawHeaderSizeV1))
binary.BigEndian.PutInt16(buf[verOffsetV1:], int16(p.Ver))
binary.BigEndian.PutInt32(buf[operationOffsetV1:], p.Operation)
binary.BigEndian.PutInt32(buf[seqIDOffsetV1:], p.SeqId)
if p.Body != nil {
_, err = wr.Write(p.Body)
}
return
}
// WriteTCPHeartV1 .
func (p *Proto) WriteTCPHeartV1(wr *bufio.Writer, online int32) (err error) {
var (
buf []byte
packLen int
)
packLen = rawHeaderSizeV1 + heartbeatSizeV1
if buf, err = wr.Peek(packLen); err != nil {
return
}
// header
binary.BigEndian.PutInt32(buf[packOffsetV1:], int32(packLen))
binary.BigEndian.PutInt16(buf[headerOffsetV1:], int16(rawHeaderSizeV1))
binary.BigEndian.PutInt16(buf[verOffsetV1:], int16(p.Ver))
binary.BigEndian.PutInt32(buf[operationOffsetV1:], p.Operation)
binary.BigEndian.PutInt32(buf[seqIDOffsetV1:], p.SeqId)
// body
binary.BigEndian.PutInt32(buf[heartbeatOffsetV1:], online)
return
}
// ReadWebsocketV1 .
func (p *Proto) ReadWebsocketV1(ws *websocket.Conn) (err error) {
var (
bodyLen int
headerLen int16
packLen int32
buf []byte
)
if _, buf, err = ws.ReadMessage(); err != nil {
return
}
if len(buf) < rawHeaderSizeV1 {
return ErrProtoPackLen
}
packLen = binary.BigEndian.Int32(buf[packOffsetV1:headerOffsetV1])
headerLen = binary.BigEndian.Int16(buf[headerOffsetV1:verOffsetV1])
p.Ver = int32(binary.BigEndian.Int16(buf[verOffsetV1:operationOffsetV1]))
p.Operation = binary.BigEndian.Int32(buf[operationOffsetV1:seqIDOffsetV1])
p.SeqId = binary.BigEndian.Int32(buf[seqIDOffsetV1:])
if packLen > maxPackSizeV1 {
return ErrProtoPackLen
}
if headerLen != rawHeaderSizeV1 {
return ErrProtoHeaderLen
}
if bodyLen = int(packLen - int32(headerLen)); bodyLen > 0 {
p.Body = buf[headerLen:packLen]
} else {
p.Body = nil
}
return
}
// WriteWebsocketV1 .
func (p *Proto) WriteWebsocketV1(ws *websocket.Conn) (err error) {
var (
buf []byte
packLen int
)
if p.Operation == OpRaw {
err = ws.WriteMessage(websocket.BinaryMessage, p.Body)
return
}
packLen = rawHeaderSizeV1 + len(p.Body)
if err = ws.WriteHeader(websocket.BinaryMessage, packLen); err != nil {
return
}
if buf, err = ws.Peek(rawHeaderSizeV1); err != nil {
return
}
binary.BigEndian.PutInt32(buf[packOffsetV1:], int32(packLen))
binary.BigEndian.PutInt16(buf[headerOffsetV1:], int16(rawHeaderSizeV1))
binary.BigEndian.PutInt16(buf[verOffsetV1:], int16(p.Ver))
binary.BigEndian.PutInt32(buf[operationOffsetV1:], p.Operation)
binary.BigEndian.PutInt32(buf[seqIDOffsetV1:], p.SeqId)
if p.Body != nil {
err = ws.WriteBody(p.Body)
}
return
}
// WriteWebsocketHeartV1 .
func (p *Proto) WriteWebsocketHeartV1(wr *websocket.Conn, online int32) (err error) {
var (
buf []byte
packLen int
)
packLen = rawHeaderSizeV1 + heartbeatSizeV1
// websocket header
if err = wr.WriteHeader(websocket.BinaryMessage, packLen); err != nil {
return
}
if buf, err = wr.Peek(packLen); err != nil {
return
}
// proto header
binary.BigEndian.PutInt32(buf[packOffsetV1:], int32(packLen))
binary.BigEndian.PutInt16(buf[headerOffsetV1:], int16(rawHeaderSizeV1))
binary.BigEndian.PutInt16(buf[verOffsetV1:], int16(p.Ver))
binary.BigEndian.PutInt32(buf[operationOffsetV1:], p.Operation)
binary.BigEndian.PutInt32(buf[seqIDOffsetV1:], p.SeqId)
// proto body
binary.BigEndian.PutInt32(buf[heartbeatOffsetV1:], online)
return
}

View File

@@ -0,0 +1,14 @@
package model
// Online ip and room online.
type Online struct {
Server string `json:"server"`
RoomCount map[string]int32 `json:"room_count"`
Updated int64 `json:"updated"`
}
// Top top sorted.
type Top struct {
RoomID string `json:"room_id"`
Count int32 `json:"count"`
}

View File

@@ -0,0 +1,54 @@
package model
const (
// OpHandshake handshake
OpHandshake = int32(0)
// OpHandshakeReply handshake reply
OpHandshakeReply = int32(1)
// OpHeartbeat heartbeat
OpHeartbeat = int32(2)
// OpHeartbeatReply heartbeat reply
OpHeartbeatReply = int32(3)
// OpSendMsg send message.
OpSendMsg = int32(4)
// OpSendMsgReply send message reply
OpSendMsgReply = int32(5)
// OpDisconnectReply disconnect reply
OpDisconnectReply = int32(6)
// OpAuth auth connnect
OpAuth = int32(7)
// OpAuthReply auth connect reply
OpAuthReply = int32(8)
// OpRaw raw message
OpRaw = int32(9)
// OpProtoReady proto ready
OpProtoReady = int32(10)
// OpProtoFinish proto finish
OpProtoFinish = int32(11)
// OpChangeRoom change room
OpChangeRoom = int32(12)
// OpChangeRoomReply change room reply
OpChangeRoomReply = int32(13)
// OpRegister register operation
OpRegister = int32(14)
// OpRegisterReply register operation
OpRegisterReply = int32(15)
// OpUnregister unregister operation
OpUnregister = int32(16)
// OpUnregisterReply unregister operation reply
OpUnregisterReply = int32(17)
// MinBusinessOp min business operation
MinBusinessOp = 1000
// MaxBusinessOp max business operation
MaxBusinessOp = 10000
)

View File

@@ -0,0 +1,25 @@
package model
import (
"fmt"
"net/url"
)
const (
// NoRoom default no room key
NoRoom = "noroom"
)
// EncodeRoomKey encode a room key.
func EncodeRoomKey(business string, room string) string {
return fmt.Sprintf("%s://%s", business, room)
}
// DecodeRoomKey decode room key.
func DecodeRoomKey(key string) (string, string, error) {
u, err := url.Parse(key)
if err != nil {
return "", "", err
}
return u.Scheme, u.Host, nil
}

View File

@@ -0,0 +1,17 @@
package model
// ServerInfo server info.
type ServerInfo struct {
Region string `json:"region"`
Server string `json:"server"`
IPCount int32 `json:"ip_count"`
ConnCount int32 `json:"conn_count"`
RoomIPCount int32 `json:"room_ips"`
Weight int32 `json:"weight"`
Updated int64 `json:"updated"`
IPAddrs []string `json:"ip_addrs"`
IPAddrsV6 []string `json:"ip_addrs_v6"`
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
Overseas bool `json:"overseas"`
}