From 606d2ee00c8d668ff6885d84d354410be58322ca Mon Sep 17 00:00:00 2001 From: oleiade Date: Fri, 7 Jul 2023 14:21:23 +0200 Subject: [PATCH 1/7] Add a `promises` package with a `MakeHandledPromise` helper. This helper function makes it convenient to create a promise in the context of k6 module/extension Go code. --- js/promises/promises.go | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 js/promises/promises.go diff --git a/js/promises/promises.go b/js/promises/promises.go new file mode 100644 index 00000000000..7bc285cb98d --- /dev/null +++ b/js/promises/promises.go @@ -0,0 +1,46 @@ +// Package promises provides helpers for working with promises in k6. +package promises + +import ( + "github.com/dop251/goja" + "go.k6.io/k6/js/modules" +) + +// MakeHandledPromise can be used to create promises that will be dispatched to k6's event loop. +// +// Calling the function will create a goja promise and return its `resolve` and `reject` callbacks, wrapped +// in such a way that it will block the k6 JS runtime's event loop from exiting before they are +// called, even if the promise isn't revoled by the time the current script ends executing. +// +// A typical usage would be: +// +// func myAsynchronousFunc(vu modules.VU) *(goja.Promise) { +// promise, resolve, reject := promises.MakeHandledPromise(vu) +// go func() { +// v, err := someAsyncFunc() +// if err != nil { +// reject(err) +// return +// } +// +// resolve(v) +// }() +// return promise +// } +func MakeHandledPromise(vu modules.VU) (*goja.Promise, func(interface{}), func(interface{})) { + runtime := vu.Runtime() + callback := vu.RegisterCallback() + promise, resolve, reject := runtime.NewPromise() + + return promise, func(i interface{}) { + callback(func() error { + resolve(i) + return nil + }) + }, func(i interface{}) { + callback(func() error { + reject(i) + return nil + }) + } +} From 0fe402c589ba125faf0429c20acc4d6bc0a50694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Crevon?= Date: Fri, 7 Jul 2023 15:17:08 +0200 Subject: [PATCH 2/7] Apply suggestions from code review Co-authored-by: Mihail Stoykov <312246+mstoykov@users.noreply.github.com> --- js/promises/promises.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/promises/promises.go b/js/promises/promises.go index 7bc285cb98d..9a0519245d8 100644 --- a/js/promises/promises.go +++ b/js/promises/promises.go @@ -10,7 +10,7 @@ import ( // // Calling the function will create a goja promise and return its `resolve` and `reject` callbacks, wrapped // in such a way that it will block the k6 JS runtime's event loop from exiting before they are -// called, even if the promise isn't revoled by the time the current script ends executing. +// called, even if the promise isn't resolved by the time the current script ends executing. // // A typical usage would be: // @@ -27,10 +27,10 @@ import ( // }() // return promise // } -func MakeHandledPromise(vu modules.VU) (*goja.Promise, func(interface{}), func(interface{})) { +func MakeHandledPromise(vu modules.VU) (promise *Promise, resolve func(result interface{}), reject func(reason interface{})) { runtime := vu.Runtime() - callback := vu.RegisterCallback() promise, resolve, reject := runtime.NewPromise() + callback := vu.RegisterCallback() return promise, func(i interface{}) { callback(func() error { From 084c1d3f9db4a8105dc2fea6ff07b59ad658795a Mon Sep 17 00:00:00 2001 From: oleiade Date: Fri, 7 Jul 2023 15:32:13 +0200 Subject: [PATCH 3/7] Address issues introduced by accepted suggestions --- js/promises/promises.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/promises/promises.go b/js/promises/promises.go index 9a0519245d8..544db0be887 100644 --- a/js/promises/promises.go +++ b/js/promises/promises.go @@ -27,9 +27,9 @@ import ( // }() // return promise // } -func MakeHandledPromise(vu modules.VU) (promise *Promise, resolve func(result interface{}), reject func(reason interface{})) { +func MakeHandledPromise(vu modules.VU) (promise *goja.Promise, resolve func(result interface{}), reject func(reason interface{})) { runtime := vu.Runtime() - promise, resolve, reject := runtime.NewPromise() + promise, resolve, reject = runtime.NewPromise() callback := vu.RegisterCallback() return promise, func(i interface{}) { From 5063abe373fc2d5d406e7a830a9a53b2c0b1bd02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Crevon?= Date: Mon, 10 Jul 2023 09:59:35 +0200 Subject: [PATCH 4/7] Update js/promises/promises.go Co-authored-by: Ivan <2103732+codebien@users.noreply.github.com> --- js/promises/promises.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/promises/promises.go b/js/promises/promises.go index 544db0be887..59f11b9d1a1 100644 --- a/js/promises/promises.go +++ b/js/promises/promises.go @@ -9,7 +9,7 @@ import ( // MakeHandledPromise can be used to create promises that will be dispatched to k6's event loop. // // Calling the function will create a goja promise and return its `resolve` and `reject` callbacks, wrapped -// in such a way that it will block the k6 JS runtime's event loop from exiting before they are +// in such a way that it will block the k6 JavaScript runtime's event loop from exiting before they are // called, even if the promise isn't resolved by the time the current script ends executing. // // A typical usage would be: From a5552741d1a66a0e943bff8a7318d0a155d6162d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Crevon?= Date: Mon, 10 Jul 2023 09:59:55 +0200 Subject: [PATCH 5/7] Update js/promises/promises.go Co-authored-by: Ivan <2103732+codebien@users.noreply.github.com> --- js/promises/promises.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/promises/promises.go b/js/promises/promises.go index 59f11b9d1a1..65ba9796f0b 100644 --- a/js/promises/promises.go +++ b/js/promises/promises.go @@ -27,7 +27,7 @@ import ( // }() // return promise // } -func MakeHandledPromise(vu modules.VU) (promise *goja.Promise, resolve func(result interface{}), reject func(reason interface{})) { +func New(vu modules.VU) (p *goja.Promise, resolve func(result any), reject func(reason any)) { runtime := vu.Runtime() promise, resolve, reject = runtime.NewPromise() callback := vu.RegisterCallback() From 3bba8114433f6eb14f5e6f1bbc8440c77586847e Mon Sep 17 00:00:00 2001 From: oleiade Date: Mon, 10 Jul 2023 10:06:16 +0200 Subject: [PATCH 6/7] rename MakeHandledPromise to New --- js/promises/promises.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/promises/promises.go b/js/promises/promises.go index 65ba9796f0b..f64a06be1ad 100644 --- a/js/promises/promises.go +++ b/js/promises/promises.go @@ -6,7 +6,7 @@ import ( "go.k6.io/k6/js/modules" ) -// MakeHandledPromise can be used to create promises that will be dispatched to k6's event loop. +// New can be used to create promises that will be dispatched to k6's event loop. // // Calling the function will create a goja promise and return its `resolve` and `reject` callbacks, wrapped // in such a way that it will block the k6 JavaScript runtime's event loop from exiting before they are @@ -15,7 +15,7 @@ import ( // A typical usage would be: // // func myAsynchronousFunc(vu modules.VU) *(goja.Promise) { -// promise, resolve, reject := promises.MakeHandledPromise(vu) +// promise, resolve, reject := promises.New(vu) // go func() { // v, err := someAsyncFunc() // if err != nil { @@ -29,10 +29,10 @@ import ( // } func New(vu modules.VU) (p *goja.Promise, resolve func(result any), reject func(reason any)) { runtime := vu.Runtime() - promise, resolve, reject = runtime.NewPromise() + p, resolve, reject = runtime.NewPromise() callback := vu.RegisterCallback() - return promise, func(i interface{}) { + return p, func(i interface{}) { callback(func() error { resolve(i) return nil From ebd348634ba6502b62246b080d10d9d425141373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Crevon?= Date: Mon, 10 Jul 2023 10:14:47 +0200 Subject: [PATCH 7/7] Update js/promises/promises.go Co-authored-by: Ivan <2103732+codebien@users.noreply.github.com> --- js/promises/promises.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/js/promises/promises.go b/js/promises/promises.go index f64a06be1ad..775e037b770 100644 --- a/js/promises/promises.go +++ b/js/promises/promises.go @@ -28,8 +28,7 @@ import ( // return promise // } func New(vu modules.VU) (p *goja.Promise, resolve func(result any), reject func(reason any)) { - runtime := vu.Runtime() - p, resolve, reject = runtime.NewPromise() + p, resolve, reject = vu.Runtime().NewPromise() callback := vu.RegisterCallback() return p, func(i interface{}) {