@isolated-vm/experimental 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/addon/CMakeLists.txt +1 -1
- package/addon/handle/local_of.cc +150 -0
- package/addon/handle/types.cc +8 -137
- package/addon/handle/value_of.cc +82 -27
- package/addon/resolve.js +2 -2
- package/addon/support/callback_info.cc +5 -5
- package/addon/support/callback_storage.cc +2 -2
- package/addon/support/free_function.cc +2 -2
- package/addon/support/initialize.cc +2 -2
- package/addon/transfer/accept.cc +84 -64
- package/addon/transfer/visit.cc +90 -47
- package/addon/value/array.cc +6 -6
- package/addon/value/array_buffer.cc +27 -18
- package/addon/value/function.cc +5 -5
- package/addon/value/function.h.cc +5 -5
- package/addon/value/object.cc +3 -3
- package/addon/value/primitive.cc +36 -36
- package/addon/value/prototype.cc +7 -7
- package/addon/value/record.cc +20 -20
- package/addon/value/value.cc +1 -1
- package/addon/value/vector.cc +9 -9
- package/backend/backend.cts +7 -0
- package/backend/backend.d.cts +87 -0
- package/backend/host.cts +41 -0
- package/backend/require.cts +17 -0
- package/dist/backend/backend.cjs +9 -0
- package/dist/backend/backend.cjs.map +1 -0
- package/dist/backend/backend.d.cts +2 -0
- package/dist/backend/backend.d.cts.map +1 -0
- package/dist/backend/host.cjs +41 -0
- package/dist/backend/host.cjs.map +1 -0
- package/dist/backend/host.d.cts +2 -0
- package/dist/backend/host.d.cts.map +1 -0
- package/dist/backend/require.cjs +19 -0
- package/dist/backend/require.cjs.map +1 -0
- package/dist/backend/require.d.cts +2 -0
- package/dist/backend/require.d.cts.map +1 -0
- package/dist/frontend/agent.d.ts +2 -1
- package/dist/frontend/agent.d.ts.map +1 -1
- package/dist/frontend/agent.js +1 -1
- package/dist/frontend/agent.js.map +1 -1
- package/dist/frontend/module.d.ts +2 -2
- package/dist/frontend/module.d.ts.map +1 -1
- package/dist/frontend/module.js +1 -1
- package/dist/frontend/module.js.map +1 -1
- package/dist/frontend/realm.d.ts +2 -2
- package/dist/frontend/realm.d.ts.map +1 -1
- package/dist/frontend/realm.js +2 -2
- package/dist/frontend/realm.js.map +1 -1
- package/dist/frontend/reference.d.ts +4 -4
- package/dist/frontend/reference.d.ts.map +1 -1
- package/dist/frontend/script.d.ts +1 -1
- package/dist/frontend/script.d.ts.map +1 -1
- package/dist/frontend/script.js +1 -1
- package/dist/frontend/script.js.map +1 -1
- package/dist/isolated-vm.d.ts +1 -1
- package/dist/isolated-vm.d.ts.map +1 -1
- package/dist/isolated-vm.js +1 -1
- package/dist/isolated-vm.js.map +1 -1
- package/dist/test/00.agent/00.prerequisites.d.ts +2 -0
- package/dist/test/00.agent/00.prerequisites.d.ts.map +1 -0
- package/dist/test/00.agent/00.prerequisites.js +25 -0
- package/dist/test/00.agent/00.prerequisites.js.map +1 -0
- package/dist/test/00.agent/10.clock.d.ts +2 -0
- package/dist/test/00.agent/10.clock.d.ts.map +1 -0
- package/dist/test/{00.datetime.js → 00.agent/10.clock.js} +8 -8
- package/dist/test/00.agent/10.clock.js.map +1 -0
- package/dist/test/00.agent/10.random.d.ts +2 -0
- package/dist/test/00.agent/10.random.d.ts.map +1 -0
- package/dist/test/{00.random.js → 00.agent/10.random.js} +4 -4
- package/dist/test/00.agent/10.random.js.map +1 -0
- package/dist/test/10.transfer/00.primitives.d.ts +2 -0
- package/dist/test/10.transfer/00.primitives.d.ts.map +1 -0
- package/dist/test/10.transfer/00.primitives.js +54 -0
- package/dist/test/10.transfer/00.primitives.js.map +1 -0
- package/dist/test/10.transfer/10.array_buffer.d.ts +2 -0
- package/dist/test/10.transfer/10.array_buffer.d.ts.map +1 -0
- package/dist/test/{20.array_buffer.js → 10.transfer/10.array_buffer.js} +90 -84
- package/dist/test/10.transfer/10.array_buffer.js.map +1 -0
- package/dist/test/10.transfer/50.interceptors.d.ts +2 -0
- package/dist/test/10.transfer/50.interceptors.d.ts.map +1 -0
- package/dist/test/10.transfer/50.interceptors.js +108 -0
- package/dist/test/10.transfer/50.interceptors.js.map +1 -0
- package/dist/test/10.transfer/90.regressions.d.ts +2 -0
- package/dist/test/10.transfer/90.regressions.d.ts.map +1 -0
- package/dist/test/10.transfer/90.regressions.js +72 -0
- package/dist/test/10.transfer/90.regressions.js.map +1 -0
- package/dist/test/20.intrinsics/00.script.d.ts +2 -0
- package/dist/test/20.intrinsics/00.script.d.ts.map +1 -0
- package/dist/test/{10.script.js → 20.intrinsics/00.script.js} +7 -7
- package/dist/test/20.intrinsics/00.script.js.map +1 -0
- package/dist/test/20.intrinsics/05.global.d.ts.map +1 -0
- package/dist/test/{05.global.js → 20.intrinsics/05.global.js} +5 -5
- package/dist/test/20.intrinsics/05.global.js.map +1 -0
- package/dist/test/20.intrinsics/10.reference.d.ts.map +1 -0
- package/dist/test/{10.reference.js → 20.intrinsics/10.reference.js} +15 -15
- package/dist/test/20.intrinsics/10.reference.js.map +1 -0
- package/dist/test/20.intrinsics/20.module.d.ts +2 -0
- package/dist/test/20.intrinsics/20.module.d.ts.map +1 -0
- package/dist/test/{10.module.js → 20.intrinsics/20.module.js} +18 -18
- package/dist/test/20.intrinsics/20.module.js.map +1 -0
- package/dist/test/50.features/50.timers.d.ts.map +1 -0
- package/dist/test/{50.timers.js → 50.features/50.timers.js} +8 -8
- package/dist/test/50.features/50.timers.js.map +1 -0
- package/dist/test/50.features/90.i18n.d.ts +2 -0
- package/dist/test/50.features/90.i18n.d.ts.map +1 -0
- package/dist/test/{99.i18n.js → 50.features/90.i18n.js} +6 -6
- package/dist/test/50.features/90.i18n.js.map +1 -0
- package/dist/test/90.isolation/00.dispose.d.ts +1 -1
- package/dist/test/90.isolation/00.dispose.d.ts.map +1 -1
- package/dist/test/90.isolation/00.dispose.js +23 -5
- package/dist/test/90.isolation/00.dispose.js.map +1 -1
- package/dist/test/90.isolation/10.memory.d.ts +2 -0
- package/dist/test/90.isolation/10.memory.d.ts.map +1 -0
- package/dist/test/90.isolation/10.memory.js +31 -0
- package/dist/test/90.isolation/10.memory.js.map +1 -0
- package/dist/test/fixtures.js +2 -3
- package/dist/test/fixtures.js.map +1 -1
- package/dist/test/glob.d.ts +2 -0
- package/dist/test/glob.d.ts.map +1 -0
- package/dist/test/glob.js +11 -0
- package/dist/test/glob.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utility/completion.d.ts +2 -1
- package/dist/utility/completion.d.ts.map +1 -1
- package/dist/utility/completion.js +4 -0
- package/dist/utility/completion.js.map +1 -1
- package/frontend/agent.ts +3 -2
- package/frontend/module.ts +2 -2
- package/frontend/realm.ts +2 -2
- package/frontend/reference.ts +4 -4
- package/frontend/script.ts +1 -1
- package/isolated-vm.ts +1 -1
- package/package.json +29 -17
- package/test/00.agent/00.prerequisites.ts +12 -0
- package/test/{00.datetime.ts → 00.agent/10.clock.ts} +7 -7
- package/test/{00.random.ts → 00.agent/10.random.ts} +4 -4
- package/test/10.transfer/00.primitives.ts +47 -0
- package/test/{20.array_buffer.ts → 10.transfer/10.array_buffer.ts} +49 -43
- package/test/10.transfer/50.interceptors.ts +63 -0
- package/test/10.transfer/90.regressions.ts +38 -0
- package/test/{10.script.ts → 20.intrinsics/00.script.ts} +6 -6
- package/test/{05.global.ts → 20.intrinsics/05.global.ts} +5 -5
- package/test/{10.reference.ts → 20.intrinsics/10.reference.ts} +18 -17
- package/test/{10.module.ts → 20.intrinsics/20.module.ts} +17 -17
- package/test/{50.timers.ts → 50.features/50.timers.ts} +8 -8
- package/test/{99.i18n.ts → 50.features/90.i18n.ts} +5 -5
- package/test/90.isolation/00.dispose.ts +12 -5
- package/test/90.isolation/10.memory.ts +19 -0
- package/test/fixtures.ts +5 -5
- package/test/glob.ts +11 -0
- package/utility/completion.ts +6 -1
- package/addon/handle/bound_value.cc +0 -45
- package/backend/backend_v8.d.ts +0 -89
- package/backend/backend_v8.js +0 -18
- package/backend/specifier.ts +0 -20
- package/dist/backend/specifier.d.ts +0 -3
- package/dist/backend/specifier.d.ts.map +0 -1
- package/dist/backend/specifier.js +0 -21
- package/dist/backend/specifier.js.map +0 -1
- package/dist/test/00.datetime.d.ts +0 -2
- package/dist/test/00.datetime.d.ts.map +0 -1
- package/dist/test/00.datetime.js.map +0 -1
- package/dist/test/00.random.d.ts +0 -2
- package/dist/test/00.random.d.ts.map +0 -1
- package/dist/test/00.random.js.map +0 -1
- package/dist/test/00.transfer.d.ts +0 -2
- package/dist/test/00.transfer.d.ts.map +0 -1
- package/dist/test/00.transfer.js +0 -166
- package/dist/test/00.transfer.js.map +0 -1
- package/dist/test/05.global.d.ts.map +0 -1
- package/dist/test/05.global.js.map +0 -1
- package/dist/test/10.module.d.ts +0 -2
- package/dist/test/10.module.d.ts.map +0 -1
- package/dist/test/10.module.js.map +0 -1
- package/dist/test/10.reference.d.ts.map +0 -1
- package/dist/test/10.reference.js.map +0 -1
- package/dist/test/10.script.d.ts +0 -2
- package/dist/test/10.script.d.ts.map +0 -1
- package/dist/test/10.script.js.map +0 -1
- package/dist/test/20.array_buffer.d.ts +0 -2
- package/dist/test/20.array_buffer.d.ts.map +0 -1
- package/dist/test/20.array_buffer.js.map +0 -1
- package/dist/test/50.timers.d.ts.map +0 -1
- package/dist/test/50.timers.js.map +0 -1
- package/dist/test/99.i18n.d.ts +0 -2
- package/dist/test/99.i18n.d.ts.map +0 -1
- package/dist/test/99.i18n.js.map +0 -1
- package/test/00.transfer.ts +0 -132
- /package/dist/test/{05.global.d.ts → 20.intrinsics/05.global.d.ts} +0 -0
- /package/dist/test/{10.reference.d.ts → 20.intrinsics/10.reference.d.ts} +0 -0
- /package/dist/test/{50.timers.d.ts → 50.features/50.timers.d.ts} +0 -0
package/addon/value/array.cc
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
module;
|
|
2
2
|
#include "auto_js/export_tag.h"
|
|
3
3
|
export module isolated_vm:value.array;
|
|
4
|
-
import :handle.
|
|
4
|
+
import :handle.local_of;
|
|
5
5
|
import :value.record;
|
|
6
6
|
import auto_js;
|
|
7
7
|
|
|
8
8
|
namespace isolated_vm {
|
|
9
9
|
using namespace js;
|
|
10
10
|
|
|
11
|
-
//
|
|
12
|
-
class EXPORT
|
|
11
|
+
// local_of<list_tag>
|
|
12
|
+
class EXPORT local_for_array : public local_next<list_tag> {
|
|
13
13
|
public:
|
|
14
|
-
using
|
|
15
|
-
auto set(const runtime_lock& lock, int key,
|
|
16
|
-
static auto make(const runtime_lock& lock, int capacity = 0) ->
|
|
14
|
+
using local_next<list_tag>::local_next;
|
|
15
|
+
auto set(const runtime_lock& lock, int key, local_of<> value) const -> void;
|
|
16
|
+
static auto make(const runtime_lock& lock, int capacity = 0) -> local_of<list_tag>;
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
} // namespace isolated_vm
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module;
|
|
2
2
|
#include "auto_js/export_tag.h"
|
|
3
3
|
export module isolated_vm:value.array_buffer;
|
|
4
|
-
import :handle.
|
|
4
|
+
import :handle.local_of;
|
|
5
5
|
import :handle.value_of;
|
|
6
6
|
import :value.object;
|
|
7
7
|
import auto_js;
|
|
@@ -10,43 +10,52 @@ import std;
|
|
|
10
10
|
namespace isolated_vm {
|
|
11
11
|
using namespace js;
|
|
12
12
|
|
|
13
|
-
//
|
|
14
|
-
class EXPORT
|
|
13
|
+
// local_of<data_block_tag>
|
|
14
|
+
class EXPORT local_for_data_block : public local_next<data_block_tag> {
|
|
15
15
|
public:
|
|
16
|
-
using
|
|
16
|
+
using local_next<data_block_tag>::local_next;
|
|
17
17
|
[[nodiscard]] auto inspect() const -> value_typeof;
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
//
|
|
21
|
-
class EXPORT
|
|
20
|
+
// value_of<data_block_tag>
|
|
21
|
+
class EXPORT value_for_data_block : public value_next<data_block_tag> {
|
|
22
22
|
public:
|
|
23
|
-
using
|
|
23
|
+
using value_next<data_block_tag>::value_next;
|
|
24
24
|
[[nodiscard]] auto byte_length() const -> std::size_t;
|
|
25
25
|
[[nodiscard]] auto data() const -> std::byte*;
|
|
26
26
|
explicit operator js::array_buffer() const;
|
|
27
27
|
explicit operator std::span<std::byte>() const;
|
|
28
28
|
};
|
|
29
29
|
|
|
30
|
-
//
|
|
31
|
-
class EXPORT
|
|
30
|
+
// local_of<array_buffer_tag>
|
|
31
|
+
class EXPORT local_for_array_buffer : public local_next<array_buffer_tag> {
|
|
32
32
|
public:
|
|
33
|
-
using
|
|
34
|
-
static auto make(const runtime_lock& lock, js::array_buffer buffer) ->
|
|
33
|
+
using local_next<array_buffer_tag>::local_next;
|
|
34
|
+
static auto make(const runtime_lock& lock, js::array_buffer buffer) -> local_of<array_buffer_tag>;
|
|
35
35
|
};
|
|
36
36
|
|
|
37
|
-
//
|
|
38
|
-
class EXPORT
|
|
37
|
+
// local_of<array_buffer_view_tag>
|
|
38
|
+
class EXPORT local_for_array_buffer_view : public local_next<array_buffer_view_tag> {
|
|
39
39
|
public:
|
|
40
|
-
using
|
|
40
|
+
using local_next<array_buffer_view_tag>::local_next;
|
|
41
41
|
[[nodiscard]] auto inspect() const -> value_typeof;
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
//
|
|
44
|
+
// value_of<typed_array_tag_of<Type>>
|
|
45
45
|
template <class Type>
|
|
46
|
-
class EXPORT
|
|
46
|
+
class EXPORT value_for_typed_array_of : public value_next<typed_array_tag_of<Type>> {
|
|
47
|
+
public:
|
|
48
|
+
using value_next<typed_array_tag_of<Type>>::value_next;
|
|
49
|
+
[[nodiscard]] auto buffer() const -> local_of<data_block_tag>;
|
|
50
|
+
[[nodiscard]] auto byte_offset() const -> std::size_t;
|
|
51
|
+
[[nodiscard]] auto size() const -> std::size_t;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// value_of<data_view_tag>
|
|
55
|
+
class EXPORT value_for_data_view : public value_next<data_view_tag> {
|
|
47
56
|
public:
|
|
48
|
-
using
|
|
49
|
-
[[nodiscard]] auto buffer() const ->
|
|
57
|
+
using value_next<data_view_tag>::value_next;
|
|
58
|
+
[[nodiscard]] auto buffer() const -> local_of<data_block_tag>;
|
|
50
59
|
[[nodiscard]] auto byte_offset() const -> std::size_t;
|
|
51
60
|
[[nodiscard]] auto size() const -> std::size_t;
|
|
52
61
|
};
|
package/addon/value/function.cc
CHANGED
|
@@ -6,17 +6,17 @@ namespace isolated_vm {
|
|
|
6
6
|
using namespace js;
|
|
7
7
|
|
|
8
8
|
template <class Result>
|
|
9
|
-
auto
|
|
10
|
-
using args_type = std::vector<
|
|
11
|
-
auto undefined = js::transfer_in_strict<
|
|
9
|
+
auto local_for_function::apply(const runtime_lock& lock, auto&& args) -> Result {
|
|
10
|
+
using args_type = std::vector<local_of<>>;
|
|
11
|
+
auto undefined = js::transfer_in_strict<local_of<>>(std::monostate{}, lock);
|
|
12
12
|
auto argv = js::transfer_in_strict<args_type>(std::forward<decltype(args)>(args), lock);
|
|
13
13
|
auto result = invoke(lock, undefined, argv);
|
|
14
14
|
return js::transfer_out<Result>(result, lock);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
template <class Result>
|
|
18
|
-
auto
|
|
19
|
-
using args_type = std::array<
|
|
18
|
+
auto local_for_function::call(const runtime_lock& lock, auto&&... args) -> Result {
|
|
19
|
+
using args_type = std::array<local_of<>, sizeof...(args) + 1>;
|
|
20
20
|
auto argv = js::transfer_in_strict<args_type>(
|
|
21
21
|
std::tuple_cat(
|
|
22
22
|
std::tuple{std::monostate{}},
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
module;
|
|
2
2
|
#include "auto_js/export_tag.h"
|
|
3
3
|
export module isolated_vm:value.function;
|
|
4
|
-
import :handle.
|
|
4
|
+
import :handle.local_of;
|
|
5
5
|
import :support.lock_fwd;
|
|
6
6
|
import :value.primitive;
|
|
7
7
|
|
|
8
8
|
namespace isolated_vm {
|
|
9
9
|
using namespace js;
|
|
10
10
|
|
|
11
|
-
//
|
|
12
|
-
class EXPORT
|
|
11
|
+
// local_of<function_tag>
|
|
12
|
+
class EXPORT local_for_function : public local_next<function_tag> {
|
|
13
13
|
public:
|
|
14
|
-
using
|
|
14
|
+
using local_next<function_tag>::local_next;
|
|
15
15
|
|
|
16
16
|
template <class Result = std::monostate>
|
|
17
17
|
auto apply(const runtime_lock& lock, auto&& args) -> Result;
|
|
@@ -20,7 +20,7 @@ class EXPORT value_for_function : public value_next<function_tag> {
|
|
|
20
20
|
auto call(const runtime_lock& lock, auto&&... args) -> Result;
|
|
21
21
|
|
|
22
22
|
private:
|
|
23
|
-
auto invoke(const runtime_lock& lock,
|
|
23
|
+
auto invoke(const runtime_lock& lock, local_of<> that, std::span<local_of<>> argv) -> local_of<>;
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
} // namespace isolated_vm
|
package/addon/value/object.cc
CHANGED
|
@@ -6,10 +6,10 @@ import :value.primitive;
|
|
|
6
6
|
namespace isolated_vm {
|
|
7
7
|
using namespace js;
|
|
8
8
|
|
|
9
|
-
//
|
|
10
|
-
class EXPORT
|
|
9
|
+
// local_of<object_tag>
|
|
10
|
+
class EXPORT local_for_object : public local_next<object_tag> {
|
|
11
11
|
public:
|
|
12
|
-
using
|
|
12
|
+
using local_next<object_tag>::local_next;
|
|
13
13
|
[[nodiscard]] auto inspect() const -> value_typeof;
|
|
14
14
|
};
|
|
15
15
|
|
package/addon/value/primitive.cc
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module;
|
|
2
2
|
#include "auto_js/export_tag.h"
|
|
3
3
|
export module isolated_vm:value.primitive;
|
|
4
|
-
import :handle.
|
|
4
|
+
import :handle.local_of;
|
|
5
5
|
import :handle.value_of;
|
|
6
6
|
import auto_js;
|
|
7
7
|
import std;
|
|
@@ -50,9 +50,9 @@ export enum class value_typeof : std::uint8_t {
|
|
|
50
50
|
};
|
|
51
51
|
|
|
52
52
|
// value & primitive
|
|
53
|
-
class EXPORT
|
|
53
|
+
class EXPORT local_for_value : public local_next<value_tag> {
|
|
54
54
|
public:
|
|
55
|
-
using
|
|
55
|
+
using local_next<value_tag>::local_next;
|
|
56
56
|
[[nodiscard]] auto is_array() const -> bool;
|
|
57
57
|
[[nodiscard]] auto is_bigint() const -> bool;
|
|
58
58
|
[[nodiscard]] auto is_boolean() const -> bool;
|
|
@@ -65,90 +65,90 @@ class EXPORT value_for_value : public value_next<value_tag> {
|
|
|
65
65
|
[[nodiscard]] auto inspect() const -> value_typeof;
|
|
66
66
|
};
|
|
67
67
|
|
|
68
|
-
class EXPORT
|
|
68
|
+
class EXPORT local_for_primitive : public local_next<primitive_tag> {
|
|
69
69
|
public:
|
|
70
|
-
using
|
|
70
|
+
using local_next<primitive_tag>::local_next;
|
|
71
71
|
[[nodiscard]] auto inspect() const -> value_typeof;
|
|
72
72
|
};
|
|
73
73
|
|
|
74
74
|
// null & undefined
|
|
75
|
-
class EXPORT
|
|
75
|
+
class EXPORT local_for_undefined : public local_next<undefined_tag> {
|
|
76
76
|
public:
|
|
77
|
-
using
|
|
78
|
-
static auto make(const basic_lock& lock) ->
|
|
77
|
+
using local_next<undefined_tag>::local_next;
|
|
78
|
+
static auto make(const basic_lock& lock) -> local_of<undefined_tag>;
|
|
79
79
|
};
|
|
80
80
|
|
|
81
|
-
class EXPORT
|
|
81
|
+
class EXPORT local_for_null : public local_next<null_tag> {
|
|
82
82
|
public:
|
|
83
|
-
using
|
|
84
|
-
static auto make(const basic_lock& lock) ->
|
|
83
|
+
using local_next<null_tag>::local_next;
|
|
84
|
+
static auto make(const basic_lock& lock) -> local_of<null_tag>;
|
|
85
85
|
};
|
|
86
86
|
|
|
87
87
|
// boolean
|
|
88
|
-
class EXPORT
|
|
88
|
+
class EXPORT local_for_boolean : public local_next<boolean_tag> {
|
|
89
89
|
public:
|
|
90
|
-
using
|
|
91
|
-
static auto make(const basic_lock& lock, bool value) ->
|
|
90
|
+
using local_next<boolean_tag>::local_next;
|
|
91
|
+
static auto make(const basic_lock& lock, bool value) -> local_of<boolean_tag>;
|
|
92
92
|
};
|
|
93
93
|
|
|
94
|
-
class EXPORT
|
|
94
|
+
class EXPORT value_for_boolean : public value_next<boolean_tag> {
|
|
95
95
|
public:
|
|
96
|
-
using
|
|
96
|
+
using value_next<boolean_tag>::value_next;
|
|
97
97
|
[[nodiscard]] explicit operator bool() const;
|
|
98
98
|
};
|
|
99
99
|
|
|
100
100
|
// number
|
|
101
|
-
class EXPORT
|
|
101
|
+
class EXPORT local_for_number : public local_next<number_tag> {
|
|
102
102
|
public:
|
|
103
|
-
using
|
|
103
|
+
using local_next<number_tag>::local_next;
|
|
104
104
|
[[nodiscard]] auto inspect() const -> value_typeof;
|
|
105
|
-
static auto make(const basic_lock& lock, double value) ->
|
|
106
|
-
static auto make(const basic_lock& lock, std::int32_t value) ->
|
|
105
|
+
static auto make(const basic_lock& lock, double value) -> local_of<number_tag_of<double>>;
|
|
106
|
+
static auto make(const basic_lock& lock, std::int32_t value) -> local_of<number_tag_of<std::int32_t>>;
|
|
107
107
|
};
|
|
108
108
|
|
|
109
|
-
class EXPORT
|
|
109
|
+
class EXPORT value_for_number : public value_next<number_tag> {
|
|
110
110
|
public:
|
|
111
|
-
using
|
|
111
|
+
using value_next<number_tag>::value_next;
|
|
112
112
|
[[nodiscard]] explicit operator double() const;
|
|
113
113
|
[[nodiscard]] explicit operator std::int32_t() const;
|
|
114
114
|
};
|
|
115
115
|
|
|
116
116
|
// name
|
|
117
|
-
class EXPORT
|
|
117
|
+
class EXPORT local_for_name : public local_next<name_tag> {
|
|
118
118
|
public:
|
|
119
|
-
using
|
|
119
|
+
using local_next<name_tag>::local_next;
|
|
120
120
|
[[nodiscard]] auto inspect() const -> value_typeof;
|
|
121
121
|
};
|
|
122
122
|
|
|
123
123
|
// string
|
|
124
|
-
class EXPORT
|
|
124
|
+
class EXPORT local_for_string : public local_next<string_tag> {
|
|
125
125
|
public:
|
|
126
|
-
using
|
|
126
|
+
using local_next<string_tag>::local_next;
|
|
127
127
|
[[nodiscard]] auto inspect() const -> value_typeof;
|
|
128
128
|
[[nodiscard]] auto is_latin1() const -> bool;
|
|
129
|
-
static auto make(const basic_lock& lock, std::u16string_view value) ->
|
|
130
|
-
static auto make(const basic_lock& lock, std::string_view value) ->
|
|
129
|
+
static auto make(const basic_lock& lock, std::u16string_view value) -> local_of<string_tag_of<char16_t>>;
|
|
130
|
+
static auto make(const basic_lock& lock, std::string_view value) -> local_of<string_tag_of<char>>;
|
|
131
131
|
};
|
|
132
132
|
|
|
133
|
-
class EXPORT
|
|
133
|
+
class EXPORT value_for_string : public value_next<string_tag> {
|
|
134
134
|
public:
|
|
135
|
-
using
|
|
135
|
+
using value_next<string_tag>::value_next;
|
|
136
136
|
[[nodiscard]] explicit operator std::string() const;
|
|
137
137
|
[[nodiscard]] explicit operator std::u16string() const;
|
|
138
138
|
};
|
|
139
139
|
|
|
140
140
|
// bigint
|
|
141
|
-
class EXPORT
|
|
141
|
+
class EXPORT local_for_bigint : public local_next<bigint_tag> {
|
|
142
142
|
public:
|
|
143
|
-
using
|
|
143
|
+
using local_next<bigint_tag>::local_next;
|
|
144
144
|
[[nodiscard]] auto inspect() const -> value_typeof;
|
|
145
|
-
static auto make(const runtime_lock& lock, js::bigint value) ->
|
|
146
|
-
static auto make(const basic_lock& lock, std::int64_t value) ->
|
|
145
|
+
static auto make(const runtime_lock& lock, js::bigint value) -> local_of<bigint_tag_of<js::bigint>>;
|
|
146
|
+
static auto make(const basic_lock& lock, std::int64_t value) -> local_of<bigint_tag_of<std::int64_t>>;
|
|
147
147
|
};
|
|
148
148
|
|
|
149
|
-
class EXPORT
|
|
149
|
+
class EXPORT value_for_bigint : public value_next<bigint_tag> {
|
|
150
150
|
public:
|
|
151
|
-
using
|
|
151
|
+
using value_next<bigint_tag>::value_next;
|
|
152
152
|
[[nodiscard]] explicit operator js::bigint() const;
|
|
153
153
|
[[nodiscard]] explicit operator std::int64_t() const;
|
|
154
154
|
};
|
package/addon/value/prototype.cc
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
module;
|
|
2
2
|
#include "auto_js/export_tag.h"
|
|
3
3
|
export module isolated_vm:value.prototype;
|
|
4
|
-
import :handle.
|
|
4
|
+
import :handle.local_of;
|
|
5
5
|
import :support.callback_storage;
|
|
6
6
|
|
|
7
7
|
namespace isolated_vm {
|
|
8
8
|
using namespace js;
|
|
9
9
|
|
|
10
|
-
//
|
|
11
|
-
class EXPORT
|
|
10
|
+
// local_of<prototype_tag>
|
|
11
|
+
class EXPORT local_for_prototype : public local_next<prototype_tag> {
|
|
12
12
|
public:
|
|
13
|
-
using
|
|
14
|
-
[[nodiscard]] static auto make(const basic_lock& lock, runtime_callback_data_allocated_type data, int length) ->
|
|
15
|
-
[[nodiscard]] static auto make(const basic_lock& lock, runtime_callback_data_span_type data, int length) ->
|
|
13
|
+
using local_next<prototype_tag>::local_next;
|
|
14
|
+
[[nodiscard]] static auto make(const basic_lock& lock, runtime_callback_data_allocated_type data, int length) -> local_of<function_prototype_tag>;
|
|
15
|
+
[[nodiscard]] static auto make(const basic_lock& lock, runtime_callback_data_span_type data, int length) -> local_of<function_prototype_tag>;
|
|
16
16
|
|
|
17
17
|
template <class Type>
|
|
18
|
-
[[nodiscard]] static auto make(const basic_lock& lock, runtime_callback_function_storage<Type> data, int length) ->
|
|
18
|
+
[[nodiscard]] static auto make(const basic_lock& lock, runtime_callback_function_storage<Type> data, int length) -> local_of<function_prototype_tag> {
|
|
19
19
|
auto data_span = std::span{reinterpret_cast<std::byte*>(&data), sizeof(data)};
|
|
20
20
|
return make(lock, data_span, length);
|
|
21
21
|
}
|
package/addon/value/record.cc
CHANGED
|
@@ -6,45 +6,45 @@ import :value.vector;
|
|
|
6
6
|
namespace isolated_vm {
|
|
7
7
|
using namespace js;
|
|
8
8
|
|
|
9
|
-
//
|
|
10
|
-
class EXPORT
|
|
9
|
+
// local_of<record_tag>
|
|
10
|
+
class EXPORT local_for_record : public local_next<record_tag> {
|
|
11
11
|
public:
|
|
12
|
-
using
|
|
13
|
-
auto set(const runtime_lock& lock,
|
|
14
|
-
static auto make(const runtime_lock& lock) ->
|
|
12
|
+
using local_next<record_tag>::local_next;
|
|
13
|
+
auto set(const runtime_lock& lock, local_of<> key, local_of<> value) const -> void;
|
|
14
|
+
static auto make(const runtime_lock& lock) -> local_of<record_tag>;
|
|
15
15
|
};
|
|
16
16
|
|
|
17
|
-
//
|
|
18
|
-
class EXPORT
|
|
17
|
+
// value_of<record_tag>
|
|
18
|
+
class EXPORT value_for_record : public value_next<record_tag> {
|
|
19
19
|
private:
|
|
20
|
-
using internal_keys_type =
|
|
20
|
+
using internal_keys_type = value_of<vector_tag>;
|
|
21
21
|
|
|
22
22
|
public:
|
|
23
|
-
using
|
|
24
|
-
using key_type =
|
|
25
|
-
using mapped_type =
|
|
23
|
+
using value_next<record_tag>::value_next;
|
|
24
|
+
using key_type = local_of<primitive_tag>;
|
|
25
|
+
using mapped_type = local_of<>;
|
|
26
26
|
using value_type = std::pair<key_type, mapped_type>;
|
|
27
27
|
|
|
28
28
|
private:
|
|
29
29
|
class EXPORT iterator_transform {
|
|
30
30
|
public:
|
|
31
|
-
explicit iterator_transform(const
|
|
32
|
-
auto operator()(
|
|
31
|
+
explicit iterator_transform(const value_for_record& subject);
|
|
32
|
+
auto operator()(local_of<> key) const -> value_type;
|
|
33
33
|
|
|
34
34
|
private:
|
|
35
|
-
const
|
|
35
|
+
const value_for_record* subject_;
|
|
36
36
|
};
|
|
37
37
|
|
|
38
38
|
public:
|
|
39
39
|
using range_type = std::ranges::transform_view<std::views::all_t<const internal_keys_type&>, iterator_transform>;
|
|
40
40
|
using iterator = std::ranges::iterator_t<range_type>;
|
|
41
41
|
|
|
42
|
-
[[nodiscard]] auto get(
|
|
43
|
-
[[nodiscard]] auto get(
|
|
44
|
-
[[nodiscard]] auto get(
|
|
45
|
-
[[nodiscard]] auto has(
|
|
46
|
-
[[nodiscard]] auto has(
|
|
47
|
-
[[nodiscard]] auto has(
|
|
42
|
+
[[nodiscard]] auto get(local_of<name_tag> key) const -> local_of<>;
|
|
43
|
+
[[nodiscard]] auto get(local_of<number_tag> key) const -> local_of<>;
|
|
44
|
+
[[nodiscard]] auto get(local_of<primitive_tag> key) const -> local_of<>;
|
|
45
|
+
[[nodiscard]] auto has(local_of<name_tag> key) const -> bool;
|
|
46
|
+
[[nodiscard]] auto has(local_of<number_tag> key) const -> bool;
|
|
47
|
+
[[nodiscard]] auto has(local_of<primitive_tag> key) const -> bool;
|
|
48
48
|
[[nodiscard]] auto into_range() const -> range_type;
|
|
49
49
|
[[nodiscard]] auto size() const -> std::size_t;
|
|
50
50
|
|
package/addon/value/value.cc
CHANGED
package/addon/value/vector.cc
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module;
|
|
2
2
|
#include "auto_js/export_tag.h"
|
|
3
3
|
export module isolated_vm:value.vector;
|
|
4
|
-
import :handle.
|
|
4
|
+
import :handle.local_of;
|
|
5
5
|
import :handle.value_of;
|
|
6
6
|
import :value.object;
|
|
7
7
|
import auto_js;
|
|
@@ -11,12 +11,12 @@ import util;
|
|
|
11
11
|
namespace isolated_vm {
|
|
12
12
|
using namespace js;
|
|
13
13
|
|
|
14
|
-
//
|
|
15
|
-
class EXPORT
|
|
14
|
+
// value_of<vector_tag>
|
|
15
|
+
class EXPORT value_for_vector : public value_next<vector_tag> {
|
|
16
16
|
public:
|
|
17
17
|
class iterator;
|
|
18
|
-
using
|
|
19
|
-
using value_type =
|
|
18
|
+
using value_next<vector_tag>::value_next;
|
|
19
|
+
using value_type = local_of<>;
|
|
20
20
|
|
|
21
21
|
[[nodiscard]] auto begin() const -> iterator;
|
|
22
22
|
[[nodiscard]] auto end() const -> iterator;
|
|
@@ -26,15 +26,15 @@ class EXPORT bound_value_for_vector : public bound_value_next<vector_tag> {
|
|
|
26
26
|
mutable std::uint32_t size_{};
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
class EXPORT
|
|
29
|
+
class EXPORT value_for_vector::iterator : public util::random_access_iterator_facade<std::int32_t, std::int64_t> {
|
|
30
30
|
public:
|
|
31
31
|
using arithmetic_facade::operator+;
|
|
32
32
|
using difference_type = arithmetic_facade::difference_type;
|
|
33
33
|
using size_type = std::uint32_t;
|
|
34
|
-
using value_type =
|
|
34
|
+
using value_type = value_for_vector::value_type;
|
|
35
35
|
|
|
36
36
|
iterator() = default;
|
|
37
|
-
iterator(
|
|
37
|
+
iterator(value_for_vector subject, size_type index);
|
|
38
38
|
|
|
39
39
|
auto operator*() const -> value_type;
|
|
40
40
|
|
|
@@ -49,7 +49,7 @@ class EXPORT bound_value_for_vector::iterator : public util::random_access_itera
|
|
|
49
49
|
private:
|
|
50
50
|
constexpr auto operator+() const -> size_type { return index_; }
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
value_for_vector subject_;
|
|
53
53
|
size_type index_{};
|
|
54
54
|
};
|
|
55
55
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
2
|
+
import backend = require("#backend_cjs");
|
|
3
|
+
|
|
4
|
+
// Exports must be enumerated because this imports from the native module which cannot declare ESM
|
|
5
|
+
// exports.
|
|
6
|
+
const { initialize, Agent, Module, NativeModule, Realm, Script } = backend;
|
|
7
|
+
module.exports = { initialize, Agent, Module, NativeModule, Realm, Script };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
type CapabilityMake = import("@isolated-vm/experimental/frontend/realm", { with: { "resolution-mode": "import" }}).Realm.CapabilityMake;
|
|
2
|
+
type _Agent = import("@isolated-vm/experimental/frontend/agent", { with: { "resolution-mode": "import" }}).Agent;
|
|
3
|
+
type _Module = import("@isolated-vm/experimental/frontend/module", { with: { "resolution-mode": "import" }}).Module;
|
|
4
|
+
type _Reference<T> = import("@isolated-vm/experimental/frontend/reference", { with: { "resolution-mode": "import" }}).Reference<T>;
|
|
5
|
+
type CompileModuleOptions = import("@isolated-vm/experimental/frontend/agent", { with: { "resolution-mode": "import" }}).Agent.CompileModuleOptions;
|
|
6
|
+
type CompileScriptOptions = import("@isolated-vm/experimental/frontend/agent", { with: { "resolution-mode": "import" }}).Agent.CompileScriptOptions;
|
|
7
|
+
type CreateAgentOptions = import("@isolated-vm/experimental/frontend/agent", { with: { "resolution-mode": "import" }}).Agent.CreateOptions;
|
|
8
|
+
type CreateCapabilityOptions = import("@isolated-vm/experimental/frontend/realm", { with: { "resolution-mode": "import" }}).Realm.CreateCapabilityOptions;
|
|
9
|
+
type CreateNativeModuleOptions = import("@isolated-vm/experimental/frontend/native_module", { with: { "resolution-mode": "import" }}).NativeModule.CreateOptions;
|
|
10
|
+
type MaybeCompletionOf<T> = import("@isolated-vm/experimental/utility/completion", { with: { "resolution-mode": "import" }}).MaybeCompletionOf<T>;
|
|
11
|
+
type ModuleLinkRecord = import("@isolated-vm/experimental/frontend/module", { with: { "resolution-mode": "import" }}).Module.LinkRecord;
|
|
12
|
+
type RunScriptOptions = import("@isolated-vm/experimental/frontend/script", { with: { "resolution-mode": "import" }}).Script.RunScriptOptions;
|
|
13
|
+
|
|
14
|
+
interface InheritedClasses {
|
|
15
|
+
Agent: object;
|
|
16
|
+
Module: object;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const initialize: (inherited: InheritedClasses) => void;
|
|
20
|
+
|
|
21
|
+
declare const Secret: unique symbol;
|
|
22
|
+
/** @internal */
|
|
23
|
+
export type Secret = typeof Secret;
|
|
24
|
+
|
|
25
|
+
export class Agent {
|
|
26
|
+
readonly #private;
|
|
27
|
+
protected constructor(secret: Secret, ...args: unknown[]);
|
|
28
|
+
disposeAsync(): Promise<void>;
|
|
29
|
+
compileModule(code: string, options?: CompileModuleOptions): Promise<MaybeCompletionOf<_Module>>;
|
|
30
|
+
compileScript(code: string, options?: CompileScriptOptions): Promise<MaybeCompletionOf<Script>>;
|
|
31
|
+
createRealm(): Promise<Realm | null>;
|
|
32
|
+
static create(options?: CreateAgentOptions): Promise<_Agent>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class Module {
|
|
36
|
+
readonly #private;
|
|
37
|
+
protected constructor(secret: Secret, ...args: unknown[]);
|
|
38
|
+
/** @internal */ _link(realm: Realm | null, linker: ModuleLinkRecord): Promise<void>;
|
|
39
|
+
evaluate(realm: Realm | null): Promise<MaybeCompletionOf<unknown>>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class NativeModule {
|
|
43
|
+
readonly #private;
|
|
44
|
+
protected constructor(secret: Secret, ...args: unknown[]);
|
|
45
|
+
instantiate(realm: Realm | null): Promise<Module | null>;
|
|
46
|
+
static create(filename: string, options: CreateNativeModuleOptions): Promise<NativeModule>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export class Realm {
|
|
50
|
+
readonly #private;
|
|
51
|
+
protected constructor(secret: Secret, ...args: unknown[]);
|
|
52
|
+
acquireGlobalObject(): Promise<_Reference<Record<string, unknown>>>;
|
|
53
|
+
createCapability(make: CapabilityMake, options: CreateCapabilityOptions): Promise<Module | null>;
|
|
54
|
+
instantiateRuntime(): Promise<Module | null>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export class Reference {
|
|
58
|
+
readonly #private;
|
|
59
|
+
protected constructor(secret: Secret, ...args: unknown[]);
|
|
60
|
+
copy(): Promise<unknown>;
|
|
61
|
+
get(property: string): Promise<Reference | null>;
|
|
62
|
+
set(property: string, value: unknown): Promise<true | null>;
|
|
63
|
+
invoke(args: unknown[]): Promise<MaybeCompletionOf<unknown>>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export class Script {
|
|
67
|
+
readonly #private;
|
|
68
|
+
protected constructor(secret: Secret, ...args: unknown[]);
|
|
69
|
+
run(realm: Realm | null, options?: RunScriptOptions): Promise<MaybeCompletionOf<unknown>>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export class SubscriberCapability {
|
|
73
|
+
readonly #private;
|
|
74
|
+
protected constructor(secret: Secret, ...args: unknown[]);
|
|
75
|
+
send(message: unknown): Promise<boolean>;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** @internal */
|
|
79
|
+
declare const exports: {
|
|
80
|
+
initialize: typeof initialize;
|
|
81
|
+
Agent: typeof Agent;
|
|
82
|
+
Module: typeof Module;
|
|
83
|
+
NativeModule: typeof NativeModule;
|
|
84
|
+
Realm: typeof Realm;
|
|
85
|
+
Script: typeof Script;
|
|
86
|
+
};
|
|
87
|
+
export default exports;
|
package/backend/host.cts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
2
|
+
import fs = require("node:fs");
|
|
3
|
+
import process = require("node:process");
|
|
4
|
+
|
|
5
|
+
const arch = function() {
|
|
6
|
+
const { arch } = process;
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
|
|
8
|
+
switch (arch) {
|
|
9
|
+
case "arm64":
|
|
10
|
+
case "x64":
|
|
11
|
+
return arch;
|
|
12
|
+
default:
|
|
13
|
+
throw new Error(`Unsupported architecture: ${arch}`);
|
|
14
|
+
}
|
|
15
|
+
}();
|
|
16
|
+
|
|
17
|
+
/** @internal */
|
|
18
|
+
const host = function() {
|
|
19
|
+
const { platform } = process;
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
|
|
21
|
+
switch (platform) {
|
|
22
|
+
case "linux": {
|
|
23
|
+
const libc = function() {
|
|
24
|
+
try {
|
|
25
|
+
if (fs.readFileSync("/usr/bin/ldd", "latin1").includes("ld-musl-")) {
|
|
26
|
+
return "musl" as const;
|
|
27
|
+
}
|
|
28
|
+
} catch {}
|
|
29
|
+
return "gnu" as const;
|
|
30
|
+
}();
|
|
31
|
+
return `linux-${arch}-${libc}` as const;
|
|
32
|
+
}
|
|
33
|
+
case "darwin":
|
|
34
|
+
case "win32":
|
|
35
|
+
return `${platform}-${arch}` as const;
|
|
36
|
+
default:
|
|
37
|
+
throw new Error(`Unsupported platform: ${platform}`);
|
|
38
|
+
}
|
|
39
|
+
}();
|
|
40
|
+
|
|
41
|
+
export = host;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
2
|
+
import host = require("#host_cjs");
|
|
3
|
+
|
|
4
|
+
// All hosts enumerated to assist with bundlers. This file can be replaced with a condition.
|
|
5
|
+
module.exports = function(): unknown {
|
|
6
|
+
switch (host) {
|
|
7
|
+
case "darwin-arm64": return require("@isolated-vm/experimental-darwin-arm64");
|
|
8
|
+
case "darwin-x64": return require("@isolated-vm/experimental-darwin-x64");
|
|
9
|
+
case "linux-arm64-gnu": return require("@isolated-vm/experimental-linux-arm64-gnu");
|
|
10
|
+
case "linux-arm64-musl": return require("@isolated-vm/experimental-linux-arm64-musl");
|
|
11
|
+
case "linux-x64-musl": return require("@isolated-vm/experimental-linux-x64-musl");
|
|
12
|
+
case "linux-x64-gnu": return require("@isolated-vm/experimental-linux-x64-gnu");
|
|
13
|
+
case "win32-x64": return require("@isolated-vm/experimental-win32-x64");
|
|
14
|
+
case "win32-arm64":
|
|
15
|
+
default: throw new Error(`Unsupported platform: ${host}`);
|
|
16
|
+
}
|
|
17
|
+
}();
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
4
|
+
const backend = require("#backend_cjs");
|
|
5
|
+
// Exports must be enumerated because this imports from the native module which cannot declare ESM
|
|
6
|
+
// exports.
|
|
7
|
+
const { initialize, Agent, Module, NativeModule, Realm, Script } = backend;
|
|
8
|
+
module.exports = { initialize, Agent, Module, NativeModule, Realm, Script };
|
|
9
|
+
//# sourceMappingURL=backend.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.cjs","sourceRoot":"","sources":["../../backend/backend.cts"],"names":[],"mappings":";;AAAA,0DAA0D;AAC1D,wCAAyC;AAEzC,kGAAkG;AAClG,WAAW;AACX,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;AAC3E,MAAM,CAAC,OAAO,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC"}
|