websocket.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. const Transport = require("../transport");
  2. const parser = require("engine.io-parser");
  3. const debug = require("debug")("engine:ws");
  4. class WebSocket extends Transport {
  5. /**
  6. * WebSocket transport
  7. *
  8. * @param {http.IncomingMessage}
  9. * @api public
  10. */
  11. constructor(req) {
  12. super(req);
  13. this.socket = req.websocket;
  14. this.socket.on("message", this.onData.bind(this));
  15. this.socket.once("close", this.onClose.bind(this));
  16. this.socket.on("error", this.onError.bind(this));
  17. this.socket.on("headers", headers => {
  18. this.emit("headers", headers);
  19. });
  20. this.writable = true;
  21. this.perMessageDeflate = null;
  22. }
  23. /**
  24. * Transport name
  25. *
  26. * @api public
  27. */
  28. get name() {
  29. return "websocket";
  30. }
  31. /**
  32. * Advertise upgrade support.
  33. *
  34. * @api public
  35. */
  36. get handlesUpgrades() {
  37. return true;
  38. }
  39. /**
  40. * Advertise framing support.
  41. *
  42. * @api public
  43. */
  44. get supportsFraming() {
  45. return true;
  46. }
  47. /**
  48. * Processes the incoming data.
  49. *
  50. * @param {String} encoded packet
  51. * @api private
  52. */
  53. onData(data) {
  54. debug('received "%s"', data);
  55. super.onData(data);
  56. }
  57. /**
  58. * Writes a packet payload.
  59. *
  60. * @param {Array} packets
  61. * @api private
  62. */
  63. send(packets) {
  64. var self = this;
  65. for (var i = 0; i < packets.length; i++) {
  66. var packet = packets[i];
  67. parser.encodePacket(packet, self.supportsBinary, send);
  68. }
  69. function send(data) {
  70. debug('writing "%s"', data);
  71. // always creates a new object since ws modifies it
  72. var opts = {};
  73. if (packet.options) {
  74. opts.compress = packet.options.compress;
  75. }
  76. if (self.perMessageDeflate) {
  77. var len =
  78. "string" === typeof data ? Buffer.byteLength(data) : data.length;
  79. if (len < self.perMessageDeflate.threshold) {
  80. opts.compress = false;
  81. }
  82. }
  83. self.writable = false;
  84. self.socket.send(data, opts, onEnd);
  85. }
  86. function onEnd(err) {
  87. if (err) return self.onError("write error", err.stack);
  88. self.writable = true;
  89. self.emit("drain");
  90. }
  91. }
  92. /**
  93. * Closes the transport.
  94. *
  95. * @api private
  96. */
  97. doClose(fn) {
  98. debug("closing");
  99. this.socket.close();
  100. fn && fn();
  101. }
  102. }
  103. module.exports = WebSocket;