11 KiB
OpenVidu Meet - Copilot Instructions
Project Overview
OpenVidu Meet is a production-ready videoconferencing application built on top of OpenVidu and LiveKit. It provides a complete, customizable solution for video conferencing with both Community Edition (CE) and Pro versions.
Key Technologies
- Frontend: Angular 20.x, TypeScript, Angular Material
- Backend: Node.js, Express framework
- Package Manager: pnpm (v10.18.3+) with workspaces
- Build System: Nx-like monorepo structure
- Testing: Playwright (E2E), Jest (Unit)
- Containerization: Docker multi-stage builds
Project Structure
openvidu-meet/
├── meet-ce/ # Community Edition
│ ├── frontend/ # Angular application
│ │ ├── src/ # Main app source
│ │ ├── webcomponent/ # Web Component build
│ │ └── projects/
│ │ └── shared-meet-components/ # Shared Angular library
│ ├── backend/ # Express backend
│ └── docker/ # Docker configurations
├── meet-pro/ # Pro Edition (extends CE)
├── testapp/ # Testing application for E2E tests
├── meet-demo/ # Demo application for showcasing features
├── scripts/ # Build and automation scripts
└── meet.sh # Main CLI tool
Architecture Principles
1. Monorepo with External Dependencies
- Uses pnpm workspaces for internal packages
- External dependency:
openvidu-components-angular(located outside this repo) - Development: Uses
workspace:*protocol for local linking - CI/Docker: Uses npm registry or tarball installations
2. Dual Workspace Configuration
# Development (pnpm-workspace.yaml)
packages:
- 'meet-ce/**'
- '../openvidu/openvidu-components-angular/projects/openvidu-components-angular'
# CI/Docker (pnpm-workspace.docker.yaml)
packages:
- 'meet-ce/**' # No external packages
3. Library Structure
@openvidu-meet/frontend: Main Angular application@openvidu-meet/shared-components: Reusable Angular library- Has
openvidu-components-angularas peerDependency - Built as Angular library (ng-packagr)
- Does NOT bundle dependencies
- Has
Coding Standards
TypeScript/Angular
// ✅ Good: Use interfaces for data models
export interface Conference {
id: string;
name: string;
participants: Participant[];
}
// ✅ Good: Use Angular dependency injection
@Injectable({ providedIn: 'root' })
export class ConferenceService {
constructor(private http: HttpClient) {}
}
// ✅ Good: Use RxJS operators properly
this.participants$.pipe(
map(participants => participants.filter(p => p.isActive)),
takeUntil(this.destroy$)
).subscribe();
// ❌ Bad: Don't use 'any' type
// ❌ Bad: Don't forget to unsubscribe from observables
Express Backend with TypeScript and InversifyJS
// ✅ Good: Use decorators and dependency injection
@injectable()
export class LoggerService {
log(message: string): void {
console.log(message);
}
}
Build & Development
Main CLI Tool: meet.sh
# Development
./meet.sh dev # Start development servers
./meet.sh dev --skip-install # Skip dependency installation
# Building
./meet.sh build # Build all packages
./meet.sh build --skip-install # Build without installing deps
./meet.sh build --base-href=/custom/ # Custom base href
# Docker
./meet.sh build-docker ov-meet # Build Docker image (CE)
./meet.sh build-docker ov-meet --components-angular-version 3.5.0-beta1
# CI Preparation (Important!)
./meet.sh prepare-ci-build --components-angular-version 3.5.0-beta1
./meet.sh prepare-ci-build --components-angular-tarball ./components.tgz
./meet.sh restore-dev-config # Restore development config
CI/Docker Dependency Strategy
Problem: External package openvidu-components-angular is not in this repo.
Solution: Dual workspace configuration
- Development: Uses
workspace:*(local linking) - CI/Docker: Replaces
workspace:*with registry/tarball versions
Scripts:
scripts/prepare-ci-build.sh: Prepares workspace for CI/Docker buildsscripts/restore-dev-config.sh: Restores development configuration
Workflow:
# Before CI/Docker build
prepare-ci-build.sh --components-angular-version 3.5.0-beta1
# Changes: pnpm-workspace.yaml → pnpm-workspace.docker.yaml
# .npmrc → .npmrc.docker
# package.json: workspace:* → ^3.5.0-beta1
# After build
restore-dev-config.sh
# Restores all original files
Important Conventions
1. Never Manually Edit package.json in CI
# ❌ Bad: Manual sed in CI
sed -i 's/workspace:\*/3.5.0/g' package.json
# ✅ Good: Use prepare-ci-build script
./scripts/prepare-ci-build.sh --components-angular-version 3.5.0-beta1
2. peerDependencies Guidelines
shared-meet-componentsdeclaresopenvidu-components-angularas peerDependency- ✅ Use semver ranges:
"^3.0.0" - ✅ Use workspace protocol in dev:
"workspace:*" - ❌ NEVER use
file:in peerDependencies (invalid)
3. Angular Version Compatibility
- Current: Angular 20.x
openvidu-components-angularmust support same Angular version- Check peer dependency warnings carefully
4. Docker Best Practices
# ✅ Good: Multi-stage build
FROM node:22.19.0 AS builder
# ... build stage ...
FROM node:22.19.0-alpine AS runner
# ... runtime stage ...
# ✅ Good: Use build args
ARG COMPONENTS_VERSION=3.5.0-beta1
ARG BASE_HREF=/
# ✅ Good: Use .dockerignore
# Avoid copying unnecessary files
Common Tasks
Adding a New Feature
- Create feature in
meet-ce/frontend/src/app/features/ - If reusable, consider moving to
shared-meet-components - Add tests in
*.spec.tsfiles - Update documentation
Updating openvidu-components-angular
# Development (local changes)
cd ../openvidu/openvidu-components-angular
npm run lib:build
cd -
pnpm install
# CI/Docker (version update)
./meet.sh prepare-ci-build --components-angular-version 3.5.0-beta1
./meet.sh build
./meet.sh restore-dev-config
Working with Shared Components
# Build shared library
cd meet-ce/frontend/projects/shared-meet-components
ng build
# Use in main app
import { SomeComponent } from '@openvidu-meet/shared-components';
Testing
E2E Tests (Playwright)
npm run test:e2e # Run all E2E tests
npm run test:e2e:ui # Run with UI
npm run test:e2e:debug # Debug mode
Unit Tests (Jest)
npm run test # Run all unit tests
npm run test:watch # Watch mode
npm run test:coverage # With coverage
Troubleshooting
"workspace package not found" Error
Cause: Using workspace:* in CI/Docker mode
Solution:
./meet.sh prepare-ci-build --components-angular-version 3.5.0-beta1
"Invalid peer dependency" Error
Cause: Using file: in peerDependencies
Solution: Use semver range (^3.0.0) in peerDependencies, not file: paths
Angular Version Mismatch Warnings
Cause: openvidu-components-angular version doesn't support your Angular version
Solution: Update to compatible version
./meet.sh prepare-ci-build --components-angular-version 3.5.0-beta1 # Supports Angular 20
pnpm-lock.yaml Conflicts
Solution: Restore development config first
./meet.sh restore-dev-config
pnpm install
File Naming Conventions
✅ Good:
- conference.service.ts (Services)
- conference.component.ts (Components)
- conference.component.spec.ts (Tests)
- conference.model.ts (Models/Interfaces)
- conference.module.ts (Modules)
❌ Bad:
- ConferenceService.ts (PascalCase in filename)
- conference_service.ts (snake_case)
- conferenceService.ts (camelCase)
Environment Variables
Development
# Frontend
OPENVIDU_SERVER_URL=ws://localhost:4443
OPENVIDU_SECRET=MY_SECRET
# Backend
PORT=3000
OPENVIDU_URL=https://localhost:4443
OPENVIDU_SECRET=MY_SECRET
Docker
Set via docker-compose.yml or Dockerfile ARG/ENV
Security Considerations
- Never commit secrets to version control
- Use environment variables for sensitive data
- Validate all user inputs (DTOs in backend)
- Sanitize HTML content in frontend
- Use Angular's built-in XSS protection
Performance Guidelines
- Lazy load modules when possible
- Use OnPush change detection for performance-critical components
- Unsubscribe from observables (use
takeUntilor async pipe) - Optimize Docker images (multi-stage builds, alpine images)
- Use pnpm for faster installs and efficient disk usage
Documentation References
- Full CI/Docker strategy:
docs/ci-docker-dependencies-strategy.md - Dependency diagrams:
docs/ci-docker-dependencies-diagrams.md - Implementation summary:
docs/IMPLEMENTATION_SUMMARY.md - Validation checklist:
docs/VALIDATION_CHECKLIST.md
When Suggesting Code Changes
- Understand the context: Is this for development or CI/Docker?
- Check package.json: Are dependencies using
workspace:*or versions? - Consider peerDependencies: Never use
file:paths in peerDependencies - Follow conventions: Use existing patterns in the codebase
- Test implications: Consider impact on both local dev and CI/Docker builds
- Use prepare-ci-build: For any CI/Docker related changes
Quick Reference Commands
# Development
./meet.sh dev # Start dev servers
./meet.sh build # Build all
# CI/Docker
./meet.sh prepare-ci-build --components-angular-version 3.5.0-beta1
./meet.sh build-docker ov-meet
./meet.sh restore-dev-config
# Testing
npm run test # Unit tests
npm run test:e2e # E2E tests
# Package management
pnpm install # Install deps
pnpm add <package> --filter @openvidu-meet/frontend # Add to specific package
Remember
- Always use scripts for CI/Docker preparation, never manual edits
- peerDependencies are for library compatibility declarations, not installation
- workspace:* works only when package is in workspace
- Test locally before pushing CI/Docker changes
- Document breaking changes and update this file accordingly
Last Updated: 2025-10-27 Project Version: OpenVidu Meet CE/Pro Maintained By: OpenVidu Team