From c883df47331d336cf8a34416ad15431c0f854b9f Mon Sep 17 00:00:00 2001 From: wisplite Date: Wed, 8 Apr 2026 10:06:22 -0500 Subject: [PATCH] add tracker methods --- reactivity/tracker.go | 59 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/reactivity/tracker.go b/reactivity/tracker.go index 43e4805..8b67518 100644 --- a/reactivity/tracker.go +++ b/reactivity/tracker.go @@ -1,23 +1,58 @@ package reactivity -import "github.com/gorilla/websocket" +import ( + "sync" +) // TODO: populate with needed structures for tracking state type Tracker struct { + mu sync.RWMutex + + // Maps a Client's UUID to their actual Client struct + clients map[string]*Client + + // Maps a Query Hash (e.g. "getUser?id=1") to a Set of Client IDs + subscriptions map[string]map[string]bool } func NewTracker() *Tracker { - return &Tracker{} + return &Tracker{clients: make(map[string]*Client), subscriptions: make(map[string]map[string]bool)} } -func (t *Tracker) Track(conn *websocket.Conn) {} - -func (t *Tracker) Untrack(conn *websocket.Conn) {} - -func (t *Tracker) SubscribeToQuery(query string) {} - -func (t *Tracker) UnsubscribeFromQuery(query string) {} - -func (t *Tracker) GetQuerySubscriptions() []string { - return []string{} +func (t *Tracker) Track(c *Client) { + t.mu.Lock() + defer t.mu.Unlock() + t.clients[c.ID] = c +} + +func (t *Tracker) Untrack(c *Client) { + t.mu.Lock() + defer t.mu.Unlock() + delete(t.clients, c.ID) +} + +func (t *Tracker) SubscribeToQuery(clientID string, queryHash string) { + t.mu.Lock() + defer t.mu.Unlock() + if t.subscriptions[queryHash] == nil { + t.subscriptions[queryHash] = make(map[string]bool) + } + t.subscriptions[queryHash][clientID] = true +} + +func (t *Tracker) UnsubscribeFromQuery(clientID string, queryHash string) { + t.mu.Lock() + defer t.mu.Unlock() + delete(t.subscriptions[queryHash], clientID) +} + +func (t *Tracker) GetQuerySubscriptions(queryHash string) []string { + t.mu.RLock() + defer t.mu.RUnlock() + subscriptions := t.subscriptions[queryHash] + subscriptionIDs := make([]string, 0, len(subscriptions)) + for clientID := range subscriptions { + subscriptionIDs = append(subscriptionIDs, clientID) + } + return subscriptionIDs }