| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- 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
- }
|