socket.io.patch.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // EventEmitter has been removed from process in node >= 7
  2. // https://github.com/nodejs/node/commit/62b544290a075fe38e233887a06c408ba25a1c71
  3. if(process.versions.node.split('.')[0] >= 7) {
  4. process.EventEmitter = require('events')
  5. }
  6. var io = require("socket.io");
  7. if (io.version === "0.9.16" || io.version === "0.9.19") {
  8. console.log("patching socket.io hybi-16 transport frame prototype");
  9. var transports = require("socket.io/lib/transports/websocket/hybi-16.js");
  10. transports.prototype.frame = patchedFrameHandler;
  11. // file hybi-07-12 has the same problem but no browsers are using that protocol now
  12. }
  13. function patchedFrameHandler(opcode, str) {
  14. var dataBuffer = new Buffer(str),
  15. dataLength = dataBuffer.length,
  16. startOffset = 2,
  17. secondByte = dataLength;
  18. if (dataLength === 65536) {
  19. console.log("fixing invalid frame length in socket.io");
  20. }
  21. if (dataLength > 65535) {
  22. // original code had > 65536
  23. startOffset = 10;
  24. secondByte = 127;
  25. } else if (dataLength > 125) {
  26. startOffset = 4;
  27. secondByte = 126;
  28. }
  29. var outputBuffer = new Buffer(dataLength + startOffset);
  30. outputBuffer[0] = opcode;
  31. outputBuffer[1] = secondByte;
  32. dataBuffer.copy(outputBuffer, startOffset);
  33. switch (secondByte) {
  34. case 126:
  35. outputBuffer[2] = dataLength >>> 8;
  36. outputBuffer[3] = dataLength % 256;
  37. break;
  38. case 127:
  39. var l = dataLength;
  40. for (var i = 1; i <= 8; ++i) {
  41. outputBuffer[startOffset - i] = l & 0xff;
  42. l >>>= 8;
  43. }
  44. }
  45. return outputBuffer;
  46. }