added universal plugin chaining

This commit is contained in:
devinchristianson
2019-12-28 19:54:12 +00:00
parent c828f85896
commit b6453a769f
+34 -18
View File
@@ -10,28 +10,11 @@ var (
pluginMu sync.RWMutex
plugins = make(map[string]Plugin)
activePlugins = make(map[string]Plugin)
universalPlugins = make(map[string]UniversalHandlerPlugin)
universalPlugins [] UniversalHandlerPlugin
endpointMappings = make(map[string]func(http.ResponseWriter, *http.Request))
mux *http.ServeMux
)
//SetupPlugins activates plugins and loads endpoints
func SetupPlugins(m *http.ServeMux, names[] string) {
for _, n := range names {
if _, exists := plugins[n]; !exists {
log.Fatalf("Plugin %s does not exist", n)
}
plugins[n].Activate()
if _, universal := plugins[n].(UniversalHandlerPlugin); universal {
universalPlugins[n] = plugins[n].(UniversalHandlerPlugin)
}
}
mux = m
for key, element := range endpointMappings {
mux.HandleFunc(key, element)
}
}
//Plugin is an interface defining all plugin exported functions
type Plugin interface {
Activate() //should register endpoints and add database tables etc
@@ -43,6 +26,39 @@ type UniversalHandlerPlugin interface {
UniversalHandler(http.HandlerFunc) http.HandlerFunc
}
//SetupPlugins activates plugins and loads endpoints
func SetupPlugins(m *http.ServeMux, names[] string) {
for _, n := range names {
if _, exists := plugins[n]; !exists {
log.Fatalf("Plugin %s does not exist", n)
}
plugins[n].Activate()
if p, universal := plugins[n].(UniversalHandlerPlugin); universal {
universalPlugins = append(universalPlugins, p)
}
}
mux = m
for key, element := range endpointMappings {
mux.HandleFunc(key, chainUniversalHandlers(element))
}
}
func chainUniversalHandlers(h http.HandlerFunc) http.HandlerFunc {
if len(universalPlugins) < 1 {
return h
}
wrapped := h
// loop in reverse to preserve middleware order
for i := len(universalPlugins) - 1; i >= 0; i-- {
wrapped = universalPlugins[i].UniversalHandler(wrapped)
}
return wrapped
}
//RegisterPlugin registers plugins. Should be called using init in plugin package
func RegisterPlugin(name string, p Plugin) {
pluginMu.Lock()