diff --git a/lib/nodejs/examples/client.js b/lib/nodejs/examples/client.js
index c83b342..29dac26 100644
--- a/lib/nodejs/examples/client.js
+++ b/lib/nodejs/examples/client.js
@@ -16,28 +16,30 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var thrift = require('thrift');
+var thrift = require("thrift");
 
-var UserStorage = require('./gen-nodejs/UserStorage.js'),
-    ttypes = require('./gen-nodejs/user_types');
+var UserStorage = require("./gen-nodejs/UserStorage.js"),
+  ttypes = require("./gen-nodejs/user_types");
 
-var connection = thrift.createConnection('localhost', 9090),
-    client = thrift.createClient(UserStorage, connection);
+var connection = thrift.createConnection("localhost", 9090),
+  client = thrift.createClient(UserStorage, connection);
 
-var user = new ttypes.UserProfile({uid: 1,
-                                   name: "Mark Slee",
-                                   blurb: "I'll find something to put here."});
+var user = new ttypes.UserProfile({
+  uid: 1,
+  name: "Mark Slee",
+  blurb: "I'll find something to put here.",
+});
 
-connection.on('error', function(err) {
+connection.on("error", function (err) {
   console.error(err);
 });
 
-client.store(user, function(err, response) {
+client.store(user, function (err, response) {
   if (err) {
     console.error(err);
   } else {
     console.log("client stored:", user.uid);
-    client.retrieve(user.uid, function(err, responseUser) {
+    client.retrieve(user.uid, function (err, responseUser) {
       if (err) {
         console.error(err);
       } else {
diff --git a/lib/nodejs/examples/client_multitransport.js b/lib/nodejs/examples/client_multitransport.js
index 1e37de3..05e5c31 100644
--- a/lib/nodejs/examples/client_multitransport.js
+++ b/lib/nodejs/examples/client_multitransport.js
@@ -16,43 +16,61 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var thrift = require('thrift'),
-    ttransport = require('thrift/transport');
+var thrift = require("thrift"),
+  ttransport = require("thrift/transport");
 
-var UserStorage = require('./gen-nodejs/UserStorage'),
-    ttypes = require('./gen-nodejs/user_types');
+var UserStorage = require("./gen-nodejs/UserStorage"),
+  ttypes = require("./gen-nodejs/user_types");
 
-var f_conn = thrift.createConnection('localhost', 9090), // default: framed
-    f_client = thrift.createClient(UserStorage, f_conn);
-var b_conn = thrift.createConnection('localhost', 9091, {transport: ttransport.TBufferedTransport}),
-    b_client = thrift.createClient(UserStorage, b_conn);
-var user1 = new ttypes.UserProfile({uid: 1,
-                                    name: "Mark Slee",
-                                    blurb: "I'll find something to put here."});
-var user2 = new ttypes.UserProfile({uid: 2,
-                                    name: "Satoshi Tagomori",
-                                    blurb: "ok, let's test with buffered transport."});
+var f_conn = thrift.createConnection("localhost", 9090), // default: framed
+  f_client = thrift.createClient(UserStorage, f_conn);
+var b_conn = thrift.createConnection("localhost", 9091, {
+    transport: ttransport.TBufferedTransport,
+  }),
+  b_client = thrift.createClient(UserStorage, b_conn);
+var user1 = new ttypes.UserProfile({
+  uid: 1,
+  name: "Mark Slee",
+  blurb: "I'll find something to put here.",
+});
+var user2 = new ttypes.UserProfile({
+  uid: 2,
+  name: "Satoshi Tagomori",
+  blurb: "ok, let's test with buffered transport.",
+});
 
-f_conn.on('error', function(err) {
+f_conn.on("error", function (err) {
   console.error("framed:", err);
 });
 
-f_client.store(user1, function(err, response) {
-  if (err) { console.error(err); return; }
+f_client.store(user1, function (err, response) {
+  if (err) {
+    console.error(err);
+    return;
+  }
 
   console.log("stored:", user1.uid, " as ", user1.name);
-  b_client.retrieve(user1.uid, function(err, responseUser) {
-    if (err) { console.error(err); return; }
+  b_client.retrieve(user1.uid, function (err, responseUser) {
+    if (err) {
+      console.error(err);
+      return;
+    }
     console.log("retrieved:", responseUser.uid, " as ", responseUser.name);
   });
 });
 
-b_client.store(user2, function(err, response) {
-  if (err) { console.error(err); return; }
+b_client.store(user2, function (err, response) {
+  if (err) {
+    console.error(err);
+    return;
+  }
 
   console.log("stored:", user2.uid, " as ", user2.name);
-  f_client.retrieve(user2.uid, function(err, responseUser) {
-    if (err) { console.error(err); return; }
+  f_client.retrieve(user2.uid, function (err, responseUser) {
+    if (err) {
+      console.error(err);
+      return;
+    }
     console.log("retrieved:", responseUser.uid, " as ", responseUser.name);
   });
 });
diff --git a/lib/nodejs/examples/hello.js b/lib/nodejs/examples/hello.js
index 8b7c4e4..5f1b682 100644
--- a/lib/nodejs/examples/hello.js
+++ b/lib/nodejs/examples/hello.js
@@ -16,46 +16,46 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var thrift = require('thrift');
-var HelloSvc = require('./gen-nodejs/HelloSvc.js');
-var TimesTwoSvc = require('./gen-nodejs/TimesTwo.js');
+var thrift = require("thrift");
+var HelloSvc = require("./gen-nodejs/HelloSvc.js");
+var TimesTwoSvc = require("./gen-nodejs/TimesTwo.js");
 
 var helloHandler = {
-	hello_func: function(result) {
-		this.call_counter = this.call_counter || 0;
-		console.log("Client call: " + (++this.call_counter));
-		result(null, "Hello Apache Thrift for JavaScript " + this.call_counter);
-	}
-}
+  hello_func: function (result) {
+    this.call_counter = this.call_counter || 0;
+    console.log("Client call: " + ++this.call_counter);
+    result(null, "Hello Apache Thrift for JavaScript " + this.call_counter);
+  },
+};
 
 var timesTwoHandler = {
-	dbl: function(val, result) {
-		console.log("Client call: " + val);
-		result(null, val * 2);
-	}
-}
+  dbl: function (val, result) {
+    console.log("Client call: " + val);
+    result(null, val * 2);
+  },
+};
 
 var helloService = {
-	transport: thrift.TBufferedTransport,
-	protocol: thrift.TJSONProtocol,
-	processor: HelloSvc,
-	handler: helloHandler
+  transport: thrift.TBufferedTransport,
+  protocol: thrift.TJSONProtocol,
+  processor: HelloSvc,
+  handler: helloHandler,
 };
 
 var dblService = {
-	transport: thrift.TBufferedTransport,
-	protocol: thrift.TJSONProtocol,
-	processor: TimesTwoSvc,
-	handler: timesTwoHandler
+  transport: thrift.TBufferedTransport,
+  protocol: thrift.TJSONProtocol,
+  processor: TimesTwoSvc,
+  handler: timesTwoHandler,
 };
 
 var ServerOptions = {
-	files: ".",
-	services: {
-		"/hello": helloService,
-		"/dbl": dblService,
-	}
-}
+  files: ".",
+  services: {
+    "/hello": helloService,
+    "/dbl": dblService,
+  },
+};
 
 var server = thrift.createWebServer(ServerOptions);
 var port = 8585;
diff --git a/lib/nodejs/examples/httpClient.js b/lib/nodejs/examples/httpClient.js
index 19cc0c3..155b5f4 100644
--- a/lib/nodejs/examples/httpClient.js
+++ b/lib/nodejs/examples/httpClient.js
@@ -1,23 +1,21 @@
-var thrift = require('thrift');
-var helloSvc = require('./gen-nodejs/HelloSvc.js');
+var thrift = require("thrift");
+var helloSvc = require("./gen-nodejs/HelloSvc.js");
 
 var options = {
-   transport: thrift.TBufferedTransport,
-   protocol: thrift.TJSONProtocol,
-   path: "/hello",
-   headers: {"Connection": "close"},
-   https: false
+  transport: thrift.TBufferedTransport,
+  protocol: thrift.TJSONProtocol,
+  path: "/hello",
+  headers: { Connection: "close" },
+  https: false,
 };
 
 var connection = thrift.createHttpConnection("localhost", 9090, options);
 var client = thrift.createHttpClient(helloSvc, connection);
 
-connection.on("error", function(err) {
-   console.log("Error: " + err);
+connection.on("error", function (err) {
+  console.log("Error: " + err);
 });
 
-client.hello_func(function(error, result) {
-   console.log("Msg from server: " + result);
+client.hello_func(function (error, result) {
+  console.log("Msg from server: " + result);
 });
-
-
diff --git a/lib/nodejs/examples/httpServer.js b/lib/nodejs/examples/httpServer.js
index acae136..c4cbc9f 100644
--- a/lib/nodejs/examples/httpServer.js
+++ b/lib/nodejs/examples/httpServer.js
@@ -1,31 +1,30 @@
-var thrift = require('thrift');                 	
-var helloSvc = require('./gen-nodejs/HelloSvc');
+var thrift = require("thrift");
+var helloSvc = require("./gen-nodejs/HelloSvc");
 
-//ServiceHandler: Implement the hello service 
+//ServiceHandler: Implement the hello service
 var helloHandler = {
   hello_func: function (result) {
     console.log("Received Hello call");
     result(null, "Hello from Node.js");
-  }
+  },
 };
 
 //ServiceOptions: The I/O stack for the service
-var helloSvcOpt = {                       		
-    handler: helloHandler,                      	
-    processor: helloSvc,                         	
-    protocol: thrift.TJSONProtocol,                 
-    transport: thrift.TBufferedTransport 		
-};                                  
+var helloSvcOpt = {
+  handler: helloHandler,
+  processor: helloSvc,
+  protocol: thrift.TJSONProtocol,
+  transport: thrift.TBufferedTransport,
+};
 
 //ServerOptions: Define server features
-var serverOpt = {                          	
-   services: {                         
-      "/hello": helloSvcOpt                 
-   }                               
-}                                   
+var serverOpt = {
+  services: {
+    "/hello": helloSvcOpt,
+  },
+};
 
-//Create and start the web server 
-var port = 9090;                            		
-thrift.createWebServer(serverOpt).listen(port);                        		
+//Create and start the web server
+var port = 9090;
+thrift.createWebServer(serverOpt).listen(port);
 console.log("Http/Thrift Server running on port: " + port);
-
diff --git a/lib/nodejs/examples/parse.js b/lib/nodejs/examples/parse.js
index 168a1ae..8513e4c 100644
--- a/lib/nodejs/examples/parse.js
+++ b/lib/nodejs/examples/parse.js
@@ -35,11 +35,11 @@
  */
 
 function parseThrift(thriftEncodedData, callback) {
-  var thrift = require('thrift');
+  var thrift = require("thrift");
   var transport = new thrift.TFramedTransport(thriftEncodedData);
-  var protocol  = new thrift.TBinaryProtocol(transport);
+  var protocol = new thrift.TBinaryProtocol(transport);
 
-  var clientClass = require('../gen-nodejs/GENERATED').YOUR_CLASS_NAME;
+  var clientClass = require("../gen-nodejs/GENERATED").YOUR_CLASS_NAME;
   var client = new clientClass();
   client.read(protocol);
   callback(null, client);
diff --git a/lib/nodejs/examples/server.js b/lib/nodejs/examples/server.js
index 1c482fe..41492cb 100644
--- a/lib/nodejs/examples/server.js
+++ b/lib/nodejs/examples/server.js
@@ -16,21 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var thrift = require('thrift');
+var thrift = require("thrift");
 
-var UserStorage = require('./gen-nodejs/UserStorage.js'),
-    ttypes = require('./gen-nodejs/user_types');
+var UserStorage = require("./gen-nodejs/UserStorage.js"),
+  ttypes = require("./gen-nodejs/user_types");
 
 var users = {};
 
 var server = thrift.createServer(UserStorage, {
-  store: function(user, result) {
+  store: function (user, result) {
     console.log("server stored:", user.uid);
     users[user.uid] = user;
     result(null);
   },
 
-  retrieve: function(uid, result) {
+  retrieve: function (uid, result) {
     console.log("server retrieved:", uid);
     result(null, users[uid]);
   },
diff --git a/lib/nodejs/examples/server_http.js b/lib/nodejs/examples/server_http.js
index ef2dc83..235f675 100644
--- a/lib/nodejs/examples/server_http.js
+++ b/lib/nodejs/examples/server_http.js
@@ -16,38 +16,46 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var connect = require('connect');
-var thrift = require('thrift');
+var connect = require("connect");
+var thrift = require("thrift");
 
-var UserStorage = require('./gen-nodejs/UserStorage'),
-    ttypes = require('./gen-nodejs/user_types');
+var UserStorage = require("./gen-nodejs/UserStorage"),
+  ttypes = require("./gen-nodejs/user_types");
 
 var users = {};
 
-var store = function(user, result) {
+var store = function (user, result) {
   console.log("stored:", user.uid);
   users[user.uid] = user;
   result(null);
 };
-var retrieve = function(uid, result) {
+var retrieve = function (uid, result) {
   console.log("retrieved:", uid);
   result(null, users[uid]);
 };
 
 var server_http = thrift.createHttpServer(UserStorage, {
   store: store,
-  retrieve: retrieve
+  retrieve: retrieve,
 });
 server_http.listen(9090);
 
-var server_connect = connect(thrift.httpMiddleware(UserStorage, {
- store: store,
- retrieve: retrieve
-}));
+var server_connect = connect(
+  thrift.httpMiddleware(UserStorage, {
+    store: store,
+    retrieve: retrieve,
+  }),
+);
 server_http.listen(9091);
 
-var server_connect_json = connect(thrift.httpMiddleware(UserStorage, {
- store: store,
- retrieve: retrieve
-}, {protocol: thrift.TJSONProtocol}));
+var server_connect_json = connect(
+  thrift.httpMiddleware(
+    UserStorage,
+    {
+      store: store,
+      retrieve: retrieve,
+    },
+    { protocol: thrift.TJSONProtocol },
+  ),
+);
 server_connect_json.listen(9092);
diff --git a/lib/nodejs/examples/server_multitransport.js b/lib/nodejs/examples/server_multitransport.js
index a348e68..3dc0b17 100644
--- a/lib/nodejs/examples/server_multitransport.js
+++ b/lib/nodejs/examples/server_multitransport.js
@@ -16,31 +16,35 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var thrift = require('thrift'),
-    ttransport = require('thrift/transport');
+var thrift = require("thrift"),
+  ttransport = require("thrift/transport");
 
-var UserStorage = require('./gen-nodejs/UserStorage'),
-    ttypes = require('./gen-nodejs/user_types');
+var UserStorage = require("./gen-nodejs/UserStorage"),
+  ttypes = require("./gen-nodejs/user_types");
 
 var users = {};
 
-var store = function(user, result) {
+var store = function (user, result) {
   console.log("stored:", user.uid);
   users[user.uid] = user;
   result(null);
 };
-var retrieve = function(uid, result) {
+var retrieve = function (uid, result) {
   console.log("retrieved:", uid);
   result(null, users[uid]);
 };
 
 var server_framed = thrift.createServer(UserStorage, {
   store: store,
-  retrieve: retrieve
+  retrieve: retrieve,
 });
 server_framed.listen(9090);
-var server_buffered = thrift.createServer(UserStorage, {
- store: store,
- retrieve: retrieve
-}, {transport: ttransport.TBufferedTransport});
+var server_buffered = thrift.createServer(
+  UserStorage,
+  {
+    store: store,
+    retrieve: retrieve,
+  },
+  { transport: ttransport.TBufferedTransport },
+);
 server_buffered.listen(9091);
diff --git a/lib/nodejs/lib/thrift/binary.js b/lib/nodejs/lib/thrift/binary.js
index 9813ffd..e8bbee7 100644
--- a/lib/nodejs/lib/thrift/binary.js
+++ b/lib/nodejs/lib/thrift/binary.js
@@ -26,11 +26,11 @@
 var POW_52 = Math.pow(2, 52);
 var POW_1022 = Math.pow(2, 1022);
 
-exports.readByte = function(b){
-	return b > 127 ? b-256 : b;
+exports.readByte = function (b) {
+  return b > 127 ? b - 256 : b;
 };
 
-exports.readI16 = function(buff, off) {
+exports.readI16 = function (buff, off) {
   off = off || 0;
   var v = buff[off + 1];
   v += buff[off] << 8;
@@ -40,7 +40,7 @@
   return v;
 };
 
-exports.readI32 = function(buff, off) {
+exports.readI32 = function (buff, off) {
   off = off || 0;
   var v = buff[off + 3];
   v += buff[off + 2] << 8;
@@ -52,14 +52,14 @@
   return v;
 };
 
-exports.writeI16 = function(buff, v) {
+exports.writeI16 = function (buff, v) {
   buff[1] = v & 0xff;
   v >>= 8;
   buff[0] = v & 0xff;
   return buff;
 };
 
-exports.writeI32 = function(buff, v) {
+exports.writeI32 = function (buff, v) {
   buff[3] = v & 0xff;
   v >>= 8;
   buff[2] = v & 0xff;
@@ -70,26 +70,26 @@
   return buff;
 };
 
-exports.readDouble = function(buff, off) {
+exports.readDouble = function (buff, off) {
   off = off || 0;
   var signed = buff[off] & 0x80;
-  var e = (buff[off+1] & 0xF0) >> 4;
-  e += (buff[off] & 0x7F) << 4;
+  var e = (buff[off + 1] & 0xf0) >> 4;
+  e += (buff[off] & 0x7f) << 4;
 
-  var m = buff[off+7];
-  m += buff[off+6] << 8;
-  m += buff[off+5] << 16;
-  m += buff[off+4] * POW_24;
-  m += buff[off+3] * POW_32;
-  m += buff[off+2] * POW_40;
-  m += (buff[off+1] & 0x0F) * POW_48;
+  var m = buff[off + 7];
+  m += buff[off + 6] << 8;
+  m += buff[off + 5] << 16;
+  m += buff[off + 4] * POW_24;
+  m += buff[off + 3] * POW_32;
+  m += buff[off + 2] * POW_40;
+  m += (buff[off + 1] & 0x0f) * POW_48;
 
   switch (e) {
     case 0:
       e = -1022;
       break;
     case 2047:
-      return m ? NaN : (signed ? -Infinity : Infinity);
+      return m ? NaN : signed ? -Infinity : Infinity;
     default:
       m += POW_52;
       e -= 1023;
@@ -106,10 +106,10 @@
  * Based on code from the jspack module:
  * http://code.google.com/p/jspack/
  */
-exports.writeDouble = function(buff, v) {
+exports.writeDouble = function (buff, v) {
   var m, e, c;
 
-  buff[0] = (v < 0 ? 0x80 : 0x00);
+  buff[0] = v < 0 ? 0x80 : 0x00;
 
   v = Math.abs(v);
   if (v !== v) {
@@ -127,22 +127,17 @@
       c *= 2;
     }
 
-    if (e + 1023 >= 2047)
-    {
+    if (e + 1023 >= 2047) {
       // Overflow
       m = 0;
       e = 2047;
-    }
-    else if (e + 1023 >= 1)
-    {
+    } else if (e + 1023 >= 1) {
       // Normalized - term order matters, as Math.pow(2, 52-e) and v*Math.pow(2, 52) can overflow
-      m = (v*c-1) * POW_52;
+      m = (v * c - 1) * POW_52;
       e += 1023;
-    }
-    else
-    {
+    } else {
       // Denormalized - also catches the '0' case, somewhat by chance
-      m = (v * POW_1022) * POW_52;
+      m = v * POW_1022 * POW_52;
       e = 0;
     }
   }
diff --git a/lib/nodejs/lib/thrift/binary_protocol.js b/lib/nodejs/lib/thrift/binary_protocol.js
index af8836c..fc4df4a 100644
--- a/lib/nodejs/lib/thrift/binary_protocol.js
+++ b/lib/nodejs/lib/thrift/binary_protocol.js
@@ -17,10 +17,10 @@
  * under the License.
  */
 
-var log = require('./log');
-var binary = require('./binary');
-var Int64 = require('node-int64');
-var Thrift = require('./thrift');
+var log = require("./log");
+var binary = require("./binary");
+var Int64 = require("node-int64");
+var Thrift = require("./thrift");
 var Type = Thrift.Type;
 
 module.exports = TBinaryProtocol;
@@ -29,96 +29,90 @@
 // The largest integer value which can be represented in JavaScript is +/-2^53.
 // Bitwise operations convert numbers to 32 bit integers but perform sign extension
 // upon assigning values back to variables.
-var VERSION_MASK = -65536,   // 0xffff0000
-    VERSION_1 = -2147418112, // 0x80010000
-    TYPE_MASK = 0x000000ff;
+var VERSION_MASK = -65536, // 0xffff0000
+  VERSION_1 = -2147418112, // 0x80010000
+  TYPE_MASK = 0x000000ff;
 
 TBinaryProtocol.VERSION_MASK = VERSION_MASK;
 TBinaryProtocol.VERSION_1 = VERSION_1;
-TBinaryProtocol.TYPE_MASK = TYPE_MASK
+TBinaryProtocol.TYPE_MASK = TYPE_MASK;
 
 function TBinaryProtocol(trans, strictRead, strictWrite) {
   this.trans = trans;
-  this.strictRead = (strictRead !== undefined ? strictRead : false);
-  this.strictWrite = (strictWrite !== undefined ? strictWrite : true);
+  this.strictRead = strictRead !== undefined ? strictRead : false;
+  this.strictWrite = strictWrite !== undefined ? strictWrite : true;
   this._seqid = null;
-};
+}
 
-TBinaryProtocol.prototype.flush = function() {
+TBinaryProtocol.prototype.flush = function () {
   return this.trans.flush();
 };
 
-TBinaryProtocol.prototype.writeMessageBegin = function(name, type, seqid) {
-    if (this.strictWrite) {
-      this.writeI32(VERSION_1 | type);
-      this.writeString(name);
-      this.writeI32(seqid);
-    } else {
-      this.writeString(name);
-      this.writeByte(type);
-      this.writeI32(seqid);
-    }
-    // Record client seqid to find callback again
-    if (this._seqid !== null) {
-      log.warning('SeqId already set', { 'name': name });
-    } else {
-      this._seqid = seqid;
-      this.trans.setCurrSeqId(seqid);
-    }
+TBinaryProtocol.prototype.writeMessageBegin = function (name, type, seqid) {
+  if (this.strictWrite) {
+    this.writeI32(VERSION_1 | type);
+    this.writeString(name);
+    this.writeI32(seqid);
+  } else {
+    this.writeString(name);
+    this.writeByte(type);
+    this.writeI32(seqid);
+  }
+  // Record client seqid to find callback again
+  if (this._seqid !== null) {
+    log.warning("SeqId already set", { name: name });
+  } else {
+    this._seqid = seqid;
+    this.trans.setCurrSeqId(seqid);
+  }
 };
 
-TBinaryProtocol.prototype.writeMessageEnd = function() {
-    if (this._seqid !== null) {
-        this._seqid = null;
-    } else {
-        log.warning('No seqid to unset');
-    }
+TBinaryProtocol.prototype.writeMessageEnd = function () {
+  if (this._seqid !== null) {
+    this._seqid = null;
+  } else {
+    log.warning("No seqid to unset");
+  }
 };
 
-TBinaryProtocol.prototype.writeStructBegin = function(name) {
-};
+TBinaryProtocol.prototype.writeStructBegin = function (name) {};
 
-TBinaryProtocol.prototype.writeStructEnd = function() {
-};
+TBinaryProtocol.prototype.writeStructEnd = function () {};
 
-TBinaryProtocol.prototype.writeFieldBegin = function(name, type, id) {
+TBinaryProtocol.prototype.writeFieldBegin = function (name, type, id) {
   this.writeByte(type);
   this.writeI16(id);
 };
 
-TBinaryProtocol.prototype.writeFieldEnd = function() {
-};
+TBinaryProtocol.prototype.writeFieldEnd = function () {};
 
-TBinaryProtocol.prototype.writeFieldStop = function() {
+TBinaryProtocol.prototype.writeFieldStop = function () {
   this.writeByte(Type.STOP);
 };
 
-TBinaryProtocol.prototype.writeMapBegin = function(ktype, vtype, size) {
+TBinaryProtocol.prototype.writeMapBegin = function (ktype, vtype, size) {
   this.writeByte(ktype);
   this.writeByte(vtype);
   this.writeI32(size);
 };
 
-TBinaryProtocol.prototype.writeMapEnd = function() {
-};
+TBinaryProtocol.prototype.writeMapEnd = function () {};
 
-TBinaryProtocol.prototype.writeListBegin = function(etype, size) {
+TBinaryProtocol.prototype.writeListBegin = function (etype, size) {
   this.writeByte(etype);
   this.writeI32(size);
 };
 
-TBinaryProtocol.prototype.writeListEnd = function() {
-};
+TBinaryProtocol.prototype.writeListEnd = function () {};
 
-TBinaryProtocol.prototype.writeSetBegin = function(etype, size) {
+TBinaryProtocol.prototype.writeSetBegin = function (etype, size) {
   this.writeByte(etype);
   this.writeI32(size);
 };
 
-TBinaryProtocol.prototype.writeSetEnd = function() {
-};
+TBinaryProtocol.prototype.writeSetEnd = function () {};
 
-TBinaryProtocol.prototype.writeBool = function(bool) {
+TBinaryProtocol.prototype.writeBool = function (bool) {
   if (bool) {
     this.writeByte(1);
   } else {
@@ -126,19 +120,19 @@
   }
 };
 
-TBinaryProtocol.prototype.writeByte = function(b) {
+TBinaryProtocol.prototype.writeByte = function (b) {
   this.trans.write(new Buffer([b]));
 };
 
-TBinaryProtocol.prototype.writeI16 = function(i16) {
+TBinaryProtocol.prototype.writeI16 = function (i16) {
   this.trans.write(binary.writeI16(new Buffer(2), i16));
 };
 
-TBinaryProtocol.prototype.writeI32 = function(i32) {
+TBinaryProtocol.prototype.writeI32 = function (i32) {
   this.trans.write(binary.writeI32(new Buffer(4), i32));
 };
 
-TBinaryProtocol.prototype.writeI64 = function(i64) {
+TBinaryProtocol.prototype.writeI64 = function (i64) {
   if (i64.buffer) {
     this.trans.write(i64.buffer);
   } else {
@@ -146,108 +140,110 @@
   }
 };
 
-TBinaryProtocol.prototype.writeDouble = function(dub) {
+TBinaryProtocol.prototype.writeDouble = function (dub) {
   this.trans.write(binary.writeDouble(new Buffer(8), dub));
 };
 
-TBinaryProtocol.prototype.writeStringOrBinary = function(name, encoding, arg) {
-  if (typeof(arg) === 'string') {
+TBinaryProtocol.prototype.writeStringOrBinary = function (name, encoding, arg) {
+  if (typeof arg === "string") {
     this.writeI32(Buffer.byteLength(arg, encoding));
     this.trans.write(new Buffer(arg, encoding));
-  } else if ((arg instanceof Buffer) ||
-             (Object.prototype.toString.call(arg) == '[object Uint8Array]')) {
+  } else if (
+    arg instanceof Buffer ||
+    Object.prototype.toString.call(arg) == "[object Uint8Array]"
+  ) {
     // Buffers in Node.js under Browserify may extend UInt8Array instead of
     // defining a new object. We detect them here so we can write them
     // correctly
     this.writeI32(arg.length);
     this.trans.write(arg);
   } else {
-    throw new Error(name + ' called without a string/Buffer argument: ' + arg);
+    throw new Error(name + " called without a string/Buffer argument: " + arg);
   }
 };
 
-TBinaryProtocol.prototype.writeString = function(arg) {
-  this.writeStringOrBinary('writeString', 'utf8', arg);
+TBinaryProtocol.prototype.writeString = function (arg) {
+  this.writeStringOrBinary("writeString", "utf8", arg);
 };
 
-TBinaryProtocol.prototype.writeBinary = function(arg) {
-  this.writeStringOrBinary('writeBinary', 'binary', arg);
+TBinaryProtocol.prototype.writeBinary = function (arg) {
+  this.writeStringOrBinary("writeBinary", "binary", arg);
 };
 
-TBinaryProtocol.prototype.readMessageBegin = function() {
+TBinaryProtocol.prototype.readMessageBegin = function () {
   var sz = this.readI32();
   var type, name, seqid;
 
   if (sz < 0) {
     var version = sz & VERSION_MASK;
     if (version != VERSION_1) {
-      throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.BAD_VERSION, "Bad version in readMessageBegin: " + sz);
+      throw new Thrift.TProtocolException(
+        Thrift.TProtocolExceptionType.BAD_VERSION,
+        "Bad version in readMessageBegin: " + sz,
+      );
     }
     type = sz & TYPE_MASK;
     name = this.readString();
     seqid = this.readI32();
   } else {
     if (this.strictRead) {
-      throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.BAD_VERSION, "No protocol version header");
+      throw new Thrift.TProtocolException(
+        Thrift.TProtocolExceptionType.BAD_VERSION,
+        "No protocol version header",
+      );
     }
     name = this.trans.read(sz);
     type = this.readByte();
     seqid = this.readI32();
   }
-  return {fname: name, mtype: type, rseqid: seqid};
+  return { fname: name, mtype: type, rseqid: seqid };
 };
 
-TBinaryProtocol.prototype.readMessageEnd = function() {
+TBinaryProtocol.prototype.readMessageEnd = function () {};
+
+TBinaryProtocol.prototype.readStructBegin = function () {
+  return { fname: "" };
 };
 
-TBinaryProtocol.prototype.readStructBegin = function() {
-  return {fname: ''};
-};
+TBinaryProtocol.prototype.readStructEnd = function () {};
 
-TBinaryProtocol.prototype.readStructEnd = function() {
-};
-
-TBinaryProtocol.prototype.readFieldBegin = function() {
+TBinaryProtocol.prototype.readFieldBegin = function () {
   var type = this.readByte();
   if (type == Type.STOP) {
-    return {fname: null, ftype: type, fid: 0};
+    return { fname: null, ftype: type, fid: 0 };
   }
   var id = this.readI16();
-  return {fname: null, ftype: type, fid: id};
+  return { fname: null, ftype: type, fid: id };
 };
 
-TBinaryProtocol.prototype.readFieldEnd = function() {
-};
+TBinaryProtocol.prototype.readFieldEnd = function () {};
 
-TBinaryProtocol.prototype.readMapBegin = function() {
+TBinaryProtocol.prototype.readMapBegin = function () {
   var ktype = this.readByte();
   var vtype = this.readByte();
   var size = this.readI32();
-  return {ktype: ktype, vtype: vtype, size: size};
+  return { ktype: ktype, vtype: vtype, size: size };
 };
 
-TBinaryProtocol.prototype.readMapEnd = function() {
-};
+TBinaryProtocol.prototype.readMapEnd = function () {};
 
-TBinaryProtocol.prototype.readListBegin = function() {
+TBinaryProtocol.prototype.readListBegin = function () {
   var etype = this.readByte();
   var size = this.readI32();
-  return {etype: etype, size: size};
+  return { etype: etype, size: size };
 };
 
-TBinaryProtocol.prototype.readListEnd = function() {
-};
+TBinaryProtocol.prototype.readListEnd = function () {};
 
-TBinaryProtocol.prototype.readSetBegin = function() {
+TBinaryProtocol.prototype.readSetBegin = function () {
   var etype = this.readByte();
   var size = this.readI32();
-  return {etype: etype, size: size};
+  return { etype: etype, size: size };
 };
 
-TBinaryProtocol.prototype.readSetEnd = function() {
-};
+TBinaryProtocol.prototype.readSetEnd = function () {};
 
-TBinaryProtocol.prototype.readBool = function() {
+TBinaryProtocol.prototype.readBool = function () {
   var b = this.readByte();
   if (b === 0) {
     return false;
@@ -255,56 +251,62 @@
   return true;
 };
 
-TBinaryProtocol.prototype.readByte = function() {
+TBinaryProtocol.prototype.readByte = function () {
   return this.trans.readByte();
 };
 
-TBinaryProtocol.prototype.readI16 = function() {
+TBinaryProtocol.prototype.readI16 = function () {
   return this.trans.readI16();
 };
 
-TBinaryProtocol.prototype.readI32 = function() {
+TBinaryProtocol.prototype.readI32 = function () {
   return this.trans.readI32();
 };
 
-TBinaryProtocol.prototype.readI64 = function() {
+TBinaryProtocol.prototype.readI64 = function () {
   var buff = this.trans.read(8);
   return new Int64(buff);
 };
 
-TBinaryProtocol.prototype.readDouble = function() {
+TBinaryProtocol.prototype.readDouble = function () {
   return this.trans.readDouble();
 };
 
-TBinaryProtocol.prototype.readBinary = function() {
+TBinaryProtocol.prototype.readBinary = function () {
   var len = this.readI32();
   if (len === 0) {
     return new Buffer(0);
   }
 
   if (len < 0) {
-    throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative binary size");
+    throw new Thrift.TProtocolException(
+      Thrift.TProtocolExceptionType.NEGATIVE_SIZE,
+      "Negative binary size",
+    );
   }
   return this.trans.read(len);
 };
 
-TBinaryProtocol.prototype.readString = function() {
+TBinaryProtocol.prototype.readString = function () {
   var len = this.readI32();
   if (len === 0) {
     return "";
   }
 
   if (len < 0) {
-    throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative string size");
+    throw new Thrift.TProtocolException(
+      Thrift.TProtocolExceptionType.NEGATIVE_SIZE,
+      "Negative string size",
+    );
   }
   return this.trans.readString(len);
 };
 
-TBinaryProtocol.prototype.getTransport = function() {
+TBinaryProtocol.prototype.getTransport = function () {
   return this.trans;
 };
 
-TBinaryProtocol.prototype.skip = function(type) {
+TBinaryProtocol.prototype.skip = function (type) {
   switch (type) {
     case Type.BOOL:
       this.readBool();
@@ -362,6 +364,6 @@
       this.readListEnd();
       break;
     default:
-      throw new  Error("Invalid type: " + type);
+      throw new Error("Invalid type: " + type);
   }
 };
diff --git a/lib/nodejs/lib/thrift/browser.js b/lib/nodejs/lib/thrift/browser.js
index 5915cf6..5c843d0 100644
--- a/lib/nodejs/lib/thrift/browser.js
+++ b/lib/nodejs/lib/thrift/browser.js
@@ -16,42 +16,42 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-exports.Thrift = require('./thrift');
+exports.Thrift = require("./thrift");
 
-var wsConnection = require('./ws_connection');
+var wsConnection = require("./ws_connection");
 exports.WSConnection = wsConnection.WSConnection;
 exports.createWSConnection = wsConnection.createWSConnection;
 exports.createWSClient = wsConnection.createWSClient;
 
-var xhrConnection = require('./xhr_connection');
+var xhrConnection = require("./xhr_connection");
 exports.XHRConnection = xhrConnection.XHRConnection;
 exports.createXHRConnection = xhrConnection.createXHRConnection;
 exports.createXHRClient = xhrConnection.createXHRClient;
 
-var ohosConnection = require('./ohos_connection');
+var ohosConnection = require("./ohos_connection");
 exports.OhosConnection = ohosConnection.OhosConnection;
 exports.createOhosConnection = ohosConnection.createOhosConnection;
 exports.createOhosClient = ohosConnection.createOhosClient;
 
-exports.createClient = require('./create_client');
+exports.createClient = require("./create_client");
 
-exports.Int64 = require('node-int64');
-exports.Q = require('q');
+exports.Int64 = require("node-int64");
+exports.Q = require("q");
 
-var mpxProtocol = require('./multiplexed_protocol');
+var mpxProtocol = require("./multiplexed_protocol");
 exports.Multiplexer = mpxProtocol.Multiplexer;
 
 /*
  * Export transport and protocol so they can be used outside of a
  * cassandra/server context
  */
-exports.TBufferedTransport = require('./buffered_transport');
-exports.TFramedTransport = require('./framed_transport');
-exports.TWebSocketTransport = require('./ws_transport');
+exports.TBufferedTransport = require("./buffered_transport");
+exports.TFramedTransport = require("./framed_transport");
+exports.TWebSocketTransport = require("./ws_transport");
 
-exports.Protocol = require('./json_protocol');
-exports.TJSONProtocol = require('./json_protocol');
-exports.TBinaryProtocol = require('./binary_protocol');
-exports.TCompactProtocol = require('./compact_protocol');
+exports.Protocol = require("./json_protocol");
+exports.TJSONProtocol = require("./json_protocol");
+exports.TBinaryProtocol = require("./binary_protocol");
+exports.TCompactProtocol = require("./compact_protocol");
 
-exports.InputBufferUnderrunError = require('./input_buffer_underrun_error');
+exports.InputBufferUnderrunError = require("./input_buffer_underrun_error");
diff --git a/lib/nodejs/lib/thrift/buffered_transport.js b/lib/nodejs/lib/thrift/buffered_transport.js
index f0d5d4a..27d682d 100644
--- a/lib/nodejs/lib/thrift/buffered_transport.js
+++ b/lib/nodejs/lib/thrift/buffered_transport.js
@@ -17,9 +17,9 @@
  * under the License.
  */
 
-var binary = require('./binary');
-var InputBufferUnderrunError = require('./input_buffer_underrun_error');
-var THeaderTransport = require('./header_transport');
+var binary = require("./binary");
+var InputBufferUnderrunError = require("./input_buffer_underrun_error");
+var THeaderTransport = require("./header_transport");
 
 module.exports = TBufferedTransport;
 
@@ -33,22 +33,22 @@
   this.outBuffers = [];
   this.outCount = 0;
   this.onFlush = callback;
-};
+}
 
 Object.setPrototypeOf(TBufferedTransport.prototype, THeaderTransport.prototype);
 
-TBufferedTransport.prototype.reset = function() {
+TBufferedTransport.prototype.reset = function () {
   this.inBuf = new Buffer(this.defaultReadBufferSize);
   this.readCursor = 0;
   this.writeCursor = 0;
   this.outBuffers = [];
   this.outCount = 0;
-}
+};
 
-TBufferedTransport.receiver = function(callback, seqid) {
+TBufferedTransport.receiver = function (callback, seqid) {
   var reader = new TBufferedTransport();
 
-  return function(data) {
+  return function (data) {
     if (reader.writeCursor + data.length > reader.inBuf.length) {
       var buf = new Buffer(reader.writeCursor + data.length);
       reader.inBuf.copy(buf, 0, 0, reader.writeCursor);
@@ -61,11 +61,12 @@
   };
 };
 
-
-TBufferedTransport.prototype.commitPosition = function(){
+TBufferedTransport.prototype.commitPosition = function () {
   var unreadSize = this.writeCursor - this.readCursor;
-  var bufSize = (unreadSize * 2 > this.defaultReadBufferSize) ?
-    unreadSize * 2 : this.defaultReadBufferSize;
+  var bufSize =
+    unreadSize * 2 > this.defaultReadBufferSize
+      ? unreadSize * 2
+      : this.defaultReadBufferSize;
   var buf = new Buffer(bufSize);
   if (unreadSize > 0) {
     this.inBuf.copy(buf, 0, this.readCursor, this.writeCursor);
@@ -75,34 +76,32 @@
   this.inBuf = buf;
 };
 
-TBufferedTransport.prototype.rollbackPosition = function(){
+TBufferedTransport.prototype.rollbackPosition = function () {
   this.readCursor = 0;
-}
+};
 
-  // TODO: Implement open/close support
-TBufferedTransport.prototype.isOpen = function() {
+// TODO: Implement open/close support
+TBufferedTransport.prototype.isOpen = function () {
   return true;
 };
 
-TBufferedTransport.prototype.open = function() {
-};
+TBufferedTransport.prototype.open = function () {};
 
-TBufferedTransport.prototype.close = function() {
-};
+TBufferedTransport.prototype.close = function () {};
 
-  // Set the seqid of the message in the client
-  // So that callbacks can be found
-TBufferedTransport.prototype.setCurrSeqId = function(seqid) {
+// Set the seqid of the message in the client
+// So that callbacks can be found
+TBufferedTransport.prototype.setCurrSeqId = function (seqid) {
   this._seqid = seqid;
 };
 
-TBufferedTransport.prototype.ensureAvailable = function(len) {
+TBufferedTransport.prototype.ensureAvailable = function (len) {
   if (this.readCursor + len > this.writeCursor) {
     throw new InputBufferUnderrunError();
   }
 };
 
-TBufferedTransport.prototype.read = function(len) {
+TBufferedTransport.prototype.read = function (len) {
   this.ensureAvailable(len);
   var buf = new Buffer(len);
   this.inBuf.copy(buf, 0, this.readCursor, this.readCursor + len);
@@ -110,57 +109,61 @@
   return buf;
 };
 
-TBufferedTransport.prototype.readByte = function() {
+TBufferedTransport.prototype.readByte = function () {
   this.ensureAvailable(1);
   return binary.readByte(this.inBuf[this.readCursor++]);
 };
 
-TBufferedTransport.prototype.readI16 = function() {
+TBufferedTransport.prototype.readI16 = function () {
   this.ensureAvailable(2);
   var i16 = binary.readI16(this.inBuf, this.readCursor);
   this.readCursor += 2;
   return i16;
 };
 
-TBufferedTransport.prototype.readI32 = function() {
+TBufferedTransport.prototype.readI32 = function () {
   this.ensureAvailable(4);
   var i32 = binary.readI32(this.inBuf, this.readCursor);
   this.readCursor += 4;
   return i32;
 };
 
-TBufferedTransport.prototype.readDouble = function() {
+TBufferedTransport.prototype.readDouble = function () {
   this.ensureAvailable(8);
   var d = binary.readDouble(this.inBuf, this.readCursor);
   this.readCursor += 8;
   return d;
 };
 
-TBufferedTransport.prototype.readString = function(len) {
+TBufferedTransport.prototype.readString = function (len) {
   this.ensureAvailable(len);
-  var str = this.inBuf.toString('utf8', this.readCursor, this.readCursor + len);
+  var str = this.inBuf.toString("utf8", this.readCursor, this.readCursor + len);
   this.readCursor += len;
   return str;
 };
 
-TBufferedTransport.prototype.borrow = function() {
-  var obj = {buf: this.inBuf, readIndex: this.readCursor, writeIndex: this.writeCursor};
+TBufferedTransport.prototype.borrow = function () {
+  var obj = {
+    buf: this.inBuf,
+    readIndex: this.readCursor,
+    writeIndex: this.writeCursor,
+  };
   return obj;
 };
 
-TBufferedTransport.prototype.consume = function(bytesConsumed) {
+TBufferedTransport.prototype.consume = function (bytesConsumed) {
   this.readCursor += bytesConsumed;
 };
 
-TBufferedTransport.prototype.write = function(buf) {
-  if (typeof(buf) === "string") {
-    buf = new Buffer(buf, 'utf8');
+TBufferedTransport.prototype.write = function (buf) {
+  if (typeof buf === "string") {
+    buf = new Buffer(buf, "utf8");
   }
   this.outBuffers.push(buf);
   this.outCount += buf.length;
 };
 
-TBufferedTransport.prototype.flush = function() {
+TBufferedTransport.prototype.flush = function () {
   // If the seqid of the callback is available pass it to the onFlush
   // Then remove the current seqid
   var seqid = this._seqid;
@@ -171,8 +174,8 @@
   }
 
   var msg = new Buffer(this.outCount),
-      pos = 0;
-  this.outBuffers.forEach(function(buf) {
+    pos = 0;
+  this.outBuffers.forEach(function (buf) {
     buf.copy(msg, pos, 0);
     pos += buf.length;
   });
@@ -184,4 +187,4 @@
 
   this.outBuffers = [];
   this.outCount = 0;
-}
+};
diff --git a/lib/nodejs/lib/thrift/compact_protocol.js b/lib/nodejs/lib/thrift/compact_protocol.js
index 302a88d..e946dc8 100644
--- a/lib/nodejs/lib/thrift/compact_protocol.js
+++ b/lib/nodejs/lib/thrift/compact_protocol.js
@@ -17,9 +17,9 @@
  * under the License.
  */
 
-var log = require('./log');
-var Int64 = require('node-int64');
-var Thrift = require('./thrift');
+var log = require("./log");
+var Int64 = require("node-int64");
+var Thrift = require("./thrift");
 var Type = Thrift.Type;
 
 module.exports = TCompactProtocol;
@@ -50,59 +50,58 @@
   this.container_limit_ = 0;
   this.booleanField_ = {
     name: null,
-    hasBoolValue: false
+    hasBoolValue: false,
   };
   this.boolValue_ = {
     hasBoolValue: false,
-    boolValue: false
+    boolValue: false,
   };
-};
-
+}
 
 //
 // Compact Protocol Constants
 //
 
 /**
-  * Compact Protocol ID number.
-  * @readonly
-  * @const {number} PROTOCOL_ID
-  */
-TCompactProtocol.PROTOCOL_ID = -126;  //1000 0010
+ * Compact Protocol ID number.
+ * @readonly
+ * @const {number} PROTOCOL_ID
+ */
+TCompactProtocol.PROTOCOL_ID = -126; //1000 0010
 
 /**
-  * Compact Protocol version number.
-  * @readonly
-  * @const {number} VERSION_N
-  */
+ * Compact Protocol version number.
+ * @readonly
+ * @const {number} VERSION_N
+ */
 TCompactProtocol.VERSION_N = 1;
 
 /**
-  * Compact Protocol version mask for combining protocol version and message type in one byte.
-  * @readonly
-  * @const {number} VERSION_MASK
-  */
+ * Compact Protocol version mask for combining protocol version and message type in one byte.
+ * @readonly
+ * @const {number} VERSION_MASK
+ */
 TCompactProtocol.VERSION_MASK = 0x1f; //0001 1111
 
 /**
-  * Compact Protocol message type mask for combining protocol version and message type in one byte.
-  * @readonly
-  * @const {number} TYPE_MASK
-  */
-TCompactProtocol.TYPE_MASK = -32;     //1110 0000
+ * Compact Protocol message type mask for combining protocol version and message type in one byte.
+ * @readonly
+ * @const {number} TYPE_MASK
+ */
+TCompactProtocol.TYPE_MASK = -32; //1110 0000
 
 /**
-  * Compact Protocol message type bits for ensuring message type bit size.
-  * @readonly
-  * @const {number} TYPE_BITS
-  */
+ * Compact Protocol message type bits for ensuring message type bit size.
+ * @readonly
+ * @const {number} TYPE_BITS
+ */
 TCompactProtocol.TYPE_BITS = 7; //0000 0111
 
 /**
-  * Compact Protocol message type shift amount for combining protocol version and message type in one byte.
-  * @readonly
-  * @const {number} TYPE_SHIFT_AMOUNT
-  */
+ * Compact Protocol message type shift amount for combining protocol version and message type in one byte.
+ * @readonly
+ * @const {number} TYPE_SHIFT_AMOUNT
+ */
 TCompactProtocol.TYPE_SHIFT_AMOUNT = 5;
 
 /**
@@ -123,19 +122,19 @@
  * @property {number}  CT_STRUCT        - A multifield type.
  */
 TCompactProtocol.Types = {
-  CT_STOP:           0x00,
-  CT_BOOLEAN_TRUE:   0x01,
-  CT_BOOLEAN_FALSE:  0x02,
-  CT_BYTE:           0x03,
-  CT_I16:            0x04,
-  CT_I32:            0x05,
-  CT_I64:            0x06,
-  CT_DOUBLE:         0x07,
-  CT_BINARY:         0x08,
-  CT_LIST:           0x09,
-  CT_SET:            0x0A,
-  CT_MAP:            0x0B,
-  CT_STRUCT:         0x0C
+  CT_STOP: 0x00,
+  CT_BOOLEAN_TRUE: 0x01,
+  CT_BOOLEAN_FALSE: 0x02,
+  CT_BYTE: 0x03,
+  CT_I16: 0x04,
+  CT_I32: 0x05,
+  CT_I64: 0x06,
+  CT_DOUBLE: 0x07,
+  CT_BINARY: 0x08,
+  CT_LIST: 0x09,
+  CT_SET: 0x0a,
+  CT_MAP: 0x0b,
+  CT_STRUCT: 0x0c,
 };
 
 /**
@@ -143,25 +142,24 @@
  * @readonly
  */
 TCompactProtocol.TTypeToCType = [
-  TCompactProtocol.Types.CT_STOP,         // T_STOP
-  0,                                      // unused
+  TCompactProtocol.Types.CT_STOP, // T_STOP
+  0, // unused
   TCompactProtocol.Types.CT_BOOLEAN_TRUE, // T_BOOL
-  TCompactProtocol.Types.CT_BYTE,         // T_BYTE
-  TCompactProtocol.Types.CT_DOUBLE,       // T_DOUBLE
-  0,                                      // unused
-  TCompactProtocol.Types.CT_I16,          // T_I16
-  0,                                      // unused
-  TCompactProtocol.Types.CT_I32,          // T_I32
-  0,                                      // unused
-  TCompactProtocol.Types.CT_I64,          // T_I64
-  TCompactProtocol.Types.CT_BINARY,       // T_STRING
-  TCompactProtocol.Types.CT_STRUCT,       // T_STRUCT
-  TCompactProtocol.Types.CT_MAP,          // T_MAP
-  TCompactProtocol.Types.CT_SET,          // T_SET
-  TCompactProtocol.Types.CT_LIST,         // T_LIST
+  TCompactProtocol.Types.CT_BYTE, // T_BYTE
+  TCompactProtocol.Types.CT_DOUBLE, // T_DOUBLE
+  0, // unused
+  TCompactProtocol.Types.CT_I16, // T_I16
+  0, // unused
+  TCompactProtocol.Types.CT_I32, // T_I32
+  0, // unused
+  TCompactProtocol.Types.CT_I64, // T_I64
+  TCompactProtocol.Types.CT_BINARY, // T_STRING
+  TCompactProtocol.Types.CT_STRUCT, // T_STRUCT
+  TCompactProtocol.Types.CT_MAP, // T_MAP
+  TCompactProtocol.Types.CT_SET, // T_SET
+  TCompactProtocol.Types.CT_LIST, // T_LIST
 ];
 
-
 //
 // Compact Protocol Utilities
 //
@@ -169,7 +167,7 @@
 /**
  * Returns the underlying transport layer.
  * @return {object} The underlying transport layer.
- */TCompactProtocol.prototype.getTransport = function() {
+ */ TCompactProtocol.prototype.getTransport = function () {
   return this.trans;
 };
 
@@ -179,7 +177,7 @@
  * @param {number} ttype - Thrift type value
  * @returns {number} Compact protocol type value
  */
-TCompactProtocol.prototype.getCompactType = function(ttype) {
+TCompactProtocol.prototype.getCompactType = function (ttype) {
   return TCompactProtocol.TTypeToCType[ttype];
 };
 
@@ -189,7 +187,7 @@
  * @param {number} type - Compact Protocol type value
  * @returns {number} Thrift Type value
  */
-TCompactProtocol.prototype.getTType = function(type) {
+TCompactProtocol.prototype.getTType = function (type) {
   switch (type) {
     case Type.STOP:
       return Type.STOP;
@@ -217,12 +215,14 @@
     case TCompactProtocol.Types.CT_STRUCT:
       return Type.STRUCT;
     default:
-      throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.INVALID_DATA, "Unknown type: " + type);
+      throw new Thrift.TProtocolException(
+        Thrift.TProtocolExceptionType.INVALID_DATA,
+        "Unknown type: " + type,
+      );
   }
   return Type.STOP;
 };
 
-
 //
 // Compact Protocol write operations
 //
@@ -230,7 +230,7 @@
 /**
  * Send any buffered bytes to the end point.
  */
-TCompactProtocol.prototype.flush = function() {
+TCompactProtocol.prototype.flush = function () {
   return this.trans.flush();
 };
 
@@ -240,31 +240,33 @@
  * @param {number} type - The type of message (CALL, REPLY, EXCEPTION, ONEWAY).
  * @param {number} seqid - The call sequence number (if any).
  */
-TCompactProtocol.prototype.writeMessageBegin = function(name, type, seqid) {
+TCompactProtocol.prototype.writeMessageBegin = function (name, type, seqid) {
   this.writeByte(TCompactProtocol.PROTOCOL_ID);
-  this.writeByte((TCompactProtocol.VERSION_N & TCompactProtocol.VERSION_MASK) |
-                     ((type << TCompactProtocol.TYPE_SHIFT_AMOUNT) & TCompactProtocol.TYPE_MASK));
+  this.writeByte(
+    (TCompactProtocol.VERSION_N & TCompactProtocol.VERSION_MASK) |
+      ((type << TCompactProtocol.TYPE_SHIFT_AMOUNT) &
+        TCompactProtocol.TYPE_MASK),
+  );
   this.writeVarint32(seqid);
   this.writeString(name);
 
   // Record client seqid to find callback again
   if (this._seqid) {
-    log.warning('SeqId already set', { 'name': name });
+    log.warning("SeqId already set", { name: name });
   } else {
     this._seqid = seqid;
     this.trans.setCurrSeqId(seqid);
   }
 };
 
-TCompactProtocol.prototype.writeMessageEnd = function() {
-};
+TCompactProtocol.prototype.writeMessageEnd = function () {};
 
-TCompactProtocol.prototype.writeStructBegin = function(name) {
+TCompactProtocol.prototype.writeStructBegin = function (name) {
   this.lastField_.push(this.lastFieldId_);
   this.lastFieldId_ = 0;
 };
 
-TCompactProtocol.prototype.writeStructEnd = function() {
+TCompactProtocol.prototype.writeStructEnd = function () {
   this.lastFieldId_ = this.lastField_.pop();
 };
 
@@ -274,7 +276,7 @@
  * @param {number} type - The field data type (a normal Thrift field Type).
  * @param {number} id - The IDL field Id.
  */
-TCompactProtocol.prototype.writeFieldBegin = function(name, type, id) {
+TCompactProtocol.prototype.writeFieldBegin = function (name, type, id) {
   if (type != Type.BOOL) {
     return this.writeFieldBeginInternal(name, type, id, -1);
   }
@@ -284,10 +286,9 @@
   this.booleanField_.fieldId = id;
 };
 
-TCompactProtocol.prototype.writeFieldEnd = function() {
-};
+TCompactProtocol.prototype.writeFieldEnd = function () {};
 
-TCompactProtocol.prototype.writeFieldStop = function() {
+TCompactProtocol.prototype.writeFieldStop = function () {
   this.writeByte(TCompactProtocol.Types.CT_STOP);
 };
 
@@ -297,80 +298,85 @@
  * @param {number} valType - The Thrift type of the map values.
  * @param {number} size - The number of k/v pairs in the map.
  */
-TCompactProtocol.prototype.writeMapBegin = function(keyType, valType, size) {
+TCompactProtocol.prototype.writeMapBegin = function (keyType, valType, size) {
   if (size === 0) {
     this.writeByte(0);
   } else {
     this.writeVarint32(size);
-    this.writeByte(this.getCompactType(keyType) << 4 | this.getCompactType(valType));
+    this.writeByte(
+      (this.getCompactType(keyType) << 4) | this.getCompactType(valType),
+    );
   }
 };
 
-TCompactProtocol.prototype.writeMapEnd = function() {
-};
+TCompactProtocol.prototype.writeMapEnd = function () {};
 
 /**
  * Writes a list collection header
  * @param {number} elemType - The Thrift type of the list elements.
  * @param {number} size - The number of elements in the list.
  */
-TCompactProtocol.prototype.writeListBegin = function(elemType, size) {
+TCompactProtocol.prototype.writeListBegin = function (elemType, size) {
   this.writeCollectionBegin(elemType, size);
 };
 
-TCompactProtocol.prototype.writeListEnd = function() {
-};
+TCompactProtocol.prototype.writeListEnd = function () {};
 
 /**
  * Writes a set collection header
  * @param {number} elemType - The Thrift type of the set elements.
  * @param {number} size - The number of elements in the set.
  */
-TCompactProtocol.prototype.writeSetBegin = function(elemType, size) {
+TCompactProtocol.prototype.writeSetBegin = function (elemType, size) {
   this.writeCollectionBegin(elemType, size);
 };
 
-TCompactProtocol.prototype.writeSetEnd = function() {
-};
+TCompactProtocol.prototype.writeSetEnd = function () {};
 
-TCompactProtocol.prototype.writeBool = function(value) {
+TCompactProtocol.prototype.writeBool = function (value) {
   if (this.booleanField_.name !== null) {
     // we haven't written the field header yet
-    this.writeFieldBeginInternal(this.booleanField_.name,
-                                 this.booleanField_.fieldType,
-                                 this.booleanField_.fieldId,
-                                 (value ? TCompactProtocol.Types.CT_BOOLEAN_TRUE
-                                          : TCompactProtocol.Types.CT_BOOLEAN_FALSE));
+    this.writeFieldBeginInternal(
+      this.booleanField_.name,
+      this.booleanField_.fieldType,
+      this.booleanField_.fieldId,
+      value
+        ? TCompactProtocol.Types.CT_BOOLEAN_TRUE
+        : TCompactProtocol.Types.CT_BOOLEAN_FALSE,
+    );
     this.booleanField_.name = null;
   } else {
     // we're not part of a field, so just write the value
-    this.writeByte((value ? TCompactProtocol.Types.CT_BOOLEAN_TRUE
-                            : TCompactProtocol.Types.CT_BOOLEAN_FALSE));
+    this.writeByte(
+      value
+        ? TCompactProtocol.Types.CT_BOOLEAN_TRUE
+        : TCompactProtocol.Types.CT_BOOLEAN_FALSE,
+    );
   }
 };
 
-TCompactProtocol.prototype.writeByte = function(b) {
+TCompactProtocol.prototype.writeByte = function (b) {
   this.trans.write(new Buffer([b]));
 };
 
-TCompactProtocol.prototype.writeI16 = function(i16) {
+TCompactProtocol.prototype.writeI16 = function (i16) {
   this.writeVarint32(this.i32ToZigzag(i16));
 };
 
-TCompactProtocol.prototype.writeI32 = function(i32) {
+TCompactProtocol.prototype.writeI32 = function (i32) {
   this.writeVarint32(this.i32ToZigzag(i32));
 };
 
-TCompactProtocol.prototype.writeI64 = function(i64) {
+TCompactProtocol.prototype.writeI64 = function (i64) {
   this.writeVarint64(this.i64ToZigzag(i64));
 };
 
 // Little-endian, unlike TBinaryProtocol
-TCompactProtocol.prototype.writeDouble = function(v) {
+TCompactProtocol.prototype.writeDouble = function (v) {
   var buff = new Buffer(8);
   var m, e, c;
 
-  buff[7] = (v < 0 ? 0x80 : 0x00);
+  buff[7] = v < 0 ? 0x80 : 0x00;
 
   v = Math.abs(v);
   if (v !== v) {
@@ -388,22 +394,17 @@
       c *= 2;
     }
 
-    if (e + 1023 >= 2047)
-    {
+    if (e + 1023 >= 2047) {
       // Overflow
       m = 0;
       e = 2047;
-    }
-    else if (e + 1023 >= 1)
-    {
+    } else if (e + 1023 >= 1) {
       // Normalized - term order matters, as Math.pow(2, 52-e) and v*Math.pow(2, 52) can overflow
-      m = (v*c-1) * POW_52;
+      m = (v * c - 1) * POW_52;
       e += 1023;
-    }
-    else
-    {
+    } else {
       // Denormalized - also catches the '0' case, somewhat by chance
-      m = (v * POW_1022) * POW_52;
+      m = v * POW_1022 * POW_52;
       e = 0;
     }
   }
@@ -428,45 +429,53 @@
   this.trans.write(buff);
 };
 
-TCompactProtocol.prototype.writeStringOrBinary = function(name, encoding, arg) {
-  if (typeof arg === 'string') {
-    this.writeVarint32(Buffer.byteLength(arg, encoding)) ;
+TCompactProtocol.prototype.writeStringOrBinary = function (
+  name,
+  encoding,
+  arg,
+) {
+  if (typeof arg === "string") {
+    this.writeVarint32(Buffer.byteLength(arg, encoding));
     this.trans.write(new Buffer(arg, encoding));
-  } else if (arg instanceof Buffer ||
-             Object.prototype.toString.call(arg) == '[object Uint8Array]') {
+  } else if (
+    arg instanceof Buffer ||
+    Object.prototype.toString.call(arg) == "[object Uint8Array]"
+  ) {
     // Buffers in Node.js under Browserify may extend UInt8Array instead of
     // defining a new object. We detect them here so we can write them
     // correctly
     this.writeVarint32(arg.length);
     this.trans.write(arg);
   } else {
-    throw new Error(name + ' called without a string/Buffer argument: ' + arg);
+    throw new Error(name + " called without a string/Buffer argument: " + arg);
   }
 };
 
-TCompactProtocol.prototype.writeString = function(arg) {
-  this.writeStringOrBinary('writeString', 'utf8', arg);
+TCompactProtocol.prototype.writeString = function (arg) {
+  this.writeStringOrBinary("writeString", "utf8", arg);
 };
 
-TCompactProtocol.prototype.writeBinary = function(arg) {
-  this.writeStringOrBinary('writeBinary', 'binary', arg);
+TCompactProtocol.prototype.writeBinary = function (arg) {
+  this.writeStringOrBinary("writeBinary", "binary", arg);
 };
 
-
 //
 // Compact Protocol internal write methods
 //
 
-TCompactProtocol.prototype.writeFieldBeginInternal = function(name,
-                                                              fieldType,
-                                                              fieldId,
-                                                              typeOverride) {
+TCompactProtocol.prototype.writeFieldBeginInternal = function (
+  name,
+  fieldType,
+  fieldId,
+  typeOverride,
+) {
   //If there's a type override, use that.
-  var typeToWrite = (typeOverride == -1 ? this.getCompactType(fieldType) : typeOverride);
+  var typeToWrite =
+    typeOverride == -1 ? this.getCompactType(fieldType) : typeOverride;
   //Check if we can delta encode the field id
   if (fieldId > this.lastFieldId_ && fieldId - this.lastFieldId_ <= 15) {
     //Include the type delta with the field ID
-    this.writeByte((fieldId - this.lastFieldId_) << 4 | typeToWrite);
+    this.writeByte(((fieldId - this.lastFieldId_) << 4) | typeToWrite);
   } else {
     //Write separate type and ID values
     this.writeByte(typeToWrite);
@@ -475,10 +484,10 @@
   this.lastFieldId_ = fieldId;
 };
 
-TCompactProtocol.prototype.writeCollectionBegin = function(elemType, size) {
+TCompactProtocol.prototype.writeCollectionBegin = function (elemType, size) {
   if (size <= 14) {
     //Combine size and type in one byte if possible
-    this.writeByte(size << 4 | this.getCompactType(elemType));
+    this.writeByte((size << 4) | this.getCompactType(elemType));
   } else {
     this.writeByte(0xf0 | this.getCompactType(elemType));
     this.writeVarint32(size);
@@ -488,20 +497,20 @@
 /**
  * Write an i32 as a varint. Results in 1-5 bytes on the wire.
  */
-TCompactProtocol.prototype.writeVarint32 = function(n) {
+TCompactProtocol.prototype.writeVarint32 = function (n) {
   var buf = new Buffer(5);
   var wsize = 0;
   while (true) {
-    if ((n & ~0x7F) === 0) {
+    if ((n & ~0x7f) === 0) {
       buf[wsize++] = n;
       break;
     } else {
-      buf[wsize++] = ((n & 0x7F) | 0x80);
+      buf[wsize++] = (n & 0x7f) | 0x80;
       n = n >>> 7;
     }
   }
   var wbuf = new Buffer(wsize);
-  buf.copy(wbuf,0,0,wsize);
+  buf.copy(wbuf, 0, 0, wsize);
   this.trans.write(wbuf);
 };
 
@@ -509,12 +518,15 @@
  * Write an i64 as a varint. Results in 1-10 bytes on the wire.
  * N.B. node-int64 is always big endian
  */
-TCompactProtocol.prototype.writeVarint64 = function(n) {
-  if (typeof n === "number"){
+TCompactProtocol.prototype.writeVarint64 = function (n) {
+  if (typeof n === "number") {
     n = new Int64(n);
   }
-  if (! (n instanceof Int64)) {
-    throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.INVALID_DATA, "Expected Int64 or Number, found: " + n);
+  if (!(n instanceof Int64)) {
+    throw new Thrift.TProtocolException(
+      Thrift.TProtocolExceptionType.INVALID_DATA,
+      "Expected Int64 or Number, found: " + n,
+    );
   }
 
   var buf = new Buffer(10);
@@ -523,11 +535,11 @@
   var lo = n.buffer.readUInt32BE(4, true);
   var mask = 0;
   while (true) {
-    if (((lo & ~0x7F) === 0) && (hi === 0)) {
+    if ((lo & ~0x7f) === 0 && hi === 0) {
       buf[wsize++] = lo;
       break;
     } else {
-      buf[wsize++] = ((lo & 0x7F) | 0x80);
+      buf[wsize++] = (lo & 0x7f) | 0x80;
       mask = hi << 25;
       lo = lo >>> 7;
       hi = hi >>> 7;
@@ -535,7 +547,7 @@
     }
   }
   var wbuf = new Buffer(wsize);
-  buf.copy(wbuf,0,0,wsize);
+  buf.copy(wbuf, 0, 0, wsize);
   this.trans.write(wbuf);
 };
 
@@ -543,20 +555,23 @@
  * Convert l into a zigzag long. This allows negative numbers to be
  * represented compactly as a varint.
  */
-TCompactProtocol.prototype.i64ToZigzag = function(l) {
-  if (typeof l === 'string') {
+TCompactProtocol.prototype.i64ToZigzag = function (l) {
+  if (typeof l === "string") {
     l = new Int64(parseInt(l, 10));
-  } else if (typeof l === 'number') {
+  } else if (typeof l === "number") {
     l = new Int64(l);
   }
-  if (! (l instanceof Int64)) {
-    throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.INVALID_DATA, "Expected Int64 or Number, found: " + l);
+  if (!(l instanceof Int64)) {
+    throw new Thrift.TProtocolException(
+      Thrift.TProtocolExceptionType.INVALID_DATA,
+      "Expected Int64 or Number, found: " + l,
+    );
   }
   var hi = l.buffer.readUInt32BE(0, true);
   var lo = l.buffer.readUInt32BE(4, true);
   var sign = hi >>> 31;
-  hi = ((hi << 1) | (lo >>> 31)) ^ ((!!sign) ? 0xFFFFFFFF : 0);
-  lo = (lo << 1) ^ ((!!sign) ? 0xFFFFFFFF : 0);
+  hi = ((hi << 1) | (lo >>> 31)) ^ (!!sign ? 0xffffffff : 0);
+  lo = (lo << 1) ^ (!!sign ? 0xffffffff : 0);
   return new Int64(hi, lo);
 };
 
@@ -564,29 +579,36 @@
  * Convert n into a zigzag int. This allows negative numbers to be
  * represented compactly as a varint.
  */
-TCompactProtocol.prototype.i32ToZigzag = function(n) {
-  return (n << 1) ^ ((n & 0x80000000) ? 0xFFFFFFFF : 0);
+TCompactProtocol.prototype.i32ToZigzag = function (n) {
+  return (n << 1) ^ (n & 0x80000000 ? 0xffffffff : 0);
 };
 
-
 //
 // Compact Protocol read operations
 //
 
-TCompactProtocol.prototype.readMessageBegin = function() {
+TCompactProtocol.prototype.readMessageBegin = function () {
   //Read protocol ID
   var protocolId = this.trans.readByte();
   if (protocolId != TCompactProtocol.PROTOCOL_ID) {
-    throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.BAD_VERSION, "Bad protocol identifier " + protocolId);
+    throw new Thrift.TProtocolException(
+      Thrift.TProtocolExceptionType.BAD_VERSION,
+      "Bad protocol identifier " + protocolId,
+    );
   }
 
   //Read Version and Type
   var versionAndType = this.trans.readByte();
-  var version = (versionAndType & TCompactProtocol.VERSION_MASK);
+  var version = versionAndType & TCompactProtocol.VERSION_MASK;
   if (version != TCompactProtocol.VERSION_N) {
-    throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.BAD_VERSION, "Bad protocol version " + version);
+    throw new Thrift.TProtocolException(
+      Thrift.TProtocolExceptionType.BAD_VERSION,
+      "Bad protocol version " + version,
+    );
   }
-  var type = ((versionAndType >> TCompactProtocol.TYPE_SHIFT_AMOUNT) & TCompactProtocol.TYPE_BITS);
+  var type =
+    (versionAndType >> TCompactProtocol.TYPE_SHIFT_AMOUNT) &
+    TCompactProtocol.TYPE_BITS;
 
   //Read SeqId
   var seqid = this.readVarint32();
@@ -594,62 +616,65 @@
   //Read name
   var name = this.readString();
 
-  return {fname: name, mtype: type, rseqid: seqid};
+  return { fname: name, mtype: type, rseqid: seqid };
 };
 
-TCompactProtocol.prototype.readMessageEnd = function() {
-};
+TCompactProtocol.prototype.readMessageEnd = function () {};
 
-TCompactProtocol.prototype.readStructBegin = function() {
+TCompactProtocol.prototype.readStructBegin = function () {
   this.lastField_.push(this.lastFieldId_);
   this.lastFieldId_ = 0;
-  return {fname: ''};
+  return { fname: "" };
 };
 
-TCompactProtocol.prototype.readStructEnd = function() {
+TCompactProtocol.prototype.readStructEnd = function () {
   this.lastFieldId_ = this.lastField_.pop();
 };
 
-TCompactProtocol.prototype.readFieldBegin = function() {
+TCompactProtocol.prototype.readFieldBegin = function () {
   var fieldId = 0;
   var b = this.trans.readByte(b);
-  var type = (b & 0x0f);
+  var type = b & 0x0f;
 
   if (type == TCompactProtocol.Types.CT_STOP) {
-    return {fname: null, ftype: Thrift.Type.STOP, fid: 0};
+    return { fname: null, ftype: Thrift.Type.STOP, fid: 0 };
   }
 
   //Mask off the 4 MSB of the type header to check for field id delta.
-  var modifier = ((b & 0x000000f0) >>> 4);
+  var modifier = (b & 0x000000f0) >>> 4;
   if (modifier === 0) {
     //If not a delta read the field id.
     fieldId = this.readI16();
   } else {
     //Recover the field id from the delta
-    fieldId = (this.lastFieldId_ + modifier);
+    fieldId = this.lastFieldId_ + modifier;
   }
   var fieldType = this.getTType(type);
 
   //Boolean are encoded with the type
-  if (type == TCompactProtocol.Types.CT_BOOLEAN_TRUE ||
-      type == TCompactProtocol.Types.CT_BOOLEAN_FALSE) {
+  if (
+    type == TCompactProtocol.Types.CT_BOOLEAN_TRUE ||
+    type == TCompactProtocol.Types.CT_BOOLEAN_FALSE
+  ) {
     this.boolValue_.hasBoolValue = true;
     this.boolValue_.boolValue =
-      (type == TCompactProtocol.Types.CT_BOOLEAN_TRUE ? true : false);
+      type == TCompactProtocol.Types.CT_BOOLEAN_TRUE ? true : false;
   }
 
   //Save the new field for the next delta computation.
   this.lastFieldId_ = fieldId;
-  return {fname: null, ftype: fieldType, fid: fieldId};
+  return { fname: null, ftype: fieldType, fid: fieldId };
 };
 
-TCompactProtocol.prototype.readFieldEnd = function() {
-};
+TCompactProtocol.prototype.readFieldEnd = function () {};
 
-TCompactProtocol.prototype.readMapBegin = function() {
+TCompactProtocol.prototype.readMapBegin = function () {
   var msize = this.readVarint32();
   if (msize < 0) {
-    throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative map size");
+    throw new Thrift.TProtocolException(
+      Thrift.TProtocolExceptionType.NEGATIVE_SIZE,
+      "Negative map size",
+    );
   }
 
   var kvType = 0;
@@ -659,13 +684,12 @@
 
   var keyType = this.getTType((kvType & 0xf0) >>> 4);
   var valType = this.getTType(kvType & 0xf);
-  return {ktype: keyType, vtype: valType, size: msize};
+  return { ktype: keyType, vtype: valType, size: msize };
 };
 
-TCompactProtocol.prototype.readMapEnd = function() {
-};
+TCompactProtocol.prototype.readMapEnd = function () {};
 
-TCompactProtocol.prototype.readListBegin = function() {
+TCompactProtocol.prototype.readListBegin = function () {
   var size_and_type = this.trans.readByte();
 
   var lsize = (size_and_type >>> 4) & 0x0000000f;
@@ -674,25 +698,26 @@
   }
 
   if (lsize < 0) {
-    throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative list size");
+    throw new Thrift.TProtocolException(
+      Thrift.TProtocolExceptionType.NEGATIVE_SIZE,
+      "Negative list size",
+    );
   }
 
   var elemType = this.getTType(size_and_type & 0x0000000f);
 
-  return {etype: elemType, size: lsize};
+  return { etype: elemType, size: lsize };
 };
 
-TCompactProtocol.prototype.readListEnd = function() {
-};
+TCompactProtocol.prototype.readListEnd = function () {};
 
-TCompactProtocol.prototype.readSetBegin = function() {
+TCompactProtocol.prototype.readSetBegin = function () {
   return this.readListBegin();
 };
 
-TCompactProtocol.prototype.readSetEnd = function() {
-};
+TCompactProtocol.prototype.readSetEnd = function () {};
 
-TCompactProtocol.prototype.readBool = function() {
+TCompactProtocol.prototype.readBool = function () {
   var value = false;
   var rsize = 0;
   if (this.boolValue_.hasBoolValue === true) {
@@ -701,50 +726,50 @@
   } else {
     var res = this.trans.readByte();
     rsize = res.rsize;
-    value = (res.value == TCompactProtocol.Types.CT_BOOLEAN_TRUE);
+    value = res.value == TCompactProtocol.Types.CT_BOOLEAN_TRUE;
   }
   return value;
 };
 
-TCompactProtocol.prototype.readByte = function() {
+TCompactProtocol.prototype.readByte = function () {
   return this.trans.readByte();
 };
 
-TCompactProtocol.prototype.readI16 = function() {
+TCompactProtocol.prototype.readI16 = function () {
   return this.readI32();
 };
 
-TCompactProtocol.prototype.readI32 = function() {
+TCompactProtocol.prototype.readI32 = function () {
   return this.zigzagToI32(this.readVarint32());
 };
 
-TCompactProtocol.prototype.readI64 = function() {
+TCompactProtocol.prototype.readI64 = function () {
   return this.zigzagToI64(this.readVarint64());
 };
 
 // Little-endian, unlike TBinaryProtocol
-TCompactProtocol.prototype.readDouble = function() {
+TCompactProtocol.prototype.readDouble = function () {
   var buff = this.trans.read(8);
   var off = 0;
 
   var signed = buff[off + 7] & 0x80;
-  var e = (buff[off+6] & 0xF0) >> 4;
-  e += (buff[off+7] & 0x7F) << 4;
+  var e = (buff[off + 6] & 0xf0) >> 4;
+  e += (buff[off + 7] & 0x7f) << 4;
 
   var m = buff[off];
-  m += buff[off+1] << 8;
-  m += buff[off+2] << 16;
-  m += buff[off+3] * POW_24;
-  m += buff[off+4] * POW_32;
-  m += buff[off+5] * POW_40;
-  m += (buff[off+6] & 0x0F) * POW_48;
+  m += buff[off + 1] << 8;
+  m += buff[off + 2] << 16;
+  m += buff[off + 3] * POW_24;
+  m += buff[off + 4] * POW_32;
+  m += buff[off + 5] * POW_40;
+  m += (buff[off + 6] & 0x0f) * POW_48;
 
   switch (e) {
     case 0:
       e = -1022;
       break;
     case 2047:
-      return m ? NaN : (signed ? -Infinity : Infinity);
+      return m ? NaN : signed ? -Infinity : Infinity;
     default:
       m += POW_52;
       e -= 1023;
@@ -757,19 +782,22 @@
   return m * Math.pow(2, e - 52);
 };
 
-TCompactProtocol.prototype.readBinary = function() {
+TCompactProtocol.prototype.readBinary = function () {
   var size = this.readVarint32();
   if (size === 0) {
     return new Buffer(0);
   }
 
   if (size < 0) {
-    throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative binary size");
+    throw new Thrift.TProtocolException(
+      Thrift.TProtocolExceptionType.NEGATIVE_SIZE,
+      "Negative binary size",
+    );
   }
   return this.trans.read(size);
 };
 
-TCompactProtocol.prototype.readString = function() {
+TCompactProtocol.prototype.readString = function () {
   var size = this.readVarint32();
   // Catch empty string case
   if (size === 0) {
@@ -778,12 +806,14 @@
 
   // Catch error cases
   if (size < 0) {
-    throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.NEGATIVE_SIZE, "Negative string size");
+    throw new Thrift.TProtocolException(
+      Thrift.TProtocolExceptionType.NEGATIVE_SIZE,
+      "Negative string size",
+    );
   }
   return this.trans.readString(size);
 };
 
-
 //
 // Compact Protocol internal read operations
 //
@@ -792,7 +822,7 @@
  * Read an i32 from the wire as a varint. The MSB of each byte is set
  * if there is another byte to follow. This can read up to 5 bytes.
  */
-TCompactProtocol.prototype.readVarint32 = function() {
+TCompactProtocol.prototype.readVarint32 = function () {
   return this.readVarint64().toNumber();
 };
 
@@ -800,28 +830,31 @@
  * Read an i64 from the wire as a proper varint. The MSB of each byte is set
  * if there is another byte to follow. This can read up to 10 bytes.
  */
-TCompactProtocol.prototype.readVarint64 = function() {
+TCompactProtocol.prototype.readVarint64 = function () {
   var rsize = 0;
   var lo = 0;
   var hi = 0;
   var shift = 0;
   while (true) {
     var b = this.trans.readByte();
-    rsize ++;
+    rsize++;
     if (shift <= 25) {
       lo = lo | ((b & 0x7f) << shift);
     } else if (25 < shift && shift < 32) {
       lo = lo | ((b & 0x7f) << shift);
-      hi = hi | ((b & 0x7f) >>> (32-shift));
+      hi = hi | ((b & 0x7f) >>> (32 - shift));
     } else {
-      hi = hi | ((b & 0x7f) << (shift-32));
+      hi = hi | ((b & 0x7f) << (shift - 32));
     }
     shift += 7;
     if (!(b & 0x80)) {
       break;
     }
     if (rsize >= 10) {
-      throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.INVALID_DATA, "Variable-length int over 10 bytes.");
+      throw new Thrift.TProtocolException(
+        Thrift.TProtocolExceptionType.INVALID_DATA,
+        "Variable-length int over 10 bytes.",
+      );
     }
   }
   return new Int64(hi, lo);
@@ -830,14 +863,14 @@
 /**
  * Convert from zigzag int to int.
  */
-TCompactProtocol.prototype.zigzagToI32 = function(n) {
+TCompactProtocol.prototype.zigzagToI32 = function (n) {
   return (n >>> 1) ^ (-1 * (n & 1));
 };
 
 /**
  * Convert from zigzag long to long.
  */
-TCompactProtocol.prototype.zigzagToI64 = function(n) {
+TCompactProtocol.prototype.zigzagToI64 = function (n) {
   var hi = n.buffer.readUInt32BE(0, true);
   var lo = n.buffer.readUInt32BE(4, true);
 
@@ -846,13 +879,13 @@
   var hi_neg = neg.buffer.readUInt32BE(0, true);
   var lo_neg = neg.buffer.readUInt32BE(4, true);
 
-  var hi_lo = (hi << 31);
-  hi = (hi >>> 1) ^ (hi_neg);
-  lo = ((lo >>> 1) | hi_lo) ^ (lo_neg);
+  var hi_lo = hi << 31;
+  hi = (hi >>> 1) ^ hi_neg;
+  lo = ((lo >>> 1) | hi_lo) ^ lo_neg;
   return new Int64(hi, lo);
 };
 
-TCompactProtocol.prototype.skip = function(type) {
+TCompactProtocol.prototype.skip = function (type) {
   switch (type) {
     case Type.BOOL:
       this.readBool();
@@ -910,6 +943,6 @@
       this.readListEnd();
       break;
     default:
-      throw new  Error("Invalid type: " + type);
+      throw new Error("Invalid type: " + type);
   }
 };
diff --git a/lib/nodejs/lib/thrift/connection.js b/lib/nodejs/lib/thrift/connection.js
index b4e5a05..dcade80 100644
--- a/lib/nodejs/lib/thrift/connection.js
+++ b/lib/nodejs/lib/thrift/connection.js
@@ -16,29 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var util = require('util');
-var EventEmitter = require('events').EventEmitter;
-var constants = require('constants');
-var net = require('net');
-var tls = require('tls');
-var thrift = require('./thrift');
-var log = require('./log');
+var util = require("util");
+var EventEmitter = require("events").EventEmitter;
+var constants = require("constants");
+var net = require("net");
+var tls = require("tls");
+var thrift = require("./thrift");
+var log = require("./log");
 
-var TBufferedTransport = require('./buffered_transport');
-var TBinaryProtocol = require('./binary_protocol');
-var InputBufferUnderrunError = require('./input_buffer_underrun_error');
+var TBufferedTransport = require("./buffered_transport");
+var TBinaryProtocol = require("./binary_protocol");
+var InputBufferUnderrunError = require("./input_buffer_underrun_error");
 
-var createClient = require('./create_client');
+var createClient = require("./create_client");
 
-var binary = require('./binary');
+var binary = require("./binary");
 
-var Connection = exports.Connection = function(stream, options) {
+var Connection = (exports.Connection = function (stream, options) {
   var self = this;
   EventEmitter.call(this);
 
   this.seqId2Service = {};
   this.connection = stream;
-  this.ssl = (stream.encrypted);
+  this.ssl = stream.encrypted;
   this.options = options || {};
   this.transport = this.options.transport || TBufferedTransport;
   this.protocol = this.options.protocol || TBinaryProtocol;
@@ -48,123 +48,139 @@
   this.initialize_retry_vars();
 
   this._debug = this.options.debug || false;
-  if (this.options.max_attempts &&
-      !isNaN(this.options.max_attempts) &&
-      this.options.max_attempts > 0) {
-     this.max_attempts = +this.options.max_attempts;
+  if (
+    this.options.max_attempts &&
+    !isNaN(this.options.max_attempts) &&
+    this.options.max_attempts > 0
+  ) {
+    this.max_attempts = +this.options.max_attempts;
   }
   this.retry_max_delay = null;
-  if (this.options.retry_max_delay !== undefined &&
-      !isNaN(this.options.retry_max_delay) &&
-      this.options.retry_max_delay > 0) {
-     this.retry_max_delay = this.options.retry_max_delay;
+  if (
+    this.options.retry_max_delay !== undefined &&
+    !isNaN(this.options.retry_max_delay) &&
+    this.options.retry_max_delay > 0
+  ) {
+    this.retry_max_delay = this.options.retry_max_delay;
   }
   this.connect_timeout = false;
-  if (this.options.connect_timeout &&
-      !isNaN(this.options.connect_timeout) &&
-      this.options.connect_timeout > 0) {
-     this.connect_timeout = +this.options.connect_timeout;
+  if (
+    this.options.connect_timeout &&
+    !isNaN(this.options.connect_timeout) &&
+    this.options.connect_timeout > 0
+  ) {
+    this.connect_timeout = +this.options.connect_timeout;
   }
 
-  this.connection.addListener(this.ssl ? "secureConnect" : "connect", function() {
-    self.connected = true;
+  this.connection.addListener(
+    this.ssl ? "secureConnect" : "connect",
+    function () {
+      self.connected = true;
 
-    this.setTimeout(self.options.timeout || 0);
-    this.setNoDelay();
-    this.frameLeft = 0;
-    this.framePos = 0;
-    this.frame = null;
-    self.initialize_retry_vars();
-    self.flush_offline_queue();
+      this.setTimeout(self.options.timeout || 0);
+      this.setNoDelay();
+      this.frameLeft = 0;
+      this.framePos = 0;
+      this.frame = null;
+      self.initialize_retry_vars();
+      self.flush_offline_queue();
 
-    self.emit("connect");
-  });
+      self.emit("connect");
+    },
+  );
 
-  this.connection.addListener("error", function(err) {
+  this.connection.addListener("error", function (err) {
     // Only emit the error if no-one else is listening on the connection
     // or if someone is listening on us, because Node turns unhandled
     // 'error' events into exceptions.
-    if (self.connection.listeners('error').length === 1 ||
-        self.listeners('error').length > 0) {
+    if (
+      self.connection.listeners("error").length === 1 ||
+      self.listeners("error").length > 0
+    ) {
       self.emit("error", err);
     }
   });
 
   // Add a close listener
-  this.connection.addListener("close", function() {
+  this.connection.addListener("close", function () {
     self.connection_gone(); // handle close event. try to reconnect
   });
 
-  this.connection.addListener("timeout", function() {
+  this.connection.addListener("timeout", function () {
     self.emit("timeout");
   });
 
-  this.connection.addListener("data", self.transport.receiver(function(transport_with_data) {
-    var message = new self.protocol(transport_with_data);
-    try {
-      while (true) {
-        var header = message.readMessageBegin();
-        var dummy_seqid = header.rseqid * -1;
-        var client = self.client;
-        //The Multiplexed Protocol stores a hash of seqid to service names
-        //  in seqId2Service. If the SeqId is found in the hash we need to
-        //  lookup the appropriate client for this call.
-        //  The connection.client object is a single client object when not
-        //  multiplexing, when using multiplexing it is a service name keyed
-        //  hash of client objects.
-        //NOTE: The 2 way interdependencies between protocols, transports,
-        //  connections and clients in the Node.js implementation are irregular
-        //  and make the implementation difficult to extend and maintain. We
-        //  should bring this stuff inline with typical thrift I/O stack
-        //  operation soon.
-        //  --ra
-        var service_name = self.seqId2Service[header.rseqid];
-        if (service_name) {
-          client = self.client[service_name];
-        }
-        /*jshint -W083 */
-        client._reqs[dummy_seqid] = function(err, success){
-          transport_with_data.commitPosition();
-
-          var callback = client._reqs[header.rseqid];
-          delete client._reqs[header.rseqid];
+  this.connection.addListener(
+    "data",
+    self.transport.receiver(function (transport_with_data) {
+      var message = new self.protocol(transport_with_data);
+      try {
+        while (true) {
+          var header = message.readMessageBegin();
+          var dummy_seqid = header.rseqid * -1;
+          var client = self.client;
+          //The Multiplexed Protocol stores a hash of seqid to service names
+          //  in seqId2Service. If the SeqId is found in the hash we need to
+          //  lookup the appropriate client for this call.
+          //  The connection.client object is a single client object when not
+          //  multiplexing, when using multiplexing it is a service name keyed
+          //  hash of client objects.
+          //NOTE: The 2 way interdependencies between protocols, transports,
+          //  connections and clients in the Node.js implementation are irregular
+          //  and make the implementation difficult to extend and maintain. We
+          //  should bring this stuff inline with typical thrift I/O stack
+          //  operation soon.
+          //  --ra
+          var service_name = self.seqId2Service[header.rseqid];
           if (service_name) {
-            delete self.seqId2Service[header.rseqid];
+            client = self.client[service_name];
           }
-          if (callback) {
-            callback(err, success);
-          }
-        };
-        /*jshint +W083 */
+          /*jshint -W083 */
+          client._reqs[dummy_seqid] = function (err, success) {
+            transport_with_data.commitPosition();
 
-        if(client['recv_' + header.fname]) {
-          client['recv_' + header.fname](message, header.mtype, dummy_seqid);
+            var callback = client._reqs[header.rseqid];
+            delete client._reqs[header.rseqid];
+            if (service_name) {
+              delete self.seqId2Service[header.rseqid];
+            }
+            if (callback) {
+              callback(err, success);
+            }
+          };
+          /*jshint +W083 */
+
+          if (client["recv_" + header.fname]) {
+            client["recv_" + header.fname](message, header.mtype, dummy_seqid);
+          } else {
+            delete client._reqs[dummy_seqid];
+            self.emit(
+              "error",
+              new thrift.TApplicationException(
+                thrift.TApplicationExceptionType.WRONG_METHOD_NAME,
+                "Received a response to an unknown RPC function",
+              ),
+            );
+          }
+        }
+      } catch (e) {
+        if (e instanceof InputBufferUnderrunError) {
+          transport_with_data.rollbackPosition();
         } else {
-          delete client._reqs[dummy_seqid];
-          self.emit("error",
-                    new thrift.TApplicationException(thrift.TApplicationExceptionType.WRONG_METHOD_NAME,
-                             "Received a response to an unknown RPC function"));
+          self.emit("error", e);
         }
       }
-    }
-    catch (e) {
-      if (e instanceof InputBufferUnderrunError) {
-        transport_with_data.rollbackPosition();
-      }
-      else {
-        self.emit('error', e);
-      }
-    }
-  }));
-};
+    }),
+  );
+});
 util.inherits(Connection, EventEmitter);
 
-Connection.prototype.end = function() {
+Connection.prototype.end = function () {
   this.forceClose = true;
   this.connection.end();
 };
 
-Connection.prototype.destroy = function() {
+Connection.prototype.destroy = function () {
   this.connection.destroy();
 };
 
@@ -183,12 +199,12 @@
   // Reset offline queue
   this.offline_queue = [];
   // Attempt to write queued items
-  offline_queue.forEach(function(data) {
+  offline_queue.forEach(function (data) {
     self.write(data);
   });
 };
 
-Connection.prototype.write = function(data) {
+Connection.prototype.write = function (data) {
   if (!this.connected) {
     this.offline_queue.push(data);
     return;
@@ -201,7 +217,7 @@
   this.connected = false;
 
   // If closed by manual, emit close event and cancel reconnect process
-  if(this.forceClose) {
+  if (this.forceClose) {
     if (this.retry_timer) {
       clearTimeout(this.retry_timer);
       this.retry_timer = null;
@@ -220,7 +236,10 @@
     return;
   }
 
-  if (this.retry_max_delay !== null && this.retry_delay >= this.retry_max_delay) {
+  if (
+    this.retry_max_delay !== null &&
+    this.retry_delay >= this.retry_max_delay
+  ) {
     this.retry_delay = this.retry_max_delay;
   } else {
     this.retry_delay = Math.floor(this.retry_delay * this.retry_backoff);
@@ -230,7 +249,11 @@
 
   if (this.max_attempts && this.attempts >= this.max_attempts) {
     this.retry_timer = null;
-    console.error("thrift: Couldn't get thrift connection after " + this.max_attempts + " attempts.");
+    console.error(
+      "thrift: Couldn't get thrift connection after " +
+        this.max_attempts +
+        " attempts.",
+    );
     self.emit("close");
     return;
   }
@@ -238,7 +261,7 @@
   this.attempts += 1;
   this.emit("reconnecting", {
     delay: self.retry_delay,
-    attempt: self.attempts
+    attempt: self.attempts,
   });
 
   this.retry_timer = setTimeout(function () {
@@ -247,10 +270,14 @@
     self.retry_totaltime += self.retry_delay;
 
     if (self.connect_timeout && self.retry_totaltime >= self.connect_timeout) {
-       self.retry_timer = null;
-       console.error("thrift: Couldn't get thrift connection after " + self.retry_totaltime + "ms.");
-       self.emit("close");
-       return;
+      self.retry_timer = null;
+      console.error(
+        "thrift: Couldn't get thrift connection after " +
+          self.retry_totaltime +
+          "ms.",
+      );
+      self.emit("close");
+      return;
     }
 
     if (self.path !== undefined) {
@@ -262,11 +289,11 @@
   }, this.retry_delay);
 };
 
-exports.createConnection = function(host, port, options) {
-  var stream = net.createConnection( {
+exports.createConnection = function (host, port, options) {
+  var stream = net.createConnection({
     port: port,
     host: host,
-    timeout: options.connect_timeout || options.timeout || 0
+    timeout: options.connect_timeout || options.timeout || 0,
   });
   var connection = new Connection(stream, options);
   connection.host = host;
@@ -275,7 +302,7 @@
   return connection;
 };
 
-exports.createUDSConnection = function(path, options) {
+exports.createUDSConnection = function (path, options) {
   var stream = net.createConnection(path);
   var connection = new Connection(stream, options);
   connection.path = path;
@@ -283,10 +310,11 @@
   return connection;
 };
 
-exports.createSSLConnection = function(host, port, options) {
-  if (!('secureProtocol' in options) && !('secureOptions' in options)) {
+exports.createSSLConnection = function (host, port, options) {
+  if (!("secureProtocol" in options) && !("secureOptions" in options)) {
     options.secureProtocol = "SSLv23_method";
-    options.secureOptions = constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3;
+    options.secureOptions =
+      constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3;
   }
 
   var stream = tls.connect(port, host, options);
@@ -297,15 +325,14 @@
   return connection;
 };
 
-
 exports.createClient = createClient;
 
-var child_process = require('child_process');
-var StdIOConnection = exports.StdIOConnection = function(command, options) {
-  var command_parts = command.split(' ');
+var child_process = require("child_process");
+var StdIOConnection = (exports.StdIOConnection = function (command, options) {
+  var command_parts = command.split(" ");
   command = command_parts[0];
-  var args = command_parts.splice(1,command_parts.length -1);
-  var child = this.child = child_process.spawn(command,args);
+  var args = command_parts.splice(1, command_parts.length - 1);
+  var child = (this.child = child_process.spawn(command, args));
 
   var self = this;
   EventEmitter.call(this);
@@ -316,13 +343,13 @@
   this.protocol = this.options.protocol || TBinaryProtocol;
   this.offline_queue = [];
 
-  if (log.getLogLevel() === 'debug') {
-    this.child.stderr.on('data', function (err) {
-      log.debug(err.toString(), 'CHILD ERROR');
+  if (log.getLogLevel() === "debug") {
+    this.child.stderr.on("data", function (err) {
+      log.debug(err.toString(), "CHILD ERROR");
     });
 
-    this.child.on('exit', function (code,signal) {
-      log.debug(code + ':' + signal, 'CHILD EXITED');
+    this.child.on("exit", function (code, signal) {
+      log.debug(code + ":" + signal, "CHILD EXITED");
     });
   }
 
@@ -333,46 +360,47 @@
 
   self.flush_offline_queue();
 
-  this.connection.addListener("error", function(err) {
+  this.connection.addListener("error", function (err) {
     self.emit("error", err);
   });
 
   // Add a close listener
-  this.connection.addListener("close", function() {
+  this.connection.addListener("close", function () {
     self.emit("close");
   });
 
-  child.stdout.addListener("data", self.transport.receiver(function(transport_with_data) {
-    var message = new self.protocol(transport_with_data);
-    try {
-      var header = message.readMessageBegin();
-      var dummy_seqid = header.rseqid * -1;
-      var client = self.client;
-      client._reqs[dummy_seqid] = function(err, success){
-        transport_with_data.commitPosition();
+  child.stdout.addListener(
+    "data",
+    self.transport.receiver(function (transport_with_data) {
+      var message = new self.protocol(transport_with_data);
+      try {
+        var header = message.readMessageBegin();
+        var dummy_seqid = header.rseqid * -1;
+        var client = self.client;
+        client._reqs[dummy_seqid] = function (err, success) {
+          transport_with_data.commitPosition();
 
-        var callback = client._reqs[header.rseqid];
-        delete client._reqs[header.rseqid];
-        if (callback) {
-          callback(err, success);
+          var callback = client._reqs[header.rseqid];
+          delete client._reqs[header.rseqid];
+          if (callback) {
+            callback(err, success);
+          }
+        };
+        client["recv_" + header.fname](message, header.mtype, dummy_seqid);
+      } catch (e) {
+        if (e instanceof InputBufferUnderrunError) {
+          transport_with_data.rollbackPosition();
+        } else {
+          throw e;
         }
-      };
-      client['recv_' + header.fname](message, header.mtype, dummy_seqid);
-    }
-    catch (e) {
-      if (e instanceof InputBufferUnderrunError) {
-        transport_with_data.rollbackPosition();
       }
-      else {
-        throw e;
-      }
-    }
-  }));
-};
+    }),
+  );
+});
 
 util.inherits(StdIOConnection, EventEmitter);
 
-StdIOConnection.prototype.end = function() {
+StdIOConnection.prototype.end = function () {
   this.connection.end();
 };
 
@@ -383,12 +411,12 @@
   // Reset offline queue
   this.offline_queue = [];
   // Attempt to write queued items
-  offline_queue.forEach(function(data) {
+  offline_queue.forEach(function (data) {
     self.write(data);
   });
 };
 
-StdIOConnection.prototype.write = function(data) {
+StdIOConnection.prototype.write = function (data) {
   if (!this.connected) {
     this.offline_queue.push(data);
     return;
@@ -396,8 +424,8 @@
   this.connection.write(data);
 };
 
-exports.createStdIOConnection = function(command,options){
-  return new StdIOConnection(command,options);
+exports.createStdIOConnection = function (command, options) {
+  return new StdIOConnection(command, options);
 };
 
 exports.createStdIOClient = createClient;
diff --git a/lib/nodejs/lib/thrift/create_client.js b/lib/nodejs/lib/thrift/create_client.js
index d6b77a8..b9021bd 100644
--- a/lib/nodejs/lib/thrift/create_client.js
+++ b/lib/nodejs/lib/thrift/create_client.js
@@ -43,7 +43,7 @@
   //   - Callback to call on flush
 
   // Wrap the write method
-  var writeCb = function(buf, seqid) {
+  var writeCb = function (buf, seqid) {
     connection.write(buf, seqid);
   };
   var transport = new connection.transport(undefined, writeCb);
@@ -51,4 +51,4 @@
   transport.client = client;
   connection.client = client;
   return client;
-};
+}
diff --git a/lib/nodejs/lib/thrift/framed_transport.js b/lib/nodejs/lib/thrift/framed_transport.js
index 058d230..7ede222 100644
--- a/lib/nodejs/lib/thrift/framed_transport.js
+++ b/lib/nodejs/lib/thrift/framed_transport.js
@@ -17,9 +17,9 @@
  * under the License.
  */
 
-var binary = require('./binary');
-var InputBufferUnderrunError = require('./input_buffer_underrun_error');
-var THeaderTransport = require('./header_transport');
+var binary = require("./binary");
+var InputBufferUnderrunError = require("./input_buffer_underrun_error");
+var THeaderTransport = require("./header_transport");
 
 module.exports = TFramedTransport;
 
@@ -30,14 +30,14 @@
   this.outCount = 0;
   this.readPos = 0;
   this.onFlush = callback;
-};
+}
 
 Object.setPrototypeOf(TFramedTransport.prototype, THeaderTransport.prototype);
 
-TFramedTransport.receiver = function(callback, seqid) {
+TFramedTransport.receiver = function (callback, seqid) {
   var residual = new Buffer(0);
 
-  return function(data) {
+  return function (data) {
     residual = Buffer.concat([residual, Buffer.from(data)]);
 
     while (residual.length > 0) {
@@ -61,34 +61,34 @@
   };
 };
 
-TFramedTransport.prototype.commitPosition = function(){},
-TFramedTransport.prototype.rollbackPosition = function(){},
-
+(TFramedTransport.prototype.commitPosition = function () {}),
+  (TFramedTransport.prototype.rollbackPosition = function () {}),
   // TODO: Implement open/close support
-TFramedTransport.prototype.isOpen = function() {
-  return true;
-};
-TFramedTransport.prototype.open = function() {};
-TFramedTransport.prototype.close =  function() {};
+  (TFramedTransport.prototype.isOpen = function () {
+    return true;
+  });
+TFramedTransport.prototype.open = function () {};
+TFramedTransport.prototype.close = function () {};
 
-  // Set the seqid of the message in the client
-  // So that callbacks can be found
-TFramedTransport.prototype.setCurrSeqId = function(seqid) {
+// Set the seqid of the message in the client
+// So that callbacks can be found
+TFramedTransport.prototype.setCurrSeqId = function (seqid) {
   this._seqid = seqid;
 };
 
-TFramedTransport.prototype.ensureAvailable = function(len) {
+TFramedTransport.prototype.ensureAvailable = function (len) {
   if (this.readPos + len > this.inBuf.length) {
     throw new InputBufferUnderrunError();
   }
 };
 
-TFramedTransport.prototype.read = function(len) { // this function will be used for each frames.
+TFramedTransport.prototype.read = function (len) {
+  // this function will be used for each frames.
   this.ensureAvailable(len);
   var end = this.readPos + len;
 
   if (this.inBuf.length < end) {
-    throw new Error('read(' + len + ') failed - not enough data');
+    throw new Error("read(" + len + ") failed - not enough data");
   }
 
   var buf = this.inBuf.slice(this.readPos, end);
@@ -96,68 +96,68 @@
   return buf;
 };
 
-TFramedTransport.prototype.readByte = function() {
+TFramedTransport.prototype.readByte = function () {
   this.ensureAvailable(1);
   return binary.readByte(this.inBuf[this.readPos++]);
 };
 
-TFramedTransport.prototype.readI16 = function() {
+TFramedTransport.prototype.readI16 = function () {
   this.ensureAvailable(2);
   var i16 = binary.readI16(this.inBuf, this.readPos);
   this.readPos += 2;
   return i16;
 };
 
-TFramedTransport.prototype.readI32 = function() {
+TFramedTransport.prototype.readI32 = function () {
   this.ensureAvailable(4);
   var i32 = binary.readI32(this.inBuf, this.readPos);
   this.readPos += 4;
   return i32;
 };
 
-TFramedTransport.prototype.readDouble = function() {
+TFramedTransport.prototype.readDouble = function () {
   this.ensureAvailable(8);
   var d = binary.readDouble(this.inBuf, this.readPos);
   this.readPos += 8;
   return d;
 };
 
-TFramedTransport.prototype.readString = function(len) {
+TFramedTransport.prototype.readString = function (len) {
   this.ensureAvailable(len);
-  var str = this.inBuf.toString('utf8', this.readPos, this.readPos + len);
+  var str = this.inBuf.toString("utf8", this.readPos, this.readPos + len);
   this.readPos += len;
   return str;
 };
 
-TFramedTransport.prototype.borrow = function() {
+TFramedTransport.prototype.borrow = function () {
   return {
     buf: this.inBuf,
     readIndex: this.readPos,
-    writeIndex: this.inBuf.length
+    writeIndex: this.inBuf.length,
   };
 };
 
-TFramedTransport.prototype.consume = function(bytesConsumed) {
+TFramedTransport.prototype.consume = function (bytesConsumed) {
   this.readPos += bytesConsumed;
 };
 
-TFramedTransport.prototype.write = function(buf, encoding) {
-  if (typeof(buf) === "string") {
-    buf = new Buffer(buf, encoding || 'utf8');
+TFramedTransport.prototype.write = function (buf, encoding) {
+  if (typeof buf === "string") {
+    buf = new Buffer(buf, encoding || "utf8");
   }
   this.outBuffers.push(buf);
   this.outCount += buf.length;
 };
 
-TFramedTransport.prototype.flush = function() {
+TFramedTransport.prototype.flush = function () {
   // If the seqid of the callback is available pass it to the onFlush
   // Then remove the current seqid
   var seqid = this._seqid;
   this._seqid = null;
 
   var out = new Buffer(this.outCount),
-      pos = 0;
-  this.outBuffers.forEach(function(buf) {
+    pos = 0;
+  this.outBuffers.forEach(function (buf) {
     buf.copy(out, pos, 0);
     pos += buf.length;
   });
diff --git a/lib/nodejs/lib/thrift/header_protocol.js b/lib/nodejs/lib/thrift/header_protocol.js
index 8971751..2a48a4d 100644
--- a/lib/nodejs/lib/thrift/header_protocol.js
+++ b/lib/nodejs/lib/thrift/header_protocol.js
@@ -16,10 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var util = require('util');
-var TBinaryProtocol = require('./binary_protocol');
-var TCompactProtocol = require('./compact_protocol');
-var THeaderTransport = require('./header_transport');
+var util = require("util");
+var TBinaryProtocol = require("./binary_protocol");
+var TCompactProtocol = require("./compact_protocol");
+var THeaderTransport = require("./header_transport");
 
 var ProtocolMap = {};
 ProtocolMap[THeaderTransport.SubprotocolId.BINARY] = TBinaryProtocol;
@@ -54,204 +54,206 @@
 function THeaderProtocol(trans) {
   if (!(trans instanceof THeaderTransport)) {
     throw new THeaderProtocolError(
-      'Only transports that inherit THeaderTransport can be' +
-      ' used with THeaderProtocol'
+      "Only transports that inherit THeaderTransport can be" +
+        " used with THeaderProtocol",
     );
   }
   this.trans = trans;
   this.setProtocol();
-};
+}
 
-THeaderProtocol.prototype.flush = function() {
-   // Headers must be written prior to flushing because because
-   // you need to calculate the length of the payload for the length
-   // field of the header
+THeaderProtocol.prototype.flush = function () {
+  // Headers must be written prior to flushing because because
+  // you need to calculate the length of the payload for the length
+  // field of the header
   this.trans.writeHeaders();
   return this.trans.flush();
 };
 
-THeaderProtocol.prototype.writeMessageBegin = function(name, type, seqid) {
+THeaderProtocol.prototype.writeMessageBegin = function (name, type, seqid) {
   return this.protocol.writeMessageBegin(name, type, seqid);
 };
 
-THeaderProtocol.prototype.writeMessageEnd = function() {
+THeaderProtocol.prototype.writeMessageEnd = function () {
   return this.protocol.writeMessageEnd();
 };
 
-THeaderProtocol.prototype.writeStructBegin = function(name) {
+THeaderProtocol.prototype.writeStructBegin = function (name) {
   return this.protocol.writeStructBegin(name);
 };
 
-THeaderProtocol.prototype.writeStructEnd = function() {
+THeaderProtocol.prototype.writeStructEnd = function () {
   return this.protocol.writeStructEnd();
 };
 
-THeaderProtocol.prototype.writeFieldBegin = function(name, type, id) {
+THeaderProtocol.prototype.writeFieldBegin = function (name, type, id) {
   return this.protocol.writeFieldBegin(name, type, id);
-}
+};
 
-THeaderProtocol.prototype.writeFieldEnd = function() {
+THeaderProtocol.prototype.writeFieldEnd = function () {
   return this.protocol.writeFieldEnd();
 };
 
-THeaderProtocol.prototype.writeFieldStop = function() {
+THeaderProtocol.prototype.writeFieldStop = function () {
   return this.protocol.writeFieldStop();
 };
 
-THeaderProtocol.prototype.writeMapBegin = function(ktype, vtype, size) {
+THeaderProtocol.prototype.writeMapBegin = function (ktype, vtype, size) {
   return this.protocol.writeMapBegin(ktype, vtype, size);
 };
 
-THeaderProtocol.prototype.writeMapEnd = function() {
+THeaderProtocol.prototype.writeMapEnd = function () {
   return this.protocol.writeMapEnd();
 };
 
-THeaderProtocol.prototype.writeListBegin = function(etype, size) {
+THeaderProtocol.prototype.writeListBegin = function (etype, size) {
   return this.protocol.writeListBegin(etype, size);
 };
 
-THeaderProtocol.prototype.writeListEnd = function() {
+THeaderProtocol.prototype.writeListEnd = function () {
   return this.protocol.writeListEnd();
 };
 
-THeaderProtocol.prototype.writeSetBegin = function(etype, size) {
+THeaderProtocol.prototype.writeSetBegin = function (etype, size) {
   return this.protocol.writeSetBegin(etype, size);
 };
 
-THeaderProtocol.prototype.writeSetEnd = function() {
+THeaderProtocol.prototype.writeSetEnd = function () {
   return this.protocol.writeSetEnd();
 };
 
-THeaderProtocol.prototype.writeBool = function(b) {
+THeaderProtocol.prototype.writeBool = function (b) {
   return this.protocol.writeBool(b);
 };
 
-THeaderProtocol.prototype.writeByte = function(b) {
+THeaderProtocol.prototype.writeByte = function (b) {
   return this.protocol.writeByte(b);
 };
 
-THeaderProtocol.prototype.writeI16 = function(i16) {
+THeaderProtocol.prototype.writeI16 = function (i16) {
   return this.protocol.writeI16(i16);
 };
 
-THeaderProtocol.prototype.writeI32 = function(i32) {
+THeaderProtocol.prototype.writeI32 = function (i32) {
   return this.protocol.writeI32(i32);
 };
 
-THeaderProtocol.prototype.writeI64 = function(i64) {
+THeaderProtocol.prototype.writeI64 = function (i64) {
   return this.protocol.writeI64(i64);
 };
 
-THeaderProtocol.prototype.writeDouble = function(dub) {
+THeaderProtocol.prototype.writeDouble = function (dub) {
   return this.protocol.writeDouble(dub);
 };
 
-THeaderProtocol.prototype.writeStringOrBinary = function(name, encoding, arg) {
+THeaderProtocol.prototype.writeStringOrBinary = function (name, encoding, arg) {
   return this.protocol.writeStringOrBinary(name, encoding, arg);
 };
 
-THeaderProtocol.prototype.writeString = function(arg) {
+THeaderProtocol.prototype.writeString = function (arg) {
   return this.protocol.writeString(arg);
 };
 
-THeaderProtocol.prototype.writeBinary = function(arg) {
+THeaderProtocol.prototype.writeBinary = function (arg) {
   return this.protocol.writeBinary(arg);
 };
 
-THeaderProtocol.prototype.readMessageBegin = function() {
+THeaderProtocol.prototype.readMessageBegin = function () {
   this.trans.readHeaders();
   this.setProtocol();
   return this.protocol.readMessageBegin();
 };
 
-THeaderProtocol.prototype.readMessageEnd = function() {
+THeaderProtocol.prototype.readMessageEnd = function () {
   return this.protocol.readMessageEnd();
 };
 
-THeaderProtocol.prototype.readStructBegin = function() {
+THeaderProtocol.prototype.readStructBegin = function () {
   return this.protocol.readStructBegin();
 };
 
-THeaderProtocol.prototype.readStructEnd = function() {
+THeaderProtocol.prototype.readStructEnd = function () {
   return this.protocol.readStructEnd();
 };
 
-THeaderProtocol.prototype.readFieldBegin = function() {
+THeaderProtocol.prototype.readFieldBegin = function () {
   return this.protocol.readFieldBegin();
 };
 
-THeaderProtocol.prototype.readFieldEnd = function() {
+THeaderProtocol.prototype.readFieldEnd = function () {
   return this.protocol.readFieldEnd();
 };
 
-THeaderProtocol.prototype.readMapBegin = function() {
+THeaderProtocol.prototype.readMapBegin = function () {
   return this.protocol.readMapBegin();
 };
 
-THeaderProtocol.prototype.readMapEnd = function() {
+THeaderProtocol.prototype.readMapEnd = function () {
   return this.protocol.readMapEnd();
 };
 
-THeaderProtocol.prototype.readListBegin = function() {
+THeaderProtocol.prototype.readListBegin = function () {
   return this.protocol.readListBegin();
 };
 
-THeaderProtocol.prototype.readListEnd = function() {
+THeaderProtocol.prototype.readListEnd = function () {
   return this.protocol.readListEnd();
 };
 
-THeaderProtocol.prototype.readSetBegin = function() {
+THeaderProtocol.prototype.readSetBegin = function () {
   return this.protocol.readSetBegin();
 };
 
-THeaderProtocol.prototype.readSetEnd = function() {
+THeaderProtocol.prototype.readSetEnd = function () {
   return this.protocol.readSetEnd();
 };
 
-THeaderProtocol.prototype.readBool = function() {
+THeaderProtocol.prototype.readBool = function () {
   return this.protocol.readBool();
 };
 
-THeaderProtocol.prototype.readByte = function() {
+THeaderProtocol.prototype.readByte = function () {
   return this.protocol.readByte();
 };
 
-THeaderProtocol.prototype.readI16 = function() {
+THeaderProtocol.prototype.readI16 = function () {
   return this.protocol.readI16();
 };
 
-THeaderProtocol.prototype.readI32 = function() {
+THeaderProtocol.prototype.readI32 = function () {
   return this.protocol.readI32();
 };
 
-THeaderProtocol.prototype.readI64 = function() {
+THeaderProtocol.prototype.readI64 = function () {
   return this.protocol.readI64();
 };
 
-THeaderProtocol.prototype.readDouble = function() {
+THeaderProtocol.prototype.readDouble = function () {
   return this.protocol.readDouble();
 };
 
-THeaderProtocol.prototype.readBinary = function() {
+THeaderProtocol.prototype.readBinary = function () {
   return this.protocol.readBinary();
 };
 
-THeaderProtocol.prototype.readString = function() {
+THeaderProtocol.prototype.readString = function () {
   return this.protocol.readString();
 };
 
-THeaderProtocol.prototype.getTransport = function() {
+THeaderProtocol.prototype.getTransport = function () {
   return this.trans;
 };
 
-THeaderProtocol.prototype.skip = function(type) {
+THeaderProtocol.prototype.skip = function (type) {
   return this.protocol.skip(type);
 };
 
-THeaderProtocol.prototype.setProtocol = function(subProtocolId) {
+THeaderProtocol.prototype.setProtocol = function (subProtocolId) {
   var subProtocolId = this.trans.getProtocolId();
   if (!ProtocolMap[subProtocolId]) {
-    throw new THeaderProtocolError('Headers not supported for protocol ' + subProtocolId);
+    throw new THeaderProtocolError(
+      "Headers not supported for protocol " + subProtocolId,
+    );
   }
 
   this.protocol = new ProtocolMap[subProtocolId](this.trans);
diff --git a/lib/nodejs/lib/thrift/header_transport.js b/lib/nodejs/lib/thrift/header_transport.js
index ec8624b..37da492 100644
--- a/lib/nodejs/lib/thrift/header_transport.js
+++ b/lib/nodejs/lib/thrift/header_transport.js
@@ -17,10 +17,10 @@
  * under the License.
  */
 
-var util = require('util');
-var TCompactProtocol = require('./compact_protocol');
-var TBinaryProtocol = require('./binary_protocol');
-var InputBufferUnderrunError = require('./input_buffer_underrun_error');
+var util = require("util");
+var TCompactProtocol = require("./compact_protocol");
+var TBinaryProtocol = require("./binary_protocol");
+var InputBufferUnderrunError = require("./input_buffer_underrun_error");
 
 function THeaderTransportError(message) {
   Error.call(this);
@@ -45,51 +45,51 @@
 var HEADER_SIZE_OFFSET = 96 / 8;
 var HEADER_START_OFFSET = 112 / 8;
 
-var HEADER_MAGIC = 0x0FFF;
+var HEADER_MAGIC = 0x0fff;
 
 var TINFO_HEADER_KEY_VALUE_TYPE = 0x01;
-var MAX_FRAME_SIZE = 0x3FFFFFFF;
+var MAX_FRAME_SIZE = 0x3fffffff;
 
- // A helper class for reading/writing varints. Uses
- // TCompactProtocol under the hood
+// A helper class for reading/writing varints. Uses
+// TCompactProtocol under the hood
 function VarintHelper(readBuffer) {
-  var TBufferedTransport = require('./buffered_transport');
+  var TBufferedTransport = require("./buffered_transport");
   this.outputBuffer = null;
   var _this = this;
-  this.transport = new TBufferedTransport(null, function(output) {
+  this.transport = new TBufferedTransport(null, function (output) {
     _this.outputBuffer = output;
   });
 
   this.transport.inBuf = readBuffer || Buffer.alloc(0);
   this.transport.writeCursor = this.transport.inBuf.length;
   this.protocol = new TCompactProtocol(this.transport);
-};
+}
 
-VarintHelper.prototype.readVarint32 = function() {
+VarintHelper.prototype.readVarint32 = function () {
   return this.protocol.readVarint32();
 };
 
-VarintHelper.prototype.writeVarint32 = function(i) {
+VarintHelper.prototype.writeVarint32 = function (i) {
   this.protocol.writeVarint32(i);
 };
 
-VarintHelper.prototype.readString = function() {
+VarintHelper.prototype.readString = function () {
   return this.protocol.readString();
 };
 
-VarintHelper.prototype.writeString = function(str) {
+VarintHelper.prototype.writeString = function (str) {
   this.protocol.writeString(str);
-}
+};
 
-VarintHelper.prototype.getOutCount = function() {
+VarintHelper.prototype.getOutCount = function () {
   return this.transport.outCount;
 };
 
-VarintHelper.prototype.write = function(str) {
+VarintHelper.prototype.write = function (str) {
   this.transport.write(str);
 };
 
-VarintHelper.prototype.toBuffer = function() {
+VarintHelper.prototype.toBuffer = function () {
   this.transport.flush();
   return this.outputBuffer;
 };
@@ -127,87 +127,90 @@
   this.flags = null;
   this.seqid = 0;
   this.shouldWriteHeaders = true;
-};
+}
 
-var validateHeaders = function(key, value) {
-  if (typeof key !== 'string' || typeof value !== 'string') {
-    throw new THeaderTransportError('Header key and values must be strings');
+var validateHeaders = function (key, value) {
+  if (typeof key !== "string" || typeof value !== "string") {
+    throw new THeaderTransportError("Header key and values must be strings");
   }
 };
 
-var validateProtocolId = function(protocolId) {
+var validateProtocolId = function (protocolId) {
   var protocols = Object.keys(THeaderTransport.SubprotocolId);
   for (var i = 0; i < protocols.length; i++) {
-    if (protocolId === THeaderTransport.SubprotocolId[protocols[i]]) return true;
+    if (protocolId === THeaderTransport.SubprotocolId[protocols[i]])
+      return true;
   }
 
-  throw new Error(protocolId + ' is not a valid protocol id');
+  throw new Error(protocolId + " is not a valid protocol id");
 };
 
-THeaderTransport.prototype.setSeqId = function(seqid) {
+THeaderTransport.prototype.setSeqId = function (seqid) {
   this.seqid = seqid;
 };
 
-THeaderTransport.prototype.getSeqId = function(seqid) {
+THeaderTransport.prototype.getSeqId = function (seqid) {
   return this.seqid;
 };
 
-THeaderTransport.prototype.setFlags = function(flags) {
+THeaderTransport.prototype.setFlags = function (flags) {
   this.flags = flags;
 };
 
-THeaderTransport.prototype.getReadHeaders = function() {
+THeaderTransport.prototype.getReadHeaders = function () {
   return this.rheaders;
 };
 
-THeaderTransport.prototype.setReadHeader = function(key, value) {
+THeaderTransport.prototype.setReadHeader = function (key, value) {
   validateHeaders(key, value);
   this.rheaders[key] = value;
 };
 
-THeaderTransport.prototype.clearReadHeaders = function() {
+THeaderTransport.prototype.clearReadHeaders = function () {
   this.rheaders = {};
 };
 
-THeaderTransport.prototype.getWriteHeaders = function() {
+THeaderTransport.prototype.getWriteHeaders = function () {
   return this.wheaders;
 };
 
-THeaderTransport.prototype.setWriteHeader = function(key, value) {
+THeaderTransport.prototype.setWriteHeader = function (key, value) {
   validateHeaders(key, value);
   this.wheaders[key] = value;
 };
 
-THeaderTransport.prototype.clearWriteHeaders = function() {
+THeaderTransport.prototype.clearWriteHeaders = function () {
   this.wheaders = {};
 };
 
-THeaderTransport.prototype.setMaxFrameSize = function(frameSize) {
+THeaderTransport.prototype.setMaxFrameSize = function (frameSize) {
   this.maxFrameSize = frameSize;
 };
 
-THeaderTransport.prototype.setProtocolId = function(protocolId) {
+THeaderTransport.prototype.setProtocolId = function (protocolId) {
   validateProtocolId(protocolId);
   this.protocolId = protocolId;
 };
 
-THeaderTransport.prototype.getProtocolId = function() {
+THeaderTransport.prototype.getProtocolId = function () {
   return this.protocolId;
 };
 
-var isUnframedBinary = function(readBuffer) {
+var isUnframedBinary = function (readBuffer) {
   var version = readBuffer.readInt32BE();
   return (version & TBinaryProtocol.VERSION_MASK) === TBinaryProtocol.VERSION_1;
-}
+};
 
-var isUnframedCompact = function(readBuffer) {
+var isUnframedCompact = function (readBuffer) {
   var protocolId = readBuffer.readInt8(COMPACT_PROTOCOL_OFFSET);
   var version = readBuffer.readInt8(COMPACT_PROTOCOL_VERSION_OFFSET);
-  return protocolId === TCompactProtocol.PROTOCOL_ID &&
-    (version & TCompactProtocol.VERSION_MASK) === TCompactProtocol.VERSION_N;
-}
+  return (
+    protocolId === TCompactProtocol.PROTOCOL_ID &&
+    (version & TCompactProtocol.VERSION_MASK) === TCompactProtocol.VERSION_N
+  );
+};
 
-THeaderTransport.prototype.readHeaders = function() {
+THeaderTransport.prototype.readHeaders = function () {
   var readBuffer = this.inBuf;
 
   var isUnframed = false;
@@ -228,7 +231,7 @@
 
   var frameSize = readBuffer.readInt32BE(FRAME_SIZE_OFFSET);
   if (frameSize > this.maxFrameSize) {
-    throw new THeaderTransportError('Frame exceeds maximum frame size');
+    throw new THeaderTransportError("Frame exceeds maximum frame size");
   }
 
   var headerMagic = readBuffer.readInt16BE(HEADER_MAGIC_OFFSET);
@@ -242,7 +245,7 @@
   var headerSize = readBuffer.readInt16BE(HEADER_SIZE_OFFSET) * 4;
   var endOfHeaders = HEADER_START_OFFSET + headerSize;
   if (endOfHeaders > readBuffer.length) {
-    throw new THeaderTransportError('Header size is greater than frame size');
+    throw new THeaderTransportError("Header size is greater than frame size");
   }
 
   var headerBuffer = Buffer.alloc(headerSize);
@@ -252,7 +255,7 @@
   this.setProtocolId(varintHelper.readVarint32());
   var transformCount = varintHelper.readVarint32();
   if (transformCount > 0) {
-    throw new THeaderTransportError('Transforms are not yet supported');
+    throw new THeaderTransportError("Transforms are not yet supported");
   }
 
   while (true) {
@@ -281,7 +284,7 @@
   return this.getReadHeaders();
 };
 
-THeaderTransport.prototype.writeHeaders = function() {
+THeaderTransport.prototype.writeHeaders = function () {
   // only write headers on the server if the client contained headers
   if (!this.shouldWriteHeaders) {
     return;
@@ -305,11 +308,13 @@
       varintWriter.writeString(value);
     }
   }
- var headerSizeWithoutPadding = varintWriter.getOutCount();
+  var headerSizeWithoutPadding = varintWriter.getOutCount();
   var paddingNeeded = (4 - (headerSizeWithoutPadding % 4)) % 4;
 
   var headerSize = Buffer.alloc(2);
-  headerSize.writeInt16BE(Math.floor((headerSizeWithoutPadding + paddingNeeded) / 4));
+  headerSize.writeInt16BE(
+    Math.floor((headerSizeWithoutPadding + paddingNeeded) / 4),
+  );
 
   var paddingBuffer = Buffer.alloc(paddingNeeded);
   paddingBuffer.fill(0x00);
diff --git a/lib/nodejs/lib/thrift/http_connection.js b/lib/nodejs/lib/thrift/http_connection.js
index 17e0d0c..50d3312 100644
--- a/lib/nodejs/lib/thrift/http_connection.js
+++ b/lib/nodejs/lib/thrift/http_connection.js
@@ -16,17 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var util = require('util');
-var http = require('http');
-var https = require('https');
-var EventEmitter = require('events').EventEmitter;
-var thrift = require('./thrift');
+var util = require("util");
+var http = require("http");
+var https = require("https");
+var EventEmitter = require("events").EventEmitter;
+var thrift = require("./thrift");
 
-var TBufferedTransport = require('./buffered_transport');
-var TBinaryProtocol = require('./binary_protocol');
-var InputBufferUnderrunError = require('./input_buffer_underrun_error');
+var TBufferedTransport = require("./buffered_transport");
+var TBinaryProtocol = require("./binary_protocol");
+var InputBufferUnderrunError = require("./input_buffer_underrun_error");
 
-var createClient = require('./create_client');
+var createClient = require("./create_client");
 
 /**
  * @class
@@ -69,7 +69,7 @@
  *     semantics implemented over the Node.js http.request() method.
  * @see {@link createHttpConnection}
  */
-var HttpConnection = exports.HttpConnection = function(options) {
+var HttpConnection = (exports.HttpConnection = function (options) {
   //Initialize the emitter base object
   EventEmitter.call(this);
 
@@ -88,17 +88,17 @@
     host: this.host,
     port: this.port,
     socketPath: this.socketPath,
-    path: this.options.path || '/',
-    method: 'POST',
+    path: this.options.path || "/",
+    method: "POST",
     headers: this.options.headers || {},
-    responseType: this.options.responseType || null
+    responseType: this.options.responseType || null,
   };
   for (var attrname in this.options.nodeOptions) {
     this.nodeOptions[attrname] = this.options.nodeOptions[attrname];
   }
   /*jshint -W069 */
-  if (! this.nodeOptions.headers['Connection']) {
-    this.nodeOptions.headers['Connection'] = 'keep-alive';
+  if (!this.nodeOptions.headers["Connection"]) {
+    this.nodeOptions.headers["Connection"] = "keep-alive";
   }
   /*jshint +W069 */
 
@@ -131,41 +131,42 @@
           delete self.seqId2Service[header.rseqid];
         }
         /*jshint -W083 */
-        client._reqs[dummy_seqid] = function(err, success){
+        client._reqs[dummy_seqid] = function (err, success) {
           transport_with_data.commitPosition();
           var clientCallback = client._reqs[header.rseqid];
           delete client._reqs[header.rseqid];
           if (clientCallback) {
-            process.nextTick(function() {
+            process.nextTick(function () {
               clientCallback(err, success);
             });
           }
         };
         /*jshint +W083 */
-        if(client['recv_' + header.fname]) {
-          client['recv_' + header.fname](proto, header.mtype, dummy_seqid);
+        if (client["recv_" + header.fname]) {
+          client["recv_" + header.fname](proto, header.mtype, dummy_seqid);
         } else {
           delete client._reqs[dummy_seqid];
-          self.emit("error",
-                    new thrift.TApplicationException(
-                       thrift.TApplicationExceptionType.WRONG_METHOD_NAME,
-                       "Received a response to an unknown RPC function"));
+          self.emit(
+            "error",
+            new thrift.TApplicationException(
+              thrift.TApplicationExceptionType.WRONG_METHOD_NAME,
+              "Received a response to an unknown RPC function",
+            ),
+          );
         }
       }
-    }
-    catch (e) {
+    } catch (e) {
       if (e instanceof InputBufferUnderrunError) {
         transport_with_data.rollbackPosition();
       } else {
-        self.emit('error', e);
+        self.emit("error", e);
       }
     }
   }
 
-
   //Response handler
   //////////////////////////////////////////////////
-  this.responseCallback = function(response) {
+  this.responseCallback = function (response) {
     var data = [];
     var dataLen = 0;
 
@@ -173,16 +174,18 @@
       this.emit("error", new THTTPException(response));
     }
 
-    response.on('error', function (e) {
+    response.on("error", function (e) {
       self.emit("error", e);
     });
 
     // When running directly under node, chunk will be a buffer,
     // however, when running in a Browser (e.g. Browserify), chunk
     // will be a string or an ArrayBuffer.
-    response.on('data', function (chunk) {
-      if ((typeof chunk == 'string') ||
-          (Object.prototype.toString.call(chunk) == '[object Uint8Array]')) {
+    response.on("data", function (chunk) {
+      if (
+        typeof chunk == "string" ||
+        Object.prototype.toString.call(chunk) == "[object Uint8Array]"
+      ) {
         // Wrap ArrayBuffer/string in a Buffer so data[i].copy will work
         data.push(new Buffer(chunk));
       } else {
@@ -191,9 +194,9 @@
       dataLen += chunk.length;
     });
 
-    response.on('end', function(){
+    response.on("end", function () {
       var buf = new Buffer(dataLen);
-      for (var i=0, len=data.length, pos=0; i<len; i++) {
+      for (var i = 0, len = data.length, pos = 0; i < len; i++) {
         data[i].copy(buf, pos);
         pos += data[i].length;
       }
@@ -202,7 +205,7 @@
       self.transport.receiver(decodeCallback)(buf);
     });
   };
-};
+});
 util.inherits(HttpConnection, EventEmitter);
 
 /**
@@ -212,16 +215,16 @@
  * @event {error} the "error" event is raised upon request failure passing the
  *     Node.js error object to the listener.
  */
-HttpConnection.prototype.write = function(data) {
+HttpConnection.prototype.write = function (data) {
   var self = this;
   var opts = self.nodeOptions;
   opts.headers["Content-length"] = data.length;
   if (!opts.headers["Content-Type"])
     opts.headers["Content-Type"] = "application/x-thrift";
-  var req = (self.https) ?
-      https.request(opts, self.responseCallback) :
-      http.request(opts, self.responseCallback);
-  req.on('error', function(err) {
+  var req = self.https
+    ? https.request(opts, self.responseCallback)
+    : http.request(opts, self.responseCallback);
+  req.on("error", function (err) {
     self.emit("error", err);
   });
   req.write(data);
@@ -237,19 +240,18 @@
  * @returns {HttpConnection} The connection object.
  * @see {@link ConnectOptions}
  */
-exports.createHttpConnection = function(host, port, options) {
+exports.createHttpConnection = function (host, port, options) {
   options.host = host;
   options.port = port || 80;
   return new HttpConnection(options);
 };
 
-exports.createHttpUDSConnection = function(path, options) {
+exports.createHttpUDSConnection = function (path, options) {
   options.socketPath = path;
   return new HttpConnection(options);
 };
 
-exports.createHttpClient = createClient
-
+exports.createHttpClient = createClient;
 
 function THTTPException(response) {
   thrift.TApplicationException.call(this);
@@ -261,6 +263,7 @@
   this.statusCode = response.statusCode;
   this.response = response;
   this.type = thrift.TApplicationExceptionType.PROTOCOL_ERROR;
-  this.message = "Received a response with a bad HTTP status code: " + response.statusCode;
+  this.message =
+    "Received a response with a bad HTTP status code: " + response.statusCode;
 }
 util.inherits(THTTPException, thrift.TApplicationException);
diff --git a/lib/nodejs/lib/thrift/index.js b/lib/nodejs/lib/thrift/index.js
index df4a5dc..5f0010f 100644
--- a/lib/nodejs/lib/thrift/index.js
+++ b/lib/nodejs/lib/thrift/index.js
@@ -16,14 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-exports.Thrift = require('./thrift');
+exports.Thrift = require("./thrift");
 
-var log = require('./log');
+var log = require("./log");
 exports.setLogFunc = log.setLogFunc;
 exports.setLogLevel = log.setLogLevel;
 exports.getLogLevel = log.getLogLevel;
 
-var connection = require('./connection');
+var connection = require("./connection");
 exports.Connection = connection.Connection;
 exports.createClient = connection.createClient;
 exports.createConnection = connection.createConnection;
@@ -32,34 +32,34 @@
 exports.createStdIOClient = connection.createStdIOClient;
 exports.createStdIOConnection = connection.createStdIOConnection;
 
-var httpConnection = require('./http_connection');
+var httpConnection = require("./http_connection");
 exports.HttpConnection = httpConnection.HttpConnection;
 exports.createHttpConnection = httpConnection.createHttpConnection;
 exports.createHttpUDSConnection = httpConnection.createHttpUDSConnection;
 exports.createHttpClient = httpConnection.createHttpClient;
 
-var wsConnection = require('./ws_connection');
+var wsConnection = require("./ws_connection");
 exports.WSConnection = wsConnection.WSConnection;
 exports.createWSConnection = wsConnection.createWSConnection;
 exports.createWSClient = wsConnection.createWSClient;
 
-var xhrConnection = require('./xhr_connection');
+var xhrConnection = require("./xhr_connection");
 exports.XHRConnection = xhrConnection.XHRConnection;
 exports.createXHRConnection = xhrConnection.createXHRConnection;
 exports.createXHRClient = xhrConnection.createXHRClient;
 
-var server = require('./server');
+var server = require("./server");
 exports.createServer = server.createServer;
 exports.createMultiplexServer = server.createMultiplexServer;
 
-var web_server = require('./web_server');
+var web_server = require("./web_server");
 exports.createWebServer = web_server.createWebServer;
 
-exports.Int64 = require('node-int64');
-exports.Q = require('q');
+exports.Int64 = require("node-int64");
+exports.Q = require("q");
 
-var mpxProcessor = require('./multiplexed_processor');
-var mpxProtocol = require('./multiplexed_protocol');
+var mpxProcessor = require("./multiplexed_processor");
+var mpxProtocol = require("./multiplexed_protocol");
 exports.MultiplexedProcessor = mpxProcessor.MultiplexedProcessor;
 exports.Multiplexer = mpxProtocol.Multiplexer;
 
@@ -67,12 +67,12 @@
  * Export transport and protocol so they can be used outside of a
  * cassandra/server context
  */
-exports.TBufferedTransport = require('./buffered_transport');
-exports.TFramedTransport = require('./framed_transport');
+exports.TBufferedTransport = require("./buffered_transport");
+exports.TFramedTransport = require("./framed_transport");
 
-exports.TJSONProtocol = require('./json_protocol');
-exports.TBinaryProtocol = require('./binary_protocol');
-exports.TCompactProtocol = require('./compact_protocol');
-exports.THeaderProtocol = require('./header_protocol');
+exports.TJSONProtocol = require("./json_protocol");
+exports.TBinaryProtocol = require("./binary_protocol");
+exports.TCompactProtocol = require("./compact_protocol");
+exports.THeaderProtocol = require("./header_protocol");
 
-exports.InputBufferUnderrunError = require('./input_buffer_underrun_error');
+exports.InputBufferUnderrunError = require("./input_buffer_underrun_error");
diff --git a/lib/nodejs/lib/thrift/input_buffer_underrun_error.js b/lib/nodejs/lib/thrift/input_buffer_underrun_error.js
index e424540..9542854 100644
--- a/lib/nodejs/lib/thrift/input_buffer_underrun_error.js
+++ b/lib/nodejs/lib/thrift/input_buffer_underrun_error.js
@@ -27,6 +27,6 @@
   }
   this.name = this.constructor.name;
   this.message = message;
-};
+}
 
 util.inherits(InputBufferUnderrunError, Error);
diff --git a/lib/nodejs/lib/thrift/int64_util.js b/lib/nodejs/lib/thrift/int64_util.js
index e8d707d..84588c5 100644
--- a/lib/nodejs/lib/thrift/int64_util.js
+++ b/lib/nodejs/lib/thrift/int64_util.js
@@ -17,20 +17,19 @@
  * under the License.
  */
 
-var Int64 = require('node-int64');
+var Int64 = require("node-int64");
 
-var Int64Util = module.exports = {};
+var Int64Util = (module.exports = {});
 
 var POW2_24 = Math.pow(2, 24);
 var POW2_31 = Math.pow(2, 31);
 var POW2_32 = Math.pow(2, 32);
 var POW10_11 = Math.pow(10, 11);
 
-Int64Util.toDecimalString = function(i64) {
+Int64Util.toDecimalString = function (i64) {
   var b = i64.buffer;
   var o = i64.offset;
-  if ((!b[o] && !(b[o + 1] & 0xe0)) ||
-      (!~b[o] && !~(b[o + 1] & 0xe0))) {
+  if ((!b[o] && !(b[o + 1] & 0xe0)) || (!~b[o] && !~(b[o + 1] & 0xe0))) {
     // The magnitude is small enough.
     return i64.toString();
   } else {
@@ -47,34 +46,39 @@
     }
     var high2 = b[o + 1] + (b[o] << 8);
     // Lesser 11 digits with exceeding values but is under 53 bits capacity.
-    var low = b[o + 7] + (b[o + 6] << 8) + (b[o + 5] << 16)
-        + b[o + 4] * POW2_24  // Bit shift renders 32th bit as sign, so use multiplication
-        + (b[o + 3] + (b[o + 2] << 8)) * POW2_32 + high2 * 74976710656;  // The literal is 2^48 % 10^11
+    var low =
+      b[o + 7] +
+      (b[o + 6] << 8) +
+      (b[o + 5] << 16) +
+      b[o + 4] * POW2_24 + // Bit shift renders 32th bit as sign, so use multiplication
+      (b[o + 3] + (b[o + 2] << 8)) * POW2_32 +
+      high2 * 74976710656; // The literal is 2^48 % 10^11
     // 12th digit and greater.
-    var high = Math.floor(low / POW10_11) + high2 * 2814;  // The literal is 2^48 / 10^11
+    var high = Math.floor(low / POW10_11) + high2 * 2814; // The literal is 2^48 / 10^11
     // Make it exactly 11 with leading zeros.
-    low = ('00000000000' + String(low % POW10_11)).slice(-11);
-    return (negative ? '-' : '') + String(high) + low;
+    low = ("00000000000" + String(low % POW10_11)).slice(-11);
+    return (negative ? "-" : "") + String(high) + low;
   }
 };
 
-Int64Util.fromDecimalString = function(text) {
-  var negative = text.charAt(0) === '-';
+Int64Util.fromDecimalString = function (text) {
+  var negative = text.charAt(0) === "-";
   if (text.length < (negative ? 17 : 16)) {
     // The magnitude is smaller than 2^53.
     return new Int64(+text);
   } else if (text.length > (negative ? 20 : 19)) {
-    throw new RangeError('Too many digits for Int64: ' + text);
+    throw new RangeError("Too many digits for Int64: " + text);
   } else {
     // Most significant (up to 5) digits
     var high5 = +text.slice(negative ? 1 : 0, -15);
-    var low = +text.slice(-15) + high5 * 2764472320;  // The literal is 10^15 % 2^32
-    var high = Math.floor(low / POW2_32) + high5 * 232830;  // The literal is 10^15 / 2^&32
+    var low = +text.slice(-15) + high5 * 2764472320; // The literal is 10^15 % 2^32
+    var high = Math.floor(low / POW2_32) + high5 * 232830; // The literal is 10^15 / 2^&32
     low = low % POW2_32;
-    if (high >= POW2_31 &&
-        !(negative && high == POW2_31 && low == 0)  // Allow minimum Int64
-       ) {
-      throw new RangeError('The magnitude is too large for Int64.');
+    if (
+      high >= POW2_31 &&
+      !(negative && high == POW2_31 && low == 0) // Allow minimum Int64
+    ) {
+      throw new RangeError("The magnitude is too large for Int64.");
     }
     if (negative) {
       // 2's complement
diff --git a/lib/nodejs/lib/thrift/json_parse.js b/lib/nodejs/lib/thrift/json_parse.js
index 93b0bf2..3d111c0 100644
--- a/lib/nodejs/lib/thrift/json_parse.js
+++ b/lib/nodejs/lib/thrift/json_parse.js
@@ -12,7 +12,6 @@
  * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
  */
 
-
 /*jslint for */
 
 /*property
@@ -20,280 +19,260 @@
     prototype, push, r, t, text
 */
 
-var Int64 = require('node-int64');
-var Int64Util = require('./int64_util');
+var Int64 = require("node-int64");
+var Int64Util = require("./int64_util");
 
-var json_parse = module.exports = (function () {
-    "use strict";
+var json_parse = (module.exports = (function () {
+  "use strict";
 
-// This is a function that can parse a JSON text, producing a JavaScript
-// data structure. It is a simple, recursive descent parser. It does not use
-// eval or regular expressions, so it can be used as a model for implementing
-// a JSON parser in other languages.
+  // This is a function that can parse a JSON text, producing a JavaScript
+  // data structure. It is a simple, recursive descent parser. It does not use
+  // eval or regular expressions, so it can be used as a model for implementing
+  // a JSON parser in other languages.
 
-// We are defining the function inside of another function to avoid creating
-// global variables.
+  // We are defining the function inside of another function to avoid creating
+  // global variables.
 
-    var at,     // The index of the current character
-        ch,     // The current character
-        escapee = {
-            '"': '"',
-            '\\': '\\',
-            '/': '/',
-            b: '\b',
-            f: '\f',
-            n: '\n',
-            r: '\r',
-            t: '\t'
-        },
-        text,
+  var at, // The index of the current character
+    ch, // The current character
+    escapee = {
+      '"': '"',
+      "\\": "\\",
+      "/": "/",
+      b: "\b",
+      f: "\f",
+      n: "\n",
+      r: "\r",
+      t: "\t",
+    },
+    text,
+    error = function (m) {
+      // Call error when something is wrong.
 
-        error = function (m) {
+      throw new SyntaxError(m);
+    },
+    next = function (c) {
+      // If a c parameter is provided, verify that it matches the current character.
 
-// Call error when something is wrong.
+      if (c && c !== ch) {
+        error("Expected '" + c + "' instead of '" + ch + "'");
+      }
 
-            throw new SyntaxError(m);
-        },
+      // Get the next character. When there are no more characters,
+      // return the empty string.
 
-        next = function (c) {
+      ch = text.charAt(at);
+      at += 1;
+      return ch;
+    },
+    number = function () {
+      // Parse a number value.
 
-// If a c parameter is provided, verify that it matches the current character.
+      var number,
+        string = "";
 
-            if (c && c !== ch) {
-                error("Expected '" + c + "' instead of '" + ch + "'");
-            }
+      if (ch === "-") {
+        string = "-";
+        next("-");
+      }
+      while (ch >= "0" && ch <= "9") {
+        string += ch;
+        next();
+      }
+      if (ch === ".") {
+        string += ".";
+        while (next() && ch >= "0" && ch <= "9") {
+          string += ch;
+        }
+      }
+      if (ch === "e" || ch === "E") {
+        string += ch;
+        next();
+        if (ch === "-" || ch === "+") {
+          string += ch;
+          next();
+        }
+        while (ch >= "0" && ch <= "9") {
+          string += ch;
+          next();
+        }
+      }
+      number = +string;
+      if (!isFinite(number)) {
+        error("Bad number");
+      } else if (number >= Int64.MAX_INT || number <= Int64.MIN_INT) {
+        // Return raw string for further process in TJSONProtocol
+        return string;
+      } else {
+        return number;
+      }
+    },
+    string = function () {
+      // Parse a string value.
 
-// Get the next character. When there are no more characters,
-// return the empty string.
+      var hex,
+        i,
+        string = "",
+        uffff;
 
-            ch = text.charAt(at);
-            at += 1;
-            return ch;
-        },
+      // When parsing for string values, we must look for " and \ characters.
 
-        number = function () {
-
-// Parse a number value.
-
-            var number,
-                string = '';
-
-            if (ch === '-') {
-                string = '-';
-                next('-');
-            }
-            while (ch >= '0' && ch <= '9') {
-                string += ch;
-                next();
-            }
-            if (ch === '.') {
-                string += '.';
-                while (next() && ch >= '0' && ch <= '9') {
-                    string += ch;
+      if (ch === '"') {
+        while (next()) {
+          if (ch === '"') {
+            next();
+            return string;
+          }
+          if (ch === "\\") {
+            next();
+            if (ch === "u") {
+              uffff = 0;
+              for (i = 0; i < 4; i += 1) {
+                hex = parseInt(next(), 16);
+                if (!isFinite(hex)) {
+                  break;
                 }
-            }
-            if (ch === 'e' || ch === 'E') {
-                string += ch;
-                next();
-                if (ch === '-' || ch === '+') {
-                    string += ch;
-                    next();
-                }
-                while (ch >= '0' && ch <= '9') {
-                    string += ch;
-                    next();
-                }
-            }
-            number = +string;
-            if (!isFinite(number)) {
-                error("Bad number");
-            } else if (number >= Int64.MAX_INT || number <= Int64.MIN_INT) {
-                // Return raw string for further process in TJSONProtocol
-                return string;
+                uffff = uffff * 16 + hex;
+              }
+              string += String.fromCharCode(uffff);
+            } else if (typeof escapee[ch] === "string") {
+              string += escapee[ch];
             } else {
-                return number;
+              break;
             }
-        },
-
-        string = function () {
-
-// Parse a string value.
-
-            var hex,
-                i,
-                string = '',
-                uffff;
-
-// When parsing for string values, we must look for " and \ characters.
-
-            if (ch === '"') {
-                while (next()) {
-                    if (ch === '"') {
-                        next();
-                        return string;
-                    }
-                    if (ch === '\\') {
-                        next();
-                        if (ch === 'u') {
-                            uffff = 0;
-                            for (i = 0; i < 4; i += 1) {
-                                hex = parseInt(next(), 16);
-                                if (!isFinite(hex)) {
-                                    break;
-                                }
-                                uffff = uffff * 16 + hex;
-                            }
-                            string += String.fromCharCode(uffff);
-                        } else if (typeof escapee[ch] === 'string') {
-                            string += escapee[ch];
-                        } else {
-                            break;
-                        }
-                    } else {
-                        string += ch;
-                    }
-                }
-            }
-            error("Bad string");
-        },
-
-        white = function () {
-
-// Skip whitespace.
-
-            while (ch && ch <= ' ') {
-                next();
-            }
-        },
-
-        word = function () {
-
-// true, false, or null.
-
-            switch (ch) {
-            case 't':
-                next('t');
-                next('r');
-                next('u');
-                next('e');
-                return true;
-            case 'f':
-                next('f');
-                next('a');
-                next('l');
-                next('s');
-                next('e');
-                return false;
-            case 'n':
-                next('n');
-                next('u');
-                next('l');
-                next('l');
-                return null;
-            }
-            error("Unexpected '" + ch + "'");
-        },
-
-        value,  // Place holder for the value function.
-
-        array = function () {
-
-// Parse an array value.
-
-            var array = [];
-
-            if (ch === '[') {
-                next('[');
-                white();
-                if (ch === ']') {
-                    next(']');
-                    return array;   // empty array
-                }
-                while (ch) {
-                    array.push(value());
-                    white();
-                    if (ch === ']') {
-                        next(']');
-                        return array;
-                    }
-                    next(',');
-                    white();
-                }
-            }
-            error("Bad array");
-        },
-
-        object = function () {
-
-// Parse an object value.
-
-            var key,
-                object = {};
-
-            if (ch === '{') {
-                next('{');
-                white();
-                if (ch === '}') {
-                    next('}');
-                    return object;   // empty object
-                }
-                while (ch) {
-                    key = string();
-                    white();
-                    next(':');
-                    if (Object.hasOwnProperty.call(object, key)) {
-                        error('Duplicate key "' + key + '"');
-                    }
-                    object[key] = value();
-                    white();
-                    if (ch === '}') {
-                        next('}');
-                        return object;
-                    }
-                    next(',');
-                    white();
-                }
-            }
-            error("Bad object");
-        };
-
-    value = function () {
-
-// Parse a JSON value. It could be an object, an array, a string, a number,
-// or a word.
-
-        white();
-        switch (ch) {
-        case '{':
-            return object();
-        case '[':
-            return array();
-        case '"':
-            return string();
-        case '-':
-            return number();
-        default:
-            return ch >= '0' && ch <= '9'
-                ? number()
-                : word();
+          } else {
+            string += ch;
+          }
         }
+      }
+      error("Bad string");
+    },
+    white = function () {
+      // Skip whitespace.
+
+      while (ch && ch <= " ") {
+        next();
+      }
+    },
+    word = function () {
+      // true, false, or null.
+
+      switch (ch) {
+        case "t":
+          next("t");
+          next("r");
+          next("u");
+          next("e");
+          return true;
+        case "f":
+          next("f");
+          next("a");
+          next("l");
+          next("s");
+          next("e");
+          return false;
+        case "n":
+          next("n");
+          next("u");
+          next("l");
+          next("l");
+          return null;
+      }
+      error("Unexpected '" + ch + "'");
+    },
+    value, // Place holder for the value function.
+    array = function () {
+      // Parse an array value.
+
+      var array = [];
+
+      if (ch === "[") {
+        next("[");
+        white();
+        if (ch === "]") {
+          next("]");
+          return array; // empty array
+        }
+        while (ch) {
+          array.push(value());
+          white();
+          if (ch === "]") {
+            next("]");
+            return array;
+          }
+          next(",");
+          white();
+        }
+      }
+      error("Bad array");
+    },
+    object = function () {
+      // Parse an object value.
+
+      var key,
+        object = {};
+
+      if (ch === "{") {
+        next("{");
+        white();
+        if (ch === "}") {
+          next("}");
+          return object; // empty object
+        }
+        while (ch) {
+          key = string();
+          white();
+          next(":");
+          if (Object.hasOwnProperty.call(object, key)) {
+            error('Duplicate key "' + key + '"');
+          }
+          object[key] = value();
+          white();
+          if (ch === "}") {
+            next("}");
+            return object;
+          }
+          next(",");
+          white();
+        }
+      }
+      error("Bad object");
     };
 
-// Return the json_parse function. It will have access to all of the above
-// functions and variables.
+  value = function () {
+    // Parse a JSON value. It could be an object, an array, a string, a number,
+    // or a word.
 
-    return function (source) {
-        var result;
+    white();
+    switch (ch) {
+      case "{":
+        return object();
+      case "[":
+        return array();
+      case '"':
+        return string();
+      case "-":
+        return number();
+      default:
+        return ch >= "0" && ch <= "9" ? number() : word();
+    }
+  };
 
-        text = source;
-        at = 0;
-        ch = ' ';
-        result = value();
-        white();
-        if (ch) {
-            error("Syntax error");
-        }
+  // Return the json_parse function. It will have access to all of the above
+  // functions and variables.
 
-        return result;
-    };
-}());
+  return function (source) {
+    var result;
+
+    text = source;
+    at = 0;
+    ch = " ";
+    result = value();
+    white();
+    if (ch) {
+      error("Syntax error");
+    }
+
+    return result;
+  };
+})());
diff --git a/lib/nodejs/lib/thrift/json_protocol.js b/lib/nodejs/lib/thrift/json_protocol.js
index 7e2b7c9..31dcb81 100644
--- a/lib/nodejs/lib/thrift/json_protocol.js
+++ b/lib/nodejs/lib/thrift/json_protocol.js
@@ -17,15 +17,15 @@
  * under the License.
  */
 
-var Int64 = require('node-int64');
-var Thrift = require('./thrift');
+var Int64 = require("node-int64");
+var Thrift = require("./thrift");
 var Type = Thrift.Type;
 var util = require("util");
 
-var Int64Util = require('./int64_util');
-var json_parse = require('./json_parse');
+var Int64Util = require("./int64_util");
+var json_parse = require("./json_parse");
 
-var InputBufferUnderrunError = require('./input_buffer_underrun_error');
+var InputBufferUnderrunError = require("./input_buffer_underrun_error");
 
 module.exports = TJSONProtocol;
 
@@ -43,7 +43,7 @@
   this.tstack = [];
   this.tpos = [];
   this.trans = trans;
-};
+}
 
 /**
  * Thrift IDL type Id to string mapping.
@@ -89,12 +89,12 @@
  */
 TJSONProtocol.Version = 1;
 
-TJSONProtocol.prototype.flush = function() {
+TJSONProtocol.prototype.flush = function () {
   this.writeToTransportIfStackIsFlushable();
   return this.trans.flush();
 };
 
-TJSONProtocol.prototype.writeToTransportIfStackIsFlushable = function() {
+TJSONProtocol.prototype.writeToTransportIfStackIsFlushable = function () {
   if (this.tstack.length === 1) {
     this.trans.write(this.tstack.pop());
   }
@@ -106,20 +106,29 @@
  * @param {Thrift.MessageType} messageType - The type of method call.
  * @param {number} seqid - The sequence number of this call (always 0 in Apache Thrift).
  */
-TJSONProtocol.prototype.writeMessageBegin = function(name, messageType, seqid) {
-  this.tstack.push([TJSONProtocol.Version, '"' + name + '"', messageType, seqid]);
+TJSONProtocol.prototype.writeMessageBegin = function (
+  name,
+  messageType,
+  seqid,
+) {
+  this.tstack.push([
+    TJSONProtocol.Version,
+    '"' + name + '"',
+    messageType,
+    seqid,
+  ]);
 };
 
 /**
  * Serializes the end of a Thrift RPC message.
  */
-TJSONProtocol.prototype.writeMessageEnd = function() {
+TJSONProtocol.prototype.writeMessageEnd = function () {
   var obj = this.tstack.pop();
 
   this.wobj = this.tstack.pop();
   this.wobj.push(obj);
 
-  this.wbuf = '[' + this.wobj.join(',') + ']';
+  this.wbuf = "[" + this.wobj.join(",") + "]";
 
   // we assume there is nothing more to come so we write
   this.trans.write(this.wbuf);
@@ -129,7 +138,7 @@
  * Serializes the beginning of a struct.
  * @param {string} name - The name of the struct.
  */
-TJSONProtocol.prototype.writeStructBegin = function(name) {
+TJSONProtocol.prototype.writeStructBegin = function (name) {
   this.tpos.push(this.tstack.length);
   this.tstack.push({});
 };
@@ -137,22 +146,22 @@
 /**
  * Serializes the end of a struct.
  */
-TJSONProtocol.prototype.writeStructEnd = function() {
+TJSONProtocol.prototype.writeStructEnd = function () {
   var p = this.tpos.pop();
   var struct = this.tstack[p];
-  var str = '{';
+  var str = "{";
   var first = true;
   for (var key in struct) {
     if (first) {
       first = false;
     } else {
-      str += ',';
+      str += ",";
     }
 
-    str += key + ':' + struct[key];
+    str += key + ":" + struct[key];
   }
 
-  str += '}';
+  str += "}";
   this.tstack[p] = str;
 
   this.writeToTransportIfStackIsFlushable();
@@ -164,26 +173,27 @@
  * @param {Thrift.Protocol.Type} fieldType - The data type of the field.
  * @param {number} fieldId - The field's unique identifier.
  */
-TJSONProtocol.prototype.writeFieldBegin = function(name, fieldType, fieldId) {
+TJSONProtocol.prototype.writeFieldBegin = function (name, fieldType, fieldId) {
   this.tpos.push(this.tstack.length);
-  this.tstack.push({ 'fieldId': '"' +
-    fieldId + '"', 'fieldType': TJSONProtocol.Type[fieldType]
+  this.tstack.push({
+    fieldId: '"' + fieldId + '"',
+    fieldType: TJSONProtocol.Type[fieldType],
   });
 };
 
 /**
  * Serializes the end of a field.
  */
-TJSONProtocol.prototype.writeFieldEnd = function() {
+TJSONProtocol.prototype.writeFieldEnd = function () {
   var value = this.tstack.pop();
   var fieldInfo = this.tstack.pop();
 
-  if (':' + value === ":[object Object]") {
-    this.tstack[this.tstack.length - 1][fieldInfo.fieldId] = '{' +
-      fieldInfo.fieldType + ':' + JSON.stringify(value) + '}';
+  if (":" + value === ":[object Object]") {
+    this.tstack[this.tstack.length - 1][fieldInfo.fieldId] =
+      "{" + fieldInfo.fieldType + ":" + JSON.stringify(value) + "}";
   } else {
-    this.tstack[this.tstack.length - 1][fieldInfo.fieldId] = '{' +
-      fieldInfo.fieldType + ':' + value + '}';
+    this.tstack[this.tstack.length - 1][fieldInfo.fieldId] =
+      "{" + fieldInfo.fieldType + ":" + value + "}";
   }
   this.tpos.pop();
 
@@ -193,8 +203,7 @@
 /**
  * Serializes the end of the set of fields for a struct.
  */
-TJSONProtocol.prototype.writeFieldStop = function() {
-};
+TJSONProtocol.prototype.writeFieldStop = function () {};
 
 /**
  * Serializes the beginning of a map collection.
@@ -202,16 +211,20 @@
  * @param {Thrift.Type} valType - The data type of the value.
  * @param {number} [size] - The number of elements in the map (ignored).
  */
-TJSONProtocol.prototype.writeMapBegin = function(keyType, valType, size) {
+TJSONProtocol.prototype.writeMapBegin = function (keyType, valType, size) {
   //size is invalid, we'll set it on end.
   this.tpos.push(this.tstack.length);
-  this.tstack.push([TJSONProtocol.Type[keyType], TJSONProtocol.Type[valType], 0]);
+  this.tstack.push([
+    TJSONProtocol.Type[keyType],
+    TJSONProtocol.Type[valType],
+    0,
+  ]);
 };
 
 /**
  * Serializes the end of a map.
  */
-TJSONProtocol.prototype.writeMapEnd = function() {
+TJSONProtocol.prototype.writeMapEnd = function () {
   var p = this.tpos.pop();
 
   if (p == this.tstack.length) {
@@ -219,14 +232,14 @@
   }
 
   if ((this.tstack.length - p - 1) % 2 !== 0) {
-    this.tstack.push('');
+    this.tstack.push("");
   }
 
   var size = (this.tstack.length - p - 1) / 2;
 
   this.tstack[p][this.tstack[p].length - 1] = size;
 
-  var map = '}';
+  var map = "}";
   var first = true;
   while (this.tstack.length > p + 1) {
     var v = this.tstack.pop();
@@ -234,16 +247,18 @@
     if (first) {
       first = false;
     } else {
-      map = ',' + map;
+      map = "," + map;
     }
 
-    if (! isNaN(k)) { k = '"' + k + '"'; } //json "keys" need to be strings
-    map = k + ':' + v + map;
+    if (!isNaN(k)) {
+      k = '"' + k + '"';
+    } //json "keys" need to be strings
+    map = k + ":" + v + map;
   }
-  map = '{' + map;
+  map = "{" + map;
 
   this.tstack[p].push(map);
-  this.tstack[p] = '[' + this.tstack[p].join(',') + ']';
+  this.tstack[p] = "[" + this.tstack[p].join(",") + "]";
 
   this.writeToTransportIfStackIsFlushable();
 };
@@ -253,7 +268,7 @@
  * @param {Thrift.Type} elemType - The data type of the elements.
  * @param {number} size - The number of elements in the list.
  */
-TJSONProtocol.prototype.writeListBegin = function(elemType, size) {
+TJSONProtocol.prototype.writeListBegin = function (elemType, size) {
   this.tpos.push(this.tstack.length);
   this.tstack.push([TJSONProtocol.Type[elemType], size]);
 };
@@ -261,7 +276,7 @@
 /**
  * Serializes the end of a list.
  */
-TJSONProtocol.prototype.writeListEnd = function() {
+TJSONProtocol.prototype.writeListEnd = function () {
   var p = this.tpos.pop();
 
   while (this.tstack.length > p + 1) {
@@ -270,7 +285,7 @@
     this.tstack[p].push(tmpVal);
   }
 
-  this.tstack[p] = '[' + this.tstack[p].join(',') + ']';
+  this.tstack[p] = "[" + this.tstack[p].join(",") + "]";
 
   this.writeToTransportIfStackIsFlushable();
 };
@@ -280,15 +295,15 @@
  * @param {Thrift.Type} elemType - The data type of the elements.
  * @param {number} size - The number of elements in the list.
  */
-TJSONProtocol.prototype.writeSetBegin = function(elemType, size) {
-    this.tpos.push(this.tstack.length);
-    this.tstack.push([TJSONProtocol.Type[elemType], size]);
+TJSONProtocol.prototype.writeSetBegin = function (elemType, size) {
+  this.tpos.push(this.tstack.length);
+  this.tstack.push([TJSONProtocol.Type[elemType], size]);
 };
 
 /**
  * Serializes the end of a set.
  */
-TJSONProtocol.prototype.writeSetEnd = function() {
+TJSONProtocol.prototype.writeSetEnd = function () {
   var p = this.tpos.pop();
 
   while (this.tstack.length > p + 1) {
@@ -297,33 +312,33 @@
     this.tstack[p].push(tmpVal);
   }
 
-  this.tstack[p] = '[' + this.tstack[p].join(',') + ']';
+  this.tstack[p] = "[" + this.tstack[p].join(",") + "]";
 
   this.writeToTransportIfStackIsFlushable();
 };
 
 /** Serializes a boolean */
-TJSONProtocol.prototype.writeBool = function(bool) {
+TJSONProtocol.prototype.writeBool = function (bool) {
   this.tstack.push(bool ? 1 : 0);
 };
 
 /** Serializes a number */
-TJSONProtocol.prototype.writeByte = function(byte) {
+TJSONProtocol.prototype.writeByte = function (byte) {
   this.tstack.push(byte);
 };
 
 /** Serializes a number */
-TJSONProtocol.prototype.writeI16 = function(i16) {
+TJSONProtocol.prototype.writeI16 = function (i16) {
   this.tstack.push(i16);
 };
 
 /** Serializes a number */
-TJSONProtocol.prototype.writeI32 = function(i32) {
+TJSONProtocol.prototype.writeI32 = function (i32) {
   this.tstack.push(i32);
 };
 
 /** Serializes a number */
-TJSONProtocol.prototype.writeI64 = function(i64) {
+TJSONProtocol.prototype.writeI64 = function (i64) {
   if (i64 instanceof Int64) {
     this.tstack.push(Int64Util.toDecimalString(i64));
   } else {
@@ -332,69 +347,81 @@
 };
 
 /** Serializes a number */
-TJSONProtocol.prototype.writeDouble = function(dub) {
+TJSONProtocol.prototype.writeDouble = function (dub) {
   this.tstack.push(dub);
 };
 
 /** Serializes a string */
-TJSONProtocol.prototype.writeString = function(arg) {
+TJSONProtocol.prototype.writeString = function (arg) {
   // We do not encode uri components for wire transfer:
   if (arg === null) {
-      this.tstack.push(null);
+    this.tstack.push(null);
   } else {
-      if (typeof arg === 'string') {
-        var str = arg;
-      } else if (arg instanceof Buffer) {
-        var str = arg.toString('utf8');
-      } else {
-        throw new Error('writeString called without a string/Buffer argument: ' + arg);
-      }
+    if (typeof arg === "string") {
+      var str = arg;
+    } else if (arg instanceof Buffer) {
+      var str = arg.toString("utf8");
+    } else {
+      throw new Error(
+        "writeString called without a string/Buffer argument: " + arg,
+      );
+    }
 
-      // concat may be slower than building a byte buffer
-      var escapedString = '';
-      for (var i = 0; i < str.length; i++) {
-          var ch = str.charAt(i);      // a single double quote: "
-          if (ch === '\"') {
-              escapedString += '\\\"'; // write out as: \"
-          } else if (ch === '\\') {    // a single backslash: \
-              escapedString += '\\\\'; // write out as: \\
-          /* Currently escaped forward slashes break TJSONProtocol.
-           * As it stands, we can simply pass forward slashes into
-           * our strings across the wire without being escaped.
-           * I think this is the protocol's bug, not thrift.js
-           * } else if(ch === '/') {   // a single forward slash: /
-           *  escapedString += '\\/';  // write out as \/
-           * }
-           */
-          } else if (ch === '\b') {    // a single backspace: invisible
-              escapedString += '\\b';  // write out as: \b"
-          } else if (ch === '\f') {    // a single formfeed: invisible
-              escapedString += '\\f';  // write out as: \f"
-          } else if (ch === '\n') {    // a single newline: invisible
-              escapedString += '\\n';  // write out as: \n"
-          } else if (ch === '\r') {    // a single return: invisible
-              escapedString += '\\r';  // write out as: \r"
-          } else if (ch === '\t') {    // a single tab: invisible
-              escapedString += '\\t';  // write out as: \t"
-          } else {
-              escapedString += ch;     // Else it need not be escaped
-          }
+    // concat may be slower than building a byte buffer
+    var escapedString = "";
+    for (var i = 0; i < str.length; i++) {
+      var ch = str.charAt(i); // a single double quote: "
+      if (ch === '\"') {
+        escapedString += '\\\"'; // write out as: \"
+      } else if (ch === "\\") {
+        // a single backslash: \
+        escapedString += "\\\\"; // write out as: \\
+        /* Currently escaped forward slashes break TJSONProtocol.
+         * As it stands, we can simply pass forward slashes into
+         * our strings across the wire without being escaped.
+         * I think this is the protocol's bug, not thrift.js
+         * } else if(ch === '/') {   // a single forward slash: /
+         *  escapedString += '\\/';  // write out as \/
+         * }
+         */
+      } else if (ch === "\b") {
+        // a single backspace: invisible
+        escapedString += "\\b"; // write out as: \b"
+      } else if (ch === "\f") {
+        // a single formfeed: invisible
+        escapedString += "\\f"; // write out as: \f"
+      } else if (ch === "\n") {
+        // a single newline: invisible
+        escapedString += "\\n"; // write out as: \n"
+      } else if (ch === "\r") {
+        // a single return: invisible
+        escapedString += "\\r"; // write out as: \r"
+      } else if (ch === "\t") {
+        // a single tab: invisible
+        escapedString += "\\t"; // write out as: \t"
+      } else {
+        escapedString += ch; // Else it need not be escaped
       }
-      this.tstack.push('"' + escapedString + '"');
+    }
+    this.tstack.push('"' + escapedString + '"');
   }
 };
 
 /** Serializes a string */
-TJSONProtocol.prototype.writeBinary = function(arg) {
-  if (typeof arg === 'string') {
-    var buf = new Buffer(arg, 'binary');
-  } else if (arg instanceof Buffer ||
-             Object.prototype.toString.call(arg) == '[object Uint8Array]')  {
+TJSONProtocol.prototype.writeBinary = function (arg) {
+  if (typeof arg === "string") {
+    var buf = new Buffer(arg, "binary");
+  } else if (
+    arg instanceof Buffer ||
+    Object.prototype.toString.call(arg) == "[object Uint8Array]"
+  ) {
     var buf = arg;
   } else {
-    throw new Error('writeBinary called without a string/Buffer argument: ' + arg);
+    throw new Error(
+      "writeBinary called without a string/Buffer argument: " + arg,
+    );
   }
-  this.tstack.push('"' + buf.toString('base64') + '"');
+  this.tstack.push('"' + buf.toString("base64") + '"');
 };
 
 /**
@@ -408,7 +435,7 @@
  * Deserializes the beginning of a message.
  * @returns {AnonReadMessageBeginReturn}
  */
-TJSONProtocol.prototype.readMessageBegin = function() {
+TJSONProtocol.prototype.readMessageBegin = function () {
   this.rstack = [];
   this.rpos = [];
 
@@ -419,7 +446,8 @@
   }
   var cursor = transBuf.readIndex;
 
-  if (transBuf.buf[cursor] !== 0x5B) { //[
+  if (transBuf.buf[cursor] !== 0x5b) {
+    //[
     throw new Error("Malformed JSON input, no opening bracket");
   }
 
@@ -432,22 +460,27 @@
     var chr = transBuf.buf[cursor];
     //we use hexa charcode here because data[i] returns an int and not a char
     if (inString) {
-      if (chr === 0x22) { //"
+      if (chr === 0x22) {
+        //"
         inString = false;
-      } else if (chr === 0x5C) { //\
+      } else if (chr === 0x5c) {
+        //\
         //escaped character, skip
         cursor += 1;
       }
     } else {
-      if (chr === 0x5B) { //[
+      if (chr === 0x5b) {
+        //[
         openBracketCount += 1;
-      } else if (chr === 0x5D) { //]
+      } else if (chr === 0x5d) {
+        //]
         openBracketCount -= 1;
         if (openBracketCount === 0) {
           //end of json message detected
           break;
         }
-      } else if (chr === 0x22) { //"
+      } else if (chr === 0x22) {
+        //"
         inString = true;
       }
     }
@@ -459,13 +492,15 @@
   }
 
   //Reconstitute the JSON object and conume the necessary bytes
-  this.robj = json_parse(transBuf.buf.slice(transBuf.readIndex, cursor+1).toString());
+  this.robj = json_parse(
+    transBuf.buf.slice(transBuf.readIndex, cursor + 1).toString(),
+  );
   this.trans.consume(cursor + 1 - transBuf.readIndex);
 
   //Verify the protocol version
   var version = this.robj.shift();
   if (version != TJSONProtocol.Version) {
-    throw new Error('Wrong thrift protocol version: ' + version);
+    throw new Error("Wrong thrift protocol version: " + version);
   }
 
   //Objectify the thrift message {name/type/sequence-number} for return
@@ -479,17 +514,16 @@
 };
 
 /** Deserializes the end of a message. */
-TJSONProtocol.prototype.readMessageEnd = function() {
-};
+TJSONProtocol.prototype.readMessageEnd = function () {};
 
 /**
  * Deserializes the beginning of a struct.
  * @param {string} [name] - The name of the struct (ignored)
  * @returns {object} - An object with an empty string fname property
  */
-TJSONProtocol.prototype.readStructBegin = function() {
+TJSONProtocol.prototype.readStructBegin = function () {
   var r = {};
-  r.fname = '';
+  r.fname = "";
 
   //incase this is an array of structs
   if (this.rstack[this.rstack.length - 1] instanceof Array) {
@@ -500,7 +534,7 @@
 };
 
 /** Deserializes the end of a struct. */
-TJSONProtocol.prototype.readStructEnd = function() {
+TJSONProtocol.prototype.readStructEnd = function () {
   this.rstack.pop();
 };
 
@@ -515,14 +549,14 @@
  * Deserializes the beginning of a field.
  * @returns {AnonReadFieldBeginReturn}
  */
-TJSONProtocol.prototype.readFieldBegin = function() {
+TJSONProtocol.prototype.readFieldBegin = function () {
   var r = {};
 
   var fid = -1;
   var ftype = Type.STOP;
 
   //get a fieldId
-  for (var f in (this.rstack[this.rstack.length - 1])) {
+  for (var f in this.rstack[this.rstack.length - 1]) {
     if (f === null) {
       continue;
     }
@@ -543,17 +577,18 @@
   if (fid != -1) {
     //should only be 1 of these but this is the only
     //way to match a key
-    for (var i in (this.rstack[this.rstack.length - 1])) {
+    for (var i in this.rstack[this.rstack.length - 1]) {
       if (TJSONProtocol.RType[i] === null) {
         continue;
       }
 
       ftype = TJSONProtocol.RType[i];
-      this.rstack[this.rstack.length - 1] = this.rstack[this.rstack.length - 1][i];
+      this.rstack[this.rstack.length - 1] =
+        this.rstack[this.rstack.length - 1][i];
     }
   }
 
-  r.fname = '';
+  r.fname = "";
   r.ftype = ftype;
   r.fid = fid;
 
@@ -561,7 +596,7 @@
 };
 
 /** Deserializes the end of a field. */
-TJSONProtocol.prototype.readFieldEnd = function() {
+TJSONProtocol.prototype.readFieldEnd = function () {
   var pos = this.rpos.pop();
 
   //get back to the right place in the stack
@@ -581,7 +616,7 @@
  * Deserializes the beginning of a map.
  * @returns {AnonReadMapBeginReturn}
  */
-TJSONProtocol.prototype.readMapBegin = function() {
+TJSONProtocol.prototype.readMapBegin = function () {
   var map = this.rstack.pop();
   var first = map.shift();
   if (first instanceof Array) {
@@ -595,7 +630,6 @@
   r.vtype = TJSONProtocol.RType[map.shift()];
   r.size = map.shift();
 
-
   this.rpos.push(this.rstack.length);
   this.rstack.push(map.shift());
 
@@ -603,7 +637,7 @@
 };
 
 /** Deserializes the end of a map. */
-TJSONProtocol.prototype.readMapEnd = function() {
+TJSONProtocol.prototype.readMapEnd = function () {
   this.readFieldEnd();
 };
 
@@ -617,7 +651,7 @@
  * Deserializes the beginning of a list.
  * @returns {AnonReadColBeginReturn}
  */
-TJSONProtocol.prototype.readListBegin = function() {
+TJSONProtocol.prototype.readListBegin = function () {
   var list = this.rstack[this.rstack.length - 1];
 
   var r = {};
@@ -631,7 +665,7 @@
 };
 
 /** Deserializes the end of a list. */
-TJSONProtocol.prototype.readListEnd = function() {
+TJSONProtocol.prototype.readListEnd = function () {
   var pos = this.rpos.pop() - 2;
   var st = this.rstack;
   st.pop();
@@ -644,33 +678,33 @@
  * Deserializes the beginning of a set.
  * @returns {AnonReadColBeginReturn}
  */
-TJSONProtocol.prototype.readSetBegin = function() {
+TJSONProtocol.prototype.readSetBegin = function () {
   return this.readListBegin();
 };
 
 /** Deserializes the end of a set. */
-TJSONProtocol.prototype.readSetEnd = function() {
+TJSONProtocol.prototype.readSetEnd = function () {
   return this.readListEnd();
 };
 
-TJSONProtocol.prototype.readBool = function() {
-  return this.readValue() == '1';
+TJSONProtocol.prototype.readBool = function () {
+  return this.readValue() == "1";
 };
 
-TJSONProtocol.prototype.readByte = function() {
+TJSONProtocol.prototype.readByte = function () {
   return this.readI32();
 };
 
-TJSONProtocol.prototype.readI16 = function() {
+TJSONProtocol.prototype.readI16 = function () {
   return this.readI32();
 };
 
-TJSONProtocol.prototype.readI32 = function(f) {
+TJSONProtocol.prototype.readI32 = function (f) {
   return +this.readValue();
-}
+};
 
 /** Returns the next value found in the protocol buffer */
-TJSONProtocol.prototype.readValue = function(f) {
+TJSONProtocol.prototype.readValue = function (f) {
   if (f === undefined) {
     f = this.rstack[this.rstack.length - 1];
   }
@@ -702,9 +736,9 @@
   return r.value;
 };
 
-TJSONProtocol.prototype.readI64 = function() {
-  var n = this.readValue()
-  if (typeof n === 'string') {
+TJSONProtocol.prototype.readI64 = function () {
+  var n = this.readValue();
+  if (typeof n === "string") {
     // Assuming no one is sending in 1.11111e+33 format
     return Int64Util.fromDecimalString(n);
   } else {
@@ -712,15 +746,15 @@
   }
 };
 
-TJSONProtocol.prototype.readDouble = function() {
+TJSONProtocol.prototype.readDouble = function () {
   return this.readI32();
 };
 
-TJSONProtocol.prototype.readBinary = function() {
-  return new Buffer(this.readValue(), 'base64');
+TJSONProtocol.prototype.readBinary = function () {
+  return new Buffer(this.readValue(), "base64");
 };
 
-TJSONProtocol.prototype.readString = function() {
+TJSONProtocol.prototype.readString = function () {
   return this.readValue();
 };
 
@@ -729,15 +763,15 @@
  * @readonly
  * @returns {Thrift.Transport} The underlying transport.
  */
-TJSONProtocol.prototype.getTransport = function() {
+TJSONProtocol.prototype.getTransport = function () {
   return this.trans;
 };
 
 /**
  * Method to arbitrarily skip over data
  */
-TJSONProtocol.prototype.skip = function(type) {
-    switch (type) {
+TJSONProtocol.prototype.skip = function (type) {
+  switch (type) {
     case Type.BOOL:
       this.readBool();
       break;
@@ -794,6 +828,6 @@
       this.readListEnd();
       break;
     default:
-      throw new  Error("Invalid type: " + type);
+      throw new Error("Invalid type: " + type);
   }
 };
diff --git a/lib/nodejs/lib/thrift/log.js b/lib/nodejs/lib/thrift/log.js
index 053e813..82d8a22 100644
--- a/lib/nodejs/lib/thrift/log.js
+++ b/lib/nodejs/lib/thrift/log.js
@@ -17,17 +17,17 @@
  * under the License.
  */
 
-var util = require('util');
+var util = require("util");
 
 var disabled = function () {};
 var logFunc = console.log;
-var logLevel = 'error'; // default level
+var logLevel = "error"; // default level
 
 function factory(level) {
   return function () {
     // better use spread syntax, but due to compatibility,
     // use legacy method here.
-    var args = ['thrift: [' + level + '] '].concat(Array.from(arguments));
+    var args = ["thrift: [" + level + "] "].concat(Array.from(arguments));
     return logFunc(util.format.apply(null, args));
   };
 }
@@ -42,22 +42,22 @@
   logFunc = func;
 };
 
-var setLogLevel = exports.setLogLevel = function (level) {
+var setLogLevel = (exports.setLogLevel = function (level) {
   trace = debug = error = warning = info = disabled;
   logLevel = level;
   switch (logLevel) {
-  case 'trace':
-    trace = factory('TRACE');
-  case 'debug':
-    debug = factory('DEBUG');
-  case 'error':
-    error = factory('ERROR');
-  case 'warning':
-    warning = factory('WARN');
-  case 'info':
-    info = factory('INFO');
+    case "trace":
+      trace = factory("TRACE");
+    case "debug":
+      debug = factory("DEBUG");
+    case "error":
+      error = factory("ERROR");
+    case "warning":
+      warning = factory("WARN");
+    case "info":
+      info = factory("INFO");
   }
-};
+});
 
 // set default
 setLogLevel(logLevel);
diff --git a/lib/nodejs/lib/thrift/multiplexed_processor.js b/lib/nodejs/lib/thrift/multiplexed_processor.js
index 67b62f7..864d66d 100644
--- a/lib/nodejs/lib/thrift/multiplexed_processor.js
+++ b/lib/nodejs/lib/thrift/multiplexed_processor.js
@@ -16,31 +16,38 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var Thrift = require('./thrift');
+var Thrift = require("./thrift");
 
 exports.MultiplexedProcessor = MultiplexedProcessor;
 
 function MultiplexedProcessor(stream, options) {
   this.services = {};
-};
+}
 
-MultiplexedProcessor.prototype.registerProcessor = function(name, handler) {
+MultiplexedProcessor.prototype.registerProcessor = function (name, handler) {
   this.services[name] = handler;
 };
 
-MultiplexedProcessor.prototype.process = function(inp, out) {
+MultiplexedProcessor.prototype.process = function (inp, out) {
   var begin = inp.readMessageBegin();
 
-  if (begin.mtype != Thrift.MessageType.CALL && begin.mtype != Thrift.MessageType.ONEWAY) {
-    throw new Thrift.TException('TMultiplexedProcessor: Unexpected message type');
+  if (
+    begin.mtype != Thrift.MessageType.CALL &&
+    begin.mtype != Thrift.MessageType.ONEWAY
+  ) {
+    throw new Thrift.TException(
+      "TMultiplexedProcessor: Unexpected message type",
+    );
   }
 
-  var p = begin.fname.split(':');
+  var p = begin.fname.split(":");
   var sname = p[0];
   var fname = p[1];
 
-  if (! (sname in this.services)) {
-    throw new Thrift.TException('TMultiplexedProcessor: Unknown service: ' + sname);
+  if (!(sname in this.services)) {
+    throw new Thrift.TException(
+      "TMultiplexedProcessor: Unknown service: " + sname,
+    );
   }
 
   //construct a proxy object which stubs the readMessageBegin
@@ -51,11 +58,11 @@
     inpProxy[attr] = inp[attr];
   }
 
-  inpProxy.readMessageBegin = function() {
+  inpProxy.readMessageBegin = function () {
     return {
       fname: fname,
       mtype: begin.mtype,
-      rseqid: begin.rseqid
+      rseqid: begin.rseqid,
     };
   };
 
diff --git a/lib/nodejs/lib/thrift/multiplexed_protocol.js b/lib/nodejs/lib/thrift/multiplexed_protocol.js
index d078aa2..1d2df96 100644
--- a/lib/nodejs/lib/thrift/multiplexed_protocol.js
+++ b/lib/nodejs/lib/thrift/multiplexed_protocol.js
@@ -16,55 +16,69 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var util = require('util');
-var Thrift = require('./thrift');
+var util = require("util");
+var Thrift = require("./thrift");
 
 exports.Multiplexer = Multiplexer;
 
 function Wrapper(serviceName, protocol, connection) {
-
   function MultiplexProtocol(trans, strictRead, strictWrite) {
     protocol.call(this, trans, strictRead, strictWrite);
-  };
+  }
 
   util.inherits(MultiplexProtocol, protocol);
 
-  MultiplexProtocol.prototype.writeMessageBegin = function(name, type, seqid) {
+  MultiplexProtocol.prototype.writeMessageBegin = function (name, type, seqid) {
     if (type == Thrift.MessageType.CALL || type == Thrift.MessageType.ONEWAY) {
       connection.seqId2Service[seqid] = serviceName;
-      MultiplexProtocol.super_.prototype.writeMessageBegin.call(this,
-                                                                serviceName + ":" + name,
-                                                                type,
-                                                                seqid);
+      MultiplexProtocol.super_.prototype.writeMessageBegin.call(
+        this,
+        serviceName + ":" + name,
+        type,
+        seqid,
+      );
     } else {
-      MultiplexProtocol.super_.prototype.writeMessageBegin.call(this, name, type, seqid);
+      MultiplexProtocol.super_.prototype.writeMessageBegin.call(
+        this,
+        name,
+        type,
+        seqid,
+      );
     }
   };
 
   return MultiplexProtocol;
-};
+}
 
 function Multiplexer() {
   this.seqid = 0;
-};
+}
 
-Multiplexer.prototype.createClient = function(serviceName, ServiceClient, connection) {
+Multiplexer.prototype.createClient = function (
+  serviceName,
+  ServiceClient,
+  connection,
+) {
   if (ServiceClient.Client) {
     ServiceClient = ServiceClient.Client;
   }
-  var writeCb = function(buf, seqid) {
-    connection.write(buf,seqid);
+  var writeCb = function (buf, seqid) {
+    connection.write(buf, seqid);
   };
   var transport = new connection.transport(undefined, writeCb);
-  var protocolWrapper = new Wrapper(serviceName, connection.protocol, connection);
+  var protocolWrapper = new Wrapper(
+    serviceName,
+    connection.protocol,
+    connection,
+  );
   var client = new ServiceClient(transport, protocolWrapper);
   var self = this;
-  client.new_seqid = function() {
+  client.new_seqid = function () {
     self.seqid += 1;
     return self.seqid;
   };
 
-  if (typeof connection.client !== 'object') {
+  if (typeof connection.client !== "object") {
     connection.client = {};
   }
   connection.client[serviceName] = client;
diff --git a/lib/nodejs/lib/thrift/ohos_connection.js b/lib/nodejs/lib/thrift/ohos_connection.js
index 95bf122..34afaae 100644
--- a/lib/nodejs/lib/thrift/ohos_connection.js
+++ b/lib/nodejs/lib/thrift/ohos_connection.js
@@ -16,15 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var util = require('util');
-var EventEmitter = require('events').EventEmitter;
-var thrift = require('./thrift');
+var util = require("util");
+var EventEmitter = require("events").EventEmitter;
+var thrift = require("./thrift");
 
-var TBufferedTransport = require('./buffered_transport');
-var TBinaryProtocol = require('./binary_protocol');
-var InputBufferUnderrunError = require('./input_buffer_underrun_error');
+var TBufferedTransport = require("./buffered_transport");
+var TBinaryProtocol = require("./binary_protocol");
+var InputBufferUnderrunError = require("./input_buffer_underrun_error");
 
-var createClient = require('./create_client');
+var createClient = require("./create_client");
 
 /**
  * @class
@@ -69,7 +69,7 @@
  *     semantics implemented over the OpenHarmonyOS http.request() method.
  * @see {@link createOhosConnection}
  */
-var OhosConnection = exports.OhosConnection = function(options) {
+var OhosConnection = (exports.OhosConnection = function (options) {
   //Initialize the emitter base object
   EventEmitter.call(this);
 
@@ -78,12 +78,12 @@
   this.options = options || {};
   this.host = this.options.host;
   this.port = this.options.port;
-  this.path = this.options.path || '/';
+  this.path = this.options.path || "/";
   //OpenHarmonyOS needs URL for initiating an HTTP request.
   this.url =
     this.port === 80
-      ? this.host.replace(/\/$/, '') + this.path
-      : this.host.replace(/\/$/, '') + ':' + this.port + this.path;
+      ? this.host.replace(/\/$/, "") + this.path
+      : this.host.replace(/\/$/, "") + ":" + this.port + this.path;
   this.transport = this.options.transport || TBufferedTransport;
   this.protocol = this.options.protocol || TBinaryProtocol;
   //Inherit method from OpenHarmonyOS HTTP module
@@ -91,17 +91,17 @@
 
   //Prepare HTTP request options
   this.requestOptions = {
-    method: 'POST',
+    method: "POST",
     header: this.options.header || {},
     readTimeout: this.options.readTimeout || 60000,
-    connectTimeout: this.options.connectTimeout || 60000
+    connectTimeout: this.options.connectTimeout || 60000,
   };
   for (var attrname in this.options.requestOptions) {
     this.requestOptions[attrname] = this.options.requestOptions[attrname];
   }
   /*jshint -W069 */
-  if (!this.requestOptions.header['Connection']) {
-    this.requestOptions.header['Connection'] = 'keep-alive';
+  if (!this.requestOptions.header["Connection"]) {
+    this.requestOptions.header["Connection"] = "keep-alive";
   }
   /*jshint +W069 */
 
@@ -134,60 +134,61 @@
           delete self.seqId2Service[header.rseqid];
         }
         /*jshint -W083 */
-        client._reqs[dummy_seqid] = function(err, success){
+        client._reqs[dummy_seqid] = function (err, success) {
           transport_with_data.commitPosition();
           var clientCallback = client._reqs[header.rseqid];
           delete client._reqs[header.rseqid];
           if (clientCallback) {
-            process.nextTick(function() {
+            process.nextTick(function () {
               clientCallback(err, success);
             });
           }
         };
         /*jshint +W083 */
-        if(client['recv_' + header.fname]) {
-          client['recv_' + header.fname](proto, header.mtype, dummy_seqid);
+        if (client["recv_" + header.fname]) {
+          client["recv_" + header.fname](proto, header.mtype, dummy_seqid);
         } else {
           delete client._reqs[dummy_seqid];
-          self.emit("error",
-                    new thrift.TApplicationException(
-                       thrift.TApplicationExceptionType.WRONG_METHOD_NAME,
-                       "Received a response to an unknown RPC function"));
+          self.emit(
+            "error",
+            new thrift.TApplicationException(
+              thrift.TApplicationExceptionType.WRONG_METHOD_NAME,
+              "Received a response to an unknown RPC function",
+            ),
+          );
         }
       }
-    }
-    catch (e) {
+    } catch (e) {
       if (e instanceof InputBufferUnderrunError) {
         transport_with_data.rollbackPosition();
       } else {
-        self.emit('error', e);
+        self.emit("error", e);
       }
     }
   }
 
-
   //Response handler
   //////////////////////////////////////////////////
-  this.responseCallback = function(error, response) {
+  this.responseCallback = function (error, response) {
     //Response will be a struct like:
     // https://developer.harmonyos.com/en/docs/documentation/doc-references/js-apis-net-http-0000001168304341#section15920192914312
     var data = [];
     var dataLen = 0;
 
     if (error) {
-      self.emit('error', error);
+      self.emit("error", error);
       return;
     }
 
     if (!response || response.responseCode !== 200) {
-      self.emit('error', new THTTPException(response));
+      self.emit("error", new THTTPException(response));
     }
 
     // With OpenHarmonyOS running in a Browser (e.g. Browserify), chunk
     // will be a string or an ArrayBuffer.
     if (
-      typeof response.result == 'string' ||
-      Object.prototype.toString.call(response.result) == '[object Uint8Array]'
+      typeof response.result == "string" ||
+      Object.prototype.toString.call(response.result) == "[object Uint8Array]"
     ) {
       // Wrap ArrayBuffer/string in a Buffer so data[i].copy will work
       data.push(Buffer.from(response.result));
@@ -211,7 +212,7 @@
    * @event {error} the "error" event is raised upon request failure passing the
    *     Node.js error object to the listener.
    */
-  this.write = function(data) {
+  this.write = function (data) {
     //To initiate multiple HTTP requests, we must create an HttpRequest object
     // for each HTTP request
     var http = self.createHttp();
@@ -223,7 +224,7 @@
     opts.extraData = data.toString();
     http.request(self.url, opts, self.responseCallback);
   };
-};
+});
 util.inherits(OhosConnection, EventEmitter);
 
 /**
@@ -236,7 +237,7 @@
  * @returns {OhosConnection} The connection object.
  * @see {@link ConnectOptions}
  */
-exports.createOhosConnection = function(createHttp, host, port, options) {
+exports.createOhosConnection = function (createHttp, host, port, options) {
   options.createHttp = createHttp;
   options.host = host;
   options.port = port || 80;
@@ -256,6 +257,6 @@
   this.response = response;
   this.type = thrift.TApplicationExceptionType.PROTOCOL_ERROR;
   this.message =
-    'Received a response with a bad HTTP status code: ' + response.responseCode;
+    "Received a response with a bad HTTP status code: " + response.responseCode;
 }
 util.inherits(THTTPException, thrift.TApplicationException);
diff --git a/lib/nodejs/lib/thrift/protocol.js b/lib/nodejs/lib/thrift/protocol.js
index a70ebe2..6eb88da 100644
--- a/lib/nodejs/lib/thrift/protocol.js
+++ b/lib/nodejs/lib/thrift/protocol.js
@@ -17,6 +17,6 @@
  * under the License.
  */
 
-module.exports.TBinaryProtocol = require('./binary_protocol');
-module.exports.TCompactProtocol = require('./compact_protocol');
-module.exports.TJSONProtocol = require('./json_protocol');
+module.exports.TBinaryProtocol = require("./binary_protocol");
+module.exports.TCompactProtocol = require("./compact_protocol");
+module.exports.TJSONProtocol = require("./json_protocol");
diff --git a/lib/nodejs/lib/thrift/server.js b/lib/nodejs/lib/thrift/server.js
index 16b74ea..80a369f 100644
--- a/lib/nodejs/lib/thrift/server.js
+++ b/lib/nodejs/lib/thrift/server.js
@@ -17,14 +17,14 @@
  * under the License.
  */
 
-var constants = require('constants');
-var net = require('net');
-var tls = require('tls');
+var constants = require("constants");
+var net = require("net");
+var tls = require("tls");
 
-var TBufferedTransport = require('./buffered_transport');
-var TBinaryProtocol = require('./binary_protocol');
-var THeaderProtocol = require('./header_protocol');
-var InputBufferUnderrunError = require('./input_buffer_underrun_error');
+var TBufferedTransport = require("./buffered_transport");
+var TBinaryProtocol = require("./binary_protocol");
+var THeaderProtocol = require("./header_protocol");
+var InputBufferUnderrunError = require("./input_buffer_underrun_error");
 
 /**
  * Create a Thrift server which can serve one or multiple services.
@@ -33,75 +33,82 @@
  * @param {ServerOptions} options - Optional additional server configuration.
  * @returns {object} - The Apache Thrift Multiplex Server.
  */
-exports.createMultiplexServer = function(processor, options) {
-  var transport = (options && options.transport) ? options.transport : TBufferedTransport;
-  var protocol = (options && options.protocol) ? options.protocol : TBinaryProtocol;
+exports.createMultiplexServer = function (processor, options) {
+  var transport =
+    options && options.transport ? options.transport : TBufferedTransport;
+  var protocol =
+    options && options.protocol ? options.protocol : TBinaryProtocol;
 
   function serverImpl(stream) {
     var self = this;
-    stream.on('error', function(err) {
-        self.emit('error', err);
+    stream.on("error", function (err) {
+      self.emit("error", err);
     });
-    stream.on('data', transport.receiver(function(transportWithData) {
-      var input = new protocol(transportWithData);
-      var outputCb = function(buf) {
-        try {
+    stream.on(
+      "data",
+      transport.receiver(function (transportWithData) {
+        var input = new protocol(transportWithData);
+        var outputCb = function (buf) {
+          try {
             stream.write(buf);
-        } catch (err) {
-            self.emit('error', err);
+          } catch (err) {
+            self.emit("error", err);
             stream.end();
-        }
-      };
+          }
+        };
 
-      var output = new protocol(new transport(undefined, outputCb));
-      // Read and write need to be performed on the same transport
-      // for THeaderProtocol because we should only respond with
-      // headers if the request contains headers
-      if (protocol === THeaderProtocol) {
-        output = input;
-        output.trans.onFlush = outputCb;
-      }
+        var output = new protocol(new transport(undefined, outputCb));
+        // Read and write need to be performed on the same transport
+        // for THeaderProtocol because we should only respond with
+        // headers if the request contains headers
+        if (protocol === THeaderProtocol) {
+          output = input;
+          output.trans.onFlush = outputCb;
+        }
 
-      try {
-        do {
-          processor.process(input, output);
-          transportWithData.commitPosition();
-        } while (true);
-      } catch (err) {
-        if (err instanceof InputBufferUnderrunError) {
-          //The last data in the buffer was not a complete message, wait for the rest
-          transportWithData.rollbackPosition();
+        try {
+          do {
+            processor.process(input, output);
+            transportWithData.commitPosition();
+          } while (true);
+        } catch (err) {
+          if (err instanceof InputBufferUnderrunError) {
+            //The last data in the buffer was not a complete message, wait for the rest
+            transportWithData.rollbackPosition();
+          } else if (err.message === "Invalid type: undefined") {
+            //No more data in the buffer
+            //This trap is a bit hackish
+            //The next step to improve the node behavior here is to have
+            //  the compiler generated process method throw a more explicit
+            //  error when the network buffer is empty (regardles of the
+            //  protocol/transport stack in use) and replace this heuristic.
+            //  Also transports should probably not force upper layers to
+            //  manage their buffer positions (i.e. rollbackPosition() and
+            //  commitPosition() should be eliminated in lieu of a transport
+            //  encapsulated buffer management strategy.)
+            transportWithData.rollbackPosition();
+          } else {
+            //Unexpected error
+            self.emit("error", err);
+            stream.end();
+          }
         }
-        else if (err.message === "Invalid type: undefined") {
-          //No more data in the buffer
-          //This trap is a bit hackish
-          //The next step to improve the node behavior here is to have
-          //  the compiler generated process method throw a more explicit
-          //  error when the network buffer is empty (regardles of the
-          //  protocol/transport stack in use) and replace this heuristic.
-          //  Also transports should probably not force upper layers to
-          //  manage their buffer positions (i.e. rollbackPosition() and
-          //  commitPosition() should be eliminated in lieu of a transport
-          //  encapsulated buffer management strategy.)
-          transportWithData.rollbackPosition();
-        }
-        else {
-          //Unexpected error
-          self.emit('error', err);
-          stream.end();
-        }
-      }
-    }));
+      }),
+    );
 
-    stream.on('end', function() {
+    stream.on("end", function () {
       stream.end();
     });
   }
 
   if (options && options.tls) {
-    if (!('secureProtocol' in options.tls) && !('secureOptions' in options.tls)) {
+    if (
+      !("secureProtocol" in options.tls) &&
+      !("secureOptions" in options.tls)
+    ) {
       options.tls.secureProtocol = "SSLv23_method";
-      options.tls.secureOptions = constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3;
+      options.tls.secureOptions =
+        constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_SSLv3;
     }
     return tls.createServer(options.tls, serverImpl);
   } else {
@@ -115,7 +122,7 @@
  * @param {ServerOptions} options - Optional additional server configuration.
  * @returns {object} - The Apache Thrift Multiplex Server.
  */
-exports.createServer = function(processor, handler, options) {
+exports.createServer = function (processor, handler, options) {
   if (processor.Processor) {
     processor = processor.Processor;
   }
diff --git a/lib/nodejs/lib/thrift/thrift.js b/lib/nodejs/lib/thrift/thrift.js
index 3a693f6..741a493 100644
--- a/lib/nodejs/lib/thrift/thrift.js
+++ b/lib/nodejs/lib/thrift/thrift.js
@@ -16,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var util = require('util');
+var util = require("util");
 
-var Type = exports.Type = {
+var Type = (exports.Type = {
   STOP: 0,
   VOID: 1,
   BOOL: 2,
@@ -35,14 +35,14 @@
   SET: 14,
   LIST: 15,
   UTF8: 16,
-  UTF16: 17
-};
+  UTF16: 17,
+});
 
 exports.MessageType = {
   CALL: 1,
   REPLY: 2,
   EXCEPTION: 3,
-  ONEWAY: 4
+  ONEWAY: 4,
 };
 
 exports.TException = TException;
@@ -55,10 +55,10 @@
 
   this.name = this.constructor.name;
   this.message = message;
-};
+}
 util.inherits(TException, Error);
 
-var TApplicationExceptionType = exports.TApplicationExceptionType = {
+var TApplicationExceptionType = (exports.TApplicationExceptionType = {
   UNKNOWN: 0,
   UNKNOWN_METHOD: 1,
   INVALID_MESSAGE_TYPE: 2,
@@ -69,8 +69,8 @@
   PROTOCOL_ERROR: 7,
   INVALID_TRANSFORM: 8,
   INVALID_PROTOCOL: 9,
-  UNSUPPORTED_CLIENT_TYPE: 10
-};
+  UNSUPPORTED_CLIENT_TYPE: 10,
+});
 
 exports.TApplicationException = TApplicationException;
 
@@ -83,73 +83,73 @@
   this.type = type || TApplicationExceptionType.UNKNOWN;
   this.name = this.constructor.name;
   this.message = message;
-};
+}
 util.inherits(TApplicationException, TException);
 
-TApplicationException.prototype[Symbol.for("read")] = TApplicationException.prototype.read = function(input) {
-  var ftype;
-  var ret = input.readStructBegin('TApplicationException');
+TApplicationException.prototype[Symbol.for("read")] =
+  TApplicationException.prototype.read = function (input) {
+    var ftype;
+    var ret = input.readStructBegin("TApplicationException");
 
-  while(1){
+    while (1) {
       ret = input.readFieldBegin();
-      if(ret.ftype == Type.STOP)
-          break;
+      if (ret.ftype == Type.STOP) break;
 
-      switch(ret.fid){
-          case 1:
-              if( ret.ftype == Type.STRING ){
-                  ret = input.readString();
-                  this.message = ret;
-              } else {
-                  ret = input.skip(ret.ftype);
-              }
-              break;
-          case 2:
-              if( ret.ftype == Type.I32 ){
-                  ret = input.readI32();
-                  this.type = ret;
-              } else {
-                  ret   = input.skip(ret.ftype);
-              }
-              break;
-          default:
-              ret = input.skip(ret.ftype);
-              break;
+      switch (ret.fid) {
+        case 1:
+          if (ret.ftype == Type.STRING) {
+            ret = input.readString();
+            this.message = ret;
+          } else {
+            ret = input.skip(ret.ftype);
+          }
+          break;
+        case 2:
+          if (ret.ftype == Type.I32) {
+            ret = input.readI32();
+            this.type = ret;
+          } else {
+            ret = input.skip(ret.ftype);
+          }
+          break;
+        default:
+          ret = input.skip(ret.ftype);
+          break;
       }
       input.readFieldEnd();
-  }
-  input.readStructEnd();
-};
+    }
+    input.readStructEnd();
+  };
 
-TApplicationException.prototype[Symbol.for("write")] = TApplicationException.prototype.write = function(output){
-  output.writeStructBegin('TApplicationException');
+TApplicationException.prototype[Symbol.for("write")] =
+  TApplicationException.prototype.write = function (output) {
+    output.writeStructBegin("TApplicationException");
 
-  if (this.message) {
-      output.writeFieldBegin('message', Type.STRING, 1);
+    if (this.message) {
+      output.writeFieldBegin("message", Type.STRING, 1);
       output.writeString(this.message);
       output.writeFieldEnd();
-  }
+    }
 
-  if (this.code) {
-      output.writeFieldBegin('type', Type.I32, 2);
+    if (this.code) {
+      output.writeFieldBegin("type", Type.I32, 2);
       output.writeI32(this.code);
       output.writeFieldEnd();
-  }
+    }
 
-  output.writeFieldStop();
-  output.writeStructEnd();
-};
+    output.writeFieldStop();
+    output.writeStructEnd();
+  };
 
-var TProtocolExceptionType = exports.TProtocolExceptionType = {
+var TProtocolExceptionType = (exports.TProtocolExceptionType = {
   UNKNOWN: 0,
   INVALID_DATA: 1,
   NEGATIVE_SIZE: 2,
   SIZE_LIMIT: 3,
   BAD_VERSION: 4,
   NOT_IMPLEMENTED: 5,
-  DEPTH_LIMIT: 6
-};
-
+  DEPTH_LIMIT: 6,
+});
 
 exports.TProtocolException = TProtocolException;
 
@@ -162,74 +162,74 @@
   this.name = this.constructor.name;
   this.type = type;
   this.message = message;
-};
+}
 util.inherits(TProtocolException, Error);
 
-exports.objectLength = function(obj) {
+exports.objectLength = function (obj) {
   return Object.keys(obj).length;
 };
 
-exports.inherits = function(constructor, superConstructor) {
+exports.inherits = function (constructor, superConstructor) {
   util.inherits(constructor, superConstructor);
 };
 
 var copyList, copyMap;
 
-copyList = function(lst, types) {
-
-  if (!lst) {return lst; }
+copyList = function (lst, types) {
+  if (!lst) {
+    return lst;
+  }
 
   var type;
 
   if (types.shift === undefined) {
     type = types;
-  }
-  else {
+  } else {
     type = types[0];
   }
   var Type = type;
 
-  var len = lst.length, result = [], i, val;
+  var len = lst.length,
+    result = [],
+    i,
+    val;
   for (i = 0; i < len; i++) {
     val = lst[i];
     if (type === null) {
       result.push(val);
-    }
-    else if (type === copyMap || type === copyList) {
+    } else if (type === copyMap || type === copyList) {
       result.push(type(val, types.slice(1)));
-    }
-    else {
+    } else {
       result.push(new Type(val));
     }
   }
   return result;
 };
 
-copyMap = function(obj, types){
-
-  if (!obj) {return obj; }
+copyMap = function (obj, types) {
+  if (!obj) {
+    return obj;
+  }
 
   var type;
 
   if (types.shift === undefined) {
     type = types;
-  }
-  else {
+  } else {
     type = types[0];
   }
   var Type = type;
 
-  var result = {}, val;
-  for(var prop in obj) {
-    if(obj.hasOwnProperty(prop)) {
+  var result = {},
+    val;
+  for (var prop in obj) {
+    if (obj.hasOwnProperty(prop)) {
       val = obj[prop];
       if (type === null) {
         result[prop] = val;
-      }
-      else if (type === copyMap || type === copyList) {
+      } else if (type === copyMap || type === copyList) {
         result[prop] = type(val, types.slice(1));
-      }
-      else {
+      } else {
         result[prop] = new Type(val);
       }
     }
diff --git a/lib/nodejs/lib/thrift/transport.js b/lib/nodejs/lib/thrift/transport.js
index 59daa98..b3ba394 100644
--- a/lib/nodejs/lib/thrift/transport.js
+++ b/lib/nodejs/lib/thrift/transport.js
@@ -17,6 +17,6 @@
  * under the License.
  */
 
-module.exports.TBufferedTransport = require('./buffered_transport');
-module.exports.TFramedTransport = require('./framed_transport');
-module.exports.InputBufferUnderrunError = require('./input_buffer_underrun_error');
+module.exports.TBufferedTransport = require("./buffered_transport");
+module.exports.TFramedTransport = require("./framed_transport");
+module.exports.InputBufferUnderrunError = require("./input_buffer_underrun_error");
diff --git a/lib/nodejs/lib/thrift/web_server.js b/lib/nodejs/lib/thrift/web_server.js
index a33f47a..f49f654 100644
--- a/lib/nodejs/lib/thrift/web_server.js
+++ b/lib/nodejs/lib/thrift/web_server.js
@@ -16,19 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var http = require('http');
-var https = require('https');
+var http = require("http");
+var https = require("https");
 var url = require("url");
 var path = require("path");
 var fs = require("fs");
 var crypto = require("crypto");
-var log = require('./log');
+var log = require("./log");
 
-var MultiplexedProcessor = require('./multiplexed_processor').MultiplexedProcessor;
+var MultiplexedProcessor =
+  require("./multiplexed_processor").MultiplexedProcessor;
 
-var TBufferedTransport = require('./buffered_transport');
-var TBinaryProtocol = require('./binary_protocol');
-var InputBufferUnderrunError = require('./input_buffer_underrun_error');
+var TBufferedTransport = require("./buffered_transport");
+var TBinaryProtocol = require("./binary_protocol");
+var InputBufferUnderrunError = require("./input_buffer_underrun_error");
 
 // WSFrame constructor and prototype
 /////////////////////////////////////////////////////////////////////
@@ -82,36 +83,43 @@
    * @param {Boolean} binEncoding - True for binary encoding, false for text encoding
    * @returns {Buffer} - The WebSocket frame, ready to send
    */
-  encode: function(data, mask, binEncoding) {
-      var frame = new Buffer(wsFrame.frameSizeFromData(data, mask));
-      //Byte 0 - FIN & OPCODE
-      frame[0] = wsFrame.fin.FIN +
-          (binEncoding ? wsFrame.frameOpCodes.BIN : wsFrame.frameOpCodes.TEXT);
-      //Byte 1 or 1-3 or 1-9 - MASK FLAG & SIZE
-      var payloadOffset = 2;
-      if (data.length < 0x7E) {
-        frame[1] = data.length + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT);
-      } else if (data.length < 0xFFFF) {
-        frame[1] = 0x7E + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT);
-        frame.writeUInt16BE(data.length, 2, true);
-        payloadOffset = 4;
-      } else {
-        frame[1] = 0x7F + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT);
-        frame.writeUInt32BE(0, 2, true);
-        frame.writeUInt32BE(data.length, 6, true);
-        payloadOffset = 10;
-      }
-      //MASK
-      if (mask) {
-        mask.copy(frame, payloadOffset, 0, 4);
-        payloadOffset += 4;
-      }
-      //Payload
-      data.copy(frame, payloadOffset);
-      if (mask) {
-        wsFrame.applyMask(frame.slice(payloadOffset), frame.slice(payloadOffset-4,payloadOffset));
-      }
-      return frame;
+  encode: function (data, mask, binEncoding) {
+    var frame = new Buffer(wsFrame.frameSizeFromData(data, mask));
+    //Byte 0 - FIN & OPCODE
+    frame[0] =
+      wsFrame.fin.FIN +
+      (binEncoding ? wsFrame.frameOpCodes.BIN : wsFrame.frameOpCodes.TEXT);
+    //Byte 1 or 1-3 or 1-9 - MASK FLAG & SIZE
+    var payloadOffset = 2;
+    if (data.length < 0x7e) {
+      frame[1] =
+        data.length + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT);
+    } else if (data.length < 0xffff) {
+      frame[1] =
+        0x7e + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT);
+      frame.writeUInt16BE(data.length, 2, true);
+      payloadOffset = 4;
+    } else {
+      frame[1] =
+        0x7f + (mask ? wsFrame.mask.TO_SERVER : wsFrame.mask.TO_CLIENT);
+      frame.writeUInt32BE(0, 2, true);
+      frame.writeUInt32BE(data.length, 6, true);
+      payloadOffset = 10;
+    }
+    //MASK
+    if (mask) {
+      mask.copy(frame, payloadOffset, 0, 4);
+      payloadOffset += 4;
+    }
+    //Payload
+    data.copy(frame, payloadOffset);
+    if (mask) {
+      wsFrame.applyMask(
+        frame.slice(payloadOffset),
+        frame.slice(payloadOffset - 4, payloadOffset),
+      );
+    }
+    return frame;
   },
 
   /**
@@ -127,7 +135,7 @@
    * @property {Boolean} FIN - True is the message is complete
    */
 
-   /** Decodes a WebSocket frame
+  /** Decodes a WebSocket frame
    *
    * @param {Buffer} frame - The raw inbound frame, if this is a continuation
    *                         frame it must have a mask property with the mask.
@@ -135,54 +143,55 @@
    *
    * @see {@link WSDecodeResult}
    */
-  decode: function(frame) {
-      var result = {
-        data: null,
-        mask: null,
-        binEncoding: false,
-        nextFrame: null,
-        FIN: true
-      };
+  decode: function (frame) {
+    var result = {
+      data: null,
+      mask: null,
+      binEncoding: false,
+      nextFrame: null,
+      FIN: true,
+    };
 
-      //Byte 0 - FIN & OPCODE
-      if (wsFrame.fin.FIN != (frame[0] & wsFrame.fin.FIN)) {
-        result.FIN = false;
-      }
-      result.binEncoding = (wsFrame.frameOpCodes.BIN == (frame[0] & wsFrame.frameOpCodes.BIN));
-      //Byte 1 or 1-3 or 1-9 - SIZE
-      var lenByte = (frame[1] & 0x0000007F);
-      var len = lenByte;
-      var dataOffset = 2;
-      if (lenByte == 0x7E) {
-        len = frame.readUInt16BE(2);
-        dataOffset = 4;
-      } else if (lenByte == 0x7F) {
-        len = frame.readUInt32BE(6);
-        dataOffset = 10;
-      }
-      //MASK
-      if (wsFrame.mask.TO_SERVER == (frame[1] & wsFrame.mask.TO_SERVER)) {
-        result.mask = new Buffer(4);
-        frame.copy(result.mask, 0, dataOffset, dataOffset + 4);
-        dataOffset += 4;
-      }
-      //Payload
-      result.data = new Buffer(len);
-      frame.copy(result.data, 0, dataOffset, dataOffset+len);
-      if (result.mask) {
-        wsFrame.applyMask(result.data, result.mask);
-      }
-      //Next Frame
-      if (frame.length > dataOffset+len) {
-        result.nextFrame = new Buffer(frame.length - (dataOffset+len));
-        frame.copy(result.nextFrame, 0, dataOffset+len, frame.length);
-      }
-      //Don't forward control frames
-      if (frame[0] & wsFrame.frameOpCodes.FINCTRL) {
-        result.data = null;
-      }
+    //Byte 0 - FIN & OPCODE
+    if (wsFrame.fin.FIN != (frame[0] & wsFrame.fin.FIN)) {
+      result.FIN = false;
+    }
+    result.binEncoding =
+      wsFrame.frameOpCodes.BIN == (frame[0] & wsFrame.frameOpCodes.BIN);
+    //Byte 1 or 1-3 or 1-9 - SIZE
+    var lenByte = frame[1] & 0x0000007f;
+    var len = lenByte;
+    var dataOffset = 2;
+    if (lenByte == 0x7e) {
+      len = frame.readUInt16BE(2);
+      dataOffset = 4;
+    } else if (lenByte == 0x7f) {
+      len = frame.readUInt32BE(6);
+      dataOffset = 10;
+    }
+    //MASK
+    if (wsFrame.mask.TO_SERVER == (frame[1] & wsFrame.mask.TO_SERVER)) {
+      result.mask = new Buffer(4);
+      frame.copy(result.mask, 0, dataOffset, dataOffset + 4);
+      dataOffset += 4;
+    }
+    //Payload
+    result.data = new Buffer(len);
+    frame.copy(result.data, 0, dataOffset, dataOffset + len);
+    if (result.mask) {
+      wsFrame.applyMask(result.data, result.mask);
+    }
+    //Next Frame
+    if (frame.length > dataOffset + len) {
+      result.nextFrame = new Buffer(frame.length - (dataOffset + len));
+      frame.copy(result.nextFrame, 0, dataOffset + len, frame.length);
+    }
+    //Don't forward control frames
+    if (frame[0] & wsFrame.frameOpCodes.FINCTRL) {
+      result.data = null;
+    }
 
-      return result;
+    return result;
   },
 
   /** Masks/Unmasks data
@@ -190,12 +199,12 @@
    * @param {Buffer} data - data to mask/unmask in place
    * @param {Buffer} mask - the mask
    */
-  applyMask: function(data, mask){
+  applyMask: function (data, mask) {
     //TODO: look into xoring words at a time
     var dataLen = data.length;
     var maskLen = mask.length;
     for (var i = 0; i < dataLen; i++) {
-      data[i] = data[i] ^ mask[i%maskLen];
+      data[i] = data[i] ^ mask[i % maskLen];
     }
   },
 
@@ -204,35 +213,34 @@
    * @param {Buffer} data - data.length is the assumed payload size
    * @param {Boolean} mask - true if a mask will be sent (TO_SERVER)
    */
-  frameSizeFromData: function(data, mask) {
+  frameSizeFromData: function (data, mask) {
     var headerSize = 10;
-    if (data.length < 0x7E) {
+    if (data.length < 0x7e) {
       headerSize = 2;
-    } else if (data.length < 0xFFFF) {
+    } else if (data.length < 0xffff) {
       headerSize = 4;
     }
     return headerSize + data.length + (mask ? 4 : 0);
   },
 
   frameOpCodes: {
-    CONT:     0x00,
-    TEXT:     0x01,
-    BIN:      0x02,
-    CTRL:     0x80
+    CONT: 0x00,
+    TEXT: 0x01,
+    BIN: 0x02,
+    CTRL: 0x80,
   },
 
   mask: {
     TO_SERVER: 0x80,
-    TO_CLIENT: 0x00
+    TO_CLIENT: 0x00,
   },
 
   fin: {
     CONT: 0x00,
-    FIN: 0x80
-  }
+    FIN: 0x80,
+  },
 };
 
-
 // createWebServer constructor and options
 /////////////////////////////////////////////////////////////////////
 
@@ -272,20 +280,20 @@
  * @param {ServerOptions} options - The server configuration.
  * @returns {object} - The Apache Thrift Web Server.
  */
-exports.createWebServer = function(options) {
+exports.createWebServer = function (options) {
   var baseDir = options.files;
   var contentTypesByExtension = {
-    '.txt': 'text/plain',
-    '.html': 'text/html',
-    '.css': 'text/css',
-    '.xml': 'application/xml',
-    '.json': 'application/json',
-    '.js': 'application/javascript',
-    '.jpg': 'image/jpeg',
-    '.jpeg': 'image/jpeg',
-    '.gif': 'image/gif',
-    '.png': 'image/png',
-    '.svg': 'image/svg+xml'
+    ".txt": "text/plain",
+    ".html": "text/html",
+    ".css": "text/css",
+    ".xml": "application/xml",
+    ".json": "application/json",
+    ".js": "application/javascript",
+    ".jpg": "image/jpeg",
+    ".jpeg": "image/jpeg",
+    ".gif": "image/gif",
+    ".png": "image/png",
+    ".svg": "image/svg+xml",
   };
 
   //Setup all of the services
@@ -302,8 +310,9 @@
       //  IDL Compiler generated class housing the processor. Also, the options property
       //  for a Processor has been called both cls and processor at different times. We
       //  support any of the four possibilities here.
-      var processor = (svcObj.processor) ? (svcObj.processor.Processor || svcObj.processor) :
-                                           (svcObj.cls.Processor || svcObj.cls);
+      var processor = svcObj.processor
+        ? svcObj.processor.Processor || svcObj.processor
+        : svcObj.cls.Processor || svcObj.cls;
       //Processors can be supplied as constructed objects with handlers already embedded,
       //  if a handler is provided we construct a new processor, if not we use the processor
       //  object directly
@@ -322,9 +331,18 @@
     if (request.headers.origin && options.cors) {
       if (options.cors["*"] || options.cors[request.headers.origin]) {
         //Allow, origin allowed
-        response.setHeader("access-control-allow-origin", request.headers.origin);
-        response.setHeader("access-control-allow-methods", "GET, POST, OPTIONS");
-        response.setHeader("access-control-allow-headers", "content-type, accept");
+        response.setHeader(
+          "access-control-allow-origin",
+          request.headers.origin,
+        );
+        response.setHeader(
+          "access-control-allow-methods",
+          "GET, POST, OPTIONS",
+        );
+        response.setHeader(
+          "access-control-allow-headers",
+          "content-type, accept",
+        );
         response.setHeader("access-control-max-age", "60");
         return true;
       } else {
@@ -336,19 +354,21 @@
     return true;
   }
 
-
   //Handle OPTIONS method (CORS)
   ///////////////////////////////////////////////////
   function processOptions(request, response) {
     if (VerifyCORSAndSetHeaders(request, response)) {
-      response.writeHead("204", "No Content", {"content-length": 0});
+      response.writeHead("204", "No Content", { "content-length": 0 });
     } else {
-      response.writeHead("403", "Origin " + request.headers.origin + " not allowed", {});
+      response.writeHead(
+        "403",
+        "Origin " + request.headers.origin + " not allowed",
+        {},
+      );
     }
     response.end();
   }
 
-
   //Handle POST methods (TXHRTransport)
   ///////////////////////////////////////////////////
   function processPost(request, response) {
@@ -363,39 +383,47 @@
 
     //Verify CORS requirements
     if (!VerifyCORSAndSetHeaders(request, response)) {
-      response.writeHead("403", "Origin " + request.headers.origin + " not allowed", {});
+      response.writeHead(
+        "403",
+        "Origin " + request.headers.origin + " not allowed",
+        {},
+      );
       response.end();
       return;
     }
 
     //Process XHR payload
-    request.on('data', svc.transport.receiver(function(transportWithData) {
-      var input = new svc.protocol(transportWithData);
-      var output = new svc.protocol(new svc.transport(undefined, function(buf) {
+    request.on(
+      "data",
+      svc.transport.receiver(function (transportWithData) {
+        var input = new svc.protocol(transportWithData);
+        var output = new svc.protocol(
+          new svc.transport(undefined, function (buf) {
+            try {
+              response.writeHead(200);
+              response.end(buf);
+            } catch (err) {
+              response.writeHead(500);
+              response.end();
+            }
+          }),
+        );
+
         try {
-          response.writeHead(200);
-          response.end(buf);
+          svc.processor.process(input, output);
+          transportWithData.commitPosition();
         } catch (err) {
-          response.writeHead(500);
-          response.end();
+          if (err instanceof InputBufferUnderrunError) {
+            transportWithData.rollbackPosition();
+          } else {
+            response.writeHead(500);
+            response.end();
+          }
         }
-      }));
-
-      try {
-        svc.processor.process(input, output);
-        transportWithData.commitPosition();
-      } catch (err) {
-        if (err instanceof InputBufferUnderrunError) {
-          transportWithData.rollbackPosition();
-        } else {
-          response.writeHead(500);
-          response.end();
-        }
-      }
-    }));
+      }),
+    );
   }
 
-
   //Handle GET methods (Static Page Server)
   ///////////////////////////////////////////////////
   function processGet(request, response) {
@@ -408,7 +436,11 @@
 
     //Verify CORS requirements
     if (!VerifyCORSAndSetHeaders(request, response)) {
-      response.writeHead("403", "Origin " + request.headers.origin + " not allowed", {});
+      response.writeHead(
+        "403",
+        "Origin " + request.headers.origin + " not allowed",
+        {},
+      );
       response.end();
       return;
     }
@@ -424,18 +456,18 @@
       return;
     }
 
-    fs.exists(filename, function(exists) {
-      if(!exists) {
+    fs.exists(filename, function (exists) {
+      if (!exists) {
         response.writeHead(404);
         response.end();
         return;
       }
 
       if (fs.statSync(filename).isDirectory()) {
-        filename += '/index.html';
+        filename += "/index.html";
       }
 
-      fs.readFile(filename, "binary", function(err, file) {
+      fs.readFile(filename, "binary", function (err, file) {
         if (err) {
           response.writeHead(500);
           response.end(err + "\n");
@@ -456,30 +488,29 @@
     });
   }
 
-
   //Handle WebSocket calls (TWebSocketTransport)
   ///////////////////////////////////////////////////
   function processWS(data, socket, svc, binEncoding) {
-    svc.transport.receiver(function(transportWithData) {
+    svc.transport.receiver(function (transportWithData) {
       var input = new svc.protocol(transportWithData);
-      var output = new svc.protocol(new svc.transport(undefined, function(buf) {
-        try {
-          var frame = wsFrame.encode(buf, null, binEncoding);
-          socket.write(frame);
-        } catch (err) {
-          //TODO: Add better error processing
-        }
-      }));
+      var output = new svc.protocol(
+        new svc.transport(undefined, function (buf) {
+          try {
+            var frame = wsFrame.encode(buf, null, binEncoding);
+            socket.write(frame);
+          } catch (err) {
+            //TODO: Add better error processing
+          }
+        }),
+      );
 
       try {
         svc.processor.process(input, output);
         transportWithData.commitPosition();
-      }
-      catch (err) {
+      } catch (err) {
         if (err instanceof InputBufferUnderrunError) {
           transportWithData.rollbackPosition();
-        }
-        else {
+        } else {
           //TODO: Add better error processing
         }
       }
@@ -498,69 +529,83 @@
   //   - GET static files,
   //   - POST XHR Thrift services
   //   - OPTIONS CORS requests
-  server.on('request', function(request, response) {
-    if (request.method === 'POST') {
-      processPost(request, response);
-    } else if (request.method === 'GET') {
-      processGet(request, response);
-    } else if (request.method === 'OPTIONS') {
-      processOptions(request, response);
-    } else {
-      response.writeHead(500);
-      response.end();
-    }
-  }).on('upgrade', function(request, socket, head) {
-    //Lookup service
-    var svc;
-    try {
-      svc = services[Object.keys(services)[0]];
-    } catch(e) {
-      socket.write("HTTP/1.1 403 No Apache Thrift Service available\r\n\r\n");
-      return;
-    }
-    //Perform upgrade
-    var hash = crypto.createHash("sha1");
-    hash.update(request.headers['sec-websocket-key'] + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
-    socket.write("HTTP/1.1 101 Switching Protocols\r\n" +
-                   "Upgrade: websocket\r\n" +
-                   "Connection: Upgrade\r\n" +
-                   "Sec-WebSocket-Accept: " + hash.digest("base64") + "\r\n" +
-                   "Sec-WebSocket-Origin: " + request.headers.origin + "\r\n" +
-                   "Sec-WebSocket-Location: ws://" + request.headers.host + request.url + "\r\n" +
-                   "\r\n");
-    //Handle WebSocket traffic
-    var data = null;
-    socket.on('data', function(frame) {
-      try {
-        while (frame) {
-          var result = wsFrame.decode(frame);
-          //Prepend any existing decoded data
-          if (data) {
-            if (result.data) {
-              var newData = new Buffer(data.length + result.data.length);
-              data.copy(newData);
-              result.data.copy(newData, data.length);
-              result.data = newData;
-            } else {
-              result.data = data;
-            }
-            data = null;
-          }
-          //If this completes a message process it
-          if (result.FIN) {
-            processWS(result.data, socket, svc, result.binEncoding);
-          } else {
-            data = result.data;
-          }
-          //Prepare next frame for decoding (if any)
-          frame = result.nextFrame;
-        }
-      } catch(e) {
-        log.error('TWebSocketTransport Exception: ' + e);
-        socket.destroy();
+  server
+    .on("request", function (request, response) {
+      if (request.method === "POST") {
+        processPost(request, response);
+      } else if (request.method === "GET") {
+        processGet(request, response);
+      } else if (request.method === "OPTIONS") {
+        processOptions(request, response);
+      } else {
+        response.writeHead(500);
+        response.end();
       }
+    })
+    .on("upgrade", function (request, socket, head) {
+      //Lookup service
+      var svc;
+      try {
+        svc = services[Object.keys(services)[0]];
+      } catch (e) {
+        socket.write("HTTP/1.1 403 No Apache Thrift Service available\r\n\r\n");
+        return;
+      }
+      //Perform upgrade
+      var hash = crypto.createHash("sha1");
+      hash.update(
+        request.headers["sec-websocket-key"] +
+          "258EAFA5-E914-47DA-95CA-C5AB0DC85B11",
+      );
+      socket.write(
+        "HTTP/1.1 101 Switching Protocols\r\n" +
+          "Upgrade: websocket\r\n" +
+          "Connection: Upgrade\r\n" +
+          "Sec-WebSocket-Accept: " +
+          hash.digest("base64") +
+          "\r\n" +
+          "Sec-WebSocket-Origin: " +
+          request.headers.origin +
+          "\r\n" +
+          "Sec-WebSocket-Location: ws://" +
+          request.headers.host +
+          request.url +
+          "\r\n" +
+          "\r\n",
+      );
+      //Handle WebSocket traffic
+      var data = null;
+      socket.on("data", function (frame) {
+        try {
+          while (frame) {
+            var result = wsFrame.decode(frame);
+            //Prepend any existing decoded data
+            if (data) {
+              if (result.data) {
+                var newData = new Buffer(data.length + result.data.length);
+                data.copy(newData);
+                result.data.copy(newData, data.length);
+                result.data = newData;
+              } else {
+                result.data = data;
+              }
+              data = null;
+            }
+            //If this completes a message process it
+            if (result.FIN) {
+              processWS(result.data, socket, svc, result.binEncoding);
+            } else {
+              data = result.data;
+            }
+            //Prepare next frame for decoding (if any)
+            frame = result.nextFrame;
+          }
+        } catch (e) {
+          log.error("TWebSocketTransport Exception: " + e);
+          socket.destroy();
+        }
+      });
     });
-  });
 
   //Return the server
   return server;
diff --git a/lib/nodejs/lib/thrift/ws_connection.js b/lib/nodejs/lib/thrift/ws_connection.js
index 8ee8f6e..878a572 100644
--- a/lib/nodejs/lib/thrift/ws_connection.js
+++ b/lib/nodejs/lib/thrift/ws_connection.js
@@ -16,17 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var util = require('util');
-var WebSocket = require('isomorphic-ws');
+var util = require("util");
+var WebSocket = require("isomorphic-ws");
 var EventEmitter = require("events").EventEmitter;
-var thrift = require('./thrift');
+var thrift = require("./thrift");
 
-var TBufferedTransport = require('./buffered_transport');
-var TJSONProtocol = require('./json_protocol');
-var InputBufferUnderrunError = require('./input_buffer_underrun_error');
+var TBufferedTransport = require("./buffered_transport");
+var TJSONProtocol = require("./json_protocol");
+var InputBufferUnderrunError = require("./input_buffer_underrun_error");
 
-var createClient = require('./create_client');
-var jsEnv = require('browser-or-node');
+var createClient = require("./create_client");
+var jsEnv = require("browser-or-node");
 exports.WSConnection = WSConnection;
 
 /**
@@ -95,38 +95,38 @@
   this.wsOptions = {
     host: this.host,
     port: this.port || 80,
-    path: this.options.path || '/',
-    headers: this.options.headers || {}
+    path: this.options.path || "/",
+    headers: this.options.headers || {},
   };
   for (var attrname in this.options.wsOptions) {
     this.wsOptions[attrname] = this.options.wsOptions[attrname];
   }
-};
+}
 util.inherits(WSConnection, EventEmitter);
 
-WSConnection.prototype.__reset = function() {
+WSConnection.prototype.__reset = function () {
   this.socket = null; //The web socket
   this.send_pending = []; //Buffers/Callback pairs waiting to be sent
 };
 
-WSConnection.prototype.__onOpen = function() {
+WSConnection.prototype.__onOpen = function () {
   this.emit("open");
   if (this.send_pending.length > 0) {
     //If the user made calls before the connection was fully
     //open, send them now
-    this.send_pending.forEach(function(data) {
+    this.send_pending.forEach(function (data) {
       this.socket.send(data);
     }, this);
     this.send_pending = [];
   }
 };
 
-WSConnection.prototype.__onClose = function(evt) {
+WSConnection.prototype.__onClose = function (evt) {
   this.emit("close");
   this.__reset();
 };
 
-WSConnection.prototype.__decodeCallback = function(transport_with_data) {
+WSConnection.prototype.__decodeCallback = function (transport_with_data) {
   var proto = new this.protocol(transport_with_data);
   try {
     while (true) {
@@ -151,7 +151,7 @@
         delete this.seqId2Service[header.rseqid];
       }
       /*jshint -W083 */
-      client._reqs[dummy_seqid] = function(err, success) {
+      client._reqs[dummy_seqid] = function (err, success) {
         transport_with_data.commitPosition();
         var clientCallback = client._reqs[header.rseqid];
         delete client._reqs[header.rseqid];
@@ -160,14 +160,17 @@
         }
       };
       /*jshint +W083 */
-      if (client['recv_' + header.fname]) {
-        client['recv_' + header.fname](proto, header.mtype, dummy_seqid);
+      if (client["recv_" + header.fname]) {
+        client["recv_" + header.fname](proto, header.mtype, dummy_seqid);
       } else {
         delete client._reqs[dummy_seqid];
-        this.emit("error",
+        this.emit(
+          "error",
           new thrift.TApplicationException(
             thrift.TApplicationExceptionType.WRONG_METHOD_NAME,
-            "Received a response to an unknown RPC function"));
+            "Received a response to an unknown RPC function",
+          ),
+        );
       }
     }
   } catch (e) {
@@ -179,20 +182,19 @@
   }
 };
 
-WSConnection.prototype.__onData = function(data) {
+WSConnection.prototype.__onData = function (data) {
   if (Object.prototype.toString.call(data) === "[object ArrayBuffer]") {
     data = new Uint8Array(data);
   }
   var buf = new Buffer(data);
   this.transport.receiver(this.__decodeCallback.bind(this))(buf);
-
 };
 
-WSConnection.prototype.__onMessage = function(evt) {
+WSConnection.prototype.__onMessage = function (evt) {
   this.__onData(evt.data);
 };
 
-WSConnection.prototype.__onError = function(evt) {
+WSConnection.prototype.__onError = function (evt) {
   this.emit("error", evt);
   this.socket.close();
 };
@@ -202,14 +204,14 @@
  * @readonly
  * @returns {boolean}
  */
-WSConnection.prototype.isOpen = function() {
+WSConnection.prototype.isOpen = function () {
   return this.socket && this.socket.readyState === this.socket.OPEN;
 };
 
 /**
  * Opens the transport connection
  */
-WSConnection.prototype.open = function() {
+WSConnection.prototype.open = function () {
   //If OPEN/CONNECTING/CLOSING ignore additional opens
   if (this.socket && this.socket.readyState !== this.socket.CLOSED) {
     return;
@@ -220,7 +222,7 @@
   } else {
     this.socket = new WebSocket(this.uri(), "", this.wsOptions);
   }
-  this.socket.binaryType = 'arraybuffer';
+  this.socket.binaryType = "arraybuffer";
   this.socket.onopen = this.__onOpen.bind(this);
   this.socket.onmessage = this.__onMessage.bind(this);
   this.socket.onerror = this.__onError.bind(this);
@@ -230,7 +232,7 @@
 /**
  * Closes the transport connection
  */
-WSConnection.prototype.close = function() {
+WSConnection.prototype.close = function () {
   this.socket.close();
 };
 
@@ -238,19 +240,22 @@
  * Return URI for the connection
  * @returns {string} URI
  */
-WSConnection.prototype.uri = function() {
-  var schema = this.secure ? 'wss' : 'ws';
-  var port = '';
-  var path = this.path || '/';
+WSConnection.prototype.uri = function () {
+  var schema = this.secure ? "wss" : "ws";
+  var port = "";
+  var path = this.path || "/";
   var host = this.host;
 
   // avoid port if default for schema
-  if (this.port && (('wss' === schema && this.port !== 443) ||
-    ('ws' === schema && this.port !== 80))) {
-    port = ':' + this.port;
+  if (
+    this.port &&
+    (("wss" === schema && this.port !== 443) ||
+      ("ws" === schema && this.port !== 80))
+  ) {
+    port = ":" + this.port;
   }
 
-  return schema + '://' + host + port + path;
+  return schema + "://" + host + port + path;
 };
 
 /**
@@ -260,7 +265,7 @@
  * @event {error} the "error" event is raised upon request failure passing the
  *     Node.js error object to the listener.
  */
-WSConnection.prototype.write = function(data) {
+WSConnection.prototype.write = function (data) {
   if (this.isOpen()) {
     //Send data and register a callback to invoke the client callback
     this.socket.send(data);
@@ -279,7 +284,7 @@
  * @returns {WSConnection} The connection object.
  * @see {@link WSConnectOptions}
  */
-exports.createWSConnection = function(host, port, options) {
+exports.createWSConnection = function (host, port, options) {
   return new WSConnection(host, port, options);
 };
 
diff --git a/lib/nodejs/lib/thrift/ws_transport.js b/lib/nodejs/lib/thrift/ws_transport.js
index 4cf62b9..94b6d90 100644
--- a/lib/nodejs/lib/thrift/ws_transport.js
+++ b/lib/nodejs/lib/thrift/ws_transport.js
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-var log = require('./log');
+var log = require("./log");
 
 module.exports = TWebSocketTransport;
 
@@ -33,19 +33,18 @@
  *   var transport = new Thrift.TWebSocketTransport("http://localhost:8585");
  */
 function TWebSocketTransport(url) {
-    this.__reset(url);
-};
+  this.__reset(url);
+}
 
-
-TWebSocketTransport.prototype.__reset = function(url) {
-  this.url = url;             //Where to connect
-  this.socket = null;         //The web socket
-  this.callbacks = [];        //Pending callbacks
-  this.send_pending = [];     //Buffers/Callback pairs waiting to be sent
-  this.send_buf = '';         //Outbound data, immutable until sent
-  this.recv_buf = '';         //Inbound data
-  this.rb_wpos = 0;           //Network write position in receive buffer
-  this.rb_rpos = 0;           //Client read position in receive buffer
+TWebSocketTransport.prototype.__reset = function (url) {
+  this.url = url; //Where to connect
+  this.socket = null; //The web socket
+  this.callbacks = []; //Pending callbacks
+  this.send_pending = []; //Buffers/Callback pairs waiting to be sent
+  this.send_buf = ""; //Outbound data, immutable until sent
+  this.recv_buf = ""; //Inbound data
+  this.rb_wpos = 0; //Network write position in receive buffer
+  this.rb_rpos = 0; //Client read position in receive buffer
 };
 
 /**
@@ -56,58 +55,62 @@
  * @param {object} callback - The client completion callback.
  * @returns {undefined|string} Nothing (undefined)
  */
-TWebSocketTransport.prototype.flush = function(async, callback) {
+TWebSocketTransport.prototype.flush = function (async, callback) {
   var self = this;
   if (this.isOpen()) {
     //Send data and register a callback to invoke the client callback
     this.socket.send(this.send_buf);
-    this.callbacks.push((function() {
-      var clientCallback = callback;
-      return function(msg) {
-        self.setRecvBuffer(msg);
-        clientCallback();
-      };
-    }()));
+    this.callbacks.push(
+      (function () {
+        var clientCallback = callback;
+        return function (msg) {
+          self.setRecvBuffer(msg);
+          clientCallback();
+        };
+      })(),
+    );
   } else {
     //Queue the send to go out __onOpen
     this.send_pending.push({
       buf: this.send_buf,
-      cb:  callback
+      cb: callback,
     });
   }
 };
 
-TWebSocketTransport.prototype.__onOpen = function() {
-   var self = this;
-   if (this.send_pending.length > 0) {
-      //If the user made calls before the connection was fully
-      //open, send them now
-      this.send_pending.forEach(function(elem) {
-         self.socket.send(elem.buf);
-         self.callbacks.push((function() {
-           var clientCallback = elem.cb;
-           return function(msg) {
-              self.setRecvBuffer(msg);
-              clientCallback();
-           };
-         }()));
-      });
-      this.send_pending = [];
-   }
+TWebSocketTransport.prototype.__onOpen = function () {
+  var self = this;
+  if (this.send_pending.length > 0) {
+    //If the user made calls before the connection was fully
+    //open, send them now
+    this.send_pending.forEach(function (elem) {
+      self.socket.send(elem.buf);
+      self.callbacks.push(
+        (function () {
+          var clientCallback = elem.cb;
+          return function (msg) {
+            self.setRecvBuffer(msg);
+            clientCallback();
+          };
+        })(),
+      );
+    });
+    this.send_pending = [];
+  }
 };
 
-TWebSocketTransport.prototype.__onClose = function(evt) {
+TWebSocketTransport.prototype.__onClose = function (evt) {
   this.__reset(this.url);
 };
 
-TWebSocketTransport.prototype.__onMessage = function(evt) {
+TWebSocketTransport.prototype.__onMessage = function (evt) {
   if (this.callbacks.length) {
     this.callbacks.shift()(evt.data);
   }
 };
 
-TWebSocketTransport.prototype.__onError = function(evt) {
-  log.error('websocket: ' + evt.toString());
+TWebSocketTransport.prototype.__onError = function (evt) {
+  log.error("websocket: " + evt.toString());
   this.socket.close();
 };
 
@@ -115,7 +118,7 @@
  * Sets the buffer to use when receiving server responses.
  * @param {string} buf - The buffer to receive server responses.
  */
-TWebSocketTransport.prototype.setRecvBuffer = function(buf) {
+TWebSocketTransport.prototype.setRecvBuffer = function (buf) {
   this.recv_buf = buf;
   this.recv_buf_sz = this.recv_buf.length;
   this.wpos = this.recv_buf.length;
@@ -127,14 +130,14 @@
  * @readonly
  * @returns {boolean}
  */
-TWebSocketTransport.prototype.isOpen = function() {
+TWebSocketTransport.prototype.isOpen = function () {
   return this.socket && this.socket.readyState == this.socket.OPEN;
 };
 
 /**
  * Opens the transport connection
  */
-TWebSocketTransport.prototype.open = function() {
+TWebSocketTransport.prototype.open = function () {
   //If OPEN/CONNECTING/CLOSING ignore additional opens
   if (this.socket && this.socket.readyState != this.socket.CLOSED) {
     return;
@@ -150,7 +153,7 @@
 /**
  * Closes the transport connection
  */
-TWebSocketTransport.prototype.close = function() {
+TWebSocketTransport.prototype.close = function () {
   this.socket.close();
 };
 
@@ -160,11 +163,11 @@
  * @param {number} len - The number of characters to return.
  * @returns {string} Characters sent by the server.
  */
-TWebSocketTransport.prototype.read = function(len) {
+TWebSocketTransport.prototype.read = function (len) {
   var avail = this.wpos - this.rpos;
 
   if (avail === 0) {
-    return '';
+    return "";
   }
 
   var give = len;
@@ -184,7 +187,7 @@
  * Returns the entire response buffer.
  * @returns {string} Characters sent by the server.
  */
-TWebSocketTransport.prototype.readAll = function() {
+TWebSocketTransport.prototype.readAll = function () {
   return this.recv_buf;
 };
 
@@ -192,7 +195,7 @@
  * Sets the send buffer to buf.
  * @param {string} buf - The buffer to send.
  */
-TWebSocketTransport.prototype.write = function(buf) {
+TWebSocketTransport.prototype.write = function (buf) {
   this.send_buf = buf;
 };
 
@@ -201,6 +204,6 @@
  * @readonly
  * @returns {string} The send buffer.
  */
-TWebSocketTransport.prototype.getSendBuffer = function() {
+TWebSocketTransport.prototype.getSendBuffer = function () {
   return this.send_buf;
 };
diff --git a/lib/nodejs/lib/thrift/xhr_connection.js b/lib/nodejs/lib/thrift/xhr_connection.js
index 6459c90..ea542d1 100644
--- a/lib/nodejs/lib/thrift/xhr_connection.js
+++ b/lib/nodejs/lib/thrift/xhr_connection.js
@@ -16,15 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-var util = require('util');
+var util = require("util");
 var EventEmitter = require("events").EventEmitter;
-var thrift = require('./thrift');
+var thrift = require("./thrift");
 
-var TBufferedTransport = require('./buffered_transport');
-var TJSONProtocol = require('./json_protocol');
-var InputBufferUnderrunError = require('./input_buffer_underrun_error');
+var TBufferedTransport = require("./buffered_transport");
+var TJSONProtocol = require("./json_protocol");
+var InputBufferUnderrunError = require("./input_buffer_underrun_error");
 
-var createClient = require('./create_client');
+var createClient = require("./create_client");
 
 exports.XHRConnection = XHRConnection;
 
@@ -43,43 +43,49 @@
   this.options = options || {};
   this.wpos = 0;
   this.rpos = 0;
-  this.useCORS = (options && options.useCORS);
-  this.send_buf = '';
-  this.recv_buf = '';
+  this.useCORS = options && options.useCORS;
+  this.send_buf = "";
+  this.recv_buf = "";
   this.transport = options.transport || TBufferedTransport;
   this.protocol = options.protocol || TJSONProtocol;
   this.headers = options.headers || {};
 
   host = host || window.location.host;
   port = port || window.location.port;
-  var prefix = options.https ? 'https://' : 'http://';
-  var path = options.path || '/';
+  var prefix = options.https ? "https://" : "http://";
+  var path = options.path || "/";
 
-  if (port === '') {
+  if (port === "") {
     port = undefined;
   }
 
-  if (!port || port === 80 || port === '80') {
+  if (!port || port === 80 || port === "80") {
     this.url = prefix + host + path;
   } else {
-    this.url = prefix + host + ':' + port + path;
+    this.url = prefix + host + ":" + port + path;
   }
 
   //The sequence map is used to map seqIDs back to the
   //  calling client in multiplexed scenarios
   this.seqId2Service = {};
-};
+}
 
 util.inherits(XHRConnection, EventEmitter);
 
 /**
-* Gets the browser specific XmlHttpRequest Object.
-* @returns {object} the browser XHR interface object
-*/
-XHRConnection.prototype.getXmlHttpRequestObject = function() {
-  try { return new XMLHttpRequest(); } catch (e1) { }
-  try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e2) { }
-  try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e3) { }
+ * Gets the browser specific XmlHttpRequest Object.
+ * @returns {object} the browser XHR interface object
+ */
+XHRConnection.prototype.getXmlHttpRequestObject = function () {
+  try {
+    return new XMLHttpRequest();
+  } catch (e1) {}
+  try {
+    return new ActiveXObject("Msxml2.XMLHTTP");
+  } catch (e2) {}
+  try {
+    return new ActiveXObject("Microsoft.XMLHTTP");
+  } catch (e3) {}
 
   throw "Your browser doesn't support XHR.";
 };
@@ -94,27 +100,27 @@
  * @returns {undefined|string} Nothing or the current send buffer.
  * @throws {string} If XHR fails.
  */
-XHRConnection.prototype.flush = function() {
+XHRConnection.prototype.flush = function () {
   var self = this;
-  if (this.url === undefined || this.url === '') {
+  if (this.url === undefined || this.url === "") {
     return this.send_buf;
   }
 
   var xreq = this.getXmlHttpRequestObject();
 
   if (xreq.overrideMimeType) {
-    xreq.overrideMimeType('application/json');
+    xreq.overrideMimeType("application/json");
   }
 
-  xreq.onreadystatechange = function() {
+  xreq.onreadystatechange = function () {
     if (this.readyState == 4 && this.status == 200) {
       self.setRecvBuffer(this.responseText);
     }
   };
 
-  xreq.open('POST', this.url, true);
+  xreq.open("POST", this.url, true);
 
-  Object.keys(this.headers).forEach(function(headerKey) {
+  Object.keys(this.headers).forEach(function (headerKey) {
     xreq.setRequestHeader(headerKey, self.headers[headerKey]);
   });
 
@@ -125,7 +131,7 @@
  * Sets the buffer to provide the protocol when deserializing.
  * @param {string} buf - The buffer to supply the protocol.
  */
-XHRConnection.prototype.setRecvBuffer = function(buf) {
+XHRConnection.prototype.setRecvBuffer = function (buf) {
   this.recv_buf = buf;
   this.recv_buf_sz = this.recv_buf.length;
   this.wpos = this.recv_buf.length;
@@ -137,10 +143,9 @@
   var thing = new Buffer(data || buf);
 
   this.transport.receiver(this.__decodeCallback.bind(this))(thing);
-
 };
 
-XHRConnection.prototype.__decodeCallback = function(transport_with_data) {
+XHRConnection.prototype.__decodeCallback = function (transport_with_data) {
   var proto = new this.protocol(transport_with_data);
   try {
     while (true) {
@@ -165,7 +170,7 @@
         delete this.seqId2Service[header.rseqid];
       }
       /*jshint -W083 */
-      client._reqs[dummy_seqid] = function(err, success) {
+      client._reqs[dummy_seqid] = function (err, success) {
         transport_with_data.commitPosition();
         var clientCallback = client._reqs[header.rseqid];
         delete client._reqs[header.rseqid];
@@ -174,14 +179,17 @@
         }
       };
       /*jshint +W083 */
-      if (client['recv_' + header.fname]) {
-        client['recv_' + header.fname](proto, header.mtype, dummy_seqid);
+      if (client["recv_" + header.fname]) {
+        client["recv_" + header.fname](proto, header.mtype, dummy_seqid);
       } else {
         delete client._reqs[dummy_seqid];
-        this.emit("error",
+        this.emit(
+          "error",
           new thrift.TApplicationException(
             thrift.TApplicationExceptionType.WRONG_METHOD_NAME,
-            "Received a response to an unknown RPC function"));
+            "Received a response to an unknown RPC function",
+          ),
+        );
       }
     }
   } catch (e) {
@@ -198,19 +206,19 @@
  * @readonly
  * @returns {boolean} Always True.
  */
-XHRConnection.prototype.isOpen = function() {
+XHRConnection.prototype.isOpen = function () {
   return true;
 };
 
 /**
  * Opens the transport connection, with XHR this is a nop.
  */
-XHRConnection.prototype.open = function() {};
+XHRConnection.prototype.open = function () {};
 
 /**
  * Closes the transport connection, with XHR this is a nop.
  */
-XHRConnection.prototype.close = function() {};
+XHRConnection.prototype.close = function () {};
 
 /**
  * Returns the specified number of characters from the response
@@ -218,11 +226,11 @@
  * @param {number} len - The number of characters to return.
  * @returns {string} Characters sent by the server.
  */
-XHRConnection.prototype.read = function(len) {
+XHRConnection.prototype.read = function (len) {
   var avail = this.wpos - this.rpos;
 
   if (avail === 0) {
-    return '';
+    return "";
   }
 
   var give = len;
@@ -242,7 +250,7 @@
  * Returns the entire response buffer.
  * @returns {string} Characters sent by the server.
  */
-XHRConnection.prototype.readAll = function() {
+XHRConnection.prototype.readAll = function () {
   return this.recv_buf;
 };
 
@@ -250,7 +258,7 @@
  * Sets the send buffer to buf.
  * @param {string} buf - The buffer to send.
  */
-XHRConnection.prototype.write = function(buf) {
+XHRConnection.prototype.write = function (buf) {
   this.send_buf = buf;
   this.flush();
 };
@@ -260,7 +268,7 @@
  * @readonly
  * @returns {string} The send buffer.
  */
-XHRConnection.prototype.getSendBuffer = function() {
+XHRConnection.prototype.getSendBuffer = function () {
   return this.send_buf;
 };
 
@@ -273,7 +281,7 @@
  * @returns {XHRConnection} The connection object.
  * @see {@link XHRConnectOptions}
  */
-exports.createXHRConnection = function(host, port, options) {
+exports.createXHRConnection = function (host, port, options) {
   return new XHRConnection(host, port, options);
 };
 
diff --git a/lib/nodejs/test/binary.test.js b/lib/nodejs/test/binary.test.js
index 187cd18..343d39a 100644
--- a/lib/nodejs/test/binary.test.js
+++ b/lib/nodejs/test/binary.test.js
@@ -21,7 +21,7 @@
 const binary = require("thrift/binary");
 
 const cases = {
-  "Should read signed byte": function(assert) {
+  "Should read signed byte": function (assert) {
     assert.equal(1, binary.readByte(0x01));
     assert.equal(-1, binary.readByte(0xff));
 
@@ -29,12 +29,12 @@
     assert.equal(-128, binary.readByte(0x80));
     assert.end();
   },
-  "Should write byte": function(assert) {
+  "Should write byte": function (assert) {
     //Protocol simply writes to the buffer. Nothing to test.. yet.
     assert.ok(true);
     assert.end();
   },
-  "Should read I16": function(assert) {
+  "Should read I16": function (assert) {
     assert.equal(0, binary.readI16([0x00, 0x00]));
     assert.equal(1, binary.readI16([0x00, 0x01]));
     assert.equal(-1, binary.readI16([0xff, 0xff]));
@@ -46,7 +46,7 @@
     assert.end();
   },
 
-  "Should write I16": function(assert) {
+  "Should write I16": function (assert) {
     assert.deepEqual([0x00, 0x00], binary.writeI16([], 0));
     assert.deepEqual([0x00, 0x01], binary.writeI16([], 1));
     assert.deepEqual([0xff, 0xff], binary.writeI16([], -1));
@@ -58,7 +58,7 @@
     assert.end();
   },
 
-  "Should read I32": function(assert) {
+  "Should read I32": function (assert) {
     assert.equal(0, binary.readI32([0x00, 0x00, 0x00, 0x00]));
     assert.equal(1, binary.readI32([0x00, 0x00, 0x00, 0x01]));
     assert.equal(-1, binary.readI32([0xff, 0xff, 0xff, 0xff]));
@@ -70,7 +70,7 @@
     assert.end();
   },
 
-  "Should write I32": function(assert) {
+  "Should write I32": function (assert) {
     assert.deepEqual([0x00, 0x00, 0x00, 0x00], binary.writeI32([], 0));
     assert.deepEqual([0x00, 0x00, 0x00, 0x01], binary.writeI32([], 1));
     assert.deepEqual([0xff, 0xff, 0xff, 0xff], binary.writeI32([], -1));
@@ -78,137 +78,139 @@
     // Min I32
     assert.deepEqual(
       [0x80, 0x00, 0x00, 0x00],
-      binary.writeI32([], -2147483648)
+      binary.writeI32([], -2147483648),
     );
     // Max I32
     assert.deepEqual([0x7f, 0xff, 0xff, 0xff], binary.writeI32([], 2147483647));
     assert.end();
   },
 
-  "Should read doubles": function(assert) {
+  "Should read doubles": function (assert) {
     assert.equal(
       0,
-      binary.readDouble([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+      binary.readDouble([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
     );
     assert.equal(
       0,
-      binary.readDouble([0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+      binary.readDouble([0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
     );
     assert.equal(
       1,
-      binary.readDouble([0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+      binary.readDouble([0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
     );
     assert.equal(
       2,
-      binary.readDouble([0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+      binary.readDouble([0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
     );
     assert.equal(
       -2,
-      binary.readDouble([0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+      binary.readDouble([0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
     );
 
     assert.equal(
       Math.PI,
-      binary.readDouble([0x40, 0x9, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18])
+      binary.readDouble([0x40, 0x9, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18]),
     );
 
     assert.equal(
       Infinity,
-      binary.readDouble([0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+      binary.readDouble([0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
     );
     assert.equal(
       -Infinity,
-      binary.readDouble([0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+      binary.readDouble([0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
     );
 
     assert.ok(
-      isNaN(binary.readDouble([0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]))
+      isNaN(
+        binary.readDouble([0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
+      ),
     );
 
     assert.equal(
       1 / 3,
-      binary.readDouble([0x3f, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55])
+      binary.readDouble([0x3f, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55]),
     );
 
     // Min subnormal positive double
     assert.equal(
       4.9406564584124654e-324,
-      binary.readDouble([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01])
+      binary.readDouble([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]),
     );
     // Min normal positive double
     assert.equal(
       2.2250738585072014e-308,
-      binary.readDouble([0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+      binary.readDouble([0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]),
     );
     // Max positive double
     assert.equal(
       1.7976931348623157e308,
-      binary.readDouble([0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])
+      binary.readDouble([0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]),
     );
     assert.end();
   },
 
-  "Should write doubles": function(assert) {
+  "Should write doubles": function (assert) {
     assert.deepEqual(
       [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
-      binary.writeDouble([], 0)
+      binary.writeDouble([], 0),
     );
     assert.deepEqual(
       [0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
-      binary.writeDouble([], 1)
+      binary.writeDouble([], 1),
     );
     assert.deepEqual(
       [0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
-      binary.writeDouble([], 2)
+      binary.writeDouble([], 2),
     );
     assert.deepEqual(
       [0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
-      binary.writeDouble([], -2)
+      binary.writeDouble([], -2),
     );
 
     assert.deepEqual(
       [0x40, 0x9, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18],
-      binary.writeDouble([], Math.PI)
+      binary.writeDouble([], Math.PI),
     );
 
     assert.deepEqual(
       [0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
-      binary.writeDouble([], Infinity)
+      binary.writeDouble([], Infinity),
     );
     assert.deepEqual(
       [0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
-      binary.writeDouble([], -Infinity)
+      binary.writeDouble([], -Infinity),
     );
 
     assert.deepEqual(
       [0x7f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
-      binary.writeDouble([], NaN)
+      binary.writeDouble([], NaN),
     );
 
     assert.deepEqual(
       [0x3f, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55],
-      binary.writeDouble([], 1 / 3)
+      binary.writeDouble([], 1 / 3),
     );
 
     // Min subnormal positive double
     assert.deepEqual(
       [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01],
-      binary.writeDouble([], 4.9406564584124654e-324)
+      binary.writeDouble([], 4.9406564584124654e-324),
     );
     // Min normal positive double
     assert.deepEqual(
       [0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
-      binary.writeDouble([], 2.2250738585072014e-308)
+      binary.writeDouble([], 2.2250738585072014e-308),
     );
     // Max positive double
     assert.deepEqual(
       [0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff],
-      binary.writeDouble([], 1.7976931348623157e308)
+      binary.writeDouble([], 1.7976931348623157e308),
     );
     assert.end();
-  }
+  },
 };
 
-Object.keys(cases).forEach(function(caseName) {
+Object.keys(cases).forEach(function (caseName) {
   test(caseName, cases[caseName]);
 });
diff --git a/lib/nodejs/test/client.js b/lib/nodejs/test/client.js
index 31ea06e..1d137ff 100644
--- a/lib/nodejs/test/client.js
+++ b/lib/nodejs/test/client.js
@@ -25,8 +25,8 @@
 
 const ThriftTest = require(`./${helpers.genPath}/ThriftTest`);
 const ThriftTestDriver = require("./test_driver").ThriftTestDriver;
-const ThriftTestDriverPromise = require("./test_driver")
-  .ThriftTestDriverPromise;
+const ThriftTestDriverPromise =
+  require("./test_driver").ThriftTestDriverPromise;
 const SecondService = require(`./${helpers.genPath}/SecondService`);
 
 const program = require("commander");
@@ -34,24 +34,24 @@
 program
   .option(
     "-p, --protocol <protocol>",
-    "Set thrift protocol (binary|compact|json) [protocol]"
+    "Set thrift protocol (binary|compact|json) [protocol]",
   )
   .option(
     "-t, --transport <transport>",
-    "Set thrift transport (buffered|framed|http) [transport]"
+    "Set thrift transport (buffered|framed|http) [transport]",
   )
   .option("--port <port>", "Set thrift server port number to connect", 9090)
   .option("--host <host>", "Set thrift server host to connect", "localhost")
   .option(
     "--domain-socket <path>",
-    "Set thrift server unix domain socket to connect"
+    "Set thrift server unix domain socket to connect",
   )
   .option("--ssl", "use SSL transport")
   .option("--callback", "test with callback style functions")
   .option(
     "-t, --type <type>",
     "Select server type (http|multiplex|tcp|websocket)",
-    "tcp"
+    "tcp",
   )
   .option("--es6", "Use es6 code")
   .option("--es5", "Use es5 code")
@@ -76,7 +76,7 @@
 
 const options = {
   transport: helpers.transports[program.transport],
-  protocol: helpers.protocols[program.protocol]
+  protocol: helpers.protocols[program.protocol],
 };
 
 if (type === "http" || type === "websocket") {
@@ -128,7 +128,7 @@
   connection.open();
 }
 
-connection.on("error", function(err) {
+connection.on("error", function (err) {
   assert(false, err);
 });
 
@@ -141,11 +141,11 @@
   const secondclient = mp.createClient(
     "SecondService",
     SecondService,
-    connection
+    connection,
   );
 
-  connection.on("connect", function() {
-    secondclient.secondtestString("Test", function(err, response) {
+  connection.on("connect", function () {
+    secondclient.secondtestString("Test", function (err, response) {
       assert(!err);
       assert.equal('testString("Test")', response);
     });
@@ -161,7 +161,7 @@
 }
 
 function runTests() {
-  testDriver(client, function(status) {
+  testDriver(client, function (status) {
     console.log(status);
     if (type !== "http" && type !== "websocket") {
       connection.end();
@@ -172,4 +172,4 @@
   });
 }
 
-exports.expressoTest = function() {};
+exports.expressoTest = function () {};
diff --git a/lib/nodejs/test/deep-constructor.test.js b/lib/nodejs/test/deep-constructor.test.js
index a91ddb1..e5ac3f8 100644
--- a/lib/nodejs/test/deep-constructor.test.js
+++ b/lib/nodejs/test/deep-constructor.test.js
@@ -24,7 +24,7 @@
 
 function serializeBinary(data) {
   let buff;
-  const transport = new thrift.TBufferedTransport(null, function(msg) {
+  const transport = new thrift.TBufferedTransport(null, function (msg) {
     buff = msg;
   });
   const prot = new thrift.TBinaryProtocol(transport);
@@ -43,7 +43,7 @@
 
 function serializeJSON(data) {
   let buff;
-  const transport = new thrift.TBufferedTransport(null, function(msg) {
+  const transport = new thrift.TBufferedTransport(null, function (msg) {
     buff = msg;
   });
   const protocol = new thrift.TJSONProtocol(transport);
@@ -70,17 +70,17 @@
 
     struct_list_field: [
       new ttypes.Simple({ value: "b" }),
-      new ttypes.Simple({ value: "c" })
+      new ttypes.Simple({ value: "c" }),
     ],
 
     struct_set_field: [
       new ttypes.Simple({ value: "d" }),
-      new ttypes.Simple({ value: "e" })
+      new ttypes.Simple({ value: "e" }),
     ],
 
     struct_map_field: {
       A: new ttypes.Simple({ value: "f" }),
-      B: new ttypes.Simple({ value: "g" })
+      B: new ttypes.Simple({ value: "g" }),
     },
 
     struct_nested_containers_field: [
@@ -88,46 +88,46 @@
         {
           C: [
             new ttypes.Simple({ value: "h" }),
-            new ttypes.Simple({ value: "i" })
-          ]
-        }
-      ]
+            new ttypes.Simple({ value: "i" }),
+          ],
+        },
+      ],
     ],
 
     struct_nested_containers_field2: {
       D: [
         {
-          DA: new ttypes.Simple({ value: "j" })
+          DA: new ttypes.Simple({ value: "j" }),
         },
         {
-          DB: new ttypes.Simple({ value: "k" })
-        }
-      ]
+          DB: new ttypes.Simple({ value: "k" }),
+        },
+      ],
     },
 
     list_of_list_field: [
       ["l00", "l01", "l02"],
       ["l10", "l11", "l12"],
-      ["l20", "l21", "l22"]
+      ["l20", "l21", "l22"],
     ],
 
     list_of_list_of_list_field: [
       [
         ["m000", "m001", "m002"],
         ["m010", "m011", "m012"],
-        ["m020", "m021", "m022"]
+        ["m020", "m021", "m022"],
       ],
       [
         ["m100", "m101", "m102"],
         ["m110", "m111", "m112"],
-        ["m120", "m121", "m122"]
+        ["m120", "m121", "m122"],
       ],
       [
         ["m200", "m201", "m202"],
         ["m210", "m211", "m212"],
-        ["m220", "m221", "m222"]
-      ]
-    ]
+        ["m220", "m221", "m222"],
+      ],
+    ],
   });
 }
 
@@ -141,51 +141,51 @@
 
     struct_map_field: {
       A: { value: "f" },
-      B: { value: "g" }
+      B: { value: "g" },
     },
 
     struct_nested_containers_field: [
       [
         {
-          C: [{ value: "h" }, { value: "i" }]
-        }
-      ]
+          C: [{ value: "h" }, { value: "i" }],
+        },
+      ],
     ],
 
     struct_nested_containers_field2: {
       D: [
         {
-          DA: { value: "j" }
+          DA: { value: "j" },
         },
         {
-          DB: { value: "k" }
-        }
-      ]
+          DB: { value: "k" },
+        },
+      ],
     },
 
     list_of_list_field: [
       ["l00", "l01", "l02"],
       ["l10", "l11", "l12"],
-      ["l20", "l21", "l22"]
+      ["l20", "l21", "l22"],
     ],
 
     list_of_list_of_list_field: [
       [
         ["m000", "m001", "m002"],
         ["m010", "m011", "m012"],
-        ["m020", "m021", "m022"]
+        ["m020", "m021", "m022"],
       ],
       [
         ["m100", "m101", "m102"],
         ["m110", "m111", "m112"],
-        ["m120", "m121", "m122"]
+        ["m120", "m121", "m122"],
       ],
       [
         ["m200", "m201", "m202"],
         ["m210", "m211", "m212"],
-        ["m220", "m221", "m222"]
-      ]
-    ]
+        ["m220", "m221", "m222"],
+      ],
+    ],
   };
 }
 
@@ -244,7 +244,7 @@
 
 function createTestCases(serialize, deserialize) {
   const cases = {
-    "Serialize/deserialize should return equal object": function(assert) {
+    "Serialize/deserialize should return equal object": function (assert) {
       const tObj = createThriftObj();
       const received = deserialize(serialize(tObj), ttypes.Complex);
       assert.ok(tObj !== received, "not the same object");
@@ -252,51 +252,49 @@
       assert.end();
     },
 
-    "Nested structs and containers initialized from plain js objects should serialize same as if initialized from thrift objects": function(
-      assert
-    ) {
-      const tObj1 = createThriftObj();
-      const tObj2 = new ttypes.Complex(createJsObj());
-      assertValues(tObj2, assert);
-      const s1 = serialize(tObj1);
-      const s2 = serialize(tObj2);
-      assert.ok(bufferEquals(s1, s2));
-      assert.end();
-    },
+    "Nested structs and containers initialized from plain js objects should serialize same as if initialized from thrift objects":
+      function (assert) {
+        const tObj1 = createThriftObj();
+        const tObj2 = new ttypes.Complex(createJsObj());
+        assertValues(tObj2, assert);
+        const s1 = serialize(tObj1);
+        const s2 = serialize(tObj2);
+        assert.ok(bufferEquals(s1, s2));
+        assert.end();
+      },
 
-    "Modifications to args object should not affect constructed Thrift object": function(
-      assert
-    ) {
-      const args = createJsObj();
-      assertValues(args, assert);
+    "Modifications to args object should not affect constructed Thrift object":
+      function (assert) {
+        const args = createJsObj();
+        assertValues(args, assert);
 
-      const tObj = new ttypes.Complex(args);
-      assertValues(tObj, assert);
+        const tObj = new ttypes.Complex(args);
+        assertValues(tObj, assert);
 
-      args.struct_field.value = "ZZZ";
-      args.struct_list_field[0].value = "ZZZ";
-      args.struct_list_field[1].value = "ZZZ";
-      args.struct_set_field[0].value = "ZZZ";
-      args.struct_set_field[1].value = "ZZZ";
-      args.struct_map_field.A.value = "ZZZ";
-      args.struct_map_field.B.value = "ZZZ";
-      args.struct_nested_containers_field[0][0].C[0] = "ZZZ";
-      args.struct_nested_containers_field[0][0].C[1] = "ZZZ";
-      args.struct_nested_containers_field2.D[0].DA = "ZZZ";
-      args.struct_nested_containers_field2.D[0].DB = "ZZZ";
+        args.struct_field.value = "ZZZ";
+        args.struct_list_field[0].value = "ZZZ";
+        args.struct_list_field[1].value = "ZZZ";
+        args.struct_set_field[0].value = "ZZZ";
+        args.struct_set_field[1].value = "ZZZ";
+        args.struct_map_field.A.value = "ZZZ";
+        args.struct_map_field.B.value = "ZZZ";
+        args.struct_nested_containers_field[0][0].C[0] = "ZZZ";
+        args.struct_nested_containers_field[0][0].C[1] = "ZZZ";
+        args.struct_nested_containers_field2.D[0].DA = "ZZZ";
+        args.struct_nested_containers_field2.D[0].DB = "ZZZ";
 
-      assertValues(tObj, assert);
-      assert.end();
-    },
+        assertValues(tObj, assert);
+        assert.end();
+      },
 
-    "nulls are ok": function(assert) {
+    "nulls are ok": function (assert) {
       const tObj = new ttypes.Complex({
         struct_field: null,
         struct_list_field: null,
         struct_set_field: null,
         struct_map_field: null,
         struct_nested_containers_field: null,
-        struct_nested_containers_field2: null
+        struct_nested_containers_field2: null,
       });
       const received = deserialize(serialize(tObj), ttypes.Complex);
       assert.strictEqual(tObj.struct_field, null);
@@ -305,9 +303,9 @@
       assert.end();
     },
 
-    "Can make list with objects": function(assert) {
+    "Can make list with objects": function (assert) {
       const tObj = new ttypes.ComplexList({
-        struct_list_field: [new ttypes.Complex({})]
+        struct_list_field: [new ttypes.Complex({})],
       });
       const innerObj = tObj.struct_list_field[0];
       assert.ok(innerObj instanceof ttypes.Complex);
@@ -318,13 +316,13 @@
       assert.strictEqual(innerObj.struct_nested_containers_field, null);
       assert.strictEqual(innerObj.struct_nested_containers_field2, null);
       assert.end();
-    }
+    },
   };
   return cases;
 }
 
 function run(name, cases) {
-  Object.keys(cases).forEach(function(caseName) {
+  Object.keys(cases).forEach(function (caseName) {
     test(name + ": " + caseName, cases[caseName]);
   });
 }
diff --git a/lib/nodejs/test/episodic-code-generation-test/client.js b/lib/nodejs/test/episodic-code-generation-test/client.js
index 55dc702..631bfe7 100644
--- a/lib/nodejs/test/episodic-code-generation-test/client.js
+++ b/lib/nodejs/test/episodic-code-generation-test/client.js
@@ -37,21 +37,21 @@
 
 const options = {
   transport: thrift.TBufferedTransport,
-  protocol: thrift.TJSONProtocol
+  protocol: thrift.TJSONProtocol,
 };
 
 const connection = thrift.createConnection(host, port, options);
-const testDriver = function(client, callback) {
-  test("NodeJS episodic compilation client-server test", function(assert) {
+const testDriver = function (client, callback) {
+  test("NodeJS episodic compilation client-server test", function (assert) {
     const type1Object = new Types.Type1();
     type1Object.number = 42;
     type1Object.message = "The answer";
-    client.testEpisode(type1Object, function(err, response) {
+    client.testEpisode(type1Object, function (err, response) {
       assert.error(err, "no callback error");
       assert.equal(response.number, type1Object.number + 1);
       assert.equal(
         response.message,
-        type1Object.message + " [Hello from the server]"
+        type1Object.message + " [Hello from the server]",
       );
       assert.end();
       callback("Server successfully tested");
@@ -59,7 +59,7 @@
   });
 };
 
-connection.on("error", function(err) {
+connection.on("error", function (err) {
   assert(false, err);
 });
 
@@ -68,10 +68,10 @@
 runTests();
 
 function runTests() {
-  testDriver(client, function(status) {
+  testDriver(client, function (status) {
     console.log(status);
     connection.destroy();
   });
 }
 
-exports.expressoTest = function() {};
+exports.expressoTest = function () {};
diff --git a/lib/nodejs/test/episodic-code-generation-test/server.js b/lib/nodejs/test/episodic-code-generation-test/server.js
index 2917b68..feca380 100644
--- a/lib/nodejs/test/episodic-code-generation-test/server.js
+++ b/lib/nodejs/test/episodic-code-generation-test/server.js
@@ -33,17 +33,17 @@
 
 const options = {
   transport: thrift.TBufferedTransport,
-  protocol: thrift.TJSONProtocol
+  protocol: thrift.TJSONProtocol,
 };
 
 const ServiceHandler = {
-  testEpisode: function(receivedType1Object) {
+  testEpisode: function (receivedType1Object) {
     const type1Object = new Types.Type1();
     type1Object.number = receivedType1Object.number + 1;
     type1Object.message =
       receivedType1Object.message + " [Hello from the server]";
     return type1Object;
-  }
+  },
 };
 
 const server = thrift.createServer(Service, ServiceHandler, options);
diff --git a/lib/nodejs/test/exceptions.js b/lib/nodejs/test/exceptions.js
index f30f987..4119e76 100644
--- a/lib/nodejs/test/exceptions.js
+++ b/lib/nodejs/test/exceptions.js
@@ -26,23 +26,23 @@
   const e = new thrift.TApplicationException(1, "foo");
   assert.ok(
     e instanceof thrift.TApplicationException,
-    "is instanceof TApplicationException"
+    "is instanceof TApplicationException",
   );
   assert.ok(e instanceof thrift.TException, "is instanceof TException");
   assert.ok(e instanceof Error, "is instanceof Error");
   assert.equal(typeof e.stack, "string", "has stack trace");
   assert.ok(
     /^TApplicationException: foo/.test(e.stack),
-    "Stack trace has correct error name and message"
+    "Stack trace has correct error name and message",
   );
   assert.ok(
     e.stack.indexOf("test/exceptions.js:7:11") !== -1,
-    "stack trace starts on correct line and column"
+    "stack trace starts on correct line and column",
   );
   assert.equal(
     e.name,
     "TApplicationException",
-    "has function name TApplicationException"
+    "has function name TApplicationException",
   );
   assert.equal(e.message, "foo", 'has error message "foo"');
   assert.equal(e.type, 1, "has type 1");
@@ -53,23 +53,23 @@
   const e = new thrift.TApplicationException(1, 100);
   assert.ok(
     e instanceof thrift.TApplicationException,
-    "is instanceof TApplicationException"
+    "is instanceof TApplicationException",
   );
   assert.ok(e instanceof thrift.TException, "is instanceof TException");
   assert.ok(e instanceof Error, "is instanceof Error");
   assert.equal(typeof e.stack, "string", "has stack trace");
   assert.ok(
     /^TApplicationException: 100/.test(e.stack),
-    "Stack trace has correct error name and message"
+    "Stack trace has correct error name and message",
   );
   assert.ok(
     e.stack.indexOf("test/exceptions.js:7:11") !== -1,
-    "stack trace starts on correct line and column"
+    "stack trace starts on correct line and column",
   );
   assert.equal(
     e.name,
     "TApplicationException",
-    "has function name TApplicationException"
+    "has function name TApplicationException",
   );
   assert.equal(e.message, 100, "has error message 100");
   assert.equal(e.type, 1, "has type 1");
@@ -83,11 +83,11 @@
   assert.equal(typeof e.stack, "string", "has stack trace");
   assert.ok(
     /^TException: foo/.test(e.stack),
-    "Stack trace has correct error name and message"
+    "Stack trace has correct error name and message",
   );
   assert.ok(
     e.stack.indexOf("test/exceptions.js:21:11") !== -1,
-    "stack trace starts on correct line and column"
+    "stack trace starts on correct line and column",
   );
   assert.equal(e.name, "TException", "has function name TException");
   assert.equal(e.message, "foo", 'has error message "foo"');
@@ -98,22 +98,22 @@
   const e = new thrift.TProtocolException(1, "foo");
   assert.ok(
     e instanceof thrift.TProtocolException,
-    "is instanceof TProtocolException"
+    "is instanceof TProtocolException",
   );
   assert.ok(e instanceof Error, "is instanceof Error");
   assert.equal(typeof e.stack, "string", "has stack trace");
   assert.ok(
     /^TProtocolException: foo/.test(e.stack),
-    "Stack trace has correct error name and message"
+    "Stack trace has correct error name and message",
   );
   assert.ok(
     e.stack.indexOf("test/exceptions.js:33:11") !== -1,
-    "stack trace starts on correct line and column"
+    "stack trace starts on correct line and column",
   );
   assert.equal(
     e.name,
     "TProtocolException",
-    "has function name TProtocolException"
+    "has function name TProtocolException",
   );
   assert.equal(e.message, "foo", 'has error message "foo"');
   assert.equal(e.type, 1, "has type 1");
@@ -124,22 +124,22 @@
   const e = new InputBufferUnderrunError("foo");
   assert.ok(
     e instanceof InputBufferUnderrunError,
-    "is instanceof InputBufferUnderrunError"
+    "is instanceof InputBufferUnderrunError",
   );
   assert.ok(e instanceof Error, "is instanceof Error");
   assert.equal(typeof e.stack, "string", "has stack trace");
   assert.ok(
     /^InputBufferUnderrunError: foo/.test(e.stack),
-    "Stack trace has correct error name and message"
+    "Stack trace has correct error name and message",
   );
   assert.ok(
     e.stack.indexOf("test/exceptions.js:46:11") !== -1,
-    "stack trace starts on correct line and column"
+    "stack trace starts on correct line and column",
   );
   assert.equal(
     e.name,
     "InputBufferUnderrunError",
-    "has function name InputBufferUnderrunError"
+    "has function name InputBufferUnderrunError",
   );
   assert.equal(e.message, "foo", 'has error message "foo"');
   assert.end();
diff --git a/lib/nodejs/test/header.test.js b/lib/nodejs/test/header.test.js
index 12f1557..24f49be 100644
--- a/lib/nodejs/test/header.test.js
+++ b/lib/nodejs/test/header.test.js
@@ -26,11 +26,11 @@
 const path = require("path");
 
 const headerPayload = fs.readFileSync(
-  path.join(__dirname, "test_header_payload")
+  path.join(__dirname, "test_header_payload"),
 );
 
 const cases = {
-  "Should read headers from payload": function(assert) {
+  "Should read headers from payload": function (assert) {
     const transport = new TFramedTransport();
     transport.inBuf = Buffer.from(headerPayload);
 
@@ -39,7 +39,7 @@
     assert.equals(headers.Trace, "abcde");
     assert.end();
   },
-  "Should read different headers from different payload": function(assert) {
+  "Should read different headers from different payload": function (assert) {
     const transport = new TFramedTransport();
     const buf = Buffer.from(headerPayload);
     buf[24] = 115; // Change Parent to Parens
@@ -52,7 +52,7 @@
     assert.equals(headers.Trace, "abcde");
     assert.end();
   },
-  "Should read headers when reading message begin": function(assert) {
+  "Should read headers when reading message begin": function (assert) {
     const transport = new TFramedTransport();
     transport.inBuf = Buffer.from(headerPayload);
     const protocol = new THeaderProtocol(transport);
@@ -65,7 +65,7 @@
     assert.equals(result.mtype, thrift.Thrift.MessageType.CALL);
     assert.end();
   },
-  "Should be able to write headers": function(assert) {
+  "Should be able to write headers": function (assert) {
     const writeTransport = new TFramedTransport();
     writeTransport.setProtocolId(THeaderTransport.SubprotocolId.BINARY);
     writeTransport.setWriteHeader("Hihihihi", "hohohoho");
@@ -84,7 +84,7 @@
     assert.equals(headers.a, "z");
     assert.end();
   },
-  "Separate transports should have separate headers": function(assert) {
+  "Separate transports should have separate headers": function (assert) {
     const writeTransport = new TFramedTransport();
     writeTransport.setProtocolId(THeaderTransport.SubprotocolId.BINARY);
     writeTransport.setWriteHeader("foo", "bar");
@@ -101,8 +101,8 @@
     assert.equals(otherHeaders.otherfoo, "baz");
     assert.end();
   },
-  "Should handle large messages without crashing": function(assert) {
-    const callback = function() {};
+  "Should handle large messages without crashing": function (assert) {
+    const callback = function () {};
     const onData = TFramedTransport.receiver(callback);
 
     const largeChunkSize = 2 * 100 * 1024 * 1024;
@@ -112,9 +112,9 @@
     onData(Buffer.concat([sizeBuffer, largeChunk]));
 
     assert.end();
-  }
+  },
 };
 
-Object.keys(cases).forEach(function(caseName) {
+Object.keys(cases).forEach(function (caseName) {
   test(caseName, cases[caseName]);
 });
diff --git a/lib/nodejs/test/helpers.js b/lib/nodejs/test/helpers.js
index f3c27b3..51a0523 100644
--- a/lib/nodejs/test/helpers.js
+++ b/lib/nodejs/test/helpers.js
@@ -22,14 +22,14 @@
 
 module.exports.transports = {
   buffered: thrift.TBufferedTransport,
-  framed: thrift.TFramedTransport
+  framed: thrift.TFramedTransport,
 };
 
 module.exports.protocols = {
   json: thrift.TJSONProtocol,
   binary: thrift.TBinaryProtocol,
   compact: thrift.TCompactProtocol,
-  header: thrift.THeaderProtocol
+  header: thrift.THeaderProtocol,
 };
 
 module.exports.ecmaMode = process.argv.includes("--es6") ? "es6" : "es5";
diff --git a/lib/nodejs/test/int64.test.js b/lib/nodejs/test/int64.test.js
index 27ad28c..21d4d58 100644
--- a/lib/nodejs/test/int64.test.js
+++ b/lib/nodejs/test/int64.test.js
@@ -23,7 +23,7 @@
 const test = require("tape");
 
 const cases = {
-  "should correctly generate Int64 constants": function(assert) {
+  "should correctly generate Int64 constants": function (assert) {
     const EXPECTED_SMALL_INT64_AS_NUMBER = 42;
     const EXPECTED_SMALL_INT64 = new Int64(42);
     const EXPECTED_MAX_JS_SAFE_INT64 = new Int64(Number.MAX_SAFE_INTEGER);
@@ -39,7 +39,7 @@
       EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64,
       EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64,
       EXPECTED_MAX_SIGNED_INT64,
-      EXPECTED_MIN_SIGNED_INT64
+      EXPECTED_MIN_SIGNED_INT64,
     ];
 
     assert.ok(EXPECTED_SMALL_INT64.equals(i64types.SMALL_INT64));
@@ -47,27 +47,27 @@
     assert.ok(EXPECTED_MIN_JS_SAFE_INT64.equals(i64types.MIN_JS_SAFE_INT64));
     assert.ok(
       EXPECTED_MAX_JS_SAFE_PLUS_ONE_INT64.equals(
-        i64types.MAX_JS_SAFE_PLUS_ONE_INT64
-      )
+        i64types.MAX_JS_SAFE_PLUS_ONE_INT64,
+      ),
     );
     assert.ok(
       EXPECTED_MIN_JS_SAFE_MINUS_ONE_INT64.equals(
-        i64types.MIN_JS_SAFE_MINUS_ONE_INT64
-      )
+        i64types.MIN_JS_SAFE_MINUS_ONE_INT64,
+      ),
     );
     assert.ok(EXPECTED_MAX_SIGNED_INT64.equals(i64types.MAX_SIGNED_INT64));
     assert.ok(EXPECTED_MIN_SIGNED_INT64.equals(i64types.MIN_SIGNED_INT64));
     assert.equal(
       EXPECTED_SMALL_INT64_AS_NUMBER,
-      i64types.SMALL_INT64.toNumber()
+      i64types.SMALL_INT64.toNumber(),
     );
     assert.equal(
       Number.MAX_SAFE_INTEGER,
-      i64types.MAX_JS_SAFE_INT64.toNumber()
+      i64types.MAX_JS_SAFE_INT64.toNumber(),
     );
     assert.equal(
       Number.MIN_SAFE_INTEGER,
-      i64types.MIN_JS_SAFE_INT64.toNumber()
+      i64types.MIN_JS_SAFE_INT64.toNumber(),
     );
 
     for (let i = 0; i < EXPECTED_INT64_LIST.length; ++i) {
@@ -79,14 +79,14 @@
       assert.ok(
         i64types.INT64_2_INT64_MAP[
           JSONInt64.toDecimalString(int64Object)
-        ].equals(int64Object)
+        ].equals(int64Object),
       );
     }
 
     assert.end();
-  }
+  },
 };
 
-Object.keys(cases).forEach(function(caseName) {
+Object.keys(cases).forEach(function (caseName) {
   test(caseName, cases[caseName]);
 });
diff --git a/lib/nodejs/test/server.js b/lib/nodejs/test/server.js
index 677839a..c8e7808 100644
--- a/lib/nodejs/test/server.js
+++ b/lib/nodejs/test/server.js
@@ -29,12 +29,12 @@
   .option(
     "-p, --protocol <protocol>",
     "Set thrift protocol (binary|compact|json)",
-    "binary"
+    "binary",
   )
   .option(
     "-t, --transport <transport>",
     "Set thrift transport (buffered|framed|http)",
-    "buffered"
+    "buffered",
   )
   .option("--ssl", "use ssl transport")
   .option("--port <port>", "Set thrift server port", 9090)
@@ -42,7 +42,7 @@
   .option(
     "-t, --type <type>",
     "Select server type (http|multiplex|tcp|websocket)",
-    "tcp"
+    "tcp",
   )
   .option("--callback", "test with callback style functions")
   .option("--es6", "Use es6 code")
@@ -68,7 +68,7 @@
 
 let options = {
   transport: helpers.transports[program.transport],
-  protocol: helpers.protocols[program.protocol]
+  protocol: helpers.protocols[program.protocol],
 };
 
 if (type === "http" || type === "websocket") {
@@ -78,30 +78,30 @@
   options = {
     services: { "/test": options },
     cors: {
-      "*": true
-    }
+      "*": true,
+    },
   };
 }
 
 let processor;
 if (type === "multiplex") {
   const SecondServiceHandler = {
-    secondtestString: function(thing, result) {
+    secondtestString: function (thing, result) {
       console.log('testString("' + thing + '")');
       result(null, 'testString("' + thing + '")');
-    }
+    },
   };
 
   processor = new thrift.MultiplexedProcessor();
 
   processor.registerProcessor(
     "ThriftTest",
-    new ThriftTest.Processor(ThriftTestHandler)
+    new ThriftTest.Processor(ThriftTestHandler),
   );
 
   processor.registerProcessor(
     "SecondService",
-    new SecondService.Processor(SecondServiceHandler)
+    new SecondService.Processor(SecondServiceHandler),
   );
 }
 
@@ -114,7 +114,7 @@
   ) {
     options.tls = {
       key: fs.readFileSync(path.resolve(__dirname, "server.key")),
-      cert: fs.readFileSync(path.resolve(__dirname, "server.crt"))
+      cert: fs.readFileSync(path.resolve(__dirname, "server.crt")),
     };
   }
 }
diff --git a/lib/nodejs/test/test-cases.js b/lib/nodejs/test/test-cases.js
index 02c566f..98077f7 100644
--- a/lib/nodejs/test/test-cases.js
+++ b/lib/nodejs/test/test-cases.js
@@ -65,9 +65,9 @@
   a: "123",
   "a b": "with spaces ",
   same: "same",
-  "0": "numeric key",
+  0: "numeric key",
   longValue: stringTest,
-  stringTest: "long key"
+  stringTest: "long key",
 });
 
 const simple = [
@@ -93,9 +93,9 @@
   ["testI64", new Int64(new Buffer([0, 0x20, 0, 0, 0, 0, 0, 1]))], // 2^53+1
   [
     "testI64",
-    new Int64(new Buffer([0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]))
+    new Int64(new Buffer([0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])),
   ], // -2^53-1
-  ["testTypedef", 69]
+  ["testTypedef", 69],
 ];
 
 const mapout = {};
@@ -106,21 +106,21 @@
 const deep = [
   [
     "testList",
-    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
-  ]
+    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
+  ],
 ];
 
 const deepUnordered = [
   ["testMap", mapout],
   ["testSet", [1, 2, 3]],
-  ["testStringMap", mapTestInput]
+  ["testStringMap", mapTestInput],
 ];
 
 const out = new ttypes.Xtruct({
   string_thing: "Zero",
   byte_thing: 1,
   i32_thing: -3,
-  i64_thing: 1000000
+  i64_thing: 1000000,
 });
 
 const out2 = new ttypes.Xtruct2();
@@ -129,44 +129,44 @@
 out2.i32_thing = 5;
 
 const crazy = new ttypes.Insanity({
-  userMap: { "5": 5, "8": 8 },
+  userMap: { 5: 5, 8: 8 },
   xtructs: [
     new ttypes.Xtruct({
       string_thing: "Goodbye4",
       byte_thing: 4,
       i32_thing: 4,
-      i64_thing: 4
+      i64_thing: 4,
     }),
     new ttypes.Xtruct({
       string_thing: "Hello2",
       byte_thing: 2,
       i32_thing: 2,
-      i64_thing: 2
-    })
-  ]
+      i64_thing: 2,
+    }),
+  ],
 });
 
 const crazy2 = new ttypes.Insanity({
-  userMap: { "5": 5, "8": 8 },
+  userMap: { 5: 5, 8: 8 },
   xtructs: [
     {
       string_thing: "Goodbye4",
       byte_thing: 4,
       i32_thing: 4,
-      i64_thing: 4
+      i64_thing: 4,
     },
     {
       string_thing: "Hello2",
       byte_thing: 2,
       i32_thing: 2,
-      i64_thing: 2
-    }
-  ]
+      i64_thing: 2,
+    },
+  ],
 });
 
 const insanity = {
-  "1": { "2": crazy, "3": crazy },
-  "2": { "6": { userMap: {}, xtructs: [] } }
+  1: { 2: crazy, 3: crazy },
+  2: { 6: { userMap: {}, xtructs: [] } },
 };
 
 module.exports.simple = simple;
diff --git a/lib/nodejs/test/test_driver.js b/lib/nodejs/test/test_driver.js
index 7c9a919..0593aea 100644
--- a/lib/nodejs/test/test_driver.js
+++ b/lib/nodejs/test/test_driver.js
@@ -34,18 +34,18 @@
 const Int64 = require("node-int64");
 const testCases = require("./test-cases");
 
-exports.ThriftTestDriver = function(client, callback) {
+exports.ThriftTestDriver = function (client, callback) {
   test(
     "NodeJS Style Callback Client Tests",
     { skip: helpers.ecmaMode === "es6" },
-    function(assert) {
+    function (assert) {
       const checkRecursively = makeRecursiveCheck(assert);
 
       function makeAsserter(assertionFn) {
-        return function(c) {
+        return function (c) {
           const fnName = c[0];
           const expected = c[1];
-          client[fnName](expected, function(err, actual) {
+          client[fnName](expected, function (err, actual) {
             assert.error(err, fnName + ": no callback error");
             assertionFn(actual, expected, fnName);
           });
@@ -53,18 +53,18 @@
       }
 
       testCases.simple.forEach(
-        makeAsserter(function(a, e, m) {
+        makeAsserter(function (a, e, m) {
           if (a instanceof Int64) {
             const e64 = e instanceof Int64 ? e : new Int64(e);
             assert.deepEqual(a.buffer, e64.buffer, m);
           } else {
             assert.equal(a, e, m);
           }
-        })
+        }),
       );
       testCases.deep.forEach(makeAsserter(assert.deepEqual));
       testCases.deepUnordered.forEach(
-        makeAsserter(makeUnorderedDeepEqual(assert))
+        makeAsserter(makeUnorderedDeepEqual(assert)),
       );
 
       const arr = [];
@@ -72,106 +72,106 @@
         arr[i] = 255 - i;
       }
       let buf = new Buffer(arr);
-      client.testBinary(buf, function(err, response) {
+      client.testBinary(buf, function (err, response) {
         assert.error(err, "testBinary: no callback error");
         assert.equal(response.length, 256, "testBinary");
         assert.deepEqual(response, buf, "testBinary(Buffer)");
       });
       buf = new Buffer(arr);
-      client.testBinary(buf.toString("binary"), function(err, response) {
+      client.testBinary(buf.toString("binary"), function (err, response) {
         assert.error(err, "testBinary: no callback error");
         assert.equal(response.length, 256, "testBinary");
         assert.deepEqual(response, buf, "testBinary(string)");
       });
 
-      client.testMapMap(42, function(err, response) {
+      client.testMapMap(42, function (err, response) {
         const expected = {
-          "4": { "1": 1, "2": 2, "3": 3, "4": 4 },
-          "-4": { "-4": -4, "-3": -3, "-2": -2, "-1": -1 }
+          4: { 1: 1, 2: 2, 3: 3, 4: 4 },
+          "-4": { "-4": -4, "-3": -3, "-2": -2, "-1": -1 },
         };
         assert.error(err, "testMapMap: no callback error");
         assert.deepEqual(expected, response, "testMapMap");
       });
 
-      client.testStruct(testCases.out, function(err, response) {
+      client.testStruct(testCases.out, function (err, response) {
         assert.error(err, "testStruct: no callback error");
         checkRecursively(testCases.out, response, "testStruct");
       });
 
-      client.testNest(testCases.out2, function(err, response) {
+      client.testNest(testCases.out2, function (err, response) {
         assert.error(err, "testNest: no callback error");
         checkRecursively(testCases.out2, response, "testNest");
       });
 
-      client.testInsanity(testCases.crazy, function(err, response) {
+      client.testInsanity(testCases.crazy, function (err, response) {
         assert.error(err, "testInsanity: no callback error");
         checkRecursively(testCases.insanity, response, "testInsanity");
       });
 
-      client.testInsanity(testCases.crazy2, function(err, response) {
+      client.testInsanity(testCases.crazy2, function (err, response) {
         assert.error(err, "testInsanity2: no callback error");
         checkRecursively(testCases.insanity, response, "testInsanity2");
       });
 
-      client.testException("TException", function(err, response) {
+      client.testException("TException", function (err, response) {
         assert.ok(
           err instanceof TException,
-          "testException: correct error type"
+          "testException: correct error type",
         );
         assert.ok(!response, "testException: no response");
       });
 
-      client.testException("Xception", function(err, response) {
+      client.testException("Xception", function (err, response) {
         assert.ok(
           err instanceof ttypes.Xception,
-          "testException: correct error type"
+          "testException: correct error type",
         );
         assert.ok(!response, "testException: no response");
         assert.equal(err.errorCode, 1001, "testException: correct error code");
         assert.equal(
           "Xception",
           err.message,
-          "testException: correct error message"
+          "testException: correct error message",
         );
       });
 
-      client.testException("no Exception", function(err, response) {
+      client.testException("no Exception", function (err, response) {
         assert.error(err, "testException: no callback error");
         assert.ok(!response, "testException: no response");
       });
 
-      client.testOneway(0, function(err, response) {
+      client.testOneway(0, function (err, response) {
         assert.error(err, "testOneway: no callback error");
         assert.strictEqual(response, undefined, "testOneway: void response");
       });
 
-      checkOffByOne(function(done) {
-        client.testI32(-1, function(err, response) {
+      checkOffByOne(function (done) {
+        client.testI32(-1, function (err, response) {
           assert.error(err, "checkOffByOne: no callback error");
           assert.equal(-1, response);
           assert.end();
           done();
         });
       }, callback);
-    }
+    },
   );
 
   // ES6 does not support callback style
   if (helpers.ecmaMode === "es6") {
-    checkOffByOne(done => done(), callback);
+    checkOffByOne((done) => done(), callback);
   }
 };
 
-exports.ThriftTestDriverPromise = function(client, callback) {
-  test("Promise Client Tests", function(assert) {
+exports.ThriftTestDriverPromise = function (client, callback) {
+  test("Promise Client Tests", function (assert) {
     const checkRecursively = makeRecursiveCheck(assert);
 
     function makeAsserter(assertionFn) {
-      return function(c) {
+      return function (c) {
         const fnName = c[0];
         const expected = c[1];
         client[fnName](expected)
-          .then(function(actual) {
+          .then(function (actual) {
             assertionFn(actual, expected, fnName);
           })
           .catch(() => assert.fail("fnName"));
@@ -179,63 +179,63 @@
     }
 
     testCases.simple.forEach(
-      makeAsserter(function(a, e, m) {
+      makeAsserter(function (a, e, m) {
         if (a instanceof Int64) {
           const e64 = e instanceof Int64 ? e : new Int64(e);
           assert.deepEqual(a.buffer, e64.buffer, m);
         } else {
           assert.equal(a, e, m);
         }
-      })
+      }),
     );
     testCases.deep.forEach(makeAsserter(assert.deepEqual));
     testCases.deepUnordered.forEach(
-      makeAsserter(makeUnorderedDeepEqual(assert))
+      makeAsserter(makeUnorderedDeepEqual(assert)),
     );
 
     client
       .testStruct(testCases.out)
-      .then(function(response) {
+      .then(function (response) {
         checkRecursively(testCases.out, response, "testStruct");
       })
       .catch(() => assert.fail("testStruct"));
 
     client
       .testNest(testCases.out2)
-      .then(function(response) {
+      .then(function (response) {
         checkRecursively(testCases.out2, response, "testNest");
       })
       .catch(() => assert.fail("testNest"));
 
     client
       .testInsanity(testCases.crazy)
-      .then(function(response) {
+      .then(function (response) {
         checkRecursively(testCases.insanity, response, "testInsanity");
       })
       .catch(() => assert.fail("testInsanity"));
 
     client
       .testInsanity(testCases.crazy2)
-      .then(function(response) {
+      .then(function (response) {
         checkRecursively(testCases.insanity, response, "testInsanity2");
       })
       .catch(() => assert.fail("testInsanity2"));
 
     client
       .testException("TException")
-      .then(function() {
+      .then(function () {
         assert.fail("testException: TException");
       })
-      .catch(function(err) {
+      .catch(function (err) {
         assert.ok(err instanceof TException);
       });
 
     client
       .testException("Xception")
-      .then(function() {
+      .then(function () {
         assert.fail("testException: Xception");
       })
-      .catch(function(err) {
+      .catch(function (err) {
         assert.ok(err instanceof ttypes.Xception);
         assert.equal(err.errorCode, 1001);
         assert.equal("Xception", err.message);
@@ -243,22 +243,22 @@
 
     client
       .testException("no Exception")
-      .then(function(response) {
+      .then(function (response) {
         assert.equal(undefined, response); //void
       })
       .catch(() => assert.fail("testException"));
 
     client
       .testOneway(0)
-      .then(function(response) {
+      .then(function (response) {
         assert.strictEqual(response, undefined, "testOneway: void response");
       })
       .catch(() => assert.fail("testOneway: should not reject"));
 
-    checkOffByOne(function(done) {
+    checkOffByOne(function (done) {
       client
         .testI32(-1)
-        .then(function(response) {
+        .then(function (response) {
           assert.equal(-1, response);
           assert.end();
           done();
@@ -272,7 +272,7 @@
 // =========================================================
 
 function makeRecursiveCheck(assert) {
-  return function(map1, map2, msg) {
+  return function (map1, map2, msg) {
     const equal = checkRecursively(map1, map2);
 
     assert.ok(equal, msg);
@@ -295,7 +295,7 @@
             return map1 == map2;
           }
         } else {
-          return Object.keys(map1).every(function(key) {
+          return Object.keys(map1).every(function (key) {
             return checkRecursively(map1[key], map2[key]);
           });
         }
@@ -319,7 +319,7 @@
    * Because this is the last test against the server, when it completes
    * the entire suite is complete by definition (the tests run serially).
    */
-  done(function() {
+  done(function () {
     test_complete = true;
   });
 
@@ -334,7 +334,7 @@
         callback(
           "Server test failed to complete after " +
             (retry_limit * retry_interval) / 1000 +
-            " seconds"
+            " seconds",
         );
       }
     }
@@ -344,7 +344,7 @@
 }
 
 function makeUnorderedDeepEqual(assert) {
-  return function(actual, expected, name) {
+  return function (actual, expected, name) {
     assert.equal(actual.length, expected.length, name);
     for (const k in actual) {
       let found = false;
diff --git a/lib/nodejs/test/test_handler.js b/lib/nodejs/test/test_handler.js
index 317a7c8..a6a6fc2 100644
--- a/lib/nodejs/test/test_handler.js
+++ b/lib/nodejs/test/test_handler.js
@@ -24,7 +24,7 @@
 const TException = require("thrift").Thrift.TException;
 
 function makeSyncHandler() {
-  return function(thing) {
+  return function (thing) {
     return thing;
   };
 }
@@ -36,11 +36,11 @@
   testMulti: testMulti,
   testException: testException,
   testMultiException: testMultiException,
-  testOneway: testOneway
+  testOneway: testOneway,
 };
 
 function makeAsyncHandler(label) {
-  return function(thing, result) {
+  return function (thing, result) {
     thing = syncHandlers[label](thing);
     result(null, thing);
   };
@@ -51,7 +51,7 @@
   testMulti: testMultiAsync,
   testException: testExceptionAsync,
   testMultiException: testMultiExceptionAsync,
-  testOneway: testOnewayAsync
+  testOneway: testOnewayAsync,
 };
 
 const identityHandlers = [
@@ -69,7 +69,7 @@
   "testSet",
   "testList",
   "testEnum",
-  "testTypedef"
+  "testTypedef",
 ];
 
 function testVoid() {
@@ -208,12 +208,12 @@
   testOneway(sleepFor);
 }
 
-identityHandlers.forEach(function(label) {
+identityHandlers.forEach(function (label) {
   syncHandlers[label] = makeSyncHandler(label);
   asyncHandlers[label] = makeAsyncHandler(label);
 });
 
-["testMapMap", "testInsanity"].forEach(function(label) {
+["testMapMap", "testInsanity"].forEach(function (label) {
   asyncHandlers[label] = makeAsyncHandler(label);
 });
 
