electron-distribution/public/js/main.js
2019-06-07 23:04:57 +08:00

252 lines
7.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

window.onload = function () {
let buildType = null;
Terminal.applyAddon(attach);
Terminal.applyAddon(fit);
const term = new Terminal({
useStyle: true,
convertEol: true,
screenKeys: true,
cursorBlink: false,
visualBell: true,
colors: Terminal.xtermColors
});
window.term = term;
const terminalDom = document.getElementById('terminal');
const socket = io();
// 对Date的扩展将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt))
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)
if(new RegExp("("+ k +")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
return fmt;
}
const checkToken = () => {
if (window.localStorage.token) {
document.querySelector('#no-auth').style.display = 'none';
document.querySelector('#auth').style.display = 'block';
return true;
} else {
document.querySelector('#no-auth').style.display = 'block';
document.querySelector('#auth').style.display = 'none';
return false;
}
}
const dockerInitailize = () => {
socket.emit('pull', 'win');
socket.emit('pull', 'linux');
term.on('data', (data) => {
socket.emit('cmd', data);
})
}
const showLog = (path) => {
term.clear();
term.writeln('Loading...');
socket.emit('log', encodeURI(path));
}
const getHash = () => {
try {
const shaObj = new jsSHA("SHA-512", "TEXT");
shaObj.update(window.localStorage.token);
return shaObj.getHash("HEX");
} catch (err) {
console.error(err);
alert(err.toString());
}
}
const checkAuth = async () => {
try {
const hash = getHash();
const response = await fetch('/app/auth?token=' + hash);
const data = await response.json();
if (data.status === 1) {
buildType = data.result.buildType;
if (!buildType.includes('linux')) document.getElementById('buildLinuxBtn').style.display = 'none';
if (!buildType.includes('win')) document.getElementById('buildWindowsBtn').style.display = 'none';
if (!buildType.includes('mac')) document.getElementById('buildMacBtn').style.display = 'none';
} else {
alert(data.msg);
window.localStorage.removeItem('token');
window.location.reload();
return false;
}
socket.on('requireAuth', (data) => {
if (data === 'distribution') {
socket.emit('auth', hash);
}
})
socket.on('auth', (data) => {
if (data === 'success') {
term.clear();
term.write('Welcome \x1B[1;3;31mElectron Distribution\x1B[0m ! \n');
} else {
term.clear();
term.write('Auth fail. \n');
}
})
return true;
} catch (e) {
console.error(e);
alert('Network Error.');
return false;
}
}
const gitPull = () => {
socket.emit('gitPull', '');
}
const buildApp = async (type) => {
document.getElementById('table').innerHTML = '';
term.clear();
term.writeln('Loading...');
try {
const hash = getHash();
const response = await fetch('/build/' + type + '?token=' + hash);
const data = await response.json();
if (data.status === 1) {
term.clear();
term.write('Runing yarn... \n');
socket.emit('logs', data.result);
} else {
alert(data.msg);
}
} catch (e) {
console.error(e);
alert('Network Error.');
}
}
const getLocalTime = (nS) => {
return new Date(Number(nS)).Format("yyyy-MM-dd hh:mm:ss");
}
const getList = async (type) => {
try {
const hash = getHash();
const response = await fetch('/app/list/' + type + '?token=' + hash);
const data = await response.json();
if (data.status === 1) {
if (data.result.list && data.result.list.length) {
for (const n in data.result.list) {
if (data.result.list[n].startDate) {
data.result.list[n].startDate = getLocalTime(data.result.list[n].startDate)
} else if (data.result.list[n].releaseDate) {
data.result.list[n].releaseDate = getLocalTime(data.result.list[n].releaseDate)
}
}
document.getElementById('table').innerHTML = convertJsonToTable(data.result.list);
} else {
document.getElementById('table').innerHTML = 'No data.';
}
} else {
alert(data.msg);
}
} catch (e) {
console.error(e);
alert('Network Error.');
}
}
const init = async () => {
if (!checkToken()) return;
if (!(await checkAuth())) return;
window.showLog = showLog;
socket.on('show', (data) => {
term.write(data);
})
socket.on('progress', (data) => {
term.clear();
term.write(data);
})
socket.on('end', (data) => {
term.write(data);
})
socket.on('err', (data) => {
term.write(data);
})
term.open(terminalDom);
term.fit();
term.write('Verifying... Please wait ...\n');
}
document.querySelector('#tokenInput').onkeyup = function (e) {
if (e && e.keyCode == 13) {
window.localStorage.token = document.querySelector('#tokenInput').value;
window.location.reload();
}
}
document.querySelector('#logoutBtn').onclick = function () {
window.localStorage.removeItem('token');
window.location.reload();
}
document.querySelector('#listReleaseBtn').onclick = function () {
getList('release')
}
document.querySelector('#listBuildBtn').onclick = function () {
getList('build')
}
document.querySelector('#dockerInitBtn').onclick = function () {
document.getElementById('table').innerHTML = '';
term.clear();
term.writeln('Loading...');
dockerInitailize();
}
document.querySelector('#gitPullBtn').onclick = function () {
document.getElementById('table').innerHTML = '';
term.clear();
term.writeln('Loading...');
gitPull();
}
document.querySelector('#buildLinuxBtn').onclick = function () {
buildApp('linux');
}
document.querySelector('#buildWindowsBtn').onclick = function () {
buildApp('win');
}
document.querySelector('#buildMacBtn').onclick = function () {
buildApp('mac');
}
init();
}