import Connection from “./connection” import Subscriptions from “./subscriptions”

// The ActionCable.Consumer establishes the connection to a server-side Ruby Connection object. Once established, // the ActionCable.ConnectionMonitor will ensure that its properly maintained through heartbeats and checking for stale updates. // The Consumer instance is also the gateway to establishing subscriptions to desired channels through the createSubscription // method. // // The following example shows how this can be set up: // // App = {} // App.cable = ActionCable.createConsumer(“ws://example.com/accounts/1”) // App.appearance = App.cable.subscriptions.create(“AppearanceChannel”) // // For more details on how you’d configure an actual channel subscription, see ActionCable.Subscription. // // When a consumer is created, it automatically connects with the server. // // To disconnect from the server, call // // App.cable.disconnect() // // and to restart the connection: // // App.cable.connect() // // Any channel subscriptions which existed prior to disconnecting will // automatically resubscribe.

export default class Consumer {

constructor(url) {
  this._url = url
  this.subscriptions = new Subscriptions(this)
  this.connection = new Connection(this)
  this.subprotocols = []
}

get url() {
  return createWebSocketURL(this._url)
}

send(data) {
  return this.connection.send(data)
}

connect() {
  return this.connection.open()
}

disconnect() {
  return this.connection.close({allowReconnect: false})
}

ensureActiveConnection() {
  if (!this.connection.isActive()) {
    return this.connection.open()
  }
}

addSubProtocol(subprotocol) {
  this.subprotocols = [...this.subprotocols, subprotocol]
}

}

export function createWebSocketURL(url) {

if (typeof url === "function") {
  url = url()
}

if (url && !/^wss?:/i.test(url)) {
  const a = document.createElement("a")
  a.href = url
  // Fix populating Location properties in IE. Otherwise, protocol will be blank.
  a.href = a.href
  a.protocol = a.protocol.replace("http", "ws")
  return a.href
} else {
  return url
}

}