import { WasmProvider } from './wasm-provider.js'; let cachedGS: any = null; let loadPromise: Promise | null = null; export interface GhostscriptInterface { convertToPDFA(pdfBuffer: ArrayBuffer, profile: string): Promise; fontToOutline(pdfBuffer: ArrayBuffer): Promise; } export async function loadGhostscript(): Promise { if (cachedGS) { return cachedGS; } if (loadPromise) { return loadPromise; } loadPromise = (async () => { const baseUrl = WasmProvider.getUrl('ghostscript'); if (!baseUrl) { throw new Error( 'Ghostscript is not configured. Please configure it in Advanced Settings.' ); } const normalizedUrl = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`; try { const wrapperUrl = `${normalizedUrl}gs.js`; await loadScript(wrapperUrl); const globalScope = typeof globalThis !== 'undefined' ? globalThis : window; if (typeof (globalScope as any).loadGS === 'function') { cachedGS = await (globalScope as any).loadGS({ baseUrl: normalizedUrl, }); } else if (typeof (globalScope as any).GhostscriptWASM === 'function') { cachedGS = new (globalScope as any).GhostscriptWASM(normalizedUrl); await cachedGS.init?.(); } else { throw new Error( 'Ghostscript wrapper did not expose expected interface. Expected loadGS() or GhostscriptWASM class.' ); } return cachedGS; } catch (error: any) { loadPromise = null; throw new Error( `Failed to load Ghostscript from ${normalizedUrl}: ${error.message}` ); } })(); return loadPromise; } function loadScript(url: string): Promise { return new Promise((resolve, reject) => { if (document.querySelector(`script[src="${url}"]`)) { resolve(); return; } const script = document.createElement('script'); script.src = url; script.type = 'text/javascript'; script.async = true; script.onload = () => resolve(); script.onerror = () => reject(new Error(`Failed to load script: ${url}`)); document.head.appendChild(script); }); } export function isGhostscriptAvailable(): boolean { return WasmProvider.isConfigured('ghostscript'); } export function clearGhostscriptCache(): void { cachedGS = null; loadPromise = null; }