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 |