diff --git a/internal/js/modules/k6/websockets/websockets.go b/internal/js/modules/k6/websockets/websockets.go index 90db42364a..b1813c288d 100644 --- a/internal/js/modules/k6/websockets/websockets.go +++ b/internal/js/modules/k6/websockets/websockets.go @@ -648,6 +648,7 @@ func (w *webSocket) send(msg sobek.Value) { common.Throw(rt, fmt.Errorf("got error while trying to export ArrayBufferView to bytes: %w", err)) } + w.bufferedAmount += len(b) w.writeQueueCh <- message{ mtype: websocket.BinaryMessage, data: b, diff --git a/internal/js/modules/k6/websockets/websockets_test.go b/internal/js/modules/k6/websockets/websockets_test.go index 8bc17ec598..075606f9d7 100644 --- a/internal/js/modules/k6/websockets/websockets_test.go +++ b/internal/js/modules/k6/websockets/websockets_test.go @@ -1523,6 +1523,7 @@ func TestArrayBufferViewSupport(t *testing.T) { t.Parallel() testArrayBufferViewSupport(t, name) + testArrayBufferViewBufferedAmount(t, name) }) } } @@ -1553,6 +1554,33 @@ func testArrayBufferViewSupport(t *testing.T, viewName string) { require.Len(t, logs, 0) } +func testArrayBufferViewBufferedAmount(t *testing.T, viewName string) { + t.Helper() + ts := newTestState(t) + logger, hook := testutils.NewLoggerWithHook(t, logrus.WarnLevel) + ts.runtime.VU.StateField.Logger = logger + _, err := ts.runtime.RunOnEventLoop(ts.tb.Replacer.Replace(fmt.Sprintf(` + var ws = new WebSocket("WSBIN_URL/ws-echo") + ws.addEventListener("open", () => { + const sent = new %[1]s([164, 41]) + ws.send(sent) + if (ws.bufferedAmount != sent.byteLength) { + throw new Error("Expected " + sent.byteLength + " bufferedAmount got " + ws.bufferedAmount); + } + ws.onmessage = async (e) => { + const received = new %[1]s(await e.data.arrayBuffer()); + if (ws.bufferedAmount != 0) { + throw new Error("Expected 0 bufferedAmount got " + ws.bufferedAmount); + } + ws.close() + } + }) + `, viewName))) + require.NoError(t, err) + logs := hook.Drain() + require.Len(t, logs, 0) +} + func TestReadyStateSwitch(t *testing.T) { t.Parallel() ts := newTestState(t)