-
-
-
-
- {{event.message}}
-
-
-
-
@@ -191,7 +187,7 @@
diff --git a/src/app/components/project-map/project-map.component.scss b/src/app/components/project-map/project-map.component.scss
index f081293f..4be70ccc 100644
--- a/src/app/components/project-map/project-map.component.scss
+++ b/src/app/components/project-map/project-map.component.scss
@@ -1,3 +1,7 @@
+.wrapper {
+ height: 600px;
+}
+
app-root,
app-project-map,
.project-map,
diff --git a/src/app/components/project-map/web-console/web-console.component.html b/src/app/components/project-map/web-console/web-console.component.html
new file mode 100644
index 00000000..42dda52d
--- /dev/null
+++ b/src/app/components/project-map/web-console/web-console.component.html
@@ -0,0 +1 @@
+
diff --git a/src/app/components/project-map/web-console/web-console.component.scss b/src/app/components/project-map/web-console/web-console.component.scss
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/components/project-map/web-console/web-console.component.spec.ts b/src/app/components/project-map/web-console/web-console.component.spec.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/src/app/components/project-map/web-console/web-console.component.ts b/src/app/components/project-map/web-console/web-console.component.ts
new file mode 100644
index 00000000..b98d24c0
--- /dev/null
+++ b/src/app/components/project-map/web-console/web-console.component.ts
@@ -0,0 +1,59 @@
+import { Component, OnInit, Input, AfterViewInit, ViewEncapsulation, ViewChild, ElementRef } from '@angular/core';
+import { Project } from '../../../models/project';
+import { Server } from '../../../models/server';
+import { Terminal } from 'xterm';
+import { AttachAddon } from 'xterm-addon-attach';
+import { Node } from '../../../cartography/models/node';
+import { FitAddon } from 'xterm-addon-fit';
+import { NodeConsoleService } from '../../../services/nodeConsole.service';
+
+
+@Component({
+ encapsulation: ViewEncapsulation.None,
+ selector: 'app-web-console',
+ templateUrl: './web-console.component.html',
+ styleUrls: ['../../../../../node_modules/xterm/css/xterm.css']
+})
+export class WebConsoleComponent implements OnInit, AfterViewInit {
+ @Input() server: Server;
+ @Input() project: Project;
+ @Input() node: Node;
+
+ public term: Terminal = new Terminal();
+ public fitAddon: FitAddon = new FitAddon();
+
+ @ViewChild('terminal', {static: false}) terminal: ElementRef;
+
+ constructor(
+ private consoleService: NodeConsoleService
+ ) {}
+
+ ngOnInit() {
+ this.consoleService.consoleResized.subscribe(ev => {
+ this.fitAddon.fit();
+ });
+ }
+
+ ngAfterViewInit() {
+ this.term.open(this.terminal.nativeElement);
+ const socket = new WebSocket(this.getUrl());
+
+ socket.onerror = ((event) => {
+ this.term.write('Connection lost');
+ });
+ socket.onclose = ((event) => {
+ this.consoleService.closeConsoleForNode(this.node);
+ });
+
+ const attachAddon = new AttachAddon(socket);
+ this.term.loadAddon(attachAddon);
+ this.term.setOption('cursorBlink', true);
+ this.term.loadAddon(this.fitAddon);
+ this.fitAddon.activate(this.term);
+ this.term.focus();
+ }
+
+ getUrl() {
+ return `ws://${this.server.host}:${this.server.port}/v2/projects/${this.node.project_id}/nodes/${this.node.node_id}/console/ws`
+ }
+}
diff --git a/src/app/services/nodeConsole.service.ts b/src/app/services/nodeConsole.service.ts
new file mode 100644
index 00000000..77467943
--- /dev/null
+++ b/src/app/services/nodeConsole.service.ts
@@ -0,0 +1,24 @@
+import { Injectable, EventEmitter } from '@angular/core';
+import { Node } from '../cartography/models/node';
+import { Subject } from 'rxjs';
+
+@Injectable()
+export class NodeConsoleService {
+ public nodeConsoleTrigger = new EventEmitter
();
+ public closeNodeConsoleTrigger = new Subject();
+ public consoleResized = new Subject();
+
+ constructor() {}
+
+ openConsoleForNode(node: Node) {
+ this.nodeConsoleTrigger.emit(node);
+ }
+
+ closeConsoleForNode(node: Node) {
+ this.closeNodeConsoleTrigger.next(node);
+ }
+
+ resizeTerminal() {
+ this.consoleResized.next(true);
+ }
+}
diff --git a/yarn.lock b/yarn.lock
index 7b564db9..43a6d7c1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -10129,6 +10129,16 @@ xterm@^4.1.0:
resolved "https://registry.npmjs.org/xterm/-/xterm-4.3.0.tgz#9a302efefe75172d4f7ea3afc20f9bd983f05027"
integrity sha512-6dnrC4nxgnRKQzIWwC5HA0mnT9/rpDPZflUIr24gdcdSMTKM1QQcor4qQ/xz4Zerz6AIL/CuuBPypFfzsB63dQ==
+xterm-addon-attach@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.npmjs.org/xterm-addon-attach/-/xterm-addon-attach-0.5.0.tgz#e35cde4ae493ecace7d07e52ff2b9714e3c43068"
+ integrity sha512-L6ThPjF/fVt+gJS2+2h2rEEAXNxIRmCU8/RCM6rYR08K9GtPiHmYcnpRT7WNJf31yFLpWVA8dKcItfP3C0ZKlA==
+
+xterm-addon-fit@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.3.0.tgz#341710741027de9d648a9f84415a01ddfdbbe715"
+ integrity sha512-kvkiqHVrnMXgyCH9Xn0BOBJ7XaWC/4BgpSWQy3SueqximgW630t/QOankgqkvk11iTOCwWdAY9DTyQBXUMN3lw==
+
y18n@^3.2.1:
version "3.2.1"
resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"