From 9cc61350a094c6a58ab68d12d776f375724153a5 Mon Sep 17 00:00:00 2001 From: Petr Zahradnik Date: Fri, 24 Jan 2020 14:55:49 +0100 Subject: [PATCH 1/4] Use Nan wrapper for type conversion --- package.json | 4 ++-- src/cardreader.cpp | 26 ++++++++------------------ src/pcsclite.cpp | 6 ++---- yarn.lock | 16 ++++++++-------- 4 files changed, 20 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index c35ba21..916e785 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,8 @@ "test": "mocha" }, "dependencies": { - "bindings": "^1.4.0", - "nan": "^2.12.1" + "bindings": "^1.5.0", + "nan": "^2.14.0" }, "devDependencies": { "mocha": "^6.0.0", diff --git a/src/cardreader.cpp b/src/cardreader.cpp index 98c6016..ad9c4e5 100644 --- a/src/cardreader.cpp +++ b/src/cardreader.cpp @@ -58,10 +58,8 @@ void CardReader::init(Local target) { Nan::SetPrototypeTemplate(tpl, "SCARD_UNPOWER_CARD", Nan::New(SCARD_UNPOWER_CARD)); Nan::SetPrototypeTemplate(tpl, "SCARD_EJECT_CARD", Nan::New(SCARD_EJECT_CARD)); - Local context = Nan::GetCurrentContext(); - - constructor.Reset(tpl->GetFunction(context).ToLocalChecked()); - target->Set(Nan::New("CardReader").ToLocalChecked(), tpl->GetFunction(context).ToLocalChecked()); + constructor.Reset(Nan::GetFunction(tpl).ToLocalChecked()); + target->Set(Nan::New("CardReader").ToLocalChecked(), Nan::GetFunction(tpl).ToLocalChecked()); } CardReader::CardReader(const std::string &reader_name): m_card_context(0), @@ -136,11 +134,9 @@ NAN_METHOD(CardReader::Connect) { return Nan::ThrowError("Third argument must be a callback function"); } - Local context = Nan::GetCurrentContext(); - ConnectInput* ci = new ConnectInput(); - ci->share_mode = info[0]->Uint32Value(context).FromJust(); - ci->pref_protocol = info[1]->Uint32Value(context).FromJust(); + ci->share_mode = Nan::To(info[0]).FromJust(); + ci->pref_protocol = Nan::To(info[1]).FromJust(); Local cb = Local::Cast(info[2]); // This creates our work request, including the libuv struct. @@ -174,9 +170,7 @@ NAN_METHOD(CardReader::Disconnect) { return Nan::ThrowError("Second argument must be a callback function"); } - Local context = Nan::GetCurrentContext(); - - DWORD disposition = info[0]->Uint32Value(context).FromJust(); + DWORD disposition = Nan::To(info[0]).FromJust(); Local cb = Local::Cast(info[1]); // This creates our work request, including the libuv struct. @@ -222,11 +216,9 @@ NAN_METHOD(CardReader::Transmit) { return Nan::ThrowError("Fourth argument must be a callback function"); } - Local context = Nan::GetCurrentContext(); - Local buffer_data = Nan::To(info[0]).ToLocalChecked(); - uint32_t out_len = info[1]->Uint32Value(context).FromJust(); - uint32_t protocol = info[2]->Uint32Value(context).FromJust(); + uint32_t out_len = Nan::To(info[1]).FromJust(); + uint32_t protocol = Nan::To(info[2]).FromJust(); Local cb = Local::Cast(info[3]); @@ -280,10 +272,8 @@ NAN_METHOD(CardReader::Control) { return Nan::ThrowError("Fourth argument must be a callback function"); } - Local context = Nan::GetCurrentContext(); - Local in_buf = Nan::To(info[0]).ToLocalChecked(); - DWORD control_code = info[1]->Uint32Value(context).FromJust(); + DWORD control_code = Nan::To(info[1]).FromJust(); Local out_buf = Nan::To(info[2]).ToLocalChecked(); Local cb = Local::Cast(info[3]); diff --git a/src/pcsclite.cpp b/src/pcsclite.cpp index a35d0b4..33aa38a 100644 --- a/src/pcsclite.cpp +++ b/src/pcsclite.cpp @@ -8,8 +8,6 @@ Nan::Persistent PCSCLite::constructor; void PCSCLite::init(Local target) { - Local context = Nan::GetCurrentContext(); - // Prepare constructor template Local tpl = Nan::New(New); tpl->SetClassName(Nan::New("PCSCLite").ToLocalChecked()); @@ -19,8 +17,8 @@ void PCSCLite::init(Local target) { Nan::SetPrototypeTemplate(tpl, "close", Nan::New(Close)); - constructor.Reset(tpl->GetFunction(context).ToLocalChecked()); - target->Set(Nan::New("PCSCLite").ToLocalChecked(), tpl->GetFunction(context).ToLocalChecked()); + constructor.Reset(Nan::GetFunction(tpl).ToLocalChecked()); + target->Set(Nan::New("PCSCLite").ToLocalChecked(), Nan::GetFunction(tpl).ToLocalChecked()); } PCSCLite::PCSCLite(): m_card_context(0), diff --git a/yarn.lock b/yarn.lock index 75fb004..1bbe87a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -70,10 +70,10 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -bindings@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.4.0.tgz#909efa49f2ebe07ecd3cb136778f665052040127" - integrity sha512-7znEVX22Djn+nYjxCWKDne0RRloa9XfYa84yk3s+HkE3LpDYZmhArYr9O9huBoHY3/oXispx5LorIX7Sl2CgSQ== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" @@ -428,10 +428,10 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nan@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" - integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== +nan@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nise@^1.5.2: version "1.5.3" From 0f3ff2c20a94ed05c89866522d1cde88bee34d78 Mon Sep 17 00:00:00 2001 From: Petr Zahradnik Date: Fri, 24 Jan 2020 16:06:49 +0100 Subject: [PATCH 2/4] Use Nan::Set in all places --- src/cardreader.cpp | 10 +++++----- src/pcsclite.cpp | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cardreader.cpp b/src/cardreader.cpp index ad9c4e5..6d62e93 100644 --- a/src/cardreader.cpp +++ b/src/cardreader.cpp @@ -59,7 +59,7 @@ void CardReader::init(Local target) { Nan::SetPrototypeTemplate(tpl, "SCARD_EJECT_CARD", Nan::New(SCARD_EJECT_CARD)); constructor.Reset(Nan::GetFunction(tpl).ToLocalChecked()); - target->Set(Nan::New("CardReader").ToLocalChecked(), Nan::GetFunction(tpl).ToLocalChecked()); + Nan::Set(target, Nan::New("CardReader").ToLocalChecked(), Nan::GetFunction(tpl).ToLocalChecked()); } CardReader::CardReader(const std::string &reader_name): m_card_context(0), @@ -92,8 +92,8 @@ NAN_METHOD(CardReader::New) { CardReader* obj = new CardReader(*reader_name); obj->Wrap(info.Holder()); - obj->handle()->Set(Nan::New(name_symbol), Nan::To(info[0]).ToLocalChecked()); - obj->handle()->Set(Nan::New(connected_symbol), Nan::False()); + Nan::Set(obj->handle(), Nan::New(name_symbol), Nan::To(info[0]).ToLocalChecked()); + Nan::Set(obj->handle(), Nan::New(connected_symbol), Nan::False()); info.GetReturnValue().Set(info.Holder()); } @@ -478,7 +478,7 @@ void CardReader::AfterConnect(uv_work_t* req, int status) { Local argv[argc] = { err }; Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); } else { - baton->reader->handle()->Set(Nan::New(connected_symbol), Nan::True()); + Nan::Set(baton->reader->handle(), Nan::New(connected_symbol), Nan::True()); const unsigned argc = 2; Local argv[argc] = { Nan::Null(), @@ -533,7 +533,7 @@ void CardReader::AfterDisconnect(uv_work_t* req, int status) { Local argv[argc] = { err }; Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); } else { - baton->reader->handle()->Set(Nan::New(connected_symbol), Nan::False()); + Nan::Set(baton->reader->handle(), Nan::New(connected_symbol), Nan::False()); const unsigned argc = 1; Local argv[argc] = { Nan::Null() diff --git a/src/pcsclite.cpp b/src/pcsclite.cpp index 33aa38a..f448ccb 100644 --- a/src/pcsclite.cpp +++ b/src/pcsclite.cpp @@ -18,7 +18,7 @@ void PCSCLite::init(Local target) { constructor.Reset(Nan::GetFunction(tpl).ToLocalChecked()); - target->Set(Nan::New("PCSCLite").ToLocalChecked(), Nan::GetFunction(tpl).ToLocalChecked()); + Nan::Set(target, Nan::New("PCSCLite").ToLocalChecked(), Nan::GetFunction(tpl).ToLocalChecked()); } PCSCLite::PCSCLite(): m_card_context(0), From f300d5e0a641a9d5fad21929f359844ffaab7760 Mon Sep 17 00:00:00 2001 From: Petr Zahradnik Date: Fri, 24 Jan 2020 17:22:23 +0100 Subject: [PATCH 3/4] Provide AsyncResource --- src/cardreader.cpp | 25 +++++++++++++------------ src/cardreader.h | 1 + src/pcsclite.cpp | 6 ++++-- src/pcsclite.h | 1 + 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/cardreader.cpp b/src/cardreader.cpp index 6d62e93..a5ca417 100644 --- a/src/cardreader.cpp +++ b/src/cardreader.cpp @@ -6,6 +6,8 @@ using namespace node; Nan::Persistent CardReader::constructor; +Nan::AsyncResource *CardReader::async_resource = new Nan::AsyncResource("CardReader_StaticAsyncResource"); + void CardReader::init(Local target) { // Prepare constructor template @@ -355,14 +357,14 @@ void CardReader::HandleReaderStatusChange(uv_async_t *handle, int status) { Nan::CopyBuffer(reinterpret_cast(ar->atr), ar->atrlen).ToLocalChecked() }; - Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv, async_resource); } } else { Local err = Nan::Error(error_msg("SCardGetStatusChange", ar->result).c_str()); // Prepare the parameters for the callback function. const unsigned int argc = 1; Local argv[argc] = { err }; - Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv, async_resource); } if (ar->do_exit) { @@ -372,8 +374,7 @@ void CardReader::HandleReaderStatusChange(uv_async_t *handle, int status) { Local argv[1] = { Nan::New("_end").ToLocalChecked(), // event name }; - - Nan::MakeCallback(async_baton->reader->handle(), "emit", 1, argv); + async_resource->runInAsyncScope(async_baton->reader->handle(), "emit", 1, argv); } if (reader->m_status_thread) { @@ -476,7 +477,7 @@ void CardReader::AfterConnect(uv_work_t* req, int status) { // Prepare the parameters for the callback function. const unsigned argc = 1; Local argv[argc] = { err }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } else { Nan::Set(baton->reader->handle(), Nan::New(connected_symbol), Nan::True()); const unsigned argc = 2; @@ -485,7 +486,7 @@ void CardReader::AfterConnect(uv_work_t* req, int status) { Nan::New(cr->card_protocol) }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } // The callback is a permanent handle, so we have to dispose of it manually. @@ -531,7 +532,7 @@ void CardReader::AfterDisconnect(uv_work_t* req, int status) { // Prepare the parameters for the callback function. const unsigned argc = 1; Local argv[argc] = { err }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } else { Nan::Set(baton->reader->handle(), Nan::New(connected_symbol), Nan::False()); const unsigned argc = 1; @@ -539,7 +540,7 @@ void CardReader::AfterDisconnect(uv_work_t* req, int status) { Nan::Null() }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } // The callback is a permanent handle, so we have to dispose of it manually. @@ -592,7 +593,7 @@ void CardReader::AfterTransmit(uv_work_t* req, int status) { // Prepare the parameters for the callback function. const unsigned argc = 1; Local argv[argc] = { err }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } else { const unsigned argc = 2; Local argv[argc] = { @@ -600,7 +601,7 @@ void CardReader::AfterTransmit(uv_work_t* req, int status) { Nan::CopyBuffer(reinterpret_cast(tr->data), tr->len).ToLocalChecked() }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } @@ -656,7 +657,7 @@ void CardReader::AfterControl(uv_work_t* req, int status) { // Prepare the parameters for the callback function. const unsigned argc = 1; Local argv[argc] = { err }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } else { const unsigned argc = 2; Local argv[argc] = { @@ -664,7 +665,7 @@ void CardReader::AfterControl(uv_work_t* req, int status) { Nan::New(cr->len) }; - Nan::Callback(Nan::New(baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(baton->callback)).Call(argc, argv, async_resource); } diff --git a/src/cardreader.h b/src/cardreader.h index e56777a..93210e1 100644 --- a/src/cardreader.h +++ b/src/cardreader.h @@ -132,6 +132,7 @@ class CardReader: public Nan::ObjectWrap { uv_mutex_t m_mutex; uv_cond_t m_cond; int m_state; + static Nan::AsyncResource *async_resource; }; #endif /* CARDREADER_H */ diff --git a/src/pcsclite.cpp b/src/pcsclite.cpp index f448ccb..2ff3ec6 100644 --- a/src/pcsclite.cpp +++ b/src/pcsclite.cpp @@ -6,6 +6,8 @@ using namespace node; Nan::Persistent PCSCLite::constructor; +Nan::AsyncResource *PCSCLite::async_resource = new Nan::AsyncResource("PCSCLite_StaticAsyncResource"); + void PCSCLite::init(Local target) { // Prepare constructor template @@ -181,10 +183,10 @@ void PCSCLite::HandleReaderStatusChange(uv_async_t *handle, int status) { Nan::CopyBuffer(ar->readers_name, ar->readers_name_length).ToLocalChecked() }; - Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv); + Nan::Callback(Nan::New(async_baton->callback)).Call(argc, argv, async_resource); } else { Local argv[1] = { Nan::Error(ar->err_msg.c_str()) }; - Nan::Callback(Nan::New(async_baton->callback)).Call(1, argv); + Nan::Callback(Nan::New(async_baton->callback)).Call(1, argv, async_resource); } // Do exit, after throwing last events diff --git a/src/pcsclite.h b/src/pcsclite.h index 4ef616b..0fb8056 100644 --- a/src/pcsclite.h +++ b/src/pcsclite.h @@ -56,6 +56,7 @@ class PCSCLite: public Nan::ObjectWrap { uv_cond_t m_cond; bool m_pnp; int m_state; + static Nan::AsyncResource *async_resource; }; #endif /* PCSCLITE_H */ From acb4e8527af5c48134ac5a91333d9d01bf296b49 Mon Sep 17 00:00:00 2001 From: petrzjunior Date: Sat, 25 Jan 2020 16:48:14 +0100 Subject: [PATCH 4/4] Fix compiler warnings --- src/cardreader.cpp | 2 +- src/cardreader.h | 2 +- src/pcsclite.cpp | 4 ++-- src/pcsclite.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cardreader.cpp b/src/cardreader.cpp index a5ca417..010ea66 100644 --- a/src/cardreader.cpp +++ b/src/cardreader.cpp @@ -331,7 +331,7 @@ NAN_METHOD(CardReader::Close) { info.GetReturnValue().Set(Nan::New(result)); } -void CardReader::HandleReaderStatusChange(uv_async_t *handle, int status) { +void CardReader::HandleReaderStatusChange(uv_async_t *handle) { Nan::HandleScope scope; diff --git a/src/cardreader.h b/src/cardreader.h index 93210e1..7bd239c 100644 --- a/src/cardreader.h +++ b/src/cardreader.h @@ -107,7 +107,7 @@ class CardReader: public Nan::ObjectWrap { static NAN_METHOD(Control); static NAN_METHOD(Close); - static void HandleReaderStatusChange(uv_async_t *handle, int status); + static void HandleReaderStatusChange(uv_async_t *handle); static void HandlerFunction(void* arg); static void DoConnect(uv_work_t* req); static void DoDisconnect(uv_work_t* req); diff --git a/src/pcsclite.cpp b/src/pcsclite.cpp index 2ff3ec6..8e815bb 100644 --- a/src/pcsclite.cpp +++ b/src/pcsclite.cpp @@ -63,9 +63,9 @@ PCSCLite::PCSCLite(): m_card_context(0), WaitForSingleObject(seInfo.hProcess, INFINITE); CloseHandle(seInfo.hProcess); } +postServiceCheck: #endif // _WIN32 -postServiceCheck: LONG result; do { result = SCardEstablishContext(SCARD_SCOPE_SYSTEM, @@ -166,7 +166,7 @@ NAN_METHOD(PCSCLite::Close) { info.GetReturnValue().Set(Nan::New(result)); } -void PCSCLite::HandleReaderStatusChange(uv_async_t *handle, int status) { +void PCSCLite::HandleReaderStatusChange(uv_async_t *handle) { Nan::HandleScope scope; diff --git a/src/pcsclite.h b/src/pcsclite.h index 0fb8056..22fcd3a 100644 --- a/src/pcsclite.h +++ b/src/pcsclite.h @@ -41,7 +41,7 @@ class PCSCLite: public Nan::ObjectWrap { static NAN_METHOD(Start); static NAN_METHOD(Close); - static void HandleReaderStatusChange(uv_async_t *handle, int status); + static void HandleReaderStatusChange(uv_async_t *handle); static void HandlerFunction(void* arg); static void CloseCallback(uv_handle_t *handle);