import CableSubscriptionPool from “./cable-subscription-pool” import CableSubscription from “./cable-subscription”
export default class ApiMakerCableConnectionPool {
static current() { if (!window.apiMakerCableConnectionPool) window.apiMakerCableConnectionPool = new ApiMakerCableConnectionPool() return window.apiMakerCableConnectionPool } constructor() { this.connections = {} this.upcomingSubscriptionData = {} this.upcomingSubscriptions = [] } connectCreated(modelName, callback) { if (!this.upcomingSubscriptionData[modelName]) this.upcomingSubscriptionData[modelName] = {} if (!this.upcomingSubscriptionData[modelName]["creates"]) this.upcomingSubscriptionData[modelName]["creates"] = true if (!this.upcomingSubscriptions[modelName]) this.upcomingSubscriptions[modelName] = {} if (!this.upcomingSubscriptions[modelName]["creates"]) this.upcomingSubscriptions[modelName]["creates"] = [] var subscription = new CableSubscription({ callback: callback, modelName: modelName }) this.upcomingSubscriptions[modelName]["creates"].push(subscription) this.scheduleConnectUpcoming() return subscription } connectDestroyed(modelName, modelId, callback) { if (!this.upcomingSubscriptionData[modelName]) this.upcomingSubscriptionData[modelName] = {} if (!this.upcomingSubscriptionData[modelName]["destroys"]) this.upcomingSubscriptionData[modelName]["destroys"] = [] if (!this.upcomingSubscriptionData[modelName]["destroys"].includes(modelId)) this.upcomingSubscriptionData[modelName]["destroys"].push(modelId) if (!this.upcomingSubscriptions[modelName]) this.upcomingSubscriptions[modelName] = {} if (!this.upcomingSubscriptions[modelName]["destroys"]) this.upcomingSubscriptions[modelName]["destroys"] = {} if (!this.upcomingSubscriptions[modelName]["destroys"][modelId]) this.upcomingSubscriptions[modelName]["destroys"][modelId] = [] var subscription = new CableSubscription({ callback: callback, modelName: modelName, modelId: modelId }) this.upcomingSubscriptions[modelName]["destroys"][modelId].push(subscription) this.scheduleConnectUpcoming() return subscription } connectEvent(modelName, modelId, eventName, callback) { if (!this.upcomingSubscriptionData[modelName]) this.upcomingSubscriptionData[modelName] = {} if (!this.upcomingSubscriptionData[modelName]["events"]) this.upcomingSubscriptionData[modelName]["events"] = {} if (!this.upcomingSubscriptionData[modelName]["events"][eventName]) this.upcomingSubscriptionData[modelName]["events"][eventName] = [] if (!this.upcomingSubscriptionData[modelName]["events"][eventName].includes(modelId)) this.upcomingSubscriptionData[modelName]["events"][eventName].push(modelId) if (!this.upcomingSubscriptions[modelName]) this.upcomingSubscriptions[modelName] = {} if (!this.upcomingSubscriptions[modelName]["events"]) this.upcomingSubscriptions[modelName]["events"] = {} if (!this.upcomingSubscriptions[modelName]["events"]) this.upcomingSubscriptions[modelName]["events"] = {} if (!this.upcomingSubscriptions[modelName]["events"][modelId]) this.upcomingSubscriptions[modelName]["events"][modelId] = {} if (!this.upcomingSubscriptions[modelName]["events"][modelId][eventName]) this.upcomingSubscriptions[modelName]["events"][modelId][eventName] = [] var subscription = new CableSubscription({ callback: callback, modelName: modelName, modelId: modelId }) this.upcomingSubscriptions[modelName]["events"][modelId][eventName].push(subscription) this.scheduleConnectUpcoming() return subscription } connectUpdate(modelName, modelId, callback) { if (!this.upcomingSubscriptionData[modelName]) this.upcomingSubscriptionData[modelName] = {} if (!this.upcomingSubscriptionData[modelName]["updates"]) this.upcomingSubscriptionData[modelName]["updates"] = [] if (!this.upcomingSubscriptionData[modelName]["updates"].includes(modelId)) this.upcomingSubscriptionData[modelName]["updates"].push(modelId) if (!this.upcomingSubscriptions[modelName]) this.upcomingSubscriptions[modelName] = {} if (!this.upcomingSubscriptions[modelName]["updates"]) this.upcomingSubscriptions[modelName]["updates"] = {} if (!this.upcomingSubscriptions[modelName]["updates"][modelId]) this.upcomingSubscriptions[modelName]["updates"][modelId] = [] var subscription = new CableSubscription({ callback: callback, modelName: modelName, modelId: modelId }) this.upcomingSubscriptions[modelName]["updates"][modelId].push(subscription) this.scheduleConnectUpcoming() return subscription } connectUpcoming() { var subscriptionData = this.upcomingSubscriptionData var subscriptions = this.upcomingSubscriptions this.upcomingSubscriptionData = {} this.upcomingSubscriptions = {} var cableSubscriptionPool = new CableSubscriptionPool({ subscriptionData: subscriptionData, subscriptions: subscriptions }) return cableSubscriptionPool } scheduleConnectUpcoming() { if (this.scheduleConnectUpcomingTimeout) clearTimeout(this.scheduleConnectUpcomingTimeout) this.scheduleConnectUpcomingTimeout = setTimeout(() => this.connectUpcoming(), 50) }
}