Skip to content

Commit f99f5d3

Browse files
addaleaxdanielleadams
authored andcommitted
src: add detailed embedder process initialization API
So far, process initialization has been a bit all over the place in Node.js. `InitializeNodeWithArgs()` is our main public API for this, but inclusion of items in it vs. `InitializeOncePerProcess()` and `PlatformInit()` has been random at best. Likewise, some pieces of initialization have been guarded by `NODE_SHARED_MODE`, but also fairly randomly and without any meaningful connection to shared library usage. This leaves embedders in a position to cherry-pick some of the initialization code into their own code to make their application behave like typical Node.js applications to the degree to which they desire it. Electron takes an alternative route and makes direct use of `InitializeOncePerProcess()` already while it is a private API, with a `TODO` to add it to the public API in Node.js. This commit addresses that `TODO`, and `TODO`s around the `NODE_SHARED_MODE` usage. Specifically: - `InitializeOncePerProcess()` and `TearDownOncePerProcess()` are added to the public API. - The `flags` option of these functions are merged with the `flags` option for `InitializeNodeWithArgs()`, since they essentially share the same semantics. - The return value of the function is made an abstract class, rather than a struct, for easier API/ABI stability. - Initialization code from `main()` is brought into these functions (since that makes sense in general). - Add a `TODO` for turning `InitializeNodeWithArgs()` into a small wrapper around `InitializeOncePerProcess()` and eventually removing it (at least one major release cycle each, presumably). - Remove `NODE_SHARED_MODE` guards and replace them with runtime options. PR-URL: #44121 Backport-PR-URL: #44358 Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Michael Dawson <midawson@redhat.com>
1 parent 56c9c98 commit f99f5d3

File tree

9 files changed

+430
-311
lines changed

9 files changed

+430
-311
lines changed

doc/api/embedding.md

+13-7
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,18 @@ the `node` and `v8` C++ namespaces, respectively.
3737
int main(int argc, char** argv) {
3838
argv = uv_setup_args(argc, argv);
3939
std::vector<std::string> args(argv, argv + argc);
40-
std::vector<std::string> exec_args;
41-
std::vector<std::string> errors;
4240
// Parse Node.js CLI options, and print any errors that have occurred while
4341
// trying to parse them.
44-
int exit_code = node::InitializeNodeWithArgs(&args, &exec_args, &errors);
45-
for (const std::string& error : errors)
42+
std::unique_ptr<node::InitializationResult> result =
43+
node::InitializeOncePerProcess(args, {
44+
node::ProcessInitializationFlags::kNoInitializeV8,
45+
node::ProcessInitializationFlags::kNoInitializeNodeV8Platform
46+
});
47+
48+
for (const std::string& error : result->errors())
4649
fprintf(stderr, "%s: %s\n", args[0].c_str(), error.c_str());
47-
if (exit_code != 0) {
48-
return exit_code;
50+
if (result->early_return() != 0) {
51+
return result->exit_code();
4952
}
5053

5154
// Create a v8::Platform instance. `MultiIsolatePlatform::Create()` is a way
@@ -58,10 +61,13 @@ int main(int argc, char** argv) {
5861
V8::Initialize();
5962

6063
// See below for the contents of this function.
61-
int ret = RunNodeInstance(platform.get(), args, exec_args);
64+
int ret = RunNodeInstance(
65+
platform.get(), result->args(), result->exec_args());
6266

6367
V8::Dispose();
6468
V8::DisposePlatform();
69+
70+
node::TearDownOncePerProcess();
6571
return ret;
6672
}
6773
```

0 commit comments

Comments
 (0)