whippet/messaging/messaging.go
2025-05-15 15:48:24 +02:00

113 lines
2.7 KiB
Go

package messaging
import (
"time"
"git.espin.casa/albert/whippet/proto"
flatbuffers "github.com/google/flatbuffers/go"
"github.com/google/uuid"
)
type MetaData map[string]string
var builder *flatbuffers.Builder
func Init() {
builder = flatbuffers.NewBuilder(1024)
}
func BuildDataMessage(topic string, payload []byte, metadata MetaData) []byte {
//
builder.Reset()
// auto generate message id
id := uuid.New().String()
idOffset := builder.CreateString(id)
topicOffset := builder.CreateString(topic)
payloadOffset := builder.CreateByteVector(payload)
var kvOffsets []flatbuffers.UOffsetT
for k, v := range metadata {
key := builder.CreateString(k)
val := builder.CreateString(v)
proto.KeyValueStart(builder)
proto.KeyValueAddKey(builder, key)
proto.KeyValueAddValue(builder, val)
kvOffsets = append(kvOffsets, proto.KeyValueEnd(builder))
}
proto.DataMessageStartMetadataVector(builder, len(kvOffsets))
for i := len(kvOffsets) - 1; i >= 0; i-- {
builder.PrependUOffsetT(kvOffsets[i])
}
metadataVec := builder.EndVector(len(kvOffsets))
proto.DataMessageStart(builder)
proto.DataMessageAddId(builder, idOffset)
proto.DataMessageAddTopic(builder, topicOffset)
proto.DataMessageAddTimestamp(builder, uint64(time.Now().UnixNano()))
proto.DataMessageAddPayload(builder, payloadOffset)
proto.DataMessageAddMetadata(builder, metadataVec)
dataMsg := proto.DataMessageEnd(builder)
proto.EnvelopeStart(builder)
proto.EnvelopeAddType(builder, proto.MessageTypeDATA)
proto.EnvelopeAddMessage(builder, dataMsg)
envelope := proto.EnvelopeEnd(builder)
builder.Finish(envelope)
return builder.FinishedBytes()
}
func BuildAckMessage(ackedID string) []byte {
builder.Reset()
ackedIDOffset := builder.CreateString(ackedID)
proto.AckMessageStart(builder)
proto.AckMessageAddAckedId(builder, ackedIDOffset)
proto.AckMessageAddTimestamp(builder, uint64(time.Now().UnixNano()))
ackMsg := proto.AckMessageEnd(builder)
proto.EnvelopeStart(builder)
proto.EnvelopeAddType(builder, proto.MessageTypeACK)
proto.EnvelopeAddMessage(builder, ackMsg)
envelope := proto.EnvelopeEnd(builder)
builder.Finish(envelope)
return builder.FinishedBytes()
}
func BuildHeartBeatMessage(clientID string) []byte {
builder.Reset()
clientIDOffset := builder.CreateString(clientID)
proto.HeartBeatMessageStart(builder)
proto.HeartBeatMessageAddClientId(builder, clientIDOffset)
proto.HeartBeatMessageAddTimestamp(builder, uint64(time.Now().UnixNano()))
heartMsg := proto.HeartBeatMessageEnd(builder)
proto.EnvelopeStart(builder)
proto.EnvelopeAddType(builder, proto.MessageTypeHEARTBEAT)
proto.EnvelopeAddMessage(builder, heartMsg)
envelope := proto.EnvelopeEnd(builder)
builder.Finish(envelope)
return builder.FinishedBytes()
}