backend: refactor room member token creation to use MeetRoomMemberTokenOptions interface
This commit is contained in:
parent
b3ab245dff
commit
27a6064b61
@ -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';
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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) => {
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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'
|
||||
}
|
||||
39
meet-ce/backend/src/models/token.model.ts
Normal file
39
meet-ce/backend/src/models/token.model.ts
Normal 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;
|
||||
}
|
||||
@ -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'),
|
||||
|
||||
@ -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
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user