Aller au contenu

Enregistrer et rejouer des scénarios d'événements

Enregistrer et rejouer des scénarios d’événements

Section intitulée « Enregistrer et rejouer des scénarios d’événements »

Un scénario capture une session sous forme rejouable :

{
"version": 1,
"name": "create, edit, rename",
"initialState": { "notes-tsx": { "documents": [], "activeDocId": null } },
"events": [
{ "name": "notes-tsx/document.create", "payload": { "id": "doc-1" }, "source": "notes-tsx", "at": 0 }
],
"expectedFinal": { "notes-tsx": { "documents": ["…"], "activeDocId": "doc-1" } }
}

Seuls les événements primaires (ceux déclenchés par une action UI ou une macro) sont enregistrés : les cascades sont régénérées par les handlers au moment du rejeu. L’état initial et l’état final attendu sont des snapshots des slices du store (hors core et settings par défaut).

Voir Transactions and events pour les événements primaires.

Panneau Événements (inspecteur d’événements) :

  1. Bouton enregistrer (rond rouge) — chaque action UI est capturée.
  2. Bouton arrêter et exporter — télécharge le scénario en JSON (état initial + événements + état final).
  3. Bouton rejouer (flèche) — ouvre un fichier scénario et le rejoue visuellement dans l’application (150 ms entre étapes) ; le résultat s’affiche dans la barre de statut et les divergences dans la console.
import { createHeadlessKernel } from "../src/kernel/headless";
import { replayScenario } from "../src/kernel/replay";
const kernel = await createHeadlessKernel({
plugins: [{ definition: plugin, resources: { "ui.json": uiJson } }],
});
const result = await replayScenario(kernel, scenario);
// result.ok, result.steps (cascades, erreurs), result.divergences

Le noyau headless (createHeadlessKernel) fonctionne sans React ni DOM : services en mémoire, plugins enregistrés depuis leur définition TypeScript, ui.json fourni via une base de ressources en mémoire. Voir tests/notes-scenario.test.ts.

Fenêtre de terminal
bun test # tous les tests

Les handlers génèrent les identifiants avec crypto.randomUUID(). Pour des tests déterministes :

  • le handler accepte un id optionnel dans le payload (le scénario écrit à la main le fournit) — c’est le cas de notes-tsx/document.create ;
  • dans expectedFinal, la chaîne "*" est un joker qui accepte n’importe quelle valeur (utile pour les scénarios enregistrés depuis l’application, dont les ids sont aléatoires).
  1. initialState : les slices des plugins concernés avant le premier événement (souvent leurs valeurs initiales).
  2. events : les événements primaires dans l’ordre, avec name, payload, source.
  3. expectedFinal : les mêmes slices après exécution ; utilisez "*" pour les valeurs non déterministes.

Le rejeu visuel (bouton ▶ de l’inspecteur) réémet chaque événement avec l’origine macro : les transactions, les cascades et les états intermédiaires sont visibles en direct dans le journal des événements.

Documentation sous licence CC BY 4.0 · © les contributeurs de SCFlow ·Retour à supplychainflow.org