Spaces:
Running
Running
| import { io } from 'socket.io-client'; | |
| const API_BASE_URL = '/api'; | |
| const socket = io(); | |
| // Helper function to check for HTML response | |
| const handleResponse = async (response) => { | |
| const contentType = response.headers.get('content-type'); | |
| // Check if response is HTML instead of JSON | |
| if (contentType && contentType.includes('text/html')) { | |
| const text = await response.text(); | |
| const firstChars = text.substring(0, 30); // Get first 30 chars for error message | |
| throw new Error(`Received HTML instead of JSON: ${firstChars}...`); | |
| } | |
| if (!response.ok) { | |
| try { | |
| const error = await response.json(); | |
| throw new Error(error.message || `API error: ${response.status}`); | |
| } catch (e) { | |
| // If we can't parse the JSON, throw the original response text | |
| const text = await response.text(); | |
| throw new Error(`API error (${response.status}): ${text.substring(0, 100)}...`); | |
| } | |
| } | |
| return response.json(); | |
| }; | |
| export const fetchPlugins = async () => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/plugins`); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error('Error fetching plugins:', error); | |
| throw error; | |
| } | |
| }; | |
| export const fetchPlugin = async (pluginKey) => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/plugin/${pluginKey}`); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error(`Error fetching plugin ${pluginKey}:`, error); | |
| throw error; | |
| } | |
| }; | |
| export const runPlugin = async (pluginKey, params, onProgress) => { | |
| return new Promise((resolve, reject) => { | |
| // Set up socket event listeners | |
| socket.on('plugin_progress', (data) => { | |
| if (data.plugin_key === pluginKey && onProgress) { | |
| onProgress(data.progress, data.message); | |
| } | |
| }); | |
| socket.on('plugin_result', (data) => { | |
| if (data.plugin_key === pluginKey) { | |
| resolve(data.result); | |
| } | |
| }); | |
| socket.on('plugin_error', (data) => { | |
| if (data.plugin_key === pluginKey) { | |
| reject(new Error(data.error)); | |
| } | |
| }); | |
| // Emit the run_plugin event | |
| socket.emit('run_plugin', { | |
| plugin_key: pluginKey, | |
| params: params | |
| }); | |
| }); | |
| }; | |
| export const fetchGlossary = async () => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/glossary`); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error('Error fetching glossary:', error); | |
| throw error; | |
| } | |
| }; | |
| export const fetchCategory = async (category) => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/category/${category}`); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error(`Error fetching category ${category}:`, error); | |
| throw error; | |
| } | |
| }; | |
| export const fetchEducationalContent = async (pluginKey) => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/educational/${pluginKey}`); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error(`Error fetching educational content for ${pluginKey}:`, error); | |
| throw error; | |
| } | |
| }; | |
| export const validateParameters = async (pluginKey, params) => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/validate/${pluginKey}`, { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| body: JSON.stringify(params), | |
| }); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error(`Error validating parameters for ${pluginKey}:`, error); | |
| throw error; | |
| } | |
| }; | |
| // Circuit Designer API Services | |
| export const getAvailableGates = async () => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/circuit/gates`); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error('Error fetching available gates:', error); | |
| throw error; | |
| } | |
| }; | |
| export const runCircuitSimulation = async (circuit, shots) => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/circuit/simulate`, { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| body: JSON.stringify({ circuit, shots }), | |
| }); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error('Error running circuit simulation:', error); | |
| throw error; | |
| } | |
| }; | |
| export const saveCircuit = async (circuitData) => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/circuit/save`, { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| body: JSON.stringify(circuitData), | |
| }); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error('Error saving circuit:', error); | |
| throw error; | |
| } | |
| }; | |
| export const loadCircuit = async (circuitId) => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/circuit/load/${circuitId}`); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error(`Error loading circuit ${circuitId}:`, error); | |
| throw error; | |
| } | |
| }; | |
| export const getSavedCircuits = async () => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/circuit/saved`); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error('Error fetching saved circuits:', error); | |
| throw error; | |
| } | |
| }; | |
| export const exportCircuitCode = async (circuit, format = 'cirq') => { | |
| try { | |
| const response = await fetch(`${API_BASE_URL}/circuit/export`, { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| body: JSON.stringify({ circuit, format }), | |
| }); | |
| return await handleResponse(response); | |
| } catch (error) { | |
| console.error('Error exporting circuit code:', error); | |
| throw error; | |
| } | |
| }; |