socket.io.patch.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. const logger = require('logger-sharelatex')
  20. if (io.version === '0.9.16' || io.version === '0.9.19') {
  21. logger.warn('patching socket.io hybi-16 transport frame prototype')
  22. var transports = require('socket.io/lib/transports/websocket/hybi-16.js')
  23. transports.prototype.frame = patchedFrameHandler
  24. // file hybi-07-12 has the same problem but no browsers are using that protocol now
  25. }
  26. function patchedFrameHandler(opcode, str) {
  27. var dataBuffer = Buffer.from(str)
  28. var dataLength = dataBuffer.length
  29. var startOffset = 2
  30. var secondByte = dataLength
  31. if (dataLength === 65536) {
  32. logger.log('fixing invalid frame length in socket.io')
  33. }
  34. if (dataLength > 65535) {
  35. // original code had > 65536
  36. startOffset = 10
  37. secondByte = 127
  38. } else if (dataLength > 125) {
  39. startOffset = 4
  40. secondByte = 126
  41. }
  42. var outputBuffer = Buffer.alloc(dataLength + startOffset)
  43. outputBuffer[0] = opcode
  44. outputBuffer[1] = secondByte
  45. dataBuffer.copy(outputBuffer, startOffset)
  46. switch (secondByte) {
  47. case 126:
  48. outputBuffer[2] = dataLength >>> 8
  49. outputBuffer[3] = dataLength % 256
  50. break
  51. case 127:
  52. var l = dataLength
  53. for (var i = 1; i <= 8; ++i) {
  54. outputBuffer[startOffset - i] = l & 0xff
  55. l >>>= 8
  56. }
  57. }
  58. return outputBuffer
  59. }
  60. const parser = require('socket.io/lib/parser')
  61. const decodePacket = parser.decodePacket
  62. parser.decodePacket = function (data) {
  63. if (typeof data !== 'string') return {}
  64. const firstColon = data.indexOf(':')
  65. if (firstColon === -1) return {}
  66. if (data.indexOf(':', firstColon + 1) === -1) return {}
  67. return decodePacket(data)
  68. }