From fb1be42eaa7249a319b4201ec05975c2f21cae71 Mon Sep 17 00:00:00 2001 From: matthewkeil Date: Fri, 30 Jun 2023 02:40:58 -0700 Subject: [PATCH 1/6] feat: add node-addon-api example for async_work_promise --- async_work_promise/node-addon-api/addon.cc | 29 ++++++++++++++++ async_work_promise/node-addon-api/binding.gyp | 32 ++++++++++++++++++ async_work_promise/node-addon-api/index.d.ts | 1 + async_work_promise/node-addon-api/index.js | 3 ++ .../node-addon-api/package.json | 21 ++++++++++++ async_work_promise/node-addon-api/test.ts | 3 ++ async_work_promise/node-addon-api/worker.cc | 0 async_work_promise/node-addon-api/worker.h | 33 +++++++++++++++++++ 8 files changed, 122 insertions(+) create mode 100644 async_work_promise/node-addon-api/addon.cc create mode 100644 async_work_promise/node-addon-api/binding.gyp create mode 100644 async_work_promise/node-addon-api/index.d.ts create mode 100644 async_work_promise/node-addon-api/index.js create mode 100644 async_work_promise/node-addon-api/package.json create mode 100644 async_work_promise/node-addon-api/test.ts create mode 100644 async_work_promise/node-addon-api/worker.cc create mode 100644 async_work_promise/node-addon-api/worker.h diff --git a/async_work_promise/node-addon-api/addon.cc b/async_work_promise/node-addon-api/addon.cc new file mode 100644 index 00000000..dbf21f7b --- /dev/null +++ b/async_work_promise/node-addon-api/addon.cc @@ -0,0 +1,29 @@ +#include "napi.h" +#include "worker.h" + +Napi::Value DoHeavyMath(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + if (!info[0].IsNumber()) { + Napi::TypeError::New(env, "num1 must be a number") + .ThrowAsJavaScriptException(); + return env.Undefined(); + } + uint32_t num_1 = info[0].As().Uint32Value(); + if (!info[1].IsNumber()) { + Napi::TypeError::New(env, "num2 must be a number") + .ThrowAsJavaScriptException(); + return env.Undefined(); + } + uint32_t num_2 = info[1].As().Uint32Value(); + DoHeavyMathWorker* worker = new DoHeavyMathWorker(env, num_1, num_2); + worker->Queue(); + return worker->GetPromise(); +} + +Napi::Object Init(Napi::Env env, Napi::Object exports) { + exports.Set(Napi::String::New(env, "doHeavyMath"), + Napi::Function::New(env, DoHeavyMath)); + return exports; +} + +NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init) \ No newline at end of file diff --git a/async_work_promise/node-addon-api/binding.gyp b/async_work_promise/node-addon-api/binding.gyp new file mode 100644 index 00000000..70c2618d --- /dev/null +++ b/async_work_promise/node-addon-api/binding.gyp @@ -0,0 +1,32 @@ +{ + "targets": [{ + "target_name": "addon", + "sources": [ + "addon.cc" + ], + "include_dirs": [ + "; \ No newline at end of file diff --git a/async_work_promise/node-addon-api/index.js b/async_work_promise/node-addon-api/index.js new file mode 100644 index 00000000..db8dca8d --- /dev/null +++ b/async_work_promise/node-addon-api/index.js @@ -0,0 +1,3 @@ +const bindings = require("bindings")("addon"); + +module.exports = exports = bindings; \ No newline at end of file diff --git a/async_work_promise/node-addon-api/package.json b/async_work_promise/node-addon-api/package.json new file mode 100644 index 00000000..ea4bb226 --- /dev/null +++ b/async_work_promise/node-addon-api/package.json @@ -0,0 +1,21 @@ +{ + "name": "async_worker_promise", + "version": "0.0.0", + "description": "AsyncWorker example that returns a Promise", + "main": "index.js", + "types": "index.d.ts", + "scripts": { + "test": "ts-node test" + }, + "author": "Matthew Keil (matthewkeil)", + "gypfile": true, + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^7.0.0" + }, + "devDependencies": { + "@types/node": "^20.3.2", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + } +} diff --git a/async_work_promise/node-addon-api/test.ts b/async_work_promise/node-addon-api/test.ts new file mode 100644 index 00000000..cfe98b1f --- /dev/null +++ b/async_work_promise/node-addon-api/test.ts @@ -0,0 +1,3 @@ +import {doHeavyMath} from "./index" + +doHeavyMath(2, 1).then(console.log); \ No newline at end of file diff --git a/async_work_promise/node-addon-api/worker.cc b/async_work_promise/node-addon-api/worker.cc new file mode 100644 index 00000000..e69de29b diff --git a/async_work_promise/node-addon-api/worker.h b/async_work_promise/node-addon-api/worker.h new file mode 100644 index 00000000..389658e5 --- /dev/null +++ b/async_work_promise/node-addon-api/worker.h @@ -0,0 +1,33 @@ +#include "napi.h" + +class DoHeavyMathWorker : public Napi::AsyncWorker { + public: + DoHeavyMathWorker(const Napi::Env& env, uint32_t num_1, uint32_t num_2) + : Napi::AsyncWorker{env, "DoHeavyMathWorker"}, + m_deferred{env}, + m_num_1{num_1}, + m_num_2{num_2} {} + + /** + * GetPromise associated with _deferred for return to JS + */ + Napi::Promise GetPromise() { return m_deferred.Promise(); } + + protected: + void Execute() { + // Simulate heavy math work + if (m_num_2 == 0) { + SetError("Cannot divide by zero"); + return; + } + m_result = m_num_1 / m_num_2; + } + void OnOK() { m_deferred.Resolve(Napi::Number::New(Env(), m_result)); } + void OnError(const Napi::Error& err) { m_deferred.Reject(err.Value()); } + + private: + Napi::Promise::Deferred m_deferred; + uint32_t m_num_1; + uint32_t m_num_2; + uint32_t m_result; +}; \ No newline at end of file From 2fc37f6d85d8dc2a7a4e14dc42e66fa924d61b69 Mon Sep 17 00:00:00 2001 From: matthewkeil Date: Fri, 30 Jun 2023 02:43:50 -0700 Subject: [PATCH 2/6] refactor: add a bit of spacing for clarity --- async_work_promise/node-addon-api/addon.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/async_work_promise/node-addon-api/addon.cc b/async_work_promise/node-addon-api/addon.cc index dbf21f7b..7668731d 100644 --- a/async_work_promise/node-addon-api/addon.cc +++ b/async_work_promise/node-addon-api/addon.cc @@ -3,18 +3,21 @@ Napi::Value DoHeavyMath(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); + if (!info[0].IsNumber()) { Napi::TypeError::New(env, "num1 must be a number") .ThrowAsJavaScriptException(); return env.Undefined(); } uint32_t num_1 = info[0].As().Uint32Value(); + if (!info[1].IsNumber()) { Napi::TypeError::New(env, "num2 must be a number") .ThrowAsJavaScriptException(); return env.Undefined(); } uint32_t num_2 = info[1].As().Uint32Value(); + DoHeavyMathWorker* worker = new DoHeavyMathWorker(env, num_1, num_2); worker->Queue(); return worker->GetPromise(); From aecc01a17a2b5970195feb70f803d9867d0d3fcd Mon Sep 17 00:00:00 2001 From: matthewkeil Date: Fri, 30 Jun 2023 02:44:55 -0700 Subject: [PATCH 3/6] refactor: remove empty worker.cc --- async_work_promise/node-addon-api/worker.cc | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 async_work_promise/node-addon-api/worker.cc diff --git a/async_work_promise/node-addon-api/worker.cc b/async_work_promise/node-addon-api/worker.cc deleted file mode 100644 index e69de29b..00000000 From c56fb08d56a6228406af6a8a6e6462eff786a656 Mon Sep 17 00:00:00 2001 From: matthewkeil Date: Sat, 1 Jul 2023 00:02:23 -0700 Subject: [PATCH 4/6] fix(async_work_promise): add EOF newline --- async_work_promise/node-addon-api/addon.cc | 2 +- async_work_promise/node-addon-api/worker.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/async_work_promise/node-addon-api/addon.cc b/async_work_promise/node-addon-api/addon.cc index 7668731d..35abd245 100644 --- a/async_work_promise/node-addon-api/addon.cc +++ b/async_work_promise/node-addon-api/addon.cc @@ -29,4 +29,4 @@ Napi::Object Init(Napi::Env env, Napi::Object exports) { return exports; } -NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init) \ No newline at end of file +NODE_API_MODULE(NODE_GYP_MODULE_NAME, Init) diff --git a/async_work_promise/node-addon-api/worker.h b/async_work_promise/node-addon-api/worker.h index 389658e5..d464a98e 100644 --- a/async_work_promise/node-addon-api/worker.h +++ b/async_work_promise/node-addon-api/worker.h @@ -30,4 +30,4 @@ class DoHeavyMathWorker : public Napi::AsyncWorker { uint32_t m_num_1; uint32_t m_num_2; uint32_t m_result; -}; \ No newline at end of file +}; From ea9a9ef8ce4e414f0c389d9de357a4aac24b3473 Mon Sep 17 00:00:00 2001 From: matthewkeil Date: Sat, 1 Jul 2023 00:02:50 -0700 Subject: [PATCH 5/6] fix(async_work_promise): remove TS --- async_work_promise/node-addon-api/index.d.ts | 1 - async_work_promise/node-addon-api/index.js | 2 +- async_work_promise/node-addon-api/package.json | 8 +------- async_work_promise/node-addon-api/test.ts | 3 --- 4 files changed, 2 insertions(+), 12 deletions(-) delete mode 100644 async_work_promise/node-addon-api/index.d.ts delete mode 100644 async_work_promise/node-addon-api/test.ts diff --git a/async_work_promise/node-addon-api/index.d.ts b/async_work_promise/node-addon-api/index.d.ts deleted file mode 100644 index 5909e3fd..00000000 --- a/async_work_promise/node-addon-api/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export function doHeavyMath(num1: number, num2: number): Promise; \ No newline at end of file diff --git a/async_work_promise/node-addon-api/index.js b/async_work_promise/node-addon-api/index.js index db8dca8d..bb30d79e 100644 --- a/async_work_promise/node-addon-api/index.js +++ b/async_work_promise/node-addon-api/index.js @@ -1,3 +1,3 @@ const bindings = require("bindings")("addon"); -module.exports = exports = bindings; \ No newline at end of file +bindings.doHeavyMath(2, 1).then(console.log); diff --git a/async_work_promise/node-addon-api/package.json b/async_work_promise/node-addon-api/package.json index ea4bb226..250770c0 100644 --- a/async_work_promise/node-addon-api/package.json +++ b/async_work_promise/node-addon-api/package.json @@ -3,19 +3,13 @@ "version": "0.0.0", "description": "AsyncWorker example that returns a Promise", "main": "index.js", - "types": "index.d.ts", "scripts": { - "test": "ts-node test" + "test": "node ." }, "author": "Matthew Keil (matthewkeil)", "gypfile": true, "dependencies": { "bindings": "^1.5.0", "node-addon-api": "^7.0.0" - }, - "devDependencies": { - "@types/node": "^20.3.2", - "ts-node": "^10.9.1", - "typescript": "^5.1.6" } } diff --git a/async_work_promise/node-addon-api/test.ts b/async_work_promise/node-addon-api/test.ts deleted file mode 100644 index cfe98b1f..00000000 --- a/async_work_promise/node-addon-api/test.ts +++ /dev/null @@ -1,3 +0,0 @@ -import {doHeavyMath} from "./index" - -doHeavyMath(2, 1).then(console.log); \ No newline at end of file From 8c82da47194a8311ebe791ee4e74f26cda3dc9b8 Mon Sep 17 00:00:00 2001 From: matthewkeil Date: Sat, 1 Jul 2023 00:04:59 -0700 Subject: [PATCH 6/6] fix(async_work_promise): add some extra comments for clarity --- async_work_promise/node-addon-api/worker.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/async_work_promise/node-addon-api/worker.h b/async_work_promise/node-addon-api/worker.h index d464a98e..d9e6dd89 100644 --- a/async_work_promise/node-addon-api/worker.h +++ b/async_work_promise/node-addon-api/worker.h @@ -14,15 +14,25 @@ class DoHeavyMathWorker : public Napi::AsyncWorker { Napi::Promise GetPromise() { return m_deferred.Promise(); } protected: + /** + * Simulate heavy math work + */ void Execute() { - // Simulate heavy math work if (m_num_2 == 0) { SetError("Cannot divide by zero"); return; } m_result = m_num_1 / m_num_2; } + + /** + * Resolve the promise with the result + */ void OnOK() { m_deferred.Resolve(Napi::Number::New(Env(), m_result)); } + + /** + * Reject the promise with errors + */ void OnError(const Napi::Error& err) { m_deferred.Reject(err.Value()); } private: