class CCPExecutionMonitor extends HTMLElement { #boot = null; #rootdoc = null; #broadcasturl = "ws://nubis1.int.d4science.net:8989/ws/notification"; #executions = []; #socket = null; constructor(){ super() this.#boot = document.querySelector("d4s-boot-2") this.#rootdoc = this.attachShadow({ "mode" : "open"}) this.connectBroadcast() } connectedCallback(){ this.#rootdoc.innerHTML = this.render() } render(){ return `
    ` } addExecution(execution){ this.#executions.push(execution) this.refreshExecution(execution) } refreshExecution(execution){ this.#boot.secureFetch(execution.self).then(reply =>{ if(reply.status === 200) return reply.json(); else throw "Unable to load job links" }).then(data=>{ execution.links = data BSS.apply(this.execution_list_bss, this.#rootdoc) }).catch(err=>{ console.error(err)}) } connectBroadcast(){ this.#socket = new WebSocket(this.#broadcasturl + "/executions"); this.#socket.onmessage = event=>{ const data = JSON.parse(event.data) let exec = this.#executions.filter(e=>e.jobID === data.jobID)[0] if(exec){ exec.events.push(data) if(!exec.self) exec.self = data.links[0].href; this.refreshExecution(exec) } } window.setInterval( ()=>this.#socket.send("ping"), 30000) } download(url, name) { this.#boot.secureFetch(url).then(reply => { if (reply.status !== 200) { throw "Unable to download" } return reply.blob() }).then(blob => { const objectURL = URL.createObjectURL(blob) var tmplnk = document.createElement("a") tmplnk.download = name tmplnk.href = objectURL //tmplnk.target="_blank" document.body.appendChild(tmplnk) tmplnk.click() document.body.removeChild(tmplnk) }).catch(err => console.error(err)) } execution_list_bss = { template : "#EXECUTIOM_LIST_TEMPLATE", target : "ol[name=ccp_execution_list]", in : ()=>{ return {executions : this.#executions} }, recurse:[ { target : "li", in : (e,d)=>d.executions, apply: (e,d)=>{ if(d.events && d.events.length > 0){ e.alt = e.title = (new Date(d.events[d.events.length - 1].updated)).toLocaleString() } }, recurse : [ { target : "h5", apply : (e,d)=>{ e.textContent = d.method } }, { target : "span[name=status]", apply : (e,d)=>{ if(d.events && d.events.length > 0){ const status = d.events[d.events.length - 1].status e.textContent = status if (status === "running") e.classList.add("badge-primary"); else if (status === "successful") e.classList.add("badge-success"); else if (status === "failure") e.classList.add("badge-danger"); else e.classList.add("badge-secondary"); } } }, { target : ".status-message", apply : (e,d)=>{ if(d.events && d.events.length > 0){ e.textContent = d.events[d.events.length - 1].message } } }, { target : "ul", recurse : [ { target : "li", "in" : (e,d)=>{return d.links.map(l=>{ return { href : d.self + "/" + l.path, path : l.path} })}, on_click : ev=>{ const href = ev.currentTarget.bss_input.data.href const name = ev.currentTarget.bss_input.data.path this.download(href, name) }, apply : (e,d)=>{ e.innerHTML = `${d.path}` } } ] } ] } ] } } window.customElements.define('d4s-ccp-executionmonitor', CCPExecutionMonitor);