Mercurial > code > home > repos > collector
view src/CollectorState.ts @ 13:bfd95926be6e default tip
initial port to starlette. missing some disconnect & cleanup functionality
author | drewp@bigasterisk.com |
---|---|
date | Sat, 26 Nov 2022 14:13:51 -0800 |
parents | c48b7bbc3a64 |
children |
line wrap: on
line source
import { LitElement, html, css } from "lit"; import { customElement, property } from "lit/decorators.js"; export { StreamedGraph } from "@bigasterisk/streamed-graph"; @customElement("collector-state") export class CollectorState extends LitElement { @property() latestState: { graphClients: any } ; constructor() { super(); this.latestState = { graphClients: {} }; this.refresh(); } delayedRefresh() { setTimeout(() => { requestAnimationFrame(() => { this.refresh(); }); }, 5000); } refresh() { fetch("state") .then((response) => { return response.json(); }) .then((newState) => { this.latestState = newState; this.delayedRefresh(); }); } static get styles() { return css` :host { display: inline-block; border: 2px solid gray; padding: 5px; } `; } render() { const sourcesTable = (clients: Array<any>) => { const clientRow = (client: any) => { const d = client; const now = Date.now() / 1000; const dispSec = (sec: number) => Math.abs(sec) > now - 1 ? "--" : Math.abs(sec) > 3600 ? `${Math.round(sec / 3600)} hr` : Math.abs(sec) > 60 ? `${Math.round(sec / 60)} min` : `${Math.round(sec * 10) / 10} sec`; return html` <tr> <td><a href="${d.url.replace("/events", "")}">[browse]</a> <a href="${d.url}">${d.url}</a></td> <td>${d.fullGraphReceived}</td> <td>${d.patchesReceived}</td> <td>${dispSec(d.time.open - now)}</td> <td>${dispSec(d.time.fullGraph - d.time.open)}</td> <td>${dispSec(d.time.latestPatch - now)}</td> </tr> `; }; return html` rendered! <table> <thead> <tr> <th>patch source</th> <th>full graph recv</th> <th>patches recv</th> <th>time open (rel)</th> <th>time fullGraph (after open)</th> <th>time latest patch (rel)</th> </tr> </thead> <tbody> ${clients.map(clientRow)} </tbody> </table> `; }; const handlersTable = (handlers: Array<any>) => { const handlerRow = (d: any) => { return html` <tr> <td>${d.created}</td> <td>${d.ageHours}</td> <td><a href="graph/${d.streamId}">${d.streamId}</a></td> <td>${d.foafAgent}</td> <td>${d.userAgent}</td> </tr> `; }; return html` <table> <thead> <tr> <th>created</th> <th>age hours</th> <th>stream</th> <th>foaf agent</th> <th>user agent</th> </tr> </thead> <tbody> ${handlers.map(handlerRow)} </tbody> </table> `; }; if (!this.latestState) { return "loading..."; } const d = this.latestState.graphClients; return html` <div> <p>Graph: ${d.statements ? d.statements.len : 0} statements</p> <p>Sources: ${sourcesTable(d.clients || [])}</p> <p>Listening clients: ${handlersTable(d.sseHandlers || [])}</p> </div>`; } }