Initial upload

This commit is contained in:
MassiveBox 2025-05-29 22:52:44 +02:00
commit cefd7abe8a
Signed by: massivebox
GPG key ID: 9B74D3A59181947D
19 changed files with 1027 additions and 0 deletions

56
fcast/events.go Normal file
View file

@ -0,0 +1,56 @@
package fcast
import (
"encoding/json"
"log"
"reflect"
"sync"
)
type EventHandler func(message Message)
type CodeRegistry struct {
handler EventHandler
constructor func() Message
}
type EventManager struct {
codes map[OpCode]CodeRegistry
mu sync.RWMutex
}
func (em *EventManager) SetHandler(message Message, handler EventHandler) {
em.mu.Lock()
defer em.mu.Unlock()
if em.codes == nil {
em.codes = make(map[OpCode]CodeRegistry)
}
em.codes[message.getOpCode()] = CodeRegistry{
handler: handler,
constructor: func() Message {
return reflect.New(reflect.TypeOf(message)).Interface().(Message)
},
}
}
func (em *EventManager) dispatchMessage(raw *RawMessage) error {
if _, exists := em.codes[raw.Header.OpCode]; !exists {
log.Printf("[INFO] fcast: Got a message without a listener - OpCode=%d, Size=%d, Body=%s\n", raw.Header.OpCode, raw.Header.Size, string(raw.Body))
return nil
}
constructor := em.codes[raw.Header.OpCode].constructor
handler := em.codes[raw.Header.OpCode].handler
msg := constructor()
if len(raw.Body) > 0 {
if err := json.Unmarshal(raw.Body, msg); err != nil {
return err
}
}
handler(msg)
return nil
}