@kb-labs/studio-event-bus 2.15.0 → 2.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../../../../Users/kirillbaranov/Desktop/kb-labs-workspace/studio/event-bus/src/event-bus.ts","../../../../../../Users/kirillbaranov/Desktop/kb-labs-workspace/studio/event-bus/src/context.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { EventHandler, EventMeta, EventRecord, Subscription } from './types.js';\n\nconst MAX_HISTORY = 100;\n\n/**\n * Studio EventBus — pub/sub communication between plugin pages.\n *\n * Convention: events are namespaced as `pluginId:eventName`.\n * Built-in events: `studio:routeChanged`, `studio:themeChanged`.\n *\n * Singleton — shared across all pages via React context.\n */\nexport class StudioEventBus {\n private subscriptions = new Map<string, Set<Subscription>>();\n private history: EventRecord[] = [];\n private devToolsObserver?: (record: EventRecord) => void;\n\n /**\n * Subscribe to an event.\n * Returns an unsubscribe function.\n */\n subscribe<T = unknown>(\n event: string,\n handler: EventHandler<T>,\n pluginId: string,\n pageId: string,\n ): () => void {\n const sub: Subscription = {\n event,\n handler: handler as EventHandler,\n pluginId,\n pageId,\n };\n\n if (!this.subscriptions.has(event)) {\n this.subscriptions.set(event, new Set());\n }\n this.subscriptions.get(event)!.add(sub);\n\n return () => {\n this.subscriptions.get(event)?.delete(sub);\n };\n }\n\n /**\n * Publish an event to all subscribers.\n */\n publish<T = unknown>(\n event: string,\n payload: T,\n sourcePluginId: string,\n sourcePageId: string,\n ): void {\n const meta: EventMeta = {\n sourcePluginId,\n sourcePageId,\n timestamp: Date.now(),\n };\n\n // Record for devtools\n const record: EventRecord = { event, payload, meta };\n this.history.push(record);\n if (this.history.length > MAX_HISTORY) {\n this.history.shift();\n }\n this.devToolsObserver?.(record);\n\n const subs = this.subscriptions.get(event);\n if (!subs) { return; }\n\n for (const sub of subs) {\n try {\n sub.handler(payload, meta);\n } catch (err) {\n console.error(\n `[StudioEventBus] Handler error for \"${event}\" in ${sub.pluginId}:${sub.pageId}:`,\n err,\n );\n }\n }\n }\n\n /**\n * Unsubscribe all handlers for a specific page instance.\n * Called automatically on page unmount.\n */\n unsubscribeAll(pluginId: string, pageId: string): void {\n for (const [, subs] of this.subscriptions) {\n for (const sub of subs) {\n if (sub.pluginId === pluginId && sub.pageId === pageId) {\n subs.delete(sub);\n }\n }\n }\n }\n\n /**\n * Get event history for devtools.\n */\n getHistory(): readonly EventRecord[] {\n return this.history;\n }\n\n /**\n * Register a devtools observer that is called on every published event.\n * Only one observer at a time — intended for @kb-labs/studio-devtools only.\n */\n setDevToolsObserver(cb: (record: EventRecord) => void): void {\n this.devToolsObserver = cb;\n }\n\n clearDevToolsObserver(): void {\n this.devToolsObserver = undefined;\n }\n\n /**\n * Clear all subscriptions and history. For testing.\n */\n reset(): void {\n this.subscriptions.clear();\n this.history = [];\n }\n}\n\n/** Global singleton instance */\nexport const eventBus = new StudioEventBus();\n","import { createContext, useContext, type ReactNode } from 'react';\nimport { type StudioEventBus, eventBus } from './event-bus.js';\n\nconst EventBusContext = createContext<StudioEventBus>(eventBus);\n\nexport interface EventBusProviderProps {\n children: ReactNode;\n /** Override bus instance (for testing) */\n bus?: StudioEventBus;\n}\n\n/**\n * Provides the EventBus to the component tree.\n * Studio host wraps the entire app in this.\n */\nexport function EventBusProvider({ children, bus }: EventBusProviderProps) {\n return (\n <EventBusContext.Provider value={bus ?? eventBus}>\n {children}\n </EventBusContext.Provider>\n );\n}\n\n/**\n * Access the EventBus instance from context.\n * Internal — plugin authors use `useEventBus()` from studio-hooks instead.\n */\nexport function useEventBusContext(): StudioEventBus {\n return useContext(EventBusContext);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kb-labs/studio-event-bus",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.16.0",
|
|
4
4
|
"description": "Studio EventBus — pub/sub communication between plugin pages",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"tsup": "^8.5.0",
|
|
26
26
|
"typescript": "^5.6.3",
|
|
27
27
|
"vitest": "^3.2.4",
|
|
28
|
-
"@kb-labs/devkit": "2.
|
|
28
|
+
"@kb-labs/devkit": "2.16.0"
|
|
29
29
|
},
|
|
30
30
|
"engines": {
|
|
31
31
|
"node": ">=20.0.0",
|