Update metrics selector via State

This commit is contained in:
Joscha 2023-10-22 01:49:37 +02:00
parent 9bc96f79af
commit 3dc54738fa
3 changed files with 47 additions and 11 deletions

View file

@ -1,5 +1,5 @@
import * as metrics from "./graph/metrics.js";
import { Requests } from "./graph/requests.js";
import { State } from "./graph/state.js";
import uPlot from "./uPlot.js";
@ -122,16 +122,10 @@ const COLORS = [
// Initialization
const plot_div = document.getElementById("plot")!;
const metrics_div = document.getElementById("metrics")!;
const metricsDiv = document.getElementById("metrics")!;
let plot: uPlot | null = null;
let requests = new Requests();
let state = new State(requests, metricsDiv);
async function init() {
let response = await requests.get_metrics();
console.log("Metrics:", response);
if (response !== null) {
metrics.update(metrics_div, response.metrics);
}
}
init();
state.update();

View file

@ -57,7 +57,7 @@ class Folder {
}
}
export function update(div: HTMLElement, metrics: string[]) {
export function updateMetricsDiv(div: HTMLElement, metrics: string[]) {
let folder = new Folder();
for (let metric of metrics) {
folder.add(metric);

42
scripts/graph/state.ts Normal file
View file

@ -0,0 +1,42 @@
import { updateMetricsDiv } from "./metrics.js";
import { Requests, MetricsResponse } from "./requests.js";
export class State {
#requests: Requests;
#metricsDiv: HTMLElement;
#updating: boolean = false;
#metrics: MetricsResponse | null = null;
constructor(requests: Requests, metricsDiv: HTMLElement) {
this.#requests = requests;
this.#metricsDiv = metricsDiv;
}
/**
* Look at current state and try to change it so that it represents what the
* user wants.
*
* This function is idempotent.
*/
async update() {
if (this.#updating) {
return;
}
try {
await this.#update_impl();
} finally {
this.#updating = false;
}
}
async #update_impl() {
this.#update_metrics();
}
async #update_metrics() {
this.#metrics = await this.#requests.get_metrics();
if (this.#metrics === null) { return; }
updateMetricsDiv(this.#metricsDiv, this.#metrics.metrics);
}
}