526 lines
17 KiB
JavaScript
526 lines
17 KiB
JavaScript
var WSHandler = function (event) {
|
|
// console.log(event);
|
|
data = event.data;
|
|
// console.log(" -->" + data);
|
|
try {
|
|
var obj = JSON.parse(data);
|
|
switch (obj.action) {
|
|
case 'ping':
|
|
case 'poing':
|
|
break;
|
|
case 'onExecuteResult':
|
|
onExecuteResult(obj);
|
|
break;
|
|
case 'onListContractProcess':
|
|
onListContractProcess(obj);
|
|
break;
|
|
case 'onStartContract':
|
|
onStartContract(obj);
|
|
break;
|
|
case 'onKillContractProcess':
|
|
logComm(obj);
|
|
break;
|
|
case 'onKillAllContract':
|
|
onKillAllContract(obj);
|
|
break;
|
|
case 'onOutputStream':
|
|
displayOutput(obj);
|
|
break;
|
|
case 'onSaveFile':
|
|
onSaveFile(obj);
|
|
break;
|
|
case 'uploadNext':
|
|
onUploadNext(obj);
|
|
break;
|
|
case 'sendNextSegment':
|
|
global.wssocket.sendNextSegment();
|
|
break;
|
|
case 'sendSeg':
|
|
receiveSeg(obj);
|
|
break;
|
|
case 'onException':
|
|
logException(obj);
|
|
break;
|
|
case 'onHashResult':
|
|
onHashResult(obj);
|
|
break;
|
|
case 'onDumpContract':
|
|
onDumpContract(obj);
|
|
break;
|
|
default:
|
|
displayOutput(obj);
|
|
break;
|
|
}
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
};
|
|
var logException = function (obj) {
|
|
global.tempobj = obj;
|
|
$("#responseStatus").html("Exception (" + obj.executeTime + "ms)");
|
|
displayOutput(obj);
|
|
};
|
|
|
|
var logComm = function (obj) {
|
|
console.log(obj);
|
|
};
|
|
var displayOutput = function (obj) {
|
|
displayOutputStr(obj.data);
|
|
};
|
|
|
|
var displayOutputStr = function (str) {
|
|
console.log("[cm.js] displayOutput:" + str);
|
|
};
|
|
var getControlWsUrl = function (host) {
|
|
var prefix = "ws://";
|
|
if (document.location.href.startsWith("https"))
|
|
prefix = "wss://";
|
|
var path = "/SCIDE/SCExecutor";
|
|
return prefix + host + path;
|
|
};
|
|
var initWSocket = function () {
|
|
var host = getHost();
|
|
var url = getControlWsUrl(host);
|
|
global.wssocket = createWssocket(url, function () {
|
|
listContractProcess();
|
|
}, WSHandler);
|
|
};
|
|
// ====== wsHandler
|
|
var onStartContract = function (obj) {
|
|
// console.log(obj);
|
|
var result = JSON.parse(obj.data);
|
|
|
|
$("#responseStatus").html(result.status + " (" + obj.executeTime + "ms)");
|
|
global.responseEditor.setValue(result.result);
|
|
// $("#tabdiv").editableSelect('add', obj.cid);
|
|
// $("#tabdiv").editableSelect()[0].value = obj.cid;
|
|
};
|
|
var onExecuteResult = function (obj) {
|
|
// console.log(obj);
|
|
var data = JSON.parse(obj.data);
|
|
$("#responseStatus").html(data.status + " (" + obj.executeTime + "ms)");
|
|
global.responseEditor.setValue(data.result);
|
|
// console.log(data);
|
|
var totalLines = global.responseEditor.lineCount();
|
|
global.responseEditor.autoFormatRange({
|
|
line: 0,
|
|
ch: 0
|
|
}, {
|
|
line: totalLines
|
|
});
|
|
if (data.analysis != undefined && data.analysis.length > 0) {
|
|
// displayOutputStr(data.analysis);
|
|
}
|
|
};
|
|
var onListContractProcess = function (obj) {
|
|
var data = JSON.parse(obj.data);
|
|
global.contracts = data;
|
|
var html = "";
|
|
|
|
// $("#tabdiv").html("");
|
|
global.contractName2ID = {};
|
|
for (var i = 0; i < data.length; i++) {
|
|
global.contractName2ID[data[i].name] = data[i].id;
|
|
html += "<li class=\"ui-widget-content\">" + data[i].name + "</li>";
|
|
// $("#tabdiv").append(
|
|
// $("<option></option>").attr("value", data[i].id).text(
|
|
// data[i].id));
|
|
}
|
|
$("#contractList").html(html);
|
|
$("#contractList").selectable(
|
|
{
|
|
stop: function () {
|
|
var result = "";
|
|
global.selectedContracts = [];
|
|
global.selectedContractIndexs = [];
|
|
|
|
$(".ui-selected", this).each(function () {
|
|
var index = $("#contractList li").index(this);
|
|
global.selectedContracts.push(this.innerText);
|
|
global.selectedContractIndexs.push(index);
|
|
});
|
|
// console.log("[cm.js] selectContractResult:"
|
|
// + global.selectedContracts);
|
|
}
|
|
});
|
|
// $("#tabdiv").selectmenu("refresh");
|
|
// $("#tabdiv").html(html);
|
|
// $("yourid/class here").append($("<option></option>").attr("value",
|
|
// youroption-value).text(youroption-text));
|
|
|
|
};
|
|
var onSaveFile = function (obj) {
|
|
alert("Save file:" + obj.data);
|
|
};
|
|
var onKillAllContract = function (obj) {
|
|
customAlert(obj.data);
|
|
};
|
|
var onHashResult = function (obj) {
|
|
$("#hashResult").html("刚刚操作的数链指纹:" + obj.data);
|
|
};
|
|
var onDumpContract = function (obj) {
|
|
// console.log("DumpResult:" + obj.data);
|
|
if (obj.data == "success") {
|
|
listDumpMemoryDir();
|
|
}
|
|
};
|
|
// ====== wsHandler done!
|
|
var switchContract = function (off) {
|
|
// var contract = global.contracts[off];
|
|
// global.scriptEditor.setValue(contract.script);
|
|
// $("#tabdiv")[0].value = contract.id;
|
|
var pingObj = {};
|
|
pingObj.action = "connectTo";
|
|
|
|
pingObj.name = $("#tabdiv")[0].value;
|
|
pingObj.id = global.contractName2ID[pingObj.name];
|
|
global.wssocket.send(JSON.stringify(pingObj));
|
|
}
|
|
var countChar = function (str, c) {
|
|
var ret = 0;
|
|
for (var i = 0; i < str.length; i++) {
|
|
if (str.charAt(i) == c)
|
|
ret++;
|
|
}
|
|
return ret;
|
|
}
|
|
var generate = function () {
|
|
$.ajax({
|
|
url: "./SCManager?action=generatePrivateKey",
|
|
dataType: "json"
|
|
}).done(function (result) {
|
|
if (result.status) {
|
|
localStorage.setItem("PrivKey", result.data);
|
|
alert("Key successfully generated!");
|
|
initRest();
|
|
}
|
|
});
|
|
}
|
|
|
|
var initGlobal = function () {
|
|
window.global = {};
|
|
global.privKey = localStorage.getItem("PrivKey");
|
|
if (global.privKey == undefined || global.privKey == null
|
|
|| global.privKey.length < 100) {
|
|
generate();
|
|
} else
|
|
initRest();
|
|
|
|
}
|
|
var setMainHost = function () {
|
|
var mainHost = $("#targetHost")[0].value;
|
|
localStorage.setItem("mainHost", mainHost);
|
|
}
|
|
var initRest = function () {
|
|
var mainHost = localStorage.getItem("mainHost");
|
|
if (mainHost == undefined) {
|
|
localStorage.setItem("mainHost", "39.106.6.6:8080");
|
|
mainHost = localStorage.getItem("mainHost");
|
|
}
|
|
$("#targetHost")[0].value = mainHost;
|
|
};
|
|
var onUploadNext = function () {
|
|
var request = {};
|
|
request.action = "startContract";
|
|
request.owner = global.privKey;
|
|
request.isPartial = false;
|
|
request.script = global.toSend;
|
|
if (request.script.length > 1024) {
|
|
global.toSend = request.script.substr(1024);
|
|
request.script = request.script.substr(0, 1024);
|
|
request.isPartial = true;
|
|
} else {
|
|
global.toSend = "";
|
|
}
|
|
// console.log("Upload nextPart:");
|
|
// console.log(JSON.stringify(request));
|
|
global.wssocket.send(JSON.stringify(request));
|
|
};
|
|
var disposeContract = function (request, host, contractIndex) {
|
|
// fileWs.send(JSON.stringify(request));
|
|
// console.log("[cm.js] disposeContract:" + host + "-->"
|
|
// + JSON.stringify(request));
|
|
var wsUrl = getFileWsUrl(host);
|
|
var fileWs = new WebSocket(wsUrl);
|
|
fileWs.onerror = function (error) {
|
|
console.log(error);
|
|
};
|
|
fileWs.contractIndex = contractIndex;
|
|
fileWs.onopen = function (error) {
|
|
fileWs.send(JSON.stringify(request));
|
|
};
|
|
fileWs.currHost = host;
|
|
fileWs.zipInfo = request;
|
|
fileWs.onmessage = downloadHandler;
|
|
}
|
|
var updateProgress = function (progressIndex, host, progress) {
|
|
if (isNaN(progress)) {
|
|
console.log("StopHere");
|
|
}
|
|
var hostMap = global.progressStat.get(progressIndex);
|
|
hostMap.set(host, progress);
|
|
var total = 0;
|
|
for (var j = 0; j < global.hosts.length; j++) {
|
|
total += hostMap.get(global.hosts[j]);
|
|
}
|
|
// console.log("[cm.js] updateProgress:" + total);
|
|
$($("#progressBars .progressDiv")[progressIndex]).progressbar({
|
|
value: Math.floor(total / global.hosts.length)
|
|
});
|
|
};
|
|
|
|
|
|
var downloadHandler = function (obj, wssocket) {
|
|
data = event.data;
|
|
// console.log(" -->" + data);
|
|
try {
|
|
var obj = JSON.parse(data);
|
|
switch (obj.action) {
|
|
case "onDownloadContract":
|
|
// console.log(JSON.stringify(obj));
|
|
updateProgress(this.contractIndex, this.currHost,
|
|
obj.executeTime * 0.95);
|
|
//console.log("[cm.js] obj.executeTime = " + obj.executeTime * 0.95 + " ; " + obj.executeTime);
|
|
if (obj.data == "success") {
|
|
console.log("[cm.js] downloadHandler successs");
|
|
startContractWithHost(this.currHost, this.zipInfo.fileName,
|
|
this.contractIndex);
|
|
this.close();
|
|
}
|
|
break;
|
|
case "onStartContract":
|
|
updateProgress(wssocket.contractIndex, wssocket.currHost, 100);
|
|
wssocket.close();
|
|
break;
|
|
default:
|
|
}
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
}
|
|
var getControlWsUrl = function (host) {
|
|
var prefix = "ws://";
|
|
if (document.location.href.startsWith("https"))
|
|
prefix = "wss://";
|
|
var path = document.location.pathname.lastIndexOf("/");
|
|
path = document.location.pathname.substr(0, path + 1);
|
|
path += "SCExecutor";
|
|
return prefix + host + path;
|
|
};
|
|
var startContractWithHost = function (host, fileName, contractIndex) {
|
|
|
|
//console.log("[cm.js] host = " + host + " ; fileName" + fileName + " ; contractIndex = " + contractIndex);
|
|
var wsUrl = getControlWsUrl(host);
|
|
//console.log("[cm.js] this = " + this);
|
|
var controller = createWssocket(wsUrl, function () {
|
|
// onopen;
|
|
var request = {};
|
|
request.action = "startContractInTempZips";
|
|
request.owner = global.privKey;
|
|
request.path = fileName;
|
|
request.script = "empty";
|
|
controller.send(JSON.stringify(request));
|
|
this.contractIndex = contractIndex;
|
|
this.currHost = host;
|
|
}, downloadHandler);
|
|
|
|
};
|
|
|
|
var startContract = function () {
|
|
|
|
global.progressStat = new Map();
|
|
for (var i = 0; i < global.selectedProjects.length; i++) {
|
|
var map = new Map();
|
|
for (var j = 0; j < global.hosts.length; j++) {
|
|
map.set(global.hosts[j], 0);
|
|
}
|
|
global.progressStat.set(global.selectedProjectIndexs[i], map);
|
|
}
|
|
|
|
for (var i = 0; i < global.selectedProjects.length; i++)
|
|
for (var j = 0; j < global.hosts.length; j++) {
|
|
var request = {};
|
|
request.action = "downloadContract";
|
|
request.mainHost = $("#targetHost")[0].value;
|
|
request.projectName = global.selectedProjects[i].replace(" ", "");
|
|
request.fileName = request.projectName + "_" + new Date().getTime()
|
|
+ ".ypk";
|
|
|
|
disposeContract(request, global.hosts[j],
|
|
global.selectedProjectIndexs[i]);
|
|
}
|
|
|
|
};
|
|
var dumpContract = function () {
|
|
var pingObj = {};
|
|
for (var i = 0; i < global.selectedContracts.length; i++) {
|
|
pingObj.action = "dumpContract";
|
|
pingObj.target = "/memoryDumps/" + global.selectedContracts[i] + "_"
|
|
+ new Date().getTime() + ".dyjs";
|
|
pingObj.contractID = global.selectedContracts[i];
|
|
//console.log("[cm.js] pingObj.target = " + pingObj.target);
|
|
//console.log("[cm.js] pingObj.contractID = " + pingObj.contractID);
|
|
|
|
global.wssocket.send(JSON.stringify(pingObj));
|
|
}
|
|
};
|
|
|
|
var loadMemory = function () {
|
|
var pingObj = {};
|
|
for (var i = 0; i < global.selectedContracts.length; i++) {
|
|
pingObj.action = "loadMemory";
|
|
pingObj.target = "/memoryDumps/" + global.selectedDumps[0];
|
|
pingObj.contractID = global.selectedContracts[i];
|
|
global.wssocket.send(JSON.stringify(pingObj));
|
|
}
|
|
};
|
|
|
|
var executeContractWithDynamicResult = function () {
|
|
var request = {};
|
|
request.action = "executeContract";
|
|
request.requestID = new Date().getTime() + "";
|
|
request.contractID = $("#tabdiv")[0].value;
|
|
request.arg = global.argEditor.getValue();
|
|
request.privKey = global.privKey;
|
|
request.withDyanmicAnalysis = true;
|
|
localStorage.setItem("persisArg", JSON.stringify(request));
|
|
global.wssocket.send(JSON.stringify(request));
|
|
};
|
|
var executeContract = function () {
|
|
var request = {};
|
|
request.action = "executeContract";
|
|
request.requestID = new Date().getTime() + "";
|
|
request.contractID = $("#tabdiv")[0].value;
|
|
request.arg = global.argEditor.getValue();
|
|
request.privKey = global.privKey;
|
|
localStorage.setItem("persisArg", JSON.stringify(request));
|
|
global.wssocket.send(JSON.stringify(request));
|
|
};
|
|
var listContractProcess = function () {
|
|
global.wssocket.send(JSON.stringify({
|
|
action: 'listContractProcess',
|
|
filters: 2
|
|
}));
|
|
};
|
|
|
|
var killContractProcess = function () {
|
|
var request = {};
|
|
request.action = "killContractProcess";
|
|
request.requestID = new Date().getTime() + "";
|
|
request.name = $("#tabdiv")[0].value;
|
|
request.id = global.contractName2ID[request.name];
|
|
global.wssocket.send(JSON.stringify(request));
|
|
};
|
|
var staticVerify = function () {
|
|
var request = {};
|
|
request.action = "staticVerifyContract";
|
|
// TODO should be pubkey
|
|
request.owner = global.privKey;
|
|
request.isPartial = false;
|
|
// TODO ignore contractid
|
|
request.contractid = $("#tabdiv")[0].value;
|
|
request.script = global.scriptEditor.getValue();
|
|
request.path = $(".ui-tabs-active").find("a").html();
|
|
localStorage.setItem("persisStatus", JSON.stringify(request));
|
|
if (request.path.startsWith("/"))
|
|
request.script = "empty";
|
|
/*
|
|
* if (request.script.length > 1024) { global.toSend =
|
|
* request.script.substr(1024); request.script = request.script.substr(0,
|
|
* 1024); request.isPartial = true; }
|
|
*/
|
|
global.wssocket.send(JSON.stringify(request));
|
|
};
|
|
var downloadContract = function () {
|
|
if (global.lastClickedProjectId == undefined)
|
|
global.lastClickedProjectId = 0;
|
|
var projectName = global.projects[global.lastClickedProjectId];
|
|
var url = window.location.href.replace("/scide.html",
|
|
"/downLoadServlet?projectName=");
|
|
url += projectName;
|
|
window.open(url);
|
|
|
|
};
|
|
var killAllContract = function () {
|
|
var request = {};
|
|
request.action = "killAllContract";
|
|
global.wssocket.send(JSON.stringify(request));
|
|
};
|
|
|
|
var customAlert = function (message, title) {
|
|
if (!title)
|
|
title = 'Alert';
|
|
|
|
if (!message)
|
|
message = 'No Message to Display.';
|
|
|
|
$('<div></div>').html(message).dialog({
|
|
title: title,
|
|
resizable: false,
|
|
modal: true,
|
|
buttons: {
|
|
'Ok': function () {
|
|
$(this).dialog('close');
|
|
}
|
|
}
|
|
});
|
|
}
|
|
var init = function () {
|
|
initGlobal();
|
|
initWSocket();
|
|
global.hosts = [];
|
|
$("#serverList").selectable({
|
|
stop: function () {
|
|
var result = "";
|
|
global.hosts = [];
|
|
$(".ui-selected", this).each(function () {
|
|
var index = $("#serverList li").index(this);
|
|
global.hosts.push(this.innerText);
|
|
});
|
|
// console.log("[cm.js] selectResult:" + global.hosts);
|
|
}
|
|
});
|
|
};
|
|
var getRequestParameters = function () {
|
|
var arr = (location.search || "").replace(/^\?/, '').split("&");
|
|
var params = {};
|
|
for (var i = 0; i < arr.length; i++) {
|
|
var data = arr[i].split("=");
|
|
if (data.length == 2) {
|
|
params[data[0]] = data[1];
|
|
}
|
|
}
|
|
return params;
|
|
};
|
|
|
|
var initHello = function () {
|
|
var param = getRequestParameters();
|
|
var type = parseInt(param["type"]);
|
|
var template;
|
|
switch (type) {
|
|
case 1:
|
|
template = getTemplate1(param["name"], decodeURI(param["list"]),
|
|
param["expiredDate"]);
|
|
break;
|
|
case 2:
|
|
template = getTemplate2(param["name"], decodeURI(param["list"]),
|
|
param["expiredDate"]);
|
|
break;
|
|
case 3:
|
|
var contractID = param["contractID"];
|
|
$.ajax({
|
|
url: "./SCManager?action=getCodeByID&contractID=" + contractID,
|
|
dataType: "json"
|
|
}).done(function (result) {
|
|
global.fileContentMap.set(contractID, result.data);
|
|
addTab({
|
|
"title": contractID
|
|
});
|
|
|
|
});
|
|
return;
|
|
default:
|
|
return;
|
|
}
|
|
global.scriptEditor.setValue(template);
|
|
}; |