use-next-sse
Version:
A lightweight Server-Sent Events (SSE) library for Next.js, enabling real-time, unidirectional data streaming from server to client
55 lines (54 loc) • 1.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.sseManager = void 0;
class SSEManager {
constructor() {
this.connections = new Map();
}
getConnection(url, init) {
let connection = this.connections.get(url);
if (!connection) {
const source = new EventSource(url, init);
connection = { source, refCount: 0, listeners: new Map() };
this.connections.set(url, connection);
}
connection.refCount++;
return connection.source;
}
releaseConnection(url) {
const connection = this.connections.get(url);
if (connection) {
connection.refCount--;
if (connection.refCount === 0) {
connection.source.close();
this.connections.delete(url);
}
}
}
addEventListener(url, eventName, listener) {
const connection = this.connections.get(url);
if (connection) {
if (!connection.listeners.has(eventName)) {
connection.listeners.set(eventName, new Set());
connection.source.addEventListener(eventName, (event) => {
const listeners = connection.listeners.get(eventName);
listeners === null || listeners === void 0 ? void 0 : listeners.forEach((listener) => listener(event));
});
}
connection.listeners.get(eventName).add(listener);
}
}
removeEventListener(url, eventName, listener) {
const connection = this.connections.get(url);
if (connection) {
const listeners = connection.listeners.get(eventName);
if (listeners) {
listeners.delete(listener);
if (listeners.size === 0) {
connection.listeners.delete(eventName);
}
}
}
}
}
exports.sseManager = new SSEManager();