incoming-message-stream.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _bl = _interopRequireDefault(require("bl"));
  7. var _readableStream = require("readable-stream");
  8. var _message = _interopRequireDefault(require("./message"));
  9. var _packet = require("./packet");
  10. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  11. /**
  12. IncomingMessageStream
  13. Transform received TDS data into individual IncomingMessage streams.
  14. */
  15. class IncomingMessageStream extends _readableStream.Transform {
  16. constructor(debug) {
  17. super({
  18. readableObjectMode: true
  19. });
  20. this.debug = debug;
  21. this.currentMessage = undefined;
  22. this.bl = new _bl.default();
  23. }
  24. pause() {
  25. super.pause();
  26. if (this.currentMessage) {
  27. this.currentMessage.pause();
  28. }
  29. return this;
  30. }
  31. resume() {
  32. super.resume();
  33. if (this.currentMessage) {
  34. this.currentMessage.resume();
  35. }
  36. return this;
  37. }
  38. processBufferedData(callback) {
  39. // The packet header is always 8 bytes of length.
  40. while (this.bl.length >= _packet.HEADER_LENGTH) {
  41. // Get the full packet length
  42. const length = this.bl.readUInt16BE(2);
  43. if (this.bl.length >= length) {
  44. const data = this.bl.slice(0, length);
  45. this.bl.consume(length); // TODO: Get rid of creating `Packet` instances here.
  46. const packet = new _packet.Packet(data);
  47. this.debug.packet('Received', packet);
  48. this.debug.data(packet);
  49. let message = this.currentMessage;
  50. if (message === undefined) {
  51. this.currentMessage = message = new _message.default({
  52. type: packet.type(),
  53. resetConnection: false
  54. });
  55. this.push(message);
  56. }
  57. if (packet.isLast()) {
  58. // Wait until the current message was fully processed before we
  59. // continue processing any remaining messages.
  60. message.once('end', () => {
  61. this.currentMessage = undefined;
  62. this.processBufferedData(callback);
  63. });
  64. message.end(packet.data());
  65. return;
  66. } else if (!message.write(packet.data())) {
  67. // If too much data is buffering up in the
  68. // current message, wait for it to drain.
  69. message.once('drain', () => {
  70. this.processBufferedData(callback);
  71. });
  72. return;
  73. }
  74. } else {
  75. break;
  76. }
  77. } // Not enough data to read the next packet. Stop here and wait for
  78. // the next call to `_transform`.
  79. callback();
  80. }
  81. _transform(chunk, _encoding, callback) {
  82. this.bl.append(chunk);
  83. this.processBufferedData(callback);
  84. }
  85. }
  86. var _default = IncomingMessageStream;
  87. exports.default = _default;
  88. module.exports = IncomingMessageStream;