| #include "node.h" |
| #include "uv.h" |
| #include <assert.h> |
| |
| // Note: This file is being referred to from doc/api/embedding.md, and excerpts |
| // from it are included in the documentation. Try to keep these in sync. |
| |
| using node::CommonEnvironmentSetup; |
| using node::Environment; |
| using node::MultiIsolatePlatform; |
| using v8::Context; |
| using v8::HandleScope; |
| using v8::Isolate; |
| using v8::Locker; |
| using v8::MaybeLocal; |
| using v8::V8; |
| using v8::Value; |
| |
| static int RunNodeInstance(MultiIsolatePlatform* platform, |
| const std::vector<std::string>& args, |
| const std::vector<std::string>& exec_args); |
| |
| int main(int argc, char** argv) { |
| argv = uv_setup_args(argc, argv); |
| std::vector<std::string> args(argv, argv + argc); |
| std::unique_ptr<node::InitializationResult> result = |
| node::InitializeOncePerProcess( |
| args, |
| {node::ProcessInitializationFlags::kNoInitializeV8, |
| node::ProcessInitializationFlags::kNoInitializeNodeV8Platform}); |
| |
| for (const std::string& error : result->errors()) |
| fprintf(stderr, "%s: %s\n", args[0].c_str(), error.c_str()); |
| if (result->early_return() != 0) { |
| return result->exit_code(); |
| } |
| |
| std::unique_ptr<MultiIsolatePlatform> platform = |
| MultiIsolatePlatform::Create(4); |
| V8::InitializePlatform(platform.get()); |
| V8::Initialize(); |
| |
| int ret = |
| RunNodeInstance(platform.get(), result->args(), result->exec_args()); |
| |
| V8::Dispose(); |
| V8::DisposePlatform(); |
| |
| node::TearDownOncePerProcess(); |
| return ret; |
| } |
| |
| int RunNodeInstance(MultiIsolatePlatform* platform, |
| const std::vector<std::string>& args, |
| const std::vector<std::string>& exec_args) { |
| int exit_code = 0; |
| |
| std::vector<std::string> errors; |
| std::unique_ptr<CommonEnvironmentSetup> setup = |
| CommonEnvironmentSetup::Create(platform, &errors, args, exec_args); |
| if (!setup) { |
| for (const std::string& err : errors) |
| fprintf(stderr, "%s: %s\n", args[0].c_str(), err.c_str()); |
| return 1; |
| } |
| |
| Isolate* isolate = setup->isolate(); |
| Environment* env = setup->env(); |
| |
| { |
| Locker locker(isolate); |
| Isolate::Scope isolate_scope(isolate); |
| HandleScope handle_scope(isolate); |
| Context::Scope context_scope(setup->context()); |
| |
| MaybeLocal<Value> loadenv_ret = node::LoadEnvironment( |
| env, |
| "const publicRequire =" |
| " require('module').createRequire(process.cwd() + '/');" |
| "globalThis.require = publicRequire;" |
| "globalThis.embedVars = { nön_ascıı: '🏳️🌈' };" |
| "require('vm').runInThisContext(process.argv[1]);"); |
| |
| if (loadenv_ret.IsEmpty()) // There has been a JS exception. |
| return 1; |
| |
| exit_code = node::SpinEventLoop(env).FromMaybe(1); |
| |
| node::Stop(env); |
| } |
| |
| return exit_code; |
| } |