DRAFT — Preliminary version, do not share. · Version préliminaire, ne pas partager.

Moteur d'exécution et SDK

Cette page décrit le moteur d'exécution des fonctions cloud : les langages et chaînes d'outils pris en charge, ce que votre fonction lit et écrit, la façon dont elle est déclenchée, les limites, le SDK et l'historique d'exécution. Pour un tutoriel pas à pas, consultez le guide des fonctions cloud.

Modèle du moteur d'exécution

Une fonction cloud est un module WebAssembly qui cible WASI (WebAssembly System Interface). Chaque invocation exécute votre module une fois, dans un bac à sable :

Aspect Comportement
Entrée Un document JSON sur stdin
Sortie Tout ce que votre fonction écrit sur stdout
Journaux Tout ce que votre fonction écrit sur stderr, conservé dans l'historique d'exécution
Configuration Les variables de votre fonction, exposées sous forme de variables d'environnement
Système de fichiers Aucun
Réseau Aucun. Utilisez les fonctions hôtes du SDK pour joindre Fundamentum
Concurrence Une seule exécution à la fois par fonction, sauf si vous configurez un pool de workers. Les invocations supplémentaires attendent dans une file

Langages et chaînes d'outils

Tout langage qui se compile en module WASI fonctionne. Ces chaînes d'outils sont connues pour fonctionner :

Langage Chaîne d'outils Commande de compilation
Go Compilateur Go standard GOOS=wasip1 GOARCH=wasm go build -o function.wasm .
Go TinyGo Consultez la documentation de TinyGo pour la cible wasip1
JavaScript Javy javy build function.js -o function.wasm
Python py2wasm py2wasm function.py -o function.wasm
Rust Cargo avec une cible WASI cargo build --release --target wasm32-wasip1

Sous macOS, py2wasm ne fonctionne ni avec le Python du système ni avec le Python de Homebrew. Installez la version officielle de Python, par exemple avec pyenv.

Le champ language d'une fonction est une métadonnée descriptive. Le moteur d'exécution exécute le module WebAssembly quel que soit le langage source.

Entrée

Votre fonction reçoit ce document JSON sur stdin :

{
  "input": "<base64-encoded bytes>",
  "context": {
    "function_id": "<function-id>",
    "project_id": 1
  },
  "metadata": {
    "<key>": "<base64-encoded bytes>"
  }
}
Champ Description
input La charge utile : le corps de la requête HTTP, ou le message reçu sur le topic d'entrée. Octets encodés en base64 dans le JSON
context.function_id L'ID de la fonction exécutée
context.project_id Le projet dans lequel la fonction s'exécute
metadata Paires clé-valeur, valeurs encodées en base64. Lors d'une invocation HTTP, chaque en-tête de requête X-Function-<key> devient une entrée <key>

Sortie

Écrivez le résultat sur stdout. Terminez normalement en cas de succès. Si votre module se termine avec une erreur, l'exécution est enregistrée comme échouée, avec votre sortie stderr et l'erreur.

Ce qu'il advient de la sortie dépend du déclencheur :

Déclencheurs

Déclencheur Comment Entrée
HTTP POST /v2/projects/{project_id}/functions/{function_id}:invoke sur la Public API, ou fun functions invoke Le corps de la requête, envoyé en application/octet-stream
Topic Un connecteur dans fundamentum_iot_connectors : {"input_topic_id": <topic-id>, "output_topic_id": <topic-id>}. output_topic_id est facultatif Chaque message reçu sur le topic d'entrée

Chaque fonction peut être invoquée via HTTP. Les connecteurs ne peuvent pas former de cycle : l'API rejette une définition dont les connecteurs bouclent sur eux-mêmes. Consultez Topics et Connecteurs.

L'invocation HTTP renvoie :

{
  "status": "success",
  "data": {
    "started_at": "2026-01-01T12:00:00Z",
    "execution_time": 0.42,
    "output": {
      "format": "json",
      "value": { "processed": 10 }
    }
  }
}

output.format vaut json lorsque la sortie est du JSON valide, unicode lorsqu'il s'agit de texte UTF-8 valide, et base64 dans les autres cas.

Statut Signification
200 La fonction s'est exécutée
404 Aucune fonction de ce type dans ce projet
408 L'exécution a atteint son délai d'expiration et a été arrêtée
424 La fonction n'a pas encore de fichier WebAssembly

Définition d'une fonction

Créez et mettez à jour des fonctions avec les opérations functions de la v2 ou avec fun functions new et fun functions edit.

Champ Type Description
description chaîne, obligatoire Description lisible par un humain
language chaîne, obligatoire Langage source, à titre informatif uniquement
execution_timeout entier, nanosecondes Durée maximale d'une exécution
keep_alive_timeout entier, nanosecondes Durée pendant laquelle la fonction compilée reste chargée après une exécution. 0 la décharge immédiatement
fundamentum_iot_connectors tableau Déclencheurs de topic, voir ci-dessus
variables objet Paires KEY: value exposées sous forme de variables d'environnement
scaling.pool_size entier, supérieur à 1 Nombre de workers qui s'exécutent en parallèle

Téléversez le binaire WebAssembly séparément, en multipart/form-data avec le fichier dans le champ function, sur PUT /v2/projects/{project_id}/functions/{function_id}/file, ou avec fun functions upload <name> <file.wasm>. has_file_set indique si un binaire a été téléversé.

Limites

Limite Valeur
Délai d'expiration d'exécution par défaut 5 secondes
Délai d'expiration d'exécution maximal 60 secondes
Rétention de l'historique d'exécution 7 jours

La première exécution après un téléversement, ou après l'expiration du délai de maintien, inclut la compilation du module, ce qui prend sensiblement plus de temps que les exécutions suivantes. Définissez keep_alive_timeout pour garder chargée une fonction fréquemment utilisée.

SDK

Ces fonctions hôtes permettent à votre module d'interagir avec Fundamentum. Elles sont importées depuis l'espace de noms fundamentum :

Fonction hôte Objectif
ProduceMessage(topic, message) Publie un message sur un topic de votre projet. topic est l'ID du topic sous forme de chaîne (par exemple "42"), tel que renvoyé par fun api v1 pub-sub list-pub-sub-topics. Asynchrone : aucun résultat n'est renvoyé à votre fonction
ProduceMessageWithHeaders(topic, message, headers) Identique à ProduceMessage, avec headers sous forme d'objet JSON de noms et de valeurs d'en-têtes
PublicAPIGet(route, token) Envoie une requête GET à la Public API sur route, avec token comme jeton porteur, et renvoie la réponse

Chaque argument est transmis sous forme d'entier de 64 bits : les 32 bits de poids fort sont un pointeur vers la mémoire du module et les 32 bits de poids faible une longueur en octets.

SDK Go

Le SDK Go encapsule l'entrée et les fonctions hôtes :

package main

import (
	"fmt"
	"os"

	sdk "<go-sdk-module-path>"
)

// ID of the project topic that receives the result.
const outputTopicID = "42"

func main() {
	input, err := sdk.ReadInput(os.Stdin)
	if err != nil {
		fmt.Fprintln(os.Stderr, "failed reading input:", err)
		os.Exit(1)
	}

	fmt.Fprintln(os.Stderr, "project", input.Context.ProjectID)

	sdk.ProduceMessage(outputTopicID, string(input.Input))
	fmt.Print(`{"ok":true}`)
}
Fonction Description
sdk.ReadInput(r io.Reader) (FunctionInput, error) Analyse le document d'entrée. Les valeurs de Input et Metadata sont décodées en octets
sdk.ProduceMessage(topic, msg string) Appelle ProduceMessage
sdk.ProduceMessageWithHeaders(topic, msg string, headers map[string]string) Appelle ProduceMessageWithHeaders
sdk.Get(token string) func(route string) (map[string]any, error) Appelle PublicAPIGet avec un jeton et renvoie le JSON décodé

Dans les autres langages, lisez stdin et analysez vous-même le JSON. Les fonctions hôtes sont disponibles sous forme d'imports WASI depuis l'espace de noms fundamentum.

Historique d'exécution

Chaque exécution est enregistrée avec :

Champ Description
source Ce qui l'a déclenchée : http ou pubsub
started_at Heure de début
execution_time Durée en secondes
log Ce que la fonction a écrit sur stderr
error Le message d'erreur, vide en cas de succès

Listez les exécutions avec fun functions executions list --name <name> ou GET /v2/projects/{project_id}/functions/{function_id}/executions. Les exécutions sont conservées pendant 7 jours.

Étapes suivantes