Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

doc: add blurb about implications of ABI stability #22508

Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions doc/api/addons.md
Expand Up @@ -367,6 +367,10 @@ set of APIs that are used by the native code. Instead of using the V8
or [Native Abstractions for Node.js][] APIs, the functions available
in the N-API are used.

Creating and maintaining an addon that benefits from the ABI stability
provided by N-API carries with it certain
[implementation considerations](n-api.html#n_api_implications_of_abi_stability).

To use N-API in the above "Hello world" example, replace the content of
`hello.cc` with the following. All other instructions remain the same.

Expand Down
33 changes: 33 additions & 0 deletions doc/api/n-api.md
Expand Up @@ -42,6 +42,39 @@ for the N-API C based functions exported by Node.js. These wrappers are not
part of N-API, nor will they be maintained as part of Node.js. One such
example is: [node-addon-api](https://github.com/nodejs/node-addon-api).

## Implications of ABI Stability

Although N-API provides an ABI stability guarantee, other parts of Node.js do
not, and any external libraries used from the addon may not. In particular,
neither of the following Node.js APIs provides an ABI stability guarantee:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this wording is a bit misleading – we do have ABI stability guarantees, but we follow semver rather than not allowing any breakage.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point - sorry!

Copy link
Contributor

@mscdex mscdex Aug 24, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about instead (s/neither/none/, s/Node.js//, s/provides/provide/):

In particular, none of the following APIs provide an ABI stability guarantee:

* the Node.js C++ APIs available via any of
```C++
#include <node_buffer.h>
#include <node_context_data.h>
#include <node_contextify.h>
#include <node_mutex.h>
#include <node_object_wrap.h>
#include <node_perf_common.h>
#include <node_platform.h>
#include <node_version.h>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Only node_buffer.h, node_version.h, node_object_wrap.h and node.h (+ N-API) are real public API. I’ll open a PR to put the others behind NODE_WANT_INTERNALS.

```
* the libuv APIs which are also included with Node.js and available via
```C++
#include <uv.h>
```
* the V8 API available via
```C++
#include <v8.h>
```

Thus, for an addon to remain ABI-compatible across Node.js major versions, it
must make use exclusively of N-API by restricting itself to using
```C
#include <node_api.h>
```
and by checking, for all external library that it uses, that the external
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo: libraries

library makes ABI stability guarantees similar to N-API.

## Usage

In order to use the N-API functions, include the file
Expand Down