nodeでmessagepackのdecodeにハマった

APIクライアントを適当に書いてる時に、何かdecodeうまく行かない問題にハマった

decodeに使ったライブラリ

https://github.com/kawanet/msgpack-lite

jsでdecodeしようと思ったら多分これになる?ハズ

ダメだったコード例

  var request = require("request");

  request.get({
    url:"http://localhost:3000"
  }, function (error, responce, body){

   var msgpack = require("msgpack-lite");
   var data = msgpack.decode(body);

   console.log(data);
  });

最初は公式のexsampleに従ったままサクッとできると思ったらエラー

(略)/msgpack-lite/lib/read-core.js:24
    if (!func) throw new Error("Invalid type: " + (type ? ("0x" + type.toString(16)) : type));
               ^

Error: Invalid type: 0x�

http経由だとそんな簡単じゃないのかーなんて思いつつ、Unit8Arrayとかもゴニョりつつ 色々ググりながら試していっても中々解決できず。 最終的にはバッファの値がなぜか同一じゃないことに気づく。これ普通一緒なんじゃ・・・

■元のバイナリのバッファ
<Buffer 81 a4 74 65 73 74 a4 74 65 73 74>

■上記例コードのbodyのバッファ
<Buffer ef bf bd ef bf bd 74 65 73 74 ef bf bd 74 65 73 74>

そもそも受け取るデータがエンコードした時点のバッファと違かったら正しくデコード出来ないよね? という事で別のライブラリを利用したらあっさり解決。

var http = require("http");

var options = {
  hostname: 'localhost',
  port: 3000,
  path: '/'
};

var req = http.get(options, function(res){

  var output = '';

  res.on('data', function(chunk){
    var msgpack = require("msgpack-lite");
    output = msgpack.decode(chunk);
  });

  res.on('end', function(){
    console.log(output);
  });
});

req.end();

ライブラリ変えたらあっさり解決するの理不尽すぎた。 requestライブラリ使っても問題なくデコードする方法もあるんだろうけど うまく解決できず。諦め