@waitaya.buc/client-js 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +179 -0
- package/dist/adapters/livekit/api/recording.api.d.ts +15 -0
- package/dist/adapters/livekit/api/recording.api.d.ts.map +1 -0
- package/dist/adapters/livekit/api/recording.api.js +61 -0
- package/dist/adapters/livekit/api/recording.api.js.map +1 -0
- package/dist/adapters/livekit/index.d.ts +18 -0
- package/dist/adapters/livekit/index.d.ts.map +1 -0
- package/dist/adapters/livekit/index.js +26 -0
- package/dist/adapters/livekit/index.js.map +1 -0
- package/dist/adapters/livekit/livekit.adapter.d.ts +85 -0
- package/dist/adapters/livekit/livekit.adapter.d.ts.map +1 -0
- package/dist/adapters/livekit/livekit.adapter.js +531 -0
- package/dist/adapters/livekit/livekit.adapter.js.map +1 -0
- package/dist/adapters/livekit/livekit.mapper.d.ts +36 -0
- package/dist/adapters/livekit/livekit.mapper.d.ts.map +1 -0
- package/dist/adapters/livekit/livekit.mapper.js +108 -0
- package/dist/adapters/livekit/livekit.mapper.js.map +1 -0
- package/dist/adapters/livekit/livekit.types.d.ts +22 -0
- package/dist/adapters/livekit/livekit.types.d.ts.map +1 -0
- package/dist/adapters/livekit/livekit.types.js +10 -0
- package/dist/adapters/livekit/livekit.types.js.map +1 -0
- package/dist/adapters/livekit/service-adapters/index.d.ts +4 -0
- package/dist/adapters/livekit/service-adapters/index.d.ts.map +1 -0
- package/dist/adapters/livekit/service-adapters/index.js +4 -0
- package/dist/adapters/livekit/service-adapters/index.js.map +1 -0
- package/dist/adapters/livekit/service-adapters/recording.adapter.d.ts +19 -0
- package/dist/adapters/livekit/service-adapters/recording.adapter.d.ts.map +1 -0
- package/dist/adapters/livekit/service-adapters/recording.adapter.js +30 -0
- package/dist/adapters/livekit/service-adapters/recording.adapter.js.map +1 -0
- package/dist/adapters/livekit/service-adapters/stats.adapter.d.ts +21 -0
- package/dist/adapters/livekit/service-adapters/stats.adapter.d.ts.map +1 -0
- package/dist/adapters/livekit/service-adapters/stats.adapter.js +54 -0
- package/dist/adapters/livekit/service-adapters/stats.adapter.js.map +1 -0
- package/dist/adapters/livekit/service-adapters/track-attachment.adapter.d.ts +79 -0
- package/dist/adapters/livekit/service-adapters/track-attachment.adapter.d.ts.map +1 -0
- package/dist/adapters/livekit/service-adapters/track-attachment.adapter.js +348 -0
- package/dist/adapters/livekit/service-adapters/track-attachment.adapter.js.map +1 -0
- package/dist/adapters/livekit/services/index.d.ts +3 -0
- package/dist/adapters/livekit/services/index.d.ts.map +1 -0
- package/dist/adapters/livekit/services/index.js +3 -0
- package/dist/adapters/livekit/services/index.js.map +1 -0
- package/dist/adapters/livekit/services/recording.service.d.ts +29 -0
- package/dist/adapters/livekit/services/recording.service.d.ts.map +1 -0
- package/dist/adapters/livekit/services/recording.service.js +34 -0
- package/dist/adapters/livekit/services/recording.service.js.map +1 -0
- package/dist/adapters/livekit/services/stats.service.d.ts +24 -0
- package/dist/adapters/livekit/services/stats.service.d.ts.map +1 -0
- package/dist/adapters/livekit/services/stats.service.js +56 -0
- package/dist/adapters/livekit/services/stats.service.js.map +1 -0
- package/dist/core/api/auth.api.d.ts +52 -0
- package/dist/core/api/auth.api.d.ts.map +1 -0
- package/dist/core/api/auth.api.js +59 -0
- package/dist/core/api/auth.api.js.map +1 -0
- package/dist/core/api/http.d.ts +86 -0
- package/dist/core/api/http.d.ts.map +1 -0
- package/dist/core/api/http.js +146 -0
- package/dist/core/api/http.js.map +1 -0
- package/dist/core/errors/error-codes.d.ts +43 -0
- package/dist/core/errors/error-codes.d.ts.map +1 -0
- package/dist/core/errors/error-codes.js +42 -0
- package/dist/core/errors/error-codes.js.map +1 -0
- package/dist/core/errors/vroom.error.d.ts +99 -0
- package/dist/core/errors/vroom.error.d.ts.map +1 -0
- package/dist/core/errors/vroom.error.js +141 -0
- package/dist/core/errors/vroom.error.js.map +1 -0
- package/dist/core/ports/outbound/provider-adapter-factory.port.d.ts +41 -0
- package/dist/core/ports/outbound/provider-adapter-factory.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/provider-adapter-factory.port.js +2 -0
- package/dist/core/ports/outbound/provider-adapter-factory.port.js.map +1 -0
- package/dist/core/ports/outbound/provider-adapter.port.d.ts +130 -0
- package/dist/core/ports/outbound/provider-adapter.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/provider-adapter.port.js +2 -0
- package/dist/core/ports/outbound/provider-adapter.port.js.map +1 -0
- package/dist/core/ports/outbound/recording-adapter.port.d.ts +40 -0
- package/dist/core/ports/outbound/recording-adapter.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/recording-adapter.port.js +2 -0
- package/dist/core/ports/outbound/recording-adapter.port.js.map +1 -0
- package/dist/core/ports/outbound/stats-adapter.port.d.ts +31 -0
- package/dist/core/ports/outbound/stats-adapter.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/stats-adapter.port.js +2 -0
- package/dist/core/ports/outbound/stats-adapter.port.js.map +1 -0
- package/dist/core/ports/outbound/track-attachment-adapter.port.d.ts +86 -0
- package/dist/core/ports/outbound/track-attachment-adapter.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/track-attachment-adapter.port.js +2 -0
- package/dist/core/ports/outbound/track-attachment-adapter.port.js.map +1 -0
- package/dist/core/provider-registry.d.ts +29 -0
- package/dist/core/provider-registry.d.ts.map +1 -0
- package/dist/core/provider-registry.js +45 -0
- package/dist/core/provider-registry.js.map +1 -0
- package/dist/core/services/base.service.d.ts +15 -0
- package/dist/core/services/base.service.d.ts.map +1 -0
- package/dist/core/services/base.service.js +10 -0
- package/dist/core/services/base.service.js.map +1 -0
- package/dist/core/services/recording.service.d.ts +50 -0
- package/dist/core/services/recording.service.d.ts.map +1 -0
- package/dist/core/services/recording.service.js +89 -0
- package/dist/core/services/recording.service.js.map +1 -0
- package/dist/core/services/stats.service.d.ts +32 -0
- package/dist/core/services/stats.service.d.ts.map +1 -0
- package/dist/core/services/stats.service.js +69 -0
- package/dist/core/services/stats.service.js.map +1 -0
- package/dist/core/session.d.ts +142 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +248 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/types/events.types.d.ts +263 -0
- package/dist/core/types/events.types.d.ts.map +1 -0
- package/dist/core/types/events.types.js +76 -0
- package/dist/core/types/events.types.js.map +1 -0
- package/dist/core/types/media.types.d.ts +81 -0
- package/dist/core/types/media.types.d.ts.map +1 -0
- package/dist/core/types/media.types.js +12 -0
- package/dist/core/types/media.types.js.map +1 -0
- package/dist/core/types/participant.types.d.ts +11 -0
- package/dist/core/types/participant.types.d.ts.map +1 -0
- package/dist/core/types/participant.types.js +2 -0
- package/dist/core/types/participant.types.js.map +1 -0
- package/dist/core/types/recording.types.d.ts +60 -0
- package/dist/core/types/recording.types.d.ts.map +1 -0
- package/dist/core/types/recording.types.js +7 -0
- package/dist/core/types/recording.types.js.map +1 -0
- package/dist/core/types/service-adapters.types.d.ts +46 -0
- package/dist/core/types/service-adapters.types.d.ts.map +1 -0
- package/dist/core/types/service-adapters.types.js +2 -0
- package/dist/core/types/service-adapters.types.js.map +1 -0
- package/dist/core/types/session.types.d.ts +57 -0
- package/dist/core/types/session.types.d.ts.map +1 -0
- package/dist/core/types/session.types.js +2 -0
- package/dist/core/types/session.types.js.map +1 -0
- package/dist/core/types/stats.types.d.ts +20 -0
- package/dist/core/types/stats.types.d.ts.map +1 -0
- package/dist/core/types/stats.types.js +7 -0
- package/dist/core/types/stats.types.js.map +1 -0
- package/dist/core/types/token.types.d.ts +82 -0
- package/dist/core/types/token.types.d.ts.map +1 -0
- package/dist/core/types/token.types.js +27 -0
- package/dist/core/types/token.types.js.map +1 -0
- package/dist/core/types/track.types.d.ts +39 -0
- package/dist/core/types/track.types.d.ts.map +1 -0
- package/dist/core/types/track.types.js +9 -0
- package/dist/core/types/track.types.js.map +1 -0
- package/dist/core/types/user.types.d.ts +23 -0
- package/dist/core/types/user.types.d.ts.map +1 -0
- package/dist/core/types/user.types.js +2 -0
- package/dist/core/types/user.types.js.map +1 -0
- package/dist/core/types/vroom.types.d.ts +86 -0
- package/dist/core/types/vroom.types.d.ts.map +1 -0
- package/dist/core/types/vroom.types.js +12 -0
- package/dist/core/types/vroom.types.js.map +1 -0
- package/dist/core/utils/token.d.ts +77 -0
- package/dist/core/utils/token.d.ts.map +1 -0
- package/dist/core/utils/token.js +127 -0
- package/dist/core/utils/token.js.map +1 -0
- package/dist/core/vroom.d.ts +90 -0
- package/dist/core/vroom.d.ts.map +1 -0
- package/dist/core/vroom.js +219 -0
- package/dist/core/vroom.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/react-native.d.ts +21 -0
- package/dist/react-native.d.ts.map +1 -0
- package/dist/react-native.js +32 -0
- package/dist/react-native.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|