streamsplit
Version:
Memory/CPU efficient stream splitter by token
125 lines (103 loc) • 9.97 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _streamsearch = require('streamsearch');
var _streamsearch2 = _interopRequireDefault(_streamsearch);
var _long = require('long');
var _long2 = _interopRequireDefault(_long);
var _rxjs = require('rxjs');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var SimpleSplitter = function () {
function SimpleSplitter() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref$stream = _ref.stream,
stream = _ref$stream === undefined ? null : _ref$stream,
_ref$token = _ref.token,
token = _ref$token === undefined ? null : _ref$token,
_ref$noEmptyMatches = _ref.noEmptyMatches,
noEmptyMatches = _ref$noEmptyMatches === undefined ? false : _ref$noEmptyMatches;
_classCallCheck(this, SimpleSplitter);
this.readStream = stream;
this.token = token;
this._subject = null;
this.noEmptyMatches = noEmptyMatches;
if (token === null) {
throw new Error('Token cannot be null');
}
if (stream === null) {
throw new Error('Stream param cannot be null or undefined');
}
this.ss = new _streamsearch2.default(this.token);
}
_createClass(SimpleSplitter, [{
key: '_origObservable',
value: function _origObservable() {
var _this = this;
if (this._subject !== null) {
return this._subject;
}
var subject = new _rxjs.Subject();
function emitData(data) {
process.nextTick(function () {
subject.next(data);
});
}
var nextStart = new _long2.default(0);
var possibleEnd = new _long2.default(0);
this.ss.on('info', function (isMatch, data) {
var start = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
var end = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
if (isMatch) {
emitData({
start: new _long2.default(nextStart),
end: possibleEnd.add(end - start)
});
nextStart = possibleEnd.add(end - start).add(_this.token.length);
possibleEnd = new _long2.default(nextStart);
} else {
possibleEnd = possibleEnd.add(end - start);
}
});
this.readStream.on('data', function (chunk) {
return _this.ss.push(chunk);
});
this.readStream.on('end', function () {
if (!nextStart.eq(possibleEnd)) {
emitData({
start: nextStart,
end: possibleEnd
});
}
process.nextTick(function () {
return subject.complete();
});
});
this._subject = subject;
return this._subject;
}
}, {
key: 'observe',
value: function observe() {
var _this2 = this;
return _rxjs.Observable.defer(function () {
return _this2._origObservable();
}).filter(function (_ref2) {
var start = _ref2.start,
end = _ref2.end;
return !_this2.noEmptyMatches || !start.eq(end);
});
}
}], [{
key: 'split',
value: function split(params) {
return new SimpleSplitter(params).observe();
}
}]);
return SimpleSplitter;
}();
exports.default = SimpleSplitter;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUuY2xhc3MuanMiXSwibmFtZXMiOlsiU2ltcGxlU3BsaXR0ZXIiLCJzdHJlYW0iLCJ0b2tlbiIsIm5vRW1wdHlNYXRjaGVzIiwicmVhZFN0cmVhbSIsIl9zdWJqZWN0IiwiRXJyb3IiLCJzcyIsInN1YmplY3QiLCJlbWl0RGF0YSIsImRhdGEiLCJwcm9jZXNzIiwibmV4dFRpY2siLCJuZXh0IiwibmV4dFN0YXJ0IiwicG9zc2libGVFbmQiLCJvbiIsImlzTWF0Y2giLCJzdGFydCIsImVuZCIsImFkZCIsImxlbmd0aCIsInB1c2giLCJjaHVuayIsImVxIiwiY29tcGxldGUiLCJkZWZlciIsIl9vcmlnT2JzZXJ2YWJsZSIsImZpbHRlciIsInBhcmFtcyIsIm9ic2VydmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7SUFFTUEsYztBQUVKLDRCQUEwRTtBQUFBLG1GQUFKLEVBQUk7QUFBQSwyQkFBNURDLE1BQTREO0FBQUEsUUFBNURBLE1BQTRELCtCQUFuRCxJQUFtRDtBQUFBLDBCQUE3Q0MsS0FBNkM7QUFBQSxRQUE3Q0EsS0FBNkMsOEJBQXJDLElBQXFDO0FBQUEsbUNBQS9CQyxjQUErQjtBQUFBLFFBQS9CQSxjQUErQix1Q0FBZCxLQUFjOztBQUFBOztBQUN4RSxTQUFLQyxVQUFMLEdBQXNCSCxNQUF0QjtBQUNBLFNBQUtDLEtBQUwsR0FBc0JBLEtBQXRCO0FBQ0EsU0FBS0csUUFBTCxHQUFzQixJQUF0QjtBQUNBLFNBQUtGLGNBQUwsR0FBc0JBLGNBQXRCO0FBQ0EsUUFBSUQsVUFBVSxJQUFkLEVBQW9CO0FBQ2xCLFlBQU0sSUFBSUksS0FBSix3QkFBTjtBQUNEO0FBQ0QsUUFBSUwsV0FBVyxJQUFmLEVBQXFCO0FBQ25CLFlBQU0sSUFBSUssS0FBSiw0Q0FBTjtBQUNEO0FBQ0QsU0FBS0MsRUFBTCxHQUFVLDJCQUFpQixLQUFLTCxLQUF0QixDQUFWO0FBQ0Q7Ozs7c0NBRWlCO0FBQUE7O0FBQ2hCLFVBQUksS0FBS0csUUFBTCxLQUFrQixJQUF0QixFQUE0QjtBQUMxQixlQUFPLEtBQUtBLFFBQVo7QUFDRDtBQUNELFVBQU1HLFVBQVUsbUJBQWhCOztBQUdBLGVBQVNDLFFBQVQsQ0FBa0JDLElBQWxCLEVBQXdCO0FBQ3RCQyxnQkFBUUMsUUFBUixDQUFpQixZQUFNO0FBQ3JCSixrQkFBUUssSUFBUixDQUFhSCxJQUFiO0FBQ0QsU0FGRDtBQUdEOztBQUVELFVBQUlJLFlBQWMsbUJBQVMsQ0FBVCxDQUFsQjtBQUNBLFVBQUlDLGNBQWMsbUJBQVMsQ0FBVCxDQUFsQjs7QUFFQSxXQUFLUixFQUFMLENBQVFTLEVBQVIsQ0FBVyxNQUFYLEVBQW1CLFVBQUNDLE9BQUQsRUFBVVAsSUFBVixFQUF1QztBQUFBLFlBQXZCUSxLQUF1Qix1RUFBZixDQUFlO0FBQUEsWUFBWkMsR0FBWSx1RUFBTixDQUFNOztBQUN4RCxZQUFJRixPQUFKLEVBQWE7QUFDWFIsbUJBQVM7QUFDUFMsbUJBQU8sbUJBQVNKLFNBQVQsQ0FEQTtBQUVQSyxpQkFBT0osWUFBWUssR0FBWixDQUFnQkQsTUFBTUQsS0FBdEI7QUFGQSxXQUFUO0FBSUFKLHNCQUFjQyxZQUFZSyxHQUFaLENBQWdCRCxNQUFNRCxLQUF0QixFQUE2QkUsR0FBN0IsQ0FBaUMsTUFBS2xCLEtBQUwsQ0FBV21CLE1BQTVDLENBQWQ7QUFDQU4sd0JBQWMsbUJBQVNELFNBQVQsQ0FBZDtBQUNELFNBUEQsTUFPTztBQUNMQyx3QkFBY0EsWUFBWUssR0FBWixDQUFnQkQsTUFBTUQsS0FBdEIsQ0FBZDtBQUNEO0FBQ0YsT0FYRDs7QUFhQSxXQUFLZCxVQUFMLENBQWdCWSxFQUFoQixDQUFtQixNQUFuQixFQUEyQjtBQUFBLGVBQVMsTUFBS1QsRUFBTCxDQUFRZSxJQUFSLENBQWFDLEtBQWIsQ0FBVDtBQUFBLE9BQTNCO0FBQ0EsV0FBS25CLFVBQUwsQ0FBZ0JZLEVBQWhCLENBQW1CLEtBQW5CLEVBQTBCLFlBQU07QUFDOUIsWUFBSSxDQUFDRixVQUFVVSxFQUFWLENBQWFULFdBQWIsQ0FBTCxFQUFnQztBQUM5Qk4sbUJBQVM7QUFDUFMsbUJBQU9KLFNBREE7QUFFUEssaUJBQU9KO0FBRkEsV0FBVDtBQUlEO0FBQ0RKLGdCQUFRQyxRQUFSLENBQWlCO0FBQUEsaUJBQU1KLFFBQVFpQixRQUFSLEVBQU47QUFBQSxTQUFqQjtBQUNELE9BUkQ7QUFTQSxXQUFLcEIsUUFBTCxHQUFnQkcsT0FBaEI7QUFDQSxhQUFPLEtBQUtILFFBQVo7QUFDRDs7OzhCQUVTO0FBQUE7O0FBQ1IsYUFBTyxpQkFBV3FCLEtBQVgsQ0FBaUI7QUFBQSxlQUFNLE9BQUtDLGVBQUwsRUFBTjtBQUFBLE9BQWpCLEVBQ0pDLE1BREksQ0FDRztBQUFBLFlBQUdWLEtBQUgsU0FBR0EsS0FBSDtBQUFBLFlBQVVDLEdBQVYsU0FBVUEsR0FBVjtBQUFBLGVBQW9CLENBQUMsT0FBS2hCLGNBQU4sSUFBd0IsQ0FBQ2UsTUFBTU0sRUFBTixDQUFTTCxHQUFULENBQTdDO0FBQUEsT0FESCxDQUFQO0FBRUQ7OzswQkFFWVUsTSxFQUFRO0FBQ25CLGFBQU8sSUFBSTdCLGNBQUosQ0FBbUI2QixNQUFuQixFQUEyQkMsT0FBM0IsRUFBUDtBQUNEOzs7Ozs7a0JBR1k5QixjIiwiZmlsZSI6ImNvcmUuY2xhc3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU3RyZWFtU2VhcmNoIGZyb20gJ3N0cmVhbXNlYXJjaCc7XG5pbXBvcnQgTG9uZyBmcm9tICdsb25nJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuY2xhc3MgU2ltcGxlU3BsaXR0ZXIge1xuXG4gIGNvbnN0cnVjdG9yKHsgc3RyZWFtID0gbnVsbCwgdG9rZW4gPSBudWxsLCBub0VtcHR5TWF0Y2hlcyA9IGZhbHNlIH0gPSB7fSkge1xuICAgIHRoaXMucmVhZFN0cmVhbSAgICAgPSBzdHJlYW07XG4gICAgdGhpcy50b2tlbiAgICAgICAgICA9IHRva2VuO1xuICAgIHRoaXMuX3N1YmplY3QgICAgICAgPSBudWxsO1xuICAgIHRoaXMubm9FbXB0eU1hdGNoZXMgPSBub0VtcHR5TWF0Y2hlcztcbiAgICBpZiAodG9rZW4gPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVG9rZW4gY2Fubm90IGJlIG51bGxgKTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdHJlYW0gcGFyYW0gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkYCk7XG4gICAgfVxuICAgIHRoaXMuc3MgPSBuZXcgU3RyZWFtU2VhcmNoKHRoaXMudG9rZW4pO1xuICB9XG5cbiAgX29yaWdPYnNlcnZhYmxlKCkge1xuICAgIGlmICh0aGlzLl9zdWJqZWN0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3ViamVjdDtcbiAgICB9XG4gICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG5cblxuICAgIGZ1bmN0aW9uIGVtaXREYXRhKGRhdGEpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBzdWJqZWN0Lm5leHQoZGF0YSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgbmV4dFN0YXJ0ICAgPSBuZXcgTG9uZygwKTtcbiAgICBsZXQgcG9zc2libGVFbmQgPSBuZXcgTG9uZygwKTtcblxuICAgIHRoaXMuc3Mub24oJ2luZm8nLCAoaXNNYXRjaCwgZGF0YSwgc3RhcnQgPSAwLCBlbmQgPSAwKSA9PiB7XG4gICAgICBpZiAoaXNNYXRjaCkge1xuICAgICAgICBlbWl0RGF0YSh7XG4gICAgICAgICAgc3RhcnQ6IG5ldyBMb25nKG5leHRTdGFydCksXG4gICAgICAgICAgZW5kICA6IHBvc3NpYmxlRW5kLmFkZChlbmQgLSBzdGFydClcbiAgICAgICAgfSk7XG4gICAgICAgIG5leHRTdGFydCAgID0gcG9zc2libGVFbmQuYWRkKGVuZCAtIHN0YXJ0KS5hZGQodGhpcy50b2tlbi5sZW5ndGgpO1xuICAgICAgICBwb3NzaWJsZUVuZCA9IG5ldyBMb25nKG5leHRTdGFydCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3NzaWJsZUVuZCA9IHBvc3NpYmxlRW5kLmFkZChlbmQgLSBzdGFydCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlYWRTdHJlYW0ub24oJ2RhdGEnLCBjaHVuayA9PiB0aGlzLnNzLnB1c2goY2h1bmspKTtcbiAgICB0aGlzLnJlYWRTdHJlYW0ub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIGlmICghbmV4dFN0YXJ0LmVxKHBvc3NpYmxlRW5kKSkge1xuICAgICAgICBlbWl0RGF0YSh7XG4gICAgICAgICAgc3RhcnQ6IG5leHRTdGFydCxcbiAgICAgICAgICBlbmQgIDogcG9zc2libGVFbmRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHN1YmplY3QuY29tcGxldGUoKSk7XG4gICAgfSk7XG4gICAgdGhpcy5fc3ViamVjdCA9IHN1YmplY3Q7XG4gICAgcmV0dXJuIHRoaXMuX3N1YmplY3Q7XG4gIH1cblxuICBvYnNlcnZlKCkge1xuICAgIHJldHVybiBPYnNlcnZhYmxlLmRlZmVyKCgpID0+IHRoaXMuX29yaWdPYnNlcnZhYmxlKCkpXG4gICAgICAuZmlsdGVyKCh7IHN0YXJ0LCBlbmQgfSkgPT4gIXRoaXMubm9FbXB0eU1hdGNoZXMgfHwgIXN0YXJ0LmVxKGVuZCkpO1xuICB9XG5cbiAgc3RhdGljIHNwbGl0KHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgU2ltcGxlU3BsaXR0ZXIocGFyYW1zKS5vYnNlcnZlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2ltcGxlU3BsaXR0ZXI7XG4iXX0=
;