Socket.IO で RangeError: Maximum call stack size exceeded #nodejs_jp

jxck:

Node.js v0.7 系から、 EventEmitter の変更が原因で、 Socket.IO が落ちるバグが発生しています。

具体的には Socket.IO@0.9.6(およびそれ以前) を node@0.7.8(及び 0.7.x 全般) で起動した後、ブラウザからアクセスしたら、下記のようなトレースを吐いて落ちます。

Jxck$ node server.js
info  - socket.io started

/../gist-2292777/node_modules/socket.io/lib/manager.js:0
(function (exports, require, module, __filename, __dirname) { /*!
^
RangeError: Maximum call stack size exceeded

上記を再現できるソースはこちら。なんでもないサーバ実装です。

https://gist.github.com/2292777

このバグの原因は、Node.js 本体の  EventEmitter にあったこの修正です。

https://github.com/joyent/node/commit/78dc13fbf97e2e3003e6f3baacdd5ff60e8de3f7

これにより、Socket.IO サーバ内で無限ループな感じになって、スタックが食いちぎられます。

そして、対応する Socket.IO への修正はこちら。

https://github.com/LearnBoost/socket.io/commit/e1884859bcbb57daeb843421cc5b4b95bd914bd8

しかし、socket.io@0.9.6 リリースの直後にコミットされて、まだ socket.io@0.9.7 がリリースされていないため、

自分でリポジトリから直接 clone して使うか、 node@0.6 系で動かすしか方法が無いです。

おそらく、 socket.io@0.9.8 がリリースされれば治るとは思いますが、

node@0.7 系は unstable だということで、 node@0.6 系の stable の方を重視するような

意味合いのコメントがどっかにありました。そういわれればまあ仕方ないのですが、

とりあえずハマった方々バージョンを見なおしてみてください。

Prev