@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,57 @@
1
+ import type { User } from './user.types';
2
+ import type { MediaOptions } from './media.types';
3
+ import type { EventHandlers } from './events.types';
4
+ /**
5
+ * Session type.
6
+ *
7
+ * - `group` - Multi-party call (SFU/MCU)
8
+ * - `p2p` - Peer-to-peer call (2 participants)
9
+ */
10
+ export type SessionType = 'group' | 'p2p';
11
+ /**
12
+ * Session connection state.
13
+ *
14
+ * - `idle` - Not connected
15
+ * - `connecting` - Connection in progress
16
+ * - `connected` - Successfully connected
17
+ * - `reconnecting` - Attempting to reconnect after disconnect
18
+ * - `disconnected` - Disconnected from session
19
+ * - `ended` - Session has ended
20
+ */
21
+ export type SessionState = 'idle' | 'connecting' | 'connected' | 'reconnecting' | 'disconnected' | 'ended';
22
+ /**
23
+ * Reconnect policy configuration
24
+ */
25
+ export interface ReconnectPolicy {
26
+ /** Max retry attempts (default: 5) */
27
+ maxRetries: number;
28
+ /** Backoff delay in ms (default: 1000) */
29
+ backoffMs: number;
30
+ }
31
+ /**
32
+ * Session options
33
+ */
34
+ export interface SessionOptions {
35
+ /** Auto-reconnect on disconnect (default: true) */
36
+ autoReconnect?: boolean;
37
+ /** Reconnect policy */
38
+ reconnectPolicy?: ReconnectPolicy;
39
+ }
40
+ /**
41
+ * Parameters for Vroom.connect()
42
+ */
43
+ export interface ConnectParams {
44
+ /** Room identifier */
45
+ roomName: string;
46
+ /** User info */
47
+ user: User;
48
+ /** Session type */
49
+ type: SessionType;
50
+ /** Initial media settings */
51
+ media?: MediaOptions;
52
+ /** Session options */
53
+ options?: SessionOptions;
54
+ /** Event handlers */
55
+ eventHandlers?: EventHandlers;
56
+ }
57
+ //# sourceMappingURL=session.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.types.d.ts","sourceRoot":"","sources":["../../../src/core/types/session.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEnD;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,KAAK,CAAA;AAEzC;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,cAAc,GAAG,OAAO,CAAA;AAE1G;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAA;IAClB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,uBAAuB;IACvB,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,mBAAmB;IACnB,IAAI,EAAE,WAAW,CAAA;IACjB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,sBAAsB;IACtB,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,qBAAqB;IACrB,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.types.js","sourceRoot":"","sources":["../../../src/core/types/session.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { NetworkQualityEvent } from './events.types';
2
+ export type { NetworkQuality, NetworkQualityEvent } from './events.types';
3
+ /**
4
+ * Stats service event names
5
+ */
6
+ export declare const StatsEvent: {
7
+ readonly NetworkQuality: "network-quality";
8
+ };
9
+ export type StatsEventName = (typeof StatsEvent)[keyof typeof StatsEvent];
10
+ /**
11
+ * Stats event handler types mapped by event name
12
+ */
13
+ export interface StatsEventMap {
14
+ [StatsEvent.NetworkQuality]: (event: NetworkQualityEvent) => void;
15
+ }
16
+ /**
17
+ * Stats event handler type (union of all possible handlers)
18
+ */
19
+ export type StatsEventHandler = StatsEventMap[StatsEventName];
20
+ //# sourceMappingURL=stats.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.types.d.ts","sourceRoot":"","sources":["../../../src/core/types/stats.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAGzD,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEzE;;GAEG;AACH,eAAO,MAAM,UAAU;;CAEb,CAAA;AAEV,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAA;AAEzE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAA;CAClE;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC,cAAc,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Stats service event names
3
+ */
4
+ export const StatsEvent = {
5
+ NetworkQuality: 'network-quality',
6
+ };
7
+ //# sourceMappingURL=stats.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.types.js","sourceRoot":"","sources":["../../../src/core/types/stats.types.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,cAAc,EAAE,iBAAiB;CACzB,CAAA"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Allowed features from sessionToken feat[] claim
3
+ */
4
+ export declare const AllowedFeature: {
5
+ readonly Rtc: "rtc";
6
+ readonly Chat: "chat";
7
+ readonly Presence: "presence";
8
+ readonly Recording: "recording";
9
+ readonly Notetaker: "notetaker";
10
+ readonly Moderation: "moderation";
11
+ readonly Stats: "stats";
12
+ };
13
+ export type AllowedFeature = (typeof AllowedFeature)[keyof typeof AllowedFeature];
14
+ /**
15
+ * User roles from sessionToken role claim
16
+ *
17
+ * - `host` - Full control: can mute/kick/ban anyone, start/stop recording
18
+ * - `moderator` - Room creator or first participant, can mute/kick participants
19
+ * - `member` - Standard participant (default)
20
+ * - `viewer` - View-only access, cannot publish tracks
21
+ */
22
+ export declare const UserRole: {
23
+ readonly Host: "host";
24
+ readonly Moderator: "moderator";
25
+ readonly Member: "member";
26
+ readonly Viewer: "viewer";
27
+ };
28
+ export type UserRole = (typeof UserRole)[keyof typeof UserRole];
29
+ /**
30
+ * SessionToken (Vroom JWT) payload structure
31
+ *
32
+ * Received from POST /v1/rtc/token
33
+ *
34
+ * @example
35
+ * {
36
+ * "iss": "vroom-sdk-api",
37
+ * "iat": 1234567890,
38
+ * "exp": 1234589490,
39
+ * "kid": "key-001",
40
+ * "pid": "proj-001",
41
+ * "feat": ["rtc", "chat", "presence", "recording"],
42
+ * "uid": "user-123",
43
+ * "room": "my-room",
44
+ * "role": "moderator"
45
+ * }
46
+ */
47
+ export interface SessionTokenPayload {
48
+ /** Issuer (always "vroom-sdk-api") */
49
+ iss: string;
50
+ /** Issued at (Unix timestamp) */
51
+ iat: number;
52
+ /** Expiration time (Unix timestamp) */
53
+ exp: number;
54
+ /** API Key ID */
55
+ kid: string;
56
+ /** Project ID */
57
+ pid: string;
58
+ /** Allowed features */
59
+ feat: AllowedFeature[];
60
+ /** User ID */
61
+ uid: string;
62
+ /** Room name */
63
+ room: string;
64
+ /** User role */
65
+ role: UserRole;
66
+ }
67
+ /**
68
+ * Parsed session permissions for SDK use
69
+ */
70
+ export interface SessionPermissions {
71
+ /** List of allowed features */
72
+ features: AllowedFeature[];
73
+ /** User role in the room */
74
+ role: UserRole;
75
+ /** User ID */
76
+ userId: string;
77
+ /** Room name */
78
+ roomName: string;
79
+ /** Token expiration time */
80
+ expiresAt: number;
81
+ }
82
+ //# sourceMappingURL=token.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.types.d.ts","sourceRoot":"","sources":["../../../src/core/types/token.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;CAQjB,CAAA;AAEV,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAA;AAEjF;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ;;;;;CAKX,CAAA;AAEV,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAA;AAE/D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAA;IACX,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,uBAAuB;IACvB,IAAI,EAAE,cAAc,EAAE,CAAA;IACtB,cAAc;IACd,GAAG,EAAE,MAAM,CAAA;IACX,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB;IAChB,IAAI,EAAE,QAAQ,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,4BAA4B;IAC5B,IAAI,EAAE,QAAQ,CAAA;IACd,cAAc;IACd,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAA;CAClB"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Allowed features from sessionToken feat[] claim
3
+ */
4
+ export const AllowedFeature = {
5
+ Rtc: 'rtc',
6
+ Chat: 'chat',
7
+ Presence: 'presence',
8
+ Recording: 'recording',
9
+ Notetaker: 'notetaker',
10
+ Moderation: 'moderation',
11
+ Stats: 'stats',
12
+ };
13
+ /**
14
+ * User roles from sessionToken role claim
15
+ *
16
+ * - `host` - Full control: can mute/kick/ban anyone, start/stop recording
17
+ * - `moderator` - Room creator or first participant, can mute/kick participants
18
+ * - `member` - Standard participant (default)
19
+ * - `viewer` - View-only access, cannot publish tracks
20
+ */
21
+ export const UserRole = {
22
+ Host: 'host',
23
+ Moderator: 'moderator',
24
+ Member: 'member',
25
+ Viewer: 'viewer',
26
+ };
27
+ //# sourceMappingURL=token.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.types.js","sourceRoot":"","sources":["../../../src/core/types/token.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;CACN,CAAA;AAIV;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACR,CAAA"}
@@ -0,0 +1,39 @@
1
+ import type { Participant } from './participant.types';
2
+ /**
3
+ * Track kind constants.
4
+ */
5
+ export declare const TrackKind: {
6
+ readonly Audio: "audio";
7
+ readonly Video: "video";
8
+ readonly Screen: "screen";
9
+ };
10
+ export type TrackKind = (typeof TrackKind)[keyof typeof TrackKind];
11
+ /**
12
+ * Track represents an audio, video, or screen stream
13
+ */
14
+ export interface Track {
15
+ /** Track ID */
16
+ id: string;
17
+ /** Track kind */
18
+ kind: TrackKind;
19
+ /** Whether track is enabled */
20
+ enabled: boolean;
21
+ /** Whether track is muted */
22
+ muted: boolean;
23
+ /** Participant who owns this track */
24
+ participant: Participant;
25
+ /**
26
+ * The underlying MediaStreamTrack for attaching to DOM elements.
27
+ * Use this to display video/audio in your application.
28
+ *
29
+ * @example
30
+ * // Web
31
+ * videoElement.srcObject = new MediaStream([track.mediaStreamTrack])
32
+ *
33
+ * // React Native
34
+ * // import { RTCView } from '@waitaya.buc/client-js/react-native'
35
+ * <RTCView streamURL={track.mediaStreamTrack.id} />
36
+ */
37
+ mediaStreamTrack?: MediaStreamTrack;
38
+ }
39
+ //# sourceMappingURL=track.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.types.d.ts","sourceRoot":"","sources":["../../../src/core/types/track.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD;;GAEG;AACH,eAAO,MAAM,SAAS;;;;CAIZ,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAA;AAElE;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,eAAe;IACf,EAAE,EAAE,MAAM,CAAA;IACV,iBAAiB;IACjB,IAAI,EAAE,SAAS,CAAA;IACf,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,6BAA6B;IAC7B,KAAK,EAAE,OAAO,CAAA;IACd,sCAAsC;IACtC,WAAW,EAAE,WAAW,CAAA;IACxB;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Track kind constants.
3
+ */
4
+ export const TrackKind = {
5
+ Audio: 'audio',
6
+ Video: 'video',
7
+ Screen: 'screen',
8
+ };
9
+ //# sourceMappingURL=track.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.types.js","sourceRoot":"","sources":["../../../src/core/types/track.types.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;CACR,CAAA"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * User role in a session.
3
+ *
4
+ * - `host` - Full control: can mute/kick/ban anyone, start/stop recording
5
+ * - `moderator` - Room creator or first participant, can mute/kick participants
6
+ * - `member` - Standard participant (default)
7
+ * - `viewer` - View-only access, cannot publish tracks
8
+ */
9
+ export type UserRole = 'host' | 'moderator' | 'member' | 'viewer';
10
+ /**
11
+ * User information for connecting to a session.
12
+ */
13
+ export interface User {
14
+ /** Unique identifier for the user (max 64 chars) */
15
+ id: string;
16
+ /** Display name shown to other participants */
17
+ displayName: string;
18
+ /** User's role in the session */
19
+ role: UserRole;
20
+ /** Optional custom metadata (e.g., avatarUrl, department) */
21
+ metadata?: Record<string, unknown>;
22
+ }
23
+ //# sourceMappingURL=user.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.types.d.ts","sourceRoot":"","sources":["../../../src/core/types/user.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEjE;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAA;IAEV,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAA;IAEnB,iCAAiC;IACjC,IAAI,EAAE,QAAQ,CAAA;IAEd,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=user.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.types.js","sourceRoot":"","sources":["../../../src/core/types/user.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Logger level.
3
+ *
4
+ * - `debug` - Verbose logging for development
5
+ * - `info` - General information
6
+ * - `warn` - Warnings
7
+ * - `error` - Errors only
8
+ */
9
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
10
+ /**
11
+ * Logger configuration
12
+ */
13
+ export interface LoggerConfig {
14
+ /** Log level */
15
+ level: LogLevel;
16
+ /** Custom log handler */
17
+ handler?: (level: LogLevel, message: string, context?: unknown) => void;
18
+ }
19
+ /**
20
+ * Platform type for API key validation
21
+ */
22
+ export type Platform = 'web' | 'ios' | 'android';
23
+ /**
24
+ * Platform info for API key validation.
25
+ * Different platforms require different identifiers.
26
+ */
27
+ export type PlatformInfo = {
28
+ platform: 'web';
29
+ domain: string;
30
+ } | {
31
+ platform: 'ios';
32
+ bundleId: string;
33
+ } | {
34
+ platform: 'android';
35
+ packageName: string;
36
+ };
37
+ /**
38
+ * RTC provider constants
39
+ */
40
+ export declare const Provider: {
41
+ readonly LiveKit: "LiveKit";
42
+ readonly Banuba: "Banuba";
43
+ };
44
+ /**
45
+ * RTC provider type
46
+ */
47
+ export type ProviderType = (typeof Provider)[keyof typeof Provider];
48
+ /**
49
+ * Default Vroom API endpoint
50
+ */
51
+ export declare const DEFAULT_VROOM_ENDPOINT = "https://vroom-sdk-api-dev.truevirtualworld.com";
52
+ /**
53
+ * Configuration for Vroom.init()
54
+ */
55
+ export interface VroomInitConfig {
56
+ /** Vroom API key */
57
+ apiKey: string;
58
+ /** Vroom backend endpoint (optional) */
59
+ endpoint?: string;
60
+ /** Region preference */
61
+ region?: string;
62
+ /** Logger configuration */
63
+ logger?: LoggerConfig;
64
+ /**
65
+ * Platform information for API key validation.
66
+ * Required for non-web platforms (iOS, Android).
67
+ * Auto-detected on web from window.location.hostname.
68
+ *
69
+ * @example
70
+ * // iOS
71
+ * { platform: 'ios', bundleId: 'com.example.app' }
72
+ *
73
+ * // Android
74
+ * { platform: 'android', packageName: 'com.example.app' }
75
+ */
76
+ platformInfo?: PlatformInfo;
77
+ }
78
+ /**
79
+ * Internal configuration with platform info (used by API client)
80
+ * @internal
81
+ */
82
+ export interface VroomInitConfigInternal extends VroomInitConfig {
83
+ /** Platform information for API key validation (auto-detected by SDK) */
84
+ platformInfo: PlatformInfo;
85
+ }
86
+ //# sourceMappingURL=vroom.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vroom.types.d.ts","sourceRoot":"","sources":["../../../src/core/types/vroom.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE1D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,KAAK,EAAE,QAAQ,CAAA;IACf,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CACxE;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAA;AAEhD;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,QAAQ;;;CAGX,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAA;AAEnE;;GAEG;AACH,eAAO,MAAM,sBAAsB,mDAAmD,CAAA;AAEtF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2BAA2B;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,yEAAyE;IACzE,YAAY,EAAE,YAAY,CAAA;CAC3B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * RTC provider constants
3
+ */
4
+ export const Provider = {
5
+ LiveKit: 'LiveKit',
6
+ Banuba: 'Banuba',
7
+ };
8
+ /**
9
+ * Default Vroom API endpoint
10
+ */
11
+ export const DEFAULT_VROOM_ENDPOINT = 'https://vroom-sdk-api-dev.truevirtualworld.com';
12
+ //# sourceMappingURL=vroom.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vroom.types.js","sourceRoot":"","sources":["../../../src/core/types/vroom.types.ts"],"names":[],"mappings":"AAkCA;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;CACR,CAAA;AAOV;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,gDAAgD,CAAA"}
@@ -0,0 +1,77 @@
1
+ import { UserRole, type SessionPermissions, type AllowedFeature } from '../types/token.types';
2
+ /**
3
+ * TokenService handles sessionToken decoding and permission checking.
4
+ *
5
+ * This is a core utility (not a domain service) because:
6
+ * - JWT decode logic is provider-agnostic
7
+ * - No events or lifecycle management needed
8
+ * - Used internally by Vroom.connect() and Session
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const token = new TokenService(sessionToken)
13
+ *
14
+ * // Check feature availability
15
+ * if (token.hasFeature('recording')) {
16
+ * // Recording is allowed
17
+ * }
18
+ *
19
+ * // Check role
20
+ * if (token.canModerate()) {
21
+ * // User is host or moderator
22
+ * }
23
+ * ```
24
+ */
25
+ export declare class TokenService {
26
+ private payload;
27
+ private permissions;
28
+ constructor(sessionToken: string);
29
+ /**
30
+ * Get all allowed features
31
+ */
32
+ getFeatures(): AllowedFeature[];
33
+ /**
34
+ * Check if a specific feature is allowed
35
+ */
36
+ hasFeature(feature: AllowedFeature): boolean;
37
+ /**
38
+ * Get user role
39
+ */
40
+ getRole(): UserRole;
41
+ /**
42
+ * Check if user has host role
43
+ */
44
+ isHost(): boolean;
45
+ /**
46
+ * Check if user has moderator role
47
+ */
48
+ isModerator(): boolean;
49
+ /**
50
+ * Check if user can moderate (host or moderator)
51
+ */
52
+ canModerate(): boolean;
53
+ /**
54
+ * Get full permissions object
55
+ */
56
+ getPermissions(): SessionPermissions;
57
+ /**
58
+ * Check if token is expired
59
+ */
60
+ isExpired(): boolean;
61
+ /**
62
+ * Decode JWT token (without verification)
63
+ *
64
+ * JWT structure: header.payload.signature
65
+ * We only need the payload part which is base64url encoded
66
+ */
67
+ private decodeToken;
68
+ /**
69
+ * Base64URL decode (handles URL-safe base64)
70
+ */
71
+ private base64UrlDecode;
72
+ /**
73
+ * Extract permissions from token payload
74
+ */
75
+ private extractPermissions;
76
+ }
77
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/core/utils/token.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAER,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAA;AAI7B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,WAAW,CAAoB;gBAE3B,YAAY,EAAE,MAAM;IAKhC;;OAEG;IACH,WAAW,IAAI,cAAc,EAAE;IAI/B;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;IAI5C;;OAEG;IACH,OAAO,IAAI,QAAQ;IAInB;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,cAAc,IAAI,kBAAkB;IAIpC;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAmBnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAS3B"}
@@ -0,0 +1,127 @@
1
+ import { UserRole, } from '../types/token.types';
2
+ import { VroomError } from '../errors/vroom.error';
3
+ import { ErrorCodes } from '../errors/error-codes';
4
+ /**
5
+ * TokenService handles sessionToken decoding and permission checking.
6
+ *
7
+ * This is a core utility (not a domain service) because:
8
+ * - JWT decode logic is provider-agnostic
9
+ * - No events or lifecycle management needed
10
+ * - Used internally by Vroom.connect() and Session
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const token = new TokenService(sessionToken)
15
+ *
16
+ * // Check feature availability
17
+ * if (token.hasFeature('recording')) {
18
+ * // Recording is allowed
19
+ * }
20
+ *
21
+ * // Check role
22
+ * if (token.canModerate()) {
23
+ * // User is host or moderator
24
+ * }
25
+ * ```
26
+ */
27
+ export class TokenService {
28
+ constructor(sessionToken) {
29
+ this.payload = this.decodeToken(sessionToken);
30
+ this.permissions = this.extractPermissions(this.payload);
31
+ }
32
+ /**
33
+ * Get all allowed features
34
+ */
35
+ getFeatures() {
36
+ return [...this.permissions.features];
37
+ }
38
+ /**
39
+ * Check if a specific feature is allowed
40
+ */
41
+ hasFeature(feature) {
42
+ return this.permissions.features.includes(feature);
43
+ }
44
+ /**
45
+ * Get user role
46
+ */
47
+ getRole() {
48
+ return this.permissions.role;
49
+ }
50
+ /**
51
+ * Check if user has host role
52
+ */
53
+ isHost() {
54
+ return this.permissions.role === UserRole.Host;
55
+ }
56
+ /**
57
+ * Check if user has moderator role
58
+ */
59
+ isModerator() {
60
+ return this.permissions.role === UserRole.Moderator;
61
+ }
62
+ /**
63
+ * Check if user can moderate (host or moderator)
64
+ */
65
+ canModerate() {
66
+ return this.isHost() || this.isModerator();
67
+ }
68
+ /**
69
+ * Get full permissions object
70
+ */
71
+ getPermissions() {
72
+ return { ...this.permissions };
73
+ }
74
+ /**
75
+ * Check if token is expired
76
+ */
77
+ isExpired() {
78
+ return Date.now() >= this.permissions.expiresAt;
79
+ }
80
+ /**
81
+ * Decode JWT token (without verification)
82
+ *
83
+ * JWT structure: header.payload.signature
84
+ * We only need the payload part which is base64url encoded
85
+ */
86
+ decodeToken(token) {
87
+ try {
88
+ const parts = token.split('.');
89
+ if (parts.length !== 3) {
90
+ throw new Error('Invalid JWT format');
91
+ }
92
+ // Decode payload (second part)
93
+ const payload = this.base64UrlDecode(parts[1]);
94
+ return JSON.parse(payload);
95
+ }
96
+ catch (error) {
97
+ throw new VroomError(ErrorCodes.E_INVALID_TOKEN, 'Failed to decode session token', error);
98
+ }
99
+ }
100
+ /**
101
+ * Base64URL decode (handles URL-safe base64)
102
+ */
103
+ base64UrlDecode(str) {
104
+ // Replace URL-safe characters
105
+ let base64 = str.replace(/-/g, '+').replace(/_/g, '/');
106
+ // Add padding if needed
107
+ const padding = base64.length % 4;
108
+ if (padding) {
109
+ base64 += '='.repeat(4 - padding);
110
+ }
111
+ // Decode
112
+ return atob(base64);
113
+ }
114
+ /**
115
+ * Extract permissions from token payload
116
+ */
117
+ extractPermissions(payload) {
118
+ return {
119
+ features: payload.feat || [],
120
+ role: payload.role,
121
+ userId: payload.uid,
122
+ roomName: payload.room,
123
+ expiresAt: payload.exp * 1000, // Convert to milliseconds
124
+ };
125
+ }
126
+ }
127
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/core/utils/token.ts"],"names":[],"mappings":"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"}