actioncable/app/javascript/action_cable/subscription_guarantor.js
import logger from "./logger"
// Responsible for ensuring channel subscribe command is confirmed, retrying until confirmation is received.
// Internal class, not intended for direct user manipulation.
class SubscriptionGuarantor {
constructor(subscriptions) {
this.subscriptions = subscriptions
this.pendingSubscriptions = []
}
guarantee(subscription) {
if(this.pendingSubscriptions.indexOf(subscription) == -1){
logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`)
this.pendingSubscriptions.push(subscription)
}
else {
logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`)
}
this.startGuaranteeing()
}
forget(subscription) {
logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`)
this.pendingSubscriptions = (this.pendingSubscriptions.filter((s) => s !== subscription))
}
startGuaranteeing() {
this.stopGuaranteeing()
this.retrySubscribing()
}
stopGuaranteeing() {
clearTimeout(this.retryTimeout)
}
retrySubscribing() {
this.retryTimeout = setTimeout(() => {
if (this.subscriptions && typeof(this.subscriptions.subscribe) === "function") {
this.pendingSubscriptions.map((subscription) => {
logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`)
this.subscriptions.subscribe(subscription)
})
}
}
, 500)
}
}
export default SubscriptionGuarantor