@rails/actioncable
Version:
WebSocket framework for Ruby on Rails.
50 lines (42 loc) • 1.5 kB
JavaScript
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