Note: This migration guide assumes a project is using Neon 0.10 without Node-API backend. If using an older version or the legacy backend, see the previous migration guide.
The Neon 1.0 has stabilized and brings a more consistent and ergonomic API. There are a few (minor) breaking changes and this guide will help walk through them!
A few traits have been removed because they were either redundant or only used for features that no longer exist.
The Managed
trait marked values that were managed by the JavaScript VM. It was redundant with the Value
trait. Trait bounds referencing Managed
may be either removed or replaced with Value
.
fn example<V>(h: Handle<V>)
where
V: Managed,
{
}
fn example<V>(h: Handle<V>)
where
V: Value,
{
}
The This
trait marked values for cx.this()
in JsFunction
. However, it was not type checked and could result in a panic at runtime. Instead, cx.this()
always returns a JsValue
. Since, JsFunction
's T
parameter had a default, in many cases no changes are necessary. In some cases, the T
parameter will need to be removed and a downcast
added.
// `CallContext<JsObject>` is equivalent to `FunctionContext`
fn example(mut cx: CallContext<JsObject>) -> JsResult<JsUndefined> {
let a = cx.this().get::<JsValue, _, _>(&mut cx, "a")?;
Ok(cx.undefined())
}
fn example(mut cx: FunctionContext) -> JsResult<JsUndefined> {
let a = cx.this::<JsObject>()?.get::<JsValue, _, _>(&mut cx, "a")?;
Ok(cx.undefined())
}
The JsResultExt
trait provided a .or_throw(&mut cx)
to allow converting a Rust error into a JavaScript exception. However, it required T: Value
. It has been replaced with a more generic ResultExt
trait. Most usages only require replacing JsResultExt
with ResultExt
. In some cases, an additional T: Value
bound will need to be added or removed.
use neon::result::JsResultExt;
use neon::result::ResultExt;
Neon inconsistently used u32
, usize
, and sometimes even i32
for indexes and lengths. For consistency with Rust, usize
is used everywhere. Update explicit types to use usize
and remove type casting. Implicit types do not need to be updated.
fn example(mut cx: FunctionContext) -> JsResult<JsUndefined> {
let arr = cx.empty_array();
let msg = cx.string("Hello!");
arr.set(&mut cx, 0u32, msg)?;
Ok(cx.undefined())
}
fn example(mut cx: FunctionContext) -> JsResult<JsUndefined> {
let arr = cx.empty_array();
let msg = cx.string("Hello!");
arr.set(&mut cx, 0usize, msg)?;
Ok(cx.undefined())
}
Neon 0.10
made extensive use of feature flags for features that had not been stabilized (e.g., try-catch-api
, channel-api
). All features have been stabilized and the feature flags removed. Resolve by removing these features from the project's Cargo.toml
.
Two feature flags are still exist: napi-N
for the Node-API version and futures
for compatibility between Rust Future
and JavaScript Promise
.