index.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.DelimiterParser = void 0;
  4. const stream_1 = require("stream");
  5. /**
  6. * A transform stream that emits data each time a byte sequence is received.
  7. * @extends Transform
  8. *
  9. * To use the `Delimiter` parser, provide a delimiter as a string, buffer, or array of bytes. Runs in O(n) time.
  10. */
  11. class DelimiterParser extends stream_1.Transform {
  12. includeDelimiter;
  13. delimiter;
  14. buffer;
  15. constructor({ delimiter, includeDelimiter = false, ...options }) {
  16. super(options);
  17. if (delimiter === undefined) {
  18. throw new TypeError('"delimiter" is not a bufferable object');
  19. }
  20. if (delimiter.length === 0) {
  21. throw new TypeError('"delimiter" has a 0 or undefined length');
  22. }
  23. this.includeDelimiter = includeDelimiter;
  24. this.delimiter = Buffer.from(delimiter);
  25. this.buffer = Buffer.alloc(0);
  26. }
  27. _transform(chunk, encoding, cb) {
  28. let data = Buffer.concat([this.buffer, chunk]);
  29. let position;
  30. while ((position = data.indexOf(this.delimiter)) !== -1) {
  31. this.push(data.slice(0, position + (this.includeDelimiter ? this.delimiter.length : 0)));
  32. data = data.slice(position + this.delimiter.length);
  33. }
  34. this.buffer = data;
  35. cb();
  36. }
  37. _flush(cb) {
  38. this.push(this.buffer);
  39. this.buffer = Buffer.alloc(0);
  40. cb();
  41. }
  42. }
  43. exports.DelimiterParser = DelimiterParser;