非常に単純な node.js の質問です。ストリーム オブジェクトを拡張して、リモート接続から入ってくるデータを再チャンクしたいと考えています。複数の telnet を実行して他のサーバーにコマンドを送信すると、応答が返されます。こんな感じです。
> Hello, this is a command
This is the response to the command.
Sometimes it pauses here (which triggers the 'data' event prematurely).
But the message isn't over until you see the semicolon
;
私がやりたいのは、一時停止時に「データ」イベントをトリガーする代わりに、 ; を待つことです。カスタム「メッセージ」イベントをトリガーします。
この質問を読んで読み直しましたが、まだよくわかりません(一部は書き込み可能なストリームに関するものであり、一部はまだCoffeeScriptを理解していないためです)。
編集:ここで2つのことを尋ねていると思います:
- net.CreateConnection が使用するストリーム オブジェクトを拡張/継承するにはどうすればよいですか?
- '分割' を行い、各部分を再'放出' するように、prototype.write を拡張することはできますか?
これは私がこれまでに行ったことの抜粋ですが、チャンキングは「データ」リスナーの一部ではなく、ストリームの一部である必要があります。
var net = require('net');
var nodes = [
//list of ip addresses
];
function connectToServer(ip) {
var conn = net.createConnection(3083, ip);
conn.on('connect', function() {
conn.write ("login command;");
});
conn.on('data', function(data) {
var read = data.toString();
var message_list = read.split(/^;/m);
message_list.forEach (function(message) {
console.log("Atonomous message from " + ip + ':' + message);
//I need to extend the stream object to emit these instead of handling it here
//Also, sometimes the data chunking breaks the messages in two,
//but it should really wait for a line beginning with a ; before it emits.
});
});
conn.on('end', function() {
console.log("Lost conncection to " + ip + "!!");
});
conn.on('error', function(err) {
console.log("Connection error: " + err + " for ip " + ip);
});
}
nodes.forEach(function(node) {
connectToServer(node);
});
生のストリームを使用していた場合、次のようなものになると思います (他の場所で見つけたコードに基づく)。
var messageChunk = function () {
this.readable = true;
this.writable = true;
};
require("util").inherits(messageChunk, require("stream"));
messageChunk.prototype._transform = function (data) {
var regex = /^;/m;
var cold_storage = '';
if (regex.test(data))
{
var message_list = read.split(/^;/m);
message_list.forEach (function(message) {
this.emit("data", message);
});
}
else
{
//somehow store the data until data with a /^;/ comes in.
}
}
messageChunk.prototype.write = function () {
this._transform.apply(this, arguments);
};
しかし、私は生のストリームを使用していません。net.createConnection オブジェクトの戻り値でストリーム オブジェクトを使用しています。