From e175512d43c41a1b3b0d59a4df7c09cc5bd5ef5d Mon Sep 17 00:00:00 2001 From: LongYinan Date: Fri, 1 Aug 2025 15:05:08 +0800 Subject: [PATCH] fix(napi): async task finally is not called (#2824) --- crates/napi/src/task.rs | 10 +++-- .../__tests__/__snapshots__/values.spec.ts.md | 2 + .../__snapshots__/values.spec.ts.snap | Bin 7413 -> 7423 bytes examples/napi/__tests__/values.spec.ts | 13 ++++++- examples/napi/example.wasi-browser.js | 1 + examples/napi/example.wasi.cjs | 1 + examples/napi/index.cjs | 1 + examples/napi/index.d.cts | 2 + examples/napi/src/task.rs | 36 ++++++++++++++++++ 9 files changed, 62 insertions(+), 4 deletions(-) diff --git a/crates/napi/src/task.rs b/crates/napi/src/task.rs index be8dddb7..05489e8b 100644 --- a/crates/napi/src/task.rs +++ b/crates/napi/src/task.rs @@ -31,15 +31,19 @@ impl<'a, T: Task> ScopedTask<'a> for T { type JsValue = T::JsValue; fn compute(&mut self) -> Result { - Task::compute(self) + T::compute(self) } fn resolve(&mut self, env: &'a Env, output: Self::Output) -> Result { - Task::resolve(self, Env::from_raw(env.raw()), output) + T::resolve(self, Env::from_raw(env.raw()), output) } fn reject(&mut self, env: &'a Env, err: Error) -> Result { - Task::reject(self, Env::from_raw(env.raw()), err) + T::reject(self, Env::from_raw(env.raw()), err) + } + + fn finally(self, env: Env) -> Result<()> { + T::finally(self, env) } } diff --git a/examples/napi/__tests__/__snapshots__/values.spec.ts.md b/examples/napi/__tests__/__snapshots__/values.spec.ts.md index 6f50b4a2..5284748a 100644 --- a/examples/napi/__tests__/__snapshots__/values.spec.ts.md +++ b/examples/napi/__tests__/__snapshots__/values.spec.ts.md @@ -394,6 +394,8 @@ Generated by [AVA](https://avajs.dev). ␊ export declare function asyncResolveArray(inner: number): Promise␊ ␊ + export declare function asyncTaskFinally(inner: object): Promise␊ + ␊ export declare function asyncTaskOptionalReturn(): Promise␊ ␊ export declare function asyncTaskReadFile(path: string): Promise␊ diff --git a/examples/napi/__tests__/__snapshots__/values.spec.ts.snap b/examples/napi/__tests__/__snapshots__/values.spec.ts.snap index 9250edfd886f51fd0b8690fb535d63939ee5083e..86b50884a64bcb18959e47be034b7750224ac4a2 100644 GIT binary patch delta 7415 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 pV3R4R4XI+8So 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 diff --git a/examples/napi/__tests__/values.spec.ts b/examples/napi/__tests__/values.spec.ts index f6476e1d..092f89a6 100644 --- a/examples/napi/__tests__/values.spec.ts +++ b/examples/napi/__tests__/values.spec.ts @@ -79,6 +79,7 @@ import { withAbortController, asyncTaskReadFile, asyncTaskOptionalReturn, + asyncTaskFinally, asyncResolveArray, asyncMultiTwo, bigintAdd, @@ -1342,7 +1343,7 @@ test('should be able to return object from shared crate', (t) => { const AbortSignalTest = typeof AbortController !== 'undefined' ? test : test.skip -AbortSignalTest('async task without abort controller', async (t) => { +test('async task without abort controller', async (t) => { t.is(await withoutAbortController(1, 2), 3) }) @@ -1394,6 +1395,16 @@ test('abort signal should be able to reuse with different tasks', async (t) => { }) }) +test('async task finally must be called', async (t) => { + const obj = { + finally: false, + resolve: false, + } + await asyncTaskFinally(obj) + t.is(obj.finally, true) + t.is(obj.resolve, true) +}) + const BigIntTest = typeof BigInt !== 'undefined' ? test : test.skip BigIntTest('BigInt add', (t) => { diff --git a/examples/napi/example.wasi-browser.js b/examples/napi/example.wasi-browser.js index eadf4772..10913a71 100644 --- a/examples/napi/example.wasi-browser.js +++ b/examples/napi/example.wasi-browser.js @@ -137,6 +137,7 @@ export const asyncMultiTwo = __napiModule.exports.asyncMultiTwo export const asyncPlus100 = __napiModule.exports.asyncPlus100 export const asyncReduceBuffer = __napiModule.exports.asyncReduceBuffer export const asyncResolveArray = __napiModule.exports.asyncResolveArray +export const asyncTaskFinally = __napiModule.exports.asyncTaskFinally export const asyncTaskOptionalReturn = __napiModule.exports.asyncTaskOptionalReturn export const asyncTaskReadFile = __napiModule.exports.asyncTaskReadFile export const asyncTaskVoidReturn = __napiModule.exports.asyncTaskVoidReturn diff --git a/examples/napi/example.wasi.cjs b/examples/napi/example.wasi.cjs index 4c406d0b..93604b57 100644 --- a/examples/napi/example.wasi.cjs +++ b/examples/napi/example.wasi.cjs @@ -182,6 +182,7 @@ module.exports.asyncMultiTwo = __napiModule.exports.asyncMultiTwo module.exports.asyncPlus100 = __napiModule.exports.asyncPlus100 module.exports.asyncReduceBuffer = __napiModule.exports.asyncReduceBuffer module.exports.asyncResolveArray = __napiModule.exports.asyncResolveArray +module.exports.asyncTaskFinally = __napiModule.exports.asyncTaskFinally module.exports.asyncTaskOptionalReturn = __napiModule.exports.asyncTaskOptionalReturn module.exports.asyncTaskReadFile = __napiModule.exports.asyncTaskReadFile module.exports.asyncTaskVoidReturn = __napiModule.exports.asyncTaskVoidReturn diff --git a/examples/napi/index.cjs b/examples/napi/index.cjs index 8cf1d696..30cb15b5 100644 --- a/examples/napi/index.cjs +++ b/examples/napi/index.cjs @@ -467,6 +467,7 @@ module.exports.asyncMultiTwo = nativeBinding.asyncMultiTwo module.exports.asyncPlus100 = nativeBinding.asyncPlus100 module.exports.asyncReduceBuffer = nativeBinding.asyncReduceBuffer module.exports.asyncResolveArray = nativeBinding.asyncResolveArray +module.exports.asyncTaskFinally = nativeBinding.asyncTaskFinally module.exports.asyncTaskOptionalReturn = nativeBinding.asyncTaskOptionalReturn module.exports.asyncTaskReadFile = nativeBinding.asyncTaskReadFile module.exports.asyncTaskVoidReturn = nativeBinding.asyncTaskVoidReturn diff --git a/examples/napi/index.d.cts b/examples/napi/index.d.cts index 99d8e4c9..0ebf0011 100644 --- a/examples/napi/index.d.cts +++ b/examples/napi/index.d.cts @@ -355,6 +355,8 @@ export declare function asyncReduceBuffer(buf: Buffer): Promise export declare function asyncResolveArray(inner: number): Promise +export declare function asyncTaskFinally(inner: object): Promise + export declare function asyncTaskOptionalReturn(): Promise export declare function asyncTaskReadFile(path: string): Promise diff --git a/examples/napi/src/task.rs b/examples/napi/src/task.rs index 758b59d8..be8a7352 100644 --- a/examples/napi/src/task.rs +++ b/examples/napi/src/task.rs @@ -17,6 +17,10 @@ impl napi::Task for DelaySum { fn resolve(&mut self, _env: napi::Env, output: Self::Output) -> Result { Ok(output) } + + fn finally(self, _env: Env) -> Result<()> { + Ok(()) + } } #[napi] @@ -122,3 +126,35 @@ pub fn async_resolve_array(inner: u32) -> AsyncTask { inner: inner as usize, }) } + +pub struct AsyncTaskFinally { + inner: ObjectRef, +} + +#[napi] +impl Task for AsyncTaskFinally { + type Output = (); + type JsValue = (); + + fn compute(&mut self) -> Result { + Ok(()) + } + + fn resolve(&mut self, env: Env, _output: Self::Output) -> Result { + let mut obj = self.inner.get_value(&env)?; + obj.set("resolve", true)?; + Ok(()) + } + + fn finally(self, env: Env) -> Result<()> { + let mut obj = self.inner.get_value(&env)?; + obj.set("finally", true)?; + self.inner.unref(&env)?; + Ok(()) + } +} + +#[napi] +pub fn async_task_finally(inner: ObjectRef) -> AsyncTask { + AsyncTask::new(AsyncTaskFinally { inner }) +}