pty cleanup

This commit is contained in:
Eugene Pankov
2021-06-03 22:44:22 +02:00
parent 9a1cea29f9
commit 4a0cbff2d6
4 changed files with 5 additions and 399 deletions

View File

@@ -1,57 +0,0 @@
/** @hidden */
module.exports = function patchPTYModule (mod) {
const oldSpawn = mod.spawn
if (mod.patched) {
return
}
mod.patched = true
mod.spawn = (file, args, opt) => {
let terminal = oldSpawn(file, args, opt)
let timeout = null
let buffer = Buffer.from('')
let lastFlush = 0
let nextTimeout = 0
// Minimum prebuffering window (ms) if the input is non-stop flowing
const minWindow = 5
// Maximum buffering time (ms) until output must be flushed unconditionally
const maxWindow = 100
function flush () {
if (buffer.length) {
terminal.emit('data-buffered', buffer)
}
lastFlush = Date.now()
buffer = Buffer.from('')
}
function reschedule () {
if (timeout) {
clearTimeout(timeout)
}
nextTimeout = Date.now() + minWindow
timeout = setTimeout(() => {
timeout = null
flush()
}, minWindow)
}
terminal.on('data', data => {
if (typeof data === 'string') {
data = Buffer.from(data)
}
buffer = Buffer.concat([buffer, data])
if (Date.now() - lastFlush > maxWindow) {
// Taking too much time buffering, flush to keep things interactive
flush()
} else {
if (Date.now() > nextTimeout - maxWindow / 10) {
// Extend the window if it's expiring
reschedule()
}
}
})
return terminal
}
}

View File

@@ -1,5 +1,5 @@
import * as nodePTY from '@terminus-term/node-pty'
import { StringDecoder } from 'string_decoder'
import { StringDecoder } from './stringDecoder'
import { v4 as uuidv4 } from 'uuid'
import { ipcMain } from 'electron'
import { Application } from './app'
@@ -10,7 +10,7 @@ class PTYDataQueue {
private maxChunk = 1024
private maxDelta = 1024 * 50
private flowPaused = false
private decoder = new StringDecoder('utf8')
private decoder = new StringDecoder()
constructor (private pty: nodePTY.IPty, private onData: (data: Buffer) => void) { }
@@ -61,7 +61,7 @@ class PTYDataQueue {
}
private emitData (data: Buffer) {
this.onData(Buffer.from(this.decoder.write(data)))
this.onData(this.decoder.write(data))
}
private pause () {
@@ -87,7 +87,7 @@ export class PTY {
}
this.outputQueue = new PTYDataQueue(this.pty, data => {
setImmediate(() => this.emit('data-buffered', data))
setImmediate(() => this.emit('data', data))
})
this.pty.on('data', data => this.outputQueue.push(Buffer.from(data)))
@@ -126,7 +126,6 @@ export class PTYManager {
private ptys: Record<string, PTY|undefined> = {}
init (app: Application): void {
//require('./bufferizedPTY')(nodePTY) // eslint-disable-line @typescript-eslint/no-var-requires
ipcMain.on('pty:spawn', (event, ...options) => {
const id = uuidv4().toString()
event.returnValue = id