UNPKG

streamsplit

Version:

Memory/CPU efficient stream splitter by token

125 lines (103 loc) 9.97 kB
'use strict'; 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=