Files
FreeCADWasmDev/web/src/export-service.ts
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

24 lines
1.6 KiB
TypeScript

import { downloadBytes, type AppServiceResult } from "./app-services.js";
import { ProjectSessionStore } from "./project-session.js";
const EXTENSIONS = new Set([".fcstd", ".step", ".stp", ".brep", ".brp", ".iges", ".igs", ".stl", ".obj", ".ply", ".svg", ".dxf", ".csv"]);
export interface NativeByteResult { module: string; format: string; fileName: string; bytes: ArrayBuffer; }
function extension(fileName: string): string { const index = fileName.lastIndexOf("."); return index >= 0 ? fileName.slice(index).toLowerCase() : ""; }
export class ExportService {
constructor(private readonly project?: ProjectSessionStore) {}
download(native: Partial<NativeByteResult>): AppServiceResult<{ fileName: string; bytes: number }> {
const fileName = native.fileName ?? "FreeCAD-export";
const bytes = native.bytes;
const ext = extension(fileName);
if (!bytes || !(bytes instanceof ArrayBuffer)) return { schema: "freecad-web-app-service-result/v1", service: "file.download", status: "error", error: { code: "native_bytes_unavailable", message: "Native Worker response did not include export bytes" } };
if (!EXTENSIONS.has(ext)) return { schema: "freecad-web-app-service-result/v1", service: "file.download", status: "error", error: { code: "unsupported_extension", message: `Unsupported CAD export extension ${ext || "(none)"}` } };
const result = downloadBytes(fileName, bytes, native.format || "application/octet-stream");
if (result.status === "ok") this.project?.touchFile({ path: fileName, module: native.module ?? "", format: native.format ?? ext, updatedAt: new Date().toISOString() });
return result;
}
}