EventEmitterでのDomain対応
イベントの伝播の仕組みのほうはEventEmitterのemitそのものに組み込まれています。
// events.js (v0.10.18) EventEmitter.prototype.emit = function(type) { //(省略) if (type === 'error') { if (!this._events.error || (typeof this._events.error === 'object' && !this._events.error.length)) { er = arguments[1]; if (this.domain) { if (!er) er = new TypeError('Uncaught, unspecified "error" event.'); er.domainEmitter = this; er.domain = this.domain; er.domainThrown = false; this.domain.emit('error', er); // <-ココ! } else if (er instanceof Error) { throw er; // Unhandled 'error' event } else { throw TypeError('Uncaught, unspecified "error" event.'); } return false; } //(省略)
EventEmitterで'error'イベントがemitされると自分で'error'イベントリスナを張ってなければ、次にドメインが設定されてるかを見て、設定されていればそちらにイベントを投げ変える仕組みになってます。
前提となるEventEmitterへのドメイン設定は、コンストラクタ呼び出し時にグローバルなドメイン利用フラグが立ってると、require('domain)を遅延ロードした上でアクティブなドメインを設定保持します。