view service/collector/index.html @ 1543:ab985b87043e

update deps Ignore-this: f36986e77876e431e4a52ffe833c1d18 darcs-hash:b12fa35c14a62bc3d4d9f817c28f25ad69d3a588
author drewp <drewp@bigasterisk.com>
date Thu, 13 Feb 2020 10:17:36 -0800
parents 4322e8b1481f
children 44be3cd4cf67
line wrap: on
line source

<!doctype html>
<html>
  <head>
    <title>collector</title>
    <meta charset="utf-8">
    <script src="/lib/webcomponents/2.4.0/webcomponents-bundle.js"></script>
    <script type="module">
     import { LitElement, TemplateResult, html, css } from '/lib/lit-element/2.2.0/lit-element-custom.js';

     class CollectorState extends LitElement {
       static get properties() {
         return {
           latestState: { type: Object }
         };
       }
       firstUpdated() {
         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) => {
           const clientRow = (client) => {
             const d = client.reconnectedPatchSource;
             const now = Date.now() / 1000;
             const dispSec = (sec) => (
               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="/rdf/browse/?graph=${d.url}">[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`
             <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) => {
           const handlerRow = (d) => {
             return html`
               <tr>
                 <td>${d.created}</td>
                 <td>${d.ageHours}</td>
                 <td><a href="/rdf/browse/?graph=/sse_collector/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>`;
       }
     }
     customElements.define('collector-state', CollectorState);

    </script>
  </head>
  <body class="rdfBrowsePage">
    <h1>collector</h1>

    <p><a href="/rdf/browse/?graph=/sse_collector/graph/home">See output for graph/home</a></p>

    <collector-state></collector-state>

  </body>
</html>