ai-ip-plugin
Version:
AI-IP Plugin for MCP Workflow Management with SSE streaming and event handling
91 lines • 2.99 kB
JavaScript
;
/**
* Stream Processor - Handles SSE stream processing
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.StreamProcessor = void 0;
class StreamProcessor {
/**
* Process SSE stream
*/
async processStream(reader, handlers) {
const decoder = new TextDecoder();
let buffer = '';
try {
handlers.onopen?.();
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
buffer += decoder.decode(value, { stream: true });
// Process complete messages
const { processedData, remainingBuffer } = this.processBuffer(buffer);
buffer = remainingBuffer;
// Handle each parsed event
for (const { event, data } of processedData) {
// Call specific event handler if exists
if (event && typeof handlers[event] === 'function') {
handlers[event](data);
}
// Also call general onmessage handler
handlers.onmessage?.({ event, data });
}
}
}
catch (error) {
handlers.onerror?.(error);
}
finally {
try {
reader.releaseLock();
}
catch (error) {
// Ignore lock release errors
}
}
}
/**
* Process buffer and extract complete SSE messages
*/
processBuffer(buffer) {
const parts = buffer.split('\n\n');
const remainingBuffer = parts.pop() || '';
const processedData = [];
for (const part of parts) {
if (!part.trim())
continue;
let event = 'message';
let data = '';
for (const line of part.split('\n')) {
if (line.startsWith('event:')) {
event = line.replace('event:', '').trim();
}
else if (line.startsWith('data:')) {
data += line.replace('data:', '').trim();
}
}
let parsed = data;
try {
parsed = JSON.parse(data);
}
catch {
// Keep as string if not valid JSON
}
processedData.push({ event, data: parsed });
}
return { processedData, remainingBuffer };
}
/**
* Create a simple SSE handler for testing
*/
createTestHandler() {
return {
onopen: () => console.log('SSE connection opened'),
onerror: (error) => console.error('SSE error:', error),
onmessage: ({ event, data }) => console.log('SSE message:', event, data)
};
}
}
exports.StreamProcessor = StreamProcessor;
//# sourceMappingURL=StreamProcessor.js.map