2017-06-01 8 views
1

Webプロジェクトでxterm.jsを使用して、Webページに端末を設置しています。クライアントからのインターネットのゆらぎのためにソケット接続が壊れたときに、私は自分のページをリフレッシュするか、ソケットを再接続する度に。私の場合、現在のPWDディレクトリは失われ、指定されたCWDディレクトリ(ユーザホーム)になります。だから私は再びCDを作っていました。xterm.js同じPWDで再接続

はどのようにして接続して、私はさわやかなページまたはソケット切断前の最後の時間だった同じPWDにとどまることができますか?

私が試したことの一つは、長期的なオブジェクトを格納し、それが既に存在している場合は再接続するときに、同じオブジェクトを介して接続することです。 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に再接続するためのガイドライン。

詳細

OSバージョン:Mac OSの、 xterm.jsバージョン:2.2.3

答えて

0

これは単に、サーバーに2線の下に置く

~/.bashrcを更新することにより、非常に簡単に解決することができます~/.bashrcファイルには、私のために働い

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

参考Save last working directory on Bash logout

関連する問題