From ad789f61f50017fcf2e6b95f71a1cf12a4b4fad0 Mon Sep 17 00:00:00 2001 From: nuintun Date: Wed, 2 Dec 2015 17:58:14 +0800 Subject: [PATCH] update files --- static/js/components/app-main/index.js | 55 ++++++--- .../js/components/app-main/terminal-worker.js | 105 ++++++++++++------ 2 files changed, 107 insertions(+), 53 deletions(-) diff --git a/static/js/components/app-main/index.js b/static/js/components/app-main/index.js index ab97560..238cb67 100644 --- a/static/js/components/app-main/index.js +++ b/static/js/components/app-main/index.js @@ -10,7 +10,6 @@ var fs = require('fs'); var path = require('path'); var util = require('../../util'); var Vue = require('../../vue/vue'); -var Terminal = require('../../terminal'); const EMPTYPROJECT = { name: '', @@ -47,14 +46,34 @@ function scroll(xterm, parent){ } } -var worker = new Worker('static/js/components/app-main/terminal-worker.js'); +// uuid +var uuid = 0; /** * openXTerm - * @param name + * @param vm */ -function openXTerm(name){ - worker.postMessage({ action: 'open', name: name }); + +function openXTerm(vm){ + var project = vm.project; + var runtime = AppRuntime[project.name]; + + if (!runtime) { + var worker = new SharedWorker('static/js/components/app-main/terminal-worker.js', 'SharedWorker-' + (uuid++)); + + worker.port.addEventListener('message', function (event){ + if (vm.project.name === event.data.name) { + vm.$els.terminal.innerHTML = event.data.screen; + } + }); + + worker.port.start(); + worker.port.postMessage({ action: 'open', name: project.name }); + + AppRuntime[project.name] = { worker: worker }; + } else { + runtime.worker.port.postMessage({ action: 'open', name: project.name }); + } } /** @@ -62,7 +81,14 @@ function openXTerm(name){ * @param name */ function closeXTerm(name){ - worker.postMessage({ action: 'close', name: name }); + var runtime = AppRuntime[name]; + + if (runtime) { + runtime.worker.port.postMessage({ action: 'close', name: name }); + runtime.worker.terminate(); + + delete AppRuntime[name]; + } } module.exports = Vue.component('app-main', { @@ -105,7 +131,7 @@ module.exports = Vue.component('app-main', { this.command = project.command.slice(0, 3); this.moreCommand = project.command.slice(3); - openXTerm(project.name); + openXTerm(this); } }, methods: { @@ -162,6 +188,8 @@ module.exports = Vue.component('app-main', { }, false); ipc.on('emulator', function (event, type, project, data){ + var runtime = AppRuntime[project.name]; + switch (type) { case 'data': data = data.toString(); @@ -173,19 +201,12 @@ module.exports = Vue.component('app-main', { data = '\u001b[32m命令执行完成\u001b[0m'; break; } - worker.postMessage({ action: 'write', name: project.name, data: data.toString() }); + + runtime.worker.port.postMessage({ action: 'write', name: project.name, data: data.toString() }); // event.sender.send('emulator', project, 'stop'); }); }, ready: function (){ - var context = this; - - worker.onmessage = function (event){ - if (event.data.name === context.project.name) { - context.$els.terminal.innerHTML = event.data.screen; - } - }; - - openXTerm(this.project.name); + openXTerm(this); } }); \ No newline at end of file diff --git a/static/js/components/app-main/terminal-worker.js b/static/js/components/app-main/terminal-worker.js index 0fb22a8..458cbb5 100644 --- a/static/js/components/app-main/terminal-worker.js +++ b/static/js/components/app-main/terminal-worker.js @@ -6,48 +6,81 @@ importScripts('../../terminal/index.js'); -var ACTIVE; -var RUNTIMECACHE = {}; +var xterm; -function send(name, xterm){ - postMessage({ - name: name, - screen: xterm.toString('html') - }); -} +onconnect = function (event){ + var port = event.ports[0]; -onmessage = function (event){ - var xterm; - var message = event.data; + port.onmessage = function (event){ + var message = event.data; - switch (message.action) { - case 'open': - xterm = RUNTIMECACHE[message.name]; + function send(name, xterm){ + var data = { + name: name, + screen: xterm.toString('html') + }; - if (!xterm) { - xterm = new AnsiTerminal(120, 60, 0); - xterm.newline_mode = true; - RUNTIMECACHE[message.name] = xterm; - } + port.postMessage(data); + } - ACTIVE = message.name; + switch (message.action) { + case 'open': + if (!xterm) { + xterm = new AnsiTerminal(120, 60, 0); + xterm.newline_mode = true; + } - send(message.name, xterm); - break; - case 'close': - delete RUNTIMECACHE[message.name]; - break; - case 'write': - xterm = RUNTIMECACHE[message.name]; - - if (ACTIVE === message.name) { + send(message.name, xterm); + break; + case 'close': + delete xterm.reset(); + break; + case 'write': xterm.write(message.data); send(message.name, xterm); - } else { - setTimeout(function (){ - xterm.write(message.data); - }, 16); - } - break; - } + break; + } + }; + + //function send(name, xterm){ + // postMessage({ + // name: name, + // screen: xterm.toString('html') + // }); + //} + // + //switch (message.action) { + // case 'open': + // xterm = RUNTIMECACHE[message.name]; + // + // if (!xterm) { + // xterm = new AnsiTerminal(120, 60, 0); + // xterm.newline_mode = true; + // SCREENCACHE[message.name] = ''; + // RUNTIMECACHE[message.name] = xterm; + // } + // + // ACTIVE = message.name; + // + // if (SCREENCACHE[message.name]) { + // xterm.write(SCREENCACHE[message.name]); + // SCREENCACHE[message.name] = ''; + // } + // + // send(message.name, xterm); + // break; + // case 'close': + // delete RUNTIMECACHE[message.name]; + // break; + // case 'write': + // xterm = RUNTIMECACHE[message.name]; + // + // if (ACTIVE === message.name) { + // xterm.write(message.data); + // send(message.name, xterm); + // } else { + // SCREENCACHE[message.name] += message.data; + // } + // break; + //} };