kerf-engine/app/src/api/engine.ts
jlightner 9be90a4494 test: Added CORSMiddleware to engine, scaffolded Vite+React+TS app with…
- "engine/main.py"
- "app/vite.config.ts"
- "app/src/types/engine.ts"
- "app/src/api/engine.ts"
- "app/src/api/__tests__/engine.test.ts"
- "app/src/App.tsx"
- "app/src/test-setup.ts"
- "app/tsconfig.app.json"

GSD-Task: S01/T01
2026-03-26 05:05:31 +00:00

69 lines
1.9 KiB
TypeScript

/** Typed API client for the Kerf Engine. */
import type { PresetsResponse, TraceResponse } from '../types/engine';
const BASE = '/engine';
/**
* Fetch all available presets from the engine.
*/
export async function getPresets(signal?: AbortSignal): Promise<PresetsResponse> {
const res = await fetch(`${BASE}/presets`, { signal });
if (!res.ok) {
throw new Error(`GET /engine/presets failed: ${res.status} ${res.statusText}`);
}
return res.json() as Promise<PresetsResponse>;
}
/**
* Trace a raster image through the vectorization pipeline.
* Builds FormData with the file, mode, preset, and JSON-encoded params.
*/
export async function traceImage(
file: File,
preset: string,
params: Record<string, unknown>,
signal?: AbortSignal,
): Promise<TraceResponse> {
const form = new FormData();
form.append('file', file);
form.append('output_format', 'svg');
form.append('preset', preset);
form.append('params', JSON.stringify(params));
const res = await fetch(`${BASE}/trace`, {
method: 'POST',
body: form,
signal,
});
if (!res.ok) {
const detail = await res.text().catch(() => res.statusText);
throw new Error(`POST /engine/trace failed: ${res.status}${detail}`);
}
return res.json() as Promise<TraceResponse>;
}
/**
* Simplify an existing SVG using RDP path simplification.
*/
export async function simplifyVector(
file: File,
epsilon: number,
signal?: AbortSignal,
): Promise<TraceResponse> {
const form = new FormData();
form.append('file', file);
form.append('epsilon', String(epsilon));
form.append('output_format', 'svg');
const res = await fetch(`${BASE}/simplify`, {
method: 'POST',
body: form,
signal,
});
if (!res.ok) {
const detail = await res.text().catch(() => res.statusText);
throw new Error(`POST /engine/simplify failed: ${res.status}${detail}`);
}
return res.json() as Promise<TraceResponse>;
}