@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
JavaScript
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