outgoing-message-stream.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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 _packet = require("./packet");
  9. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  10. class OutgoingMessageStream extends _readableStream.Duplex {
  11. constructor(debug, {
  12. packetSize
  13. }) {
  14. super({
  15. writableObjectMode: true
  16. });
  17. this.packetSize = packetSize;
  18. this.debug = debug;
  19. this.bl = new _bl.default(); // When the writable side is ended, push `null`
  20. // to also end the readable side.
  21. this.on('finish', () => {
  22. this.push(null);
  23. });
  24. }
  25. _write(message, _encoding, callback) {
  26. const length = this.packetSize - _packet.HEADER_LENGTH;
  27. let packetNumber = 0;
  28. this.currentMessage = message;
  29. this.currentMessage.on('data', data => {
  30. if (message.ignore) {
  31. return;
  32. }
  33. this.bl.append(data);
  34. while (this.bl.length > length) {
  35. const data = this.bl.slice(0, length);
  36. this.bl.consume(length); // TODO: Get rid of creating `Packet` instances here.
  37. const packet = new _packet.Packet(message.type);
  38. packet.packetId(packetNumber += 1);
  39. packet.resetConnection(message.resetConnection);
  40. packet.addData(data);
  41. this.debug.packet('Sent', packet);
  42. this.debug.data(packet);
  43. if (this.push(packet.buffer) === false) {
  44. message.pause();
  45. }
  46. }
  47. });
  48. this.currentMessage.on('end', () => {
  49. const data = this.bl.slice();
  50. this.bl.consume(data.length); // TODO: Get rid of creating `Packet` instances here.
  51. const packet = new _packet.Packet(message.type);
  52. packet.packetId(packetNumber += 1);
  53. packet.resetConnection(message.resetConnection);
  54. packet.last(true);
  55. packet.ignore(message.ignore);
  56. packet.addData(data);
  57. this.debug.packet('Sent', packet);
  58. this.debug.data(packet);
  59. this.push(packet.buffer);
  60. this.currentMessage = undefined;
  61. callback();
  62. });
  63. }
  64. _read(_size) {
  65. // If we do have a message, resume it and get data flowing.
  66. // Otherwise, there is nothing to do.
  67. if (this.currentMessage) {
  68. this.currentMessage.resume();
  69. }
  70. }
  71. }
  72. var _default = OutgoingMessageStream;
  73. exports.default = _default;
  74. module.exports = OutgoingMessageStream;