backend: refactor room member token creation to use MeetRoomMemberTokenOptions interface

This commit is contained in:
juancarmore 2026-02-03 15:51:52 +01:00
parent b3ab245dff
commit 27a6064b61
9 changed files with 56 additions and 40 deletions

View File

@ -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';

View File

@ -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';

View File

@ -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) => {

View File

@ -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';

View File

@ -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'
}

View File

@ -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;
}

View File

@ -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'),

View File

@ -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
});
}
/**

View File

@ -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<string> {
async generateRoomMemberToken(options: MeetRoomMemberTokenOptions): Promise<string> {
const { tokenMetadata, livekitPermissions, participantName, participantIdentity, roomWithCaptions } = options;
const tokenOptions: AccessTokenOptions = {
identity: participantIdentity,
name: participantName,