UNPKG

@rails/actioncable

Version:

WebSocket framework for Ruby on Rails.

50 lines (42 loc) 1.5 kB
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