robertsLando / node-red-contrib-m-bus

Node-Red node for M-Bus protocol
MIT License
10 stars 7 forks source link

Unable to install on Docker Node-RED with Node.js > v18 #41

Closed kickouille closed 1 month ago

kickouille commented 1 month ago

Hello,

I'm running Node-RED on Docker, and since version 4.0, official image is based on Node.js version 20 and 22. When jumping to version 4.0.2 I realized that your module didn't work anymore. I also tried to build my own images with different variants and here are the results: Node-RED 4.0.2, Node.js 20 or 22: fails Node-RED 3.1.11, Node.js 20 or 22: fails Node-RED 4.0.2, Node.js 18: succeeds

So it looks like it is more related to the version 20 and 22 of Node.js, or at least docker image of it. I tried building with base image node:20-alpine and node:20-debian nd results are the same.

It is certainly not related to your module, nor node-mbus, but most likely at the time of building mbus library.

Here is the output I get when it is failing:

Welcome to Node-RED
===================

8 Aug 11:42:57 - [info] Node-RED version: v3.1.11
8 Aug 11:42:57 - [info] Node.js  version: v20.16.0
8 Aug 11:42:57 - [info] Linux 6.10.0-linuxkit x64 LE
8 Aug 11:42:57 - [info] Loading palette nodes
8 Aug 11:42:58 - [info] Settings file  : /data/settings.js
8 Aug 11:42:58 - [info] Context store  : 'default' [module=memory]
8 Aug 11:42:58 - [info] User directory : /data
8 Aug 11:42:58 - [warn] Projects disabled : editorTheme.projects.enabled=false
8 Aug 11:42:58 - [info] Flows file     : /data/flows.json
8 Aug 11:42:58 - [warn] 

---------------------------------------------------------------------
Your flow credentials file is encrypted using a system-generated key.

If the system-generated key is lost for any reason, your credentials
file will not be recoverable, you will have to delete it and re-enter
your credentials.

You should set your own key using the 'credentialSecret' option in
your settings file. Node-RED will then re-encrypt your credentials
file using your chosen key the next time you deploy a change.
---------------------------------------------------------------------

8 Aug 11:42:58 - [info] Server now running at http://127.0.0.1:1880/
8 Aug 11:42:58 - [warn] Encrypted credentials not found
8 Aug 11:42:58 - [info] Starting flows
8 Aug 11:42:58 - [info] Started flows
8 Aug 11:43:21 - [info] Installing module: node-red-contrib-m-bus, version: 3.0.0
8 Aug 11:43:43 - [warn] Installation of module node-red-contrib-m-bus failed:
8 Aug 11:43:43 - [warn] ------------------------------------------
8 Aug 11:43:43 - [warn] npm warn config production Use `--omit=dev` instead.
npm error code 1
npm error path /data/node_modules/node-mbus
npm error command failed
npm error command sh -c node-gyp rebuild
npm error make: Entering directory '/data/node_modules/node-mbus/build'
npm error   CC(target) Release/obj.target/libmbus/libmbus/mbus/mbus-protocol-aux.o
npm error   CC(target) Release/obj.target/libmbus/libmbus/mbus/mbus-protocol.o
npm error   CC(target) Release/obj.target/libmbus/libmbus/mbus/mbus-serial.o
npm error   CC(target) Release/obj.target/libmbus/libmbus/mbus/mbus-tcp.o
npm error   CC(target) Release/obj.target/libmbus/libmbus/mbus/mbus.o
npm error rm -f Release/obj.target/mbus.a Release/obj.target/mbus.a.ar-file-list; mkdir -p `dirname Release/obj.target/mbus.a`
npm error ar crs Release/obj.target/mbus.a @Release/obj.target/mbus.a.ar-file-list
npm error   COPY Release/mbus.a
npm error   CXX(target) Release/obj.target/mbus/src/main.o
npm error make: Leaving directory '/data/node_modules/node-mbus/build'
npm error gyp info it worked if it ends with ok
npm error gyp info using node-gyp@10.1.0
npm error gyp info using node@20.16.0 | linux | x64
npm error gyp info find Python using Python version 3.12.3 found at "/usr/bin/python3"
npm error gyp http GET https://unofficial-builds.nodejs.org/download/release/v20.16.0/node-v20.16.0-headers.tar.gz
npm error gyp http 200 https://unofficial-builds.nodejs.org/download/release/v20.16.0/node-v20.16.0-headers.tar.gz
npm error gyp http GET https://unofficial-builds.nodejs.org/download/release/v20.16.0/SHASUMS256.txt
npm error gyp http 200 https://unofficial-builds.nodejs.org/download/release/v20.16.0/SHASUMS256.txt
npm error gyp info spawn /usr/bin/python3
npm error gyp info spawn args [
npm error gyp info spawn args '/usr/local/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py',
npm error gyp info spawn args 'binding.gyp',
npm error gyp info spawn args '-f',
npm error gyp info spawn args 'make',
npm error gyp info spawn args '-I',
npm error gyp info spawn args '/data/node_modules/node-mbus/build/config.gypi',
npm error gyp info spawn args '-I',
npm error gyp info spawn args '/usr/local/lib/node_modules/npm/node_modules/node-gyp/addon.gypi',
npm error gyp info spawn args '-I',
npm error gyp info spawn args '/usr/src/node-red/.cache/node-gyp/20.16.0/include/node/common.gypi',
npm error gyp info spawn args '-Dlibrary=shared_library',
npm error gyp info spawn args '-Dvisibility=default',
npm error gyp info spawn args '-Dnode_root_dir=/usr/src/node-red/.cache/node-gyp/20.16.0',
npm error gyp info spawn args '-Dnode_gyp_dir=/usr/local/lib/node_modules/npm/node_modules/node-gyp',
npm error gyp info spawn args '-Dnode_lib_file=/usr/src/node-red/.cache/node-gyp/20.16.0/<(target_arch)/node.lib',
npm error gyp info spawn args '-Dmodule_root_dir=/data/node_modules/node-mbus',
npm error gyp info spawn args '-Dnode_engine=v8',
npm error gyp info spawn args '--depth=.',
npm error gyp info spawn args '--no-parallel',
npm error gyp info spawn args '--generator-output',
npm error gyp info spawn args 'build',
npm error gyp info spawn args '-Goutput_dir=.'
npm error gyp info spawn args ]
npm error gyp info spawn make
npm error gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
npm error In file included from ../../nan/nan.h:176,
npm error                  from ../src/main.cc:1:
npm error ../../nan/nan_callbacks.h:55:23: error: 'AccessorSignature' is not a member of 'v8'
npm error    55 | typedef v8::Local<v8::AccessorSignature> Sig;
npm error       |                       ^~~~~~~~~~~~~~~~~
npm error ../../nan/nan_callbacks.h:55:40: error: template argument 1 is invalid
npm error    55 | typedef v8::Local<v8::AccessorSignature> Sig;
npm error       |                                        ^
npm error ../../nan/nan.h: In function 'void Nan::SetAccessor(v8::Local<v8::ObjectTemplate>, v8::Local<v8::String>, GetterCallback, SetterCallback, v8::Local<v8::Value>, v8::AccessControl, v8::PropertyAttribute, imp::Sig)':
npm error ../../nan/nan.h:2542:19: error: no matching function for call to 'v8::ObjectTemplate::SetAccessor(v8::Local<v8::String>&, void (*&)(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>&), void (*&)(v8::Local<v8::Name>, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<void>&), v8::Local<v8::Object>&, v8::AccessControl&, v8::PropertyAttribute&, Nan::imp::Sig&)'
npm error  2542 |   tpl->SetAccessor(
npm error       |   ~~~~~~~~~~~~~~~~^
npm error  2543 |       name
npm error       |       ~~~~         
npm error  2544 |     , getter_
npm error       |     ~~~~~~~~~      
npm error  2545 |     , setter_
npm error       |     ~~~~~~~~~      
npm error  2546 |     , obj
npm error       |     ~~~~~          
npm error  2547 |     , settings
npm error       |     ~~~~~~~~~~     
npm error  2548 |     , attribute
npm error       |     ~~~~~~~~~~~    
npm error  2549 |     , signature);
npm error       |     ~~~~~~~~~~~~   
npm error In file included from /usr/src/node-red/.cache/node-gyp/20.16.0/include/node/v8-function.h:15,
npm error                  from /usr/src/node-red/.cache/node-gyp/20.16.0/include/node/v8.h:33,
npm error                  from /usr/src/node-red/.cache/node-gyp/20.16.0/include/node/node.h:73,
npm error                  from ../../nan/nan.h:56:
npm error /usr/src/node-red/.cache/node-gyp/20.16.0/include/node/v8-template.h:809:8: note: candidate: 'void v8::ObjectTemplate::SetAccessor(v8::Local<v8::String>, v8::AccessorGetterCallback, v8::AccessorSetterCallback, v8::Local<v8::Value>, v8::AccessControl, v8::PropertyAttribute, v8::SideEffectType, v8::SideEffectType)'
npm error   809 |   void SetAccessor(
npm error       |        ^~~~~~~~~~~
npm error /usr/src/node-red/.cache/node-gyp/20.16.0/include/node/v8-template.h:814:22: note:   no known conversion for argument 7 from 'Nan::imp::Sig' {aka 'int'} to 'v8::SideEffectType'
npm error   814 |       SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
npm error       |       ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
npm error /usr/src/node-red/.cache/node-gyp/20.16.0/include/node/v8-template.h:816:8: note: candidate: 'void v8::ObjectTemplate::SetAccessor(v8::Local<v8::Name>, v8::AccessorNameGetterCallback, v8::AccessorNameSetterCallback, v8::Local<v8::Value>, v8::AccessControl, v8::PropertyAttribute, v8::SideEffectType, v8::SideEffectType)'
npm error   816 |   void SetAccessor(
npm error       |        ^~~~~~~~~~~
npm error /usr/src/node-red/.cache/node-gyp/20.16.0/include/node/v8-template.h:821:22: note:   no known conversion for argument 7 from 'Nan::imp::Sig' {aka 'int'} to 'v8::SideEffectType'
npm error   821 |       SideEffectType getter_side_effect_type = SideEffectType::kHasSideEffect,
npm error       |       ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
npm error make: *** [mbus.target.mk:117: Release/obj.target/mbus/src/main.o] Error 1
npm error gyp ERR! build error 
npm error gyp ERR! stack Error: `make` failed with exit code: 2
npm error gyp ERR! stack at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:209:23)
npm error gyp ERR! System Linux 6.10.0-linuxkit
npm error gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
npm error gyp ERR! cwd /data/node_modules/node-mbus
npm error gyp ERR! node -v v20.16.0
npm error gyp ERR! node-gyp -v v10.1.0
npm error gyp ERR! not ok
npm error A complete log of this run can be found in: /data/.npm/_logs/2024-08-08T11_43_21_765Z-debug-0.log

8 Aug 11:43:43 - [warn] ------------------------------------------
Error: Install failed
    at /usr/src/node-red/node_modules/@node-red/registry/lib/installer.js:288:25
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
8 Aug 11:43:43 - [error] Error: Install failed

Any idea on how to address this?

For the time being, I run my own image of Node-RED 4.0.2 on Node.js 18, especially because it runs on an armv6 and official image are not providing this platform, but this cannot be forever. To be noted that errors are present when building on armv6 but also on amd64. So it is not platform dependent.

Regards,

Yanik

robertsLando commented 1 month ago

I think the problem is related to underlying lib as it is not compatible with node 20

kickouille commented 1 month ago

Hi,

Maybe, or related to nan from Node.js https://github.com/nodejs/nan.

There are other similar cases, a bit old but which seem to have been fixed: https://github.com/nodejs/nan/issues/942 https://github.com/nodejs/nan/pull/941 https://github.com/nodejs/nan/pull/943

Are you able to reproduce?

Do you think it is worth opening an issue there?

Best regards,

Yanik

kickouille commented 1 month ago

Ok, I fixed the problem, while reading the release notes of node-mbus. Juste sent you a PR to bump node-mbus from 2.2.2 to 2.2.4: https://github.com/robertsLando/node-red-contrib-m-bus/pull/42

To be noted that version of your module is stuck to 3.0.0 when installing from the palette: https://flows.nodered.org/node/node-red-contrib-m-bus Is it normal?

Regards,

Yanik

kickouille commented 1 month ago

Hello,

One additional info, when changing from Node.js 18 to 20 or 22, an npm rebuild of node-mbus may be necessary, I had to do it. For Docker, proceed as follow:

  1. Enter Docker image, example: docker exec -it nodered_node-red_1 bash
  2. Go to cd /data/node_modules/node-mbus/
  3. Do npm rebuild
  4. restart your container

Regards,

Yanik