const debounce = require('debounce') const { screen, Question } = require('neo-blessed') const Table = require('./table') const Request = require('./request') const Response = require('./response') const { getDefaults } = require('./defaults') const { tui: tuiDefaults = {} } = getDefaults('proxy') const sc = screen({ title: 'Proxy' }) sc.key(['tab'], function (ch, key) { sc.focusNext() }) sc.key(['q', 'C-c', 'C-x'], function (ch, key) { const question = new Question({ keys: true, top: 'center', left: 'center', width: '50%', height: 5, border: { type: 'line' }, style: { border: { fg: 'grey' } } }) sc.append(question) question.ask('Do you really want to quit?', (err, result) => { if (err) { return } if (result) { return process.exit(0) } sc.remove(question) sc.render() }) }) const render = debounce(() => { sc.render() }, 1000) const transactions = new Table({ ...tuiDefaults.transactions, top: 0, left: 0, width: '100%', height: '50%', border: { type: 'line' }, style: { border: { fg: 'grey' } }, columns: [ { field: 'id', name: '#', width: 13 }, { field: 'method', name: 'method', width: 7 }, { field: 'scheme', name: 'scheme', width: 7 }, { field: 'host', name: 'host', width: 13 }, { field: 'port', name: 'port', width: 5 }, { field: 'path', name: 'path', width: 42 }, { field: 'query', name: 'query', width: 42 }, { field: 'responseCode', name: 'code', width: 7 }, { field: 'responseType', name: 'type', width: 13 }, { field: 'responseLength', name: 'length', width: 21 } ], columnSpacing: 3 }) const request = new Request({ ...tuiDefaults.request, bottom: 0, left: 0, width: '50%', height: '50%', border: { type: 'line' }, style: { border: { fg: 'grey' } } }) const response = new Response({ ...tuiDefaults.response, bottom: 0, right: 0, width: '50%', height: '50%', border: { type: 'line' }, style: { border: { fg: 'grey' } } }) sc.append(transactions) sc.append(request) sc.append(response) transactions.on('select', (a) => { request.display(a) response.display(a) sc.render() }) transactions.focus() let i = 0 setInterval(() => { transactions.addItem({ id: i++, method: 'GET', scheme: 'http', host: 'google.com', port: 80, path: '/' + Math.random(), query: '', responseCode: 200, responseType: 'html', responseLength: 1234 }) render() }, 1000) sc.render()