Операции с однородными потоками данных
Недавно задумал написать вспомогательный модуль для node.js, чтобы облегчить работу с потоками для чтения. Например, быстро собрать по кускам ответ от сервера и представить в виде одной строки или JSON.
То, есть, чтобы вместо вот этого:
var call = http.request(options, function(res) {
var data = '';
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function(chunk) {
data += chunk;
// Сделать что нибудь с полным ответом сервера
});
});
call.end();
…можно было писать как нибудь так:
var call = http.request(options, function(res) {
s(res).collect().on('data', function(data)
// Сделать что нибудь с полным ответом сервера
});
});
call.end();
В результате получился модуль streamops (Stream Operations) в таком монадическом стиле а-ля jQuery. Потихоньку модуль оброс (и продолжает обрастать) разными полезными функциями, например: разрезание потока по разделителю, фильтрация событий по регулярному выражению и т.д.
var test = new events.EventEmitter();
// Преобразуем текст входящих событий в JSON, оставляем только поле test
// и отфильтровываем все значения которые не начинаются на "a"
sop.sop(test).json().only('test').filter(/a.+/).log();
test.emit('data', JSON.stringify({"test": "a1"}));
test.emit('data', JSON.stringify({"test": "b1"}));
test.emit('data', JSON.stringify({"test": "a2"}));
test.emit('data', JSON.stringify({"test": "b2"}));
test.emit('end');
В дальнейшем я хочу немного поэкспериментировать с представлением периодических соединений с сайтами как read-only потоков, чтобы можно было фильтровать результаты нескольких последовательных вызовов страницы (например, периодический опрос API). Также хочется посмотреть на потоковые JSON-парсеры.
P.S.: нашёл похожий проект — async.js от Fabian Jakobs
Что-то мне подсказывает, что твой модуль является частным случаем микрософтовских reactive extensions. Точно не могу сказать, некогда проверять пока, но сильно напоминает.
По rx есть неплохое видео, http://channel9.msdn.com/Events/MIX/MIX10/FTL01