@solid-primitives/event-bus
Version:
A collection of SolidJS primitives providing various features of a pubsub/event-emitter/event-bus.
39 lines (35 loc) • 1.05 kB
JavaScript
import { tryOnCleanup } from "@solid-primitives/utils";
import { onCleanup } from "solid-js";
export class EventBusCore extends Set {
emit(payload) {
for (const cb of this)
cb(payload);
}
}
/**
* Provides a simple way to listen to and emit events. All listeners are automatically unsubscribed on cleanup.
*
* @returns the emitter: `{listen, emit, clear}`
*
* @see https://github.com/solidjs-community/solid-primitives/tree/main/packages/event-bus#createEventBus
*
* @example
const bus = createEventBus<string>();
// bus can be destructured:
const { listen, emit, clear } = bus;
const unsub = bus.listen((a) => console.log(a));
bus.emit("foo");
// unsub gets called automatically on cleanup
unsub();
*/
export function createEventBus() {
const bus = new EventBusCore();
return {
listen(listener) {
bus.add(listener);
return tryOnCleanup(bus.delete.bind(bus, listener));
},
emit: bus.emit.bind(bus),
clear: onCleanup(bus.clear.bind(bus)),
};
}