@solid-primitives/event-bus
Version:
A collection of SolidJS primitives providing various features of a pubsub/event-emitter/event-bus.
46 lines (45 loc) • 1.56 kB
JavaScript
import {} from "solid-js";
import {} from "./emitter.js";
import { createEventBus } from "./eventBus.js";
/**
* Provides helpers for using a group of event buses.
*
* Can be used with `createEventBus`, `createEventStack` or any emitter that has the same api.
*
* @param defineChannels object with defined channels or a defineChannels function returning channels.
*
* @returns hub functions: `{on, emit, listen, value}` + channels available by their key
*
* @see https://github.com/solidjs-community/solid-primitives/tree/main/packages/event-bus#createEventHub
*
* @example
* const hub = createEventHub({
* busA: createEventBus<void>(),
* busB: createEventBus<string>(),
* busC: createEventStack<{ text: string }>()
* });
* // can be destructured
* const { busA, busB, on, listen, emit } = hub;
*
* hub.on("busA", e => {});
* hub.on("busB", e => {});
*
* hub.emit("busA", 0);
* hub.emit("busB", "foo");
*/
export function createEventHub(defineChannels) {
const global = /*#__PURE__*/ createEventBus();
const buses = typeof defineChannels === "function" ? defineChannels(createEventBus) : defineChannels;
const value = {};
Object.entries(buses).forEach(([name, bus]) => {
bus.value && Object.defineProperty(value, name, { get: bus.value, enumerable: true });
bus.listen(payload => global.emit({ name, details: payload }));
});
return {
...buses,
value,
on: (e, a) => buses[e].listen(a),
emit: (e, a) => buses[e].emit(a),
listen: global.listen,
};
}