refactor(types): reorganize typings by category

Restructure TypeScript typings to improve organization and maintainability.
Group definitions by type: database entities, request types, and response types, making the structure clearer and easier to navigate.
This commit is contained in:
juancarmore 2026-02-19 09:35:34 +01:00
parent 87645efb3c
commit bc70759837
37 changed files with 621 additions and 410 deletions

View File

@ -6,17 +6,14 @@ export interface MeetAnalytics {
* Total number of rooms created
*/
totalRooms: number;
/**
* Number of rooms currently with an active meeting
*/
activeRooms: number;
/**
* Total number of recordings created
*/
totalRecordings: number;
/**
* Number of recordings that are complete and playable
*/

View File

@ -1,4 +0,0 @@
export interface MeetApiKey {
key: string;
creationDate: number;
}

View File

@ -1,27 +0,0 @@
/**
* Authentication configuration.
*/
export interface AuthenticationConfig {
/**
* List of allowed OAuth providers for user registration.
*/
oauthProviders: OAuthProviderConfig[];
}
/**
* Configuration for OAuth authentication.
*/
export interface OAuthProviderConfig {
provider: OAuthProvider;
clientId: string;
clientSecret: string;
redirectUri: string;
}
/**
* Supported OAuth providers.
*/
export enum OAuthProvider {
GOOGLE = 'google',
GITHUB = 'github'
}

View File

@ -0,0 +1,9 @@
/**
* Interface representing an API key in the Meet application.
*/
export interface MeetApiKey {
/** Unique identifier for the API key */
key: string;
/** Timestamp in milliseconds since epoch when the API key was created */
creationDate: number;
}

View File

@ -0,0 +1,65 @@
import { MeetAppearanceConfig } from './room-config.js';
/**
* Represents global config for OpenVidu Meet.
*/
export interface GlobalConfig {
/** The projectId is used to identify the project in which the OpenVidu Meet instance is running. */
projectId: string;
/** Security configuration. See {@link SecurityConfig} for details. */
securityConfig: SecurityConfig;
/** Webhooks configuration. See {@link WebhookConfig} for details. */
webhooksConfig: WebhookConfig;
/** Rooms configuration. See {@link MeetAppearanceConfig} for details. */
roomsConfig: {
appearance: MeetAppearanceConfig;
};
}
/**
* Represents the configuration for webhooks in OpenVidu Meet.
*/
export interface WebhookConfig {
/** Indicates whether webhooks are enabled or not */
enabled: boolean;
/** The URL to which webhook events will be sent */
url?: string;
}
/**
* Represents the security configuration for OpenVidu Meet, including authentication settings.
*/
export interface SecurityConfig {
/** Authentication configuration. See {@link AuthenticationConfig} for details */
authentication: AuthenticationConfig;
}
/**
* Authentication configuration.
*/
export interface AuthenticationConfig {
/** List of allowed OAuth providers for user registration */
oauthProviders: OAuthProviderConfig[];
}
/**
* Configuration for OAuth authentication.
*/
export interface OAuthProviderConfig {
/** OAuth provider. See {@link OAuthProvider} for details */
provider: OAuthProvider;
/** Client ID obtained from the OAuth provider. */
clientId: string;
/** Client secret obtained from the OAuth provider. */
clientSecret: string;
/** Redirect URI registered with the OAuth provider. */
redirectUri: string;
}
/**
* Supported OAuth providers.
*/
export enum OAuthProvider {
GOOGLE = 'google',
GITHUB = 'github'
}

View File

@ -0,0 +1,8 @@
export * from './api-key.entity.js';
export * from './global-config.entity.js';
export * from './recording.entity.js';
export * from './room-config.js';
export * from './room-member-permissions.js';
export * from './room-member.entity.js';
export * from './room.entity.js';
export * from './user.entity.js';

View File

@ -1,14 +1,59 @@
/**
* Interface representing a recording of a meeting room.
*/
export interface MeetRecordingInfo {
/** Unique identifier for the recording */
recordingId: string;
/** Identifier of the room being recorded */
roomId: string;
/** Name of the room being recorded */
roomName: string;
// outputMode: MeetRecordingOutputMode;
/** Current status of the recording. See {@link MeetRecordingStatus} for details */
status: MeetRecordingStatus;
/** Layout used for the recording. See {@link MeetRecordingLayout} for details */
layout?: MeetRecordingLayout;
/**
* Encoding options used for the recording.
* Can be a preset from {@link MeetRecordingEncodingPreset} or
* custom options defined in {@link MeetRecordingEncodingOptions}.
*/
encoding?: MeetRecordingEncodingPreset | MeetRecordingEncodingOptions;
/** Filename of the recording file (if available) */
filename?: string;
/** Timestamp in milliseconds since epoch when the recording started (if available) */
startDate?: number;
/** Timestamp in milliseconds since epoch when the recording ended (if available) */
endDate?: number;
/** Duration in seconds of the recording (if available) */
duration?: number;
/** Size in bytes of the recording file (if available) */
size?: number;
/** Error code if the recording failed (if available) */
errorCode?: number;
/** Error message if the recording failed (if available) */
error?: string;
/** Additional details about the recording status or errors (if available) */
details?: string;
}
/**
* Recording status enumeration.
* Possible statuses for a recording.
*/
export enum MeetRecordingStatus {
/** Recording is being prepared and will start soon */
STARTING = 'starting',
/** Recording is currently in progress */
ACTIVE = 'active',
/** Recording is being finalized and will be available soon */
ENDING = 'ending',
/** Recording completed successfully and is available */
COMPLETE = 'complete',
/** Recording failed due to an error */
FAILED = 'failed',
/** Recording was aborted by the system */
ABORTED = 'aborted',
/** Recording could not finish because the system limit was reached */
LIMIT_REACHED = 'limit_reached'
}
@ -16,8 +61,11 @@ export enum MeetRecordingStatus {
* Layout options for recordings.
*/
export enum MeetRecordingLayout {
/** Grid layout showing all participants equally */
GRID = 'grid',
/** Layout focusing on the active speaker */
SPEAKER = 'speaker',
/** Layout showing only the dominant speaker */
SINGLE_SPEAKER = 'single-speaker'
// GRID_LIGHT = 'grid-light',
// SPEAKER_LIGHT = 'speaker-light',
@ -36,32 +84,26 @@ export enum MeetRecordingEncodingPreset {
* 1280x720, 60fps, ~4500 kbps. Smooth motion for fast action.
*/
H264_720P_60 = 'H264_720P_60',
/**
* 1920x1080, 30fps, ~4500 kbps. High visual quality for detailed content.
*/
H264_1080P_30 = 'H264_1080P_30',
/**
* 1920x1080, 60fps, ~6000 kbps. Premium quality with very smooth motion.
*/
H264_1080P_60 = 'H264_1080P_60',
/**
* Portrait 720x1280, 30fps. Vertical video optimized for mobile/portrait use.
*/
PORTRAIT_H264_720P_30 = 'PORTRAIT_H264_720P_30',
/**
* Portrait 720x1280, 60fps. Vertical video with smoother motion.
*/
PORTRAIT_H264_720P_60 = 'PORTRAIT_H264_720P_60',
/**
* Portrait 1080x1920, 30fps. High-quality vertical recording.
*/
PORTRAIT_H264_1080P_30 = 'PORTRAIT_H264_1080P_30',
/**
* Portrait 1080x1920, 60fps. Premium vertical recording with smooth motion.
*/
@ -129,24 +171,3 @@ export enum MeetRecordingAudioCodec {
// export enum MeetRecordingOutputMode {
// COMPOSED = 'composed',
// }
/**
* Interface representing a recording
*/
export interface MeetRecordingInfo {
recordingId: string;
roomId: string;
roomName: string;
// outputMode: MeetRecordingOutputMode;
status: MeetRecordingStatus;
layout?: MeetRecordingLayout;
encoding?: MeetRecordingEncodingPreset | MeetRecordingEncodingOptions;
filename?: string;
startDate?: number;
endDate?: number;
duration?: number;
size?: number;
errorCode?: number;
error?: string;
details?: string;
}

View File

@ -1,4 +1,4 @@
import { MeetRecordingEncodingOptions, MeetRecordingEncodingPreset, MeetRecordingLayout } from './recording.model.js';
import { MeetRecordingEncodingOptions, MeetRecordingEncodingPreset, MeetRecordingLayout } from './recording.entity.js';
/**
* Interface representing the config for a room.
@ -46,6 +46,9 @@ export interface MeetRecordingConfig {
encoding?: MeetRecordingEncodingPreset | MeetRecordingEncodingOptions;
}
/**
* Interface representing the config for chat in a room.
*/
export interface MeetChatConfig {
/**
* Indicates if chat is enabled in the room
@ -53,6 +56,9 @@ export interface MeetChatConfig {
enabled: boolean;
}
/**
* Interface representing the config for virtual backgrounds in a room.
*/
export interface MeetVirtualBackgroundConfig {
/**
* Indicates if virtual backgrounds are enabled in the room
@ -60,12 +66,19 @@ export interface MeetVirtualBackgroundConfig {
enabled: boolean;
}
/**
* Interface representing the config for end-to-end encryption in a room.
*/
export interface MeetE2EEConfig {
/**
* Indicates if end-to-end encryption is enabled in the room
*/
enabled: boolean;
}
/**
* Interface representing the config for captions in a room.
*/
export interface MeetRoomCaptionsConfig {
/**
* Indicates if captions are enabled in the room
@ -73,6 +86,9 @@ export interface MeetRoomCaptionsConfig {
enabled: boolean;
}
/**
* Interface representing the appearance configuration for a room.
*/
export interface MeetAppearanceConfig {
/**
* List of themes available in the room
@ -80,18 +96,34 @@ export interface MeetAppearanceConfig {
themes: MeetRoomTheme[];
}
/**
* Interface representing a theme for a room's appearance.
*/
export interface MeetRoomTheme {
/** Name of the theme */
name: string;
/** Indicates if the theme is enabled in the room */
enabled: boolean;
/** Base theme mode (light or dark) */
baseTheme: MeetRoomThemeMode;
/** Optional custom background color */
backgroundColor?: string;
/** Optional custom primary color */
primaryColor?: string;
/** Optional custom secondary color */
secondaryColor?: string;
/** Optional custom accent color */
accentColor?: string;
/** Optional custom surface color */
surfaceColor?: string;
}
/**
* Enum representing the base theme mode for a room's appearance.
*/
export enum MeetRoomThemeMode {
/** Light mode theme */
LIGHT = 'light',
/** Dark mode theme */
DARK = 'dark'
}

View File

@ -1,5 +1,5 @@
/**
* Defines permissions for a room member.
* List of permissions for a room member.
*/
export interface MeetRoomMemberPermissions {
/**

View File

@ -0,0 +1,34 @@
import { MeetRoomMemberPermissions } from './room-member-permissions.js';
/**
* Represents a room member.
* A member can be an internal user (identified by userId) or an external user (identified by name).
*/
export interface MeetRoomMember {
/** Unique identifier for the member (equals userId for registered users, or generated for external users) */
memberId: string;
/** ID of the room the member belongs to */
roomId: string;
/** Name of the member (either registered or external user name) */
name: string;
/** Timestamp when the member was added to the room (milliseconds since epoch) */
membershipDate: number;
/** URL for the member to access the room */
accessUrl: string;
/** Base role of the member in the room. See {@link MeetRoomMemberRole} for details. */
baseRole: MeetRoomMemberRole;
/** Custom permissions for the member (if any). Overrides permissions from the base role. See {@link MeetRoomMemberPermissions} for details. */
customPermissions?: Partial<MeetRoomMemberPermissions>;
/** Effective permissions for the member, calculated from the base role and custom permissions. See {@link MeetRoomMemberPermissions} for details. */
effectivePermissions: MeetRoomMemberPermissions;
/** Timestamp when the member's effective permissions were last updated (milliseconds since epoch) */
permissionsUpdatedAt: number;
}
/**
* Represents the role of a member in a room.
*/
export enum MeetRoomMemberRole {
MODERATOR = 'moderator',
SPEAKER = 'speaker'
}

View File

@ -1,41 +1,10 @@
import { MeetRoomMemberPermissions } from './permissions/meet-permissions.js';
import { MeetRoomConfig } from './room-config.js';
import { MeetRoomMemberPermissions } from './room-member-permissions.js';
/**
* Options for creating a room.
* Interface representing a meeting room in the system.
*/
export interface MeetRoomOptions {
/**
* Name of the room
*/
roomName?: string;
/**
* Date in milliseconds since epoch when the room will be automatically deleted
*/
autoDeletionDate?: number;
/**
* Configuration for automatic deletion behavior of the room. See {@link MeetRoomAutoDeletionPolicy} for details.
*/
autoDeletionPolicy?: MeetRoomAutoDeletionPolicy;
/**
* Configuration of the room. See {@link MeetRoomConfig} for details.
*/
config?: Partial<MeetRoomConfig>;
/**
* Roles configuration for the room. See {@link MeetRoomRolesConfig} for details.
*/
roles?: MeetRoomRolesConfig;
/**
* Anonymous access configuration for the room. See {@link MeetRoomAnonymousConfig} for details.
*/
anonymous?: MeetRoomAnonymousConfig;
// maxParticipants?: number | null;
}
/**
* Representation of a room
*/
export interface MeetRoom extends MeetRoomOptions {
export interface MeetRoom {
/**
* Unique identifier of the room
*/
@ -45,13 +14,21 @@ export interface MeetRoom extends MeetRoomOptions {
*/
roomName: string;
/**
* User ID of the internal Meet user who owns this room
* User ID of the registered Meet user who owns this room
*/
owner: string;
/**
* Timestamp of room creation in milliseconds since epoch
* Timestamp in milliseconds since epoch when the room was created
*/
creationDate: number;
/**
* Timestamp in milliseconds since epoch when the room will be automatically deleted
*/
autoDeletionDate?: number;
/**
* Configuration for automatic deletion behavior of the room. See {@link MeetRoomAutoDeletionPolicy} for details.
*/
autoDeletionPolicy?: MeetRoomAutoDeletionPolicy;
/**
* Configuration of the room. See {@link MeetRoomConfig} for details.
*/
@ -65,7 +42,7 @@ export interface MeetRoom extends MeetRoomOptions {
*/
anonymous: MeetRoomAnonymous;
/**
* General access URL for authenticated users (owner and internal members)
* General access URL for registered users with access to the room.
*/
accessUrl: string;
/**
@ -73,7 +50,7 @@ export interface MeetRoom extends MeetRoomOptions {
*/
status: MeetRoomStatus;
/**
* Timestamp in milliseconds of the last time the room's role permissions or anonymous access were updated
* Timestamp in milliseconds since epoch of the last time the room's role permissions or anonymous access were updated
*/
rolesUpdatedAt: number;
/**
@ -95,19 +72,6 @@ export interface MeetRoomRoles {
};
}
/**
* Roles configuration for creating/updating a room.
* Allows partial permission updates.
*/
export interface MeetRoomRolesConfig {
moderator?: {
permissions: Partial<MeetRoomMemberPermissions>;
};
speaker?: {
permissions: Partial<MeetRoomMemberPermissions>;
};
}
/**
* Anonymous access configuration for a room.
* Defines which roles have anonymous access enabled and their access URLs.
@ -123,19 +87,6 @@ export interface MeetRoomAnonymous {
};
}
/**
* Anonymous access configuration for creating/updating a room.
* Only includes enabled flags.
*/
export interface MeetRoomAnonymousConfig {
moderator?: {
enabled: boolean;
};
speaker?: {
enabled: boolean;
};
}
/**
* Represents the current status of a meeting room.
*/
@ -144,12 +95,10 @@ export enum MeetRoomStatus {
* Room is open and available to host a meeting.
*/
OPEN = 'open',
/**
* There is an ongoing meeting in the room.
*/
ACTIVE_MEETING = 'active_meeting',
/**
* Room is closed to hosting new meetings.
*/
@ -164,12 +113,10 @@ export enum MeetingEndAction {
* No action is taken when the meeting ends.
*/
NONE = 'none',
/**
* The room will be closed when the meeting ends.
*/
CLOSE = 'close',
/**
* The room (and its recordings, if any) will be deleted
* when the meeting ends.
@ -185,7 +132,6 @@ export interface MeetRoomAutoDeletionPolicy {
* Deletion policy when there is an active meeting.
*/
withMeeting: MeetRoomDeletionPolicyWithMeeting;
/**
* Deletion policy when recordings exist.
*/
@ -200,12 +146,10 @@ export enum MeetRoomDeletionPolicyWithMeeting {
* Force deletion even if there is an active meeting.
*/
FORCE = 'force',
/**
* Delete the room when the meeting ends.
*/
WHEN_MEETING_ENDS = 'when_meeting_ends',
/**
* Fail the deletion if there is an active meeting.
*/
@ -220,34 +164,12 @@ export enum MeetRoomDeletionPolicyWithRecordings {
* Force deletion even if there are ongoing or previous recordings.
*/
FORCE = 'force',
/**
* Close the room and keep recordings.
*/
CLOSE = 'close',
/**
* Fail the deletion if there are ongoing or previous recordings.
*/
FAIL = 'fail'
}
export enum MeetRoomDeletionSuccessCode {
ROOM_DELETED = 'room_deleted',
ROOM_WITH_ACTIVE_MEETING_DELETED = 'room_with_active_meeting_deleted',
ROOM_WITH_ACTIVE_MEETING_SCHEDULED_TO_BE_DELETED = 'room_with_active_meeting_scheduled_to_be_deleted',
ROOM_AND_RECORDINGS_DELETED = 'room_and_recordings_deleted',
ROOM_CLOSED = 'room_closed',
ROOM_WITH_ACTIVE_MEETING_AND_RECORDINGS_DELETED = 'room_with_active_meeting_and_recordings_deleted',
ROOM_WITH_ACTIVE_MEETING_CLOSED = 'room_with_active_meeting_closed',
ROOM_WITH_ACTIVE_MEETING_AND_RECORDINGS_SCHEDULED_TO_BE_DELETED = 'room_with_active_meeting_and_recordings_scheduled_to_be_deleted',
ROOM_WITH_ACTIVE_MEETING_SCHEDULED_TO_BE_CLOSED = 'room_with_active_meeting_scheduled_to_be_closed'
}
export enum MeetRoomDeletionErrorCode {
ROOM_HAS_ACTIVE_MEETING = 'room_has_active_meeting',
ROOM_HAS_RECORDINGS = 'room_has_recordings',
ROOM_WITH_ACTIVE_MEETING_HAS_RECORDINGS = 'room_with_active_meeting_has_recordings',
ROOM_WITH_ACTIVE_MEETING_HAS_RECORDINGS_CANNOT_SCHEDULE_DELETION = 'room_with_active_meeting_has_recordings_cannot_schedule_deletion',
ROOM_WITH_RECORDINGS_HAS_ACTIVE_MEETING = 'room_with_recordings_has_active_meeting'
}

View File

@ -0,0 +1,29 @@
/**
* Represents a user in the Meet application.
*/
export interface MeetUser {
/** Unique identifier for the user (lowercase letters, numbers, underscores) */
userId: string;
/** Name of the user */
name: string;
/** Timestamp in milliseconds since epoch when the user was registered */
registrationDate: number;
/** Role of the user. See {@link MeetUserRole} for details. */
role: MeetUserRole;
/** Hashed password for the user */
passwordHash: string;
/** Indicates whether the user must change their password on next login */
mustChangePassword: boolean;
}
/**
* Defines the possible roles for a Meet user.
*/
export enum MeetUserRole {
/** Represents a user with administrative privileges (can manage all rooms and users) */
ADMIN = 'admin',
/** Represents a regular user (can manage own rooms and access rooms where they are members) */
USER = 'user',
/** Represents a user with permissions limited to specific rooms (can only access rooms where they are members) */
ROOM_MEMBER = 'room_member'
}

View File

@ -1,23 +0,0 @@
import { MeetRoomConfig } from './room-config.js';
import { MeetRoomMemberRole } from './room-member.js';
export enum MeetSignalType {
MEET_ROOM_CONFIG_UPDATED = 'meet_room_config_updated',
MEET_PARTICIPANT_ROLE_UPDATED = 'meet_participant_role_updated'
}
export interface MeetRoomConfigUpdatedPayload {
roomId: string;
config: MeetRoomConfig;
timestamp: number;
}
export interface MeetParticipantRoleUpdatedPayload {
roomId: string;
participantIdentity: string;
newRole: MeetRoomMemberRole;
secret?: string;
timestamp: number;
}
export type MeetSignalPayload = MeetRoomConfigUpdatedPayload | MeetParticipantRoleUpdatedPayload;

View File

@ -0,0 +1,48 @@
import { MeetRoomConfig } from './database/room-config.js';
import { MeetRoomMemberRole } from './database/room-member.entity.js';
/**
* Interface representing a signal emitted by OpenVidu Meet to notify clients about real-time updates in the meeting.
*/
export enum MeetSignalType {
/** Emitted when the configuration of a meeting room is updated */
MEET_ROOM_CONFIG_UPDATED = 'meet_room_config_updated',
/** Emitted when a participant's role in a meeting room is updated */
MEET_PARTICIPANT_ROLE_UPDATED = 'meet_participant_role_updated'
}
/**
* Payload for MEET_ROOM_CONFIG_UPDATED signal,
* containing the updated room configuration and related information.
*/
export interface MeetRoomConfigUpdatedPayload {
/** ID of the room whose configuration has been updated */
roomId: string;
/** Updated configuration of the meeting room */
config: MeetRoomConfig;
/** Timestamp in milliseconds when the update occurred */
timestamp: number;
}
/**
* Payload for MEET_PARTICIPANT_ROLE_UPDATED signal,
* containing information about the participant whose role was updated and the new role.
*/
export interface MeetParticipantRoleUpdatedPayload {
/** ID of the room where the participant's role was updated */
roomId: string;
/** Identity of the participant whose role was updated */
participantIdentity: string;
/** New role assigned to the participant */
newRole: MeetRoomMemberRole;
/** Optional secret for regenerating the participant's token if needed */
secret?: string;
/** Timestamp in milliseconds when the role update occurred */
timestamp: number;
}
/**
* Union type representing the payload of a MeetSignal.
* It can be either a {@link MeetRoomConfigUpdatedPayload} or a {@link MeetParticipantRoleUpdatedPayload}, depending on the signal type.
*/
export type MeetSignalPayload = MeetRoomConfigUpdatedPayload | MeetParticipantRoleUpdatedPayload;

View File

@ -1,24 +0,0 @@
import { AuthenticationConfig } from './auth-config.js';
import { MeetAppearanceConfig } from './room-config.js';
/**
* Represents global config for OpenVidu Meet.
*/
export interface GlobalConfig {
projectId: string;
securityConfig: SecurityConfig;
webhooksConfig: WebhookConfig;
roomsConfig: {
appearance: MeetAppearanceConfig;
};
}
export interface WebhookConfig {
enabled: boolean;
url?: string;
// events: WebhookEvent[];
}
export interface SecurityConfig {
authentication: AuthenticationConfig;
}

View File

@ -1,23 +1,10 @@
export * from './analytics.js';
export * from './api-key.js';
export * from './auth-config.js';
export * from './event.model.js';
export * from './global-config.js';
export * from './permissions/livekit-permissions.js';
export * from './permissions/meet-permissions.js';
export * from './recording-response.js';
export * from './recording.model.js';
export * from './room-config.js';
export * from './room-member.js';
export * from './room-response.js';
export * from './room.js';
export * from './sort-pagination.js';
export * from './user.js';
export * from './webhook.model.js';
// Webcomponent types
export * from './webcomponent/command.model.js';
export * from './webcomponent/event.model.js';
export * from './webcomponent/message.type.js';
export * from './webcomponent/properties.model.js';
export * from './frontend-signal.js';
export * from './livekit-permissions.js';
export * from './request/room-member-request.js';
export * from './webhook.js';
export * from './database/index.js';
export * from './request/index.js';
export * from './response/index.js';
export * from './webcomponent/index.js';

View File

@ -3,22 +3,18 @@ export enum TrackSource {
* @generated from enum value: UNKNOWN = 0;
*/
UNKNOWN = 0,
/**
* @generated from enum value: CAMERA = 1;
*/
CAMERA = 1,
/**
* @generated from enum value: MICROPHONE = 2;
*/
MICROPHONE = 2,
/**
* @generated from enum value: SCREEN_SHARE = 3;
*/
SCREEN_SHARE = 3,
/**
* @generated from enum value: SCREEN_SHARE_AUDIO = 4;
*/
@ -28,65 +24,50 @@ export enum TrackSource {
interface VideoGrant {
/** permission to create a room */
roomCreate?: boolean;
/** permission to join a room as a participant, room must be set */
roomJoin?: boolean;
/** permission to list rooms */
roomList?: boolean;
/** permission to start a recording */
roomRecord?: boolean;
/** permission to control a specific room, room must be set */
roomAdmin?: boolean;
/** name of the room, must be set for admin or join permissions */
room?: string;
/** permissions to control ingress, not specific to any room or ingress */
ingressAdmin?: boolean;
/**
* allow participant to publish. If neither canPublish or canSubscribe is set,
* both publish and subscribe are enabled
*/
canPublish?: boolean;
/**
* TrackSource types that the participant is allowed to publish
* When set, it supersedes CanPublish. Only sources explicitly set here can be published
*/
canPublishSources?: TrackSource[];
/** allow participant to subscribe to other tracks */
canSubscribe?: boolean;
/**
* allow participants to publish data, defaults to true if not set
*/
canPublishData?: boolean;
/**
* by default, a participant is not allowed to update its own metadata
*/
canUpdateOwnMetadata?: boolean;
/** participant isn't visible to others */
hidden?: boolean;
/** participant is recording the room, when set, allows room to indicate it's being recorded */
recorder?: boolean;
/** participant allowed to connect to LiveKit as Agent Framework worker */
agent?: boolean;
/** allow participant to subscribe to metrics */
canSubscribeMetrics?: boolean;
/** destination room which this participant can forward to */
destinationRoom?: string;
}
/**
* Defines LiveKit-specific permissions for a participant.
*/

View File

@ -0,0 +1,3 @@
export * from './room-member-request.js';
export * from './room-request.js';
export * from './user-request.js';

View File

@ -0,0 +1,42 @@
import { MeetRoomMemberPermissions } from '../database/room-member-permissions.js';
import { MeetRoomMemberRole } from '../database/room-member.entity.js';
/**
* Options for adding a member to a room.
*/
export interface MeetRoomMemberOptions {
/** Unique identifier for a registered Meet user (mutually exclusive with name) */
userId?: string;
/** Name for an external user (mutually exclusive with userId) */
name?: string;
/** The base role assigned to the member. See {@link MeetRoomMemberRole} for details. */
baseRole: MeetRoomMemberRole;
/** Custom permissions for the member (overrides base role permissions). See {@link MeetRoomMemberPermissions} for details. */
customPermissions?: Partial<MeetRoomMemberPermissions>;
}
/**
* Options for generating a room member token.
* A room member token provides access to room resources (recordings, meetings, etc.)
*/
export interface MeetRoomMemberTokenOptions {
/**
* A secret key for room access. Determines the member's role.
*/
secret?: string;
/**
* Whether the token is intended for joining a meeting.
* If true, participantName must be provided.
*/
joinMeeting?: boolean;
/**
* The name of the participant when joining the meeting.
* Required if joinMeeting is true.
*/
participantName?: string;
/**
* The identity of the participant in the meeting.
* Required when refreshing an existing token used to join a meeting.
*/
participantIdentity?: string;
}

View File

@ -0,0 +1,59 @@
import { MeetRoomConfig } from '../database/room-config.js';
import { MeetRoomMemberPermissions } from '../database/room-member-permissions.js';
import { MeetRoomAutoDeletionPolicy } from '../database/room.entity.js';
/**
* Options for creating a room.
*/
export interface MeetRoomOptions {
/**
* Name of the room
*/
roomName?: string;
/**
* Timestamp in milliseconds since epoch when the room will be automatically deleted
*/
autoDeletionDate?: number;
/**
* Configuration for automatic deletion behavior of the room. See {@link MeetRoomAutoDeletionPolicy} for details.
*/
autoDeletionPolicy?: MeetRoomAutoDeletionPolicy;
/**
* Configuration of the room. See {@link MeetRoomConfig} for details.
*/
config?: Partial<MeetRoomConfig>;
/**
* Roles configuration for the room. See {@link MeetRoomRolesConfig} for details.
*/
roles?: MeetRoomRolesConfig;
/**
* Anonymous access configuration for the room. See {@link MeetRoomAnonymousConfig} for details.
*/
anonymous?: MeetRoomAnonymousConfig;
}
/**
* Roles configuration for creating/updating a room.
* Allows partial permission updates.
*/
export interface MeetRoomRolesConfig {
moderator?: {
permissions: Partial<MeetRoomMemberPermissions>;
};
speaker?: {
permissions: Partial<MeetRoomMemberPermissions>;
};
}
/**
* Anonymous access configuration for creating/updating a room.
* Only includes enabled flags.
*/
export interface MeetRoomAnonymousConfig {
moderator?: {
enabled: boolean;
};
speaker?: {
enabled: boolean;
};
}

View File

@ -0,0 +1,15 @@
import { MeetUserRole } from '../database/user.entity.js';
/**
* Options for creating a new Meet user.
*/
export interface MeetUserOptions {
/** Unique identifier for the user (lowercase letters, numbers, underscores) */
userId: string;
/** Name of the user */
name: string;
/** Role of the user. See {@link MeetUserRole} for details. */
role: MeetUserRole;
/** Plain text password for the user (will be hashed before storage) */
password: string;
}

View File

@ -0,0 +1,5 @@
export * from './recording-response.js';
export * from './room-member-response.js';
export * from './room-response.js';
export * from './sort-pagination.js';
export * from './user-response.js';

View File

@ -1,4 +1,4 @@
import { MeetRecordingInfo, MeetRecordingStatus } from './recording.model.js';
import { MeetRecordingInfo, MeetRecordingStatus } from '../database/recording.entity.js';
import { SortAndPagination } from './sort-pagination.js';
/**

View File

@ -0,0 +1,34 @@
import { MeetRoomMemberPermissions } from '../database/room-member-permissions.js';
import { MeetRoomMemberRole } from '../database/room-member.entity.js';
import { SortAndPagination } from './sort-pagination.js';
/**
* Filters for querying room members with pagination, sorting, and field selection support.
*/
export interface MeetRoomMemberFilters extends SortAndPagination {
/** Filter by member name (partial match) */
name?: string;
/** Comma-separated list of fields to include in the response (e.g., "userId,name,baseRole") */
fields?: string;
}
/**
* Metadata stored in room member tokens.
* Contains information about the room and member permissions.
*/
export interface MeetRoomMemberTokenMetadata {
/** Token issued at timestamp (milliseconds since epoch) */
iat: number;
/** URL of the LiveKit server to connect to */
livekitUrl: string;
/** Unique identifier for the room */
roomId: string;
/** Unique identifier for the member if defined */
memberId?: string;
/** Base role assigned to the member. See {@link MeetRoomMemberRole} for details. */
baseRole: MeetRoomMemberRole;
/** Custom permissions for the member (overrides base role permissions). See {@link MeetRoomMemberPermissions} for details. */
customPermissions?: Partial<MeetRoomMemberPermissions>;
/** Effective permissions for the member (combination of base role and custom permissions). See {@link MeetRoomMemberPermissions} for details. */
effectivePermissions: MeetRoomMemberPermissions;
}

View File

@ -1,5 +1,5 @@
import { MeetRoomMemberPermissions } from './permissions/meet-permissions.js';
import { MeetRoom, MeetRoomStatus } from './room.js';
import { MeetRoomMemberPermissions } from '../database/room-member-permissions.js';
import { MeetRoom, MeetRoomStatus } from '../database/room.entity.js';
import { SortAndPagination } from './sort-pagination.js';
/**
@ -34,7 +34,6 @@ export const MEET_ROOM_EXTRA_FIELDS = ['config'] as const satisfies readonly Ext
*/
export type MeetRoomExtraField = (typeof MEET_ROOM_EXTRA_FIELDS)[number];
/**
* Properties of a {@link MeetRoom} that can be included in the API response when fields filtering is applied.
* Derived from MEET_ROOM_FIELDS array which is validated by TypeScript to match MeetRoom keys.
@ -74,6 +73,32 @@ export interface MeetRoomFilters extends SortAndPagination {
extraFields?: MeetRoomExtraField[];
}
/**
* Successs codes returned after successfully deleting a room, indicating the outcome of the deletion operation.
*/
export enum MeetRoomDeletionSuccessCode {
ROOM_DELETED = 'room_deleted',
ROOM_WITH_ACTIVE_MEETING_DELETED = 'room_with_active_meeting_deleted',
ROOM_WITH_ACTIVE_MEETING_SCHEDULED_TO_BE_DELETED = 'room_with_active_meeting_scheduled_to_be_deleted',
ROOM_AND_RECORDINGS_DELETED = 'room_and_recordings_deleted',
ROOM_CLOSED = 'room_closed',
ROOM_WITH_ACTIVE_MEETING_AND_RECORDINGS_DELETED = 'room_with_active_meeting_and_recordings_deleted',
ROOM_WITH_ACTIVE_MEETING_CLOSED = 'room_with_active_meeting_closed',
ROOM_WITH_ACTIVE_MEETING_AND_RECORDINGS_SCHEDULED_TO_BE_DELETED = 'room_with_active_meeting_and_recordings_scheduled_to_be_deleted',
ROOM_WITH_ACTIVE_MEETING_SCHEDULED_TO_BE_CLOSED = 'room_with_active_meeting_scheduled_to_be_closed'
}
/**
* Error codes that can be returned when attempting to delete a room, indicating why the deletion operation failed.
*/
export enum MeetRoomDeletionErrorCode {
ROOM_HAS_ACTIVE_MEETING = 'room_has_active_meeting',
ROOM_HAS_RECORDINGS = 'room_has_recordings',
ROOM_WITH_ACTIVE_MEETING_HAS_RECORDINGS = 'room_with_active_meeting_has_recordings',
ROOM_WITH_ACTIVE_MEETING_HAS_RECORDINGS_CANNOT_SCHEDULE_DELETION = 'room_with_active_meeting_has_recordings_cannot_schedule_deletion',
ROOM_WITH_RECORDINGS_HAS_ACTIVE_MEETING = 'room_with_recordings_has_active_meeting'
}
/**
* Utility type to extract keys of T that are objects, used to define which fields can be extraFields.
*/

View File

@ -0,0 +1,35 @@
/**
* Supported sorting directions for list responses.
*/
export enum SortOrder {
/**
* Sorts results in ascending order.
*/
ASC = 'asc',
/**
* Sorts results in descending order.
*/
DESC = 'desc'
}
/**
* Common sorting and pagination options for list responses.
*/
export interface SortAndPagination {
/**
* Maximum number of items to include in the current page.
*/
maxItems?: number;
/**
* Token used to request the next page of results.
*/
nextPageToken?: string;
/**
* Field name used to sort the result list.
*/
sortField?: string;
/**
* Sorting direction applied to the result list.
*/
sortOrder?: SortOrder;
}

View File

@ -0,0 +1,19 @@
import { MeetUser, MeetUserRole } from '../database/user.entity.js';
import { SortAndPagination } from './sort-pagination.js';
/**
* Data Transfer Object (DTO) for MeetUser, excluding sensitive fields.
*/
export type MeetUserDTO = Omit<MeetUser, 'passwordHash' | 'mustChangePassword'>;
/**
* Filters for querying Meet users, extending sorting and pagination options.
*/
export interface MeetUserFilters extends SortAndPagination {
/** Optional filter by user ID (supports partial matches) */
userId?: string;
/** Optional filter by user name (supports partial matches) */
name?: string;
/** Optional filter by user role */
role?: MeetUserRole;
}

View File

@ -1,82 +0,0 @@
import { MeetRoomMemberPermissions } from './permissions/meet-permissions.js';
import { SortAndPagination } from './sort-pagination.js';
/**
* Options for adding a member to a room.
*/
export interface MeetRoomMemberOptions {
userId?: string; // userId of a registered Meet user (mutually exclusive with name)
name?: string; // Name for an external user (mutually exclusive with userId)
baseRole: MeetRoomMemberRole; // The base role assigned to the member
customPermissions?: Partial<MeetRoomMemberPermissions>; // Custom permissions for the member (overrides base role permissions)
}
/**
* Represents a room member.
* A member can be an internal user (identified by userId) or an external user (identified by name).
*/
export interface MeetRoomMember {
memberId: string; // Unique identifier for the member (equals userId for registered users, or generated for external users)
roomId: string; // ID of the room the member belongs to
name: string; // Name of the member (either registered or external user name)
membershipDate: number; // Timestamp when the member was added to the room
accessUrl: string; // URL for the member to access the room
baseRole: MeetRoomMemberRole; // The base role of the member in the room
customPermissions?: Partial<MeetRoomMemberPermissions>; // Custom permissions for the member (if any)
effectivePermissions: MeetRoomMemberPermissions; // Effective permissions for the member (base role + custom permissions)
permissionsUpdatedAt: number; // Timestamp when the effective permissions were last updated
}
/**
* Represents the role of a member in a room.
*/
export enum MeetRoomMemberRole {
MODERATOR = 'moderator',
SPEAKER = 'speaker'
}
export interface MeetRoomMemberFilters extends SortAndPagination {
name?: string;
fields?: string;
}
/**
* Options for generating a room member token.
* A room member token provides access to room resources (recordings, meetings, etc.)
*/
export interface MeetRoomMemberTokenOptions {
/**
* A secret key for room access. Determines the member's role.
*/
secret?: string;
/**
* Whether the token is intended for joining a meeting.
* If true, participantName must be provided.
*/
joinMeeting?: boolean;
/**
* The name of the participant when joining the meeting.
* Required if joinMeeting is true.
*/
participantName?: string;
/**
* The identity of the participant in the meeting.
* Required when refreshing an existing token used to join a meeting.
*/
participantIdentity?: string;
}
/**
* Metadata stored in room member tokens.
* Contains information about the room and member permissions.
*/
export interface MeetRoomMemberTokenMetadata {
/** Token issued at timestamp (milliseconds since epoch) */
iat: number;
livekitUrl: string;
roomId: string;
memberId?: string;
baseRole: MeetRoomMemberRole;
customPermissions?: Partial<MeetRoomMemberPermissions>;
effectivePermissions: MeetRoomMemberPermissions;
}

View File

@ -1,6 +0,0 @@
export interface SortAndPagination {
maxItems?: number;
nextPageToken?: string;
sortField?: string;
sortOrder?: 'asc' | 'desc';
}

View File

@ -1,37 +0,0 @@
import { SortAndPagination } from './sort-pagination.js';
/**
* Options for creating a new Meet user.
*/
export interface MeetUserOptions {
userId: string; // Unique identifier for the user (lowercase letters, numbers, underscores)
name: string; // Name of the user
role: MeetUserRole; // Role of the user
password: string; // Plain text password for the user (will be hashed before storage)
}
export interface MeetUser {
userId: string;
name: string;
registrationDate: number;
role: MeetUserRole;
passwordHash: string;
mustChangePassword: boolean;
}
export enum MeetUserRole {
// Represents a user with administrative privileges (can manage all rooms and users)
ADMIN = 'admin',
// Represents a regular user (can manage own rooms and access rooms where they are members)
USER = 'user',
// Represents a room member role (used for room-specific access)
ROOM_MEMBER = 'room_member'
}
export type MeetUserDTO = Omit<MeetUser, 'passwordHash' | 'mustChangePassword'>;
export interface MeetUserFilters extends SortAndPagination {
userId?: string;
name?: string;
role?: MeetUserRole;
}

View File

@ -4,7 +4,7 @@
export enum WebComponentCommand {
/**
* Initializes the WebComponent with the given configuration.
* This command is sent from the webcomponent to the iframe for intialice the domain.
* This command is sent from the webcomponent to the iframe to intialice the domain.
* @private
*/
INITIALIZE = 'initialize',
@ -31,14 +31,23 @@ export enum WebComponentCommand {
*/
export interface WebComponentCommandPayloads {
/**
* Payload for the INITIALIZE command.
* Payload for the {@link WebComponentCommand.INITIALIZE} command.
* @private
*/
[WebComponentCommand.INITIALIZE]: {
domain: string;
};
/**
* Payload for the {@link WebComponentCommand.END_MEETING} command.
*/
[WebComponentCommand.END_MEETING]: void;
/**
* Payload for the {@link WebComponentCommand.LEAVE_ROOM} command.
*/
[WebComponentCommand.LEAVE_ROOM]: void;
/**
* Payload for the {@link WebComponentCommand.KICK_PARTICIPANT} command.
*/
[WebComponentCommand.KICK_PARTICIPANT]: {
participantIdentity: string;
};
@ -50,6 +59,6 @@ export interface WebComponentCommandPayloads {
* @category Type Helpers
* @private
*/
export type WenComponentCommandPayloadFor<T extends WebComponentCommand> = T extends keyof WebComponentCommandPayloads
export type WebComponentCommandPayloadFor<T extends WebComponentCommand> = T extends keyof WebComponentCommandPayloads
? WebComponentCommandPayloads[T]
: never;

View File

@ -26,13 +26,20 @@ export enum WebComponentEvent {
* Reason for emitting the LEFT event in OpenVidu Meet.
*/
export enum LeftEventReason {
VOLUNTARY_LEAVE = 'voluntary_leave', // The participant left the meeting voluntarily
NETWORK_DISCONNECT = 'network_disconnect', // The participant was disconnected due to network issues
SERVER_SHUTDOWN = 'server_shutdown', // The server was shut down
PARTICIPANT_KICKED = 'participant_kicked', // The participant was removed from the meeting by a moderator
MEETING_ENDED = 'meeting_ended', // The meeting was ended by a moderator or the room was deleted
MEETING_ENDED_BY_SELF = 'meeting_ended_by_self', // The local participant ended the meeting
UNKNOWN = 'unknown' // An unknown reason for leaving the meeting
/** The participant left the meeting voluntarily */
VOLUNTARY_LEAVE = 'voluntary_leave',
/** The participant was disconnected due to network issues */
NETWORK_DISCONNECT = 'network_disconnect',
/** The server was shut down unexpectedly */
SERVER_SHUTDOWN = 'server_shutdown',
/** The participant was kicked from the meeting by a moderator */
PARTICIPANT_KICKED = 'participant_kicked',
/** A moderator ended the meeting for all participants */
MEETING_ENDED = 'meeting_ended',
/** The local participant ended the meeting for all participants */
MEETING_ENDED_BY_SELF = 'meeting_ended_by_self',
/** Unknown reason for leaving the meeting */
UNKNOWN = 'unknown'
}
/**
@ -46,10 +53,16 @@ export interface WebComponentEventPayloads {
* @private
*/
[WebComponentEvent.READY]: {};
/**
* Payload for the {@link WebComponentEvent.JOINED} event.
*/
[WebComponentEvent.JOINED]: {
roomId: string;
participantIdentity: string;
};
/**
* Payload for the {@link WebComponentEvent.LEFT} event.
*/
[WebComponentEvent.LEFT]: {
roomId: string;
participantIdentity: string;

View File

@ -0,0 +1,4 @@
export * from './commands.js';
export * from './events.js';
export * from './messages.js';
export * from './properties.js';

View File

@ -1,5 +1,5 @@
import { WebComponentCommand, WenComponentCommandPayloadFor } from './command.model.js';
import { WebComponentEvent, WebComponentEventPayloadFor } from './event.model.js';
import { WebComponentCommand, WebComponentCommandPayloadFor } from './commands.js';
import { WebComponentEvent, WebComponentEventPayloadFor } from './events.js';
/**
* Represents all possible messages exchanged between the host application and WebComponent.
@ -18,7 +18,7 @@ export interface WebComponentInboundCommandMessage<T extends WebComponentCommand
/** The command to execute in the WebComponent */
command: T;
/** Optional payload with additional data for the command */
payload?: WenComponentCommandPayloadFor<T>;
payload?: WebComponentCommandPayloadFor<T>;
}
/**
@ -43,7 +43,7 @@ export interface WebComponentOutboundEventMessage<T extends WebComponentEvent =
*/
export function createWebComponentCommandMessage<T extends WebComponentCommand>(
command: T,
payload?: WenComponentCommandPayloadFor<T>
payload?: WebComponentCommandPayloadFor<T>
): WebComponentInboundCommandMessage<T> {
return { command, payload };
}

View File

@ -1,6 +1,9 @@
/**
* Enum representing the properties of the OpenVidu Meet web component.
*/
export enum WebComponentProperty {
/**
* The OpenVidu Meet room URL to connect to (moderator or speaker url)
* The OpenVidu Meet room URL to connect to.
* @required This attribute is required unless `recording-url` is provided.
*/
ROOM_URL = 'room-url',
@ -13,13 +16,11 @@ export enum WebComponentProperty {
* Display name for the local participant.
*/
PARTICIPANT_NAME = 'participant-name',
/**
* Secret key for end-to-end encryption (E2EE).
* If provided, the participant will join the meeting using E2EE key.
*/
E2EE_KEY = 'e2ee-key',
/**
* URL to redirect to when leaving the meeting.
* Redirection occurs after the **`CLOSED` event** fires.

View File

@ -1,19 +0,0 @@
import { MeetRecordingInfo } from './recording.model.js';
import { MeetRoom } from './room.js';
export type MeetWebhookPayload = MeetRecordingInfo | MeetRoom;
export enum MeetWebhookEventType {
MEETING_STARTED = 'meetingStarted',
MEETING_ENDED = 'meetingEnded',
RECORDING_STARTED = 'recordingStarted',
RECORDING_UPDATED = 'recordingUpdated',
RECORDING_ENDED = 'recordingEnded',
ROOM_FINISHED = 'roomFinished'
}
export interface MeetWebhookEvent {
creationDate: number;
event: MeetWebhookEventType;
data: MeetWebhookPayload;
}

View File

@ -0,0 +1,36 @@
import { MeetRecordingInfo } from './database/recording.entity.js';
import { MeetRoom } from './database/room.entity.js';
/**
* Interface representing a webhook event emitted by OpenVidu Meet.
*/
export interface MeetWebhookEvent {
/** Timestamp in milliseconds since epoch when the event was created */
creationDate: number;
/** Type of the webhook event. See {@link MeetWebhookEventType} for details. */
event: MeetWebhookEventType;
/** Payload of the webhook event, containing relevant data about the event. See {@link MeetWebhookPayload} for details. */
data: MeetWebhookPayload;
}
/**
* Webhook event types that can be emitted by OpenVidu Meet.
*/
export enum MeetWebhookEventType {
/** Emitted when a meeting starts in a room */
MEETING_STARTED = 'meetingStarted',
/** Emitted when a meeting ends in a room */
MEETING_ENDED = 'meetingEnded',
/** Emitted when a recording starts in a room */
RECORDING_STARTED = 'recordingStarted',
/** Emitted when a recording is updated */
RECORDING_UPDATED = 'recordingUpdated',
/** Emitted when a recording ends */
RECORDING_ENDED = 'recordingEnded'
}
/**
* Payload for OpenVidu Meet webhook events.
* Depending on the event type, the payload can be either {@link MeetRecordingInfo} or {@link MeetRoom}.
*/
export type MeetWebhookPayload = MeetRecordingInfo | MeetRoom;