xPulse
🇩🇪 DE

API

Trace ID Workflow

  1. @xpulse/http erzeugt pro Request eine traceId.
  2. traceId wird an req.traceId angehaengt und in http:* Events emittiert.
  3. @xpulse/controller gibt sie als _traceId an Templates weiter.
  4. @xpulse/template traegt traceId in Render-Events.
  5. @xpulse/debug sammelt alles pro Trace und speichert unter var/cache/debug/_<traceId>/.

Web Profiler Konfiguration

debug kann ein Boolean oder ein Objekt sein. Wenn debug true ist, ist der Profiler aktiv. Zusätzlich kann der Web Profiler konfiguriert werden und Routen können ausgeschlossen werden:

{
"debug": {
"enabled": true,
"web-profiler": {
"enabled": true,
"excluded-routes": [
"*._debug.*",
"*.get._debug.web-profiler.*"
]
}
}
}

excluded-routes unterstützt * Wildcards und matched gegen Request-Path, Route-Name und einen normalisierten Key wie get._debug.web-profiler.traceId.dashboard.

Package-Defaults sind in @xpulse/debug/xpulse.json definiert und koennen durch die App-xpulse.json ueberschrieben werden.

Template-Methode

Wenn debug aktiv ist, wird die Template-Methode debug(value) registriert (via @xpulse/template). Sie rendert einen sicheren HTML-Dump:

{{ debug(user) }}

debug:events:list

Listet alle registrierten Events und Listener.

debug:config:show

Zeigt die geladene Konfiguration aus @xpulse/config.

debug:routes:list

Listet alle registrierten Routen (wenn @xpulse/router installiert ist).

debug:packages:list

Listet alle installierten @xpulse/* Packages mit Version.

debug:app:bootstrap

Bootstrapped die App (oder simuliert den Bootstrap) und registriert Routes.

DataCollector API

Jedes @xpulse/* Package kann eigene Daten im Web Profiler anzeigen, indem es einen DataCollector implementiert und unter src/datacollectors/ ablegt. @xpulse/debug discovert diese Dateien automatisch — keine Konfiguration nötig.

Einrichten

// src/datacollectors/mein-collector.js
import { DataCollector } from '@xpulse/debug/collector';
export default class MeinCollector extends DataCollector {
configure() {
this.setName('mein-package')
.setIcon('🔧')
.setPackage('@xpulse/mein-package');
}
async collect() {
this.on('mein:event', (payload) => {
this.setBadge('aktiv');
this.addArea({
title: 'Ergebnis',
rows: [{ label: 'Wert', value: payload.value }]
});
});
}
}

@xpulse/debug muss in optionalDependencies eingetragen sein:

"optionalDependencies": {
"@xpulse/debug": "^1.0.11"
}

configure()

Wird vor collect() aufgerufen. Setzt Metadaten des Panels.

Methode Beschreibung
this.setName(name) Panel-ID und Dateiname (name.json)
this.setIcon(icon) Emoji oder Icon-String für die Toolbar
this.setPackage(pkg) Package-Name für die Panel-Anzeige

collect()

Registriert Event-Listener via this.on(). Die Methode wird einmal beim Startup aufgerufen.

this.on('mein:event', (payload, traceId) => {
// traceId ist die aktive Request-ID
// payload ist das Event-Payload
});

Listener werden nur ausgeführt wenn eine aktive traceId vorhanden ist (d.h. im Kontext eines HTTP-Requests). Events außerhalb eines Requests werden ignoriert.

Daten-Methoden (innerhalb von Listenern)

Methode Beschreibung
this.setBadge(text) Badge-Text in der Debug-Toolbar
this.addArea(area) Sektion im Panel hinzufügen
this.addSubPanel(panel) Unter-Panel hinzufügen
this.addSpan(span) Waterfall-Span zur zentralen Zeitleiste hinzufügen
this.addTraceEvent(evt) Event-Eintrag zur Zeitleiste hinzufügen

Area-Format

this.addArea({
title: 'Abschnitt-Titel',
rows: [
{ label: 'Schlüssel', value: 'Wert' },
{ label: 'Anzahl', value: 42 },
]
});

SubPanel-Format

this.addSubPanel({
title: 'Detail-Panel',
rows: [...]
});

Panel-Output

Nach jedem http:response Event schreibt der Collector automatisch:

var/cache/debug/_<traceId>/packages/<name>.json

Diese Datei wird vom Web Profiler eingelesen und als Panel-Tab dargestellt.


appInit(options)

import debug from '@xpulse/debug';
await debug.appInit({ http: true, cli: false, debug: true });

Simuliert den App-Bootstrap basierend auf vorhandenen Packages. Wenn @xpulse/app installiert ist, wird app.init(...) genutzt.

de/api.md 2026-04-10