@nocobase/plugin-workflow-javascript 2.1.0-beta.26 → 2.1.0-beta.29

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.
Files changed (139) hide show
  1. package/dist/externalVersion.js +4 -4
  2. package/dist/node_modules/joi/package.json +1 -1
  3. package/dist/node_modules/quickjs-emscripten/017c8a1a1898bfe7b7ae.wasm +0 -0
  4. package/dist/node_modules/quickjs-emscripten/161.index.js +50 -0
  5. package/dist/node_modules/quickjs-emscripten/277.index.js +27 -0
  6. package/dist/node_modules/quickjs-emscripten/302.index.js +55 -0
  7. package/dist/node_modules/quickjs-emscripten/45d53437811cf6eec760.wasm +0 -0
  8. package/dist/node_modules/quickjs-emscripten/712.index.js +5566 -0
  9. package/dist/node_modules/quickjs-emscripten/96b24985ab62871ec2a0.wasm +0 -0
  10. package/dist/node_modules/quickjs-emscripten/9a4b9654a8a7f4d515ba.wasm +0 -0
  11. package/dist/node_modules/quickjs-emscripten/LICENSE +21 -0
  12. package/dist/node_modules/quickjs-emscripten/dist/index.d.mts +57 -0
  13. package/dist/node_modules/quickjs-emscripten/dist/index.d.ts +57 -0
  14. package/dist/node_modules/quickjs-emscripten/dist/index.global.js +7309 -0
  15. package/dist/node_modules/quickjs-emscripten/dist/index.js +1 -0
  16. package/dist/node_modules/quickjs-emscripten/dist/variants.d.mts +39 -0
  17. package/dist/node_modules/quickjs-emscripten/dist/variants.d.ts +39 -0
  18. package/dist/node_modules/quickjs-emscripten/dist/variants.js +2 -0
  19. package/dist/node_modules/quickjs-emscripten/package.json +1 -0
  20. package/dist/node_modules/winston-transport/package.json +1 -1
  21. package/dist/server/QuickJs.js +135 -0
  22. package/dist/server/ScriptInstruction.d.ts +1 -1
  23. package/dist/server/ScriptInstruction.js +2 -2
  24. package/package.json +3 -8
  25. package/dist/node_modules/isolated-vm/.clang-tidy +0 -13
  26. package/dist/node_modules/isolated-vm/.dockerignore +0 -9
  27. package/dist/node_modules/isolated-vm/Dockerfile.alpine +0 -9
  28. package/dist/node_modules/isolated-vm/Dockerfile.debian +0 -12
  29. package/dist/node_modules/isolated-vm/LICENSE +0 -13
  30. package/dist/node_modules/isolated-vm/binding.gyp +0 -120
  31. package/dist/node_modules/isolated-vm/include.js +0 -3
  32. package/dist/node_modules/isolated-vm/inspector-example.js +0 -59
  33. package/dist/node_modules/isolated-vm/isolated-vm-6.1.2.tgz +0 -0
  34. package/dist/node_modules/isolated-vm/isolated-vm.d.ts +0 -820
  35. package/dist/node_modules/isolated-vm/isolated-vm.js +0 -1
  36. package/dist/node_modules/isolated-vm/native-example/binding.gyp +0 -23
  37. package/dist/node_modules/isolated-vm/native-example/example.cc +0 -61
  38. package/dist/node_modules/isolated-vm/native-example/package.json +0 -13
  39. package/dist/node_modules/isolated-vm/native-example/usage.js +0 -35
  40. package/dist/node_modules/isolated-vm/package.json +0 -1
  41. package/dist/node_modules/isolated-vm/prebuilds/darwin-arm64/isolated-vm.abi127.node +0 -0
  42. package/dist/node_modules/isolated-vm/prebuilds/darwin-arm64/isolated-vm.abi137.node +0 -0
  43. package/dist/node_modules/isolated-vm/prebuilds/linux-arm64/isolated-vm.abi127.glibc.node +0 -0
  44. package/dist/node_modules/isolated-vm/prebuilds/linux-arm64/isolated-vm.abi127.musl.node +0 -0
  45. package/dist/node_modules/isolated-vm/prebuilds/linux-arm64/isolated-vm.abi137.glibc.node +0 -0
  46. package/dist/node_modules/isolated-vm/prebuilds/linux-arm64/isolated-vm.abi137.musl.node +0 -0
  47. package/dist/node_modules/isolated-vm/prebuilds/linux-x64/isolated-vm.abi127.glibc.node +0 -0
  48. package/dist/node_modules/isolated-vm/prebuilds/linux-x64/isolated-vm.abi127.musl.node +0 -0
  49. package/dist/node_modules/isolated-vm/prebuilds/linux-x64/isolated-vm.abi137.glibc.node +0 -0
  50. package/dist/node_modules/isolated-vm/prebuilds/linux-x64/isolated-vm.abi137.musl.node +0 -0
  51. package/dist/node_modules/isolated-vm/prebuilds/win32-x64/isolated-vm.abi127.node +0 -0
  52. package/dist/node_modules/isolated-vm/prebuilds/win32-x64/isolated-vm.abi137.node +0 -0
  53. package/dist/node_modules/isolated-vm/scripts/run-prebuild.js +0 -33
  54. package/dist/node_modules/isolated-vm/src/external_copy/error.h +0 -33
  55. package/dist/node_modules/isolated-vm/src/external_copy/external_copy.cc +0 -509
  56. package/dist/node_modules/isolated-vm/src/external_copy/external_copy.h +0 -117
  57. package/dist/node_modules/isolated-vm/src/external_copy/serializer.cc +0 -85
  58. package/dist/node_modules/isolated-vm/src/external_copy/serializer.h +0 -136
  59. package/dist/node_modules/isolated-vm/src/external_copy/serializer_nortti.cc +0 -73
  60. package/dist/node_modules/isolated-vm/src/external_copy/string.cc +0 -124
  61. package/dist/node_modules/isolated-vm/src/external_copy/string.h +0 -28
  62. package/dist/node_modules/isolated-vm/src/isolate/allocator.h +0 -30
  63. package/dist/node_modules/isolated-vm/src/isolate/allocator_nortti.cc +0 -131
  64. package/dist/node_modules/isolated-vm/src/isolate/class_handle.h +0 -338
  65. package/dist/node_modules/isolated-vm/src/isolate/cpu_profile_manager.cc +0 -220
  66. package/dist/node_modules/isolated-vm/src/isolate/cpu_profile_manager.h +0 -100
  67. package/dist/node_modules/isolated-vm/src/isolate/environment.cc +0 -627
  68. package/dist/node_modules/isolated-vm/src/isolate/environment.h +0 -381
  69. package/dist/node_modules/isolated-vm/src/isolate/executor.cc +0 -198
  70. package/dist/node_modules/isolated-vm/src/isolate/executor.h +0 -183
  71. package/dist/node_modules/isolated-vm/src/isolate/external.h +0 -64
  72. package/dist/node_modules/isolated-vm/src/isolate/functor_runners.h +0 -97
  73. package/dist/node_modules/isolated-vm/src/isolate/generic/array.h +0 -145
  74. package/dist/node_modules/isolated-vm/src/isolate/generic/callbacks.h +0 -264
  75. package/dist/node_modules/isolated-vm/src/isolate/generic/error.h +0 -140
  76. package/dist/node_modules/isolated-vm/src/isolate/generic/extract_params.h +0 -145
  77. package/dist/node_modules/isolated-vm/src/isolate/generic/handle_cast.h +0 -257
  78. package/dist/node_modules/isolated-vm/src/isolate/generic/read_option.h +0 -47
  79. package/dist/node_modules/isolated-vm/src/isolate/holder.cc +0 -88
  80. package/dist/node_modules/isolated-vm/src/isolate/holder.h +0 -69
  81. package/dist/node_modules/isolated-vm/src/isolate/inspector.cc +0 -200
  82. package/dist/node_modules/isolated-vm/src/isolate/inspector.h +0 -70
  83. package/dist/node_modules/isolated-vm/src/isolate/node_wrapper.h +0 -15
  84. package/dist/node_modules/isolated-vm/src/isolate/platform_delegate.cc +0 -22
  85. package/dist/node_modules/isolated-vm/src/isolate/platform_delegate.h +0 -46
  86. package/dist/node_modules/isolated-vm/src/isolate/remote_handle.h +0 -164
  87. package/dist/node_modules/isolated-vm/src/isolate/run_with_timeout.h +0 -171
  88. package/dist/node_modules/isolated-vm/src/isolate/runnable.h +0 -29
  89. package/dist/node_modules/isolated-vm/src/isolate/scheduler.cc +0 -191
  90. package/dist/node_modules/isolated-vm/src/isolate/scheduler.h +0 -165
  91. package/dist/node_modules/isolated-vm/src/isolate/specific.h +0 -35
  92. package/dist/node_modules/isolated-vm/src/isolate/stack_trace.cc +0 -218
  93. package/dist/node_modules/isolated-vm/src/isolate/stack_trace.h +0 -24
  94. package/dist/node_modules/isolated-vm/src/isolate/strings.h +0 -127
  95. package/dist/node_modules/isolated-vm/src/isolate/three_phase_task.cc +0 -385
  96. package/dist/node_modules/isolated-vm/src/isolate/three_phase_task.h +0 -136
  97. package/dist/node_modules/isolated-vm/src/isolate/transferable.h +0 -15
  98. package/dist/node_modules/isolated-vm/src/isolate/util.h +0 -45
  99. package/dist/node_modules/isolated-vm/src/isolate/v8_inspector_wrapper.h +0 -14
  100. package/dist/node_modules/isolated-vm/src/isolate/v8_version.h +0 -12
  101. package/dist/node_modules/isolated-vm/src/isolated_vm.h +0 -71
  102. package/dist/node_modules/isolated-vm/src/lib/covariant.h +0 -50
  103. package/dist/node_modules/isolated-vm/src/lib/lockable.h +0 -178
  104. package/dist/node_modules/isolated-vm/src/lib/suspend.h +0 -106
  105. package/dist/node_modules/isolated-vm/src/lib/thread_pool.cc +0 -98
  106. package/dist/node_modules/isolated-vm/src/lib/thread_pool.h +0 -45
  107. package/dist/node_modules/isolated-vm/src/lib/timer.cc +0 -233
  108. package/dist/node_modules/isolated-vm/src/lib/timer.h +0 -36
  109. package/dist/node_modules/isolated-vm/src/module/callback.cc +0 -155
  110. package/dist/node_modules/isolated-vm/src/module/callback.h +0 -64
  111. package/dist/node_modules/isolated-vm/src/module/context_handle.cc +0 -241
  112. package/dist/node_modules/isolated-vm/src/module/context_handle.h +0 -35
  113. package/dist/node_modules/isolated-vm/src/module/evaluation.cc +0 -108
  114. package/dist/node_modules/isolated-vm/src/module/evaluation.h +0 -99
  115. package/dist/node_modules/isolated-vm/src/module/external_copy_handle.cc +0 -125
  116. package/dist/node_modules/isolated-vm/src/module/external_copy_handle.h +0 -64
  117. package/dist/node_modules/isolated-vm/src/module/isolate.cc +0 -136
  118. package/dist/node_modules/isolated-vm/src/module/isolate_handle.cc +0 -623
  119. package/dist/node_modules/isolated-vm/src/module/isolate_handle.h +0 -47
  120. package/dist/node_modules/isolated-vm/src/module/lib_handle.cc +0 -77
  121. package/dist/node_modules/isolated-vm/src/module/lib_handle.h +0 -28
  122. package/dist/node_modules/isolated-vm/src/module/module_handle.cc +0 -475
  123. package/dist/node_modules/isolated-vm/src/module/module_handle.h +0 -68
  124. package/dist/node_modules/isolated-vm/src/module/native_module_handle.cc +0 -108
  125. package/dist/node_modules/isolated-vm/src/module/native_module_handle.h +0 -49
  126. package/dist/node_modules/isolated-vm/src/module/reference_handle.cc +0 -640
  127. package/dist/node_modules/isolated-vm/src/module/reference_handle.h +0 -106
  128. package/dist/node_modules/isolated-vm/src/module/script_handle.cc +0 -107
  129. package/dist/node_modules/isolated-vm/src/module/script_handle.h +0 -37
  130. package/dist/node_modules/isolated-vm/src/module/session_handle.cc +0 -173
  131. package/dist/node_modules/isolated-vm/src/module/session_handle.h +0 -31
  132. package/dist/node_modules/isolated-vm/src/module/transferable.cc +0 -268
  133. package/dist/node_modules/isolated-vm/src/module/transferable.h +0 -42
  134. package/dist/node_modules/isolated-vm/vendor/v8_inspector/nodejs_v18.0.0.h +0 -360
  135. package/dist/node_modules/isolated-vm/vendor/v8_inspector/nodejs_v18.3.0.h +0 -376
  136. package/dist/node_modules/isolated-vm/vendor/v8_inspector/nodejs_v20.0.0.h +0 -397
  137. package/dist/node_modules/isolated-vm/vendor/v8_inspector/nodejs_v22.0.0.h +0 -419
  138. package/dist/node_modules/isolated-vm/vendor/v8_inspector/nodejs_v24.0.0.h +0 -426
  139. package/dist/server/IsolatedVm.js +0 -75
@@ -1,640 +0,0 @@
1
- #include "reference_handle.h"
2
- #include "external_copy/external_copy.h"
3
- #include "isolate/run_with_timeout.h"
4
- #include "isolate/three_phase_task.h"
5
- #include "transferable.h"
6
- #include <array>
7
-
8
- using namespace v8;
9
- using std::shared_ptr;
10
- using std::unique_ptr;
11
-
12
- namespace ivm {
13
- namespace {
14
-
15
- using TypeOf = detail::ReferenceData::TypeOf;
16
- auto InferTypeOf(Local<Value> value) -> TypeOf {
17
- if (value->IsNull()) {
18
- return TypeOf::Null;
19
- } else if (value->IsUndefined()) {
20
- return TypeOf::Undefined;
21
- } else if (value->IsNumber()) {
22
- return TypeOf::Number;
23
- } else if (value->IsString()) {
24
- return TypeOf::String;
25
- } else if (value->IsBoolean()) {
26
- return TypeOf::Boolean;
27
- } else if (value->IsFunction()) {
28
- return TypeOf::Function;
29
- } else {
30
- return TypeOf::Object;
31
- }
32
- }
33
-
34
- /**
35
- * The return value for .derefInto()
36
- */
37
- class DereferenceHandleTransferable : public Transferable {
38
- public:
39
- DereferenceHandleTransferable(shared_ptr<IsolateHolder> isolate, RemoteHandle<v8::Value> reference) :
40
- isolate{std::move(isolate)}, reference{std::move(reference)} {}
41
-
42
- auto TransferIn() -> v8::Local<v8::Value> final {
43
- if (isolate == IsolateEnvironment::GetCurrentHolder()) {
44
- return Deref(reference);
45
- } else {
46
- throw RuntimeTypeError("Cannot dereference this into target isolate");
47
- }
48
- }
49
-
50
- private:
51
- shared_ptr<IsolateHolder> isolate;
52
- RemoteHandle<v8::Value> reference;
53
- };
54
-
55
- class DereferenceHandle : public TransferableHandle {
56
- public:
57
- DereferenceHandle(shared_ptr<IsolateHolder> isolate, RemoteHandle<v8::Value> reference) :
58
- isolate{std::move(isolate)}, reference{std::move(reference)} {}
59
-
60
- static auto Definition() -> v8::Local<v8::FunctionTemplate> {
61
- return Inherit<TransferableHandle>(MakeClass("Dereference", nullptr));
62
- }
63
-
64
- auto TransferOut() -> std::unique_ptr<Transferable> final {
65
- if (!reference) {
66
- throw RuntimeGenericError("The return value of `derefInto()` should only be used once");
67
- }
68
- return std::make_unique<DereferenceHandleTransferable>(std::move(isolate), std::move(reference));
69
- }
70
-
71
- private:
72
- shared_ptr<IsolateHolder> isolate;
73
- RemoteHandle<v8::Value> reference;
74
- };
75
-
76
- } // anonymous namespace
77
-
78
- namespace detail {
79
-
80
- ReferenceData::ReferenceData(Local<Value> value, bool inherit) : ReferenceData{
81
- IsolateEnvironment::GetCurrentHolder(),
82
- RemoteHandle<Value>(value),
83
- RemoteHandle<Context>(Isolate::GetCurrent()->GetCurrentContext()),
84
- InferTypeOf(value),
85
- false,
86
- inherit} {}
87
-
88
- ReferenceData::ReferenceData(
89
- shared_ptr<IsolateHolder> isolate,
90
- RemoteHandle<Value> reference,
91
- RemoteHandle<Context> context,
92
- TypeOf type_of,
93
- bool accessors,
94
- bool inherit
95
- ) :
96
- isolate{std::move(isolate)},
97
- reference{std::move(reference)},
98
- context{std::move(context)},
99
- type_of{type_of},
100
- accessors{accessors},
101
- inherit{inherit} {}
102
-
103
- } // namespace detail
104
-
105
- /**
106
- * ReferenceHandle implementation
107
- */
108
- static std::unique_ptr<ReferenceHandle> ReferenceHandle_New_Wrapper(v8::Local<v8::Value> value, v8::MaybeLocal<v8::Object> options) {
109
- return ReferenceHandle::New(value, options);
110
- }
111
-
112
- auto ReferenceHandle::Definition() -> Local<FunctionTemplate> {
113
- return Inherit<TransferableHandle>(MakeClass(
114
- "Reference", ConstructorFunction<decltype(&ReferenceHandle_New_Wrapper), &ReferenceHandle_New_Wrapper>{},
115
- "deref", MemberFunction<decltype(&ReferenceHandle::Deref), &ReferenceHandle::Deref>{},
116
- "derefInto", MemberFunction<decltype(&ReferenceHandle::DerefInto), &ReferenceHandle::DerefInto>{},
117
- "release", MemberFunction<decltype(&ReferenceHandle::Release), &ReferenceHandle::Release>{},
118
- "copy", MemberFunction<decltype(&ReferenceHandle::Copy<1>), &ReferenceHandle::Copy<1>>{},
119
- "copySync", MemberFunction<decltype(&ReferenceHandle::Copy<0>), &ReferenceHandle::Copy<0>>{},
120
- "delete", MemberFunction<decltype(&ReferenceHandle::Delete<1>), &ReferenceHandle::Delete<1>>{},
121
- "deleteIgnored", MemberFunction<decltype(&ReferenceHandle::Delete<2>), &ReferenceHandle::Delete<2>>{},
122
- "deleteSync", MemberFunction<decltype(&ReferenceHandle::Delete<0>), &ReferenceHandle::Delete<0>>{},
123
- "get", MemberFunction<decltype(&ReferenceHandle::Get<1>), &ReferenceHandle::Get<1>>{},
124
- "getSync", MemberFunction<decltype(&ReferenceHandle::Get<0>), &ReferenceHandle::Get<0>>{},
125
- "set", MemberFunction<decltype(&ReferenceHandle::Set<1>), &ReferenceHandle::Set<1>>{},
126
- "setIgnored", MemberFunction<decltype(&ReferenceHandle::Set<2>), &ReferenceHandle::Set<2>>{},
127
- "setSync", MemberFunction<decltype(&ReferenceHandle::Set<0>), &ReferenceHandle::Set<0>>{},
128
- "apply", MemberFunction<decltype(&ReferenceHandle::Apply<1>), &ReferenceHandle::Apply<1>>{},
129
- "applyIgnored", MemberFunction<decltype(&ReferenceHandle::Apply<2>), &ReferenceHandle::Apply<2>>{},
130
- "applySync", MemberFunction<decltype(&ReferenceHandle::Apply<0>), &ReferenceHandle::Apply<0>>{},
131
- "applySyncPromise", MemberFunction<decltype(&ReferenceHandle::Apply<4>), &ReferenceHandle::Apply<4>>{},
132
- "typeof", MemberAccessor<decltype(&ReferenceHandle::TypeOfGetter), &ReferenceHandle::TypeOfGetter>{}
133
- ));
134
- }
135
-
136
- auto ReferenceHandle::New(Local<Value> value, MaybeLocal<Object> options) -> unique_ptr<ReferenceHandle> {
137
- auto inherit = ReadOption<bool>(options, StringTable::Get().unsafeInherit, false);
138
- return std::make_unique<ReferenceHandle>(value, inherit);
139
- }
140
-
141
- auto ReferenceHandle::TransferOut() -> unique_ptr<Transferable> {
142
- return std::make_unique<ReferenceHandleTransferable>(*this);
143
- }
144
-
145
- /**
146
- * Getter for typeof property.
147
- */
148
- auto ReferenceHandle::TypeOfGetter() -> Local<Value> {
149
- CheckDisposed();
150
- switch (type_of) {
151
- case TypeOf::Null:
152
- return StringTable::Get().null;
153
- case TypeOf::Undefined:
154
- return StringTable::Get().undefined;
155
- case TypeOf::Number:
156
- return StringTable::Get().number;
157
- case TypeOf::String:
158
- return StringTable::Get().string;
159
- case TypeOf::Boolean:
160
- return StringTable::Get().boolean;
161
- case TypeOf::Object:
162
- return StringTable::Get().object;
163
- case TypeOf::Function:
164
- return StringTable::Get().function;
165
- }
166
- std::terminate();
167
- }
168
-
169
- /**
170
- * Attempt to return this handle to the current context.
171
- */
172
- auto ReferenceHandle::Deref(MaybeLocal<Object> maybe_options) -> Local<Value> {
173
- CheckDisposed();
174
- if (isolate.get() != IsolateEnvironment::GetCurrentHolder().get()) {
175
- throw RuntimeTypeError("Cannot dereference this from current isolate");
176
- }
177
- bool release = ReadOption<bool>(maybe_options, StringTable::Get().release, false);
178
- Local<Value> ret = ivm::Deref(reference);
179
- if (release) {
180
- Release();
181
- }
182
- return ret;
183
- }
184
-
185
- /**
186
- * Return a handle which will dereference itself when passing into another isolate.
187
- */
188
- auto ReferenceHandle::DerefInto(MaybeLocal<Object> maybe_options) -> Local<Value> {
189
- CheckDisposed();
190
- bool release = ReadOption<bool>(maybe_options, StringTable::Get().release, false);
191
- Local<Value> ret = ClassHandle::NewInstance<DereferenceHandle>(isolate, reference);
192
- if (release) {
193
- Release();
194
- }
195
- return ret;
196
- }
197
-
198
- /**
199
- * Release this reference.
200
- */
201
- auto ReferenceHandle::Release() -> Local<Value> {
202
- CheckDisposed();
203
- isolate.reset();
204
- reference = {};
205
- context = {};
206
- return Undefined(Isolate::GetCurrent());
207
- }
208
-
209
- /**
210
- * Call a function, like Function.prototype.apply
211
- */
212
- class ApplyRunner : public ThreePhaseTask {
213
- public:
214
- ApplyRunner(
215
- ReferenceHandle& that,
216
- MaybeLocal<Value> recv_handle,
217
- Maybe<ArrayRange> maybe_arguments,
218
- MaybeLocal<Object> maybe_options
219
- ) : context{that.context}, reference{that.reference}
220
- {
221
- that.CheckDisposed();
222
-
223
- // Get receiver, holder, this, whatever
224
- Local<Value> recv_local;
225
- if (recv_handle.ToLocal(&recv_local)) {
226
- recv = TransferOut(recv_local);
227
- }
228
-
229
- // Get run options
230
- TransferOptions arguments_transfer_options;
231
- Local<Object> options;
232
- if (maybe_options.ToLocal(&options)) {
233
- timeout = ReadOption<int32_t>(options, StringTable::Get().timeout, 0);
234
- arguments_transfer_options = TransferOptions{
235
- ReadOption<MaybeLocal<Object>>(options, StringTable::Get().arguments, {})};
236
- return_transfer_options = TransferOptions{
237
- ReadOption<MaybeLocal<Object>>(options, StringTable::Get().result, {}),
238
- TransferOptions::Type::Reference};
239
- }
240
-
241
- // Externalize all arguments
242
- ArrayRange arguments;
243
- if (maybe_arguments.To(&arguments)) {
244
- argv.reserve(std::distance(arguments.begin(), arguments.end()));
245
- for (auto argument : arguments) {
246
- argv.push_back(TransferOut(argument, arguments_transfer_options));
247
- }
248
- }
249
- }
250
-
251
- ApplyRunner(const ApplyRunner&) = delete;
252
- auto operator=(const ApplyRunner&) = delete;
253
-
254
- ~ApplyRunner() final {
255
- if (did_finish) {
256
- *did_finish = 1;
257
- }
258
- }
259
-
260
- void Phase2() final {
261
- // Invoke in the isolate
262
- Local<Context> context_handle = Deref(context);
263
- Context::Scope context_scope{context_handle};
264
- Local<Value> fn = Deref(reference);
265
- if (!fn->IsFunction()) {
266
- throw RuntimeTypeError("Reference is not a function");
267
- }
268
- std::vector<Local<Value>> argv_inner = TransferArguments();
269
- Local<Value> recv_inner = recv->TransferIn();
270
- Local<Value> result = RunWithTimeout(timeout,
271
- [&fn, &context_handle, &recv_inner, &argv_inner]() {
272
- return fn.As<Function>()->Call(context_handle, recv_inner, argv_inner.size(), argv_inner.empty() ? nullptr : &argv_inner[0]);
273
- }
274
- );
275
- ret = TransferOut(result, return_transfer_options);
276
- }
277
-
278
- auto Phase2Async(Scheduler::AsyncWait& wait) -> bool final {
279
- // Same as regular `Phase2()` but if it returns a promise we will wait on it
280
- if (!(return_transfer_options == TransferOptions{TransferOptions::Type::Reference})) {
281
- throw RuntimeTypeError("`result` options are not available for `applySyncPromise`");
282
- }
283
- Local<Context> context_handle = Deref(context);
284
- Context::Scope context_scope{context_handle};
285
- Local<Value> fn = Deref(reference);
286
- if (!fn->IsFunction()) {
287
- throw RuntimeTypeError("Reference is not a function");
288
- }
289
- Local<Value> recv_inner = recv->TransferIn();
290
- std::vector<Local<Value>> argv_inner = TransferArguments();
291
- Local<Value> value = RunWithTimeout(
292
- timeout,
293
- [&fn, &context_handle, &recv_inner, &argv_inner]() {
294
- return fn.As<Function>()->Call(context_handle, recv_inner, argv_inner.size(), argv_inner.empty() ? nullptr : &argv_inner[0]);
295
- }
296
- );
297
- if (value->IsPromise()) {
298
- Isolate* isolate = Isolate::GetCurrent();
299
- // This is only called from the default isolate, so we don't need an IsolateSpecific
300
- static Persistent<Function> callback_persistent{isolate, CompileAsyncWrapper()};
301
- Local<Function> callback_fn = Deref(callback_persistent);
302
- did_finish = std::make_shared<char>(0);
303
- std::array<Local<Value>, 3> argv;
304
- argv[0] = External::New(isolate, reinterpret_cast<void*>(this));
305
- argv[1] = External::New(isolate, new shared_ptr<char>(did_finish));
306
- argv[2] = value;
307
- async_wait = &wait;
308
- Unmaybe(callback_fn->Call(context_handle, callback_fn, 3, &argv.front()));
309
- return true;
310
- } else {
311
- ret = TransferOut(value, return_transfer_options);
312
- return false;
313
- }
314
- }
315
-
316
- auto Phase3() -> Local<Value> final {
317
- if (did_finish && *did_finish == 0) {
318
- *did_finish = 1;
319
- throw RuntimeGenericError("Script execution timed out.");
320
- } else if (async_error) {
321
- Isolate::GetCurrent()->ThrowException(async_error->CopyInto());
322
- throw RuntimeError();
323
- } else {
324
- return ret->TransferIn();
325
- }
326
- }
327
-
328
- private:
329
- /**
330
- * This is an internal callback that will be called after a Promise returned from
331
- * `applySyncPromise` has resolved
332
- */
333
- static void AsyncCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
334
- // It's possible the invocation timed out, in which case the ApplyRunner will be dead. The
335
- // shared_ptr<bool> here will be marked as true and we can exit early.
336
- auto* did_finish_ptr = reinterpret_cast<shared_ptr<char>*>(info[1].As<External>()->Value());
337
- auto did_finish = std::move(*did_finish_ptr);
338
- delete did_finish_ptr;
339
- if (*did_finish == 1) {
340
- return;
341
- }
342
- ApplyRunner& self = *reinterpret_cast<ApplyRunner*>(info[0].As<External>()->Value());
343
- if (info.Length() == 3) {
344
- // Resolved
345
- FunctorRunners::RunCatchExternal(IsolateEnvironment::GetCurrent().DefaultContext(), [&self, &info]() {
346
- self.ret = TransferOut(info[2]);
347
- }, [&self](unique_ptr<ExternalCopy> error) {
348
- self.async_error = std::move(error);
349
- });
350
- } else {
351
- // Rejected
352
- self.async_error = ExternalCopy::CopyThrownValue(info[3]);
353
- }
354
- *self.did_finish = 1;
355
- self.async_wait->Done();
356
- }
357
-
358
- /**
359
- * The C++ promise interface is a little clumsy so this does some work in JS for us. This function
360
- * is called once and returns a JS function that will be reused.
361
- */
362
- static auto CompileAsyncWrapper() -> Local<Function> {
363
- Isolate* isolate = Isolate::GetCurrent();
364
- Local<Context> context = IsolateEnvironment::GetCurrent().DefaultContext();
365
- Local<Script> script = Unmaybe(Script::Compile(context, v8_string(
366
- "'use strict';"
367
- "(function(AsyncCallback) {"
368
- "return function(ptr, did_finish, promise) {"
369
- "promise.then(function(val) {"
370
- "AsyncCallback(ptr, did_finish, val);"
371
- "}, function(err) {"
372
- "AsyncCallback(ptr, did_finish, null, err);"
373
- "});"
374
- "};"
375
- "})"
376
- )));
377
- Local<Value> outer_fn = Unmaybe(script->Run(context));
378
- assert(outer_fn->IsFunction());
379
- Local<Value> callback_fn = Unmaybe(FunctionTemplate::New(isolate, AsyncCallback)->GetFunction(context));
380
- Local<Value> inner_fn = Unmaybe(outer_fn.As<Function>()->Call(context, Undefined(isolate), 1, &callback_fn));
381
- assert(inner_fn->IsFunction());
382
- return inner_fn.As<Function>();
383
- }
384
-
385
- auto TransferArguments() -> std::vector<Local<Value>> {
386
- std::vector<Local<Value>> argv_inner;
387
- size_t argc = argv.size();
388
- argv_inner.reserve(argc);
389
- for (size_t ii = 0; ii < argc; ++ii) {
390
- argv_inner.emplace_back(argv[ii]->TransferIn());
391
- }
392
- return argv_inner;
393
- }
394
-
395
- std::vector<unique_ptr<Transferable>> argv;
396
- RemoteHandle<Context> context;
397
- RemoteHandle<Value> reference;
398
- unique_ptr<Transferable> recv;
399
- unique_ptr<Transferable> ret;
400
- uint32_t timeout = 0;
401
- // Only used in the AsyncPhase2 case
402
- shared_ptr<char> did_finish; // GCC 5.4.0 `std::make_shared<bool>(...)` is broken(?)
403
- TransferOptions return_transfer_options{TransferOptions::Type::Reference};
404
- unique_ptr<ExternalCopy> async_error;
405
- Scheduler::AsyncWait* async_wait = nullptr;
406
- };
407
- template <int async>
408
- auto ReferenceHandle::Apply(MaybeLocal<Value> recv_handle, Maybe<ArrayRange> maybe_arguments, MaybeLocal<Object> maybe_options) -> Local<Value> {
409
- return ThreePhaseTask::Run<async, ApplyRunner>(*isolate, *this, recv_handle, maybe_arguments, maybe_options);
410
- }
411
-
412
- /**
413
- * Copy this reference's value into this isolate
414
- */
415
- class CopyRunner : public ThreePhaseTask {
416
- public:
417
- CopyRunner(
418
- const ReferenceHandle& that,
419
- RemoteHandle<Context> context,
420
- RemoteHandle<Value> reference
421
- ) : context{std::move(context)}, reference{std::move(reference)} {
422
- that.CheckDisposed();
423
- }
424
-
425
- void Phase2() final {
426
- Context::Scope context_scope{Deref(context)};
427
- Local<Value> value = Deref(reference);
428
- copy = ExternalCopy::Copy(value);
429
- }
430
-
431
- auto Phase3() -> Local<Value> final {
432
- return copy->TransferIn();
433
- }
434
-
435
- private:
436
- RemoteHandle<Context> context;
437
- RemoteHandle<Value> reference;
438
- unique_ptr<Transferable> copy;
439
- };
440
-
441
- template <int async>
442
- auto ReferenceHandle::Copy() -> Local<Value> {
443
- return ThreePhaseTask::Run<async, CopyRunner>(*isolate, *this, context, reference);
444
- }
445
-
446
- /**
447
- * Base class for get, set, and delete runners
448
- */
449
- class AccessorRunner : public ThreePhaseTask {
450
- public:
451
- AccessorRunner(ReferenceHandle& target, Local<Value> key_handle) :
452
- context{target.context},
453
- target{target.reference},
454
- key{ExternalCopy::CopyIfPrimitive(key_handle)} {
455
- target.CheckDisposed();
456
- if (!key || (!key_handle->IsName() && !key_handle->IsUint32())) {
457
- throw RuntimeTypeError("Invalid `key`");
458
- } else if (target.type_of != decltype(target.type_of)::Object) {
459
- throw RuntimeTypeError("Reference is not an object");
460
- }
461
- }
462
-
463
- protected:
464
- auto GetTargetAndAlsoCheckForProxy() -> Local<Object> {
465
- auto object = Local<Object>::Cast(Deref(target));
466
- if (HasProxy(object)) {
467
- throw RuntimeTypeError("Object is or has proxy");
468
- }
469
- return object;
470
- }
471
-
472
- auto GetKey(Local<Context> context) -> Local<Name> {
473
- auto key_inner = key->CopyInto();
474
- return (key_inner->IsString() || key_inner->IsSymbol()) ?
475
- key_inner.As<Name>() : Unmaybe(key_inner->ToString(context)).As<Name>();
476
- }
477
-
478
- RemoteHandle<Context> context;
479
-
480
- private:
481
- static auto HasProxy(Local<Object> object) -> bool {
482
- if (object->IsProxy()) {
483
- return true;
484
- } else {
485
- auto proto = object->GetPrototype();
486
- if (proto->IsNullOrUndefined()) {
487
- return false;
488
- } else {
489
- return HasProxy(proto.As<Object>());
490
- }
491
- }
492
- }
493
-
494
- RemoteHandle<Value> target;
495
- unique_ptr<ExternalCopy> key;
496
- };
497
-
498
- /**
499
- * Get a property from this reference, returned as another reference
500
- */
501
- class GetRunner final : public AccessorRunner {
502
- public:
503
- GetRunner(ReferenceHandle& target, Local<Value> key_handle, MaybeLocal<Object> maybe_options) :
504
- AccessorRunner{target, key_handle},
505
- options{maybe_options, target.inherit ?
506
- TransferOptions::Type::DeepReference : TransferOptions::Type::Reference},
507
- accessors{target.accessors || ReadOption(maybe_options, StringTable::Get().accessors, false)},
508
- inherit{target.inherit} {}
509
-
510
- void Phase2() final {
511
- // Setup
512
- auto* isolate = Isolate::GetCurrent();
513
- auto context = Deref(this->context);
514
- Context::Scope context_scope{context};
515
- auto name = GetKey(context);
516
- auto object = GetTargetAndAlsoCheckForProxy();
517
-
518
- // Get property
519
- ret = TransferOut([&]() {
520
- if (inherit) {
521
- // To avoid accessors I guess we have to walk the prototype chain ourselves
522
- auto target = object;
523
- if (!accessors) {
524
- do {
525
- if (Unmaybe(target->HasOwnProperty(context, name))) {
526
- if (Unmaybe(target->HasRealNamedCallbackProperty(context, name))) {
527
- throw RuntimeTypeError("Property is getter");
528
- }
529
- return Unmaybe(target->GetRealNamedProperty(context, name));
530
- }
531
- auto next = target->GetPrototype();
532
- if (next->IsNullOrUndefined()) {
533
- return Undefined(isolate).As<Value>();
534
- }
535
- target = next.As<Object>();
536
- } while (true);
537
- }
538
- } else if (!Unmaybe(object->HasOwnProperty(context, name))) {
539
- return Undefined(isolate).As<Value>();
540
- } else if (!accessors && Unmaybe(object->HasRealNamedCallbackProperty(context, name))) {
541
- throw RuntimeTypeError("Property is getter");
542
- }
543
- return Unmaybe(object->Get(context, name));
544
- }(), options);
545
- }
546
-
547
- auto Phase3() -> Local<Value> final {
548
- return ret->TransferIn();
549
- }
550
-
551
- private:
552
- unique_ptr<Transferable> ret;
553
- TransferOptions options;
554
- bool accessors;
555
- bool inherit;
556
- };
557
- template <int async>
558
- auto ReferenceHandle::Get(Local<Value> key_handle, MaybeLocal<Object> maybe_options) -> Local<Value> {
559
- return ThreePhaseTask::Run<async, GetRunner>(*isolate, *this, key_handle, maybe_options);
560
- }
561
-
562
- /**
563
- * Delete a property on this reference
564
- */
565
- class DeleteRunner final : public AccessorRunner {
566
- public:
567
- DeleteRunner(ReferenceHandle& that, Local<Value> key_handle) :
568
- AccessorRunner{that, key_handle} {}
569
-
570
- void Phase2() final {
571
- auto context = Deref(this->context);
572
- Context::Scope context_scope{context};
573
- auto object = GetTargetAndAlsoCheckForProxy();
574
- if (!Unmaybe(object->Delete(context, GetKey(context)))) {
575
- throw RuntimeTypeError("Delete failed");
576
- }
577
- }
578
-
579
- auto Phase3() -> Local<Value> final {
580
- return Undefined(Isolate::GetCurrent());
581
- }
582
- };
583
- template <int async>
584
- auto ReferenceHandle::Delete(Local<Value> key_handle) -> Local<Value> {
585
- return ThreePhaseTask::Run<async, DeleteRunner>(*isolate, *this, key_handle);
586
- }
587
-
588
- /**
589
- * Attempt to set a property on this reference
590
- */
591
- class SetRunner final : public AccessorRunner {
592
- public:
593
- SetRunner(
594
- ReferenceHandle& that,
595
- Local<Value> key_handle,
596
- Local<Value> val_handle,
597
- MaybeLocal<Object> maybe_options
598
- ) :
599
- AccessorRunner{that, key_handle},
600
- val{TransferOut(val_handle, TransferOptions{maybe_options})} {}
601
-
602
- void Phase2() final {
603
- auto context = Deref(this->context);
604
- Context::Scope context_scope{context};
605
- auto name = GetKey(context);
606
- auto object = GetTargetAndAlsoCheckForProxy();
607
- // Delete key before transferring in, potentially freeing up some v8 heap
608
- Unmaybe(object->Delete(context, name));
609
- auto val_inner = val->TransferIn();
610
- if (!Unmaybe(object->CreateDataProperty(context, GetKey(context), val_inner))) {
611
- throw RuntimeTypeError("Set failed");
612
- }
613
- }
614
-
615
- auto Phase3() -> Local<Value> final {
616
- return Undefined(Isolate::GetCurrent());
617
- }
618
-
619
- private:
620
- unique_ptr<Transferable> val;
621
- };
622
- template <int async>
623
- auto ReferenceHandle::Set(Local<Value> key_handle, Local<Value> val_handle, MaybeLocal<Object> maybe_options) -> Local<Value> {
624
- return ThreePhaseTask::Run<async, SetRunner>(*isolate, *this, key_handle, val_handle, maybe_options);
625
- }
626
-
627
- void ReferenceHandle::CheckDisposed() const {
628
- if (!reference) {
629
- throw RuntimeGenericError("Reference has been released");
630
- }
631
- }
632
-
633
- /**
634
- * ReferenceHandleTransferable implementation
635
- */
636
- auto ReferenceHandleTransferable::TransferIn() -> Local<Value> {
637
- return ClassHandle::NewInstance<ReferenceHandle>(std::move(*this));
638
- }
639
-
640
- } // namespace ivm