Я использую xterm.js в своем веб-проекте, чтобы иметь терминал на веб-странице. Каждый раз, когда я обновляю свою страницу или подключаю сокет, когда соединение сокета прерывается из-за колебания интернета от клиента. Текущий каталог PWD потерян, и он попадает в указанный каталог CWD, который является пользователем дома в моем случае. Поэтому снова я должен делать CD, где я работал.
Как я могу подключиться и оставаться на том же PWD, где я был в последний раз до обновления страницы или отключения разъема?
Одна из вещей, которую я пробовал, заключается в том, чтобы хранить объект term и подключаться через один и тот же объект при повторном подключении, если он уже присутствует. Не удалять процесс и объект в отключении WebSocket.
var http = require('http');
var express = require('express');
var app = express();
var expressWs = require('express-ws')(app);
var pty = require('node-pty');
var cors = require('cors');
app.use(cors());
app.options('*', cors());
var terminals = {}; //global terminals
function getUser(token) {
return new Promise((resolve, reject) => {
try {
return http.get({
host: '',
path: '',
headers: {'token': token}
}, function(response) {
// Continuously update stream with data
var body = '';
response.on('data', function(d) {
body += d;
});
response.on('end', function() {
return resolve(JSON.parse(body));
});
});
} catch (err) {
console.log('Api failed');
console.log(err);
reject;
}
})
}
app.ws('/terminals/:user_id', function (ws, req) {
try {
getUser(req.params.user_id) /* cheking with api if user exist in my database*/
.then(user_info => {
if(terminals[parseInt(req.params.user_id)]){
var term = terminals[parseInt(req.params.user_id)];
}else {
var term = pty.spawn(process.platform === 'win32' ? 'cmd.exe' : 'bash', [], {
name: 'xterm-color',
cwd: cwd,
env: process.env
});
terminals[parseInt(req.params.user_id)] = term;
}
term.on('data', function(data) {
ws.send(data);
});
ws.on('message', function(msg) {
term.write(msg);
});
ws.on('close', function () {
// process.kill(term.pid);
// delete terminals[parseInt(req.params.pid)];
// delete logs[req.params.pid];
});
})
.catch(err => {
})
} catch (err) {
console.log('Terminal webSocket failed');
console.log(err);
}
});
app.listen(3000);
Это не работает для меня. Это позволяет мне подключаться только в первый раз, но когда я обновляю свой терминал страниц, он не соединяется с существующим объектом хранилища.
Кроме того, это имеет проблемы, если порожденный процесс убит системой, но он все еще остается в объекте javascript, и скрипт пытается подключиться к тому же терминальному объекту, который будет терпеть неудачу.
Любые рекомендации о том, как добиться повторного подключения к тому же PWD.
подробности
Версия ОС: Mac OS, версия xterm.js: 2.2.3
Это можно легко решить, просто обновив ~/.bashrc
на сервере
Помещение ниже двух строк в файле ~/.bashrc
работало для меня
PROMPT_COMMAND+='printf %s "$PWD" > ~/.storepwd'
[ -s ~/.lastdirectory ] && cd 'cat ~/.lastdirectory'