gin/render/ssevent.go

62 lines
1.3 KiB
Go
Raw Normal View History

2015-05-12 16:33:41 +00:00
package render
import (
"encoding/json"
"fmt"
"net/http"
"reflect"
)
type sseRender struct{}
var SSEvent Render = sseRender{}
func (_ sseRender) Render(w http.ResponseWriter, code int, data ...interface{}) error {
eventName := data[0].(string)
obj := data[1]
return WriteSSEvent(w, eventName, obj)
}
func WriteSSEvent(w http.ResponseWriter, eventName string, data interface{}) error {
header := w.Header()
if len(header.Get("Content-Type")) == 0 {
w.Header().Set("Content-Type", "text/event-stream")
}
var stringData string
switch typeOfData(data) {
2015-05-13 00:34:46 +00:00
case reflect.Struct, reflect.Slice, reflect.Map:
2015-05-12 16:33:41 +00:00
if jsonBytes, err := json.Marshal(data); err == nil {
stringData = string(jsonBytes)
} else {
return err
}
case reflect.Ptr:
2015-05-13 00:34:46 +00:00
stringData = escape(fmt.Sprintf("%v", &data))
2015-05-12 16:33:41 +00:00
default:
2015-05-13 00:34:46 +00:00
stringData = escape(fmt.Sprintf("%v", data))
2015-05-12 16:33:41 +00:00
}
2015-05-13 00:34:46 +00:00
_, err := fmt.Fprintf(w, "event: %s\ndata: %s\n\n", escape(eventName), stringData)
2015-05-12 16:33:41 +00:00
return err
}
func typeOfData(data interface{}) reflect.Kind {
value := reflect.ValueOf(data)
valueType := value.Kind()
if valueType == reflect.Ptr {
newValue := value.Elem().Kind()
2015-05-13 00:34:46 +00:00
fmt.Println(newValue)
if newValue == reflect.Struct ||
newValue == reflect.Slice ||
newValue == reflect.Map {
2015-05-12 16:33:41 +00:00
return newValue
} else {
return valueType
}
}
return valueType
}
func escape(str string) string {
return str
}