WASM: use persistent writer, fix connection lost from lock churn
This commit is contained in:
@@ -12,6 +12,7 @@ import (
|
|||||||
// wtConn wraps a browser WebTransport connection as a mosh.Conn.
|
// wtConn wraps a browser WebTransport connection as a mosh.Conn.
|
||||||
type wtConn struct {
|
type wtConn struct {
|
||||||
transport js.Value
|
transport js.Value
|
||||||
|
writer js.Value // persistent writable stream writer
|
||||||
incoming chan []byte
|
incoming chan []byte
|
||||||
done chan struct{}
|
done chan struct{}
|
||||||
once sync.Once
|
once sync.Once
|
||||||
@@ -56,8 +57,11 @@ func dialWebTransport(url string) (*wtConn, error) {
|
|||||||
onReady.Release()
|
onReady.Release()
|
||||||
onFail.Release()
|
onFail.Release()
|
||||||
|
|
||||||
|
writer := wt.Get("datagrams").Get("writable").Call("getWriter")
|
||||||
|
|
||||||
c := &wtConn{
|
c := &wtConn{
|
||||||
transport: wt,
|
transport: wt,
|
||||||
|
writer: writer,
|
||||||
incoming: make(chan []byte, 256),
|
incoming: make(chan []byte, 256),
|
||||||
done: make(chan struct{}),
|
done: make(chan struct{}),
|
||||||
}
|
}
|
||||||
@@ -132,11 +136,9 @@ func (c *wtConn) Read(b []byte) (int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *wtConn) Write(b []byte) (int, error) {
|
func (c *wtConn) Write(b []byte) (int, error) {
|
||||||
writer := c.transport.Get("datagrams").Get("writable").Call("getWriter")
|
|
||||||
arr := js.Global().Get("Uint8Array").New(len(b))
|
arr := js.Global().Get("Uint8Array").New(len(b))
|
||||||
js.CopyBytesToJS(arr, b)
|
js.CopyBytesToJS(arr, b)
|
||||||
writer.Call("write", arr)
|
c.writer.Call("write", arr)
|
||||||
writer.Call("releaseLock")
|
|
||||||
return len(b), nil
|
return len(b), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user