mirror of
https://github.com/thewesker/bug-em.git
synced 2025-12-22 13:01:05 -05:00
57 lines
1.3 KiB
JavaScript
57 lines
1.3 KiB
JavaScript
//
|
|
// Parser - for Twitter Streaming API
|
|
//
|
|
var util = require('util')
|
|
, EventEmitter = require('events').EventEmitter;
|
|
|
|
var Parser = module.exports = function () {
|
|
this.message = ''
|
|
|
|
EventEmitter.call(this);
|
|
};
|
|
|
|
util.inherits(Parser, EventEmitter);
|
|
|
|
Parser.prototype.parse = function (chunk) {
|
|
this.message += chunk;
|
|
chunk = this.message;
|
|
|
|
var size = chunk.length
|
|
, start = 0
|
|
, offset = 0
|
|
, curr
|
|
, next;
|
|
|
|
while (offset < size) {
|
|
curr = chunk[offset];
|
|
next = chunk[offset + 1];
|
|
|
|
if (curr === '\r' && next === '\n') {
|
|
var piece = chunk.slice(start, offset);
|
|
start = offset += 2;
|
|
|
|
if (!piece.length) { continue; } //empty object
|
|
|
|
if (piece === 'Exceeded connection limit for user') {
|
|
this.emit('connection-limit-exceeded',
|
|
new Error('Twitter says: ' + piece + '. Only instantiate one stream per set of credentials.'));
|
|
continue;
|
|
}
|
|
|
|
try {
|
|
var msg = JSON.parse(piece)
|
|
} catch (err) {
|
|
this.emit('error', new Error('Error parsing twitter reply: `'+piece+'`, error message `'+err+'`'));
|
|
} finally {
|
|
if (msg)
|
|
this.emit('element', msg)
|
|
|
|
continue
|
|
}
|
|
}
|
|
offset++;
|
|
}
|
|
|
|
this.message = chunk.slice(start, size);
|
|
};
|