'/Socket', to: 'me#'
Published: 2021-09-17 19:38:40

## A brief introduction to Websocket

There are many things to wonder about when you are just beginning to learn about programming. Some of them are big important questions like, "Am I more interested in front or back end development?" or  "What languages should I learn?" Others are perhaps less important like, "What color palette should I use for my text editor?" and "How should I indent my code; four white-spaces, two white-spaces, maybe a good ol' fashioned tab?" (you get the point) 

Today I'd like to explore a question that I recently found myself asking; "How do you send data between the client and server in real time?" Or to put it another way, "How does streaming work?"

Introducing Websocket! (cue dramatic intro...)

Wikipedia describes Websocket as

    A computer communications protocol providing full-duplex communication channels over a single TCP connection...

which is fancy tech talk for "it creates a two lane road between the client and server". Websocket operates similarly to the HTTP request -> response cycle but is still distinct from it in that it allows the server to send data to the client with out a specific request for said data. Put more tersely, Websocket allows data streaming. 

Websocket is a relatively new technology as it was first standardized in 2011 by the IETF (internet engineering task force)

It is also supported by most web browsers.

But how might one go about implementing this technology into their web apps? Well if you are building a rails app then you are in luck. Let's now introduce Action Cable (Yay! Action Cable! So Cool!)

## Action Cable

Action cable is built into rails and is similar is concept to Controllers in the MVC model. It provides both a server side and client side framework, in ruby and JavaScript respectively. This allows seamless integration of Websocket into your rails apps. Now about that structure I mentioned.

On the server side you have a few key components:

The connection -> a connection instance is created whenever a user starts a new websocket with the server, its concerns are the authentication and authorization of a connection and handling of exceptions. The connection object becomes the parent class of all Channels created under it. (similar to how controllers inherit from the application controller) 

The Channel -> Channels encapsulate the work of handling subscriptions. In other words the Channel defines all of the actions that can be made to a subscription by a connection. (Just like you would have a separate controller to handle the actions that a user can take on an instance of a model)

The Subscription -> Subscriptions are an instance of a channel allowing for the flow of data between a client and server

PUB/SUB -> (Pub)lishers send data to a class of unspecified recipients, the (Sub)scribers.

Broadcastings -> A Broadcasting is the link between a client and the server as defined by the subscriptions unique to the user. A channel can have multiple broadcastings.


Here is an example of a basic connection class

```ruby
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    private
      def find_verified_user
        if verified_user = User.find_by(id: cookies.encrypted[:user_id])
          verified_user
        else
          reject_unauthorized_connection
        end
      end
  end
end
```

and the channel parent class

```ruby
module ApplicationCable
  class Channel < ActionCable::Channel::Base
  end
end
```

a child channel with actions
```ruby
class AppearanceChannel < ApplicationCable::Channel
  def subscribed
    current_user.appear
  end

  def unsubscribed
    current_user.disappear
  end

  def appear(data)
    current_user.appear(on: data['appearing_on'])
  end

  def away
    current_user.away
  end
end
```

from here method calls of Create and broadcast are used between the client and server to send data back and forth.


While this is only a surface level overview of Action cable and its capabilities I hope it is enough to intrigue some and encourage further exploration of this useful technology to build ever more interesting apps.