Skip to content

RangeError when using EventSource with vendored dependencies #537

Closed
@jraedisch

Description

@jraedisch
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")
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions