diff --git a/internal/broadcast/dispatcher.go b/internal/broadcast/dispatcher.go index 56a3ad8..640cc3b 100644 --- a/internal/broadcast/dispatcher.go +++ b/internal/broadcast/dispatcher.go @@ -123,26 +123,21 @@ func (bm *Dispatcher) broadcaster() { // Take entry out of broadcast channel and generate JSON representations for the entry. entry := <-bm.MessageQueue - dataLite := entry.JSONLite() - dataFull := entry.JSON() - dataDomain := entry.JSONDomains() bm.clientLock.RLock() for _, c := range bm.clients { switch c.SubType() { case SubTypeLite: - data = dataLite + data = entry.JSONLite() case SubTypeFull: - data = dataFull + data = entry.JSON() case SubTypeDomain: - data = dataDomain + data = entry.JSONDomains() default: - // This should never happen, but if it does, we log it and skip the client. - log.Printf("Unknown subscription type '%d' for client '%s'. Skipping this client!\n", c.SubType(), c.Name()) + log.Printf("Unknown subscription type '%d' on client '%s'. Skipping this client!\n", c.SubType(), c.Name()) continue } - c.Write(data) } diff --git a/internal/models/certstream.go b/internal/models/certstream.go index 4d2e4f5..83f3312 100644 --- a/internal/models/certstream.go +++ b/internal/models/certstream.go @@ -7,19 +7,21 @@ import ( ) type Entry struct { - Data Data `json:"data"` - MessageType string `json:"message_type"` - cachedJSON []byte - cachedJSONLite []byte + Data Data `json:"data"` + MessageType string `json:"message_type"` + cachedJSON []byte + cachedJSONLite []byte + cachedJSONDomains []byte } // Clone returns a new copy of the Entry. func (e *Entry) Clone() Entry { return Entry{ - Data: e.Data, - MessageType: e.MessageType, - cachedJSON: e.cachedJSON, - cachedJSONLite: e.cachedJSONLite, + Data: e.Data, + MessageType: e.MessageType, + cachedJSON: e.cachedJSON, + cachedJSONLite: e.cachedJSONLite, + cachedJSONDomains: e.cachedJSONDomains, } } @@ -61,6 +63,10 @@ func (e *Entry) JSONLiteNoCache() []byte { // JSONDomains returns the JSON encoded domains (DomainsEntry) as byte slice. func (e *Entry) JSONDomains() []byte { + if len(e.cachedJSONDomains) > 0 { + return e.cachedJSONDomains + } + domainsEntry := DomainsEntry{ Data: e.Data.LeafCert.AllDomains, MessageType: "dns_entries", @@ -71,6 +77,8 @@ func (e *Entry) JSONDomains() []byte { log.Println(err) } + e.cachedJSONDomains = domainsEntryBytes + return domainsEntryBytes }