Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apache Thrift with nodejs example

I am trying to use Apache Thrift for passing messages between applications implemented in different languages. It is not necessarily used as RPC, but more for serializing/deserializing messages. One application is in node.js. I am trying to figure out how Apache thrift works with node.js, but I can't find too much documentation and examples, except for one tiny one regarding Cassandra at: https://github.com/apache/thrift/tree/trunk/lib/nodejs

Again, I don't need any procedures declared in the .thrift file, I only need to serialize a simple data structure like:

struct Notification {
   1: string subject,
   2: string message
 }

Can anyone help me with an example?

like image 233
Clara Avatar asked Nov 12 '12 13:11

Clara


3 Answers

I finally found the answer to this question, after wasting a lot of time just by looking at the library for nodejs.

//SERIALIZATION:
var buffer = new Buffer(notification);
var transport = new thrift.TFramedTransport(buffer);
var binaryProt = new thrift.TBinaryProtocol(transport);
notification.write(binaryProt);

At this point, the byte array can be found in the transport.outBuffers field:

var byteArray = transport.outBuffers;

For deserialization:

var tTransport = new thrift.TFramedTransport(byteArray);
var tProtocol = new thrift.TBinaryProtocol(tTransport);
var receivedNotif = new notification_type.Notification();
receivedNotif.read(tProtocol);

Also the following lines need to be added to the index.js file from the nodejs library for thrift:

exports.TFramedTransport = require('./transport').TFramedTransport;
exports.TBufferedTransport = require('./transport').TBufferedTransport;
exports.TBinaryProtocol = require('./protocol').TBinaryProtocol;

Plus there is also at least one bug in the nodejs library.

like image 171
Clara Avatar answered Nov 13 '22 00:11

Clara


The above answer is wrong, because it tries to use outBuffers directly, which is an array of buffers. Here is a working example of using thrift with nodejs:

var util = require('util');
var thrift = require('thrift');

var Notification = require('./gen-nodejs/notification_types.js').Notification;

var TFramedTransport = require('thrift/lib/thrift/transport').TFramedTransport;
var TBufferedTransport = require('thrift/lib/thrift/transport').TBufferedTransport;
var TBinaryProtocol = require('thrift/lib/thrift/protocol').TBinaryProtocol;

var transport = new TFramedTransport(null, function(byteArray) {
  // Flush puts a 4-byte header, which needs to be parsed/sliced.
  byteArray = byteArray.slice(4);

  // DESERIALIZATION:
  var tTransport = new TFramedTransport(byteArray);
  var tProtocol = new TBinaryProtocol(tTransport);
  var receivedNotification = new Notification();
  receivedUser.read(tProtocol);

  console.log(util.inspect(receivedNotification, false, null));
});

var binaryProt = new TBinaryProtocol(transport);

// SERIALIZATION:
var notification = new Notification({"subject":"AAAA"});
console.log(util.inspect(notification, false, null));
notification.write(binaryProt);
transport.flush();
like image 26
DigitalGhost Avatar answered Nov 12 '22 23:11

DigitalGhost


DigitalGhost is right, the previous example is wrong. IMHO the outBuffers is a private property to the transport class and should not be accessed.

like image 1
David Kalosi Avatar answered Nov 12 '22 23:11

David Kalosi