#include #include using node::Environment; using node::MultiIsolatePlatform; using v8::Context; using v8::FunctionCallbackInfo; using v8::HandleScope; using v8::Isolate; using v8::Local; using v8::Locker; using v8::MaybeLocal; using v8::Object; using v8::SharedArrayBuffer; using v8::String; using v8::Unlocker; using v8::Value; void RunInSeparateIsolate(const FunctionCallbackInfo& args) { Isolate* parent_isolate = args.GetIsolate(); assert(args[0]->IsString()); String::Utf8Value code(parent_isolate, args[0]); assert(*code != nullptr); assert(args[1]->IsSharedArrayBuffer()); auto arg_bs = args[1].As()->GetBackingStore(); Environment* parent_env = node::GetCurrentEnvironment(parent_isolate->GetCurrentContext()); assert(parent_env != nullptr); MultiIsolatePlatform* platform = node::GetMultiIsolatePlatform(parent_env); assert(parent_env != nullptr); { Unlocker unlocker(parent_isolate); std::vector errors; const std::vector empty_args; auto setup = node::CommonEnvironmentSetup::Create(platform, &errors, empty_args, empty_args, node::EnvironmentFlags::kNoFlags); assert(setup); { Locker locker(setup->isolate()); Isolate::Scope isolate_scope(setup->isolate()); HandleScope handle_scope(setup->isolate()); Context::Scope context_scope(setup->context()); auto arg = SharedArrayBuffer::New(setup->isolate(), arg_bs); auto result = setup->context()->Global()->Set( setup->context(), v8::String::NewFromUtf8Literal(setup->isolate(), "arg"), arg); assert(!result.IsNothing()); MaybeLocal loadenv_ret = node::LoadEnvironment(setup->env(), *code); assert(!loadenv_ret.IsEmpty()); (void)node::SpinEventLoop(setup->env()); node::Stop(setup->env()); } } } void Initialize(Local exports, Local module, Local context) { NODE_SET_METHOD(exports, "runInSeparateIsolate", RunInSeparateIsolate); } NODE_MODULE_CONTEXT_AWARE(NODE_GYP_MODULE_NAME, Initialize)