Commit graph

340 commits

Author SHA1 Message Date
LongYinan
688ee04247
Release independent packages
- napi-build@2.1.0
- napi-derive@2.14.0
- napi@2.14.0
- napi-sys@2.3.0
2023-11-07 14:18:36 +08:00
LongYinan
36581336c6
feat(napi): pass the rest of async tests (#1792)
Pass the rest of async tests, including await the JavaScript Promise in the Rust side, and the worker_threads tests.
2023-11-07 01:46:43 +08:00
LongYinan
3deae16442
fix(napi): add tokio cleanup hook for more platforms (#1790) 2023-11-06 13:59:54 +08:00
LongYinan
65f57918fb
style(napi): as ptr => ptr::cast (#1786) 2023-11-06 11:22:30 +08:00
LongYinan
1e5c32ca60
style(napi): fix compile warning (#1785) 2023-11-06 11:21:26 +08:00
LongYinan
feabcd7f16
test(napi): add tests for napi9 features (#1784) 2023-11-06 11:03:44 +08:00
LongYinan
4e4d891ad8
feat: add experimental Env::get_module_file_name method (#1783) 2023-11-06 11:01:27 +08:00
LongYinan
2b0ddf4a21
feat(napi,sys): sync to napi9 (#1781)
- Close https://github.com/napi-rs/napi-rs/issues/1600
2023-11-06 11:00:27 +08:00
LongYinan
546b108a5b
feat(napi): support async class factory (#1779)
- Close https://github.com/napi-rs/napi-rs/issues/1777
2023-11-06 10:58:23 +08:00
LongYinan
0dc1ef738b fix(napi): asan caught memory safety issue 2023-11-04 15:26:07 +08:00
Özgür Akkurt
2c410b238d
feat(napi): impl Default for Buffer (#1734) 2023-11-02 22:32:13 +08:00
stefan-gorules
afdd4060ab
fix(napi): js promise error messages (#1672) 2023-11-02 17:32:20 +08:00
kuzeyardabulut
3a1a280d5f
fix(napi): potential double free issue (#1679)
* Update module_register.rs

* Run fmt

---------

Co-authored-by: LongYinan <lynweklm@gmail.com>
2023-11-02 17:19:35 +08:00
LongYinan
13d0ce075e
feat: integrate with emnapi (#1669)
* Integrate with emnapi

* resolve conflict

* ignore wasm

* generate wasi file

* Add wasi test to workflow

* Fix wasi template

* emnapi new initialize api

* Finish test

* Purne tsconfig

* Generate wasi worker

* Fix electron test

* Finalize check

* Noop adjust_external_memory

* Apply cr suggestions
2023-11-02 12:57:11 +08:00
LongYinan
9db4581d7f
feat: bump msrv to 1.65 (#1755) 2023-10-17 20:18:29 +08:00
Markus
9b4beb83e9
chore(napi): make napi_register_module_v1 pub (#1747)
* feat(napi): make napi_register_module_v1 pub

* docs: add safety section

* chore: format doc comment
2023-10-09 11:18:34 +08:00
Tom Sherman
3418fd3e8f
feat(napi,sys): implement Symbol.for (#1721)
Co-authored-by: LongYinan <lynweklm@gmail.com>
2023-09-13 15:45:14 -07:00
LongYinan
05b4be4d80
style: clippy fix (#1711) 2023-08-30 16:41:13 +08:00
LongYinan
b1dd613243
Release independent packages
napi@2.13.3
2023-08-16 15:24:33 +08:00
plodsoft
8bf32be7d4
feat(napi): impl FromNapiValue for HashMap with custom hasher (#1682) 2023-08-11 11:05:04 +08:00
LongYinan
07d03c9435
chore: MSRV 1.63.0 2023-08-10 10:44:55 +08:00
LongYinan
a7eeb0c31c
fix(napi): promise resolve error (#1664) 2023-07-24 00:36:24 +08:00
LongYinan
4fdce25a17
docs: update CI badge 2023-07-19 10:40:42 +08:00
LongYinan
6d62b3f714
chore: upgrade dependencies (#1657) 2023-07-17 14:56:02 +08:00
Markus
73a704a19e
feat(napi): keep stack traces in a deferred context (#1637)
* feat(napi): keep stack traces in deferred context

* chore: reformat code

Signed-off-by: Markus <28785953+MarkusJx@users.noreply.github.com>

* chore: use napi wrappers

Signed-off-by: Markus <28785953+MarkusJx@users.noreply.github.com>

* test(napi): add test for deferred trace

Signed-off-by: Markus <28785953+MarkusJx@users.noreply.github.com>

* chore: fix format

Signed-off-by: Markus <28785953+MarkusJx@users.noreply.github.com>

---------

Signed-off-by: Markus <28785953+MarkusJx@users.noreply.github.com>
2023-07-15 12:07:14 +08:00
LongYinan
16f49a764f
ci: fix FreeBSD and macOS arm64 CI (#1648) 2023-07-10 16:29:43 +08:00
LongYinan
8ec367e6c5
Release independent packages
napi@2.13.2
2023-06-14 15:51:34 +08:00
LongYinan
53cd1bc904
fix(napi): impl send + sync for ThreadsafeFunction (#1622) 2023-06-14 15:24:01 +08:00
Alexey Orlenko
1fd469a7fc
chore: remove extra #[cfg] attribute (#1616)
This was accidentally added in 2d1e4144b3.
The second cfg attribute is essentially a no-op since the first one is
still valid and has more conditions, but we don't need it.
2023-06-07 09:30:18 +08:00
Levi Zim
dc6caf7d8e
docs(README): update platform support status (#1607)
Document riscv64 linux support status.
BTW add the missing node20 column.
2023-05-27 17:38:41 +08:00
LongYinan
17bd8718ee
Release independent packages
napi@2.13.1
2023-05-27 14:30:06 +08:00
LongYinan
5a2cd93708
fix(napi): missing ValidateNapiValue for JsObject (#1606) 2023-05-27 13:33:42 +08:00
LongYinan
433e5b13bf
Release independent packages
napi@2.13.0

napi-derive@2.13.0
2023-05-27 12:28:43 +08:00
LongYinan
c6258cf633
feat(napi): support chrono::NaiveDateTime (#1601) 2023-05-26 18:28:34 +08:00
LongYinan
e5163f7fc0
Release independent packages
napi@2.12.7
2023-05-20 10:56:29 +08:00
Jānis Gailis
d1fe0f0eb1
feat(napi): Bigint deserialization (#1592)
* Handle little endianness;
* Make sure get_<u/i>128 methods don't panic when words.len() < 2;
* Make sure BigInt deserialization takes into account word length and
  sign;

Signed-off-by: Janis Gailis <JanisGailis@users.noreply.github.com>
Co-authored-by: Janis Gailis <>
2023-05-19 17:27:29 +08:00
LongYinan
d184d503d5
fix(napi-derive): increase initial ref count in async fn (#1577) 2023-04-26 15:18:00 +08:00
LongYinan
9a220bd1c2
Release independent packages
napi@2.12.6

napi-derive@2.12.4
2023-04-25 13:27:53 +08:00
Maël Nison
2f00e79873
chore(napi): adds support for Rc<T> / Arc<T> / Mutex<T> (#1573)
* Adds support for Rc/Arc/Mutex<T>

* Fixes codegen

* Fixes lint

* Fix clippy

---------

Co-authored-by: LongYinan <lynweklm@gmail.com>
2023-04-25 11:14:06 +08:00
LongYinan
cd8888aa23
Release independent packages
napi@2.12.5
2023-04-17 00:00:06 +08:00
LongYinan
d9ff0b4ddf
fix(napi): do nothing in deferred if thread is destroyed (#1568) 2023-04-15 18:58:53 +08:00
LongYinan
d14fdca242
fix(napi): thread safe issue while creating class instance (#1561) 2023-04-15 15:37:01 +08:00
LongYinan
b60dbc5760
Release independent packages
napi@2.12.4
2023-04-11 11:44:32 +08:00
LongYinan
070230079d
fix(napi): noop feature 2023-04-11 11:44:10 +08:00
LongYinan
f4d9e09917
Release independent packages
napi@2.12.3

napi-derive@2.12.3
2023-04-11 11:21:48 +08:00
gaoquanzero
7fdcd7a8ae
chore(napi): add noop feature in napi crate (#1546) 2023-04-10 18:47:34 +08:00
LongYinan
66ef64bdc7
style(napi): use cast() instread as 2023-04-10 17:14:27 +08:00
LongYinan
752ffea1d9
fix(napi): revert Promise changes because of the flaky test 2023-04-10 17:14:26 +08:00
LongYinan
88773a7a8e
fix(napi): re-throw error in ThreadsafeFunction callback if we could 2023-04-10 17:02:13 +08:00
Alexey Orlenko
2d1e4144b3
fix: prevent crashing when napi_register_module_v1 is called twice (#1554)
* fix: prevent crashing when napi_register_module_v1 is called twice

Currently napi-rs addons can lead to the Node.js process aborting with
the following error when initialising the addon on Windows:

```
c:\ws\src\cleanup_queue-inl.h:32: Assertion `(insertion_info.second)
== (true)' failed.
```

This happens because `napi_add_env_cleanup_hook` must not be called
with the same arguments multiple times unless the previously scheduled
cleanup hook with the same arguments was already executed. However,
the cleanup hook added by `napi_register_module_v1` in napi-rs on
Windows was always created with `ptr::null_mut()` as an argument.

One case where this causes a problem is when using the addon from
multiple contexts (e.g. Node.js worker threads) at the same
time. However, Node.js doesn't provide any guarantees that the N-API
addon initialisation code will run only once even per thread and
context. In fact, it's totally valid to run `process.dlopen()`
multiple times from JavaScript land in Node.js, and this will lead to
the initialisation code being run multiple times as different
`exports` objects may need to be populated. This may happen in
numerous cases, e.g.:

- When it's not possible or not desirable to use `require()` and users
  must resort to using `process.dlopen()` (one use case is passing
  non-default flags to `dlopen(3)`, another is ES modules). Caching
  the results of `process.dlopen()` to avoid running it more than once
  may not always be possible reliably in all cases (for example,
  because of Jest sandbox).

- When the `require` cache is cleared.

- On Windows: `require("./addon.node")` and then
  `require(path.toNamespacedPath("./addon.node"))`.

Another issue is fixed inside `napi::tokio_runtime::drop_runtime`:
there's no need to call `napi_remove_env_cleanup_hook` (it's only
useful to cancel the hooks that haven't been executed yet). Null
pointer retrieved from `arg` was being passed as the `env` argument of
that function, so it didn't do anything and just returned
`napi_invalid_arg`.

This patch makes `napi_register_module_v1` use a counter as the
cleanup hook argument, so that the value is always different. An
alternative might have been to use a higher-level abstraction around
`sys::napi_env_cleanup_hook` that would take ownership of a boxed
closure, if there is something like this in the API already. Another
alternative could have been to heap-allocate a value so that we would
have a unique valid memory address.

The patch also contains a minor code cleanup related to
`RT_REFERENCE_COUNT` along the way: the counter is encapsulated inside
its module and `ensure_runtime` takes care of incrementing it, and
less strict memory ordering is now used as there's no need for
`SeqCst` here. If desired, it can be further optimised to
`Ordering::Release` and a separate acquire fence inside the if
statement in `drop_runtime`, as `AcqRel` for every decrement is also a
bit stricter than necessary (although simpler). These changes are not
necessary to fix the issue and can be extracted to a separate patch.

At first it was tempting to use the loaded value of
`RT_REFERENCE_COUNT` as the argument for the cleanup hook but it would
have been wrong: a simple counterexample is the following sequence:

1. init in the first context (queue: 0)
2. init in the second context (queue: 0, 1)
3. destroy the first context (queue: 1)
4. init in the third context (queue: 1, 1)

* test(napi): unload test was excluded unexpected

---------

Co-authored-by: LongYinan <lynweklm@gmail.com>
2023-04-08 23:08:48 +08:00