2021-11-01 20:12:55 +01:00
|
|
|
<template>
|
|
|
|
<div ref="renderEl"></div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import 'xterm/css/xterm.css'
|
|
|
|
import { Terminal } from 'xterm'
|
|
|
|
import { AttachAddon } from 'xterm-addon-attach'
|
|
|
|
import { onMounted, ref } from 'vue'
|
|
|
|
import { FitAddon } from 'xterm-addon-fit'
|
2021-11-01 21:07:22 +01:00
|
|
|
import { resizeTerminal } from '../lib/api.js'
|
2021-11-01 20:12:55 +01:00
|
|
|
|
|
|
|
export default {
|
|
|
|
name: 'WsTerm',
|
|
|
|
|
|
|
|
props: {
|
|
|
|
container: String,
|
|
|
|
session: String
|
|
|
|
},
|
|
|
|
|
|
|
|
setup (props) {
|
|
|
|
const socket = new WebSocket(`ws://localhost:1234/ws/${props.container}/${props.session}`)
|
|
|
|
|
|
|
|
const renderEl = ref(null)
|
|
|
|
const term = new Terminal()
|
|
|
|
const attachAddon = new AttachAddon(socket)
|
|
|
|
const fitAddon = new FitAddon()
|
|
|
|
|
|
|
|
term.loadAddon(fitAddon)
|
|
|
|
term.loadAddon(attachAddon)
|
|
|
|
|
|
|
|
const resize = () => {
|
|
|
|
fitAddon.fit()
|
|
|
|
|
2021-11-01 21:07:22 +01:00
|
|
|
resizeTerminal(props.container, props.session, term.cols, term.rows)
|
2021-11-01 20:12:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
const resizeObserver = new ResizeObserver(() => {
|
|
|
|
resize()
|
|
|
|
})
|
|
|
|
|
|
|
|
resizeObserver.observe(renderEl.value)
|
|
|
|
term.open(renderEl.value)
|
|
|
|
|
|
|
|
resize()
|
|
|
|
})
|
|
|
|
|
|
|
|
return { renderEl }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|