@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,69 @@
1
+ import { StatsEvent, } from '../types/stats.types';
2
+ import { BaseService } from './base.service';
3
+ /**
4
+ * Stats service for network quality and RTC statistics.
5
+ *
6
+ * This service has its own event system completely separate from Session events.
7
+ * Use `session.stats.on(StatsEvent.NetworkQuality, ...)` to listen to stats events.
8
+ */
9
+ export class StatsService extends BaseService {
10
+ constructor(statsAdapter) {
11
+ super();
12
+ this.eventHandlers = new Map();
13
+ this.unsubscribes = [];
14
+ this.statsAdapter = statsAdapter;
15
+ this.setupEventListeners();
16
+ }
17
+ /** Get current network quality. */
18
+ getNetworkQuality() {
19
+ return this.statsAdapter.getNetworkQuality();
20
+ }
21
+ /** Get native RTC stats report. */
22
+ async getStats() {
23
+ return this.statsAdapter.getStats();
24
+ }
25
+ /** Register an event handler for stats events. */
26
+ on(event, handler) {
27
+ if (!this.eventHandlers.has(event)) {
28
+ this.eventHandlers.set(event, new Set());
29
+ }
30
+ this.eventHandlers.get(event).add(handler);
31
+ }
32
+ /** Remove an event handler for stats events. */
33
+ off(event, handler) {
34
+ if (!event) {
35
+ this.eventHandlers.clear();
36
+ return;
37
+ }
38
+ if (!handler) {
39
+ this.eventHandlers.delete(event);
40
+ return;
41
+ }
42
+ this.eventHandlers.get(event)?.delete(handler);
43
+ }
44
+ /**
45
+ * Cleanup resources
46
+ * @internal
47
+ */
48
+ destroy() {
49
+ this.unsubscribes.forEach(unsubscribe => unsubscribe());
50
+ this.unsubscribes = [];
51
+ this.eventHandlers.clear();
52
+ this.statsAdapter.destroy();
53
+ }
54
+ setupEventListeners() {
55
+ // Subscribe to network quality changes from stats adapter
56
+ const unsubscribe = this.statsAdapter.onNetworkQualityChanged((event) => {
57
+ // Emit through service's own event emitter
58
+ this.emit(StatsEvent.NetworkQuality, event);
59
+ });
60
+ this.unsubscribes.push(unsubscribe);
61
+ }
62
+ emit(event, payload) {
63
+ const handlers = this.eventHandlers.get(event);
64
+ if (handlers) {
65
+ handlers.forEach((handler) => handler(payload));
66
+ }
67
+ }
68
+ }
69
+ //# sourceMappingURL=stats.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.service.js","sourceRoot":"","sources":["../../../src/core/services/stats.service.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,UAAU,GAGX,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,OAAO,YAAa,SAAQ,WAAW;IAK3C,YAAY,YAA0B;QACpC,KAAK,EAAE,CAAA;QAJD,kBAAa,GAAuC,IAAI,GAAG,EAAE,CAAA;QAC7D,iBAAY,GAAmB,EAAE,CAAA;QAIvC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,mBAAmB,EAAE,CAAA;IAC5B,CAAC;IAED,mCAAmC;IACnC,iBAAiB;QACf,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAA;IAC9C,CAAC;IAED,mCAAmC;IACnC,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAA;IACrC,CAAC;IAED,kDAAkD;IAClD,EAAE,CAA2B,KAAQ,EAAE,OAAyB;QAC9D,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,gDAAgD;IAChD,GAAG,CAA2B,KAAS,EAAE,OAA0B;QACjE,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,YAAY,CAAC,OAAO,EAAE,CAAA;IAC7B,CAAC;IAEO,mBAAmB;QACzB,0DAA0D;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,EAAE;YACtE,2CAA2C;YAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACrC,CAAC;IAEO,IAAI,CAA2B,KAAQ,EAAE,OAAwC;QACvF,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,142 @@
1
+ import type { ProviderAdapter } from './ports/outbound/provider-adapter.port';
2
+ import type { TrackAttachmentAdapter } from './ports/outbound/track-attachment-adapter.port';
3
+ import type { ConnectParams, SessionState } from './types/session.types';
4
+ import type { Participant } from './types/participant.types';
5
+ import type { Track } from './types/track.types';
6
+ import type { SwitchDeviceOptions, ScreenShareOptions, DeviceKind } from './types/media.types';
7
+ import { type SessionEventName, type EventHandlers } from './types/events.types';
8
+ import { StatsService } from './services/stats.service';
9
+ import { RecordingService } from './services/recording.service';
10
+ type EventHandler<E extends SessionEventName> = NonNullable<EventHandlers[E]>;
11
+ /**
12
+ * Session represents an active RTC connection.
13
+ *
14
+ * Created by `Vroom.connect()`, provides methods for:
15
+ * - Media control (mic, camera, screen share)
16
+ * - Participant management
17
+ * - Event handling
18
+ */
19
+ export declare class Session {
20
+ private state;
21
+ private adapter;
22
+ private params;
23
+ private services;
24
+ private tokenService;
25
+ private handleConnected;
26
+ private handleDisconnected;
27
+ private handleReconnecting;
28
+ private handleReconnected;
29
+ /** Stats service for network quality and RTC statistics. */
30
+ stats: StatsService;
31
+ /** Recording service for session recording (optional - requires permissions). */
32
+ recording?: RecordingService;
33
+ /**
34
+ * Track attachment adapter for attaching tracks to media elements.
35
+ * Use this instead of setting srcObject directly to ensure proper
36
+ * provider integration (e.g., LiveKit adaptive streaming).
37
+ */
38
+ trackAttachment: TrackAttachmentAdapter;
39
+ constructor(adapter: ProviderAdapter, params: ConnectParams, sessionToken: string);
40
+ /**
41
+ * Get current session state
42
+ */
43
+ getState(): SessionState;
44
+ /**
45
+ * Disconnect from session and clean up resources
46
+ *
47
+ * Behavior:
48
+ * 1. Unpublish all local tracks (handled by adapter)
49
+ * 2. Disconnect from session
50
+ * 3. Clean up event listeners (handled by adapter)
51
+ * 4. Update state to "disconnected"
52
+ *
53
+ * Safe to call multiple times - subsequent calls are no-ops.
54
+ */
55
+ disconnect(): Promise<void>;
56
+ /**
57
+ * Disable microphone
58
+ * @throws VroomError if operation fails
59
+ */
60
+ disableMic(): Promise<void>;
61
+ /**
62
+ * Enable microphone
63
+ * @throws VroomError if operation fails
64
+ */
65
+ enableMic(): Promise<void>;
66
+ /**
67
+ * Disable camera
68
+ * @throws VroomError if operation fails
69
+ */
70
+ disableCamera(): Promise<void>;
71
+ /**
72
+ * Enable camera
73
+ * @throws VroomError if operation fails
74
+ */
75
+ enableCamera(): Promise<void>;
76
+ /**
77
+ * Switch audio/video input or output device.
78
+ *
79
+ * @param options - Device IDs to switch to
80
+ * @throws VroomError with code `E_MEDIA` if device switch fails
81
+ * @throws VroomError with code `E_UNSUPPORTED_FEATURE` if audioOutputId used on unsupported browser
82
+ */
83
+ switchDevice(options: SwitchDeviceOptions): Promise<void>;
84
+ /**
85
+ * Get currently active device ID for a given kind.
86
+ *
87
+ * @param kind - Device kind to query
88
+ * @returns Device ID or undefined if not set
89
+ */
90
+ getActiveDevice(kind: DeviceKind): string | undefined;
91
+ /**
92
+ * Start screen sharing
93
+ */
94
+ startScreenShare(_options?: ScreenShareOptions): Promise<void>;
95
+ /**
96
+ * Stop screen sharing
97
+ */
98
+ stopScreenShare(): Promise<void>;
99
+ /**
100
+ * Publish a custom track to the session
101
+ * @param track - MediaStreamTrack to publish (audio or video)
102
+ * @returns Published Track object
103
+ */
104
+ publishTrack(track: MediaStreamTrack): Promise<Track>;
105
+ /**
106
+ * Unpublish a track from the session
107
+ * @param trackId - ID of the track to unpublish
108
+ */
109
+ unpublishTrack(trackId: string): Promise<void>;
110
+ /**
111
+ * Get all participants in the session
112
+ */
113
+ getParticipants(): Participant[];
114
+ /**
115
+ * Get all tracks in the session
116
+ */
117
+ getTracks(): Track[];
118
+ /**
119
+ * Register event listener
120
+ */
121
+ on<E extends SessionEventName>(event: E, handler: EventHandler<E>): this;
122
+ /**
123
+ * Remove event listener
124
+ */
125
+ off<E extends SessionEventName>(event: E, handler?: EventHandler<E>): this;
126
+ /**
127
+ * Called by Vroom.connect() to initiate connection
128
+ * @internal
129
+ */
130
+ _connect(token: string, endpoint: string): Promise<void>;
131
+ /**
132
+ * Initialize all services based on available adapters and permissions
133
+ * @private
134
+ */
135
+ private initializeServices;
136
+ /**
137
+ * Setup event handlers from ConnectParams
138
+ */
139
+ private setupEventHandlers;
140
+ }
141
+ export {};
142
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,248 @@
1
+ import { SessionEvent } from './types/events.types';
2
+ import { StatsService } from './services/stats.service';
3
+ import { RecordingService } from './services/recording.service';
4
+ import { TokenService } from './utils/token';
5
+ /**
6
+ * Session represents an active RTC connection.
7
+ *
8
+ * Created by `Vroom.connect()`, provides methods for:
9
+ * - Media control (mic, camera, screen share)
10
+ * - Participant management
11
+ * - Event handling
12
+ */
13
+ export class Session {
14
+ constructor(adapter, params, sessionToken) {
15
+ this.state = 'idle';
16
+ this.services = []; // Track all services for cleanup
17
+ // State handlers - stored as class properties for proper cleanup
18
+ this.handleConnected = () => {
19
+ this.state = 'connected';
20
+ };
21
+ this.handleDisconnected = (event) => {
22
+ // Use 'ended' for permanent disconnections, 'disconnected' for recoverable ones
23
+ if (event.reason === 'room-deleted' || event.reason === 'participant-removed') {
24
+ this.state = 'ended';
25
+ }
26
+ else {
27
+ this.state = 'disconnected';
28
+ }
29
+ };
30
+ this.handleReconnecting = () => {
31
+ this.state = 'reconnecting';
32
+ };
33
+ this.handleReconnected = () => {
34
+ this.state = 'connected';
35
+ };
36
+ this.adapter = adapter;
37
+ this.params = params;
38
+ this.tokenService = new TokenService(sessionToken);
39
+ // Services and event handlers will be initialized in _connect()
40
+ }
41
+ // ============ Lifecycle ============
42
+ /**
43
+ * Get current session state
44
+ */
45
+ getState() {
46
+ return this.state;
47
+ }
48
+ /**
49
+ * Disconnect from session and clean up resources
50
+ *
51
+ * Behavior:
52
+ * 1. Unpublish all local tracks (handled by adapter)
53
+ * 2. Disconnect from session
54
+ * 3. Clean up event listeners (handled by adapter)
55
+ * 4. Update state to "disconnected"
56
+ *
57
+ * Safe to call multiple times - subsequent calls are no-ops.
58
+ */
59
+ async disconnect() {
60
+ // Guard against double-disconnect
61
+ if (this.state === 'disconnected' || this.state === 'ended') {
62
+ return;
63
+ }
64
+ // Cleanup all services
65
+ this.services.forEach(service => service.destroy());
66
+ this.services = [];
67
+ // Cleanup track attachment adapter
68
+ this.trackAttachment?.destroy();
69
+ // Disconnect (adapter emits Disconnected event, user handlers receive it)
70
+ await this.adapter.disconnect();
71
+ this.state = 'disconnected';
72
+ // Cleanup internal state handlers AFTER disconnect
73
+ this.adapter.off(SessionEvent.Connected, this.handleConnected);
74
+ this.adapter.off(SessionEvent.Disconnected, this.handleDisconnected);
75
+ this.adapter.off(SessionEvent.Reconnecting, this.handleReconnecting);
76
+ this.adapter.off(SessionEvent.Reconnected, this.handleReconnected);
77
+ }
78
+ // ============ Media Control ============
79
+ /**
80
+ * Disable microphone
81
+ * @throws VroomError if operation fails
82
+ */
83
+ async disableMic() {
84
+ await this.adapter.muteTrack('audio');
85
+ }
86
+ /**
87
+ * Enable microphone
88
+ * @throws VroomError if operation fails
89
+ */
90
+ async enableMic() {
91
+ await this.adapter.unmuteTrack('audio');
92
+ }
93
+ /**
94
+ * Disable camera
95
+ * @throws VroomError if operation fails
96
+ */
97
+ async disableCamera() {
98
+ await this.adapter.muteTrack('video');
99
+ }
100
+ /**
101
+ * Enable camera
102
+ * @throws VroomError if operation fails
103
+ */
104
+ async enableCamera() {
105
+ await this.adapter.unmuteTrack('video');
106
+ }
107
+ /**
108
+ * Switch audio/video input or output device.
109
+ *
110
+ * @param options - Device IDs to switch to
111
+ * @throws VroomError with code `E_MEDIA` if device switch fails
112
+ * @throws VroomError with code `E_UNSUPPORTED_FEATURE` if audioOutputId used on unsupported browser
113
+ */
114
+ async switchDevice(options) {
115
+ return this.adapter.switchDevice(options);
116
+ }
117
+ /**
118
+ * Get currently active device ID for a given kind.
119
+ *
120
+ * @param kind - Device kind to query
121
+ * @returns Device ID or undefined if not set
122
+ */
123
+ getActiveDevice(kind) {
124
+ return this.adapter.getActiveDevice(kind);
125
+ }
126
+ // ============ Screen Sharing ============
127
+ /**
128
+ * Start screen sharing
129
+ */
130
+ async startScreenShare(_options) {
131
+ // TODO: Implement screen sharing
132
+ }
133
+ /**
134
+ * Stop screen sharing
135
+ */
136
+ async stopScreenShare() {
137
+ // TODO: Implement screen sharing
138
+ }
139
+ // ============ Track Publishing ============
140
+ /**
141
+ * Publish a custom track to the session
142
+ * @param track - MediaStreamTrack to publish (audio or video)
143
+ * @returns Published Track object
144
+ */
145
+ async publishTrack(track) {
146
+ return this.adapter.publishTrack(track);
147
+ }
148
+ /**
149
+ * Unpublish a track from the session
150
+ * @param trackId - ID of the track to unpublish
151
+ */
152
+ async unpublishTrack(trackId) {
153
+ return this.adapter.unpublishTrack(trackId);
154
+ }
155
+ // ============ Participants ============
156
+ /**
157
+ * Get all participants in the session
158
+ */
159
+ getParticipants() {
160
+ return this.adapter.getParticipants();
161
+ }
162
+ // ============ Tracks ============
163
+ /**
164
+ * Get all tracks in the session
165
+ */
166
+ getTracks() {
167
+ return this.adapter.getTracks();
168
+ }
169
+ // ============ Events ============
170
+ /**
171
+ * Register event listener
172
+ */
173
+ on(event, handler) {
174
+ this.adapter.on(event, handler);
175
+ return this;
176
+ }
177
+ /**
178
+ * Remove event listener
179
+ */
180
+ off(event, handler) {
181
+ this.adapter.off(event, handler);
182
+ return this;
183
+ }
184
+ // ============ Internal ============
185
+ /**
186
+ * Called by Vroom.connect() to initiate connection
187
+ * @internal
188
+ */
189
+ async _connect(token, endpoint) {
190
+ this.state = 'connecting';
191
+ // Register internal state handlers FIRST (before user handlers)
192
+ this.adapter.on(SessionEvent.Connected, this.handleConnected);
193
+ this.adapter.on(SessionEvent.Disconnected, this.handleDisconnected);
194
+ this.adapter.on(SessionEvent.Reconnecting, this.handleReconnecting);
195
+ this.adapter.on(SessionEvent.Reconnected, this.handleReconnected);
196
+ // Register user event handlers AFTER internal handlers
197
+ this.setupEventHandlers();
198
+ await this.adapter.connect({
199
+ roomName: this.params.roomName,
200
+ token,
201
+ endpoint,
202
+ media: this.params.media,
203
+ user: this.params.user,
204
+ });
205
+ // Initialize all services after connection
206
+ this.initializeServices();
207
+ }
208
+ /**
209
+ * Initialize all services based on available adapters and permissions
210
+ * @private
211
+ */
212
+ initializeServices() {
213
+ const permissions = this.tokenService.getPermissions();
214
+ const adapters = this.adapter.createServiceAdapters(permissions);
215
+ // Stats (required - always available)
216
+ this.stats = new StatsService(adapters.stats);
217
+ this.services.push(this.stats);
218
+ // Track attachment (required - always available)
219
+ this.trackAttachment = adapters.trackAttachment;
220
+ // Recording (optional - requires "recording" feature + host/moderator role)
221
+ if (adapters.recording) {
222
+ this.recording = new RecordingService(adapters.recording);
223
+ this.services.push(this.recording);
224
+ }
225
+ // Future services will be added here based on permissions:
226
+ // if (adapters.chat) {
227
+ // this.chat = new ChatService(adapters.chat)
228
+ // this.services.push(this.chat)
229
+ // }
230
+ }
231
+ /**
232
+ * Setup event handlers from ConnectParams
233
+ */
234
+ setupEventHandlers() {
235
+ const handlers = this.params.eventHandlers;
236
+ if (!handlers)
237
+ return;
238
+ // Register all provided event handlers
239
+ const eventNames = Object.keys(handlers);
240
+ for (const event of eventNames) {
241
+ const handler = handlers[event];
242
+ if (handler) {
243
+ this.adapter.on(event, handler);
244
+ }
245
+ }
246
+ }
247
+ }
248
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}