Closed
Description
package main
import (
"github.com/gopherjs/gopherjs/js"
"honnef.co/go/js/util"
)
func main() {
println("initializing")
es := js.Global.Get("EventSource").New("/events")
et := util.EventTarget{Object: es}
et.AddEventListener("message", false, listener)
}
func listener(obj *js.Object) {
println(obj)
}
Will fail in $internalize case $kindStruct
when GopherJS and js/util are vendored:
source.js:2051 Uncaught RangeError: Maximum call stack size exceeded
searchJsObject @ source.js:2051
searchJsObject @ source.js:2063
searchJsObject @ source.js:2060
searchJsObject @ source.js:2063
...
Without vendoring, everything works fine.
You can create a simple EventStream like this (in case you don't have one lying around):
package main
import (
"fmt"
"log"
"net/http"
"time"
)
func main() {
http.HandleFunc("/events", EventsHandler)
log.Fatal(http.ListenAndServeTLS(":8081", "selfsigned.crt", "selfsigned.key", nil))
}
// EventsHandler returns a stream of timestamp messages.
func EventsHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
notify := w.(http.CloseNotifier).CloseNotify()
conn := true
go func() {
<-notify
conn = false
}()
for conn {
fmt.Fprintf(w, "data: %s\n\n", time.Now())
if f, ok := w.(http.Flusher); ok {
f.Flush()
} else {
log.Println("no flush")
}
time.Sleep(2 * time.Second)
}
log.Println("conn closed")
}