@waitaya.buc/client-js 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +179 -0
- package/dist/adapters/livekit/api/recording.api.d.ts +15 -0
- package/dist/adapters/livekit/api/recording.api.d.ts.map +1 -0
- package/dist/adapters/livekit/api/recording.api.js +61 -0
- package/dist/adapters/livekit/api/recording.api.js.map +1 -0
- package/dist/adapters/livekit/index.d.ts +18 -0
- package/dist/adapters/livekit/index.d.ts.map +1 -0
- package/dist/adapters/livekit/index.js +26 -0
- package/dist/adapters/livekit/index.js.map +1 -0
- package/dist/adapters/livekit/livekit.adapter.d.ts +85 -0
- package/dist/adapters/livekit/livekit.adapter.d.ts.map +1 -0
- package/dist/adapters/livekit/livekit.adapter.js +531 -0
- package/dist/adapters/livekit/livekit.adapter.js.map +1 -0
- package/dist/adapters/livekit/livekit.mapper.d.ts +36 -0
- package/dist/adapters/livekit/livekit.mapper.d.ts.map +1 -0
- package/dist/adapters/livekit/livekit.mapper.js +108 -0
- package/dist/adapters/livekit/livekit.mapper.js.map +1 -0
- package/dist/adapters/livekit/livekit.types.d.ts +22 -0
- package/dist/adapters/livekit/livekit.types.d.ts.map +1 -0
- package/dist/adapters/livekit/livekit.types.js +10 -0
- package/dist/adapters/livekit/livekit.types.js.map +1 -0
- package/dist/adapters/livekit/service-adapters/index.d.ts +4 -0
- package/dist/adapters/livekit/service-adapters/index.d.ts.map +1 -0
- package/dist/adapters/livekit/service-adapters/index.js +4 -0
- package/dist/adapters/livekit/service-adapters/index.js.map +1 -0
- package/dist/adapters/livekit/service-adapters/recording.adapter.d.ts +19 -0
- package/dist/adapters/livekit/service-adapters/recording.adapter.d.ts.map +1 -0
- package/dist/adapters/livekit/service-adapters/recording.adapter.js +30 -0
- package/dist/adapters/livekit/service-adapters/recording.adapter.js.map +1 -0
- package/dist/adapters/livekit/service-adapters/stats.adapter.d.ts +21 -0
- package/dist/adapters/livekit/service-adapters/stats.adapter.d.ts.map +1 -0
- package/dist/adapters/livekit/service-adapters/stats.adapter.js +54 -0
- package/dist/adapters/livekit/service-adapters/stats.adapter.js.map +1 -0
- package/dist/adapters/livekit/service-adapters/track-attachment.adapter.d.ts +79 -0
- package/dist/adapters/livekit/service-adapters/track-attachment.adapter.d.ts.map +1 -0
- package/dist/adapters/livekit/service-adapters/track-attachment.adapter.js +348 -0
- package/dist/adapters/livekit/service-adapters/track-attachment.adapter.js.map +1 -0
- package/dist/adapters/livekit/services/index.d.ts +3 -0
- package/dist/adapters/livekit/services/index.d.ts.map +1 -0
- package/dist/adapters/livekit/services/index.js +3 -0
- package/dist/adapters/livekit/services/index.js.map +1 -0
- package/dist/adapters/livekit/services/recording.service.d.ts +29 -0
- package/dist/adapters/livekit/services/recording.service.d.ts.map +1 -0
- package/dist/adapters/livekit/services/recording.service.js +34 -0
- package/dist/adapters/livekit/services/recording.service.js.map +1 -0
- package/dist/adapters/livekit/services/stats.service.d.ts +24 -0
- package/dist/adapters/livekit/services/stats.service.d.ts.map +1 -0
- package/dist/adapters/livekit/services/stats.service.js +56 -0
- package/dist/adapters/livekit/services/stats.service.js.map +1 -0
- package/dist/core/api/auth.api.d.ts +52 -0
- package/dist/core/api/auth.api.d.ts.map +1 -0
- package/dist/core/api/auth.api.js +59 -0
- package/dist/core/api/auth.api.js.map +1 -0
- package/dist/core/api/http.d.ts +86 -0
- package/dist/core/api/http.d.ts.map +1 -0
- package/dist/core/api/http.js +146 -0
- package/dist/core/api/http.js.map +1 -0
- package/dist/core/errors/error-codes.d.ts +43 -0
- package/dist/core/errors/error-codes.d.ts.map +1 -0
- package/dist/core/errors/error-codes.js +42 -0
- package/dist/core/errors/error-codes.js.map +1 -0
- package/dist/core/errors/vroom.error.d.ts +99 -0
- package/dist/core/errors/vroom.error.d.ts.map +1 -0
- package/dist/core/errors/vroom.error.js +141 -0
- package/dist/core/errors/vroom.error.js.map +1 -0
- package/dist/core/ports/outbound/provider-adapter-factory.port.d.ts +41 -0
- package/dist/core/ports/outbound/provider-adapter-factory.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/provider-adapter-factory.port.js +2 -0
- package/dist/core/ports/outbound/provider-adapter-factory.port.js.map +1 -0
- package/dist/core/ports/outbound/provider-adapter.port.d.ts +130 -0
- package/dist/core/ports/outbound/provider-adapter.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/provider-adapter.port.js +2 -0
- package/dist/core/ports/outbound/provider-adapter.port.js.map +1 -0
- package/dist/core/ports/outbound/recording-adapter.port.d.ts +40 -0
- package/dist/core/ports/outbound/recording-adapter.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/recording-adapter.port.js +2 -0
- package/dist/core/ports/outbound/recording-adapter.port.js.map +1 -0
- package/dist/core/ports/outbound/stats-adapter.port.d.ts +31 -0
- package/dist/core/ports/outbound/stats-adapter.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/stats-adapter.port.js +2 -0
- package/dist/core/ports/outbound/stats-adapter.port.js.map +1 -0
- package/dist/core/ports/outbound/track-attachment-adapter.port.d.ts +86 -0
- package/dist/core/ports/outbound/track-attachment-adapter.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/track-attachment-adapter.port.js +2 -0
- package/dist/core/ports/outbound/track-attachment-adapter.port.js.map +1 -0
- package/dist/core/provider-registry.d.ts +29 -0
- package/dist/core/provider-registry.d.ts.map +1 -0
- package/dist/core/provider-registry.js +45 -0
- package/dist/core/provider-registry.js.map +1 -0
- package/dist/core/services/base.service.d.ts +15 -0
- package/dist/core/services/base.service.d.ts.map +1 -0
- package/dist/core/services/base.service.js +10 -0
- package/dist/core/services/base.service.js.map +1 -0
- package/dist/core/services/recording.service.d.ts +50 -0
- package/dist/core/services/recording.service.d.ts.map +1 -0
- package/dist/core/services/recording.service.js +89 -0
- package/dist/core/services/recording.service.js.map +1 -0
- package/dist/core/services/stats.service.d.ts +32 -0
- package/dist/core/services/stats.service.d.ts.map +1 -0
- package/dist/core/services/stats.service.js +69 -0
- package/dist/core/services/stats.service.js.map +1 -0
- package/dist/core/session.d.ts +142 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +248 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/types/events.types.d.ts +263 -0
- package/dist/core/types/events.types.d.ts.map +1 -0
- package/dist/core/types/events.types.js +76 -0
- package/dist/core/types/events.types.js.map +1 -0
- package/dist/core/types/media.types.d.ts +81 -0
- package/dist/core/types/media.types.d.ts.map +1 -0
- package/dist/core/types/media.types.js +12 -0
- package/dist/core/types/media.types.js.map +1 -0
- package/dist/core/types/participant.types.d.ts +11 -0
- package/dist/core/types/participant.types.d.ts.map +1 -0
- package/dist/core/types/participant.types.js +2 -0
- package/dist/core/types/participant.types.js.map +1 -0
- package/dist/core/types/recording.types.d.ts +60 -0
- package/dist/core/types/recording.types.d.ts.map +1 -0
- package/dist/core/types/recording.types.js +7 -0
- package/dist/core/types/recording.types.js.map +1 -0
- package/dist/core/types/service-adapters.types.d.ts +46 -0
- package/dist/core/types/service-adapters.types.d.ts.map +1 -0
- package/dist/core/types/service-adapters.types.js +2 -0
- package/dist/core/types/service-adapters.types.js.map +1 -0
- package/dist/core/types/session.types.d.ts +57 -0
- package/dist/core/types/session.types.d.ts.map +1 -0
- package/dist/core/types/session.types.js +2 -0
- package/dist/core/types/session.types.js.map +1 -0
- package/dist/core/types/stats.types.d.ts +20 -0
- package/dist/core/types/stats.types.d.ts.map +1 -0
- package/dist/core/types/stats.types.js +7 -0
- package/dist/core/types/stats.types.js.map +1 -0
- package/dist/core/types/token.types.d.ts +82 -0
- package/dist/core/types/token.types.d.ts.map +1 -0
- package/dist/core/types/token.types.js +27 -0
- package/dist/core/types/token.types.js.map +1 -0
- package/dist/core/types/track.types.d.ts +39 -0
- package/dist/core/types/track.types.d.ts.map +1 -0
- package/dist/core/types/track.types.js +9 -0
- package/dist/core/types/track.types.js.map +1 -0
- package/dist/core/types/user.types.d.ts +23 -0
- package/dist/core/types/user.types.d.ts.map +1 -0
- package/dist/core/types/user.types.js +2 -0
- package/dist/core/types/user.types.js.map +1 -0
- package/dist/core/types/vroom.types.d.ts +86 -0
- package/dist/core/types/vroom.types.d.ts.map +1 -0
- package/dist/core/types/vroom.types.js +12 -0
- package/dist/core/types/vroom.types.js.map +1 -0
- package/dist/core/utils/token.d.ts +77 -0
- package/dist/core/utils/token.d.ts.map +1 -0
- package/dist/core/utils/token.js +127 -0
- package/dist/core/utils/token.js.map +1 -0
- package/dist/core/vroom.d.ts +90 -0
- package/dist/core/vroom.d.ts.map +1 -0
- package/dist/core/vroom.js +219 -0
- package/dist/core/vroom.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/react-native.d.ts +21 -0
- package/dist/react-native.d.ts.map +1 -0
- package/dist/react-native.js +32 -0
- package/dist/react-native.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# Vroom Client JS
|
|
2
|
+
|
|
3
|
+
Platform-agnostic Core SDK for building real-time communication experiences.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Simple API** - Initialize once, connect to rooms with a single call
|
|
8
|
+
- **Auto Token Exchange** - SDK handles authentication automatically
|
|
9
|
+
- **Type-Safe** - Full TypeScript support
|
|
10
|
+
- **Production Ready** - Auto-reconnect and error handling built-in
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install @waitaya.buc/client-js
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### React Native
|
|
19
|
+
|
|
20
|
+
`Vroom.init({ platformInfo })` automatically prepares required RN WebRTC globals on iOS/Android
|
|
21
|
+
via `@waitaya.buc/client-js/react-native` (internally calls LiveKit RN global setup).
|
|
22
|
+
|
|
23
|
+
If needed, you can import mobile-specific helpers from:
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { RTCView, MediaStream, registerWebRTCGlobals } from '@waitaya.buc/client-js/react-native'
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
#### React Native Dependency Note (v0.x)
|
|
30
|
+
|
|
31
|
+
The current RTC adapter is LiveKit (internal adapter), and React Native native-module autolinking
|
|
32
|
+
can be sensitive in pnpm/workspace setups.
|
|
33
|
+
|
|
34
|
+
For v0.x, RN apps should explicitly install:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install @livekit/react-native @livekit/react-native-webrtc
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
This is a first-release stability workaround.
|
|
41
|
+
Planned improvement in next release is to reduce/normalize this explicit LiveKit dependency burden
|
|
42
|
+
for app consumers while preserving Hexagonal adapter boundaries.
|
|
43
|
+
|
|
44
|
+
When consuming published `@waitaya.buc/*` packages from npmjs in a normal app setup, you should not need local workspace path aliases.
|
|
45
|
+
Local alias-heavy Metro setups are mainly for developing unpublished sibling packages in a monorepo/workspace.
|
|
46
|
+
|
|
47
|
+
## Quick Start
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { Vroom, SessionEvent } from '@waitaya.buc/client-js'
|
|
51
|
+
|
|
52
|
+
// 1. Initialize (once at app startup)
|
|
53
|
+
await Vroom.init({ apiKey: 'your-api-key' })
|
|
54
|
+
|
|
55
|
+
// 2. Connect to room
|
|
56
|
+
const session = await Vroom.connect({
|
|
57
|
+
roomName: 'meeting-123',
|
|
58
|
+
user: { id: 'user-1', displayName: 'Alice', role: 'host' },
|
|
59
|
+
type: 'group',
|
|
60
|
+
media: { audio: true, video: true },
|
|
61
|
+
eventHandlers: {
|
|
62
|
+
[SessionEvent.ParticipantJoined]: ({ participant }) => {
|
|
63
|
+
console.log(`${participant.displayName} joined`)
|
|
64
|
+
},
|
|
65
|
+
[SessionEvent.TrackAdded]: ({ track }) => {
|
|
66
|
+
if (track.mediaStreamTrack) {
|
|
67
|
+
videoElement.srcObject = new MediaStream([track.mediaStreamTrack])
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
// 3. Control media
|
|
74
|
+
session.disableMic()
|
|
75
|
+
session.enableCamera()
|
|
76
|
+
|
|
77
|
+
// 4. Disconnect
|
|
78
|
+
await session.disconnect()
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## API Reference
|
|
82
|
+
|
|
83
|
+
### Vroom
|
|
84
|
+
|
|
85
|
+
| Method | Description |
|
|
86
|
+
|--------|-------------|
|
|
87
|
+
| `init(config)` | Initialize SDK with API key |
|
|
88
|
+
| `connect(params)` | Connect to room |
|
|
89
|
+
| `reset()` | Reset SDK state |
|
|
90
|
+
|
|
91
|
+
### Session
|
|
92
|
+
|
|
93
|
+
| Method | Description |
|
|
94
|
+
|--------|-------------|
|
|
95
|
+
| `enableMic()` / `disableMic()` | Toggle microphone |
|
|
96
|
+
| `enableCamera()` / `disableCamera()` | Toggle camera |
|
|
97
|
+
| `switchDevice(options)` | Switch audio/video input or output device |
|
|
98
|
+
| `getActiveDevice(kind)` | Get currently active device ID |
|
|
99
|
+
| `getParticipants()` | Get all participants |
|
|
100
|
+
| `disconnect()` | Disconnect from room |
|
|
101
|
+
| `on(event, handler)` | Add event listener |
|
|
102
|
+
|
|
103
|
+
### Events
|
|
104
|
+
|
|
105
|
+
| Event | Description |
|
|
106
|
+
|-------|-------------|
|
|
107
|
+
| `SessionEvent.Connected` | Connected to room |
|
|
108
|
+
| `SessionEvent.Disconnected` | Disconnected from room |
|
|
109
|
+
| `SessionEvent.ParticipantJoined` | Participant joined |
|
|
110
|
+
| `SessionEvent.ParticipantLeft` | Participant left |
|
|
111
|
+
| `SessionEvent.TrackAdded` | Track published |
|
|
112
|
+
| `SessionEvent.TrackRemoved` | Track unpublished |
|
|
113
|
+
| `SessionEvent.Error` | Error occurred |
|
|
114
|
+
|
|
115
|
+
## Error Handling
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
try {
|
|
119
|
+
await Vroom.connect({ ... })
|
|
120
|
+
} catch (error) {
|
|
121
|
+
if (error.code === 'E_INVALID_API_KEY') {
|
|
122
|
+
// Handle invalid API key
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Development Status
|
|
128
|
+
|
|
129
|
+
**Implemented:** Core SDK, Media control, Events, Error handling
|
|
130
|
+
|
|
131
|
+
**Planned:** Chat, Recording, Presence, Screen sharing, React hooks
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Contributing
|
|
136
|
+
|
|
137
|
+
### Architecture
|
|
138
|
+
|
|
139
|
+
This SDK uses Hexagonal Architecture (Ports & Adapters):
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
┌─────────────────────────────────────────┐
|
|
143
|
+
│ Your App (React, RN, etc.) │
|
|
144
|
+
└────────────────────┬────────────────────┘
|
|
145
|
+
│
|
|
146
|
+
▼
|
|
147
|
+
┌─────────────────────────────────────────┐
|
|
148
|
+
│ Core Layer (Vroom, Session) │
|
|
149
|
+
│ - Public API │
|
|
150
|
+
│ - Business logic │
|
|
151
|
+
│ - Types & Errors │
|
|
152
|
+
└────────────────────┬────────────────────┘
|
|
153
|
+
│ ProviderAdapter port
|
|
154
|
+
▼
|
|
155
|
+
┌─────────────────────────────────────────┐
|
|
156
|
+
│ Adapter Layer │
|
|
157
|
+
│ - LiveKitAdapter │
|
|
158
|
+
│ - (future adapters) │
|
|
159
|
+
└─────────────────────────────────────────┘
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Folder Structure
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
src/
|
|
166
|
+
├── core/ # Public API (Vroom, Session, Types, Errors)
|
|
167
|
+
├── adapters/ # Provider implementations (internal)
|
|
168
|
+
└── index.ts # Public exports
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Adding a New Adapter
|
|
172
|
+
|
|
173
|
+
1. Create `src/adapters/{provider}/`
|
|
174
|
+
2. Implement `ProviderAdapter` interface
|
|
175
|
+
3. Add to `Vroom.createAdapter()`
|
|
176
|
+
|
|
177
|
+
## License
|
|
178
|
+
|
|
179
|
+
MIT
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ServiceContext } from '../../../core/types/service-adapters.types';
|
|
2
|
+
import type { RecordingStartOptions, RecordingStatus } from '../../../core/types/recording.types';
|
|
3
|
+
/**
|
|
4
|
+
* POST /v1/rtc/recording/start
|
|
5
|
+
*/
|
|
6
|
+
export declare function postStartRecording(context: ServiceContext, options?: RecordingStartOptions): Promise<string>;
|
|
7
|
+
/**
|
|
8
|
+
* POST /v1/rtc/recording/stop
|
|
9
|
+
*/
|
|
10
|
+
export declare function postStopRecording(context: ServiceContext, recordingId: string): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* GET /v1/rtc/recording/status?id=xxx
|
|
13
|
+
*/
|
|
14
|
+
export declare function getRecordingStatus(context: ServiceContext, recordingId: string): Promise<RecordingStatus>;
|
|
15
|
+
//# sourceMappingURL=recording.api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.api.d.ts","sourceRoot":"","sources":["../../../../src/adapters/livekit/api/recording.api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAA;AAChF,OAAO,KAAK,EACV,qBAAqB,EACrB,eAAe,EAChB,MAAM,qCAAqC,CAAA;AA0B5C;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAejB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC,CAU1B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { RecordingStartError } from '../../../core/errors/vroom.error';
|
|
2
|
+
import { ErrorCodes } from '../../../core/errors/error-codes';
|
|
3
|
+
import { request, requestVoid } from '../../../core/api/http';
|
|
4
|
+
/**
|
|
5
|
+
* Custom error handler for recording endpoints.
|
|
6
|
+
* Handles recording-specific errors: RecordingStart, 409 Conflict
|
|
7
|
+
*/
|
|
8
|
+
const recordingErrorHandler = ({ response, code, message }) => {
|
|
9
|
+
if (code === ErrorCodes.E_RECORDING_START) {
|
|
10
|
+
return new RecordingStartError(message);
|
|
11
|
+
}
|
|
12
|
+
if (response.status === 409) {
|
|
13
|
+
return new RecordingStartError('Recording already in progress');
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* POST /v1/rtc/recording/start
|
|
19
|
+
*/
|
|
20
|
+
export async function postStartRecording(context, options) {
|
|
21
|
+
const data = await request({
|
|
22
|
+
method: 'POST',
|
|
23
|
+
url: `${context.apiEndpoint}/v1/rtc/recording/start`,
|
|
24
|
+
headers: { Authorization: `Bearer ${context.sessionToken}` },
|
|
25
|
+
body: {
|
|
26
|
+
layout: options?.layout,
|
|
27
|
+
audioOnly: options?.audioOnly,
|
|
28
|
+
resolution: options?.resolution,
|
|
29
|
+
},
|
|
30
|
+
customErrorHandler: recordingErrorHandler,
|
|
31
|
+
errorMessage: 'Failed to start recording',
|
|
32
|
+
});
|
|
33
|
+
return data.recordingId;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* POST /v1/rtc/recording/stop
|
|
37
|
+
*/
|
|
38
|
+
export async function postStopRecording(context, recordingId) {
|
|
39
|
+
await requestVoid({
|
|
40
|
+
method: 'POST',
|
|
41
|
+
url: `${context.apiEndpoint}/v1/rtc/recording/stop`,
|
|
42
|
+
headers: { Authorization: `Bearer ${context.sessionToken}` },
|
|
43
|
+
body: { recordingId },
|
|
44
|
+
customErrorHandler: recordingErrorHandler,
|
|
45
|
+
errorMessage: 'Failed to stop recording',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* GET /v1/rtc/recording/status?id=xxx
|
|
50
|
+
*/
|
|
51
|
+
export async function getRecordingStatus(context, recordingId) {
|
|
52
|
+
const params = new URLSearchParams({ id: recordingId });
|
|
53
|
+
return request({
|
|
54
|
+
method: 'GET',
|
|
55
|
+
url: `${context.apiEndpoint}/v1/rtc/recording/status?${params}`,
|
|
56
|
+
headers: { Authorization: `Bearer ${context.sessionToken}` },
|
|
57
|
+
customErrorHandler: recordingErrorHandler,
|
|
58
|
+
errorMessage: 'Failed to get recording status',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=recording.api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.api.js","sourceRoot":"","sources":["../../../../src/adapters/livekit/api/recording.api.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,OAAO,EAAE,WAAW,EAA2B,MAAM,wBAAwB,CAAA;AAStF;;;GAGG;AACH,MAAM,qBAAqB,GAAuB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;IAChF,IAAI,IAAI,KAAK,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,mBAAmB,CAAC,+BAA+B,CAAC,CAAA;IACjE,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAuB,EACvB,OAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAyB;QACjD,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,yBAAyB;QACpD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,YAAY,EAAE,EAAE;QAC5D,IAAI,EAAE;YACJ,MAAM,EAAE,OAAO,EAAE,MAAM;YACvB,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,UAAU,EAAE,OAAO,EAAE,UAAU;SAChC;QACD,kBAAkB,EAAE,qBAAqB;QACzC,YAAY,EAAE,2BAA2B;KAC1C,CAAC,CAAA;IAEF,OAAO,IAAI,CAAC,WAAW,CAAA;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAuB,EACvB,WAAmB;IAEnB,MAAM,WAAW,CAAC;QAChB,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,wBAAwB;QACnD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,YAAY,EAAE,EAAE;QAC5D,IAAI,EAAE,EAAE,WAAW,EAAE;QACrB,kBAAkB,EAAE,qBAAqB;QACzC,YAAY,EAAE,0BAA0B;KACzC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAuB,EACvB,WAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;IAEvD,OAAO,OAAO,CAAkB;QAC9B,MAAM,EAAE,KAAK;QACb,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,4BAA4B,MAAM,EAAE;QAC/D,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,YAAY,EAAE,EAAE;QAC5D,kBAAkB,EAAE,qBAAqB;QACzC,YAAY,EAAE,gCAAgC;KAC/C,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ProviderAdapterFactory } from '../../core/ports/outbound/provider-adapter-factory.port';
|
|
2
|
+
/**
|
|
3
|
+
* Factory for creating LiveKit adapter instances.
|
|
4
|
+
*
|
|
5
|
+
* Uses lazy import so provider SDK code is loaded only when connect() is called.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. This file is imported when @waitaya.buc/client-js loads (auto-registration)
|
|
9
|
+
* 2. Factory is registered but LiveKitAdapter is NOT imported yet
|
|
10
|
+
* 3. When Vroom.connect() is called, factory.create() runs
|
|
11
|
+
* 4. LiveKitAdapter is imported and instantiated
|
|
12
|
+
*
|
|
13
|
+
* Note:
|
|
14
|
+
* React Native globals are prepared in Vroom.init() before connect().
|
|
15
|
+
*/
|
|
16
|
+
export declare const LiveKitAdapterFactory: ProviderAdapterFactory;
|
|
17
|
+
export { LiveKitAdapterFactory as default };
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/livekit/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yDAAyD,CAAA;AAIrG;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,qBAAqB,EAAE,sBAKnC,CAAA;AAKD,OAAO,EAAE,qBAAqB,IAAI,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Provider } from '../../core/types/vroom.types';
|
|
2
|
+
import { registerProvider } from '../../core/provider-registry';
|
|
3
|
+
/**
|
|
4
|
+
* Factory for creating LiveKit adapter instances.
|
|
5
|
+
*
|
|
6
|
+
* Uses lazy import so provider SDK code is loaded only when connect() is called.
|
|
7
|
+
*
|
|
8
|
+
* Flow:
|
|
9
|
+
* 1. This file is imported when @waitaya.buc/client-js loads (auto-registration)
|
|
10
|
+
* 2. Factory is registered but LiveKitAdapter is NOT imported yet
|
|
11
|
+
* 3. When Vroom.connect() is called, factory.create() runs
|
|
12
|
+
* 4. LiveKitAdapter is imported and instantiated
|
|
13
|
+
*
|
|
14
|
+
* Note:
|
|
15
|
+
* React Native globals are prepared in Vroom.init() before connect().
|
|
16
|
+
*/
|
|
17
|
+
export const LiveKitAdapterFactory = {
|
|
18
|
+
create: async (serviceContext, _platform) => {
|
|
19
|
+
const { LiveKitAdapter } = await import('./livekit.adapter');
|
|
20
|
+
return new LiveKitAdapter(serviceContext);
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
// Auto-register LiveKit provider when this module is imported
|
|
24
|
+
registerProvider(Provider.LiveKit, LiveKitAdapterFactory);
|
|
25
|
+
export { LiveKitAdapterFactory as default };
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/livekit/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAE/D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE;QAC1C,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAC5D,OAAO,IAAI,cAAc,CAAC,cAAc,CAAC,CAAA;IAC3C,CAAC;CACF,CAAA;AAED,8DAA8D;AAC9D,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAA;AAEzD,OAAO,EAAE,qBAAqB,IAAI,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { NetworkQuality } from '../../core/types/events.types';
|
|
2
|
+
import type { ProviderAdapter, AdapterConnectOptions, Capability } from '../../core/ports/outbound/provider-adapter.port';
|
|
3
|
+
import type { ServiceAdapters, ServiceContext } from '../../core/types/service-adapters.types';
|
|
4
|
+
import { type SessionPermissions } from '../../core/types/token.types';
|
|
5
|
+
import type { Track } from '../../core/types/track.types';
|
|
6
|
+
import type { SwitchDeviceOptions, DeviceKind } from '../../core/types/media.types';
|
|
7
|
+
import type { Participant } from '../../core/types/participant.types';
|
|
8
|
+
import { type SessionEventName, type EventHandlers } from '../../core/types/events.types';
|
|
9
|
+
import { type LiveKitAdapterConfig } from './livekit.types';
|
|
10
|
+
type EventHandler<E extends SessionEventName> = NonNullable<EventHandlers[E]>;
|
|
11
|
+
export declare class LiveKitAdapter implements ProviderAdapter {
|
|
12
|
+
/** LiveKit Room instance */
|
|
13
|
+
private room;
|
|
14
|
+
/** Event handlers registry */
|
|
15
|
+
private eventHandlers;
|
|
16
|
+
/** Cached participants */
|
|
17
|
+
private participants;
|
|
18
|
+
/** Cached tracks */
|
|
19
|
+
private tracks;
|
|
20
|
+
/** Local participant reference */
|
|
21
|
+
private localParticipant;
|
|
22
|
+
/** Adapter configuration */
|
|
23
|
+
private config;
|
|
24
|
+
/** Service context for backend API calls */
|
|
25
|
+
private serviceContext;
|
|
26
|
+
/** Reconnect attempt counter */
|
|
27
|
+
private reconnectAttempt;
|
|
28
|
+
constructor(serviceContext: ServiceContext, config?: LiveKitAdapterConfig);
|
|
29
|
+
connect(options: AdapterConnectOptions): Promise<void>;
|
|
30
|
+
disconnect(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Publish a MediaStreamTrack to the room
|
|
33
|
+
*/
|
|
34
|
+
publishTrack(track: MediaStreamTrack): Promise<Track>;
|
|
35
|
+
/**
|
|
36
|
+
* Unpublish a track from the room
|
|
37
|
+
*/
|
|
38
|
+
unpublishTrack(trackId: string): Promise<void>;
|
|
39
|
+
muteTrack(kind: 'audio' | 'video'): Promise<void>;
|
|
40
|
+
unmuteTrack(kind: 'audio' | 'video'): Promise<void>;
|
|
41
|
+
switchDevice(options: SwitchDeviceOptions): Promise<void>;
|
|
42
|
+
getActiveDevice(kind: DeviceKind): string | undefined;
|
|
43
|
+
on<E extends SessionEventName>(event: E, handler: EventHandler<E>): void;
|
|
44
|
+
off<E extends SessionEventName>(event: E, handler?: EventHandler<E>): void;
|
|
45
|
+
getStats(): Promise<RTCStatsReport>;
|
|
46
|
+
getNetworkQuality(): NetworkQuality;
|
|
47
|
+
getCapabilities(): Capability[];
|
|
48
|
+
getParticipants(): Participant[];
|
|
49
|
+
getTracks(): Track[];
|
|
50
|
+
createServiceAdapters(permissions: SessionPermissions): ServiceAdapters;
|
|
51
|
+
/**
|
|
52
|
+
* Get event mappings for LiveKit Room events.
|
|
53
|
+
* Defined as a getter to ensure handlers are initialized before access.
|
|
54
|
+
*/
|
|
55
|
+
private get roomEventMappings();
|
|
56
|
+
/**
|
|
57
|
+
* Sets up LiveKit event listeners and maps them to SDK events.
|
|
58
|
+
*/
|
|
59
|
+
private setupEventListeners;
|
|
60
|
+
/**
|
|
61
|
+
* Removes all LiveKit event listeners to prevent memory leaks.
|
|
62
|
+
*/
|
|
63
|
+
private removeEventListeners;
|
|
64
|
+
private handleParticipantConnected;
|
|
65
|
+
private handleParticipantDisconnected;
|
|
66
|
+
private handleTrackSubscribed;
|
|
67
|
+
private handleTrackUnsubscribed;
|
|
68
|
+
private handleLocalTrackPublished;
|
|
69
|
+
private handleLocalTrackUnpublished;
|
|
70
|
+
private handleTrackMuted;
|
|
71
|
+
private handleTrackUnmuted;
|
|
72
|
+
/**
|
|
73
|
+
* Get SDK Participant for a LiveKit participant (local or remote)
|
|
74
|
+
*/
|
|
75
|
+
private getParticipantForTrack;
|
|
76
|
+
private handleDisconnected;
|
|
77
|
+
private handleReconnecting;
|
|
78
|
+
private handleReconnected;
|
|
79
|
+
private handleActiveSpeakersChanged;
|
|
80
|
+
private handleActiveDeviceChanged;
|
|
81
|
+
private emit;
|
|
82
|
+
private mapDisconnectReason;
|
|
83
|
+
}
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=livekit.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"livekit.adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/livekit/livekit.adapter.ts"],"names":[],"mappings":"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"}
|