hook up web to vm::rpc

This commit is contained in:
Theis Pieter Hollebeek 2024-12-12 11:56:22 +01:00
parent d67b55e570
commit c69dd1efb2
3 changed files with 39 additions and 47 deletions

View File

@ -5,28 +5,16 @@ export type FlameGraphNode = {
children: FlameGraphNode[];
};
export function flameGraphData(): FlameGraphNode {
return JSON.parse(
`{"fn":0,"acc":257,"parent":0,"children":[{"fn":18,"acc":251,"parent":0,"children":[{"fn":12,"acc":30,"parent":1,"children":[]}]}]}`,
);
export async function flameGraphData(): Promise<FlameGraphNode> {
return await fetch("/api/flame-graph")
.then((v) => v.json())
.then((v) => v.flameGraph);
}
export function codeData() {
return `\
fn add(a, b) {
+ a b
}
let result = 0;
let i = 0;
loop {
if >= i 10 {
break;
}
result = add(result, 5);
i = + i 1;
}
`;
export async function codeData(): Promise<string> {
return await fetch("/api/source")
.then((v) => v.json())
.then((v) => v.text);
}
export type CodeCovEntry = {
@ -36,8 +24,8 @@ export type CodeCovEntry = {
covers: number;
};
export function codeCoverageData(): CodeCovEntry[] {
return JSON.parse(
`[{"index":0,"line":1,"col":1,"covers":2},{"index":28,"line":5,"col":1,"covers":1},{"index":44,"line":6,"col":1,"covers":1},{"index":55,"line":7,"col":1,"covers":1},{"index":66,"line":8,"col":5,"covers":11},{"index":104,"line":11,"col":5,"covers":10},{"index":19,"line":2,"col":5,"covers":10},{"index":133,"line":12,"col":5,"covers":10},{"index":87,"line":9,"col":9,"covers":1}]`,
);
export async function codeCoverageData(): Promise<CodeCovEntry[]> {
return await fetch("/api/code-coverage")
.then((v) => v.json())
.then((v) => v.codeCoveragea);
}

View File

@ -1,22 +1,16 @@
import {
CodeCovEntry,
codeCoverageData,
codeData,
flameGraphData,
FlameGraphNode,
} from "./data.ts";
import * as data from "./data.ts";
function loadCodeCoverage(
text: string,
data: CodeCovEntry[],
data: data.CodeCovEntry[],
container: HTMLPreElement,
tooltip: HTMLElement,
) {
const entries = data.toSorted((
a: CodeCovEntry,
b: CodeCovEntry,
a: data.CodeCovEntry,
b: data.CodeCovEntry,
) => b.index - a.index);
const charEntries: { [key: string]: CodeCovEntry } = {};
const charEntries: { [key: string]: data.CodeCovEntry } = {};
const elements: HTMLElement[] = [];
let line = 1;
let col = 1;
@ -97,7 +91,7 @@ function loadCodeCoverage(
type FlameGraphFnNames = { [key: number]: string };
function loadFlameGraph(
flameGraphData: FlameGraphNode,
flameGraphData: data.FlameGraphNode,
fnNames: FlameGraphFnNames,
flameGraphDiv: HTMLDivElement,
) {
@ -127,10 +121,10 @@ function loadFlameGraph(
const nodes: Node[] = [];
function calculateNodeRects(
node: FlameGraphNode,
node: data.FlameGraphNode,
depth: number,
totalAcc: FlameGraphNode["acc"],
offsetAcc: FlameGraphNode["acc"],
totalAcc: data.FlameGraphNode["acc"],
offsetAcc: data.FlameGraphNode["acc"],
) {
const x = (offsetAcc / totalAcc) * canvas.width;
const y = canvas.height - 30 * depth - 30;
@ -194,7 +188,7 @@ function loadFlameGraph(
});
}
function main() {
async function main() {
type RenderFns = {
"source-code": () => void;
"code-coverage": () => void;
@ -224,14 +218,18 @@ function main() {
return lineElement;
}
const codeData = await data.codeData();
const codeCoverageData = await data.codeCoverageData();
const flameGraphData = await data.flameGraphData();
const view = document.querySelector("#view")!;
const renderFunctions: RenderFns = {
"source-code": () => {
const container = document.createElement("div");
container.classList.add("code-container");
const lines = createLineElement(codeData());
const lines = createLineElement(codeData);
const code = document.createElement("pre");
code.innerText = codeData();
code.innerText = codeData;
container.append(lines, code);
view.replaceChildren(container);
},
@ -242,8 +240,13 @@ function main() {
tooltip.id = "covers-tooltip";
tooltip.hidden = true;
const code = document.createElement("pre");
loadCodeCoverage(codeData(), codeCoverageData(), code, tooltip);
const lines = createLineElement(codeData());
loadCodeCoverage(
codeData,
codeCoverageData,
code,
tooltip,
);
const lines = createLineElement(codeData);
container.append(lines, code);
const view = document.querySelector("#view")!;
view.replaceChildren(container, tooltip);
@ -252,7 +255,7 @@ function main() {
const container = document.createElement("div");
const view = document.querySelector("#view")!;
view.replaceChildren(container);
loadFlameGraph(flameGraphData(), {
loadFlameGraph(flameGraphData, {
0: "<entry>",
12: "add",
18: "main",

View File

@ -27,8 +27,9 @@ export class RuntimeConnection {
while (true) {
const buf = new Uint8Array(256);
const readRes = await this.connection.read(buf);
result += new TextDecoder().decode(buf);
if (readRes == null) {
if (readRes != null) {
result += new TextDecoder().decode(buf.slice(0, readRes));
} else {
break;
}
}