socket.io.patch.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // EventEmitter has been removed from process in node >= 7
  2. // https://github.com/nodejs/node/commit/62b544290a075fe38e233887a06c408ba25a1c71
  3. /*
  4. A socket.io dependency expects the EventEmitter to be available at
  5. `process.EventEmitter`.
  6. See this trace:
  7. ---
  8. /app/node_modules/policyfile/lib/server.js:254
  9. Object.keys(process.EventEmitter.prototype).forEach(function proxy (key){
  10. ^
  11. TypeError: Cannot read property 'prototype' of undefined
  12. at Object.<anonymous> (/app/node_modules/policyfile/lib/server.js:254:34)
  13. */
  14. if (process.versions.node.split('.')[0] >= 7) {
  15. // eslint-disable-next-line node/no-deprecated-api
  16. process.EventEmitter = require('events')
  17. }
  18. var io = require('socket.io')
  19. if (io.version === '0.9.16' || io.version === '0.9.19') {
  20. console.log('patching socket.io hybi-16 transport frame prototype')
  21. var transports = require('socket.io/lib/transports/websocket/hybi-16.js')
  22. transports.prototype.frame = patchedFrameHandler
  23. // file hybi-07-12 has the same problem but no browsers are using that protocol now
  24. }
  25. function patchedFrameHandler(opcode, str) {
  26. var dataBuffer = Buffer.from(str)
  27. var dataLength = dataBuffer.length
  28. var startOffset = 2
  29. var secondByte = dataLength
  30. if (dataLength === 65536) {
  31. console.log('fixing invalid frame length in socket.io')
  32. }
  33. if (dataLength > 65535) {
  34. // original code had > 65536
  35. startOffset = 10
  36. secondByte = 127
  37. } else if (dataLength > 125) {
  38. startOffset = 4
  39. secondByte = 126
  40. }
  41. var outputBuffer = Buffer.alloc(dataLength + startOffset)
  42. outputBuffer[0] = opcode
  43. outputBuffer[1] = secondByte
  44. dataBuffer.copy(outputBuffer, startOffset)
  45. switch (secondByte) {
  46. case 126:
  47. outputBuffer[2] = dataLength >>> 8
  48. outputBuffer[3] = dataLength % 256
  49. break
  50. case 127:
  51. var l = dataLength
  52. for (var i = 1; i <= 8; ++i) {
  53. outputBuffer[startOffset - i] = l & 0xff
  54. l >>>= 8
  55. }
  56. }
  57. return outputBuffer
  58. }
  59. const parser = require('socket.io/lib/parser')
  60. const decodePacket = parser.decodePacket
  61. parser.decodePacket = function (data) {
  62. if (typeof data !== 'string') return {}
  63. const firstColon = data.indexOf(':')
  64. if (firstColon === -1) return {}
  65. if (data.indexOf(':', firstColon + 1) === -1) return {}
  66. return decodePacket(data)
  67. }