@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.
Files changed (166) hide show
  1. package/README.md +179 -0
  2. package/dist/adapters/livekit/api/recording.api.d.ts +15 -0
  3. package/dist/adapters/livekit/api/recording.api.d.ts.map +1 -0
  4. package/dist/adapters/livekit/api/recording.api.js +61 -0
  5. package/dist/adapters/livekit/api/recording.api.js.map +1 -0
  6. package/dist/adapters/livekit/index.d.ts +18 -0
  7. package/dist/adapters/livekit/index.d.ts.map +1 -0
  8. package/dist/adapters/livekit/index.js +26 -0
  9. package/dist/adapters/livekit/index.js.map +1 -0
  10. package/dist/adapters/livekit/livekit.adapter.d.ts +85 -0
  11. package/dist/adapters/livekit/livekit.adapter.d.ts.map +1 -0
  12. package/dist/adapters/livekit/livekit.adapter.js +531 -0
  13. package/dist/adapters/livekit/livekit.adapter.js.map +1 -0
  14. package/dist/adapters/livekit/livekit.mapper.d.ts +36 -0
  15. package/dist/adapters/livekit/livekit.mapper.d.ts.map +1 -0
  16. package/dist/adapters/livekit/livekit.mapper.js +108 -0
  17. package/dist/adapters/livekit/livekit.mapper.js.map +1 -0
  18. package/dist/adapters/livekit/livekit.types.d.ts +22 -0
  19. package/dist/adapters/livekit/livekit.types.d.ts.map +1 -0
  20. package/dist/adapters/livekit/livekit.types.js +10 -0
  21. package/dist/adapters/livekit/livekit.types.js.map +1 -0
  22. package/dist/adapters/livekit/service-adapters/index.d.ts +4 -0
  23. package/dist/adapters/livekit/service-adapters/index.d.ts.map +1 -0
  24. package/dist/adapters/livekit/service-adapters/index.js +4 -0
  25. package/dist/adapters/livekit/service-adapters/index.js.map +1 -0
  26. package/dist/adapters/livekit/service-adapters/recording.adapter.d.ts +19 -0
  27. package/dist/adapters/livekit/service-adapters/recording.adapter.d.ts.map +1 -0
  28. package/dist/adapters/livekit/service-adapters/recording.adapter.js +30 -0
  29. package/dist/adapters/livekit/service-adapters/recording.adapter.js.map +1 -0
  30. package/dist/adapters/livekit/service-adapters/stats.adapter.d.ts +21 -0
  31. package/dist/adapters/livekit/service-adapters/stats.adapter.d.ts.map +1 -0
  32. package/dist/adapters/livekit/service-adapters/stats.adapter.js +54 -0
  33. package/dist/adapters/livekit/service-adapters/stats.adapter.js.map +1 -0
  34. package/dist/adapters/livekit/service-adapters/track-attachment.adapter.d.ts +79 -0
  35. package/dist/adapters/livekit/service-adapters/track-attachment.adapter.d.ts.map +1 -0
  36. package/dist/adapters/livekit/service-adapters/track-attachment.adapter.js +348 -0
  37. package/dist/adapters/livekit/service-adapters/track-attachment.adapter.js.map +1 -0
  38. package/dist/adapters/livekit/services/index.d.ts +3 -0
  39. package/dist/adapters/livekit/services/index.d.ts.map +1 -0
  40. package/dist/adapters/livekit/services/index.js +3 -0
  41. package/dist/adapters/livekit/services/index.js.map +1 -0
  42. package/dist/adapters/livekit/services/recording.service.d.ts +29 -0
  43. package/dist/adapters/livekit/services/recording.service.d.ts.map +1 -0
  44. package/dist/adapters/livekit/services/recording.service.js +34 -0
  45. package/dist/adapters/livekit/services/recording.service.js.map +1 -0
  46. package/dist/adapters/livekit/services/stats.service.d.ts +24 -0
  47. package/dist/adapters/livekit/services/stats.service.d.ts.map +1 -0
  48. package/dist/adapters/livekit/services/stats.service.js +56 -0
  49. package/dist/adapters/livekit/services/stats.service.js.map +1 -0
  50. package/dist/core/api/auth.api.d.ts +52 -0
  51. package/dist/core/api/auth.api.d.ts.map +1 -0
  52. package/dist/core/api/auth.api.js +59 -0
  53. package/dist/core/api/auth.api.js.map +1 -0
  54. package/dist/core/api/http.d.ts +86 -0
  55. package/dist/core/api/http.d.ts.map +1 -0
  56. package/dist/core/api/http.js +146 -0
  57. package/dist/core/api/http.js.map +1 -0
  58. package/dist/core/errors/error-codes.d.ts +43 -0
  59. package/dist/core/errors/error-codes.d.ts.map +1 -0
  60. package/dist/core/errors/error-codes.js +42 -0
  61. package/dist/core/errors/error-codes.js.map +1 -0
  62. package/dist/core/errors/vroom.error.d.ts +99 -0
  63. package/dist/core/errors/vroom.error.d.ts.map +1 -0
  64. package/dist/core/errors/vroom.error.js +141 -0
  65. package/dist/core/errors/vroom.error.js.map +1 -0
  66. package/dist/core/ports/outbound/provider-adapter-factory.port.d.ts +41 -0
  67. package/dist/core/ports/outbound/provider-adapter-factory.port.d.ts.map +1 -0
  68. package/dist/core/ports/outbound/provider-adapter-factory.port.js +2 -0
  69. package/dist/core/ports/outbound/provider-adapter-factory.port.js.map +1 -0
  70. package/dist/core/ports/outbound/provider-adapter.port.d.ts +130 -0
  71. package/dist/core/ports/outbound/provider-adapter.port.d.ts.map +1 -0
  72. package/dist/core/ports/outbound/provider-adapter.port.js +2 -0
  73. package/dist/core/ports/outbound/provider-adapter.port.js.map +1 -0
  74. package/dist/core/ports/outbound/recording-adapter.port.d.ts +40 -0
  75. package/dist/core/ports/outbound/recording-adapter.port.d.ts.map +1 -0
  76. package/dist/core/ports/outbound/recording-adapter.port.js +2 -0
  77. package/dist/core/ports/outbound/recording-adapter.port.js.map +1 -0
  78. package/dist/core/ports/outbound/stats-adapter.port.d.ts +31 -0
  79. package/dist/core/ports/outbound/stats-adapter.port.d.ts.map +1 -0
  80. package/dist/core/ports/outbound/stats-adapter.port.js +2 -0
  81. package/dist/core/ports/outbound/stats-adapter.port.js.map +1 -0
  82. package/dist/core/ports/outbound/track-attachment-adapter.port.d.ts +86 -0
  83. package/dist/core/ports/outbound/track-attachment-adapter.port.d.ts.map +1 -0
  84. package/dist/core/ports/outbound/track-attachment-adapter.port.js +2 -0
  85. package/dist/core/ports/outbound/track-attachment-adapter.port.js.map +1 -0
  86. package/dist/core/provider-registry.d.ts +29 -0
  87. package/dist/core/provider-registry.d.ts.map +1 -0
  88. package/dist/core/provider-registry.js +45 -0
  89. package/dist/core/provider-registry.js.map +1 -0
  90. package/dist/core/services/base.service.d.ts +15 -0
  91. package/dist/core/services/base.service.d.ts.map +1 -0
  92. package/dist/core/services/base.service.js +10 -0
  93. package/dist/core/services/base.service.js.map +1 -0
  94. package/dist/core/services/recording.service.d.ts +50 -0
  95. package/dist/core/services/recording.service.d.ts.map +1 -0
  96. package/dist/core/services/recording.service.js +89 -0
  97. package/dist/core/services/recording.service.js.map +1 -0
  98. package/dist/core/services/stats.service.d.ts +32 -0
  99. package/dist/core/services/stats.service.d.ts.map +1 -0
  100. package/dist/core/services/stats.service.js +69 -0
  101. package/dist/core/services/stats.service.js.map +1 -0
  102. package/dist/core/session.d.ts +142 -0
  103. package/dist/core/session.d.ts.map +1 -0
  104. package/dist/core/session.js +248 -0
  105. package/dist/core/session.js.map +1 -0
  106. package/dist/core/types/events.types.d.ts +263 -0
  107. package/dist/core/types/events.types.d.ts.map +1 -0
  108. package/dist/core/types/events.types.js +76 -0
  109. package/dist/core/types/events.types.js.map +1 -0
  110. package/dist/core/types/media.types.d.ts +81 -0
  111. package/dist/core/types/media.types.d.ts.map +1 -0
  112. package/dist/core/types/media.types.js +12 -0
  113. package/dist/core/types/media.types.js.map +1 -0
  114. package/dist/core/types/participant.types.d.ts +11 -0
  115. package/dist/core/types/participant.types.d.ts.map +1 -0
  116. package/dist/core/types/participant.types.js +2 -0
  117. package/dist/core/types/participant.types.js.map +1 -0
  118. package/dist/core/types/recording.types.d.ts +60 -0
  119. package/dist/core/types/recording.types.d.ts.map +1 -0
  120. package/dist/core/types/recording.types.js +7 -0
  121. package/dist/core/types/recording.types.js.map +1 -0
  122. package/dist/core/types/service-adapters.types.d.ts +46 -0
  123. package/dist/core/types/service-adapters.types.d.ts.map +1 -0
  124. package/dist/core/types/service-adapters.types.js +2 -0
  125. package/dist/core/types/service-adapters.types.js.map +1 -0
  126. package/dist/core/types/session.types.d.ts +57 -0
  127. package/dist/core/types/session.types.d.ts.map +1 -0
  128. package/dist/core/types/session.types.js +2 -0
  129. package/dist/core/types/session.types.js.map +1 -0
  130. package/dist/core/types/stats.types.d.ts +20 -0
  131. package/dist/core/types/stats.types.d.ts.map +1 -0
  132. package/dist/core/types/stats.types.js +7 -0
  133. package/dist/core/types/stats.types.js.map +1 -0
  134. package/dist/core/types/token.types.d.ts +82 -0
  135. package/dist/core/types/token.types.d.ts.map +1 -0
  136. package/dist/core/types/token.types.js +27 -0
  137. package/dist/core/types/token.types.js.map +1 -0
  138. package/dist/core/types/track.types.d.ts +39 -0
  139. package/dist/core/types/track.types.d.ts.map +1 -0
  140. package/dist/core/types/track.types.js +9 -0
  141. package/dist/core/types/track.types.js.map +1 -0
  142. package/dist/core/types/user.types.d.ts +23 -0
  143. package/dist/core/types/user.types.d.ts.map +1 -0
  144. package/dist/core/types/user.types.js +2 -0
  145. package/dist/core/types/user.types.js.map +1 -0
  146. package/dist/core/types/vroom.types.d.ts +86 -0
  147. package/dist/core/types/vroom.types.d.ts.map +1 -0
  148. package/dist/core/types/vroom.types.js +12 -0
  149. package/dist/core/types/vroom.types.js.map +1 -0
  150. package/dist/core/utils/token.d.ts +77 -0
  151. package/dist/core/utils/token.d.ts.map +1 -0
  152. package/dist/core/utils/token.js +127 -0
  153. package/dist/core/utils/token.js.map +1 -0
  154. package/dist/core/vroom.d.ts +90 -0
  155. package/dist/core/vroom.d.ts.map +1 -0
  156. package/dist/core/vroom.js +219 -0
  157. package/dist/core/vroom.js.map +1 -0
  158. package/dist/index.d.ts +25 -0
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +17 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/react-native.d.ts +21 -0
  163. package/dist/react-native.d.ts.map +1 -0
  164. package/dist/react-native.js +32 -0
  165. package/dist/react-native.js.map +1 -0
  166. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provider-adapter.port.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=recording-adapter.port.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stats-adapter.port.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=track-attachment-adapter.port.js.map
@@ -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,10 @@
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 class BaseService {
9
+ }
10
+ //# sourceMappingURL=base.service.js.map
@@ -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"}