Simple client for listening to a Twitter user stream via version 1.1 of the streaming API.
Before running demo.coffee
, place your app's OAuth keys in keys.json
This is basically a coffescript translation of @aivis' user-stream.
Simple client for listening to a Twitter user stream via version 1.1 of the streaming API.
Before running demo.coffee
, place your app's OAuth keys in keys.json
This is basically a coffescript translation of @aivis' user-stream.
Listener = require './listen' | |
listen = new Listener(require 'keys') | |
listen.start() | |
listen.on 'data', (tweet) -> console.log tweet.text if tweet.text? |
{ "consumerKey": "", | |
"consumerSecret": "", | |
"accessToken": "", | |
"accessTokenSecret": "" } | |
oauth = require 'oauth' | |
{EventEmitter} = require 'events' | |
class Listener extends EventEmitter | |
urls: | |
stream: 'https://userstream.twitter.com/1.1/user.json' | |
request: 'https://api.twitter.com/oauth/request_token' | |
access: 'https://api.twitter.com/oauth/access_token' | |
constructor: (@args) -> | |
@chunkSize = 0 # length of next data chunk for buffer | |
@buffer = '' | |
oauthArgs = [ | |
@urls.request, | |
@urls.access, | |
@args.consumerKey, | |
@args.consumerSecret, | |
'1.0', | |
null, | |
'HMAC-SHA1', | |
null, | |
Accept: '*/*' | |
Connection: 'close' | |
'User-Agent': 'listen.js' | |
] | |
@oauth = new oauth.OAuth oauthArgs... | |
start: (args=with:'user') -> | |
args = {} if typeof args != 'object' | |
args.stall_warnings = 'true' | |
req = @oauth.post( | |
@urls.stream, | |
@args.accessToken, | |
@args.accessTokenSecret, | |
args | |
) | |
@destroy = -> req.abort() | |
stream = @ | |
req.on 'response', (res) -> | |
if res.statusCode > 200 | |
stream.emit 'error', {type: 'response', data: {code: res.statusCode}} | |
else | |
stream.emit 'connected' | |
res.setEncoding 'utf8' | |
res.on 'data', (data) -> stream.parse data | |
res.on 'error', (err) -> stream.emit('close', err) | |
res.on 'end', -> stream.emit('close', 'socket end') | |
res.on 'close', -> req.abort() | |
req.on 'error', (err) -> stream.emit('error', {type: 'request', data: err}) | |
req.end() | |
# See ... | |
# https://dev.twitter.com/docs/streaming-apis/processing | |
# https://github.com/AvianFlu/ntwitter/blob/master/lib/parser.js | |
# https://github.com/aivis/user-stream/blob/master/lib/user-stream.js#L103 | |
parse: (data) -> | |
for t in data.split('\r\n') when t | |
try | |
@emit 'data', JSON.parse(t) | |
catch err | |
@emit 'garbage', t | |
module.exports = Listener |