package client import ( "forge.redroom.link/yves/meowlib" "github.com/google/uuid" ) func ProcessForOutput(usermessage *meowlib.UserMessage, peer *Peer, servers *ServerList, trackingLookupKey string) ([]byte, error) { lastIdx := len(servers.Servers) - 1 // LAST SERVER : Message delivery as usual srv := &servers.Servers[lastIdx] // Prepare cyphered + packed user message packedMsg, err := peer.ProcessOutboundUserMessage(usermessage) if err != nil { return nil, err } // Creating Server message for transporting the user message toServerMessage := srv.BuildToServerMessageFromUserMessage(packedMsg) lastmsg, err := srv.ProcessOutboundMessage(toServerMessage) if err != nil { return nil, err } lastuuid := uuid.NewString() // ALL PREVIOUS SERVERS for i := lastIdx - 1; i >= 0; i-- { srv = &servers.Servers[i] var toServerMessage meowlib.ToServerMessage toServerMessage.MatriochkaMessage.Data = lastmsg toServerMessage.MatriochkaMessage.Next.Url = servers.Servers[i+1].Url toServerMessage.MatriochkaMessage.Next.PublicKey = servers.Servers[i+1].PublicKey toServerMessage.MatriochkaMessage.Next.Delay = int32(servers.Servers[i+1].AllowedDelay) if trackingLookupKey != "" { toServerMessage.MatriochkaMessage.Next.Uuid = lastuuid // change tracking uuid at each server if i > 0 { toServerMessage.MatriochkaMessage.Prev.Url = servers.Servers[i-1].Url toServerMessage.MatriochkaMessage.Prev.PublicKey = servers.Servers[i+1].PublicKey toServerMessage.MatriochkaMessage.Prev.Delay = int32(servers.Servers[i-1].AllowedDelay) toServerMessage.MatriochkaMessage.Prev.Uuid = uuid.NewString() lastuuid = toServerMessage.MatriochkaMessage.Prev.Uuid } else { // for first message, no previous tracking but a lookupkey to stack the tracking messages toServerMessage.MatriochkaMessage.LookupKey = trackingLookupKey } } lastmsg, err = srv.ProcessOutboundMessage(&toServerMessage) if err != nil { return nil, err } } return lastmsg, nil }