Skip to content

Commit 0394392

Browse files
committed
Shorten too large referee messages
If the message gets too large, other clients can not parse it anymore, as they often use fixed-sized buffers.
1 parent 18de9e1 commit 0394392

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

internal/app/publish/publisher.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,39 @@ func (p *Publisher) SendMessage(refereeMsg *state.Referee) {
7676
if len(p.conns) == 0 && !p.connect() {
7777
return
7878
}
79+
80+
bytes, err := marshalRefereeMessage(refereeMsg)
7981
for _, conn := range p.conns {
80-
bytes, err := proto.Marshal(refereeMsg)
81-
if err != nil {
82-
log.Printf("Could not marshal referee message: %v\nError: %v", refereeMsg, err)
83-
return
84-
}
8582
_, err = conn.Write(bytes)
8683
if err != nil {
8784
log.Println("Could not write referee message:", err)
8885
p.disconnect()
8986
}
9087
}
9188
}
89+
90+
func marshalRefereeMessage(refereeMsg *state.Referee) ([]byte, error) {
91+
bytes, err := proto.Marshal(refereeMsg)
92+
if err != nil {
93+
log.Printf("Could not marshal referee message: %v\nError: %v", refereeMsg, err)
94+
return nil, err
95+
}
96+
97+
if len(bytes) > maxDatagramSize {
98+
log.Printf("Referee message is too large (%d bytes) to send in one packet. Shortening message.", len(bytes))
99+
100+
shortenedRefereeMsg := proto.Clone(refereeMsg).(*state.Referee)
101+
shortenedRefereeMsg.GameEvents = []*state.GameEvent{}
102+
shortenedRefereeMsg.GameEventProposals = []*state.GameEventProposalGroup{}
103+
104+
bytes, err = proto.Marshal(shortenedRefereeMsg)
105+
if err != nil {
106+
log.Printf("Could not marshal referee message: %v\nError: %v", shortenedRefereeMsg, err)
107+
return nil, err
108+
}
109+
110+
return bytes, nil
111+
}
112+
113+
return bytes, nil
114+
}

0 commit comments

Comments
 (0)