aherrick
aherrick

Reputation: 20179

Twitter-Node Failing to Build Node.js (npm install twitter-node)

I am trying to install "Twitter-Node" (npm install twitter-node). Version .3.2-pre of Node JS.

When I try and install I receive the follow error. Any thoughts on what I may be doing wrong? Seems like a pretty straight forward install to me. I was able successfully install socket-io too...

m ERR! Error: [email protected] preinstall: `./build.sh`
npm ERR! `sh` failed with 1
npm ERR!     at ChildProcess.<anonymous> (/usr/local/lib/node/.npm/npm/0.2.12-    1/package/lib/utils/exec.js:25:18)
npm ERR!     at ChildProcess.emit (events.js:34:17)
npm ERR!     at ChildProcess.onexit (child_process.js:164:12)
npm ERR! 
npm ERR! Failed at the [email protected] preinstall script.
npm ERR! This is most likely a problem with the twitter-node package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     ./build.sh

alt text

Upvotes: 0

Views: 1132

Answers (1)

Ivo Wetzel
Ivo Wetzel

Reputation: 46756

Simple solution

Just grab it from here:
https://github.com/patmcnally/twitter-node

The module on npm is old (last update August 31th) and broken by design, it compiles its own base64 encoder instead of using Node's built in functionality.

To install:

  1. Download the archive and extract it
  2. cd into the folder and run npm install .
  3. Have a nice day :)

Old answer

The install runs gcc to compile a base64 module that depends on nodes Buffer class (the C++ implementation), since there were quite some changes to that in 3.x, it explodes!

Waf: Entering directory `/home/ivo/.local/lib/node/.npm/twitter-node/0.0.2/package/vendor/node-base64/build'
[1/2] cxx: base64.cc -> build/default/base64_1.o
../base64.cc: In function ‘v8::Handle<v8::Value> base64_encode_binding(const v8::Arguments&)’:
../base64.cc:178: error: ‘class node::Buffer’ has no member named ‘data’
../base64.cc:178: error: ‘class node::Buffer’ has no member named ‘length’
../base64.cc: In function ‘v8::Handle<v8::Value> base64_decode_binding(const v8::Arguments&)’:
../base64.cc:199: error: ‘class node::Buffer’ has no member named ‘data’
../base64.cc:199: error: ‘class node::Buffer’ has no member named ‘length’
Waf: Leaving directory `/home/ivo/.local/lib/node/.npm/twitter-node/0.0.2/package/vendor/node-base64/build'
Build failed:  -> task failed (err #1): 
    {task: cxx base64.cc -> base64_1.o}

This commit removed the two members and replaced them with static inlined methods.

In .npm/twitter-node/0.0.2/package/vendor/node-base64/base64.cc you need to replace the lines 177/178 and 198/199 which look like this:

Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args[0]->ToObject());
char *str = base64_encode((unsigned char*)buffer->data(), buffer->length(),&len);

With this:

Local<Object> buffer = args[0]->ToObject();
char *str = base64_encode((unsigned char*)Buffer::Data(buffer), Buffer::Length(buffer),&len);  

Then run npm rebuild twitter-node and you're done! Don't use install, as it will re-download and overwrite the changes.

PS: I had to use require('[email protected]') to get it to import, since npm didn't create the symlink in .local/lib/node but you can easily fix that on your own.

Update

I did take a look at the module, this is hilarious, they compile a 80kb lib which is prone to failure with changed to Node.js just to use a base64 encode ONE TIME.

// Returns a Basic Auth header fit for HTTP.
var basicAuth = function basicAuth(user, pass) {
    return "Basic " + b64.encode(user + ":" + pass);
};

This does the exact same thing and doesn't explode on every other change to Node.js:

new Buffer(user + ':' + pass).toString('base64')

Upvotes: 5

Related Questions