export default class SSEEvents {
	constructor(url, events) {
		this.url = url

		for (const [event, handler] of Object.entries(events)) {
			this.handlers.set(event, handler)
		}

		this.eventSource = new EventSource(url)

		this.eventSource.onmessage = (event) => {
			const parsed = JSON.parse(event.data)

			console.debug(`[SSE] Message received`, parsed)

			if (typeof parsed.event !== "string") {
				console.error(`[SSE] Invalid event type: ${parsed.event}`)
				return
			}

			this.trigger(parsed.event, parsed.data)
		}
	}

	handlers = new Map()

	on = (event, fn) => {
		this.handlers.set(event, fn)
	}

	off = (event) => {
		this.handlers.delete(event)
	}

	trigger = (event, data) => {
		const handler = this.handlers.get(event)

		if (handler) {
			handler(data)
		}
	}

	close = () => {
		console.log(`[SSE] Closing connection`)
		this.eventSource.close()
	}
}