overleaf/services/real-time/socket.io.patch.js
2020-06-24 11:12:22 +01:00

74 lines
2.3 KiB
JavaScript

// EventEmitter has been removed from process in node >= 7
// https://github.com/nodejs/node/commit/62b544290a075fe38e233887a06c408ba25a1c71
/*
A socket.io dependency expects the EventEmitter to be available at
`process.EventEmitter`.
See this trace:
---
/app/node_modules/policyfile/lib/server.js:254
Object.keys(process.EventEmitter.prototype).forEach(function proxy (key){
^
TypeError: Cannot read property 'prototype' of undefined
at Object.<anonymous> (/app/node_modules/policyfile/lib/server.js:254:34)
*/
if (process.versions.node.split('.')[0] >= 7) {
// eslint-disable-next-line node/no-deprecated-api
process.EventEmitter = require('events')
}
var io = require('socket.io')
const logger = require('logger-sharelatex')
if (io.version === '0.9.16' || io.version === '0.9.19') {
logger.warn('patching socket.io hybi-16 transport frame prototype')
var transports = require('socket.io/lib/transports/websocket/hybi-16.js')
transports.prototype.frame = patchedFrameHandler
// file hybi-07-12 has the same problem but no browsers are using that protocol now
}
function patchedFrameHandler(opcode, str) {
var dataBuffer = Buffer.from(str)
var dataLength = dataBuffer.length
var startOffset = 2
var secondByte = dataLength
if (dataLength === 65536) {
logger.log('fixing invalid frame length in socket.io')
}
if (dataLength > 65535) {
// original code had > 65536
startOffset = 10
secondByte = 127
} else if (dataLength > 125) {
startOffset = 4
secondByte = 126
}
var outputBuffer = Buffer.alloc(dataLength + startOffset)
outputBuffer[0] = opcode
outputBuffer[1] = secondByte
dataBuffer.copy(outputBuffer, startOffset)
switch (secondByte) {
case 126:
outputBuffer[2] = dataLength >>> 8
outputBuffer[3] = dataLength % 256
break
case 127:
var l = dataLength
for (var i = 1; i <= 8; ++i) {
outputBuffer[startOffset - i] = l & 0xff
l >>>= 8
}
}
return outputBuffer
}
const parser = require('socket.io/lib/parser')
const decodePacket = parser.decodePacket
parser.decodePacket = function (data) {
if (typeof data !== 'string') return {}
const firstColon = data.indexOf(':')
if (firstColon === -1) return {}
if (data.indexOf(':', firstColon + 1) === -1) return {}
return decodePacket(data)
}