WebSocket API
ChemAudit provides real-time batch processing progress updates via WebSocket, allowing you to monitor job status without polling.
Connection
Endpoint
ws://localhost:8001/ws/batch/{job_id}
Replace {job_id} with the job ID returned from POST /batch/upload.
When to Connect
Connect to the WebSocket immediately after uploading a batch file:
- POST /batch/upload → receive
job_id - Open WebSocket connection to
ws://.../batch/{job_id} - Listen for progress messages
- Close connection when status is
complete,failed, orcancelled
Message Format
Progress Messages
The server sends JSON messages with job status:
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"progress": 45.5,
"processed": 455,
"total": 1000,
"eta_seconds": 68
}
| Field | Type | Description |
|---|---|---|
job_id | string | Job identifier |
status | string | Current status |
progress | float | Percentage complete (0-100) |
processed | int | Number of molecules processed |
total | int | Total molecules in job |
eta_seconds | int | Estimated time remaining (seconds) |
Status Values
| Status | Meaning |
|---|---|
processing | Job in progress |
complete | Job finished successfully |
failed | Job encountered fatal error |
cancelled | Job was cancelled |
Client Examples
JavaScript
const jobId = 'your-job-id';
const ws = new WebSocket(`ws://localhost:8001/ws/batch/${jobId}`);
ws.onopen = () => {
console.log('WebSocket connected');
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log(`Progress: ${data.progress}% (${data.processed}/${data.total})`);
console.log(`ETA: ${data.eta_seconds} seconds`);
if (data.status === 'complete') {
console.log('Job complete!');
ws.close();
} else if (data.status === 'failed') {
console.error('Job failed');
ws.close();
}
};
ws.onerror = (error) => {
console.error('WebSocket error:', error);
};
ws.onclose = () => {
console.log('WebSocket closed');
};
// Send keep-alive pings every 30 seconds
const keepAlive = setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
ws.send('ping');
}
}, 30000);
// Clean up on close
ws.addEventListener('close', () => {
clearInterval(keepAlive);
});