File size: 1,930 Bytes
2c28af1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | /**
* SSE stream for /api/generate-sequences — usable from wizard or dashboard.
*/
export function buildGenerateSequencesUrl(fileId, { reset = false, preview = false, contactLimit = null } = {}) {
const params = new URLSearchParams({
file_id: fileId,
reset: reset ? '1' : '0',
});
if (preview) params.set('preview', '1');
if (contactLimit != null && contactLimit > 0) {
params.set('contact_limit', String(contactLimit));
}
return `/api/generate-sequences?${params.toString()}`;
}
export function openCampaignGenerationStream(fileId, options, handlers = {}) {
const url = buildGenerateSequencesUrl(fileId, options);
const es = new EventSource(url);
es.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
if (data.type === 'sequence' && handlers.onSequence) {
handlers.onSequence(data.sequence);
} else if (data.type === 'progress' && typeof data.progress === 'number' && handlers.onProgress) {
handlers.onProgress(data.progress);
} else if (data.type === 'phase' && handlers.onPhase) {
handlers.onPhase(data.phase);
} else if (data.type === 'preview_complete') {
if (handlers.onPreviewComplete) handlers.onPreviewComplete();
es.close();
} else if (data.type === 'complete') {
if (handlers.onComplete) handlers.onComplete();
es.close();
} else if (data.type === 'error') {
if (handlers.onError) handlers.onError(data.error || 'Generation failed');
es.close();
}
} catch (e) {
if (handlers.onError) handlers.onError(String(e));
}
};
es.onerror = () => {
if (handlers.onError) handlers.onError('Connection lost');
es.close();
};
return es;
}
|