1 // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
2 // Use of this source code is governed by a MIT style
3 // license that can be found in the LICENSE file.
18 // W3C Working Draft 29 October 2009
19 // http://www.w3.org/TR/2009/WD-eventsource-20091029/
21 const ContentType = "text/event-stream"
23 var contentType = []string{ContentType}
24 var noCache = []string{"no-cache"}
26 var fieldReplacer = strings.NewReplacer(
30 var dataReplacer = strings.NewReplacer(
41 func Encode(writer io.Writer, event Event) error {
42 w := checkWriter(writer)
44 writeEvent(w, event.Event)
45 writeRetry(w, event.Retry)
46 return writeData(w, event.Data)
49 func writeId(w stringWriter, id string) {
52 fieldReplacer.WriteString(w, id)
57 func writeEvent(w stringWriter, event string) {
59 w.WriteString("event:")
60 fieldReplacer.WriteString(w, event)
65 func writeRetry(w stringWriter, retry uint) {
67 w.WriteString("retry:")
68 w.WriteString(strconv.FormatUint(uint64(retry), 10))
73 func writeData(w stringWriter, data interface{}) error {
74 w.WriteString("data:")
75 switch kindOfData(data) {
76 case reflect.Struct, reflect.Slice, reflect.Map:
77 err := json.NewEncoder(w).Encode(data)
83 dataReplacer.WriteString(w, fmt.Sprint(data))
89 func (r Event) Render(w http.ResponseWriter) error {
94 func (r Event) WriteContentType(w http.ResponseWriter) {
96 header["Content-Type"] = contentType
98 if _, exist := header["Cache-Control"]; !exist {
99 header["Cache-Control"] = noCache
103 func kindOfData(data interface{}) reflect.Kind {
104 value := reflect.ValueOf(data)
105 valueType := value.Kind()
106 if valueType == reflect.Ptr {
107 valueType = value.Elem().Kind()