Skip to content

Instantly share code, notes, and snippets.

@goFrendiAsgard
Last active February 6, 2019 00:06
Show Gist options
  • Save goFrendiAsgard/bcde37dd6f53644360c686b89a23ad38 to your computer and use it in GitHub Desktop.
Save goFrendiAsgard/bcde37dd6f53644360c686b89a23ad38 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"net/http"
)
type EventMessage struct {
Event string
Message interface{}
}
type Listener func(message interface{})
func screamListener1(message interface{}) {
fmt.Println("[scream listener 1]", message)
}
func screamListener2(message interface{}) {
fmt.Println("[scream listener 2]", message)
}
func main() {
channel := make(chan EventMessage)
eventListeners := make(map[string][]Listener)
// register event listeners
eventListeners["scream"] = []Listener{
screamListener1, screamListener2,
}
// catch event and trigger corresponding listener
go func() {
for {
fmt.Println("Receive messages")
eventMessage := <-channel
fmt.Println("Message received")
event, message := eventMessage.Event, eventMessage.Message
listeners := eventListeners[event]
for _, listener := range listeners {
listener(message)
}
}
}()
// emit event `scream Argh`
fmt.Println("Send messages Argh")
channel <- EventMessage{"scream", "Argh"}
// emit event `scream Hi`
fmt.Println("Send messages Hi")
channel <- EventMessage{"scream", "Hi"}
// create HTTP handler (i.e: our API Gateway)
handler := http.HandlerFunc(func (writer http.ResponseWriter, request *http.Request) {
fmt.Fprintf(writer, "hello, you've hit %s\n", request.URL.Path)
// emit event `scream whatever the url path is`
fmt.Println("Send messages", request.URL.Path)
channel <- EventMessage{"scream", request.URL.Path}
})
// serve HTTP server
http.ListenAndServe(":9999", handler)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment