diff --git a/interface.go b/interface.go index 28051c1..e27c639 100644 --- a/interface.go +++ b/interface.go @@ -13,3 +13,7 @@ type Relay interface { SaveEvent(*event.Event) error QueryEvents(*filter.EventFilter) ([]event.Event, error) } + +type Injector interface { + InjectEvents() chan event.Event +} diff --git a/listener.go b/listener.go index 6927767..c816bf4 100644 --- a/listener.go +++ b/listener.go @@ -15,6 +15,39 @@ type Listener struct { var listeners = make(map[*websocket.Conn]map[string]*Listener) var listenersMutex = sync.Mutex{} +func GetListeningFilters() filter.EventFilters { + var respfilters = make(filter.EventFilters, 0, len(listeners)*2) + + listenersMutex.Lock() + defer func() { + listenersMutex.Unlock() + }() + + // here we go through all the existing listeners + for _, connlisteners := range listeners { + for _, listener := range connlisteners { + for _, listenerfilter := range listener.filters { + for _, respfilter := range respfilters { + // check if this filter specifically is already added to respfilters + if filter.Equal(listenerfilter, respfilter) { + goto nextconn + } + } + + // field not yet present on respfilters, add it + respfilters = append(respfilters, listenerfilter) + + // continue to the next filter + nextconn: + continue + } + } + } + + // respfilters will be a slice with all the distinct filter we currently have active + return respfilters +} + func setListener(id string, conn *websocket.Conn, filters filter.EventFilters) { listenersMutex.Lock() defer func() { diff --git a/relayer.go b/start.go similarity index 87% rename from relayer.go rename to start.go index d19fb95..465df34 100644 --- a/relayer.go +++ b/start.go @@ -27,9 +27,16 @@ func Start(relay Relay) { Log.Fatal().Err(err).Msg("failed to start") } - // NIP01 router.Path("/").Methods("GET").HandlerFunc(handleWebsocket(relay)) + if inj, ok := relay.(Injector); ok { + go func() { + for event := range inj.InjectEvents() { + notifyListeners(&event) + } + }() + } + srv := &http.Server{ Handler: cors.Default().Handler(router), Addr: s.Host + ":" + s.Port,