Toute la persistance workspace passe par UcBlocklyWorkspaceManager (src/core/ucblockly_workspace_manager.ts), avec l’aide de sanitizeSerializedWorkspaceState (src/core/workspace_state.ts). Le shell démo (demo/blockly_application_shell.ts) et le re-export blockly_application_type.ts délèguent à ce manager.
public workspaceSaveBlocks = (storageKeyWorkspaceBlocks: string): void => {
const data = Blockly.serialization.workspaces.save(this.workspace);
this.sanitizeSerializedWorkspaceState(data);
window.sessionStorage?.setItem(storageKeyWorkspaceBlocks, JSON.stringify(data));
};
public workspaceLoadBlocks = (storageKeyWorkspaceBlocks: string): void => {
const data = window.sessionStorage?.getItem(storageKeyWorkspaceBlocks);
if (!data) return;
try {
const parsed = JSON.parse(data);
if (typeof parsed !== 'object' || parsed === null) {
console.warn('Invalid workspace data format, skipping load');
return;
}
this.sanitizeSerializedWorkspaceState(parsed);
// clear + load + normalizeVariableTypes + refreshBoardPinDropdowns
} catch (error) {
console.error('Failed to load workspace blocks:', error);
window.sessionStorage?.removeItem(storageKeyWorkspaceBlocks);
}
};
alert), mode fusion (mergeBlocksFromState) ou remplacement complet.sanitizeSerializedWorkspaceState normalise l’état avant chargement.Blockly.serialization.workspaces.save() / load()scheduleSave()) sur les changements du workspaceonbeforeunloadtry/catch, validation objet, suppression des données corrompuesnormalizeVariableTypes(), refreshBoardPinDropdowns()serialization.ts : fichier supprimé ; plus de code parallèle obsolèteSelon la documentation officielle Blockly :
| Critère | Statut |
|---|---|
| Format JSON (XML legacy évité) | ✅ |
API Blockly.serialization.workspaces | ✅ |
| État complet (blocs, variables, plugins) | ✅ |
| Timing (changements + déchargement page) | ✅ |
| Gestion d’erreurs au chargement | ✅ (session + fichier) |
Pour faciliter les migrations futures, on pourrait encapsuler :
{ version: 1, data: Blockly.serialization.workspaces.save(workspace) }
Non implémenté aujourd’hui : le JSON reste le format Blockly natif, compatible avec les outils tiers (dont convert-rduino).
Une garde isValidWorkspaceData(data) (présence de blocks ou variables) pourrait compléter la validation actuelle typeof object.
Les projets XML Blockly@rduino ne passent pas par cette sérialisation : utiliser npm run convert-rduino → voir CONVERT_RDUINO.md.
L’implémentation actuelle est alignée sur les recommandations Blockly et inclut déjà la plupart des améliorations suggérées dans les versions antérieures de ce document (erreurs, validation basique, suppression de serialization.ts).
—