UNPKG

1.9 kBJavaScriptView Raw
1'use strict';
2
3// glorious streaming json parser, built specifically for the twitter streaming api
4// assumptions:
5// 1) ninjas are mammals
6// 2) tweets come in chunks of text, surrounded by {}'s, separated by line breaks
7// 3) only one tweet per chunk
8//
9// p = new parser.instance()
10// p.addListener('object', function...)
11// p.receive(data)
12// p.receive(data)
13// ...
14
15var EventEmitter = require('events').EventEmitter;
16
17var Parser = module.exports = function Parser() {
18 // Make sure we call our parents constructor
19 EventEmitter.call(this);
20 this.buffer = '';
21 return this;
22};
23
24// The parser emits events!
25Parser.prototype = Object.create(EventEmitter.prototype);
26
27Parser.END = '\r\n';
28Parser.END_LENGTH = 2;
29
30Parser.prototype.receive = function receive(buffer) {
31 this.buffer += buffer.toString('utf8');
32 var index, json;
33
34 // We have END?
35 while ((index = this.buffer.indexOf(Parser.END)) > -1) {
36 json = this.buffer.slice(0, index);
37 this.buffer = this.buffer.slice(index + Parser.END_LENGTH);
38 if (json.length > 0) {
39 try {
40 json = JSON.parse(json);
41 // Event message
42 if (json.event !== undefined) {
43 // First emit specific event
44 this.emit(json.event, json);
45 // Now emit catch-all event
46 this.emit('event', json);
47 }
48 // Delete message
49 else if (json.delete !== undefined) {
50 this.emit('delete', json);
51 }
52 // Friends message (beginning of stream)
53 else if (json.friends !== undefined || json.friends_str !== undefined) {
54 this.emit('friends', json);
55 }
56 // Any other message
57 else {
58 this.emit('data', json);
59 }
60 }
61 catch (error) {
62 error.source = json;
63 this.emit('error', error);
64 }
65 }
66 else {
67 // Keep Alive
68 this.emit('ping');
69 }
70 }
71};