# Vroom Client JS

Platform-agnostic Core SDK for building real-time communication experiences.

## Features

- **Simple API** - Initialize once, connect to rooms with a single call
- **Auto Token Exchange** - SDK handles authentication automatically
- **Type-Safe** - Full TypeScript support
- **Production Ready** - Auto-reconnect and error handling built-in

## Installation

```bash
npm install @vroom/client-js
```

### React Native

WebRTC globals are initialized automatically inside `Vroom.connect()` — no manual polyfill setup required.

For RN-specific helpers (e.g., `RTCView` for rendering remote video), use the dedicated subpath:

```typescript
import { RTCView, MediaStream } from '@vroom/client-js/react-native'
```

#### Required peer dependencies

```bash
npm install @livekit/react-native @livekit/react-native-webrtc
```

Then on iOS, run `pod install`.

## Quick Start

```typescript
import { Vroom, SessionEvent } from '@vroom/client-js'

// 1. Initialize (once at app startup)
await Vroom.init({ apiKey: 'your-api-key' })

// 2. Connect to room
const session = await Vroom.connect({
  roomName: 'meeting-123',
  user: { id: 'user-1', displayName: 'Alice', role: 'host' },
  type: 'group',
  media: { audio: true, video: true },
  eventHandlers: {
    [SessionEvent.ParticipantJoined]: ({ participant }) => {
      console.log(`${participant.displayName} joined`)
    },
    [SessionEvent.TrackAdded]: ({ track }) => {
      if (track.mediaStreamTrack) {
        videoElement.srcObject = new MediaStream([track.mediaStreamTrack])
      }
    }
  }
})

// 3. Control media
session.disableMic()
session.enableCamera()

// 4. Disconnect
await session.disconnect()
```

## API Reference

### Vroom

| Method | Description |
|--------|-------------|
| `init(config)` | Initialize SDK with API key |
| `connect(params)` | Connect to room |
| `reset()` | Reset SDK state |

### Session

| Method | Description |
|--------|-------------|
| `enableMic()` / `disableMic()` | Toggle microphone |
| `enableCamera()` / `disableCamera()` | Toggle camera |
| `switchDevice(options)` | Switch audio/video input or output device |
| `getActiveDevice(kind)` | Get currently active device ID |
| `getParticipants()` | Get all participants |
| `room` | Room info (`name`, `sid`, `createdAt`) — immutable for the connection |
| `disconnect()` | Disconnect from room |
| `on(event, handler)` | Add event listener |

### Events

| Event | Description |
|-------|-------------|
| `SessionEvent.Connected` | Connected to room |
| `SessionEvent.Disconnected` | Disconnected from room |
| `SessionEvent.ParticipantJoined` | Participant joined |
| `SessionEvent.ParticipantLeft` | Participant left |
| `SessionEvent.TrackAdded` | Track published |
| `SessionEvent.TrackRemoved` | Track unpublished |
| `SessionEvent.Error` | Error occurred |

## Error Handling

```typescript
try {
  await Vroom.connect({ ... })
} catch (error) {
  if (error.code === 'E_INVALID_API_KEY') {
    // Handle invalid API key
  }
}
```

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md).

## License

MIT
