Files
xo-stack/packages/stack/src/utils/sse-client-msgpackr.ts
T

55 lines
1.7 KiB
TypeScript

import { SSEClient, SSEClientOptions, SSEvent } from './sse-client';
import { unpackMultiple } from 'msgpackr';
/**
* SSEClientMsgpackr is a subclass of SSEClient that uses msgpackr to parse the events.
*/
export class SSEClientMsgpackr extends SSEClient {
/**
* Creates a new SSEClientMsgpackr instance.
* @param {string} url The URL to connect to
* @param {SSEClientOptions} options The options for the SSEClient
* @returns {SSEClientMsgpackr} A new SSEClientMsgpackr instance
*/
public static async from(url: string, options: SSEClientOptions) {
const client = new SSEClientMsgpackr(url, options);
await client.connect();
return client;
}
/**
* Parses the events from the msgpackr message buffer.
* @param {Uint8Array} chunk The chunk to parse
* @returns {SSEvent[]} The parsed events
*/
protected parseEvents(chunk: Uint8Array): SSEvent[] {
// Append new chunk to existing buffer
this.messageBuffer = new Uint8Array([...this.messageBuffer, ...chunk]);
// Create an array to store the parsed events
const events: SSEvent[] = [];
try {
// Try to decode the entire buffer as msgPackr messages
unpackMultiple(this.messageBuffer, (value, start, end) => {
// Remove the event from the buffer
this.messageBuffer = this.messageBuffer.slice(end);
// Add the event to the events array
events.push(value);
});
} catch (error) {
// If we can't decode the buffer, it might be incomplete
// Keep the entire buffer for next time
} finally {
// Update buffer with any remaining unprocessed content
this.messageBuffer = new Uint8Array(this.messageBuffer);
// Return the events
return events;
}
}
}