waku-org/go-waku

View on GitHub
cmd/waku/server/rest/waku_rest.go

Summary

Maintainability
A
0 mins
Test Coverage
D
61%
package rest

import (
    "context"
    "fmt"
    "net/http"
    "sync"

    "github.com/go-chi/chi/v5"
    "github.com/go-chi/chi/v5/middleware"
    "github.com/waku-org/go-waku/waku/v2/node"
    "go.uber.org/zap"
)

type WakuRest struct {
    node   *node.WakuNode
    server *http.Server

    log *zap.Logger

    relayService  *RelayService
    filterService *FilterService
}

type RestConfig struct {
    Address             string
    Port                uint
    EnablePProf         bool
    EnableAdmin         bool
    RelayCacheCapacity  uint
    FilterCacheCapacity uint
}

func NewWakuRest(node *node.WakuNode, config RestConfig, log *zap.Logger) *WakuRest {
    wrpc := new(WakuRest)
    wrpc.log = log.Named("rest")

    mux := chi.NewRouter()
    mux.Use(middleware.Logger)
    mux.Use(middleware.NoCache)
    mux.Use(func(h http.Handler) http.Handler {
        fn := func(w http.ResponseWriter, r *http.Request) {
            w.Header().Set("Access-Control-Allow-Origin", "*")
            h.ServeHTTP(w, r)
        }
        return http.HandlerFunc(fn)
    })
    if config.EnablePProf {
        mux.Mount("/debug", middleware.Profiler())
    }

    _ = NewDebugService(node, mux)
    _ = NewHealthService(node, mux)
    _ = NewStoreQueryService(node, mux)
    _ = NewLegacyStoreService(node, mux)
    _ = NewLightpushService(node, mux, log)

    listenAddr := fmt.Sprintf("%s:%d", config.Address, config.Port)

    server := &http.Server{
        Addr:    listenAddr,
        Handler: mux,
    }

    wrpc.node = node
    wrpc.server = server

    if node.Relay() != nil {
        relayService := NewRelayService(node, mux, config.RelayCacheCapacity, log)
        wrpc.relayService = relayService
    }

    if config.EnableAdmin {
        _ = NewAdminService(node, mux, wrpc.log)
    }

    if node.FilterLightnode() != nil {
        filterService := NewFilterService(node, mux, int(config.FilterCacheCapacity), log)
        server.RegisterOnShutdown(func() {
            filterService.Stop()
        })
        wrpc.filterService = filterService
    }

    return wrpc
}

func (r *WakuRest) Start(ctx context.Context, wg *sync.WaitGroup) {
    defer wg.Done()

    if r.node.FilterLightnode() != nil {
        go r.filterService.Start(ctx)
    }

    go func() {
        _ = r.server.ListenAndServe()
    }()
    r.log.Info("server started", zap.String("addr", r.server.Addr))
}

func (r *WakuRest) Stop(ctx context.Context) error {
    r.log.Info("shutting down server")
    return r.server.Shutdown(ctx)
}