Skip to content

Instantly share code, notes, and snippets.

@ishiduca
Created November 8, 2012 11:12
Show Gist options
  • Save ishiduca/4038218 to your computer and use it in GitHub Desktop.
Save ishiduca/4038218 to your computer and use it in GitHub Desktop.
FriendFeed-Realtime-Stream - inspired form AnyEvent::FriendFeed::Realtime

FriendFeed-Realtime-Stream

subscribe to FriendFeed Real-time API. inspired from AnyEvent::FriendFeed::Realtime

Usage

var createFriendFeedRealtimeStream = require('friendfeed-realtime-stream');
var stream = createFriendFeedRealtimeStream({
    user:       'your_username'
  , remote_key: 'your_remote_key' // look at "see also"
  , request:    '/feed/NICKNAME/friends'
});

stream.on('entry', function _onEntry (entry) {
    var reg = /<a(?:.*?)href="(.*?)"(?:.*?)>(.*?)<\/a>/g;
    util.log(entry.from.name + ': ' + entry.body.replace(reg, "$2 ($1)"));
});

stream.on('error', function _onError (e) {
    console.error(e);
    process.exit(1);
});

stream.long_poll(); // required

createFriendFeedRealtimeStream(options, [onEntry]);

create a Friendfeed-Realtime Stream.

arguments: options

  • user: your username
  • remote_key: your remote key
  • request: ex: '/feed/home', '/feed/NICKNAME/friends', '/feed/seach?q=keyword'

arguments: onEntry

show Event: 'entry'

stream.long_poll()

start to subscribe.

Event: 'entry'

    stream.on('entry', function (entry, http_client_response) {
        ...
    });

Event: 'error'

    stream.on('error', function (error) {
        ...
    });

Event: 'response'

    stream.on('response', function (http_client_response) {
        ...
    });

SeeAlso

#!/usr/bin/env node
var util = require('util');
var qs = require('querystring');
//var myStream = require('./index').createFriendFeedRealtimeStream;
//var stream = myStream({
var stream = require('friendfeed-realtime-stream')({
user: process.argv[2] // 'your_username'
, remote_key: process.argv[3] // 'your_remote_key'
, request: (process.argv[4])
?
(function () {
var pq = process.argv[4].split('?');
return [ pq[0], qs.stringify(qs.parse(pq[1])) ].join('?');
})()
:
'/feed/home'
}, function _onEntry (entry, res) {
var reg = /<a(?:.*?)href="(.*?)"(?:.*?)>(.*?)<\/a>/g;
util.log(entry.from.name + ': ' + entry.body.replace(reg, "$2 ($1)"));
});
stream.on('error', function (e) {
console.error(e); process.exit(1);
});
stream.long_poll();
var http = require('http')
, querystring = require('querystring')
, util = require('util')
, events = require('events')
;
function FriendFeedRealtimeStream (opts, onEntry) {
opts || (opts = {});
var that = this;
('user remote_key request').split(' ').forEach(function (key) {
opts[key] && (that[key] = opts[key]);
});
this.request || (this.request = '/feed/home');
(typeof onEntry === 'function') && this.on('entry', onEntry);
}
util.inherits(FriendFeedRealtimeStream, events.EventEmitter);
(function (p) {
p.api = function (opt) {
var _api = {
port: 80
, host: 'friendfeed-api.com'
, path: '/v2/updates' + this.request +
(/\?/.test(this.request) ? '&' : '?') +
querystring.stringify(opt)
};
(this.user && this.remote_key) &&
(_api.auth = [ this.user, this.remote_key ].join(':'));
return _api;
};
p.long_poll = function (opt) {
var that = this;
var req = http.request(this.api(opt || {updates: 1}));
req.on('error', function (err) { that.emit('error', err) });
req.on('response', function (res) {
that.emit('response', res);
res.setEncoding('utf8');
(/^2/.test(res.statusCode)) ||
that.emit('error', new Error(res.statusCode + ' ' +
http.STATUS_CODES[res.statusCode]));
var _data = '';
res.on('data', function (chunk) { _data += chunk });
res.on('end', function () {
var data; try {
data = JSON.parse(_data);
} catch (e) { that.emit('error', e) }
data.errorCode && that.emit('error', new Error(data.errorCode));
data.entries.forEach(function (entry) {
that.emit('entry', entry, res);
});
data.realtime &&
that.long_poll({cursor: data.realtime.cursor});
});
req = undefined;
});
req.end();
};
})(FriendFeedRealtimeStream.prototype);
module.exports = function (opts, onEntry) {
return module.exports.createFriendFeedRealtimeStream(opts, onEntry);
};
module.exports.createFriendFeedRealtimeStream = function (opts, onEntry) {
return new FriendFeedRealtimeStream(opts, onEntry);
};
module.exports.version = '0.0.0-alpha-1';
{
"name": "friendfeed-realtime-stream",
"version": "0.0.0-alpha",
"description": "subscribe to Friendfeed Real-time API. (inspired from AnyEvent::FriendFeed::Realtime)",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"friendfeed",
"long-poll"
],
"author": "[email protected]",
"license": "BSD"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment