Ir al contenido

Manejo de archivos en Node

bytes → signature check → plain XML: decode UTF-8 directly
└── zip: find model.xml entry → stream-decode → CRC-32 check → decode UTF-8

extractArchiModelXml acepta bytes crudos y devuelve el texto XML del modelo para ambas formas de archivo:

import { readFile } from 'node:fs/promises';
import { extractArchiModelXml } from '@cda/archi-semantic-core/archive';
const bytes = await readFile('Model.archimate'); // binary read — never text-decode first
const xml = extractArchiModelXml(bytes);

La función inspecciona la firma del archivo:

  • PK (zip) → ruta de archivo: localiza model.xml en el directorio central, lo infla, verifica el CRC-32 y decodifica UTF-8.
  • cualquier otra cosa → ruta de XML plano: decodifica los bytes directamente como UTF-8.

Solo se admiten entradas Stored (sin comprimir) y Deflate — son los únicos dos métodos que Archi escribe jamás. Cualquier otro método lanza una excepción. El archivo .archimate completo nunca necesita ser inflado: solo se lee la entrada model.xml, por lo que el costo de memoria se mantiene proporcional al tamaño decodificado del modelo (consulta Trabajo con modelos grandes).

CondiciónComportamiento
La entrada parece un zip pero no tiene una entrada model.xmllanza una excepción
La entrada usa un método distinto de Stored/Deflatelanza una excepción
Desajuste de CRC-32 en la entrada decodificadalanza una excepción
Estructura zip truncada o corruptalanza una excepción

extractArchiModelXml devuelve solo XML — los bytes de las imágenes permanecen en el archivo. ArchiProfile.imagePath (p. ej. "images/abc123.png") y las rutas de imagen de DiagramModelImageProvider son punteros: para extraer un binario específico, abre el archivo tú mismo y lee la entrada images/ correspondiente.

La ruta de archivo usa el node:zlib integrado de Node — esta es la razón por la que la función vive en el subpath /archive y no forma parte del entrypoint raíz seguro para navegadores. Si necesitas manejo de archivos del lado del navegador, eso es un asunto de otro paquete, no de este.