UNPKG

@jay-js/system

Version:

A powerful and flexible TypeScript library for UI, state management, lazy loading, routing and managing draggable elements in modern web applications.

77 lines 2.69 kB
class SubscriptionRegistry { constructor() { this.subscriptionsByElement = new WeakMap(); this.elementBySubscriptionId = new Map(); } registerSubscription(element, subscriptionId, state, cleanupFn) { const record = { subscriptionId, state, cleanupFn, }; if (!this.subscriptionsByElement.has(element)) { this.subscriptionsByElement.set(element, new Set()); } const subscriptions = this.subscriptionsByElement.get(element); if (subscriptions) { subscriptions.add(record); } this.elementBySubscriptionId.set(subscriptionId, new WeakRef(element)); } cleanupElement(element) { const subscriptions = this.subscriptionsByElement.get(element); if (!subscriptions) { return; } for (const record of subscriptions) { try { record.cleanupFn(); } catch (error) { console.error("JayJS: Error cleaning up subscription:", error); } this.elementBySubscriptionId.delete(record.subscriptionId); } this.subscriptionsByElement.delete(element); } getSubscriptionCount(element) { const subscriptions = this.subscriptionsByElement.get(element); return subscriptions ? subscriptions.size : 0; } hasSubscriptions(element) { return this.subscriptionsByElement.has(element); } cleanupSubscription(subscriptionId) { const elementRef = this.elementBySubscriptionId.get(subscriptionId); if (!elementRef) { return; } const element = elementRef.deref(); if (!element) { this.elementBySubscriptionId.delete(subscriptionId); return; } const subscriptions = this.subscriptionsByElement.get(element); if (!subscriptions) { return; } for (const record of subscriptions) { if (record.subscriptionId === subscriptionId) { try { record.cleanupFn(); } catch (error) { console.error("JayJS: Error cleaning up subscription:", error); } subscriptions.delete(record); this.elementBySubscriptionId.delete(subscriptionId); break; } } if (subscriptions.size === 0) { this.subscriptionsByElement.delete(element); } } } export const subscriptionRegistry = new SubscriptionRegistry(); //# sourceMappingURL=subscription-registry.js.map