xterm.js воссоединяется с тем же PWD

1

Я использую 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

Теги:
sockets
xterm

1 ответ

0
Лучший ответ

Это можно легко решить, просто обновив ~/.bashrc на сервере

Помещение ниже двух строк в файле ~/.bashrc работало для меня

PROMPT_COMMAND+='printf %s "$PWD" > ~/.storepwd'
[ -s ~/.lastdirectory ] && cd 'cat ~/.lastdirectory'

Ref Сохранить последний рабочий каталог при выходе из Bash

Ещё вопросы

Сообщество Overcoder
Наверх
Меню