Écriture de stratégies en TypeScript/JavaScript

Le support de TypeScript/JavaScript pour WebAssembly évolue rapidement. Cette page a été révisée pour la dernière fois en novembre 2025.

Comme indiqué sur le site officiel :

TypeScript étend JavaScript en ajoutant des types.

En comprenant JavaScript, TypeScript vous fait gagner du temps en détectant les erreurs et en fournissant des corrections avant que vous n’exécutiez le code.

SUSE Security Admission Controller utilise Javy (un projet de la Bytecode Alliance) pour construire des binaires WebAssembly à partir de JavaScript et TypeScript.

Javy prend votre code JavaScript et l’exécute dans un contexte WebAssembly.

Il dispose d’un moteur QuickJS intégré compilé en WebAssembly qui peut exécuter JavaScript.

Le projet fournit à la fois une CLI et un ensemble d’API pour l’incorporation et la personnalisation du comportement lors de l’exécution de JavaScript dans WebAssembly.

Le projet Admission Controller utilise actuellement Javy pour ces raisons :

  • Moteur JavaScript mature (QuickJS) compilé en WebAssembly.

  • Support pour l’interface WASI via des fonctions hôtes personnalisées.

  • Des binaires plus petits par rapport à d’autres solutions JavaScript vers WebAssembly.

  • Développement et maintenance actifs par la Bytecode Alliance.

Limitations de Javy

Javy exécute JavaScript dans un environnement sandboxé WebAssembly avec certaines contraintes :

  • Environnement WASI uniquement : Accès limité à stdin/stdout/stderr et aux capacités d’hôte explicitement fournies.

  • Aucune API Node.js : Les modules Node.js standard comme fs, http ou crypto ne sont pas disponibles.

  • Bibliothèque standard limitée : Seules les fonctionnalités JavaScript du noyau et les API explicitement activées sont accessibles.

  • Exécution monothread : Pas de support pour les Web Workers ou le multi-threading.

Malgré ces limitations, Javy offre des capacités suffisantes pour écrire des stratégies de validation Admission Controller efficaces grâce au système de capacités des hôtes.

Écrire sur STDOUT enfreint les stratégies - utilisez STDERR pour les journaux à la place.

Outils

L’écriture de Admission Controller stratégies nécessite :

  • Node.js : Composant d’exécution JavaScript.

  • npm : Pour la gestion des dépendances.

  • TypeScript : Recommandé pour la sécurité des types (optionnel).

Assurez-vous d’utiliser Node.js 18 ou une version supérieure. Les versions antérieures peuvent ne pas être compatibles avec la chaîne d’outils de compilation.

Ces bibliothèques TypeScript/JavaScript sont utiles lors de l’écriture d’une Admission Controller stratégie :

  • Admission Controller SDK JavaScript : Fournit des structures et des fonctions réduisant la quantité de code nécessaire. Il fournit également des helpers de test et un accès à toutes les capacités de l’hôte.

  • Types TypeScript pour Kubernetes : Fournit des définitions TypeScript pour toutes les ressources Kubernetes, permettant un développement de stratégies sécurisé par types.

Le projet Admission Controller fournit un projet de stratégie JavaScript/TypeScript modèle que vous pouvez utiliser pour créer des stratégies Admission Controller.

Obtenir la chaîne d’outils

Le moyen le plus simple d’obtenir la chaîne d’outils est d’utiliser le Admission Controller SDK JavaScript, qui inclut le plug-in de compilation Javy :

npm install kubewarden-policy-sdk

Le binaire du plug-in Javy est automatiquement inclus et vous pouvez le trouver à :

node_modules/kubewarden-policy-sdk/plugin/javy-plugin-kubewarden.wasm

Prérequis du tutoriel

Au cours de ce tutoriel, vous avez besoin de ces outils sur votre machine de développement :

  • Node.js : Version 18 ou supérieure avec npm pour la gestion des dépendances.

  • bats : Utilisé pour écrire les tests et automatiser leur exécution.

  • kwctl ≥ v1.30 : Outil CLI fourni par Admission Controller pour exécuter ses stratégies en dehors de Kubernetes, entre autres actions. C’est couvert dans la section des stratégies de test de la documentation.

  • javy ≥ 6.0.0 : Outil CLI pour compiler le code JavaScript en modules WebAssembly.