UNPKG

@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
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, }; }