# JavaScript Client

## Example Usage

For use with web based applications, a JavaScript library \(`amber.js`\) is included.

### Create a single connection to the server

The first step in instantiating a socket connection with the server through JavaScript, is by using the library 
provided by Amber. Place the route that was created on the server side in the `routes.cr` as the endpoint to which
the front end will connect to.

```javascript
let socket = new Amber.Socket('/chat')
socket.connect() # returns a promise
  .then(() => {})
```

### Join a channel

After the promise passes, include the following code in the function from within the `.then` that will be triggered.

```javascript
let channel = socket.channel('chat_room:123')
channel.join()
```

In the above example, `chat_room` is the channel that was created on line 2 of the `ChatSocket` struct. You can dynamically
create separate channels within the prefix of `chat_room:` by appending any character after the colon. This allows for the 
creation of chatrooms that will allow different clients to connect to it.

### Send events / messages

When you need to send a message after a user submits the form that includes their message, you'll want to push it 
out to the server for it to be rebroadcast to all connected clients.

```javascript
channel.push('message_new', { message: 'amber websockets are the bomb diggity!' })
```

### Subscribe to events / messages

After a message is sent, you'll need to have a listener that listens to a specific subject from within the socket channel.
For example, below the subject of `message_new` is being listened to from within the `chat_room:123` channel. You may also 
have a listener on the subject of `user_join` to notify active connections of a new user to the chatroom.

```javascript
channel.on('message_new', (message) => {
  // handle new message here
})

channel.on('user_join', (message) => {})
```