|
- package decoder
-
- import (
- "bytes"
- "context"
- "encoding/hex"
- "fmt"
- "strings"
-
- "github.com/AFASystems/presence/internal/pkg/common/appcontext"
- "github.com/AFASystems/presence/internal/pkg/common/utils"
- "github.com/AFASystems/presence/internal/pkg/model"
- "github.com/segmentio/kafka-go"
- )
-
- // processIncoming processes incoming beacon advertisements
- func processIncoming(adv model.BeaconAdvertisement, appState *appcontext.AppState, writer kafkaWriter, parserRegistry *model.ParserRegistry) {
- err := decodeBeacon(adv, appState, writer, parserRegistry)
- if err != nil {
- eMsg := fmt.Sprintf("Error in decoding: %v", err)
- fmt.Println(eMsg)
- return
- }
- }
-
- // decodeBeacon decodes beacon data and publishes events
- func decodeBeacon(adv model.BeaconAdvertisement, appState *appcontext.AppState, writer kafkaWriter, parserRegistry *model.ParserRegistry) error {
- beacon := strings.TrimSpace(adv.Data)
- id := adv.ID
- if beacon == "" {
- return nil
- }
-
- b, err := hex.DecodeString(beacon)
- if err != nil {
- return err
- }
-
- b = utils.RemoveFlagBytes(b)
-
- indeces := utils.ParseADFast(b)
- event := utils.LoopADStructures(b, indeces, id, parserRegistry)
-
- if event.ID == "" {
- return nil
- }
-
- prevEvent, ok := appState.GetBeaconEvent(id)
- appState.UpdateBeaconEvent(id, event)
- if ok && bytes.Equal(prevEvent.Hash(), event.Hash()) {
- return nil
- }
-
- eMsg, err := event.ToJSON()
- if err != nil {
- return err
- }
-
- if err := writer.WriteMessages(context.Background(), kafka.Message{Value: eMsg}); err != nil {
- return err
- }
-
- return nil
- }
-
- // kafkaWriter interface defines the methods we need from kafka.Writer
- type kafkaWriter interface {
- WriteMessages(ctx context.Context, msgs ...kafka.Message) error
- }
|