|
|
|
@ -37,7 +37,7 @@ func NewRedisRouter(server *Identity, redisUrl string, password string, db int,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMessage, error) {
|
|
|
|
|
var from_server meowlib.FromServerMessage
|
|
|
|
|
var from_server *meowlib.FromServerMessage
|
|
|
|
|
// update messages counter
|
|
|
|
|
err := r.Client.Incr("statistics:messages:total").Err()
|
|
|
|
|
if err != nil {
|
|
|
|
@ -45,10 +45,59 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
|
|
|
|
|
}
|
|
|
|
|
// user message => store
|
|
|
|
|
if len(msg.Messages) > 0 {
|
|
|
|
|
from_server, err = r.storeMessage(msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// check for messages
|
|
|
|
|
if len(msg.PullRequest) > 0 {
|
|
|
|
|
from_server, err = r.checkForMessage(msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// manage Matriochka
|
|
|
|
|
if msg.MatriochkaMessage != nil {
|
|
|
|
|
from_server, err = r.handleMatriochka(msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Server list exchange
|
|
|
|
|
if len(msg.KnownServers) > 0 {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// Through server invitation process
|
|
|
|
|
if msg.Invitation != nil {
|
|
|
|
|
from_server, err = r.handleInvitation(msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
case "s": // servers list
|
|
|
|
|
breakmsgs
|
|
|
|
|
|
|
|
|
|
case "m": // matriochka
|
|
|
|
|
break
|
|
|
|
|
case "b": // broadcast
|
|
|
|
|
break
|
|
|
|
|
case "a": // admin
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
return from_server, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *RedisRouter) storeMessage(msg *meowlib.ToServerMessage) (*meowlib.FromServerMessage, error) {
|
|
|
|
|
var from_server meowlib.FromServerMessage
|
|
|
|
|
// update messages counter
|
|
|
|
|
err := r.Client.Incr("statistics:messages:usermessages").Err()
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
for _, usrmsg := range msg.Messages {
|
|
|
|
|
// serialize the message to store it as byte array into redis
|
|
|
|
@ -59,14 +108,16 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
|
|
|
|
|
r.Client.ZAdd(usrmsg.Destination, redis.Z{Score: float64(time.Now().Unix()), Member: out})
|
|
|
|
|
}
|
|
|
|
|
from_server.UuidAck = msg.Uuid
|
|
|
|
|
}
|
|
|
|
|
// check for messages
|
|
|
|
|
if len(msg.PullRequest) > 0 {
|
|
|
|
|
return &from_server, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *RedisRouter) checkForMessage(msg *meowlib.ToServerMessage) (*meowlib.FromServerMessage, error) {
|
|
|
|
|
var from_server meowlib.FromServerMessage
|
|
|
|
|
//dataFound := false
|
|
|
|
|
// update messages counter
|
|
|
|
|
err := r.Client.Incr("statistics:messages:messagelookups").Err()
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
for _, rq := range msg.PullRequest {
|
|
|
|
|
// get messages from redis
|
|
|
|
@ -111,34 +162,15 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// manage Matriochka
|
|
|
|
|
if msg.MatriochkaMessage != nil {
|
|
|
|
|
// update messages counter
|
|
|
|
|
err := r.Client.Incr("statistics:messages:matriochka").Err()
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
out, err := proto.Marshal(msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
r.Client.ZAdd("mtk", redis.Z{Score: float64(time.Now().Unix()), Member: out})
|
|
|
|
|
if msg.MatriochkaMessage.LookupKey != "" {
|
|
|
|
|
//r.Client.ZAdd("trk:" + msg.MatriochkaMessage.Next.Uuid,{})
|
|
|
|
|
}
|
|
|
|
|
from_server.UuidAck = msg.Uuid
|
|
|
|
|
}
|
|
|
|
|
// Server list exchange
|
|
|
|
|
if len(msg.KnownServers) > 0 {
|
|
|
|
|
return &from_server, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
// Through server invitation process
|
|
|
|
|
if msg.Invitation != nil {
|
|
|
|
|
func (r *RedisRouter) handleInvitation(msg *meowlib.ToServerMessage) (*meowlib.FromServerMessage, error) {
|
|
|
|
|
var from_server meowlib.FromServerMessage
|
|
|
|
|
// update messages counter
|
|
|
|
|
err := r.Client.Incr("statistics:messages:invitation").Err()
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
switch msg.Invitation.Step {
|
|
|
|
|
// create invitation => provide shortcode and expiry
|
|
|
|
@ -176,37 +208,25 @@ func (r *RedisRouter) Route(msg *meowlib.ToServerMessage) (*meowlib.FromServerMe
|
|
|
|
|
expiry := r.StoreAnswerToInvitation(usermsg.Destination, int(msg.Invitation.Timeout), data, r.InvitationTimeout)
|
|
|
|
|
from_server.Invitation = &meowlib.Invitation{}
|
|
|
|
|
from_server.Invitation.Expiry = expiry.UTC().Unix()
|
|
|
|
|
|
|
|
|
|
// DONE IN NORMAL MESSAGE FLOW
|
|
|
|
|
// get accepted invitation => send accepted invitation to initiator
|
|
|
|
|
/* case 4:
|
|
|
|
|
from_server.Invitation = &meowlib.Invitation{}
|
|
|
|
|
var answer meowlib.Invitation
|
|
|
|
|
storedAanswer, err := r.GetAnswerToInvitation(msg.Invitation.Uuid)
|
|
|
|
|
if err != nil {
|
|
|
|
|
from_server.Invitation.Payload = []byte("invitation answer not found")
|
|
|
|
|
} else {
|
|
|
|
|
err := proto.Unmarshal(storedAanswer, &answer)
|
|
|
|
|
if err != nil {
|
|
|
|
|
from_server.Invitation.Payload = []byte("invitation answer corrupted")
|
|
|
|
|
}
|
|
|
|
|
from_server.Invitation = &answer
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
case "s": // servers list
|
|
|
|
|
breakmsgs
|
|
|
|
|
|
|
|
|
|
case "m": // matriochka
|
|
|
|
|
break
|
|
|
|
|
case "b": // broadcast
|
|
|
|
|
break
|
|
|
|
|
case "a": // admin
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
return &from_server, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (r *RedisRouter) handleMatriochka(msg *meowlib.ToServerMessage) (*meowlib.FromServerMessage, error) {
|
|
|
|
|
var from_server meowlib.FromServerMessage
|
|
|
|
|
// update messages counter
|
|
|
|
|
err := r.Client.Incr("statistics:messages:matriochka").Err()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
out, err := proto.Marshal(msg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
r.Client.ZAdd("mtk", redis.Z{Score: float64(time.Now().Unix()), Member: out})
|
|
|
|
|
if msg.MatriochkaMessage.LookupKey != "" {
|
|
|
|
|
//r.Client.ZAdd("trk:" + msg.MatriochkaMessage.Next.Uuid,{})
|
|
|
|
|
}
|
|
|
|
|
from_server.UuidAck = msg.Uuid
|
|
|
|
|
return &from_server, nil
|
|
|
|
|
}
|
|
|
|
|