Files
2025-10-12 17:21:15 +11:00

73 lines
2.1 KiB
JavaScript

export default defineEventHandler((event) => {
try {
const query = getQuery(event);
const client_id = query.client_id;
setResponseHeaders(event, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
});
setResponseStatus(event, 200);
event.node.res.flushHeaders();
const send = (data) => {
event.node.res.write(`event: message\ndata: ${JSON.stringify(data)}\n\n`);
};
// Initial connection
send({ connected: true });
// Clean up when client disconnects
event.node.req.on('close', () => {
console.log('close event stream');
connectWSS(client_id, /* query.prompt_id, */ send);
});
const comfy_wss = comfyUrl().replace(/^http(s?):/, (_m, s) => {
return `ws${s}:`;
});
function connectWSS(client_id, /* prompt_id, */ send) {
const wssUrl = `${comfy_wss}/ws?clientId=${client_id}`
const socket = new WebSocket(wssUrl);
// Event: Connection opened
socket.addEventListener('open', () => {
console.log('WebSocket connection established.');
});
// Event: Message received
socket.addEventListener('message', async (event) => {
if (event.data instanceof Blob) {
const int8Array = new Uint8Array(await event.data.arrayBuffer());
send({
type: 'blob',
blob: CompressString.uint8ArrayToBase64Reduce(int8Array),
});
return;
}
const obj = JSON.parse(event.data);
if (isDevMode) {
console.log('message',obj.type);
}
send(obj);
});
// Event: Error occurred
socket.addEventListener('error', (error) => {
console.error('WebSocket error:', error);
});
// Event: Connection closed
socket.addEventListener('close', (event) => {
console.log('WebSocket closed:', event.code, event.reason);
// event.node.res.end();
});
}
connectWSS(client_id, /* query.prompt_id, */ send);
event._handled = true;
} catch (e) {
console.error('wait crash', e);
}
});