module.exports = function patchPTYModule (path) {
  const mod = require(path)
  const oldSpawn = mod.spawn
  if (mod.patched) {
    return mod
  }
  mod.patched = true
  mod.spawn = (file, args, opt) => {
    let terminal = oldSpawn(file, args, opt)
    let timeout = null
    let buffer = ''
    let lastFlush = 0
    let nextTimeout = 0

    const maxWindow = 250
    const minWindow = 50

    function flush () {
        if (buffer) {
            terminal.emit('data-buffered', buffer)
        }
        lastFlush = Date.now()
        buffer = ''
    }

    function reschedule () {
        if (timeout) {
            clearTimeout(timeout)
        }
        nextTimeout = Date.now() + minWindow
        timeout = setTimeout(() => {
            timeout = null
            flush()
        }, minWindow)
    }

    terminal.on('data', data => {
        buffer += data
        if (Date.now() - lastFlush > maxWindow) {
            flush()
        } else {
            if (Date.now() > nextTimeout - (minWindow / 10)) {
                reschedule()
            }
        }
    })
    return terminal
  }
  return mod
}