2022-10-07 15:45:45 -04:00

55 lines
2.0 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.EStreamParserEvent = void 0;
const events_1 = require("events");
class TweetStreamParser extends events_1.EventEmitter {
constructor() {
super(...arguments);
this.currentMessage = '';
}
// Code partially belongs to twitter-stream-api for this
// https://github.com/trygve-lie/twitter-stream-api/blob/master/lib/parser.js
push(chunk) {
this.currentMessage += chunk;
chunk = this.currentMessage;
const size = chunk.length;
let start = 0;
let offset = 0;
while (offset < size) {
// Take [offset, offset+1] inside a new string
if (chunk.slice(offset, offset + 2) === '\r\n') {
// If chunk contains \r\n after current offset,
// parse [start, ..., offset] as a tweet
const piece = chunk.slice(start, offset);
start = offset += 2;
// If empty object
if (!piece.length) {
continue;
}
try {
const payload = JSON.parse(piece);
if (payload) {
this.emit(EStreamParserEvent.ParsedData, payload);
continue;
}
}
catch (error) {
this.emit(EStreamParserEvent.ParseError, error);
}
}
offset++;
}
this.currentMessage = chunk.slice(start, size);
}
/** Reset the currently stored message (f.e. on connection reset) */
reset() {
this.currentMessage = '';
}
}
exports.default = TweetStreamParser;
var EStreamParserEvent;
(function (EStreamParserEvent) {
EStreamParserEvent["ParsedData"] = "parsed data";
EStreamParserEvent["ParseError"] = "parse error";
})(EStreamParserEvent = exports.EStreamParserEvent || (exports.EStreamParserEvent = {}));