# 📖 Usage Guide

The **fx-test** stack exposes two primary interfaces:

1. **WebSocket** – Real‑time event channel.
2. **HTTP** – RESTful configuration and monitoring.

## 1️⃣ WebSocket API

The WebSocket endpoint is available on port `8080`. Common message types:

| Message Type | Description |
|--------------|-------------|
| `ping` | Health check; server replies with `pong`. |
| `subscribe` | Subscribe to a topic; server sends updates. |
| `publish` | Broadcast a message to all clients. |

Example using Node.js:

```js
const ws = require("ws");
const socket = new ws("ws://localhost:8080");

socket.on("open", () => socket.send(JSON.stringify({type:"ping"}));

socket.on("message", m => console.log("Received: ", m));
```

## 2️⃣ HTTP API

### Health

```bash
GET /health
```

Response:
```json
{"status":"ok","uptime":123456}
```

### Status

```bash
GET /status
```

Returns the current number of connected WebSocket clients and processing metrics.

## 3️⃣ Configuring via ENV

The stack reads the following environment variables:

| Variable | Default | Purpose |
|----------|---------|---------|
| **PORT** | `8080` | WebSocket port |
| **HTTP_PORT** | `8090` | HTTP listening port |
| **REGISTRY** | `docker.io` | Registry to fetch Docker images |
| **DEBUG** | `false` | Enable debug logging |

Set the environment variables in a `.env` file at the repo root or export them in your shell before running `run_dev.sh`.

---

## 4️⃣ Extending the Stack

1. **Add a new service** – Place a `Dockerfile` in `fluxer/` and reference it in the `docker-compose.yml`.
2. **Modify the relay** – Edit the Erlang source in `fluxer_relay/src/relay/`. After editing, recompile with `rebar3 do compile, release` and rebuild the Docker image.
3. **Update the CI** – Extend `ci/workflows/**.py` to run any new tests.
