From c20ab72ea27b3a58ce1e0a931ee62af2f08209bb Mon Sep 17 00:00:00 2001 From: Carlos Santos <4a.santos@gmail.com> Date: Fri, 10 Jan 2025 11:46:05 +0100 Subject: [PATCH] Updated README.md --- README.md | 53 ++++++++++++++++--------- docs/openvidu-call-ce-architecture.png | Bin 11868 -> 12567 bytes 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index dc6ca615..a3eb2494 100644 --- a/README.md +++ b/README.md @@ -68,10 +68,10 @@ The OpenVidu Call application is composed of two main parts (frontend and backen Also, the frontend project installs external dependencies on the following libraries: - [**openvidu-components-angular**](https://github.com/OpenVidu/openvidu/tree/master/openvidu-components-angular): A library of Angular components that provide the core functionality of the video conferencing service. - - [**common-types**](https://github.com/OpenVidu/openvidu-call/tree/next/common-types): A library of common types used by the frontend and backend. + - [**@types/openvidu-call**](https://github.com/OpenVidu/openvidu-call/tree/next/types): A library of common types used by the frontend and backend. - **Backend**: The backend is a Node.js application. - - [**common-types**](https://github.com/OpenVidu/openvidu-call/tree/next/common-types): A library of common types used by the frontend and backend. + - [**@types/openvidu-call**](https://github.com/OpenVidu/openvidu-call/tree/next/types): A library of common types used by the frontend and backend. ## Development @@ -83,46 +83,63 @@ Clone the OpenVidu Call repository: git clone https://github.com/OpenVidu/openvidu-call.git --branch next ``` +### Prepare the project + +For building types and install dependencies, run the following command: + +```bash +cd openvidu-call +./prepare.sh +``` + ### Backend 1. Serve the backend application. ```bash -cd openvidu-call/backend && \ -npm install && npm run dev:start +cd backend && \ +npm run dev:start ``` ### Frontend -1. Build the **common-types** library. +Opening a new tab, under root directory: + +1. Serve the frontend application. ```bash -cd openvidu-call/common-types && \ -npm install && npm run sync-ce +cd frontend && \ +npm run dev:start ``` -> NOTE: If you plan to make changes to the **common-types** library, the best idea is serve it locally. To do this, follow the instructions below: +After running these commands, you can access the frontend application at [http://localhost:5080](http://localhost:5080). -```bash -npm run serve -``` +--- + +> [!NOTE] +> As the frontend project uses **shared-call-components** and **@types/openvidu-call** libraries, you could need make changes to these libraries when developing and have the changes reflected in the frontend application. To do this, follow the instructions below: + +- Stop the backend and frontend processes. -2. Serve the **shared-call-components** library. +- Serve the **common-types** library. ```bash -cd ../frontend && \ -npm install && npm run lib:serve +cd types && \ +npm run serve ``` -3. Serve the frontend application. +> This command will make your terminal busy, so you need to open a new terminal to continue with the next steps. -**Opening another terminal**: +- Serve the **shared-call-components** library. ```bash -npm run dev:start +cd frontend && \ +npm run lib:serve ``` -After running these commands, you can access the frontend application at [http://localhost:5080](http://localhost:5080). +> This command will make your terminal busy, so you need to open a new terminal to continue with the next steps. + +- Serve the backend and frontend applications again. ## Build (with docker) diff --git a/docs/openvidu-call-ce-architecture.png b/docs/openvidu-call-ce-architecture.png index 014ff1fa117ad07be9d419686420d0fcadd45226..7d9308bd8731a622d9b710f0e8c3302970e19921 100644 GIT binary patch literal 12567 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

;~2E^j?}HrrP)Qx0xW7AHH?! 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