From 3b8c698025f6c9df84fb637d74a8f1f2606d9c01 Mon Sep 17 00:00:00 2001 From: Mihail Stoykov Date: Thu, 6 Mar 2025 19:32:58 +0200 Subject: [PATCH] Fix race when getting body - fixes #4596 --- .../k6/browser/browser/response_mapping.go | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/internal/js/modules/k6/browser/browser/response_mapping.go b/internal/js/modules/k6/browser/browser/response_mapping.go index f74cf9f72fa..bc87b4c1c2d 100644 --- a/internal/js/modules/k6/browser/browser/response_mapping.go +++ b/internal/js/modules/k6/browser/browser/response_mapping.go @@ -12,6 +12,8 @@ func mapResponseEvent(vu moduleVU, event common.PageOnEvent) mapping { } // mapResponse to the JS module. +// +//nolint:funlen func mapResponse(vu moduleVU, r *common.Response) mapping { if r == nil { return nil @@ -23,14 +25,23 @@ func mapResponse(vu moduleVU, r *common.Response) mapping { }) }, "body": func() *sobek.Promise { - return k6ext.Promise(vu.Context(), func() (any, error) { + rt := vu.Runtime() + promise, res, rej := rt.NewPromise() + callback := vu.RegisterCallback() + go func() { body, err := r.Body() if err != nil { - return nil, err //nolint: wrapcheck + callback(func() error { + return rej(err) + }) + return } - buf := vu.Runtime().NewArrayBuffer(body) - return &buf, nil - }) + callback(func() error { + buf := vu.Runtime().NewArrayBuffer(body) + return res(&buf) + }) + }() + return promise }, "frame": func() mapping { return mapFrame(vu, r.Frame())