@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
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { MediaOptions, SwitchDeviceOptions, DeviceKind } from '../../types/media.types';
|
|
2
|
+
import type { SessionEventName, EventHandlers, NetworkQuality } from '../../types/events.types';
|
|
3
|
+
import type { Track } from '../../types/track.types';
|
|
4
|
+
import type { Participant } from '../../types/participant.types';
|
|
5
|
+
import type { User } from '../../types/user.types';
|
|
6
|
+
import type { ServiceAdapters } from '../../types/service-adapters.types';
|
|
7
|
+
import type { SessionPermissions } from '../../types/token.types';
|
|
8
|
+
/**
|
|
9
|
+
* Capability reported by adapter
|
|
10
|
+
*/
|
|
11
|
+
export interface Capability {
|
|
12
|
+
/** Feature name */
|
|
13
|
+
feature: string;
|
|
14
|
+
/** Whether feature is supported */
|
|
15
|
+
supported: boolean;
|
|
16
|
+
/** Optional limitations */
|
|
17
|
+
limitations?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Options for adapter connection
|
|
21
|
+
*/
|
|
22
|
+
export interface AdapterConnectOptions {
|
|
23
|
+
/** Room name */
|
|
24
|
+
roomName: string;
|
|
25
|
+
/** Provider token (from backend) */
|
|
26
|
+
token: string;
|
|
27
|
+
/** Provider endpoint */
|
|
28
|
+
endpoint: string;
|
|
29
|
+
/** Initial media options */
|
|
30
|
+
media?: MediaOptions;
|
|
31
|
+
/** User info (displayName, role) for provider metadata */
|
|
32
|
+
user: User;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Provider adapter interface.
|
|
36
|
+
*
|
|
37
|
+
* All RTC providers (LiveKit, Banuba, custom) must implement this interface.
|
|
38
|
+
* This allows Vroom SDK to be provider-agnostic.
|
|
39
|
+
*/
|
|
40
|
+
export interface ProviderAdapter {
|
|
41
|
+
/**
|
|
42
|
+
* Connect to the provider
|
|
43
|
+
*/
|
|
44
|
+
connect(options: AdapterConnectOptions): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Disconnect from the provider
|
|
47
|
+
*/
|
|
48
|
+
disconnect(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Publish a track (audio/video/screen)
|
|
51
|
+
*/
|
|
52
|
+
publishTrack(track: MediaStreamTrack): Promise<Track>;
|
|
53
|
+
/**
|
|
54
|
+
* Unpublish a track
|
|
55
|
+
*/
|
|
56
|
+
unpublishTrack(trackId: string): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Mute a track kind (audio/video)
|
|
59
|
+
* @throws VroomError if operation fails (e.g., device disconnected)
|
|
60
|
+
*/
|
|
61
|
+
muteTrack(kind: 'audio' | 'video'): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Unmute a track kind (audio/video)
|
|
64
|
+
* @throws VroomError if operation fails (e.g., permission denied)
|
|
65
|
+
*/
|
|
66
|
+
unmuteTrack(kind: 'audio' | 'video'): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Switch active device for audio/video input or output.
|
|
69
|
+
*
|
|
70
|
+
* Each device kind is switched independently in sequence (fail-fast).
|
|
71
|
+
* Successfully switched devices remain changed even if a subsequent switch fails.
|
|
72
|
+
*
|
|
73
|
+
* @param options - Device IDs to switch to (only specified devices are switched)
|
|
74
|
+
* @throws VroomError(E_MEDIA) if device switch fails
|
|
75
|
+
* @throws VroomError(E_UNSUPPORTED_FEATURE) if audioOutputId used on unsupported browser
|
|
76
|
+
*/
|
|
77
|
+
switchDevice(options: SwitchDeviceOptions): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Get currently active device ID for a given kind.
|
|
80
|
+
*
|
|
81
|
+
* @param kind - Device kind to query
|
|
82
|
+
* @returns Device ID or undefined if not set/connected
|
|
83
|
+
*/
|
|
84
|
+
getActiveDevice(kind: DeviceKind): string | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* Register event handler
|
|
87
|
+
*/
|
|
88
|
+
on<E extends SessionEventName>(event: E, handler: NonNullable<EventHandlers[E]>): void;
|
|
89
|
+
/**
|
|
90
|
+
* Remove event handler
|
|
91
|
+
*/
|
|
92
|
+
off<E extends SessionEventName>(event: E, handler?: NonNullable<EventHandlers[E]>): void;
|
|
93
|
+
/**
|
|
94
|
+
* Get native RTC stats report.
|
|
95
|
+
*
|
|
96
|
+
* Returns raw RTCStatsReport from RTCPeerConnection for user to parse.
|
|
97
|
+
*
|
|
98
|
+
* @returns Native RTCStatsReport containing all WebRTC statistics
|
|
99
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/RTCStatsReport
|
|
100
|
+
*/
|
|
101
|
+
getStats(): Promise<RTCStatsReport>;
|
|
102
|
+
/**
|
|
103
|
+
* Get current network quality
|
|
104
|
+
*/
|
|
105
|
+
getNetworkQuality(): NetworkQuality;
|
|
106
|
+
/**
|
|
107
|
+
* Get supported capabilities
|
|
108
|
+
*/
|
|
109
|
+
getCapabilities(): Capability[];
|
|
110
|
+
/**
|
|
111
|
+
* Get all participants
|
|
112
|
+
*/
|
|
113
|
+
getParticipants(): Participant[];
|
|
114
|
+
/**
|
|
115
|
+
* Get all tracks in the session
|
|
116
|
+
*/
|
|
117
|
+
getTracks(): Track[];
|
|
118
|
+
/**
|
|
119
|
+
* Create all service adapters at once.
|
|
120
|
+
*
|
|
121
|
+
* Different API keys/plans may have access to different services.
|
|
122
|
+
* The adapter should check permissions and only return adapters for
|
|
123
|
+
* services the user has access to.
|
|
124
|
+
*
|
|
125
|
+
* @param permissions - Session permissions from decoded sessionToken
|
|
126
|
+
* @returns ServiceAdapters object with required and optional service adapters
|
|
127
|
+
*/
|
|
128
|
+
createServiceAdapters(permissions: SessionPermissions): ServiceAdapters;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=provider-adapter.port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-adapter.port.d.ts","sourceRoot":"","sources":["../../../../src/core/ports/outbound/provider-adapter.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAC5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC/F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAEjE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAA;IAClB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,0DAA0D;IAC1D,IAAI,EAAE,IAAI,CAAA;CACX;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEtD;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAE3B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAErD;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE9C;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjD;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEnD;;;;;;;;;OASG;IACH,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEzD;;;;;OAKG;IACH,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAAA;IAErD;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,gBAAgB,EAC3B,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GACrC,IAAI,CAAA;IAEP;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,gBAAgB,EAC5B,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GACtC,IAAI,CAAA;IAEP;;;;;;;OAOG;IACH,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,CAAA;IAEnC;;OAEG;IACH,iBAAiB,IAAI,cAAc,CAAA;IAEnC;;OAEG;IACH,eAAe,IAAI,UAAU,EAAE,CAAA;IAE/B;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE,CAAA;IAEhC;;OAEG;IACH,SAAS,IAAI,KAAK,EAAE,CAAA;IAEpB;;;;;;;;;OASG;IACH,qBAAqB,CAAC,WAAW,EAAE,kBAAkB,GAAG,eAAe,CAAA;CACxE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-adapter.port.js","sourceRoot":"","sources":["../../../../src/core/ports/outbound/provider-adapter.port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { RecordingStartOptions, RecordingStatus, RecordingStatusEvent } from '../../types/recording.types';
|
|
2
|
+
/**
|
|
3
|
+
* Recording adapter interface.
|
|
4
|
+
*
|
|
5
|
+
* Provider-specific implementations must implement this interface
|
|
6
|
+
* to provide recording functionality to RecordingService.
|
|
7
|
+
*
|
|
8
|
+
* Unlike StatsAdapter which uses local RTC events, RecordingAdapter
|
|
9
|
+
* makes HTTP calls to Vroom backend for recording operations.
|
|
10
|
+
*/
|
|
11
|
+
export interface RecordingAdapter {
|
|
12
|
+
/**
|
|
13
|
+
* Start recording
|
|
14
|
+
* @param options - Recording options (layout, audioOnly, resolution)
|
|
15
|
+
* @returns Recording ID
|
|
16
|
+
*/
|
|
17
|
+
start(options?: RecordingStartOptions): Promise<string>;
|
|
18
|
+
/**
|
|
19
|
+
* Stop recording
|
|
20
|
+
* @param recordingId - ID of the recording to stop
|
|
21
|
+
*/
|
|
22
|
+
stop(recordingId: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Get recording status
|
|
25
|
+
* @param recordingId - ID of the recording
|
|
26
|
+
* @returns Recording status
|
|
27
|
+
*/
|
|
28
|
+
getStatus(recordingId: string): Promise<RecordingStatus>;
|
|
29
|
+
/**
|
|
30
|
+
* Subscribe to recording status changes
|
|
31
|
+
* @param callback - Called when recording status changes
|
|
32
|
+
* @returns Unsubscribe function
|
|
33
|
+
*/
|
|
34
|
+
onStatusChanged(callback: (event: RecordingStatusEvent) => void): () => void;
|
|
35
|
+
/**
|
|
36
|
+
* Cleanup resources
|
|
37
|
+
*/
|
|
38
|
+
destroy(): void;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=recording-adapter.port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-adapter.port.d.ts","sourceRoot":"","sources":["../../../../src/core/ports/outbound/recording-adapter.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAE/G;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAEvD;;;OAGG;IACH,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAExC;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAExD;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAE5E;;OAEG;IACH,OAAO,IAAI,IAAI,CAAA;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-adapter.port.js","sourceRoot":"","sources":["../../../../src/core/ports/outbound/recording-adapter.port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { NetworkQuality, NetworkQualityEvent } from '../../types/events.types';
|
|
2
|
+
/**
|
|
3
|
+
* Stats adapter interface.
|
|
4
|
+
*
|
|
5
|
+
* Provider-specific implementations (LiveKit, etc.) must implement this interface
|
|
6
|
+
* to provide stats functionality to StatsService.
|
|
7
|
+
*
|
|
8
|
+
* This allows StatsService to be completely independent from ProviderAdapter
|
|
9
|
+
* and have its own event system.
|
|
10
|
+
*/
|
|
11
|
+
export interface StatsAdapter {
|
|
12
|
+
/**
|
|
13
|
+
* Get current network quality
|
|
14
|
+
*/
|
|
15
|
+
getNetworkQuality(): NetworkQuality;
|
|
16
|
+
/**
|
|
17
|
+
* Get native RTC stats report
|
|
18
|
+
*/
|
|
19
|
+
getStats(): Promise<RTCStatsReport>;
|
|
20
|
+
/**
|
|
21
|
+
* Subscribe to network quality changes
|
|
22
|
+
* @param callback - Called when network quality changes
|
|
23
|
+
* @returns Unsubscribe function
|
|
24
|
+
*/
|
|
25
|
+
onNetworkQualityChanged(callback: (event: NetworkQualityEvent) => void): () => void;
|
|
26
|
+
/**
|
|
27
|
+
* Cleanup resources
|
|
28
|
+
*/
|
|
29
|
+
destroy(): void;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=stats-adapter.port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-adapter.port.d.ts","sourceRoot":"","sources":["../../../../src/core/ports/outbound/stats-adapter.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEnF;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,iBAAiB,IAAI,cAAc,CAAA;IAEnC;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,CAAA;IAEnC;;;;OAIG;IACH,uBAAuB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAEnF;;OAEG;IACH,OAAO,IAAI,IAAI,CAAA;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-adapter.port.js","sourceRoot":"","sources":["../../../../src/core/ports/outbound/stats-adapter.port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Track attachment adapter interface.
|
|
3
|
+
*
|
|
4
|
+
* Provider-specific implementations (LiveKit, etc.) must implement this interface
|
|
5
|
+
* to provide track attachment functionality.
|
|
6
|
+
*
|
|
7
|
+
* This is necessary because some providers (like LiveKit) use adaptive streaming
|
|
8
|
+
* that requires knowing which elements are displaying tracks. Using srcObject
|
|
9
|
+
* directly bypasses this and may result in frozen frames after mute/unmute cycles.
|
|
10
|
+
*
|
|
11
|
+
* ## Platform Support
|
|
12
|
+
*
|
|
13
|
+
* - **Web:** Use `attach()` / `detach()` with HTMLMediaElement
|
|
14
|
+
* - **Mobile:** Use `registerTrackView()` / `unregisterTrackView()` with view IDs
|
|
15
|
+
* (React Native, NativeScript, Capacitor, etc.)
|
|
16
|
+
*/
|
|
17
|
+
export interface TrackAttachmentAdapter {
|
|
18
|
+
/**
|
|
19
|
+
* Attach a track to a media element.
|
|
20
|
+
* This notifies the provider that this element is displaying the track,
|
|
21
|
+
* enabling proper frame delivery and adaptive streaming.
|
|
22
|
+
*
|
|
23
|
+
* @param trackId - The track ID to attach
|
|
24
|
+
* @param element - The HTMLMediaElement (video or audio) to attach to
|
|
25
|
+
*/
|
|
26
|
+
attach(trackId: string, element: HTMLMediaElement): void;
|
|
27
|
+
/**
|
|
28
|
+
* Detach a track from a media element.
|
|
29
|
+
* This notifies the provider that this element is no longer displaying the track.
|
|
30
|
+
*
|
|
31
|
+
* @param trackId - The track ID to detach
|
|
32
|
+
* @param element - Optional specific element to detach from. If not provided, detaches from all elements.
|
|
33
|
+
*/
|
|
34
|
+
detach(trackId: string, element?: HTMLMediaElement): void;
|
|
35
|
+
/**
|
|
36
|
+
* Register a track view for mobile platforms.
|
|
37
|
+
* This notifies the provider for adaptive streaming optimization and returns the stream URL.
|
|
38
|
+
*
|
|
39
|
+
* @param trackId - The track ID being displayed
|
|
40
|
+
* @param viewId - Unique identifier for the view/component displaying this track
|
|
41
|
+
* @param options - Optional view configuration for adaptive streaming
|
|
42
|
+
* @param options.width - Initial view width in pixels
|
|
43
|
+
* @param options.height - Initial view height in pixels
|
|
44
|
+
* @param options.visible - Initial visibility state (default: true)
|
|
45
|
+
* @param options.onReady - Callback invoked when track becomes ready (if not immediately available)
|
|
46
|
+
* @returns Stream URL for the video view, or null if track not ready yet
|
|
47
|
+
*/
|
|
48
|
+
registerTrackView(trackId: string, viewId: string, options?: {
|
|
49
|
+
width?: number;
|
|
50
|
+
height?: number;
|
|
51
|
+
visible?: boolean;
|
|
52
|
+
onReady?: (streamUrl: string) => void;
|
|
53
|
+
}): string | null;
|
|
54
|
+
/**
|
|
55
|
+
* Unregister a track view.
|
|
56
|
+
* Call this when the component unmounts or stops displaying the track.
|
|
57
|
+
*
|
|
58
|
+
* @param trackId - The track ID
|
|
59
|
+
* @param viewId - The view identifier (optional, unregisters all views for this track if not provided)
|
|
60
|
+
*/
|
|
61
|
+
unregisterTrackView(trackId: string, viewId?: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Update the dimensions of a registered track view.
|
|
64
|
+
* Call this when the view layout changes (e.g., onLayout in React Native).
|
|
65
|
+
*
|
|
66
|
+
* @param trackId - The track ID
|
|
67
|
+
* @param viewId - The view identifier
|
|
68
|
+
* @param width - New width in pixels
|
|
69
|
+
* @param height - New height in pixels
|
|
70
|
+
*/
|
|
71
|
+
updateTrackViewLayout(trackId: string, viewId: string, width: number, height: number): void;
|
|
72
|
+
/**
|
|
73
|
+
* Update the visibility of a registered track view.
|
|
74
|
+
* Call this when the view visibility changes (e.g., scrolled off screen).
|
|
75
|
+
*
|
|
76
|
+
* @param trackId - The track ID
|
|
77
|
+
* @param viewId - The view identifier
|
|
78
|
+
* @param visible - Whether the view is visible
|
|
79
|
+
*/
|
|
80
|
+
updateTrackViewVisibility(trackId: string, viewId: string, visible: boolean): void;
|
|
81
|
+
/**
|
|
82
|
+
* Cleanup all resources and pending callbacks.
|
|
83
|
+
*/
|
|
84
|
+
destroy(): void;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=track-attachment-adapter.port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-attachment-adapter.port.d.ts","sourceRoot":"","sources":["../../../../src/core/ports/outbound/track-attachment-adapter.port.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,sBAAsB;IAKrC;;;;;;;OAOG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAExD;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAMzD;;;;;;;;;;;;OAYG;IACH,iBAAiB,CACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;KACtC,GACA,MAAM,GAAG,IAAI,CAAA;IAEhB;;;;;;OAMG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAE3D;;;;;;;;OAQG;IACH,qBAAqB,CACnB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,IAAI,CAAA;IAEP;;;;;;;OAOG;IACH,yBAAyB,CACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GACf,IAAI,CAAA;IAMP;;OAEG;IACH,OAAO,IAAI,IAAI,CAAA;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-attachment-adapter.port.js","sourceRoot":"","sources":["../../../../src/core/ports/outbound/track-attachment-adapter.port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ProviderType } from './types/vroom.types';
|
|
2
|
+
import type { ProviderAdapterFactory } from './ports/outbound/provider-adapter-factory.port';
|
|
3
|
+
/**
|
|
4
|
+
* Register a provider adapter factory.
|
|
5
|
+
*
|
|
6
|
+
* Call this before using Vroom.connect() with that provider.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerProvider(provider: ProviderType, factory: ProviderAdapterFactory): void;
|
|
9
|
+
/**
|
|
10
|
+
* Get a registered provider adapter factory.
|
|
11
|
+
*
|
|
12
|
+
* @internal Used by Vroom class to create adapters
|
|
13
|
+
*/
|
|
14
|
+
export declare function getProviderFactory(provider: ProviderType): ProviderAdapterFactory | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Check if a provider is registered.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isProviderRegistered(provider: ProviderType): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Get all registered provider types.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getRegisteredProviders(): ProviderType[];
|
|
23
|
+
/**
|
|
24
|
+
* Clear all registered providers.
|
|
25
|
+
*
|
|
26
|
+
* @internal Used for testing
|
|
27
|
+
*/
|
|
28
|
+
export declare function clearProviderRegistry(): void;
|
|
29
|
+
//# sourceMappingURL=provider-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-registry.d.ts","sourceRoot":"","sources":["../../src/core/provider-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAA;AAY5F;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,sBAAsB,GAC9B,IAAI,CAEN;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,GACrB,sBAAsB,GAAG,SAAS,CAEpC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAEpE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,YAAY,EAAE,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry for provider adapter factories.
|
|
3
|
+
*
|
|
4
|
+
* Maintains mapping between provider names and their factory implementations.
|
|
5
|
+
* Allows the core to create adapters without importing concrete implementations,
|
|
6
|
+
* following Hexagonal Architecture (dependency inversion).
|
|
7
|
+
*/
|
|
8
|
+
const providerRegistry = new Map();
|
|
9
|
+
/**
|
|
10
|
+
* Register a provider adapter factory.
|
|
11
|
+
*
|
|
12
|
+
* Call this before using Vroom.connect() with that provider.
|
|
13
|
+
*/
|
|
14
|
+
export function registerProvider(provider, factory) {
|
|
15
|
+
providerRegistry.set(provider, factory);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get a registered provider adapter factory.
|
|
19
|
+
*
|
|
20
|
+
* @internal Used by Vroom class to create adapters
|
|
21
|
+
*/
|
|
22
|
+
export function getProviderFactory(provider) {
|
|
23
|
+
return providerRegistry.get(provider);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if a provider is registered.
|
|
27
|
+
*/
|
|
28
|
+
export function isProviderRegistered(provider) {
|
|
29
|
+
return providerRegistry.has(provider);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get all registered provider types.
|
|
33
|
+
*/
|
|
34
|
+
export function getRegisteredProviders() {
|
|
35
|
+
return Array.from(providerRegistry.keys());
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Clear all registered providers.
|
|
39
|
+
*
|
|
40
|
+
* @internal Used for testing
|
|
41
|
+
*/
|
|
42
|
+
export function clearProviderRegistry() {
|
|
43
|
+
providerRegistry.clear();
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=provider-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/core/provider-registry.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAwC,CAAA;AAExE;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAsB,EACtB,OAA+B;IAE/B,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAsB;IAEtB,OAAO,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,OAAO,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAA;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,gBAAgB,CAAC,KAAK,EAAE,CAAA;AAC1B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base service class that all services extend.
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - Lifecycle management (destroy)
|
|
6
|
+
* - Common interface for Session to manage services
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class BaseService {
|
|
9
|
+
/**
|
|
10
|
+
* Cleanup resources when service is destroyed.
|
|
11
|
+
* Called automatically by Session.disconnect()
|
|
12
|
+
*/
|
|
13
|
+
abstract destroy(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=base.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/base.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,8BAAsB,WAAW;IAC/B;;;OAGG;IACH,QAAQ,CAAC,OAAO,IAAI,IAAI;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../src/core/services/base.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,OAAgB,WAAW;CAMhC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { RecordingAdapter } from '../ports/outbound/recording-adapter.port';
|
|
2
|
+
import type { RecordingStartOptions, RecordingStatus } from '../types/recording.types';
|
|
3
|
+
import { type RecordingEventName, type RecordingEventMap } from '../types/recording.types';
|
|
4
|
+
import { BaseService } from './base.service';
|
|
5
|
+
/**
|
|
6
|
+
* Recording service for session recording control.
|
|
7
|
+
*
|
|
8
|
+
* This service has its own event system completely separate from Session events.
|
|
9
|
+
* Use `session.recording.on(RecordingEvent.Status, ...)` to listen to recording events.
|
|
10
|
+
*
|
|
11
|
+
* Recording requires:
|
|
12
|
+
* - "recording" feature in sessionToken feat[]
|
|
13
|
+
* - "host" or "moderator" role for start/stop operations
|
|
14
|
+
*/
|
|
15
|
+
export declare class RecordingService extends BaseService {
|
|
16
|
+
private recordingAdapter;
|
|
17
|
+
private eventHandlers;
|
|
18
|
+
private unsubscribes;
|
|
19
|
+
constructor(recordingAdapter: RecordingAdapter);
|
|
20
|
+
/**
|
|
21
|
+
* Start recording the session.
|
|
22
|
+
* @param options - Recording options (layout, audioOnly, resolution)
|
|
23
|
+
* @returns Recording ID
|
|
24
|
+
* @throws RecordingStartError if recording fails to start
|
|
25
|
+
*/
|
|
26
|
+
start(options?: RecordingStartOptions): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Stop recording.
|
|
29
|
+
* @param recordingId - ID of the recording to stop
|
|
30
|
+
*/
|
|
31
|
+
stop(recordingId: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Get recording status.
|
|
34
|
+
* @param recordingId - ID of the recording
|
|
35
|
+
* @returns Recording status
|
|
36
|
+
*/
|
|
37
|
+
getStatus(recordingId: string): Promise<RecordingStatus>;
|
|
38
|
+
/** Register an event handler for recording events. */
|
|
39
|
+
on<E extends RecordingEventName>(event: E, handler: RecordingEventMap[E]): void;
|
|
40
|
+
/** Remove an event handler for recording events. */
|
|
41
|
+
off<E extends RecordingEventName>(event?: E, handler?: RecordingEventMap[E]): void;
|
|
42
|
+
/**
|
|
43
|
+
* Cleanup resources
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
destroy(): void;
|
|
47
|
+
private setupEventListeners;
|
|
48
|
+
private emit;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=recording.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/recording.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAChF,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AACtF,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,aAAa,CAAoD;IACzE,OAAO,CAAC,YAAY,CAAqB;gBAE7B,gBAAgB,EAAE,gBAAgB;IAM9C;;;;;OAKG;IACG,KAAK,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7D;;;OAGG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C;;;;OAIG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAI9D,sDAAsD;IACtD,EAAE,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;IAO/E,oDAAoD;IACpD,GAAG,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;IAclF;;;OAGG;IACH,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,IAAI;CAMb"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { RecordingEvent, } from '../types/recording.types';
|
|
2
|
+
import { BaseService } from './base.service';
|
|
3
|
+
/**
|
|
4
|
+
* Recording service for session recording control.
|
|
5
|
+
*
|
|
6
|
+
* This service has its own event system completely separate from Session events.
|
|
7
|
+
* Use `session.recording.on(RecordingEvent.Status, ...)` to listen to recording events.
|
|
8
|
+
*
|
|
9
|
+
* Recording requires:
|
|
10
|
+
* - "recording" feature in sessionToken feat[]
|
|
11
|
+
* - "host" or "moderator" role for start/stop operations
|
|
12
|
+
*/
|
|
13
|
+
export class RecordingService extends BaseService {
|
|
14
|
+
constructor(recordingAdapter) {
|
|
15
|
+
super();
|
|
16
|
+
this.eventHandlers = new Map();
|
|
17
|
+
this.unsubscribes = [];
|
|
18
|
+
this.recordingAdapter = recordingAdapter;
|
|
19
|
+
this.setupEventListeners();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Start recording the session.
|
|
23
|
+
* @param options - Recording options (layout, audioOnly, resolution)
|
|
24
|
+
* @returns Recording ID
|
|
25
|
+
* @throws RecordingStartError if recording fails to start
|
|
26
|
+
*/
|
|
27
|
+
async start(options) {
|
|
28
|
+
return this.recordingAdapter.start(options);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Stop recording.
|
|
32
|
+
* @param recordingId - ID of the recording to stop
|
|
33
|
+
*/
|
|
34
|
+
async stop(recordingId) {
|
|
35
|
+
return this.recordingAdapter.stop(recordingId);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get recording status.
|
|
39
|
+
* @param recordingId - ID of the recording
|
|
40
|
+
* @returns Recording status
|
|
41
|
+
*/
|
|
42
|
+
async getStatus(recordingId) {
|
|
43
|
+
return this.recordingAdapter.getStatus(recordingId);
|
|
44
|
+
}
|
|
45
|
+
/** Register an event handler for recording events. */
|
|
46
|
+
on(event, handler) {
|
|
47
|
+
if (!this.eventHandlers.has(event)) {
|
|
48
|
+
this.eventHandlers.set(event, new Set());
|
|
49
|
+
}
|
|
50
|
+
this.eventHandlers.get(event).add(handler);
|
|
51
|
+
}
|
|
52
|
+
/** Remove an event handler for recording events. */
|
|
53
|
+
off(event, handler) {
|
|
54
|
+
if (!event) {
|
|
55
|
+
this.eventHandlers.clear();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (!handler) {
|
|
59
|
+
this.eventHandlers.delete(event);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.eventHandlers.get(event)?.delete(handler);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Cleanup resources
|
|
66
|
+
* @internal
|
|
67
|
+
*/
|
|
68
|
+
destroy() {
|
|
69
|
+
this.unsubscribes.forEach(unsubscribe => unsubscribe());
|
|
70
|
+
this.unsubscribes = [];
|
|
71
|
+
this.eventHandlers.clear();
|
|
72
|
+
this.recordingAdapter.destroy();
|
|
73
|
+
}
|
|
74
|
+
setupEventListeners() {
|
|
75
|
+
// Subscribe to recording status changes from adapter
|
|
76
|
+
const unsubscribe = this.recordingAdapter.onStatusChanged((event) => {
|
|
77
|
+
// Emit through service's own event emitter
|
|
78
|
+
this.emit(RecordingEvent.Status, event);
|
|
79
|
+
});
|
|
80
|
+
this.unsubscribes.push(unsubscribe);
|
|
81
|
+
}
|
|
82
|
+
emit(event, payload) {
|
|
83
|
+
const handlers = this.eventHandlers.get(event);
|
|
84
|
+
if (handlers) {
|
|
85
|
+
handlers.forEach((handler) => handler(payload));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=recording.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.service.js","sourceRoot":"","sources":["../../../src/core/services/recording.service.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,GAGf,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;;;;;;;GASG;AACH,MAAM,OAAO,gBAAiB,SAAQ,WAAW;IAK/C,YAAY,gBAAkC;QAC5C,KAAK,EAAE,CAAA;QAJD,kBAAa,GAA2C,IAAI,GAAG,EAAE,CAAA;QACjE,iBAAY,GAAmB,EAAE,CAAA;QAIvC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;QACxC,IAAI,CAAC,mBAAmB,EAAE,CAAA;IAC5B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,CAAC,OAA+B;QACzC,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC7C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB;QAC5B,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAChD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,WAAmB;QACjC,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IACrD,CAAC;IAED,sDAAsD;IACtD,EAAE,CAA+B,KAAQ,EAAE,OAA6B;QACtE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;QAC1C,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC7C,CAAC;IAED,oDAAoD;IACpD,GAAG,CAA+B,KAAS,EAAE,OAA8B;QACzE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;YAC1B,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAChC,OAAM;QACR,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAChD,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QACvD,IAAI,CAAC,YAAY,GAAG,EAAE,CAAA;QACtB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;QAC1B,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAA;IACjC,CAAC;IAEO,mBAAmB;QACzB,qDAAqD;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,EAAE;YAClE,2CAA2C;YAC3C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACrC,CAAC;IAEO,IAAI,CAA+B,KAAQ,EAAE,OAA4C;QAC/F,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { StatsAdapter } from '../ports/outbound/stats-adapter.port';
|
|
2
|
+
import type { NetworkQuality } from '../types/events.types';
|
|
3
|
+
import { type StatsEventName, type StatsEventMap } from '../types/stats.types';
|
|
4
|
+
import { BaseService } from './base.service';
|
|
5
|
+
/**
|
|
6
|
+
* Stats service for network quality and RTC statistics.
|
|
7
|
+
*
|
|
8
|
+
* This service has its own event system completely separate from Session events.
|
|
9
|
+
* Use `session.stats.on(StatsEvent.NetworkQuality, ...)` to listen to stats events.
|
|
10
|
+
*/
|
|
11
|
+
export declare class StatsService extends BaseService {
|
|
12
|
+
private statsAdapter;
|
|
13
|
+
private eventHandlers;
|
|
14
|
+
private unsubscribes;
|
|
15
|
+
constructor(statsAdapter: StatsAdapter);
|
|
16
|
+
/** Get current network quality. */
|
|
17
|
+
getNetworkQuality(): NetworkQuality;
|
|
18
|
+
/** Get native RTC stats report. */
|
|
19
|
+
getStats(): Promise<RTCStatsReport>;
|
|
20
|
+
/** Register an event handler for stats events. */
|
|
21
|
+
on<E extends StatsEventName>(event: E, handler: StatsEventMap[E]): void;
|
|
22
|
+
/** Remove an event handler for stats events. */
|
|
23
|
+
off<E extends StatsEventName>(event?: E, handler?: StatsEventMap[E]): void;
|
|
24
|
+
/**
|
|
25
|
+
* Cleanup resources
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
destroy(): void;
|
|
29
|
+
private setupEventListeners;
|
|
30
|
+
private emit;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=stats.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/stats.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,aAAa,CAAgD;IACrE,OAAO,CAAC,YAAY,CAAqB;gBAE7B,YAAY,EAAE,YAAY;IAMtC,mCAAmC;IACnC,iBAAiB,IAAI,cAAc;IAInC,mCAAmC;IAC7B,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAIzC,kDAAkD;IAClD,EAAE,CAAC,CAAC,SAAS,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IAOvE,gDAAgD;IAChD,GAAG,CAAC,CAAC,SAAS,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;IAc1E;;;OAGG;IACH,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,IAAI;CAMb"}
|