npm.io
1.4.0 • Published 2 weeks ago

@x12i/api-live-view

Licence
exellix-license
Version
1.4.0
Deps
0
Size
191 kB
Vulns
0
Weekly
0

@x12i/api-live-view

Embeddable status + live request view for any HTTP service.

  • In-memory traffic rings only (no database)
  • Tabs: Status (hourly push/pull data volume + process health graphs) · API docs · Counters (who / frequency / APIs) · Incoming · Worker (outbound)
  • Adapters: Fastify and Node http

Install

npm install @x12i/api-live-view

Peer (Fastify adapter only): fastify@^5.

Fastify

import Fastify from "fastify";
import { attachFastifyLiveView } from "@x12i/api-live-view/fastify";

const app = Fastify();
const live = await attachFastifyLiveView(app, {
  service: {
    id: "my-api",
    title: "My API",
    port: 8080,
    env: "PORT",
    origin: "http://127.0.0.1:8080/",
    docsUrl: "http://127.0.0.1:8080/openapi.json",
    description: "Example service",
  },
});

// Outbound / worker calls
const fetchLive = live.createInstrumentedFetch({ caller: "worker" });
await fetchLive("https://example.test/x");

await app.listen({ port: 8080, host: "127.0.0.1" });
// Open http://127.0.0.1:8080/_live

Prefer zone defaults from @x12i/ports-manager when binding in an x12i/exellix repo.

Node http

import http from "node:http";
import { createNodeHttpLiveView } from "@x12i/api-live-view/node-http";

const port = 8080;
const live = createNodeHttpLiveView({
  service: { id: "fixture", title: "Fixture", port },
});

http
  .createServer(async (req, res) => {
    if (await live.tryHandle(req, res)) return;
    const url = new URL(req.url ?? "/", `http://127.0.0.1:${port}`);
    live.withInboundTiming(req, res, url.pathname, req.method ?? "GET", () => {
      res.writeHead(200, { "content-type": "application/json" });
      res.end(JSON.stringify({ ok: true }));
    });
  })
  .listen(port);

Endpoints (default basePath: /_live)

Path Purpose
GET /_live HTML live view
GET /_live/api/info Service metadata
GET /_live/api/status Liveness snapshot + ring sizes + current volume + process CPU/memory
GET /_live/api/volume-series Hourly pushed/pulled byte totals (UTC, in-memory)
GET /_live/api/health-series Process health samples (CPU %, RSS, heap, host RAM, event-loop)
GET /_live/api/traffic?lane=inbound|worker Recent entries
GET /_status/traffic Legacy alias (optional)

Volume semantics: pushed = request body bytes into the service; pulled = response body bytes out. Prefer Content-Length when present, else estimate from the body. Health probes and /_live/* are excluded from the inbound ring and volume totals.

Memorix wiring

  • memorix-service → http://127.0.0.1:5100/_live
  • opx-source → http://127.0.0.1:5102/_live
  • Stack hub aggregates peers on 5103

License

exellix-license

Keywords