de192c2db2
* chore: bump node in DEPS to v18.16.0 * build,test: add proper support for IBM i https://github.com/nodejs/node/pull/46739 * lib: enforce use of trailing commas https://github.com/nodejs/node/pull/46881 * src: add initial support for single executable applications https://github.com/nodejs/node/pull/45038 * lib: do not crash using workers with disabled shared array buffers https://github.com/nodejs/node/pull/41023 * src: remove shadowed variable in OptionsParser::Parse https://github.com/nodejs/node/pull/46672 * src: allow embedder control of code generation policy https://github.com/nodejs/node/pull/46368 * src: allow optional Isolate termination in node::Stop() https://github.com/nodejs/node/pull/46583 * lib: fix BroadcastChannel initialization location https://github.com/nodejs/node/pull/46864 * chore: fixup patch indices * chore: sync filenames.json * fix: add simdutf dep to src/inspector BUILD.gn - https://github.com/nodejs/node/pull/46471 - https://github.com/nodejs/node/pull/46472 * deps: replace url parser with Ada https://github.com/nodejs/node/pull/46410 * tls: support automatic DHE https://github.com/nodejs/node/pull/46978 * fixup! src: add initial support for single executable applications * http: unify header treatment https://github.com/nodejs/node/pull/46528 * fix: libc++ buffer overflow in string_view ctor https://github.com/nodejs/node/pull/46410 * test: include strace openat test https://github.com/nodejs/node/pull/46150 * fixup! fixup! src: add initial support for single executable applications --------- Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
105 lines
3.5 KiB
C++
105 lines
3.5 KiB
C++
// Copyright (c) 2022 Microsoft, Inc.
|
|
// Use of this source code is governed by the MIT license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "shell/services/node/node_service.h"
|
|
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "base/command_line.h"
|
|
#include "base/strings/utf_string_conversions.h"
|
|
#include "shell/browser/javascript_environment.h"
|
|
#include "shell/common/api/electron_bindings.h"
|
|
#include "shell/common/gin_converters/file_path_converter.h"
|
|
#include "shell/common/gin_helper/dictionary.h"
|
|
#include "shell/common/node_bindings.h"
|
|
#include "shell/common/node_includes.h"
|
|
#include "shell/services/node/parent_port.h"
|
|
|
|
namespace electron {
|
|
|
|
NodeService::NodeService(
|
|
mojo::PendingReceiver<node::mojom::NodeService> receiver)
|
|
: node_bindings_(
|
|
NodeBindings::Create(NodeBindings::BrowserEnvironment::kUtility)),
|
|
electron_bindings_(
|
|
std::make_unique<ElectronBindings>(node_bindings_->uv_loop())) {
|
|
if (receiver.is_valid())
|
|
receiver_.Bind(std::move(receiver));
|
|
}
|
|
|
|
NodeService::~NodeService() {
|
|
if (!node_env_stopped_) {
|
|
node_env_->env()->set_trace_sync_io(false);
|
|
js_env_->DestroyMicrotasksRunner();
|
|
node::Stop(node_env_->env(), node::StopFlags::kDoNotTerminateIsolate);
|
|
}
|
|
}
|
|
|
|
void NodeService::Initialize(node::mojom::NodeServiceParamsPtr params) {
|
|
if (NodeBindings::IsInitialized())
|
|
return;
|
|
|
|
ParentPort::GetInstance()->Initialize(std::move(params->port));
|
|
|
|
js_env_ = std::make_unique<JavascriptEnvironment>(node_bindings_->uv_loop());
|
|
|
|
v8::HandleScope scope(js_env_->isolate());
|
|
|
|
node_bindings_->Initialize(js_env_->isolate()->GetCurrentContext());
|
|
|
|
// Append program path for process.argv0
|
|
auto program = base::CommandLine::ForCurrentProcess()->GetProgram();
|
|
#if defined(OS_WIN)
|
|
params->args.insert(params->args.begin(), base::WideToUTF8(program.value()));
|
|
#else
|
|
params->args.insert(params->args.begin(), program.value());
|
|
#endif
|
|
|
|
// Create the global environment.
|
|
node::Environment* env = node_bindings_->CreateEnvironment(
|
|
js_env_->isolate()->GetCurrentContext(), js_env_->platform(),
|
|
params->args, params->exec_args);
|
|
node_env_ = std::make_unique<NodeEnvironment>(env);
|
|
|
|
node::SetProcessExitHandler(
|
|
env, [this](node::Environment* env, int exit_code) {
|
|
// Destroy node platform.
|
|
env->set_trace_sync_io(false);
|
|
js_env_->DestroyMicrotasksRunner();
|
|
node::Stop(env, node::StopFlags::kDoNotTerminateIsolate);
|
|
node_env_stopped_ = true;
|
|
receiver_.ResetWithReason(exit_code, "");
|
|
});
|
|
|
|
env->set_trace_sync_io(env->options()->trace_sync_io);
|
|
|
|
// Add Electron extended APIs.
|
|
electron_bindings_->BindTo(env->isolate(), env->process_object());
|
|
|
|
// Add entry script to process object.
|
|
gin_helper::Dictionary process(env->isolate(), env->process_object());
|
|
process.SetHidden("_serviceStartupScript", params->script);
|
|
|
|
// Setup microtask runner.
|
|
js_env_->CreateMicrotasksRunner();
|
|
|
|
// Wrap the uv loop with global env.
|
|
node_bindings_->set_uv_env(env);
|
|
|
|
// LoadEnvironment should be called after setting up
|
|
// JavaScriptEnvironment including the microtask runner
|
|
// since this call will start compilation and execution
|
|
// of the entry script. If there is an uncaught exception
|
|
// the exit handler set above will be triggered and it expects
|
|
// both Node Env and JavaScriptEnviroment are setup to perform
|
|
// a clean shutdown of this process.
|
|
node_bindings_->LoadEnvironment(env);
|
|
|
|
// Run entry script.
|
|
node_bindings_->PrepareEmbedThread();
|
|
node_bindings_->StartPolling();
|
|
}
|
|
|
|
} // namespace electron
|