# Requirements: natsClient_JS
## 1. Business Context & Success Metrics
### Business Goal
Provide a single, reusable NATS WebSocket client for Svelte-based consuming applications. It
handles the tedious, error-prone parts of talking to a NATS broker — connection lifecycle,
reconnection, message decoding, request/reply, and msghandler envelope handling — so consuming
apps can subscribe, publish, request, and reply without duplicating that logic.
### User Stories
- **US-001**: As a consuming app, I want to establish a NATS connection with reactive status so
that I can display connectivity to the user.
- **US-002**: As a consuming app, I want to subscribe to a subject and receive decoded messages so
that I can react to events.
- **US-003**: As a consuming app, I want to publish string or JSON messages so that I can emit
events.
- **US-004**: As a consuming app, I want to use request/reply for synchronous responses so that I
can call backend functions.
- **US-005**: As a consuming app, I want to register a reply handler so that I can serve requests.
- **US-006**: As a consuming app, I want msghandler envelope wrapping/unwrapping so that I can talk
to the sommpanion db backend.
- **US-007**: As a consuming app, I want automatic reconnection so that I don't lose connectivity
on a network blip.
- **US-008**: As a consuming app, I want a clean disconnect that releases every subscription and
the underlying socket.
### KPIs & Targets
- **KPI-001**: 100% of exported API functions covered by automated tests (validates FR-001..008).
- **KPI-002**: A disconnected connection returns to the `connected` state after automatic
reconnection (validates NFR-102).
## 2. Technical Boundaries
### In Scope
- Connection lifecycle (`getNats`, `connectNATS`, `closeNats`).
- Subscribe / publish / request / reply.
- Connection-status tracking via a Svelte store.
- msghandler envelope packing/unpacking via `msghandler-csr.js`.
- URL resolution from explicit options, env vars, or config.
### Out of Scope
- Business logic of consuming apps (this library only moves bytes).
- Broker-side configuration or server deployment.
- Any UI components.
### Dependencies
- `nats.ws` — NATS WebSocket transport.
- `svelte/store` — reactive `connectionStatus`.
- `./msghandler-csr.js` — msghandler `smartpack` / `smartunpack`.
- NATS broker at `wss://natsws.yiem.cc`.
### Deployment Constraints
- **NFR-101**: Transport must be WebSocket (`nats.ws`) so it works in browsers behind proxies.
- **NFR-501**: `closeNats` must unsubscribe all subscriptions and clear reconnect timers.
### System Context (C4 Level 1)
```mermaid
%% C4 Level 1 - System Context
flowchart LR
app[Consuming App
Svelte app]
system[(natsClient.js
NATS client lib)]
extNats[NATS
Broker wss://natsws.yiem.cc]
extMsg[msghandler-csr.js
Envelope codec]
app -->|imports| system
system -->|nats.ws WSS| extNats
system -->|smartpack/smartunpack| extMsg
```
## 3. Functional Requirements (FR)
### FR-001: Establish a connection with URL resolution
The library shall resolve the broker URL by precedence: `opts.servers`, then
`import.meta.env.VITE_NATS_URL`, then `config.nats_server_info.url`, then `wss://natsws.yiem.cc`.
- `getNats` transitions status to `connecting` then `connected`.
**Traceability**: US-001
### FR-002: Subscribe and decode messages
The library shall decode each message with `StringCodec`, then `JSON.parse` it, falling back to
`{ text }` when the payload is not valid JSON.
- `onMessage(parsed)` is called for each decoded message.
**Traceability**: US-002
### FR-003: Publish messages
The library shall stringify a non-string payload with `JSON.stringify`, or send a string payload
verbatim.
**Traceability**: US-003
### FR-004: Request/reply
The library shall send a request and await the reply, with an optional `timeout`.
**Traceability**: US-004
### FR-005: Reply handler
The library shall subscribe to a subject, invoke `handler(parsed, msg)`, and publish the returned
value back on `m.subject`.
**Traceability**: US-005
### FR-006: msghandler request
The library shall pack `[[db_request, {functioncall, args}, dictionary]]`, send a request, unpack
the reply, and return the `jsontable`/`dictionary` payload or throw on a `text` payload.
**Traceability**: US-006
### FR-007: Connection status tracking
The library shall publish `connecting`, `connected`, `disconnected`, and `error` statuses to the
`connectionStatus` store.
**Traceability**: US-001
### FR-008: Close connection
The library shall unsubscribe every tracked subscription, clear reconnect timers, and close the
connection.
**Traceability**: US-008
## 4. Non-Functional Requirements (NFRs)
### 4.1 Performance & Scalability
- **NFR-102**: Automatic reconnection must restore the `connected` state without re-calling
`getNats` from the consumer.
### 4.2 Availability & Reliability
- **NFR-201**: Status must be observable through a reactive Svelte store (`connectionStatus`).
- **NFR-302**: Per-message decode errors must not crash the subscription loop (`catch` around
decode/parse/handler).
### 4.3 Privacy & Security
- **NFR-301**: Config (broker URL, fileserver URL) is injected via `setConfig` / options, never
hardcoded in a way that leaks secrets across environments.
### 4.4 Observability & Telemetry
- **Required Logs**: `[NATS] ...` lines for connection, subscription, publish, and status events.
- **Critical Metrics**: `connectionStatus.state`.
- **Retention**: N/A (in-memory library state).
## 5. Acceptance Conditions
- [ ] **FR-001**: `getNats` returns a connection and sets `connected` status.
- [ ] **FR-002**: `subscribe` decodes a JSON message and calls `onMessage`.
- [ ] **FR-003**: `publish` sends both string and object payloads.
- [ ] **FR-004**: `request` returns the decoded reply within `timeout`.
- [ ] **FR-005**: `reply` auto-replies to each request.
- [ ] **FR-006**: `sendMsghandlerRequest` returns the `dictionary` payload and throws on `text`.
- [ ] **FR-007**: `connectionStatus` emits `connecting`/`connected`/`disconnected`/`error`.
- [ ] **FR-008**: `closeNats` unsubscribes all and closes the socket.
- [ ] **NFR-102**: A disconnect transitions status and auto-reconnects.
- [ ] **NFR-501**: `closeNats` clears all subscriptions and timers.