From 4b14223a20119c3417ab5e2dac124d3ed48f35fd Mon Sep 17 00:00:00 2001 From: Tan Doan Date: Tue, 5 Sep 2023 15:43:50 -0700 Subject: [PATCH 1/4] bump nan in an attempt to fix node 16->18 issues --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6c5b918..d7702b6 100755 --- a/package.json +++ b/package.json @@ -18,16 +18,16 @@ }, "dependencies": { "assert-plus": "0.1.5", - "nan": "^2.14.0", + "nan": "^2.17.0", "safer-buffer": "~2.1.0" }, "devDependencies": { "bunyan": "^1.8.12", - "istanbul": "^0.3.6", - "faucet": "0.0.1", - "tape": "^4.11.0", "eslint": "^4.13.1", - "eslint-plugin-joyent": "~2.1.0" + "eslint-plugin-joyent": "~2.1.0", + "faucet": "0.0.1", + "istanbul": "^0.3.6", + "tape": "^4.11.0" }, "scripts": { "test": "./node_modules/.bin/istanbul cover --print none test/run.js" From 5e460254c0608ce81340eb86fc0b74fed8901852 Mon Sep 17 00:00:00 2001 From: Tan Doan Date: Tue, 5 Sep 2023 15:44:37 -0700 Subject: [PATCH 2/4] rm joyant bug and issue links --- package.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index d7702b6..fe17bfa 100755 --- a/package.json +++ b/package.json @@ -10,11 +10,9 @@ "syslog" ], "repository": { - "type": "git", - "url": "https://github.com/joyent/node-bunyan-syslog.git" + "type": "git" }, "bugs": { - "url": "https://github.com/joyent/node-bunyan-syslog/issues" }, "dependencies": { "assert-plus": "0.1.5", From 89fb55022e8d1379c6fa0fd3ebae402b3e18c2e2 Mon Sep 17 00:00:00 2001 From: Tan Doan Date: Tue, 5 Sep 2023 15:50:49 -0700 Subject: [PATCH 3/4] add node gyp --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fe17bfa..70ef72e 100755 --- a/package.json +++ b/package.json @@ -12,11 +12,11 @@ "repository": { "type": "git" }, - "bugs": { - }, + "bugs": {}, "dependencies": { "assert-plus": "0.1.5", "nan": "^2.17.0", + "node-gyp": "^9.4.0", "safer-buffer": "~2.1.0" }, "devDependencies": { From 136e927db9f28e6840e161abc87aba1b5f5147f7 Mon Sep 17 00:00:00 2001 From: Tan Doan Date: Wed, 25 Jun 2025 15:33:04 -0400 Subject: [PATCH 4/4] Update from nan to napi so we can move beyond node 20 ChatGPT coded --- binding.gyp | 26 +++++-- package.json | 6 +- src/syslog.cc | 184 +++++++++++++++++++++++++------------------------- 3 files changed, 113 insertions(+), 103 deletions(-) diff --git a/binding.gyp b/binding.gyp index 7e93ea7..35eb674 100644 --- a/binding.gyp +++ b/binding.gyp @@ -1,9 +1,21 @@ { - "targets": [ { - "target_name": "syslog", - "sources": [ "src/syslog.cc" ], - "include_dirs": [ - " #include -#include -#include -#include +#include -using namespace v8; +using namespace Napi; -#define RETURN_EXCEPTION(MSG) \ - Nan::ThrowError(MSG) +// ------------------------- +// Helper Macros -#define RETURN_ARGS_EXCEPTION(MSG) \ - Nan::ThrowError(MSG) +#define THROW_IF_ARGS_EMPTY(info) \ + if (info.Length() == 0) { \ + Napi::TypeError::New(info.Env(), "Missing arguments").ThrowAsJavaScriptException(); \ + return info.Env().Undefined(); \ + } -#define REQUIRE_ARGS(ARGS) \ - if (ARGS.Length() == 0) \ - RETURN_ARGS_EXCEPTION("missing arguments"); +#define REQUIRE_INT_ARG(info, I, VAR) \ + if (info.Length() <= (I) || !info[I].IsNumber()) { \ + Napi::TypeError::New(info.Env(), "Argument " #I " must be an integer").ThrowAsJavaScriptException(); \ + return info.Env().Undefined(); \ + } \ + int VAR = info[I].As().Int32Value(); -#define REQUIRE_INT_ARG(ARGS, I, VAR) \ - REQUIRE_ARGS(ARGS); \ - if (ARGS.Length() <= (I)) \ - RETURN_ARGS_EXCEPTION("argument " #I " must be an Integer"); \ - Nan::MaybeLocal _ ## VAR(Nan::To(ARGS[I])); \ - if (_ ## VAR.IsEmpty()) \ - RETURN_ARGS_EXCEPTION("argument " #I " must be an Integer"); \ - int VAR = _ ## VAR.ToLocalChecked()->Value(); +#define REQUIRE_STRING_ARG(info, I, VAR) \ + if (info.Length() <= (I) || !info[I].IsString()) { \ + Napi::TypeError::New(info.Env(), "Argument " #I " must be a string").ThrowAsJavaScriptException(); \ + return info.Env().Undefined(); \ + } \ + std::string VAR = info[I].As().Utf8Value(); -#define REQUIRE_STRING_ARG(ARGS, I, VAR) \ - REQUIRE_ARGS(ARGS); \ - if (ARGS.Length() <= (I)) \ - RETURN_ARGS_EXCEPTION("argument " #I " must be a String"); \ - Nan::MaybeLocal _ ## VAR(Nan::To(ARGS[I])); \ - if (_ ## VAR.IsEmpty()) \ - RETURN_ARGS_EXCEPTION("argument " #I " must be a String"); \ - Nan::Utf8String VAR(_ ## VAR.ToLocalChecked()); +// ------------------------- +// N-API bindings -///--- API +Value Open(const CallbackInfo& info) { + Env env = info.Env(); + THROW_IF_ARGS_EMPTY(info); -NAN_METHOD(Open) { - Nan::HandleScope scope; + REQUIRE_STRING_ARG(info, 0, ident); + REQUIRE_INT_ARG(info, 1, logopt); + REQUIRE_INT_ARG(info, 2, facility); - REQUIRE_STRING_ARG(info, 0, ident); - REQUIRE_INT_ARG(info, 1, logopt); - REQUIRE_INT_ARG(info, 2, facility); - - openlog(strdup(*ident), logopt, facility); - - return; + openlog(strdup(ident.c_str()), logopt, facility); + return env.Undefined(); } -NAN_METHOD(Log) { - Nan::HandleScope scope; +Value Log(const CallbackInfo& info) { + Env env = info.Env(); + THROW_IF_ARGS_EMPTY(info); - REQUIRE_INT_ARG(info, 0, priority); - REQUIRE_STRING_ARG(info, 1, message); + REQUIRE_INT_ARG(info, 0, priority); + REQUIRE_STRING_ARG(info, 1, message); - syslog(priority, "%s", *message); - - return; + syslog(priority, "%s", message.c_str()); + return env.Undefined(); } -NAN_METHOD(Close) { - Nan::HandleScope scope; - - closelog(); - - return; +Value Close(const CallbackInfo& info) { + Env env = info.Env(); + closelog(); + return env.Undefined(); } -NAN_METHOD(Mask) { - Nan::EscapableHandleScope scope; - - REQUIRE_INT_ARG(info, 0, maskpri); - - int mask = setlogmask(LOG_UPTO(maskpri)); +Value Mask(const CallbackInfo& info) { + Env env = info.Env(); + REQUIRE_INT_ARG(info, 0, maskpri); - info.GetReturnValue().Set(scope.Escape(Nan::New(mask))); + int mask = setlogmask(LOG_UPTO(maskpri)); + return Number::New(env, mask); } -NAN_MODULE_INIT(init) { - Nan::SetMethod(target, "openlog", Open); - Nan::SetMethod(target, "syslog", Log); - Nan::SetMethod(target, "closelog", Close); - Nan::SetMethod(target, "setlogmask", Mask); - - NODE_DEFINE_CONSTANT(target, LOG_EMERG); - NODE_DEFINE_CONSTANT(target, LOG_ALERT); - NODE_DEFINE_CONSTANT(target, LOG_ERR); - NODE_DEFINE_CONSTANT(target, LOG_WARNING); - NODE_DEFINE_CONSTANT(target, LOG_NOTICE); - NODE_DEFINE_CONSTANT(target, LOG_INFO); - NODE_DEFINE_CONSTANT(target, LOG_DEBUG); - - NODE_DEFINE_CONSTANT(target, LOG_KERN); - NODE_DEFINE_CONSTANT(target, LOG_USER); - NODE_DEFINE_CONSTANT(target, LOG_MAIL); - NODE_DEFINE_CONSTANT(target, LOG_DAEMON); - NODE_DEFINE_CONSTANT(target, LOG_AUTH); - NODE_DEFINE_CONSTANT(target, LOG_LPR); - NODE_DEFINE_CONSTANT(target, LOG_NEWS); - NODE_DEFINE_CONSTANT(target, LOG_UUCP); - NODE_DEFINE_CONSTANT(target, LOG_CRON); - NODE_DEFINE_CONSTANT(target, LOG_LOCAL0); - NODE_DEFINE_CONSTANT(target, LOG_LOCAL1); - NODE_DEFINE_CONSTANT(target, LOG_LOCAL2); - NODE_DEFINE_CONSTANT(target, LOG_LOCAL3); - NODE_DEFINE_CONSTANT(target, LOG_LOCAL4); - NODE_DEFINE_CONSTANT(target, LOG_LOCAL5); - NODE_DEFINE_CONSTANT(target, LOG_LOCAL6); - NODE_DEFINE_CONSTANT(target, LOG_LOCAL7); - - NODE_DEFINE_CONSTANT(target, LOG_PID); - NODE_DEFINE_CONSTANT(target, LOG_CONS); - NODE_DEFINE_CONSTANT(target, LOG_NDELAY); +// ------------------------- +// Module initialization + +Object Init(Env env, Object exports) { + exports.Set("openlog", Function::New(env, Open)); + exports.Set("syslog", Function::New(env, Log)); + exports.Set("closelog", Function::New(env, Close)); + exports.Set("setlogmask", Function::New(env, Mask)); + + // Priorities + exports.Set("LOG_EMERG", Number::New(env, LOG_EMERG)); + exports.Set("LOG_ALERT", Number::New(env, LOG_ALERT)); + exports.Set("LOG_ERR", Number::New(env, LOG_ERR)); + exports.Set("LOG_WARNING", Number::New(env, LOG_WARNING)); + exports.Set("LOG_NOTICE", Number::New(env, LOG_NOTICE)); + exports.Set("LOG_INFO", Number::New(env, LOG_INFO)); + exports.Set("LOG_DEBUG", Number::New(env, LOG_DEBUG)); + + // Facilities + exports.Set("LOG_KERN", Number::New(env, LOG_KERN)); + exports.Set("LOG_USER", Number::New(env, LOG_USER)); + exports.Set("LOG_MAIL", Number::New(env, LOG_MAIL)); + exports.Set("LOG_DAEMON", Number::New(env, LOG_DAEMON)); + exports.Set("LOG_AUTH", Number::New(env, LOG_AUTH)); + exports.Set("LOG_LPR", Number::New(env, LOG_LPR)); + exports.Set("LOG_NEWS", Number::New(env, LOG_NEWS)); + exports.Set("LOG_UUCP", Number::New(env, LOG_UUCP)); + exports.Set("LOG_CRON", Number::New(env, LOG_CRON)); + exports.Set("LOG_LOCAL0", Number::New(env, LOG_LOCAL0)); + exports.Set("LOG_LOCAL1", Number::New(env, LOG_LOCAL1)); + exports.Set("LOG_LOCAL2", Number::New(env, LOG_LOCAL2)); + exports.Set("LOG_LOCAL3", Number::New(env, LOG_LOCAL3)); + exports.Set("LOG_LOCAL4", Number::New(env, LOG_LOCAL4)); + exports.Set("LOG_LOCAL5", Number::New(env, LOG_LOCAL5)); + exports.Set("LOG_LOCAL6", Number::New(env, LOG_LOCAL6)); + exports.Set("LOG_LOCAL7", Number::New(env, LOG_LOCAL7)); + + // Options + exports.Set("LOG_PID", Number::New(env, LOG_PID)); + exports.Set("LOG_CONS", Number::New(env, LOG_CONS)); + exports.Set("LOG_NDELAY", Number::New(env, LOG_NDELAY)); + + return exports; } -NODE_MODULE(syslog, init); +NODE_API_MODULE(syslog, Init)