# BRAID v1.0.8
> Websocket server for the Measure platform

[![Build Status](https://semaphoreci.com/api/v1/projects/7767f0f3-4da6-4c84-9167-4db5402a3262/2573412/badge.svg)](https://semaphoreci.com/yardstick/braid)
[![Maintainability](https://api.codeclimate.com/v1/badges/0a5bda25fcacea5ba62b/maintainability)](https://codeclimate.com/repos/5c8ac304d227cc026e002195/maintainability)

## Essential Information:
* braid uses [mocha (test framework)](https://www.npmjs.com/package/mocha), [chai (BDD/TDD assertion library)](https://www.npmjs.com/package/chai), [sinnon (spies, stubs, and mocks)](https://www.npmjs.com/package/sinon), [nyc (code coverage calculator)](https://www.npmjs.com/package/nyc) for our unit testing. Get aquainted with these packages to have a smooth unit testing experience.
* for schema management/validation, braid uses [joi](https://github.com/hapijs/joi/).
* For web sockets braid uses [ws](https://www.npmjs.com/package/ws)
* braid uses [typescript](https://www.npmjs.com/package/typescript) for our primary code development because of it's opinionated type management among other things. Get a good understanding of what typescript is, it's benifits, drawbacks, and dev flow

## Setting up
* install [npm](https://www.npmjs.com/get-npm)
* install typescript globally (`npm i -g typescript`). This is important because it is needed to transpile, so you can run your changes locally (using command `tsc`)
* run `npm install`
* download the braid repo into a folder in the same directory as the primary yardstick folder

## Building to Docker Hub
* run `./build`
* when complete you'll see something like this `Your new docker tag: yardstick/braid:tagid`
* copy this tag id, and in the yardstick `docker-compose.yml` file change the `image` field to have the new tag, for example:
```
braid:
  image: yardstick/braid:{add the new tag here}
  environment:
    VIRTUAL_HOST: ysbraid.localhost
    HTTPS_METHOD: noredirect
    VIRTUAL_PORT: 8443
```
* once complete and confirmed to function, create a new PR for the measure repo, with the new tag and await ultimate judgement

## Local Development
* `vagrant up` in the primary yardstick folder
* run the command `compose stop braid && compose rm braid && tsc && compose build braid && compose up -d` in the braid folder
  * `compose stop` stops the default braid container that `vagrant up` builds
  * `compose rm braid` removes the default braid container
  * `tsc` transpiles the typescript in braid into javascript
  * `compose build braid` builds the braid container based on the latest transpiled javascript files
  * `comopose up -d` builds the braid container based on the files in the braid folder, overriding the default braid build container
* you can see if braid is running by typing in `https://ysbraid.localhost:8443`
* to connect to braid you need to use the url `wss://ysbraid.localhost:8443?token={token}`
  * the token is generated in the application that you're connecting to the braid app with (currently only measure has an implementation for this)
* you can generate a token for development in your local console (`app-console`) with the following commands:

```
hmac_secret = "test"
payload = {
  :data => {
    :client => 'client name (mhs is only one implemented currently)',
    :client_type => 'site (only one in use rite now)',
    :user_id => (yardstick user id),
    :user_type => '(teacher/user)',
    :channel => 'desired channel name'
  },
  :sub => 'Braid JWT',
  :aud => "internal",
  :iss => 'Yardstick Software',
  :exp => Time.now.to_i + 120 * 3600 (optional)}

token = JWT.encode payload, hmac_secret, "HS256"

```
* to test your changes before pushing you can run `npm test`