Appearance
Cycle de vie d'une appli
Une appli est persistante : elle démarre quand le streamer la lance, vit tant qu'elle n'est pas terminée, puis se ferme via finish() (normal) ou abort() (interruption).
Démarrage
index.htmlcharge le SDK (https://kappapps.app/overlay/app/appli-2.0.js).- Le SDK initialise l'instance, puis dispatch l'event
AppliLoadedsurdocument. - Ton
index.htmlécoute cet event et injectestyle.css+script.js. À partir de là,kapp/ksont disponibles. script.jsexécute ta logique (forme habituelle :(async function () { ... })();).
html
<script src="https://kappapps.app/overlay/app/appli-2.0.js"></script>
<script>
document.addEventListener('AppliLoaded', async () => {
const style = document.createElement('link');
style.rel = 'stylesheet'; style.href = 'style.css';
const script = document.createElement('script');
script.src = 'script.js';
if (!kapp.version.is_submitted) { // cache-bust en dev
style.href += '?v=' + Date.now();
script.src += '?v=' + Date.now();
}
document.head.appendChild(style);
document.head.appendChild(script);
});
</script>Affichage
kapp.display(): void— affiche la fenêtre de l'appli.kapp.undisplay(): void— la masque (sans terminer l'exécution ; appelé automatiquement parfinish()).- Une appli
backtask(sans UI) n'a pas besoin dedisplay().
Fin
await kapp.finish(result?): Promise<void>— fin normale. Envoie d'abord les rewards (kapp.rewards.sendRewards()), puisundisplay(), puis exécute les hooks de sortie, puis clôt. Leresultoptionnel est renvoyé à l'appli qui a lancé celle-ci viakapp.apps.run(voir app-to-app.md) ; il est ignoré pour une appli lancée normalement.await kapp.abort(reason = null): Promise<void>— interruption (erreur, donnée manquante). N'envoie pas les rewards.
Hooks de sortie
kapp.onBeforeExit(status = '*', handler): void—status∈'finish' | 'abort' | '*'.handler: () => void | Promise<void>(sync et async sont attendus).kapp.onBeforeFinish(handler): void— raccourci pouronBeforeExit('finish', handler).kapp.onBeforeAbort(handler): void— raccourci pouronBeforeExit('abort', handler).
js
(async function () {
kapp.onBeforeFinish(async () => {
await kapp.dataStorage.set({ lastRun: Date.now() }); // persiste avant de fermer
});
kapp.display();
// ... logique de l'appli ...
await kapp.finish(); // explicite : sans ça, l'appli reste ouverte
})();Pièges
finish()est explicite : l'appli ne se ferme pas quandscript.jsfinit de s'exécuter.- Pas de
window.executeAppFunction(c'est le contrat widget). - Les rewards ne partent qu'au
finish()— unabort()les abandonne.