skip failing tmux init commands (fixes #300)

This commit is contained in:
Eugene Pankov 2018-03-11 20:01:48 +01:00
parent 3b43b3914b
commit 9d7bf2ae44
No known key found for this signature in database
GPG Key ID: 5896FCBBDD1CF4F4
2 changed files with 16 additions and 6 deletions

View File

@ -41,7 +41,9 @@ export class Logger {
doLog (level: string, ...args: any[]) { doLog (level: string, ...args: any[]) {
console[level](`%c[${this.name}]`, 'color: #aaa', ...args) console[level](`%c[${this.name}]`, 'color: #aaa', ...args)
this.winstonLogger[level](...args) if (this.winstonLogger) {
this.winstonLogger[level](...args)
}
} }
debug (...args: any[]) { this.doLog('debug', ...args) } debug (...args: any[]) { this.doLog('debug', ...args) }

View File

@ -3,6 +3,8 @@ import { execFileSync } from 'child_process'
import * as AsyncLock from 'async-lock' import * as AsyncLock from 'async-lock'
import { ConnectableObservable, AsyncSubject, Subject } from 'rxjs' import { ConnectableObservable, AsyncSubject, Subject } from 'rxjs'
import * as childProcess from 'child_process' import * as childProcess from 'child_process'
import { Logger } from 'terminus-core'
import { SessionOptions, SessionPersistenceProvider } from '../api' import { SessionOptions, SessionPersistenceProvider } from '../api'
declare function delay (ms: number): Promise<void> declare function delay (ms: number): Promise<void>
@ -52,10 +54,11 @@ export class TMuxCommandProcess {
private block$ = new Subject<TMuxBlock>() private block$ = new Subject<TMuxBlock>()
private response$: ConnectableObservable<TMuxBlock> private response$: ConnectableObservable<TMuxBlock>
private lock = new AsyncLock({ timeout: 1000 }) private lock = new AsyncLock({ timeout: 1000 })
private logger = new Logger(null, 'tmuxProcess')
constructor () { constructor () {
this.process = childProcess.spawn('tmux', ['-C', '-f', '/dev/null', '-L', 'terminus', 'new-session', '-A', '-D', '-s', 'control']) this.process = childProcess.spawn('tmux', ['-C', '-f', '/dev/null', '-L', 'terminus', 'new-session', '-A', '-D', '-s', 'control'])
console.log('[tmux] started') this.logger.log('started')
this.process.stdout.on('data', data => { this.process.stdout.on('data', data => {
// console.debug('tmux says:', data.toString()) // console.debug('tmux says:', data.toString())
this.rawOutput$.next(data.toString()) this.rawOutput$.next(data.toString())
@ -103,18 +106,18 @@ export class TMuxCommandProcess {
this.response$.connect() this.response$.connect()
this.block$.subscribe(block => { this.block$.subscribe(block => {
console.debug('[tmux] block:', block) this.logger.debug('block:', block)
}) })
this.message$.subscribe(message => { this.message$.subscribe(message => {
console.debug('[tmux] message:', message) this.logger.debug('message:', message)
}) })
} }
command (command: string): Promise<TMuxBlock> { command (command: string): Promise<TMuxBlock> {
return this.lock.acquire('key', () => { return this.lock.acquire('key', () => {
let p = this.response$.take(1).toPromise() let p = this.response$.take(1).toPromise()
console.debug('[tmux] command:', command) this.logger.debug('command:', command)
this.process.stdin.write(command + '\n') this.process.stdin.write(command + '\n')
return p return p
}).then(response => { }).then(response => {
@ -137,13 +140,18 @@ export class TMuxCommandProcess {
export class TMux { export class TMux {
private process: TMuxCommandProcess private process: TMuxCommandProcess
private ready: Promise<void> private ready: Promise<void>
private logger = new Logger(null, 'tmux')
constructor () { constructor () {
this.process = new TMuxCommandProcess() this.process = new TMuxCommandProcess()
this.ready = (async () => { this.ready = (async () => {
for (let line of TMUX_CONFIG.split('\n')) { for (let line of TMUX_CONFIG.split('\n')) {
if (line) { if (line) {
await this.process.command(line) try {
await this.process.command(line)
} catch (e) {
this.logger.warn('Skipping failing config line:', line)
}
} }
} }
// Tmux sometimes sends a stray response block at start // Tmux sometimes sends a stray response block at start