mirror of
https://github.com/bin456789/reinstall.git
synced 2026-02-21 18:37:49 +08:00
111 lines
6.0 KiB
HTML
111 lines
6.0 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
|
|
<head>
|
|
<title>Reinstall Logs</title>
|
|
<style>
|
|
body {
|
|
margin: 0;
|
|
padding: 0;
|
|
overflow: hidden;
|
|
}
|
|
|
|
#log-container {
|
|
height: calc(100vh);
|
|
margin: 0;
|
|
padding: 8px;
|
|
overflow-y: scroll;
|
|
}
|
|
|
|
#scroll-to-bottom {
|
|
position: fixed;
|
|
bottom: 24px;
|
|
right: 24px;
|
|
background-color: #0099FF;
|
|
color: #fff;
|
|
border: none;
|
|
cursor: pointer;
|
|
display: none;
|
|
width: 48px;
|
|
height: 48px;
|
|
border-radius: 50%;
|
|
}
|
|
|
|
#scroll-to-bottom:hover {
|
|
background-color: #00CCFF;
|
|
}
|
|
|
|
#scroll-to-bottom svg {
|
|
fill: #fff;
|
|
}
|
|
|
|
.done {
|
|
background-color: #cfc;
|
|
}
|
|
|
|
.error {
|
|
background-color: #fcc;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<pre id="log-container"></pre>
|
|
<button id="scroll-to-bottom">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
|
<path d="M5 10l7 7 7-7H5z" />
|
|
</svg>
|
|
</button>
|
|
|
|
<script>
|
|
!function(a,b){"function"==typeof define&&define.amd?define([],b):"undefined"!=typeof module&&module.exports?module.exports=b():a.ReconnectingWebSocket=b()}(this,function(){function a(b,c,d){function l(a,b){var c=document.createEvent("CustomEvent");return c.initCustomEvent(a,!1,!1,b),c}var e={debug:!1,automaticOpen:!0,reconnectInterval:1e3,maxReconnectInterval:3e4,reconnectDecay:1.5,timeoutInterval:2e3};d||(d={});for(var f in e)this[f]="undefined"!=typeof d[f]?d[f]:e[f];this.url=b,this.reconnectAttempts=0,this.readyState=WebSocket.CONNECTING,this.protocol=null;var h,g=this,i=!1,j=!1,k=document.createElement("div");k.addEventListener("open",function(a){g.onopen(a)}),k.addEventListener("close",function(a){g.onclose(a)}),k.addEventListener("connecting",function(a){g.onconnecting(a)}),k.addEventListener("message",function(a){g.onmessage(a)}),k.addEventListener("error",function(a){g.onerror(a)}),this.addEventListener=k.addEventListener.bind(k),this.removeEventListener=k.removeEventListener.bind(k),this.dispatchEvent=k.dispatchEvent.bind(k),this.open=function(b){h=new WebSocket(g.url,c||[]),b||k.dispatchEvent(l("connecting")),(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","attempt-connect",g.url);var d=h,e=setTimeout(function(){(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","connection-timeout",g.url),j=!0,d.close(),j=!1},g.timeoutInterval);h.onopen=function(){clearTimeout(e),(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onopen",g.url),g.protocol=h.protocol,g.readyState=WebSocket.OPEN,g.reconnectAttempts=0;var d=l("open");d.isReconnect=b,b=!1,k.dispatchEvent(d)},h.onclose=function(c){if(clearTimeout(e),h=null,i)g.readyState=WebSocket.CLOSED,k.dispatchEvent(l("close"));else{g.readyState=WebSocket.CONNECTING;var d=l("connecting");d.code=c.code,d.reason=c.reason,d.wasClean=c.wasClean,k.dispatchEvent(d),b||j||((g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onclose",g.url),k.dispatchEvent(l("close")));var e=g.reconnectInterval*Math.pow(g.reconnectDecay,g.reconnectAttempts);setTimeout(function(){g.reconnectAttempts++,g.open(!0)},e>g.maxReconnectInterval?g.maxReconnectInterval:e)}},h.onmessage=function(b){(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onmessage",g.url,b.data);var c=l("message");c.data=b.data,k.dispatchEvent(c)},h.onerror=function(b){(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onerror",g.url,b),k.dispatchEvent(l("error"))}},1==this.automaticOpen&&this.open(!1),this.send=function(b){if(h)return(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","send",g.url,b),h.send(b);throw"INVALID_STATE_ERR : Pausing to reconnect websocket"},this.close=function(a,b){"undefined"==typeof a&&(a=1e3),i=!0,h&&h.close(a,b)},this.refresh=function(){h&&h.close()}}return a.prototype.onopen=function(){},a.prototype.onclose=function(){},a.prototype.onconnecting=function(){},a.prototype.onmessage=function(){},a.prototype.onerror=function(){},a.debugAll=!1,a.CONNECTING=WebSocket.CONNECTING,a.OPEN=WebSocket.OPEN,a.CLOSING=WebSocket.CLOSING,a.CLOSED=WebSocket.CLOSED,a});
|
|
|
|
const logContainer = document.getElementById('log-container');
|
|
const scrollToBottomButton = document.getElementById('scroll-to-bottom');
|
|
let shouldScrollToBottom = true;
|
|
|
|
scrollToBottomButton.addEventListener('click', () => {
|
|
logContainer.scrollTop = logContainer.scrollHeight;
|
|
});
|
|
|
|
logContainer.addEventListener('scroll', () => {
|
|
const isAtBottom = Math.ceil(logContainer.scrollTop + logContainer.clientHeight) >= logContainer.scrollHeight;
|
|
if (isAtBottom) {
|
|
scrollToBottomButton.style.display = 'none';
|
|
} else {
|
|
scrollToBottomButton.style.display = 'block';
|
|
}
|
|
|
|
shouldScrollToBottom = isAtBottom;
|
|
});
|
|
|
|
var ws = new ReconnectingWebSocket('ws://' + location.host + '/');
|
|
ws.onopen = function () {
|
|
logContainer.textContent += '\nWebSocket Connected.';
|
|
};
|
|
ws.onclose = function () {
|
|
logContainer.textContent += '\nWebSocket Disconnected.';
|
|
};
|
|
ws.onmessage = function (event) {
|
|
logContainer.textContent += '\n' + event.data;
|
|
if (shouldScrollToBottom) {
|
|
logContainer.scrollTop = logContainer.scrollHeight;
|
|
}
|
|
// 开始/重新开始
|
|
if (event.data.includes('***** START TRANS *****')) {
|
|
document.body.className = ''
|
|
}
|
|
// 错误
|
|
else if (event.data.includes('***** ERROR *****')) {
|
|
document.body.className = 'error'
|
|
}
|
|
// 完成
|
|
else if (event.data.includes('***** DONE *****')) {
|
|
document.body.className = 'done'
|
|
}
|
|
};
|
|
</script>
|
|
</body>
|
|
|
|
</html>
|