function applyRole(role) { global.wssocket.send("{\"action\":\"applyNodeRole\",\"role\":\"" + role + "\",\"pubKey\":\"" + global.sm2Key.publicKey + "\"}"); } function WSHandler(event) { // console.log(event); let data = event.data; try { let obj = JSON.parse(data); switch (obj.action) { case "onSessionID": onSessionID(obj); break; case "onLogin": onLogin(obj); break; case "onListProjects": onListProjects(obj); break; case "onListProject": onListProject(obj); break; case "onRenameFile": onRenameFile(obj); break; case "onDeleteFile": onDeleteFile(obj); break; case "onStartContract": // onStartContract(obj); // break; case "onStartContractAsDebug": onStartContract(obj); break; case "onListContractProcess": onListContractProcess(obj); break; case "onKillContractProcess": onKillContractProcess(obj); break; case "onKillAllContract": onKillAllContract(obj); break; case "onQueryContractInstanceDOI": onQueryContractInstanceDOI(obj); break; case "onQueryContractInstanceInfoByDOI": onQueryContractInstanceInfoByDOI(obj); break; case "onImportContractInstanceCodeByDOI": onImportContractInstanceCodeByDOI(obj); break; case "onExecuteResult": onExecuteResult(obj); break; case 'onOutputStream': displayOutput(obj); break; case 'onListFile': onListFile(obj); break; case 'onSaveFile': onSaveFile(obj); break; case 'onUploadFile': onUploadFile(obj); break; case 'onHashResult': onHashResult(obj); break; case 'onStaticVerifyResult': onStaticVerify(obj); break; case 'onEvaluates': onEvaluates(obj); break; case 'onCompile' : onCompile(obj); break; case 'onRegisterDOI' : onRegisterDOI(obj); break; case 'onStartContractTrustfullyResult': onStartContractTrustfullyResult(obj); break; case 'onException': if (obj.data.startsWith("unauthorized ")) handleNoPermission(obj); onException(obj); break; case 'onGetControlFlow': onGetControlFlow(obj); break; case 'onGenerateReadme': onGenerateReadme(obj); break; default: // console.log(obj); break; } } catch (err) { console.log(err); } } function displayOutput(obj) { console.log(obj); displayOutputStr(obj.data); } function displayOutputStr(str) { if (!global.outputEditor) { return; } let val = global.outputEditor.getValue(); if (val.length > 0) val += "\n"; val += str; global.outputEditor.setValue(val); let info = global.outputEditor.getScrollInfo(); global.outputEditor.scrollTo(0, info.height); } function getControlWsUrl(host) { let prefix = "ws://"; if (document.location.href.startsWith("https")) { prefix = "wss://"; } path = "/SCIDE/SCExecutor"; return prefix + host + path; } function initWSocket() { console.log("[OnlineIDE.js] initWSocket : "); let host = document.location.host; document.title = `数瑞智能合约在线编辑器(${host})` let url = getControlWsUrl( global.urlparam && global.urlparam['nodeAddr'] ? global.urlparam['nodeAddr'] : host); // console.log("connect ws:" + url); global.wssocket = createWssocket(url, function () { getSession(); myToast("提示", "正在登录"); }, WSHandler); } function getSession() { global.wssocket.send("{\"action\":\"getSessionID\"}"); } // ====== wsHandler function onSessionID(data) { global.session = data.session; const loginParam = { action: "login", pubKey: global.sm2Key.publicKey, signature: sm2.doSignature(global.session, global.sm2Key.privateKey, {hash: true, der: true}) }; global.wssocket.send(JSON.stringify(loginParam)); } function onLogin(data) { // var param = {}; pubkeyDialogVue.myRole = data.data; listFiles(); listContracts(); //param.action = "getNodeRole"; //global.wssocket.send(JSON.stringify(param)); } function onRenameFile(data) { myToast("重命名", data.data); if (data.data === "success") { listFiles(); } } function onEvaluates(data) { // console.log("++++++++++++++++++++" + data); } function onDeleteFile(data) { myToast("删除文件", data.data); if (data.data === "success") { listFiles(); } } function onStartContract(data) { // console.log(data); const result = JSON.parse(data.data); /* if (result.isInsnLimit) { global.withEvaluatesAnalysis = true; $("#dialogBodyDiv").text("此合约在执行时会消耗gas,请在执行前进行预估,根据预估值给出相应的值,建议给出的值大于预估值"); showDialog("部署合约成功", function() { }); }*/ startResult.innerText = `${result.status}(${data['executeTime']}ms)`; if (result.status !== "Success") { let body = "
"; body += " "; body += "
"; $("#dialogBodyDiv").html(body); $("#onStartContractFailedContent")[0].value = result.result showDialog("部署合约失败", function () { }); } } // function onStartContractAsDebug(data) { // // console.log(data); // const result = JSON.parse(data.data); // /* if (result.isInsnLimit) { // global.withEvaluatesAnalysis = true; // $("#dialogBodyDiv").text("此合约在执行时会消耗gas,请在执行前进行预估,根据预估值给出相应的值,建议给出的值大于预估值"); // showDialog("部署合约成功", function() { // }); // }*/ // startResult.innerText = `${result.status}(${data['executeTime']}ms)`; // if (result.status !== "Success") { // let body = "
"; // body += " "; // body += "
"; // $("#dialogBodyDiv").html(body); // $("#onStartContractFailedContent")[0].value = result.result // showDialog("部署合约失败", function () { // }); // } // } function onKillContractProcess(data) { // console.log(data); if (data.data === "success") { listContracts(); } stopResult.innerText = `${data.data}(${data['executeTime']}ms)`; } function onKillAllContract(data) { let body = "
"; body += " "; body += "
"; $("#dialogBodyDiv").html(body); $("#onStartContractFailedContent")[0].value = data.data showDialog("停止全部合约", function () { }); } function onQueryContractInstanceDOI(data) { // console.log(data); stopResult.innerText = data.data; } function initContractInstanceInfoArea() { if (!global.contractInstanceInfoEditor) { global.contractInstanceInfoEditor = CodeMirror.fromTextArea( $("#contractInstanceInfoArea")[0], { matchBrackets: true, autoCloseBrackets: true, lineNumbers: true, mode: "application/ld+json", lineWrapping: true }); global.contractInstanceInfoEditor.setSize("height", "200px"); } } function onQueryContractInstanceInfoByDOI(data) { initContractInstanceInfoArea(); // console.log(data); $("#contractInstanceInfoTitle") .html(` (${data['executeTime']}ms)`); global.contractInstanceInfoEditor.setValue(data.data); let totalLines = global.contractInstanceInfoEditor.lineCount(); global.contractInstanceInfoEditor.autoFormatRange({ line: 0, ch: 0 }, { line: totalLines }); } function onImportContractInstanceCodeByDOI(data) { initContractInstanceInfoArea(); // console.log(data); $("#contractInstanceInfoTitle") .html(` (${data['executeTime']}ms)`); global.contractInstanceInfoEditor.setValue(data.data); let totalLines = global.contractInstanceInfoEditor.lineCount(); global.contractInstanceInfoEditor.autoFormatRange({ line: 0, ch: 0 }, { line: totalLines }); global.wssocket.send("{\"action\":\"listProjects\",\"isPrivate\":true}"); } function onListContractProcess(data) { // console.log(data); mainVue.contracts = []; const list = JSON.parse(data.data); for (let i = 0; i < list.length; i++) { if (list[i].contractStatus !== "KILLED") { mainVue.contracts.push(list[i]); } } selectedContract.value = 0; selectContractToExecute(); } function onSaveFile(data) { myToast("保存文件", data.data); } function onUploadFile(obj) { if (obj.data === "success") uploadInternal(); } function initResponseAndOutputArea() { if (!global.responseEditor) { setTimeout(function () { global.responseEditor = CodeMirror.fromTextArea( $("#responseArea")[0], { matchBrackets: true, autoCloseBrackets: true, lineNumbers: true, mode: "application/ld+json", lineWrapping: true }); global.responseEditor.setSize("height", "200px"); global.outputEditor = CodeMirror.fromTextArea( $("#outputStreamArea")[0], { matchBrackets: true, autoCloseBrackets: true, lineNumbers: true, mode: "application/ld+json", lineWrapping: true }); global.outputEditor.setSize("height", "200px"); }, 200); } } function onExecuteResult(obj) { const executeResultTitleEl = $("#executeResultTitle"); const data = obj; var styleTail = "未知格式"; if (data.result==undefined) { styleTail = "Undefined"; data.result = ""; } else if (data.result instanceof Object) { styleTail = "JSON格式"; data.result =JSON.stringify(data.result); } else if (typeof data.result == 'string') { styleTail = "字符串格式"; } else if (typeof data.result == 'boolean'){ styleTail = "布尔值格式"; data.result = data.result.toString(); }else if (typeof data.result == 'number'){ styleTail = "数值格式"; data.result = data.result.toString(); } var gasInfo = ""; if (data.executionGas!=undefined && data.executionGas>0) gasInfo =" "+data.executionGas+"gas"; global.responseEditor.setValue(data.result); executeResultTitleEl .html(`${data.status} (${obj['executeTime']}ms)${gasInfo} ${styleTail}`); // console.log(data); const totalLines = global.responseEditor.lineCount(); global.responseEditor.autoFormatRange({ line: 0, ch: 0 }, { line: totalLines }); // if (data['analysis'] && data['analysis'].length > 0) { // displayOutputStr(data.analysis); // } } function onGenerateReadme(obj) { // console.log(obj.data); myToast("生成文档结果", obj.data); listFiles(); } function onHashResult(obj) { $("#hashDisplayDiv").html("溯源指纹:" + obj.data); } function onException(obj) { if (obj.data.startsWith("unauthorised action")) { let action = obj.data.replace("unauthorised action ", ""); switch (action) { case "listContractProcess": mainVue.contracts = []; alertNoPermission("listContractProcess无授权,请申请ContractProvider权限", "提示"); break; case "listProjects": mainVue.projects = []; $("#publicprojectAccordion").html(""); $("#privateprojectAccordion").html(""); alertNoPermission("listProjects无授权,请申请ContractProvider权限", "提示"); break; default: alertNoPermission(action + "无权限", "提示"); } } } function alertNoPermission(message, title) { const nopSpan = $("#nopermissionSpan"); if (nopSpan.length > 0) { // console.log(message + " status:" + $("#dialog")[0].getAttribute("class")); nopSpan.append("
" + message); } else { let body = "
"; body += message; body += "
"; $("#dialogBodyDiv").html(body); showDialog("提示", function () { $("#dialogBodyDiv").html(""); }); } } // ====== wsHandler done! function myToast(title, msg) { toastVue.toastTitle = title; toastVue.toastMessage = msg; $("#alertDiv").toast("show"); } function generate() { let key = sm2.generateKeyPairHex(); global.sm2Key = key; localStorage.setItem("PrivKey", JSON.stringify(key)); } function showDialog(title, cb, cancelcb) { $("#dialogTitleH5").html(title); $("#dialogConfimBtn").off("click").on("click", cb); $("#dialogCloseBtn").off("click").on("click", cancelcb); $("#dialog").modal("show"); } function init() { console.log("[nodecenterManagement.js] init : "); const urlParams = getRequestParameters(); initVue(); initGlobal(urlParams); initWSocket(); $('[data-toggle="tooltip"]').tooltip(); const scriptEditor = $("#scriptEditor"); const height = scriptEditor.css("height"); global.scriptEditor = CodeMirror.fromTextArea(scriptEditor[0], { matchBrackets: true, autoCloseBrackets: true, lineNumbers: true, mode: "application/ld+json", lineWrapping: true }); global.scriptEditor.setSize("height", height); } function getRequestParameters() { if (isBaaS) { let params = location.href.replace(/[^#]*(#(\/)?|\?)/, '') let url = location.href.replace(params, '') while (!params) { url = url.replace(/(#(\/)?|\?)$/, '') params = url.replace(/[^#]*(#(\/)?|\?)/, '') url = url.replace(params, '') } if (url.endsWith('#') || url.endsWith('#\/')) { let sKey = Math.random().toString() localStorage.setItem(sKey, params) location.href = url.replace(/#(\/)?/, '?' + sKey) } else { let json = atob(localStorage.getItem(params)) try { return JSON.parse(json); } catch (e) { localStorage.removeItem(params) alert('链接失效!') location.href = location.origin } } } else { let arr = (location.search || "").replace(/^\?/, '').split("&"); let params = {}; for (let sd of arr) { let data = sd.split("="); if (data.length === 2) { params[data[0]] = data[1]; } } return params; } }