diff --git a/meet-ce/backend/src/controllers/auth.controller.ts b/meet-ce/backend/src/controllers/auth.controller.ts index b763a59a..b1b645b8 100644 --- a/meet-ce/backend/src/controllers/auth.controller.ts +++ b/meet-ce/backend/src/controllers/auth.controller.ts @@ -9,7 +9,7 @@ import { handleError, rejectRequestFromMeetError } from '../models/error.model.js'; -import { TokenType } from '../models/token-metadata.model.js'; +import { TokenType } from '../models/token.model.js'; import { LoggerService } from '../services/logger.service.js'; import { TokenService } from '../services/token.service.js'; import { UserService } from '../services/user.service.js'; diff --git a/meet-ce/backend/src/middlewares/auth.middleware.ts b/meet-ce/backend/src/middlewares/auth.middleware.ts index 0f50b1b5..b286ff0f 100644 --- a/meet-ce/backend/src/middlewares/auth.middleware.ts +++ b/meet-ce/backend/src/middlewares/auth.middleware.ts @@ -15,7 +15,7 @@ import { errorUnauthorized, rejectRequestFromMeetError } from '../models/error.model.js'; -import { TokenType } from '../models/token-metadata.model.js'; +import { TokenType } from '../models/token.model.js'; import { RoomMemberRepository } from '../repositories/room-member.repository.js'; import { RoomRepository } from '../repositories/room.repository.js'; import { ApiKeyService } from '../services/api-key.service.js'; diff --git a/meet-ce/backend/src/middlewares/request-validators/auth-validator.middleware.ts b/meet-ce/backend/src/middlewares/request-validators/auth-validator.middleware.ts index 3869bfca..3767c282 100644 --- a/meet-ce/backend/src/middlewares/request-validators/auth-validator.middleware.ts +++ b/meet-ce/backend/src/middlewares/request-validators/auth-validator.middleware.ts @@ -1,6 +1,6 @@ import { NextFunction, Request, Response } from 'express'; import { rejectUnprocessableRequest } from '../../models/error.model.js'; -import { TokenMetadata } from '../../models/token-metadata.model.js'; +import { TokenMetadata } from '../../models/token.model.js'; import { LoginReqSchema, TokenMetadataSchema } from '../../models/zod-schemas/auth.schema.js'; export const validateLoginReq = (req: Request, res: Response, next: NextFunction) => { diff --git a/meet-ce/backend/src/models/index.ts b/meet-ce/backend/src/models/index.ts index 5e696909..35bfaeb1 100644 --- a/meet-ce/backend/src/models/index.ts +++ b/meet-ce/backend/src/models/index.ts @@ -7,7 +7,7 @@ export * from './ov-components-signal.model.js'; export * from './redis.model.js'; export * from './request-context.model.js'; export * from './task-scheduler.model.js'; -export * from './token-metadata.model.js'; +export * from './token.model.js'; // Mongoose schemas export * from './mongoose-schemas/api-key.schema.js'; diff --git a/meet-ce/backend/src/models/token-metadata.model.ts b/meet-ce/backend/src/models/token-metadata.model.ts deleted file mode 100644 index d06a2607..00000000 --- a/meet-ce/backend/src/models/token-metadata.model.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Metadata associated with access, refresh, and temporary tokens. - */ -export interface TokenMetadata { - /** Token issued at timestamp (milliseconds since epoch) */ - iat: number; - /** Type of the token */ - tokenType: TokenType; -} - -/** - * Types of tokens used in the system. - */ -export enum TokenType { - /** Access token for regular authentication */ - ACCESS = 'access', - /** Refresh token for obtaining new access tokens */ - REFRESH = 'refresh', - /** Temporary token for special operations like password change */ - TEMPORARY = 'temporary' -} diff --git a/meet-ce/backend/src/models/token.model.ts b/meet-ce/backend/src/models/token.model.ts new file mode 100644 index 00000000..1960438d --- /dev/null +++ b/meet-ce/backend/src/models/token.model.ts @@ -0,0 +1,39 @@ +import { LiveKitPermissions, MeetRoomMemberTokenMetadata } from '@openvidu-meet/typings'; + +/** + * Metadata associated with access, refresh, and temporary tokens. + */ +export interface TokenMetadata { + /** Token issued at timestamp (milliseconds since epoch) */ + iat: number; + /** Type of the token */ + tokenType: TokenType; +} + +/** + * Types of tokens used in the system. + */ +export enum TokenType { + /** Access token for regular authentication */ + ACCESS = 'access', + /** Refresh token for obtaining new access tokens */ + REFRESH = 'refresh', + /** Temporary token for special operations like password change */ + TEMPORARY = 'temporary' +} + +/** + * Options for generating room member tokens. + */ +export interface MeetRoomMemberTokenOptions { + /** Metadata for the room member token */ + tokenMetadata: MeetRoomMemberTokenMetadata; + /** Permissions for LiveKit */ + livekitPermissions?: LiveKitPermissions; + /** Name of the participant */ + participantName?: string; + /** Identity of the participant */ + participantIdentity?: string; + /** Indicates if the room has captions enabled */ + roomWithCaptions?: boolean; +} diff --git a/meet-ce/backend/src/models/zod-schemas/auth.schema.ts b/meet-ce/backend/src/models/zod-schemas/auth.schema.ts index b4939af4..149bd8ce 100644 --- a/meet-ce/backend/src/models/zod-schemas/auth.schema.ts +++ b/meet-ce/backend/src/models/zod-schemas/auth.schema.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { TokenMetadata, TokenType } from '../token-metadata.model.js'; +import { TokenMetadata, TokenType } from '../token.model.js'; export const LoginReqSchema = z.object({ userId: z.string().min(5, 'userId must be at least 5 characters long'), diff --git a/meet-ce/backend/src/services/room-member.service.ts b/meet-ce/backend/src/services/room-member.service.ts index 2d5ecfd7..96c79940 100644 --- a/meet-ce/backend/src/services/room-member.service.ts +++ b/meet-ce/backend/src/services/room-member.service.ts @@ -620,16 +620,16 @@ export class RoomMemberService { customPermissions, effectivePermissions }; - const withCaptions = room.config.captions.enabled ?? false; + const roomWithCaptions = room.config.captions.enabled; // Generate token with participant name - return this.tokenService.generateRoomMemberToken( + return this.tokenService.generateRoomMemberToken({ tokenMetadata, livekitPermissions, participantName, participantIdentity, - withCaptions - ); + roomWithCaptions + }); } /** @@ -657,7 +657,9 @@ export class RoomMemberService { }; // Generate token without LiveKit permissions and participant name - return this.tokenService.generateRoomMemberToken(tokenMetadata); + return this.tokenService.generateRoomMemberToken({ + tokenMetadata + }); } /** diff --git a/meet-ce/backend/src/services/token.service.ts b/meet-ce/backend/src/services/token.service.ts index 3adb117b..72bf909a 100644 --- a/meet-ce/backend/src/services/token.service.ts +++ b/meet-ce/backend/src/services/token.service.ts @@ -1,5 +1,5 @@ import { RoomAgentDispatch, RoomConfiguration } from '@livekit/protocol'; -import { LiveKitPermissions, MeetRoomMemberTokenMetadata, MeetUser } from '@openvidu-meet/typings'; +import { MeetRoomMemberTokenMetadata, MeetUser } from '@openvidu-meet/typings'; import { inject, injectable } from 'inversify'; import { jwtDecode } from 'jwt-decode'; import { AccessToken, AccessTokenOptions, ClaimGrants, TokenVerifier, VideoGrant } from 'livekit-server-sdk'; @@ -7,7 +7,7 @@ import { INTERNAL_CONFIG } from '../config/internal-config.js'; import { MEET_ENV } from '../environment.js'; import { validateTokenMetadata } from '../middlewares/request-validators/auth-validator.middleware.js'; import { validateRoomMemberTokenMetadata } from '../middlewares/request-validators/room-member-validator.middleware.js'; -import { TokenMetadata, TokenType } from '../models/token-metadata.model.js'; +import { MeetRoomMemberTokenOptions, TokenMetadata, TokenType } from '../models/token.model.js'; import { LoggerService } from './logger.service.js'; @injectable() @@ -54,13 +54,9 @@ export class TokenService { return await this.generateJwtToken(tokenOptions); } - async generateRoomMemberToken( - tokenMetadata: MeetRoomMemberTokenMetadata, - livekitPermissions?: LiveKitPermissions, - participantName?: string, - participantIdentity?: string, - roomWithCaptions = false - ): Promise { + async generateRoomMemberToken(options: MeetRoomMemberTokenOptions): Promise { + const { tokenMetadata, livekitPermissions, participantName, participantIdentity, roomWithCaptions } = options; + const tokenOptions: AccessTokenOptions = { identity: participantIdentity, name: participantName,